ためすう
stderr を使ってみる (C++)
2020-03-22確認環境
$ g++ --version
g++ (Homebrew GCC 9.2.0) 9.2.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
調査
test.cpp
#include <bits/stdc++.h>
using namespace std;
int main() {
fprintf(stderr, "message: %s\n", "error happended");
}
出力結果
message: error happended
fprintf で出力先を stderr にして使います。
stderr can be used as an argument for any function that takes an argument of type FILE* expecting an output stream, like fputs or fprintf.
参考
fabs を使ってみる (C++)
2020-03-22確認環境
$ g++ --version
g++ (Homebrew GCC 9.2.0) 9.2.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
調査
test.cpp
#include <bits/stdc++.h>
using namespace std;
int main() {
cout << fabs(12.3) << endl;
cout << fabs(-12.3) << endl;
cout << abs(12.3) << endl;
cout << abs(-12.3) << endl;
}
出力結果
12.3
12.3
12.3
12.3
fabs
戻り値は正確で、現在の丸め方式には依存しない。
abs
任意の整数型に対するオーバーロードが C++11 で追加されたが、ある種の問題を引き起こすことから、今後削除される可能性がある。Validity and return type of std::abs(0u) is unclear 参照。
abs を使っても同じ結果を取得できましたが、とあるので、fabs を使った方が良さそうです。
参考
ActiveRecord のコールバックが呼ばれるタイミングを調べる (Rails)
2020-03-15やったこと
ActiveRecord のコールバックが呼ばれるタイミングを調べてみます。
確認環境
$ ruby --version
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-darwin17]
$ rails --version
Rails 5.2.3
$ sqlite3 --version
3.20.1 2017-08-24 16:21:36 8d3a7ea6c5690d6b7c3767558f4f01b511c55463e3f9e64506801fe9b74dce34
調査
テーブル確認
sqlite> .schema books
CREATE TABLE IF NOT EXISTS "books" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "title" varchar, "status" integer, "created_at" datetime NOT NULL, "updated_at" datetime NOT NULL);
app/models/book.rb
class Book < ApplicationRecord
before_validation Proc.new {
Rails.logger.fatal('call before_validation')
}
after_validation Proc.new {
Rails.logger.fatal('call after_validation')
}
before_create Proc.new {
Rails.logger.fatal('call before_create')
}
around_create Proc.new {
Rails.logger.fatal('call around_create')
}
after_create Proc.new {
Rails.logger.fatal('call after_create')
}
after_commit Proc.new {
p 'p after_commit'
Rails.logger.fatal('call after_commit')
}
### around_save Proc.new {
### Rails.logger.fatal('call afround_save')
### }
before_save Proc.new {
Rails.logger.fatal('call before_save')
}
after_save Proc.new {
Rails.logger.fatal('call after_save')
}
end
出力結果 (コンソール)
irb(main):001:0> Book.create(title: 33)
(0.0ms) begin transaction
call before_validation
call after_validation
call before_save
call before_create
call around_create
call after_create
call after_save
(0.0ms) commit transaction
=> #<Book id: nil, title: "33", status: nil, created_at: "2020-03-15 08:18:52", updated_at: "2020-03-15 08:18:52">
Rails5 では after_commit は、動かないようので要注意です。
参考
struct で operator を定義してみる (C++)
2020-03-14確認環境
$ g++ --version
g++ (Homebrew GCC 9.2.0) 9.2.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
調査
test.cpp
#include <bits/stdc++.h>
using namespace std;
struct edge {
int cost, hoge1, hoge2;
bool operator<(const edge& rhs) const {
return cost > rhs.cost;
}
};
int main() {
priority_queue<edge> pq;
for (int i = 0; i < 5; i++) {
pq.push({10 + i, 2, 3});
}
while (!pq.empty()) {
edge e = pq.top();
pq.pop();
cout << e.cost << " " << e.hoge1 << " " << e.hoge2 << endl;
}
}
出力結果
10 2 3
11 2 3
12 2 3
13 2 3
14 2 3
参考
ActiveRecord の enum を使ってみる (Rails)
2020-03-14やったこと
ActiveRecord の enum を使ってみます。
確認環境
$ ruby --version
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-darwin17]
$ rails --version
Rails 5.2.3
調査
準備
$ rails g model book title:string status:integer
$ rails db:migrate
enum の項目だけ定義する場合
app/models/book.rb
class Book < ApplicationRecord
enum status: [ :nothing, :doing, :done ]
end
コンソール
irb(main):004:0> Book.statuses
=> {"nothing"=>0, "doing"=>1, "done"=>2}
-- データ作成
irb(main):005:0> Book.create(title: 'book1', status: 1)
(0.1ms) begin transaction
Book Create (0.8ms) INSERT INTO "books" ("title", "status", "created_at", "updated_at") VALUES (?, ?, ?, ?) [["title", "book1"], ["status", 1], ["created_at", "2020-03-14 07:35:38.468498"], ["updated_at", "2020-03-14 07:35:38.468498"]]
(1.5ms) commit transaction
=> #<Book id: 1, title: "book1", status: "doing", created_at: "2020-03-14 07:35:38", updated_at: "2020-03-14 07:35:38">
-- データ取得
irb(main):006:0> b = Book.find(1)
Book Load (0.2ms) SELECT "books".* FROM "books" WHERE "books"."id" = ? LIMIT ? [["id", 1], ["LIMIT", 1]]
=> #<Book id: 1, title: "book1", status: "doing", created_at: "2020-03-14 07:35:38", updated_at: "2020-03-14 07:35:38">
-- stauts を更新
irb(main):007:0> b.done!
(0.1ms) begin transaction
Book Update (0.6ms) UPDATE "books" SET "status" = ?, "updated_at" = ? WHERE "books"."id" = ? [["status", 2], ["updated_at", "2020-03-14 07:38:35.150818"], ["id", 1]]
(0.9ms) commit transaction
=> true
enum で key と value を定義する場合
app/models/book.rb
class Book < ApplicationRecord
enum status: { nothing: 0, doing: 2, done: 4 }
end
コンソール
-- データ取得
irb(main):011:0> b = Book.find(1)
Book Load (0.1ms) SELECT "books".* FROM "books" WHERE "books"."id" = ? LIMIT ? [["id", 1], ["LIMIT", 1]]
=> #<Book id: 1, title: "book1", status: "doing", created_at: "2020-03-14 07:35:38", updated_at: "2020-03-14 07:38:35">
irb(main):012:0> b.status
=> "doing"
-- データ更新
irb(main):013:0> b.done!
(0.1ms) begin transaction
Book Update (0.3ms) UPDATE "books" SET "status" = ?, "updated_at" = ? WHERE "books"."id" = ? [["status", 4], ["updated_at", "2020-03-14 07:42:16.748137"], ["id", 1]]
(1.0ms) commit transaction
=> true
enum をメソッドみたいに使えるの知りませんでした。
参考
minitest を行数指定で使う (Rails)
2020-03-07やったこと
minitest を行数指定で実行します。
確認環境
$ ruby --version
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-darwin17]
$ rails --version
Rails 5.2.3
調査
準備
$ rails g model book title:string status:integer
$ rails db:migrate
test/models/book_test.rb
require 'test_helper'
class BookTest < ActiveSupport::TestCase
test "the truth" do
assert true
end
test "the truth222" do
assert true
end
end
テストを実行する
$ rails test test/models/book_test.rb:8
Running via Spring preloader in process 46538
Run options: --seed 24522
# Running:
.
Finished in 0.011685s, 85.5798 runs/s, 85.5798 assertions/s.
1 runs, 1 assertions, 0 failures, 0 errors, 0 skips
参考
Gem と Rails Engine と Railtie
2020-03-07やったこと
ある処理の共通化をするにあたり調べて目にした、下記について書きます。
- Gem
- Rails Engine
- Railtie
内容
Gem
RubyGems で公開されているRubyプログラムのことを指します。
以下 Gem の例です。
- Ruby スクリプト
- Rails Engine
- Railtie プラグイン
Rails Engine
エンジン (engine) は、ホストとなるRailsアプリケーションに機能を提供するミニチュア版Railsアプリケーションとみなせます。
mountable
Generate mountable isolated application
full
Generate a rails engine with bundled Rails application for testing
Railtie
Rails::Railtie is the core of the Rails framework and provides several hooks to extend Rails and/or modify the initialization process.
Rails の初期化処理において、拡張できるようにしたRailsのコア部分。
参考
screen コマンドを使ってみる (Unix)
2020-03-01やったこと
並び替えを行う sort を使ってみます。
調査
使ってみる
セッションを作る
$ screen
スクリーン一覧を見る
2つスクリーンを貼った後
プロセス確認
$ ps aux | grep SCREEN
xxxxx 61113 0.0 0.0 4267768 836 s010 S+ 11:20PM 0:00.00 grep SCREEN
xxxxx 60951 0.0 0.0 4288536 704 ?? Ss 11:20PM 0:00.00 SCREEN
xxxxx 57918 0.0 0.0 4288536 744 ?? Ss 11:16PM 0:00.03 SCREEN
$ screen -ls
There are screens on:
60951.ttys010.xxxxx-no-MacBook-Pro (Detached)
57918.ttys010.xxxxx-no-MacBook-Pro (Detached)
2 Sockets in /var/folders/v6/8f5kfrfd00d6ghb308jj68yr0000gn/T/.screen.
スクリーンごとにプロセスが存在することが分かります。
detach
<crl> + a
d
attach
$ screen -r [プロセスID]
man より抜粋
DESCRIPTION Screen is a full-screen window manager that multiplexes a physical terminal between several processes (typi- cally interactive shells).
参考
sort を使ってみる (Unix)
2020-03-01やったこと
並び替えを行う sort を使ってみます。
調査
使ってみる
今回はファイル内の数字を逆順に並べてみたいと思います。
abc.md
ファイルの中身はこのようにしました。
$ cat abc.md
23
1
12
34
9
22
文字列として sort されるパターン
$ sort abc.md
1
12
22
23
34
9
数字として昇順に sort されるパターン
$ sort -n abc.md
1
9
12
22
23
34
数字として降順に sort されるパターン
$ sort -rn abc.md
34
23
22
12
9
1
man sort より抜粋
-n, --numeric-sort, --sort=numeric Sort fields numerically by arithmetic value. Fields are supposed to have optional blanks in the begin- ning, an optional minus sign, zero or more digits (including decimal point and possible thousand separa- tors). -r, --reverse Sort in reverse order.
du コマンドを使ってサーバーの容量を確認する (Unix)
2020-02-29やったこと
サーバーの容量の状態を調べるとき、どこのディレクトリで容量を使っているのかを調べます。
調査
man du より抜粋
NAME du – display disk usage statistics
-h "Human-readable" output. Use unit suffixes: Byte, Kilobyte,
Megabyte, Gigabyte, Terabyte and Petabyte.
-s Display an entry for each specified file. (Equivalent to -d 0)
使ってみる
$ du -sh ./*
36K ./AUTHORS
124K ./CHANGELOG
12K ./CMakeLists.txt
8.0K ./README.md
1.7M ./build
17M ./cocos
312K ./docs
12K ./download-deps.py
580K ./extensions
165M ./external
136K ./licenses
43M ./plugin
24K ./setup.py
76M ./templates
124M ./tests
88M ./tools
多い順にソートした場合
$ du -sh ./* | sort -hr
165M ./external
124M ./tests
88M ./tools
76M ./templates
43M ./plugin
17M ./cocos
1.7M ./build
580K ./extensions
312K ./docs
136K ./licenses
124K ./CHANGELOG
36K ./AUTHORS
24K ./setup.py
12K ./download-deps.py
12K ./CMakeLists.txt
8.0K ./README.md