Ubuntu+redash簡易メモ

Ubuntu+VirtualBox簡易メモ - にっちとだじゃれ
これでUbuntuを入れたので、次に
Re:dash - Make Your Company Data Driven
を入れる。

環境

インストール

$ git clone https://github.com/getredash/redash.git
$ cd redash/setup/ubuntu

# apache止めていないとbootstrap.sh実行時にnginxのエラーが起きた
$ sudo /etc/init.d/apache2 stop

$ chmod a+x bootstrap.sh
$ sudo ./bootstrap.sh

Ubuntu+VirtualBox簡易メモ

忘れないようにするためのメモ。
Re:dash - Make Your Company Data Drivenを触りたくて。

インストール

  1. Ubuntu Server 16.04.1 LTSのイメージダウンロード
  2. virtualboxのホストオンリーアダプタの設定をしておく
  3. インストール中の言語はEnglish、enp0s3とenp0s8選ぶやつは前者
  4. 初期インストールできるやつはOpenSSH, LAMPを選択しておいた。
  5. インストールが終わったら参考資料を参考に/etc/network/interfacesを設定(enp0s8を加える)

機種変メモ

iPhone5sからiPhone7に変えました。
5sがもう言うこと聞かないレベルになってたのでちょうどいいタイミングでした。
今後のためにメモ。
※あくまでもこの記事は個人用メモなので、機種変してデータ損失起きるのが許せない方はご自身で十分調べることをおすすめします。

前提

ざっくりやったこと

  • MNP予約番号取得
    • 毎月使っていたサービス系、ポイントなどがどうなるか確認
  • OSを最新版へ更新
  • iTunesに暗号化バックアップ
  • LINE引き継ぎ方法実行
  • アプリ引き継ぎ方法実行
  • GoogleAuthenticatorで二段階認証しているサービスのバックアップコード取得

MNP予約番号取得

とあるサービスでまとめてau支払いを使っており、SIMフリーにすることでどうなるかサポートに確認しました(想像はつくけど一応)。
そのときに合わせてMNP予約番号を取得できるとのことだったので取得。

OSを最新版へ更新

7へデータを復元するときに差異があるとよくないのかなと思って、一応5sも10.0.2に更新しておきました。
(ググって、OSバージョン合わせたほうがいいという記事を見た気がします。)

iTunesに暗号化バックアップ

iTunes でのバックアップの暗号化について - Apple サポート
5sで使っていたアプリや各種データを7にも入れたかったので、iTunesでバックアップをとり7でそこから復元する方法をとることに。
なんで"暗号化"バックアップをしておいたのかというと、ググったときに、そうすればTwitterとかの認証系をやり直すことないよっていう記事をいくつか見たからです。
まぁ、もしできなかったとしてもアイパス覚えているんで困りはしないんですが、一応やっておきました。
実際、アイパス入れ直すことなく使えました。
(通常のバックアップならどうなるかはわかりません)

LINE引き継ぎ方法実行

【2016年最新版】 LINEのアカウントを引き継ぐ方法 : LINE公式ブログ
LINEの過去履歴は消えてもいいけど、フレンドリストとかは残っていて欲しいので調べて実行しておきました。
7で起動したとき、上記ブログに載っていない「本人確認する/初期化する」っていう画面が出て、本人確認するをラブとメアドとパスワードを求められました。パスワードを入力したけど通らなかったので、アプリをアンインストールしてもう一度インストールしたらブログと同じようになったのでそのままいけました。

アプリ引き継ぎ方法実行

ゲームなど、データを引き継ぎたいものはそれぞれやり方を調べて実行しておきました。
問題なし。

GoogleAuthenticator利用のもののバックアップコード取得

個人的にはこれが一番大事。危うく忘れそうでした。
事前に各サービスすべてログインし、バックアップコードを保存しておきました。
実際、7で起動した時いくつか消えていたので、バックアップコードが重宝しました。

まとめ

機種変大変。

Rubyメモ2

[mfham@localhost work]$ ruby -v
ruby 2.1.8p440 (2015-12-16 revision 53160) [x86_64-linux]

[mfham@localhost work]$ irb
2.1.8 :009 > sprintf('%05d', '10101')
 => "10101" 
2.1.8 :010 > sprintf('%05d', '02101')
 => "01089" 
2.1.8 :011 > sprintf('%05d', '08101')
ArgumentError: invalid value for Integer(): "08101"
        from (irb):11:in `sprintf'
        from (irb):11
        from /home/mfham/.rvm/rubies/ruby-2.1.8/bin/irb:11:in `<main>'

2.1.8 :017 > sprintf('%02d%03d', '10','101')                                                                                    
 => "10101" 
2.1.8 :018 > sprintf('%02d%03d', '02','101')                                                                                    
 => "02101" 
2.1.8 :019 > sprintf('%02d%03d', '08','101')                                                                                    
ArgumentError: invalid value for Integer(): "08"
        from (irb):19:in `sprintf'
        from (irb):19
        from /home/mfham/.rvm/rubies/ruby-2.1.8/bin/irb:11:in `<main>'


# Kernel.#Integer
2.1.8 :028 > Integer('10')                                                                                                      
 => 10 
2.1.8 :029 > Integer('02')                                                                                                      
 => 2 
2.1.8 :030 > Integer('08')
ArgumentError: invalid value for Integer(): "08"
        from (irb):30:in `Integer'
        from (irb):30
        from /home/mfham/.rvm/rubies/ruby-2.1.8/bin/irb:11:in `<main>'

# String#to_i
2.1.8 :021 > '10'.to_i(8)                                                                                                       
 => 8 
2.1.8 :022 > '02'.to_i(8)                                                                                                       
 => 2 
2.1.8 :023 > '08'.to_i(8)
 => 0 

2.1.8 :040 > '10'.to_i(0)
 => 10 
2.1.8 :041 > '02'.to_i(0)
 => 2 
2.1.8 :042 > '08'.to_i(0)
 => 0 

都道府県・市区町村コードを処理する何かがあり、都道府県コードがゼロ埋めされたもの、されていないもの、両方くる可能性があるのに上記のような感じで使っていたらやばい。

メモ

Rubyドキュメント

※実行は2.1.8なのにドキュメントは2.3.0見てるっていうのは許してください。

sprintf フォーマット (Ruby 2.3.0)

d
i
引数の数値を10進表現の整数として出力します。
引数が整数でなければ関数 Kernel.#Integer と同じ規則で整数に 変換されます。

module function Kernel.#Integer (Ruby 2.3.0)

引数が数値の場合は直接変換し(小数点以下切り落とし)、 文字列の場合は、進数を表す接頭辞を含む整数表現とみなせる文字列のみ 変換します。

なるほど、sprintfでd(i)を指定したら、Kernel.#Integerと同様の動きをするのか。
String#to_iを使ってみたけど、これとは挙動が違うみたい。なぜ?

気になるなーるね

調べる。
Kernel.#IntegerとString#to_iのソース。
module Kernel - Documentation for Ruby 2.3.0
class String - Documentation for Ruby 2.3.0

Kernel.#Integer

最終的にこれを返す。

rb_convert_to_integer(arg, base);

Integer('08')ならrb_convert_to_integer('08', 0)かな?
rb_convert_to_integerをもう少し追ってみると、
https://github.com/ruby/ruby/blob/4915ce691d147a460e14531f4031d6934c5e8c5c/object.c#L2701
第一引数のタイプがT_STRINGならrb_str_to_inum(val, base, TRUE)をreturnしている。

String#to_i

最終的にこれを返す。

rb_str_to_inum(str, base, FALSE);

'08.to_i(8)ならrb_str_to_inum('08', 8, FALSE)かな?
'08.to_i(0)ならrb_str_to_inum('08', 0, FALSE)かな?

違い

rb_str_to_inumの第三引数がTRUEとFALSEで違うみたい。
ちなみにsprintfはこれかな?
https://github.com/ruby/ruby/blob/00fcd967d9900713fa7f617d9a5077ec178e073f/sprintf.c#L842
rb_str_to_inum(val, 0, TRUE)
(base=0だから、プリフィクスから基数を判断するのかな)

rb_str_to_inumは何するの?

https://github.com/ruby/ruby/blob/772fd010b6a76887d9be9389f60cc024bd34f83b/bignum.c#L4207
rb_cstr_parse_inumの結果を受けて、NIL_P(ret)が真なら第三引数(TRUE, FALSEのやつ)をチェックして、TRUEならエラー(https://github.com/ruby/ruby/blob/772fd010b6a76887d9be9389f60cc024bd34f83b/bignum.c#L3706)、FALSEなら0(macro INT2FIX (Ruby 2.3.0))を返している。
rb_cstr_parse_inumを追うのは今はやめておこう・・・
https://github.com/ruby/ruby/blob/772fd010b6a76887d9be9389f60cc024bd34f83b/bignum.c#L4018

まとめ

Kernel.#Integer、Kernel.#sprintfはrb_str_to_inumの第三引数がTRUEになっておりエラーを投げる。
String#to_iはrb_str_to_inumの第三引数がFALSEになっており、0を返す。
使い方気をつけよう・・・

docs.ruby-lang.orgのKernel.#Integerの引数、第二引数base=0つけたほうがいいんやない?

Rubyメモ1

[mfham@localhost work]$ ruby -v
ruby 2.1.8p440 (2015-12-16 revision 53160) [x86_64-linux]
[mfham@localhost work]$ irb
2.1.8 :001 > str = 'abcde'
 => "abcde" 
2.1.8 :002 > puts str[0..-2]
abcd
 => nil 
2.1.8 :003 > (0..-2).each do |n| puts n end
 => 0..-2 
2.1.8 :004 > 

logrotateメモ

前提

logrotate 3.10.0
CentOS 7 (6でも一緒な気がする)

今回の内容

やりたいこと

  • ログのローテーションをlogrotateで管理したい
  • ファイルサイズが特定値に達したらローテーションして、また1日1回ローテーションしてほしい

補足

logrotateの設定で、sizeとdailyを指定していたのですが、ファイルサイズが指定サイズを超えてもローテーションしてくれませんでした。minsizeというものを知ったので、minsizeとdaily指定をしてみたがそれでも結果は同じでした。
いろいろ調べてごにょごにょやった結果、やりたいことはほぼできました。
その結果をまとめます。

結論

どうすることにしたのか、先に結論を書いておきます。

  • maxsizeとdaily指定(copytruncate, dateext, dateformat -%Y%m%d-%H%M%S)
  • /etc/cron.daily/logrotateを/etc/cron.hourly/へコピー

試行(思考)錯誤

size + dailyで試す

これでいけるだろうと思って設定していましたが、ログが出力され続けファイルサイズがsize指定値になってもローテーションされませんでした。
このころ、どういう仕組みでローテーションが実行されているのか知りませんでした。単純に、logrotateの設定でsize指定をしておけば"勝手に"ファイルサイズを検知してローテーションされると思っていました。この考え方が間違い。

minsize + dailyで試す

調べていると、minsizeというものがあることを知りました。すぐに試してみましたが結果は同じでした。
このころようやくmanコマンドを利用することに。

# 下記は3.10.0のもの。
       size size
              Log files are rotated only if they grow bigger then size bytes. If size is followed by k, the size is assumed to
              be in kilobytes.  If the M is used, the size is in megabytes, and if G is used, the size  is  in  gigabytes.  So
              size 100, size 100k, size 100M and size 100G are all valid.

       minsize  size
              Log files are rotated when they grow bigger than size bytes, but not  before  the  additionally  specified  time
              interval  (daily,  weekly,  monthly,  or yearly).  The related size option is similar except that it is mutually
              exclusive with the time interval options, and it causes log files to be rotated  without  regard  for  the  last
              rotation time.  When minsize is used, both the size and timestamp of a log file are considered.

どっちもサイズでローテーションするんやないの?ん?ってめっちゃ迷った時期です。
but not beforeってどう訳せばいいんやろ、not rotated beforeってことなのかなーとかいっぱい考えていました。
minsizeについてググりまくりました。stackoverflowのいくつかのコメントにはmanコマンドでの説明が十分じゃないからややこしいみたいなことも書いてあったような気がします。
このころもminsizeとか書いておけば"勝手に"検知して対応してくれると思っていた時期です。

maxsize + dailyで試す

ひたすら調べていると、logrotateのバージョンをあげるとmaxsizeというのが使えることがわかり、バージョンをあげて調べていた時期。

# 下記は3.10.0のもの。
       maxsize size
              Log files are rotated when they grow bigger than size bytes even before the additionally specified time interval
              (daily, weekly, monthly, or yearly).  The related size option is similar except that it  is  mutually  exclusive
              with the time interval options, and it causes log files to be rotated without regard for the last rotation time.
              When maxsize is used, both the size and timestamp of a log file are considered.

これを見ると分かるように、even before〜とあるので「これで!」とテンションが上がったのを覚えています。
結論の部分に書いてしまっていますけど、単純にmaxsizeを指定するだけではダメでした。

hourly

このころhourlyというものも指定できることを知りました。
指定してみましたがうんともすんとも言いませんでした。

ただ、hourlyやmaxsizeについて調べているとき、参考4に出会い、それが私の固定観念を捨てるのに役に立ちました。
あ、logrotate自体は自分で実行しないといけなくて、そのときに各設定がチェックされるのか、と。
そして同時期、参考1~3に出会い、logrotateがうまく勝手に検知してローテーションしているのではなく、cronやanacronのおかげなのかと知りました。
それらの記事が分かりやすすぎて書くことがありません。見てください。

ちなみにhourlyの説明

       hourly Log  files  are  rotated  every hour. Note that usually logrotate is configured to be run by cron
              daily. You have to change this configuration and run logrotate hourly to be able to really rotate
              logs hourly.

その後の私の頭の中

/etc/cron.d/0hourlyに書かれてあるように、毎時01分に/etc/cron.hourly配下のスクリプトが実行される。
/etc/cron.hourlyには0anacronというスクリプトが置いてあり、1~2つめのif文で、すでに本日分のcron.dailyが実行されていたら実行せずに終わる。そうでなければ(on_ac_powerのチェックはあるけど)anacronが実行される。
/etc/anacrontabに/etc/cron.daily、/etc/cron.weekly、/etc/cron.monthly配下のスクリプトが実行されるよう記述してあり、実行される。
logrotateスクリプトは/etc/cron.hourlyにはなく/etc/cron.dailyのみにあった。
ってことはhourlyを指定しててもlogrotate自体は1日に1回の実行になるのか。
/etc/cron.hourly配下にlogrotateスクリプトを置けば、毎時01分に実行されて、maxsizeチェックが働いてローテーションされるのか。
dailyチェックはいつ働くんやろう?00:01の実行で、/etc/cron.d/0hourlyの1~2つめのif文内には入らないはずやから、anacronが実行されるけど、/etc/anacrontabに書いてあるようにSTART_HOURS_RANGE=3-22やからこのとき/etc/cron.daily等配下のスクリプトは実行されないはず。logrotateスクリプトを/etc/cron.hourly配下に置いていたら実行される。あれっ、logrotateのdailyってどうやって判定してるんやろ・・・ソースコード見るしかないか・・・

ってな感じです。

まだやっていないこと

size、minsize、maxsizeの違いを実際に実行して比較。
logrotateのdaily判定についてソースコードを追う。

logrotateインストールメモ

必要なライブラリ

$ sudo su -

## libtool
# yum install libtool

## libpopt
# yum install popt-devel

logrotateインストール

$ sudo su -

## compile
# git clone https://github.com/logrotate/logrotate.git
# cd logrotate
# ./autogen.sh
# ./configure
# make
# make install
# make clean

上記でやると、/usr/local/sbin/logrotateになります。既存の/usr/sbin/logrotateはそのまま。
cronのPATHは/usr/sbinとかだったので、下記のようにprefixつけたほうがいいかもしれません。
Logrotate-3.9.1

メモ

autogen.shを実行するまで時間がかかりました。
test: let tests run on 'make distcheck' · logrotate/logrotate@63be219 · GitHub
なんでautogen.shの説明削ったんやろ。

3.10.0にあげたことでいろいろ便利そうなのが使えます。
logrotate/CHANGES at master · logrotate/logrotate · GitHub