SHOYAN BLOG

I am a pragmatic programmer.

知っていると便利なRubyの小技集

a-zの文字列を作成する

1
2
('a'..'z').to_a.join
=> "abcdefghijklmnopqrstuvwxyz"

特定のkeyのみ抽出する

特定のkeyのみ抽出するにはvalues_atメソッドを使います。

1
2
h = { "cat" = "feline", "dog" = "canine", "cow" = "bovine" }
h.values_at("cow", "cat")  #=> ["bovine", "feline"]

keyとvalueの配列からhashを作成する

1
2
3
4
keys   = ["suzuki", "itou", "yamada"]
values = [87, 76, 69]
ary = [keys, values].transpose
h = Hash[*ary.flatten]

特定の範囲の要素を取得する

1
2
["a", "b", "c", "d", "e"][0..2]
=> ["a", "b", "c"]

配列からnilを取り除く

1
2
[1, 2, nil, 3, 4, nil].compact
=> [1, 2, 3, 4]

配列から特定の条件に一致する要素を取り除く

1
2
[1,2,3,4,5,6].delete_if { |x| x % 2 == 0 }
=> [1, 3, 5]

10進数を基数変換する

1
2
3
4
5
6
255.to_s(2)
=> "11111111"
255.to_s(8)
=> "377"
255.to_s(16)
=> "ff"

逆の操作を行う場合はto_iメソッドを使います。

1
2
3
4
5
6
"11111111".to_i(2)
=> 255
"377".to_i(8)
=> 255
"ff".to_i(16)
=> 255

ハッシュのvalueでソートする

1
2
3
scores = { 'Carol' => 90, 'Alice' => 50, 'Bob' => 60, 'David' => 40 }
scores.sort {|(k1, v1), (k2, v2)| v2 <=> v1 }
=> [["Carol", 90], ["Bob", 60], ["Alice", 50], ["David", 40]]

同じ値を数える

1
2
["a", "b", "c", "a", "b", "b"].each_with_object(Hash.new(0)) {|r, arr| arr[r]+=1 }
=> {"a"=>2, "b"=>3, "c"=>1}

LATEXチートシート - 数式記号の読み方・表し方

LATEXを使った数式記号の読み方・表し方をまとめました。
数式記号の読み方・表し方の数式を実際にLATEXで表示しています。

1. 数と式

記号 読み方 LATEX表記
aかけるb a \times b
a割るb a \div b
aプラスマイナスb a \pm b
aかけるb a \times b
a割るb a \div b
aプラスマイナスb a \pm b
aマイナスプラスb a \mp b
aかけるb a \cdot b
a小なりb
aはbより小さい
a < b
a大なりb
aはbより大きい
a > b
a小なりイコールb
aはb以下
a \leqq b
a大なりイコールb
aはb以上
a \geqq b
aはbと等しくない
aノットイコールb
a \neq b
aニアリーイコールb
aはbにほぼ等しい
a \fallingdotseq b
aのn乗 a^n
aのm乗のn乗 ( a^m ) ^n
ルートa
平方根a
\sqrt{a}
n乗根a \sqrt[n]{a}
a分のb
b割るa
\frac{b}{a}
絶対値a
aの絶対値
\mid a \mid
xを越えない最大の整数
ガウスx
[x]
a,b,c,… a,b,c,\cdots

2. 関数・写像

記号 読み方 LATEX表記
yイコールf,x
yイコールf,かっこ,x,(かっこ)
y=f(x)
f,インバースx
f,xの逆関数
f ^{-1} (x)
サインx \sin x
コサインx \cos x
タンジェントx \tan x
サイン2乗x \sin ^2 x
ログa,b
aを底数とするbの対数
\log _a x
ログ,x \log x
fマルg
fとgの合成写像
f \circ g
fインバース
fの逆写像
f ^{-1}
XからYへの写像f
X矢印,Y,f
X \stackrel{f}{\to} Y
aをbに移す写像f
a矢印,b,f
a \stackrel{f}{\to} b
xからyへの写像f
f,x矢印,y
f: x \to y
f,x,y
f,かっこ,x,y,(かっこ)
f(x,y)

3. ベクトル・行列

記号 読み方 LATEX表記
ベクトルa
aベクトル
\vec{a}
ベクトルAB
ABベクトル
\overrightarrow{AB}
ベクトルaの大きさ
ベクトルaの絶対値
\mid \vec{a} \mid
零ベクトル
ゼロベクトル
\vec{0}
ベクトルaはベクトルbではない \vec{a} \neq \vec{b}
ベクトルa,bは平行
ベクトルa平行ベクトルb
\vec{a} \parallel \vec{b}
ベクトルa,bは垂直
ベクトルa垂直ベクトルb
\vec{a} \perp \vec{b}
ベクトルaイコールa1,a2
ベクトルaイコール,かっこa1,a2
\vec{a}=(a_1,a_2)
ベクトルa,bの内積 \vec{a} \cdot \vec{b}
行ベクトルa,b
かっこ,a,b,
( a \quad b )
列ベクトルa,b
かっこ,a,b,
\begin{pmatrix} a \ b \end{pmatrix}
m,n行列
mかけるn行列
m \times n
行列a,b,c,d
かっこ,a,b,c,d
\begin{pmatrix} a & b \ c & d \end{pmatrix}
Aの2乗 A^2
Aの逆行列
Aインバース
A^{-1}
Aベクトルx A \vec{x}
零行列 O

4. 微分・積分

記号 読み方 LATEX表記
数列an { a_n }
シグマ,ak,k=1からnまで
シグマ,k=1からnまで,ak
\sum _{k=1} ^{n} {k(k+1)}
n矢印無限大
n無限大
n \to \infty
nが限りなく大きくなるときのanの極限値はα
リミット,n→∞,an,イコールα
\lim {n \to \infty} a_n=\alpha
x矢印a
xが限りなくaに近づく
x \to a
xが限りなくaに近づくとき,f(x)の極限値はbである
リミット,xがaに近づくときのf(x),イコール,b
リミット,x矢印a,f(x),イコールb
\lim {x \to a} f(x)=b
xがaに近づくときのf(x)の右極限値
リミット,xが大きい方からaに近づくときのf(x)
リミット,x矢印a+0,f(x)
\lim {x \to a+0} f(x)
xがaに近づくときのf(x)の左極限値
リミット,xが小さい方からaに近づくときのf(x)
リミット,x矢印a-0,f(x)
\lim {x \to a-0} f(x)
デルタx矢印0
デルタxが限りなく0に近づく
\Delta x \to 0
f,ダッシュ,x f’(x)
y,ダッシュ y’
dy,dx \frac{dy}{dx}
d,dx,f(x) \frac{d}{dx} f(x)
d,dx,f(x) \frac{d}{dx} f(x)
開区間a,b ( a,b )
閉区間a,b [ a,b ]
f,トゥーダッシュ,x f”(x)
y,トゥーダッシュ y”
d,トゥー,y,d,x,トゥー yの第2次導関数 \frac{d^2y}{dx^2}
f(x) d,トゥー,d,x,トゥー,f(x)
f(x)の第2次導関数
\frac{d^y}{dx^2} f(x)
yの第n次導関数 y^{(n)}
f(x)の第n次導関数 f^{(n)(x)}
d,n,d,x,n,f(x)
yの第n次導関数
\frac{d^ny}{dx^n}
d,n,d,x,n,f(x)
f(x)の第n次導関数
\frac{d^n}{dx^n} f(x)
インテグラル,aからbまで,f(x),dx \int _a ^b f(x) dx
F(x),a,b [ F(x) ] ^b _a

5. 集合・理論

記号 読み方 LATEX表記
AはBの真部分集合である A \subset B
AはBを真部分集合に持つ A \supset B
A含まれるB
AはBの部分集合である
AはBに含まれる
A \subseteqq B
A含むB
AはBを含む
BはAを部分集合に持つ
A \supseteqq B
aはAの要素である
aはAに属する
a属するA
a \in A
aはAの要素でない
aはAに属さない
a属さないA
a \notin A
aを要素とする
Aの要素
A \ni a
集合1,2,3,4
1,2,3,4を要素とする集合
{ 1,2,3,4 }
x(の集合)ただしx<6
x<6を満たす集合
{ x \mid x<6 }
AキャップB
A 交わり
AとBの交わり(共通部分)
AインターセクションB
A \cap B
A カップ B
A結びB
AとBの結び
AユニオンB
A \cup B
AイコールB
AはBに等しい
A=B
Aバー
Aの補集合
\bar{A}
空集合
ファイ
\phi
PならばQ P \Rightarrow Q
PとQは同値 P \Leftrightarrow Q
Pでない
Pの否定
Pバー
\bar{P}

6. 確率・統計

記号 読み方 LATEX表記
n,P,r
Pのn,r
パーミュテーション,n,r
_n P _r
n,C,r
Cのn,r
コンビネーション,n,r
_n C _r
nの階乗
nファクトリアル
n!
n,A
n,かっこ,A,(かっこ)
n(A)
P,A
事象Aの確率
P(A)
P,A,B
PのA,B
P,A,かっこ,B,(かっこ)
P _A (B)
xバー
xの平均
\bar{x}
E,X
Xの平均
E(X)
V,X
Xの分散
V(X)
シグマ,X
Xの標準偏差
\sigma (X)
P,かっこ,X=a,(かっこ)
X=aとなる確率
P(X=A)
B,n,p B(n,p)
N,m,σ2 N(m,\sigma ^2)

7. 幾何

記号 読み方 LATEX表記
x度 x \circ
角A \angle A
三角形ABC \triangle {ABC}
l平行m
lとmは平行
l \parallel m
lとmは平行でない l \nparallel m
△ABCと△DEF合同
△ABC合同△DEF
\triangle {ABC} \equiv \triangle {DEF}
ABの長さ
ABのバー
\overline{AB}

8. ギリシャ文字

記号 読み方 LATEX表記
アルファ \alpha
ベータ \beta
ガンマ \gamma
シータ \theta
パイ \pi
デルタ \Delta

参考リンク

Tmpwatchでさくっと不要なファイルを消す

古いファイルを消したいときにtmpwatchを使うと簡単に消すことができます。

例えば、/var/www/app/tmp 配下の48時間以上前のファイルやディレクトリを消したい場合は以下で消せます。

1
tmpwatch -m 48  /var/www/app/tmp

tmpwatchは再帰的にファイルを削除するので、サブディレクトリがあればその配下のファイルも削除されます。
シンボリックの場合はリンクが削除されるだけでリンク先のファイルは削除されないとのことです。

参考リンク

Fluentd、ElasticsearchとKibanaでログ検索とグラフ表示を可能にする

前回の記事Fluentdを使ってログをログ収集サーバに転送する方法を紹介しました。
今回は転送されたログをElasticsearchに登録し、Kibanaでログ検索とグラフ表示する方法を紹介します。

ログ収集サーバー(前回の記事でいうVagrant)の変更を行っていきます。

FluentdのElasticsearchプラグインをインストール

まずは、FluetndのElasticsearchプラグインをインストールしておきます。

1
$ sudo /usr/sbin/td-agent-gem install fluent-plugin-elasticsearch

Javaのインストール

Elasticsearchを動かすにはJavaが必要なのでJavaをインストールします。

1
2
3
4
$ sudo yum install java-1.7.0-openjdk
$ sudo yum install java-1.7.0-openjdk-devel
$ java -version
java version "1.7.0_101"

Elasticsearchのインストールと起動

今回はアーカイブをダウンロードしてきてインストールします。
インストールといっても特に設定は不要でアーカイブを展開してbin/elasticsearchを実行するだけです。

1
2
3
$ curl -O https://download.elastic.co/elasticsearch/release/org/elasticsearch/distribution/tar/elasticsearch/2.3.3/elasticsearch-2.3.3.tar.gz
$ cd elastic search-2.3.3
$ ./bin/elasticsearch

kibanaのインストールと起動

Kibanaも同じようにアーカイブをダウンロードして起動します。

1
2
3
$ curl -O https://download.elastic.co/kibana/kibana/kibana-4.5.1-linux-x64.tar.gz
$ cd kibana-4.5.1-linux-x64
$ ./bin/kibana

http://192.168.33.10:5601 にブラウザでアクセスするとKibanaの管理画面が表示されます。
Indexの設定が必要ですが、ここでは何もせず次に進みます。

syslogのログをElasticsearchに格納する

syslogのログをElasticsearchに格納し、Kibanaで参照します。

/etc/td-agent/td-agent.confに以下を追記します。

1
2
3
4
5
6
7
8
9
10
11
<source>
  @type syslog # syslogプラグイン
  port 42185   # portは42185を指定
  tag syslog   # syslogというtagをつける
</source>

<match syslog.**>
  @type elasticsearch # elasticsearchプラグインを使う
  logstash_format true # ログのフォーマット
  flush_interval 10s # 10秒ごとに登録する
</match>

fluendをリスタートします。

1
$ sudo service td-agent restart

次にsyslogの設定をします。

/etc/rsyslog.conf に以下を追記します。
syslogが出力するログをFlutedがlistenするポート、42185に転送するための設定です。

1
*.* @127.0.0.1:42185

設定を反映させるため、syslogをリスタートします。

1
$ sudo /etc/init.d/rsyslog restart

先ほど確認した http://192.168.33.10:5601 に戻ります。
syslogの出力がElasticsearchに登録されると、Indexを登録できるようになります。
Indexはlogstash-2016.07.05 のような名前で作成されます。
セレクトボックスからIndexを選択し、Createボタンを押下後にKibanaでログの表示、検索が行えます。

手動でElasticsearchにログを送りたい場合は以下のコマンドで登録できます。

1
$ logger -t test foobar

もしくは、Fluentdのhttpポートにリクエストします。

1
$ curl -X POST -d 'json={"json":"Hello"}' http://localhost:8888/syslog.test

参考リンク

Fluentdを使ってローカル環境にログ収集サーバを構築する

アプリケーションサーバとログ収集サーバにFluentdをインストールし、アプリケーションサーバからログ収集サーバにログをフォワードする方法を紹介します。
ここでは、アプリケーションサーバをMacOS X、ログ収集サーバをVagrantとします。

Fluentdをホストマシン(Mac)にインストール

.dmgをダウンロードしてインストールしてください。

以下でFluentdを起動します。

1
$ sudo launchctl load /Library/LaunchDaemons/td-agent.plist

Fluentdのログは /var/log/td-agent/td-agent.log に出力されます。

1
$ less /var/log/td-agent/td-agent.log

停止は以下です。

1
$ sudo launchctl unload /Library/LaunchDaemons/td-agent.plist

設定ファイルは /etc/td-agent/td-agent.conf です。
設定を反映させるには、以下のコマンドで行います。

1
2
$ sudo launchctl stop td-agent
$ sudo launchctl start td-agent

以下でFluentdにリクエストします。

1
$ curl -X POST -d 'json={"json":"message"}' http://localhost:8888/debug.test

/var/log/td-agent/td-agent.log にログが出力されているはずです。

1
2
$ tail -n 1 /var/log/td-agent/td-agent.log
2016-07-01 16:51:47 -0700 debug.test: {"json":"message"}

ログ収集サーバにFluentdをインストール

次にログ収集サーバにFluentdをインストールします。
OSはCentos6.5を使いました。
vagrantの使い方は割愛します。
networkはprivate_networkとし、192.168.33.10でアクセスできることとします。

以下でログ収集サーバにログインします。

1
2
3
4
5
6
7
8
9
10
$ vagrant ssh

# iptablesは無効にしておきます
$ sudo service iptables stop

# 以下のコマンドでFluentdインストールします。
$ curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sh

# Fluentdを起動します
$ sudo /etc/init.d/td-agent start

ログ収集サーバでも同じように確認してみます。

1
2
3
$ curl -X POST -d 'json={"json":"message"}' http://localhost:8888/debug.test
$ tail -n 1 /var/log/td-agent/td-agent.log
2016-07-01 16:51:47 -0700 debug.test: {"json":"message"}

アプリケーションサーバからログ収集サーバのFluentdにリクエストを送る

アプリケーションサーバからログ収集サーバのFluentdにリクエストを送れるかを確認します。

1
$ curl -X POST -d 'json={"json":"message"}' http://192.168.33.10:8888/debug.test

ログ収集サーバでログを確認します。
Fluentdは出力をバッファするのでフォワードされるまでにタイムログがある場合があります。

1
$ tail -n 1 /var/log/td-agent/td-agent.log

疎通を確認できたら、アプリケーションサーバからログ収集サーバのFluentdにログをforwardしてみましょう。

アプリケーションサーバの/etc/td-agent/td-agent.conf を以下のように編集します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<source>
  type http
  port 8888
</source>

<source>
  @type forward
  port 24224
</source>

# tagがvagrantの場合はvagrantのFluentdにフォワードする
<match tag vagrant.**>
  type forward
  <server>
    host 192.168.33.10
    port 24224
  </server>
</match>

<match debug.**>
  type stdout
</match>

ログ収集サーバの/etc/td-agent/td-agent.confに以下の設定を追加します。
tagがvagrantで送られてきたものをログに出力します。

1
2
3
<match vagrant.**>
  type stdout
</match>

以下のコマンドでログ収集サーバのFluentdにデータがフォワードされます。

1
$ curl -X POST -d 'json={"json":"Fluentd!!!"}' http://localhost:8888/vagrant.test

以上で基本的なフォワードの設定ができました。

ファイルを監視してログ収集サーバにフォワードする

次はファイルを監視してファイルにデータが追加されたらその内容をログ収集サーバにフォワードするようにします。
in_tailプラグインを使います。
in_tailプラグインを使うにはtypeにtailを使います。

アプリケーションサーバの/etc/td-agent/td-agent.confに以下を追記します。

1
2
3
4
5
6
7
<source>
  type tail # in_tailプラグインを指定
  path /tmp/access_log # 監視するファイルの指定
  tag vagrant.access_log # ログにつけるタグを指定
  pos_file /tmp/access_log.pos # ファイル内のどの行までを読んだかを記録しておくファイルを指定
  format none # フォーマットはnoneを指定
</source>

設定を反映させるには、以下のコマンドで行います。

1
2
$ sudo launchctl stop td-agent
$ sudo launchctl start td-agent

/tmp/access_log に追記してみましょう。

1
$ echo "hello" >> /tmp/access_log

すると、ログ収集サーバのFluentdに内容がフォワードされます。

参考リンク