| @技術/プログラミング

一個前の記事で書いた「記事の更新時に updated_at ではなく created_at が更新されてしまう」問題、原因はプログラム側にあるのではなく、MySQL の設定の問題だった。

mysql> desc entries;
+-----------------+--------------+------+-----+---------------------+-----------------------------+
| Field           | Type         | Null | Key | Default             | Extra                       |
+-----------------+--------------+------+-----+---------------------+-----------------------------+
| id              | int(11)      | NO   | PRI | NULL                | auto_increment              |
| user_id         | int(11)      | YES  |     | NULL                |                             |
| category_id     | int(11)      | YES  |     | NULL                |                             |
| slug            | varchar(255) | YES  |     | NULL                |                             |
| title           | varchar(255) | YES  |     | NULL                |                             |
| body            | text         | YES  |     | NULL                |                             |
| type            | text         | NO   |     | NULL                |                             |
| draft           | tinyint(1)   | YES  |     | 0                   |                             |
| created_at      | timestamp    | NO   |     | CURRENT_TIMESTAMP   | on update CURRENT_TIMESTAMP |
| updated_at      | timestamp    | NO   |     | 0000-00-00 00:00:00 |                             |
| frozen_tag_list | text         | YES  |     | NULL                |                             |
| markup          | varchar(255) | YES  |     | NULL                |                             |
+-----------------+--------------+------+-----+---------------------+-----------------------------+
12 rows in set (0.00 sec)

updated_atcreated_at の設定値が逆になってたのが原因。ALTER 文でカラムの情報を入れ替えておいた。

MySQL に流し込んだ Sqlite3 のデータを dump したやつの CREATE TABLE entries を見ると以下のようになってた。

CREATE TABLE `entries` (`id` integer PRIMARY KEY AUTO_INCREMENT, `user_id` integer, `category_id` integer, `slug` varchar(255), `title` varchar(255), `body` text, `type` text NOT NULL, `draft` boolean DEFAULT '0', `created_at` timestamp, `updated_at` timestamp, `frozen_tag_list` text, `markup` VARCHAR(255));

なんでこれが created_at に対して更新時に現在時間を上書きし、 updated_at は作成時のみ現在時刻が入るようになるのかは分からない。

それにしても日頃 MongoDB ばかり使っていて、データにおかしなことがあるのはほぼ間違いなくコードのせいだと思う癖がついていることが今回よくわかった。データベースのスキーマを見てみるまでに3日くらい時間がかかった。とほほ。

一方でデータベース内のデータ構造のことをあまり考えなくてよく、開発のみに集中すればよい MongoDB はやっぱり便利だなと思った。規模がでかくなったり高速な読み書きをさばかなければならない状況だと MongoDB にも色々問題があるのでしょうけどね。

| @技術/プログラミング

Lokka 、データベースはずっと SQLite で使ってたけど仕事で MongoDB を使っているため SQL 力の弱まりを感じてきたので MySQL に変えてみた。SQLite3 から MySQL への移行は意外と面倒くさくて、以下の Redmine の手順を参考にやってみた。

  1. Strip out PRAGMA lines
  2. Strip out BEGIN TRANSACTION; lines
  3. Strip out COMMIT; lines
  4. Strip out DELETE FROM and INSERT INTO the sqlite_sequence table
  5. Replace AUTOINCREMENT with AUTO_INCREMENT
  6. Replace DEFAULT ‘t’ and DEFAULT ‘f’ with DEFAULT ‘1’ and DEFAULT ‘0’
  7. Replace ,’t’ and ,’f’ with ,’1’ and ,’0’
  8. Replace “ with ` except in string values (otherwise it replaces all quotes in your text)

Migrating from sqlite3 to mysql - Redmine

↑の通りにやっておおむねうまくいったんだけど、なんか過去の記事を編集して更新すると、updated_at カラムだけじゃなく created_at まで更新されてしまうっぽい。SQLite で使ってるときにはそんなことなかったんだけどなぁ。これは問題な気がする。DataMapper のバグかな。土日で余裕があったら調べてみる。

| @技術/プログラミング

VM 上の Scientific Linux で Jenkins を動かしていて、テスト結果のグラフが表示できない問題に遭遇していた。出るエラーメッセージは以下のようなもの。

Graphics N/A
Unable to access X. You need to run the web container in the headless
mode. Add -Djava.awt.headless=true to VM.

OpenJDK が原因らしい(jenkinsでGraphics N/Aが出た時にしたこと | ミラボ)。

OpenJDK をやめて Oracle の JDK に変えればいいらしいのだけど、 OpenJDK でもグラフ表示できている人はいるっぽいし、ソースから Java を入れるのが嫌なので OpenJDK で何とかする方法を探していた。

もろもろ情報をあさってみたところ、どうもフォントがないのが問題らしい。

Jenkins の wiki にあるとおりに /var/log/jenkins/jenkins.log を漁ってみたら、以下のようなエラーメッセージを発見した。

Caused by: java.lang.Error: Probable fatal error:No fonts found.

これに対して公式 wiki には

Obviously graphics rendering needs access to font metrics. So check java /etc/java-6-openjdk/fontconfig.properties and install missing fonts. OpenJDK refers to DejaVu-Fonts. So type:

sudo apt-get install ttf-dejavu

とあるので、yum search dejavu して dejavu って名前がついてるフォントを片っ端から入れたらちゃんとグラフが表示されるようになった。

お困りの方はお試しください。

| @読書

最近、蓄財意欲が高まっているので『男の本格節約術 — 5年で1000万円貯める52のノウハウ』を買って読んだ。

著者は元メガバンク勤務のエリートサラリーマンなので、「そりゃ年収1000万円以上あれば5年で1000万貯まるだろうよ」と思いながら読み始めたんだけど、中身を読んでみると読者の年収はあまり関係ない内容になっている。とにかく節約が大切だ、ということが書いてあった。

以下、気になった点の要約。


資産を形成するために

  • やること
    • 銀行口座残高と総資産残高を月次管理する
    • Excel に毎月の資産の変動を記録する
    • 毎月、資産増加額の目標を設定し、目標と実績の乖離を検証する
    • Excel でグラフを作成する
    • 毎月、手取り給料の25%を積み立てる
  • やらないこと
    • 家計簿はつけない
      週五日働いているサラリーマンが家計簿をつけることは事実上無理。
    • こづかい額は設定しない
      「使う額」のことを気にするのではなく、「貯める額」の方を気にする。貯めた上で余った金額を使う。
    • 貯金箱は使わない
      正確な月次資産把握ができなくなるので。

日々の心がけ

  • 「機会費用」、「時給換算」の概念を捨てる
    「時給に換算したら壊れたものの修理を自分でやるのはバカらしいので新しいものを買った方がよい」は間違い。壊れたものを修理するのにかかる間、職場にいるわけではないので給料は発生していない。新しいものを買えばお金が出ていくだけ。実際のキャッシュベースで考える。

ものを持たない、ローンを組まない

  • 持ち家よりも賃貸に住む
    • 住宅ローンは年収の5倍もの借金をすることであり、家計を企業に置き換えると圧倒的な債務超過に陥っている。住宅ローンを組むのは正気の沙汰ではない。
    • 不動産を買って良いのは、現金で買える場合か、10年程度の短期間で返済を終えられるかのどちらかの場合のみ。
  • 車は持たない
    • 車の維持費はガソリン代以外固定であり、年間の維持費は70万円程度になる。
    • 車を乗り換えながら30年間所有した場合、車への支出は2000万円を超える。
  • ものを買っても死ぬときはあの世に持っていくことはできない。レンタルで済むものは借りるようにする。

家庭での実践

  • 外食は休日の昼間に行う
    昼に外食することで安く上げられる。
  • 贅沢は結婚記念日や誕生日に限定して行う
  • 本や雑誌は図書館で借りて読む
    • 本は持っていても物理的に保管不能になる。必要なときに図書館へ行って借りて読むのが良い。
    • 読んだ本の中で気になった点は写経してパソコンに保存すると検索できるようになるので便利。
  • CD や DVD はレンタルを利用する
  • 保険に入りすぎない
    • 保険とギャンブルは似た性格を有している
      • どちらも確率ベースで、保険は「当たった」ときに辛い目に遭い(代わりに保険金を得る)、ギャンブルは当たったときに富を得られる。
      • ギャンブル(宝くじ)の還元率は46%だが、保険の還元率は39%と考えられている(保険会社は十分に情報を開示していない)。保険の方が宝くじよりも割りが悪い。
    • 十分な金融資産があるならば保険に入る必要は無い
      • 金融資産を積み上げるほど、保険料は引き下げられる。万が一のときには自己資産で対応できる。
      • 「家族の必要生活資金(総額)」 - 「手持ち金融資産」 = 保険金で受け取る金額 ←式に合わせて加入する保険を考える。
    • 生活に余裕が出たら、保険は見直す

職場での実践

  • 飲み会に行かない
    歓送迎会などの一次会のみに参加する。
  • 職場で飲み物を買わない
    毎日、2回喫茶店に入ると年間で 300円 * 2回 * 5日 * 52週 = 156,000円 の出費、毎日2本缶コーヒーを飲むと 120円 * 2回 * 5日 * 52週 = 62,400円 の出費。
  • 昼食代を浮かせる
    • 弁当を作ってもらえるなら弁当を持参する。
    • 社食があるなら社食で食べる。
  • 見栄を張らない
    職場に高いスーツを着ていかない、高い時計や靴を買わない。
  • 金融リテラシーを高める
    • 日本の教育は、個人の資産形成については教えてくれないため、日本人は金融リテラシーが著しく低い。
    • 『アメリカの高校生が読んでいる資産運用の教科書』のような本を読み、お金についての知識を高める。
  • 家計に企業の経営手法を応用する。
    • キャッシュフロー経営(入ってきた以上に使わない)
    • ローコストオペレーション(固定費を下げた生活を心がける)
    • 月次決算(金融資産の額を毎月確認する)
    • 見える化(金融資産のポートフォリオグラフを作成する)
    • 不稼働資産の売却(使わないもの、読まない本、聞かないCDを売る)
  • 貯蓄よりも返済を優先する
    一日も早く返済を終え、支払い金利を一円でも少なくする。

節約志向の副作用を知る

  • 節約ばかり考えていると発想の貧困化を招く。
  • 既存の枠組みの中でいかに出費を抑えるか、ということばかりに目が行き、斬新な発想をしてみようという感覚が出てこなくなる。

以下感想です。

すべての始まりは節約

本の中には英語の節約に関することわざがたくさんちりばめられている。冒頭は著者が影響を受けた『となりの億万長者—成功を生む7つの法則』の引用から始まる。昼食は毎日1,000円程度の外食で、職場では2本も3本も缶コーヒーを飲み、休憩時には喫茶店でコーヒー、仕事の後も週に1回は飲みに行く、という人は多いと思うけど、自分には到底理解しがたい金銭感覚だ。職場では基本的に無料の水しか飲まないし(ウォーターサーバーのある会社で良かった)、昼は持参した弁当か配達の激安弁当を食べる。豪華な昼ご飯を食べたり缶ジュースを何本も飲んだりするよりも、もっと他のことにお金使った方がいいと思う。こういう金銭感覚を持った自分からすると、英米の偉大な金持ちはケチだったという話には大変勇気づけられた。

貯蓄を行うための確実な方法は天引き

蓄財を行うための確実な方法は、手取り収入の25%を給料日に有無を言わさず貯金してしまうこと。後は残りのお金で生活する。こづかい額を設定しないのもこの発想に基づいている。貯蓄が一番先に来て消費は最後。貯蓄して余った分を使うという発想に切り替えないとお金は貯まらないと思った。

著者が提唱する Excel による月次の資産管理も参考になった。自分は iCompta という iPhone と Mac で同期しながら使えるソフトで家計簿を付けていたけど、レシートが溜まっていくばかりでここ一年ほど破滅状態にあり、家計簿が実体を反映していない。やはり着眼点を変えて、出ていく金額に気をかけるのではなく、貯める金額に気をかけるべきだと思った。

投資について

投資はどちらかというと損をしないために行うべきものであって、積極的に儲けようとしてはいけない、という印象を持った。例えば著者は海外赴任中に、日本の銀行の普通預金口座に数百万円預けたままにしておいたことに赴任先で気づいたそうだ。もしこれを定期預金として預けておけばより多い額の利息を得ることが出来た。このような「効率的に運用していれば得られたはずであろう利益」を損として考えるような心構えで投資や資産運用を行うべきだと感じた。『アメリカの高校生が読んでいる資産運用の教科書』は興味が湧いたので Amazon で古本を注文した。

家や車について

家について

著者は持ち家派か賃貸派かで言えば賃貸派だと言っている。しかし賃貸は支払う家賃の割りに部屋が狭くてしょぼいのが問題だと思う。例えば分譲マンションを購入して2000万円の35年ローンを組んだとき、月の住居費(ローンの返済、管理費、修繕積立金)は8万円くらいになると思う(ここで計算できます)。しかし同じマンションに賃貸で入居しようとすると家賃は12万円くらいになる。月8万円で住める賃貸住宅は狭くて設備も著しく劣っているはずだ。どうせ同じ金額(8万円)を住居費に費やすのだったら広くて快適なところに住みたい。

また賃貸は年をとってからが大変な気がする。70歳とかになって賃貸住宅に住もうとしても、入居の審査が通らないかも知れない。そもそも年金暮らしになったときに、毎月8万円も住居費に充てるのは無理な気がする。国民年金を満額収めている人でも6万6千円しか支給されないのだから、やはり定年退職する前までには住居に関する不安は払拭しておきたい。となると働けるうちに家を購入して返済を終え、老後は家賃がかからない生活を送るのがいいと思う。

本の中で著者はたばこを吸う人を刹那の快楽を得るために寿命を短くすると言っているのだけど、賃貸住宅を好む人達だって、若いときに好きな町にふらふら移り住むために高い家賃を払い、老後に困窮することを選択しているキリギリスにしか見えない。

車について

車については著者は、都市部に住んでいるなら持つ必要は無い、と言っている。車を所持することで年間で必要な維持費は70万円であると試算してある。これは駐車場代が月2万円で、200万円の車を10年乗るとして購入した場合である。車を処分するだけで年間70万円の節約になるので、車は持つべきではない、というのが著者の主張だ。

自分も福岡に引っ越してくるときに車を処分してしまった。確かに福岡市の中央区や博多区などから一歩も出ないと決意するのであれば車はいらないかも知れないけど、市内でも郊外に住んだり実家に帰省したりするときのことを考えると、車がないとなかなか厳しい。福岡は駐車場代が東京よりは安いし車を買うとしても100万円くらいのものにしようと思っているので、維持費は、当初3年間は車のローンの返済があるため年間80万円、完済後は45万円くらいになると試算している。

一方で、車を所有している場合と同じ頻度でレンタカーやタクシーを利用すると仮定した場合(月2回レンタカーを借り、月20回タクシーを利用し、電車やバスも適宜利用すると仮定)、年間の自動車費は98万程度になると予想された。これなら買ってしまった方が経済的だ、ということになる。

またレンタカーやタクシーを利用する場合、いつでも好きなときに自分のタイミングで外出する、ということが難しくなる。金曜の夜10時頃に唐突に久留米ラーメンが食べたくなってしまったとき、自動車を所有しているならマイカーに乗って久留米まで行ってしまえばいい。しかし車を持っていない場合は諦めざるを得ない。レンタカー屋はほぼ閉まっているし、タクシーで久留米まで行くことは不経済だ。電車で行けないこともないけど、ラーメンを食べ終えた頃に上り列車の終電に間に合うかは微妙なところである。

少なくとも地方都市に住んでいる限りにおいては、車があった方が圧倒的に快適な生活を送ることができるのではないかと思うがどうだろうか。

ものを持たない生活について

著者が提唱するなんでもレンタルで済ませるという生活には一理ある。大抵の本は買っても一度しか読まないし、一度しか読まない本のためにスペースを確保するのはバカらしい。また本はかさばるので捨てるとしても大変難儀する。図書館で借りられるならそうした方がいいとは思う。

しかし CD とかもレンタルで済ませろというのには違和感がある。誰も音楽買わなくなったら音楽で食ってる人達が生活できなくなる。そうしたら世に出回る音楽の種類や質も劣っていくのではないだろうか。そういう世の中はつまらない。そもそも自分が聞きたい音楽がレンタルで手に入るとは限らない。

この本全般に言えることだが、著者はファッションや音楽など、俗世への煩悩が控えめな人のようなため、主張が極端な気がする。みんなが著者と同じ価値観でものを考えられる訳ではないし、服が好きな人や、アンダーグラウンドな音楽が好きな人だっている。そういう文化的な趣味趣向は「無価値」と割り切れるのであれば、ひたすら節約生活を極めることができると思うけど、なかなか人間そうはいかない気がする。

そもそものことを言うと、みんなが何でもレンタルで済ませるようになったら、この本だって誰も買わず(買うのは全国の図書館だけ)、筆者だって困るはずだ。

家にしろ車にしろ本にしろ、「ものを買うやつは情報弱者」と言い捨てるのは気分爽快かもしれないけど、みんながそのような消費行動を取り始めると世の中お金が回らなくなってしまう。それはそれで問題だと思うんだけどな。

ともあれ冒頭の「資産残高の月次管理」の部分は参考になったので、自分も実践してみたいと思いました。とりあえず家計簿をつけることやめてたまりにたまったレシートを捨てることにします。

| @技術/プログラミング

だいぶ前の記事では Jekyll は Git の hook を使って公開してると書いてた。

しかし記事の本数が増えてくると、 jekyll コマンドで生成した静的なファイルも Git でトラックするのがだるいと感じるようになった。ので Rakefile に以下のような task を追加して、公開先のサーバーに rsync でファイルを転送するように変更した。

desc "Publish"
task :publish do
  path = File.expand_path("_site")
  if system("rsync -avz --delete #{path}/ portalshit:sites/tech.portalshit.net/_site/")
    puts "Your blog was successfully published!"
  else
    puts "Something went wrong..."
  end
end

だいぶデプロイが手軽になった。

| @技術/プログラミング

I know why you came here. BECAUSE IT'S HARD TO FIND CONTENT IN GITHUB WIKI!!!

Here is a solution.

My colleague Tomohisa created a nice userscript. It provides you an ability to search GitHub Wiki in pretty easy way.

Install the script from his GitHub repository. It's compatible with Firefox (with Greasemonkey, of course), Google Chrome and Safari (with Nijakit).

Then you will find search box on right above "Page History" button.

1.png (640×457)

2.png (640×457)

Now search all the wiki content with github-wiki-search.user.js!

| @技術/プログラミング

Mac の iTerm 2 皆さん使ってますか。コンソール中に現れた文字列をハイライト通知できたりしていろいろ便利らしいですね。でも僕は使っていませんでした。なぜか。

Ctrl + Shift + J によるかな入力変換ができないから。

これが非常にだるかった。宗教上の理由や国外在住でJISキーボードが手に入らないなどの理由のためやむなく英語キーボードを使っている方、おられると思います。そういう人はだいたい Ctrl + Shift + J で英数 -> かなの入力変換を行っていると思いますが(Command + Space の切り換えもできなくはないけどだるいですよね…)、iTerm 上では Ctrl + Shift + J で改行が行われてしまうため、このような操作が行えていませんでした。かなから英数入力に切り替える Ctrl + Shift + * も同様、むなしく ' などが表示されるだけ。標準の Terminal.app ではできるのになんでやねん。

iTermでの日本語入力 - 初学者の箸置 なんかを参考に Send Hex Codes 0x4a するようにしてみたりしたのだけどうまくいかなかった。

しかし先ほど仕事をさぼって iTerm の設定項目を確認していたら以下の設定で使えるようになったのでここに書き記しておきます。

iTerm で Ctrl + Shift + J でかな入力変換する方法

↑のように、iTerm の Preferences -> Profile -> Keys で Ctrl + Shift + JCtrl + Shift + * の項目を追加し、メニューから "Do Not Remap Modifiers" を選ぶだけでオッケー。かな英数の切り換えが快適に行えるようになる。困っている方お試し下さい。