ためすう

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