読者です 読者をやめる 読者になる 読者になる

tec memo

メモです。

インストール済みパッケージに変更が無いかチェック

インストール済みのパッケージファイルとRPMファイルの情報を比較し、変更がないかをrpmコマンドでチェックすることができる。

私の環境で、td-agentをチェックしてみる。

# rpm -V td-agent
.M....G..    /opt

/opt で以下が変わっていた。 M は、ファイルの権限が変わっている。 G は、グループが変わっている。

その他のコードは以下。

コード 説明
5 MD5チェックサムが異なる。
S ファイルの大きさが異なる。
L シンボリックリンク属性が異なる。
T ファイルの修正時刻(mtime)が異なる。
D バイスファイルが変更されている。
U ファイルの所有者が変更されている。
G ファイルのグループが変更されている。
M ファイルのモードが変更されている。
? 未知または理由不明。

pmilterの導入

概要

pmilter

PmilterはProgrammable Mail Filterの略で、SMTPサーバ(送信や受信)とmilterプロトコルで通信し、SMTPサーバの送受信の振る舞いをRubyでコントロールできるサーバソフトウェアです。

ref: Pmilter: Programmable Mail Filter Serverを作った

rubyで自分の思い通りに制御できるところが素晴らしいなと思い、試してみる。

環境構築にあたっては、 pmilter + postfixでプログラマブルなSMTPサーバを作る(入門編) を参照するとして、私は補足を。

環境

OS, centos7
MTA, postfix3.1

補足

postfix3.1が最新のステーブルだがBaseのリポジトリにはないので、gfさんのリポジトリを利用させていただいた。 また、postfix2系がすでに入っていると、競合してインストール出来ないので、postfix2をアンインストールしたのちにpostfix3を入れる。

rpm -ivh http://mirror.symnds.com/distributions/gf/el/7/gf/x86_64/gf-release-7-10.gf.el7.noarch.rpm
yum remove postfix
yum --enablerepo=gf-plus install postfix3

pmilter導入

pmilter を socket を利用して起動するもプロンプトがすぐに返ってきた。

sudo -u postfix ./pmilter -c pmilter.conf

/var/log/messages に以下エラー。

Jan  5 19:11:58 localhost pmilter: pmilter: Unable to bind to port /var/spool/postfix/pmilter/pmilter.sock: Permission denied
Jan  5 19:11:58 localhost pmilter: pmilter: Unable to create listening socket on conn /var/spool/postfix/pmilter/pmilter.sock

/var/spool/postfix/pmilter/ がroot権限で作成されていたため、権限がないというエラーになっていた

chown postfix: /var/spool/postfix/pmilter

再度実行し、うまく起動した。

動作確認

動作確認にはpostfixに付属でついているsmtp-sourceを利用。

smtp-source -s1 -m1 -l 1024 -f test@example.com -t src@example.com -S "test mail" 127.0.0.1

pmilterでログが正常に出力された

[root@localhost pmilter]# sudo -u postfix ./pmilter -c pmilter.conf
[Thu, 05 Jan 2017 12:54:55 GMT][notice]: pmilter/0.0.1 starting
hello pmilter handler called from pmilter
client ipaddr 127.0.0.1
client hostname localhost
client daemon localhost.localdomain
handler phase name: mruby_connect_handler
helo hostname: localhost.localdomain
tls client issuer:
tls client subject:
tls session key size:
tls encrypt method:
tls version:
env from from args: <test@example.com>
env from from symval: test@example.com
SASL login name:
SASL login sender:
SASL login type:
env to from arg: src@example.com
env to from symval: src@example.com
header: {"From"=>"<test@example.com>"}
header: {"To"=>"<src@example.com>"}
header: {"Date"=>"Thu,  5 Jan 2017 21:55:05 +0900 (JST)"}
header: {"Message-Id"=>"<3244.0003.0000@localhost.localdomain>"}
header: {"Subject"=>"test mail"}
body chunk; 1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
2XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
3XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
4XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
5XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
6XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
7XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
8XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
9XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
2XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
myhostname: localhost.localdomain
message_id: DD58741B34FC
reveive_time: Thu Jan 05 21:55:05 2017
add_header(X-Pmilter:True): Enable

macでパスワードを生成する

macでパスワードを作りたい場合、pwgenを使う。

導入方法

インストールは Homebrewを導入していればbrew installするだけ。

brew install pwgen

# brew install pwgen
==> Downloading https://downloads.sourceforge.net/project/pwgen/pwgen/2.07/pwgen-2.07.tar.gz
==> Downloading from http://jaist.dl.sourceforge.net/project/pwgen/pwgen/2.07/pwgen-2.07.tar.gz
######################################################################## 100.0%
==> ./configure --prefix=/usr/local/Cellar/pwgen/2.07 --mandir=/usr/local/Cellar/pwgen/2.07/share/man
==> make install

使い方

pwgen を実行するだけで、8桁のパスワードをたくさん出してくれるが、オプションを渡すことでさらに複雑なパスワードや逆に簡単なパスワードを生成することができる。

Usage: pwgen [ OPTIONS ] [ pw_length ] [ num_pw ]

OPTIONS

OPTION Content
-c –capitalize パスワードに最低1文字は大文字を含める(デフォルト)
-A –no-capitalize パスワードに大文字を含めない
-n –numerals パスワードに最低1文字は数字を含める(デフォルト)
-0 –no-numerals パスワードに数字を含めない
-y –symbols パスワードに最低1文字は特殊文字を含める
-s –secure 完全にランダムなパスワードを生成する。
-B –ambiguous パスワードに曖昧な文字は含めない(0とO等)
-h –help 使い方を表示する
-H –sha1=path/to/file[#seed] ランダムなパスワードをファイルのsha1ハッシュを使用する
-C 列にパスワードを表示する(デフォルト)
-1 列にパスワードを表示しない(1行1パスワード)
-v –no-vowels 偶然の不快な言葉を避けるために母音を使用しない

pw_length

パスワードの文字数を指定する。

num_pw

パスワードの生成数を指定する。

試しに使ってみよう。

以下の条件で、実行する。 - 数字を含めない - パスワードは10文字 - パスワードを5つ生成する。

# pwgen -0 10 5
waijahgahM aeRahkemoo keeCeithoh Haeshaecam OhmieGeefa

散らかった写真を整理したい方へ

数年前に家族が撮影した未整理の写真データが出てきた。 変更した日は出ているが、写真名からはいつのものか判断できない。さらにはよく見ると同じ写真がファイル名が違うものであったりと、かなり状態としては悲惨だった。 それをサクッと整理したお話です。

以下、finderで表示した場合、こんな感じだった。

f:id:atani:20161201230148p:plain

整理するためにやるべきこと

用件としては二つ

  • 重複したデータは取り除く
  • それぞれの写真の日付が一目でわかるようにする

やったこと

重複データを取り除く。

お金を出せば有料のアプリで一気にできるのだが、どちらもコマンドを使って解決した。

まず、重複データを取り除く。

fdupes というコマンドを利用した。mac標準では入っていないので、brew を使ってインストールする。

brew install fdupes

※ なお、brew が何ものかについては MacにHomebrewをインストールする あたりを参照のこと。

これでfdupes が使える状態になった。

# fdupes -r フォルダ名

これで、重複しているファイルリストが出てくる。

# fdupes -r backup/ | head
backup/SH3E0154.jpg
backup/SH3E0154_0001.jpg

backup/SH3E0090.jpg
backup/SH3E0090_0001.jpg

backup/PAP_0222.JPG
backup/PAP_0223.JPG
backup/PAP_0224.JPG
backup/PAP_0225.JPG

fdupesに重複ファイルを消すオプションがついているけれど、消してしまったら元に戻せないので、一度対象のファイル名をテキストに出力する。

fdupes -rf backup/ | sort | uniq | grep -v '^$' > duplicate.list

中身を確認し、問題なければ削除する。

while read file; do rm "$file"; done < duplicate.list

この時、rmだとこれまた問答無用で消えてしまうので、それでも怖い方はrmtrashなどを利用する。 そうすると、重複ファイルは、ゴミ箱に入る。確認が終わったらゴミ箱を空にすればOK!

ファイルがいつに撮影されたものか一目でわかるように。

ファイル名が日付になれば、一目でわかる。 jhead コマンドを利用する。

brewで一発で入る。

brew install jhead

ファイル名を変換するには以下のとおり。

jhead -nf%Y-%m-%d-%H%M%S [ファイル名]

正規表現が使えるので、

jhead -nf%Y-%m-%d-%H%M%S *.jpg

f:id:atani:20161201232106p:plain

あとは、年月日のディレクトリごとに整理するなりしたらスッキリ。

smtpの負荷試験

postfixサーバでの負荷試験をするために、smtp-source(postfixに内包されている) を用いた。 メールを配送したくないのであれば、smtp-sinkを使うと良い(ここでは割愛)

  • 例:

    smtp-source -s100 -m10000 -l 4194304 -f info@example.com -t info@hogehoge.com -M "example.com" -S "test mail" smtp.example.com

  • オプション

    オプション 説明
    -s SMTPセッションの並列数
    -m 送信数
    -l 送信サイズ
    -f 送信元メールアドレス
    -t 送信先メールアドレス
    -M HELOコマンドのホスト名
    -S 件名

送信元サーバが非力だと思った性能が出せないので、気をつける。

変数宣言されているが使われていない。

変数宣言しているが使われていないってエラーが出る。 golang厳しい。

# go run main.go
# command-line-arguments
./main.go:14: a declared and not used

Go Lunch はじめました。

社内でGoの機運が高まってきたので、GoLangをもくもくとやる、GoLunchを毎週金曜日のランチタイムに集まってやることにしました。

第1回目は、9名の参加。 以下の書籍をみんなで買って、それぞれが好きなスピードで進めていくようにしてます。かなりゆるいです。

スターティングGo言語

スターティングGo言語

mac book airで環境構築。 Goのインストールから。バージョン変わった時にさくっと変えたいので、anyenvから、goenvをインストールしたのち、

# goenv install 1.6
# goenv global 1.6
# goenv rehash
# go version
go version go1.6 darwin/amd64

無事入りました。 anyenvのインストール方法や使い方は以下のリンクで。

qiita.com

頭のなかでgo buildができると豪語している @pyama 氏がvim-goが便利だという情報を聞きつけ、以下を参考にいれてみました。

qiita.com

加えて、.vimrcgoimportsを自動でやってくれるように設定します。

$ vi ~/.vimrc

let g:go_fmt_command = "goimports"

以下のようなコードを書いてみます。fmtがインポートされてないので、当然エラーになります。

package main

func main() {
        fmt.Println("Hello Golang")

}

が、vim-go入っていると、以下の通りファイルを保存する際に、自動で足りないパッケージをimportしてくれます!

f:id:atani:20160909135111g:plain

すごい!

スターティングGO言語本までいきつかずに本日はここまで。