最近飲んだ日本酒

最近、黒字に金かよ〜とジャケ買いした白瀑の山本がすこぶる美味かった。

1366884496 1366884497

美味かったので、飲み終わったあとに白瀑の赤いラベルの純米酒を続けて購入して飲んでしまった(こっちも美味かったが、山本飲んだ後だったので、、、)。

そして今週はいわせさんで購入した紀土の特純のしぼりたて(生酒)を飲んでる。生酒だからフレッシュだけど、やや酸が強いというか攻めてくる。これは紀土全般に言えるかな。

1366884499

Zabbixでweb監視

Zabbixのweb監視はトリガーの設定がちょっと面倒くさい。hostに紐付けなきゃいけないけど、なぜそうしないといけないの?っていう。まぁ歴史的経緯の賜物なんだろうなぁということはすぐ分かったけど、コンフィグにwebの項目があるのにトリガーのとこにはないのは気持ち悪い。

webの監視も、webアプリだけ監視したい場合があってそういう時どうすんの?なんて悩むわけだけど、お決まりのやり方は本に書いてなかったので、tweetしたら色々教えてもらった(感謝)。

  1. webを提供しているホストに紐付ける
  2. Zabbixサーバーに集約する
  3. 集約用専用ダミーホストをつくる

死活監視をしているサーバーでwebアプリを運用している場合は1でよいとして、webアプリだけの場合は2か3かな。2の場合はネットワークの死活と紐付けられるので、複合型トリガーを作るには便利で、3の場合はトリガー作成の際、余計なアイテムが出てこないというメリット・デメリットがあるそうです。

自分の環境に応じて選択すればよいと思う。

「「経理・財務」これでわかった!」というわけではない

著者の「経理・財務」感を語っている本って感じだった。「お金」よりも「人間」が大事というスタンス

決算書に載らない財産で、一番大きいのは人間です

ProductName 「経理・財務」これでわかった! (PHPビジネス新書)
金児 昭
PHP研究所 / 840円 ( 2008-11-19 )


入門機械学習の1章のUFOデータをpandasで集計した

区切り文字の数が変だったり、日付がおかしい(19950000みたいなの)場合はpandasの場合は容赦なくコケる(しかもエラー内容がわからなかったりする)。

Rの場合しれっとスキップするのでさくさく感はあるのだけど、どのデータ落としたのか注意していないとわからないので、自分の場合はまずは綺麗なデータにするということをきちっとやるほうが、自分でデータをネグったという認識ができて後々悩まなくてよいかなと思っている。

実行結果。pandasのmulti indexは便利ですね。

In [2]: execfile("ml1.py")

In [3]: d.head()
Out[3]: 
                     DateOccurred  DateReported  Location  YEAR  MONTH
Location YEAR MONTH                                                   
AB       2004 3                 1             1         1     1      1
         2005 4                 1             1         1     1      1
         2010 7                 1             1         1     1      1
AK       1990 1                 1             1         1     1      1
              3                 1             1         1     1      1

この先がよくわからないんだけどdate_rangeかなんかで月ごとのSeriesを作ってからjoinすればいいのかなぁ。

コード。最初に汚い行(tabの数がおかしい、日付の表現が変)というデータを捨ててpandasに読み込めるようにしてからpandasで処理しています。

import pandas as pd
from datetime import datetime
from numpy import nan
import re

re_date = re.compile("\d{4}[01]\d[0123]\d")

with open("ufo.tsv", "w") as w:
    with open("ufo_awesome.tsv") as f:
        for l in f:
            s = l.split("\t")
            if len(s) == 6:
                if re_date.match(s[0]) and re_date.match(s[1]):
                    if int(s[0][4:6]) > 0 and int(s[0][6:8]) > 0:
                        w.write(l)

def get_loc_code(loc):
    l = loc.split()
    if len(l) == 2 and len(l[1]) == 2:
        return l[1].upper()
    else:
        return nan

d = pd.read_table("ufo.tsv",
                  header=None,
                  names=["DateOccurred", "DateReported",
                           "Location", "ShortDescription",
                           "Duration", "LongDescription"
                         ],
                  parse_dates=["DateOccurred", "DateReported"],
                  date_parser=lambda x: datetime.strptime(x, '%Y%m%d')
                  )
d = d.drop(["LongDescription", "ShortDescription", "Duration"], axis=1)
d.Location = d.Location.apply(get_loc_code)
d = d.dropna()
d = d[d.DateOccurred > datetime(1990, 01, 01)]
d["YEAR"] = d.DateOccurred.apply(lambda x: x.year)
d["MONTH"] = d.DateOccurred.apply(lambda x: x.month)
d = d.groupby(["Location", "YEAR", "MONTH"]).count()

ProductName 入門 機械学習
Drew Conway
オライリージャパン / 3360円 ( 2012-12-22 )


Zabbixでメールを送信出来るようになるまで

一昨年くらい前の静岡インフラ勉強会で紹介されてたzabbixが良さそうと思って書籍を購入したんだけど、購入後放置していた。

最近やっと使い始めたら、便利なんだけどメールの送信設定でハマった。

がtwitterのzabbix界隈の人達のおかげで設定できた。zabbixユーザー層厚い。というか厚いのはいいことだ。それから、職場のネットからはtwitterが遮断されているのでiPhoneでやり取りすんだけど、zabbix界隈の人達の助言がなかったらどんだけ時間をムダにしたんだろとか。

まぁ、それ以上にうちのIT部署は死活監視なんて使ってないんだけどねーw

zabbixのほうの設定

メールを送るのに

  • サーバーの設定:管理 ->メディアタイプでメールサーバーの設定をする
  • ユーザーのメールアドレス登録:管理 -> ユーザーでユーザーのメールアドレス設定
  • アクションの設定:設定->アクションでメール送信の設定

と3つの段階を踏む必要がある。ちなみに二番目の設定を忘れていた(わかりにくい)。ちなみに、ここまで設定してもメールが送信できなかったのではまった。

トラブルシュート

まずはエラーログってことで/var/log/zabbix/zabbix-server.logを覗いてみるもののなんも出力されてないのでイラッときた。エラーが出るのは想定内だけど、エラーログが出ないのは想定外なんで、ああいうのでイライラするのは環境に慣れているせいかもと思った。

ここから、twitterのzabbix界隈の人達の助言にお世話になりっぱなしで。

  • Administration -> auditをみる
  • eventの時間をクリックしていってログをあたる

とエラーが見つかるということを知った(今回の場合後者だった)。ログによると permission denied (13)っていうエラーでメールの送信ができていなかった。

あらかじめ、telnetでメール送れることを確認してあったので、permission deniedがでるのは謎だったのだけど、若干悩んだ挙句SELinuxが有効になっていることに気づきdisabledにして無事送信できるようになった。

管理->メディアタイプorユーザーの設定のところにテスト送信をするという機能がついていればこれほど悩まず解決したのにと思った一方で、悩んだおかげで多少詳しくなったからまぁいいかなぁと。

入門機械学習の1章のUFOデータをpandasで読み込めない

1章のデータをpandasのread_tableで読み込もうとすると

CParserError: Error tokenizing data. C error: Expected 6 fields in line 755, saw 7

となって、エラー終了する。 これはlong descriptionの中に区切り文字であるtabが含まれているせいで、カラムの長さがちゃうよっていうエラーなんだけど、こういうダメな行をスキップするオプションが見つからなかった。

ProductName Python for Data Analysis
Wes Mckinney
Oreilly & Associates Inc / 3634円 ( 2012-10-29 )


pythonでデータのクリーニングをやる場合にはpandas使うよりもforループ回して、要素を一つ一つチェックしていくほうがやりやすいかも。対話的じゃないので、途中のデータを取っておきにくいのでデータがでかい場合試行錯誤しにくいけど。

ProductName 入門 機械学習
Drew Conway
オライリージャパン / 3360円 ( 2012-12-22 )


今日のドラムンベース(130421)

古いのを入れてみた。レコードをmp3にしなきゃいけないけど面倒くさい。

と思っているうちにハードがなくなってしまうのでどうにかしないといけない。

Converge Master / June Miller
The Rain / Rockwell
Gift / Subwave
Colemanism / Fracture & Neptune
Cold Fear / Icicle
A Certain Sound (97 Mix) / Paradox
Past present future / Triad + Synth sense
Half Top Feelings (Amoss Remix) / June Miller
SpectraSoul - The Last attempt / None
Tripwire / Rockwell
Foundation / Breakage
Future Proof / blu mar ten
Halow / Martsman
Polar / Dub Phizix
Pressure / Stickman

ここから先は覚えていない。

ProductName Foundation
Breakage
Pid / 2594円 ( 2010-03-16 )


Rstudio触っていた

土曜日の入門機械学習読書会のためにRstudioをいじっているけどこれはかなり便利。

1章のデータ(UFOの目撃頻度を可視化する) mlch1

2章のデータ(体重と身長) mlch1

RStudioのいいところ

  • 補完が効く
  • エディタがついてる
  • DataFrameの中身が簡単にチェックできる
  • Gitと連携できる(未確認)

Rstudioのいまいちなところ

  • Ctrl-[Int]がmission controlに奪われていて、バッファの切替ができない

cocos2dでiPhoneアプリ(ゲーム)を作っている

まだ4章までしか読んでいないけど、丁寧に解説してあってわかりやすい。メモリ管理はARCなので今風なのかな。

ProductName Learn Cocos2d 2: Game Development for Ios
Steffen Itterheim
Apress / 3302円 ( 2012-09-19 )


kobold2dはcocos2dの足りないところを追加したライブラリのようだ。

kobold

4章では落ちてくる蜘蛛をよけるゲームをつくる。音の扱い方もこの章で学ぶ。

cocos2d

deprecatedになっていたメソッドがいくつかあった。

//self.isAccelerometerEnabled = YES;
[self setAccelerometerEnabled:YES];

ブロックオブジェクトの使い方もちょっと分かったような。

CCCallBlock* callDidDrop = [CCCallBlock actionWithBlock:^void(){
    // move the droppedSpider back up outside the top of the screen
    CGPoint pos = spider.position;
    pos.y = screenSize.height + spider.texture.contentSize.height;
    spider.position = pos;
}];

CCSequence* sequence = [CCSequence actions:easeHang, easeEnd, callDidDrop, nil];

「クリエイティブ・チョイス」を読んだ

王道のビジネス本って感じ

一見すると「イエスかノーか」でしか答えようのない問題にどう取り組み、選択肢をどう創りだし、選択に対する満足度をどう高めるか

ProductName 必ず最善の答えが見つかる クリエイティブ・チョイス
堀内 浩二
日本実業出版社 / 1575円 ( 2009-04-23 )


The Want Listという知らないフレームワークがあったので役に立った

  • 失敗が許されない選択は創造的に成り得ない
  • エンプロイアビリティをきちんと考える