ためすう

vim で改行を消す

2020-02-24

やったこと

vim で改行を消してみます。

調査

変更前

test.txt

aaa
bbb
ccc
1
2
3
1
2
3

VISUAL LINE で全選択してから、置換します。 改行コードを削除します。

:'<,'>s/\n//g

変更後

test.txt

aaabbbccc123123

test コマンドを使ってみる (unix)

2020-02-23

やったこと

unix の test コマンドを使ってみます。

調査

man より抜粋

DESCRIPTION The test utility evaluates the expression and, if it evaluates to true, returns a zero (true) exit status; oth- erwise it returns 1 (false). If there is no expression, test also returns 1 (false).

$ ls -ls
total 0
0 drwxr-xr-x  2 xxxxx  wheel  64  2 23 22:29 a_dir
0 -rw-r--r--  1 xxxxx  wheel   0  2 23 22:29 abc.txt

ファイルがあるかどうかの確認

$ test -e a_dir; echo $?
0
$ test -e abc.txt; echo $?
0
$ test -e abc222.txt; echo $?
1

ディレクトリかどうかの確認

$ test -d abc222.txt; echo $?
1
$ test -d abc.txt; echo $?
1
$ test -d a_dir; echo $?
0

TRUNCATE を使ってみる (MySQL)

2020-02-16

やったこと

MySQL の truncate を使ってみます。

テーブルを空にする方ではなく、数値を削るほうです。

確認環境

$ mysql --version
mysql  Ver 14.14 Distrib 5.6.25, for Linux (x86_64) using  EditLine wrapper

調査

TRUNCATE(X,D)

D 小数点に切り捨てて、数字 X を返します。D が 0 の場合は、結果に小数点または小数部が含まれません。D を負の数に指定すると、値 X の小数点左側の D 桁をゼロにすることができます。

小数点をどこまで残すか、指定できます。

mysql> SELECT TRUNCATE(1.234, 0);
+--------------------+
| TRUNCATE(1.234, 0) |
+--------------------+
|                  1 |
+--------------------+
1 row in set (0.00 sec)

mysql> SELECT TRUNCATE(1.234, 1);
+--------------------+
| TRUNCATE(1.234, 1) |
+--------------------+
|                1.2 |
+--------------------+
1 row in set (0.00 sec)

mysql> SELECT TRUNCATE(1.234567, 5);
+-----------------------+
| TRUNCATE(1.234567, 5) |
+-----------------------+
|               1.23456 |
+-----------------------+
1 row in set (0.00 sec)

参考

is_a?, kind_of? を使ってみる (Ruby)

2020-02-16

やったこと

is_a?kind_of? を使ってみます。

確認環境

$ ruby --version
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-darwin17]

調査

is_a? と kind_of? の違いはあるのか

下記を見ると、全く同じメソッドのようです。

ruby/object.c at 6b86549df8f6d48eeab3c7b48b3fd9ee02f744ba · ruby/ruby

動かしてみる

is_a.rb

module M
end

class Sample < Object
end

obj = Sample.new


p 'is_a?'
p obj.is_a?(Sample)
p obj.is_a?(Object)
p obj.is_a?(M)
p obj.is_a?(Integer)

p 'kind_of?'
p obj.kind_of?(Sample)
p obj.kind_of?(Object)
p obj.kind_of?(M)
p obj.kind_of?(Integer)

出力結果

$ ruby is_a.rb
"is_a?"
true
true
false
false
"kind_of?"
true
true
false
false

参考

Time の usec を 0 で指定する (Rails)

2020-02-16

やったこと

時間を取り扱う時、usec を 0 でセットする方法を試します。

例えば、rspec など自動テストをする時

  • MySQL に保存する
  • 値を取り出す

とした場合、usec が削り落とされ 0 になってしまうことがあります。

確認環境

$ ruby --version
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-darwin17]

$ rails --version
Rails 5.2.3

調査

始めは、usec が設定されていますが、change を使うことで 0 に設定できました。

$ rails c
Running via Spring preloader in process 42292
Loading development environment (Rails 5.2.3)
irb(main):001:0> a = Time.current
=> Sun, 16 Feb 2020 01:19:08 JST +09:00
irb(main):002:0> a.usec
=> 87388
irb(main):003:0> a.change(usec: 0).usec
=> 0

参考

atan2 を使ってみる (C++)

2020-02-03

確認環境

$ 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.

調査

atan2は三角形の底辺と高さから、角度を求めます。

test.cpp

#include <bits/stdc++.h>
using namespace std;

int main() {
    // ラジアンを求める
    // 引数の順番に注意 (高さ, 底辺)
    double radian = atan2(1.0, 1.0);
    cout << radian << endl;

    // ラジアンを角度に変換する
    double deg = radian * (180 / M_PI);
    cout << deg << endl;
}

出力結果

0.785398
45

参考

FLT_EPSILON を調べる (C++)

2020-01-26

確認環境

$ 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.

調査

規格で 1E-5 以下であることが規定されている。

すごく小さい数のことです。

計算で誤差が出るときなどに利用したりします。

test.cpp

#include <bits/stdc++.h>
using namespace std;

int main() {
    cout << FLT_EPSILON << endl;
}

出力結果

1.19209e-07

参考

all_of を使ってみる (C++)

2020-01-26

やったこと

all_of を使ってみます。

確認環境

$ 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() {
    vector<int> v = {2, 9, 3, 5};
    bool ans = all_of(v.begin(), v.end(), [](int x) { return x >= 2; });
    cout << ans << endl;

    bool ans2 = all_of(v.begin(), v.end(), [](int x) { return x >= 5; });
    cout << ans2 << endl;
}

出力結果

1
0

参考

YAML の文法をチェックする (Ruby)

2020-01-14

やったこと

YAML の文法が正しいかどうかを確認する方法を調べました。

確認環境

$ ruby --version
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-darwin17]

調査

正常な YAML

sample.yml

aaa:
  bbb: 111
  ccc: 222
$ ruby -r yaml -e 'YAML.load_file "sample.yml"'

特に何も表示されません。

壊れている YAML

sample2.yml

aaa:
  bbb: ccc:::
  ccc: 222
$ ruby -r yaml -e 'YAML.load_file "sample2.yml"'
Traceback (most recent call last):
	7: from -e:1:in `<main>'
	6: from /Users/xxxxx/.rbenv/versions/2.6.3/lib/ruby/2.6.0/psych.rb:577:in `load_file'
	5: from /Users/xxxxx/.rbenv/versions/2.6.3/lib/ruby/2.6.0/psych.rb:577:in `open'
	4: from /Users/xxxxx/.rbenv/versions/2.6.3/lib/ruby/2.6.0/psych.rb:578:in `block in load_file'
	3: from /Users/xxxxx/.rbenv/versions/2.6.3/lib/ruby/2.6.0/psych.rb:277:in `load'
	2: from /Users/xxxxx/.rbenv/versions/2.6.3/lib/ruby/2.6.0/psych.rb:390:in `parse'
	1: from /Users/xxxxx/.rbenv/versions/2.6.3/lib/ruby/2.6.0/psych.rb:456:in `parse_stream'
/Users/himejima/.rbenv/versions/2.6.3/lib/ruby/2.6.0/psych.rb:456:in `parse': (sample2.yml): mapping values are not allowed in this context at line 2 column 13 (Psych::SyntaxError)

SyntaxError が発生しました。

コマンドの意味

-r はライブラリを require します。

-e はコマンドラインで実行する時に使います。

抜粋

$ man ruby
...

-r library     Causes Ruby to load the library using require.  It is useful when using -n or -p.

-e command     Specifies script from command-line while telling Ruby not to search the rest of the arguments for a script file name.

参考

割り算の切り上げを計算する (C++)

2020-01-13

やったこと

割り算した結果、小数を切り上げます。

確認環境

$ 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;
typedef long long ll;

int main() {
    // 9 / 2 の切り上げ
    int t1 = ceil(9 / 2.0);
    cout << t1 << endl;

    // 9 / 2 の切り上げ
    int t2 = (9 + 2 - 1) / 2;
    cout << t2 << endl;


    // 9 / 3 の切り上げ
    int t3 = (9 + 3 - 1) / 3;
    cout << t3 << endl;
}

出力結果

5
5
3

2つ目の式の形

(x + y - 1) / y

こうすると割り切れる場合も、割り切れない場合も切り上げることができます。