とあるオジサンのサンデー図工(ロビ編)

この記事は1年くらい塩漬けにされてたらしいのですが、唐突に思い出したので今投稿しました。多分トラウマだったんだと思います。

唐突の図工シリーズ第二段。ロビというロボットを皆さんご存知でしょうか。そうDeAGOSTINIが出してるアレです。(最近DMMから組み立て済みが買えるようなるらしいです。)

総額14万YENくらいするらしいんですが塗装したかったのでついカッとなってやった話です。

きっかけ

僕が購入したのは、初版のロビなんですが、初版のロビは最初ということもあって白いパーツが色移りして徐々に赤茶っぽくなってしまうという不具合がありました。腕の根元部分がその変色部分です。

DeAGOSTINIさんは太っ腹なので変色しないパーツ一式を別途送ってくれたんですがなんとなくもったないので、変色したパーツをベースに、塗装でもすっか!と思ったのが地獄の始まりでした....

塗装仕様

とにもかくにも塗装するためのイメージが必要です。どんなカラーリングにするのか事前にこんな感じで決めました。

パ◯レイバー仕様です(キリ 。決してS◯ftbankのペッ◯ ーくんではありません。この塗り絵の元画像はロビの掲示板サイトに行くとGETできます。

http://deagostini.jp/community/rbi_bbs/detail.php?id=855

準備

イメージは固まったもののプラモの塗装とかも別に詳しいわけじゃないし一体どうやったらええのや。てところからスタートしました。ネットでロビの塗装をしてる人たちの情報を参考に、以下のような道具を用意しました。インターネッツ最高。ありがたや。ありがたや。

アクリル塗装スプレーは仕事帰りに東急ハンズで買いました。最初は小さい奴を買ったんですが、僕みたいに塗装素人の場合は、でかいサイズのを買った方がいいです。
あっという間になくなるのです。。。

解体

とりあえず塗装するためには、まずは解体です。

解体前

f:id:tell-k:20160420011641p:plain


解体後

見るも無残な感じなっていますたが、全部バラすとこんな感じです。

解体する時に、どのサーボどの位置にあったか忘れないようにシールとか貼っておくのおすすめします(字が汚い...)。またあらかじめどこのパーツを塗るのか目算をつけておいた方がいいです。サーボ付近の部分や裏側で目立たない部分は塗らなくてもいいのかとか検討しておくと後々スムーズです。

塗装作業

簡単に塗装するまでの順番を書きます。

1. 耐水ペーパー(#400〜#800)で削る

塗装を乗りやすくするために粗めの#400〜#800の耐水ペーパーで順番に削ります。ひたすら塗装対象のパーツを削ってなだらかにしていくだけの簡単なお仕事です。

2. プラスチックプライマー

次に塗装を剥がれにくくするためにプライマーをを吹き付けます。スプレーを吹き付ける基本としては、一回で全てを塗るのでなく、薄く吹き付けては乾かして、吹き付けては乾かしてを2,3回繰り返す感じで塗っていきます。一回吹き付けたら15〜20分くらい乾かします。

3. サーフェイサー

次にサーフェイサーです。サーフェイサーは塗装の下地となるものなので、プライマー同様に吹き付けと乾燥を2,3回くらい繰り返します。薄く塗らないとダレた感じになってしまうので、気をつけてください。

1回目のサーフェイサーまでやったところです。失敗した場合は、再度 1の工程からやり直すイメージです(これが精神的につらかった..)


4. 耐水ペーパーで削る

ようやっと塗装の前段階です、ここでも塗装が乗りやすいように、細め(#1000 ~ #1500)の耐水ペーパーを軽くかけます。

5. 塗装スプレー

やっと黒とか白の塗装ができる段階です。ここでも薄く吹き付け -> 乾燥を繰り返します。
塗装スプレーは一見乾いたように見えても、完全に乾ききるまで2,3日はかかります。

迂闊に指で塗装部分を強く押したりすると指紋が残った状態になったりするので注意が必要です。。。

f:id:tell-k:20160420011738p:plain

6. 耐水ペーパーで削る

塗装が一通りでできたなーって、最後の耐水ペーパーです。#2000くらいのもっと細めなやつで
軽く撫でる感じでやさしく削ります。

7. 光沢スプレー

最終的にはピカピカにしたいなーという思いがあったので、光沢スプレーをかけます。
これも5の塗装スプレーと要領は一緒です。完全に乾くまで気長に待ちましょう。

ただ今回購入したらスプレーは「ツヤあり」のものだったので光沢スプレーあっても
なくてもあんまたいして変わらなかったようなが気がしました。

8. コンパウンド

コンパウドは、クリーム状のヤスリみたいなもので、さらにピカピカにするためには
これを使います。タミヤからは「粗目」「細目」「仕上げ目」の3種類あるんですが、
使ってみたが感じ「細目」と「仕上げ目」だけで十分な気がしました。

9. 組み立て

ようやく塗装が終わったので、あとはまた1から組み立てです。今回はサーボモータまで
塗ったもんだから、パーツ組み合わせた時に微妙に浮いたり、ぴったり噛み合わなかったりしたら
ヤスリで削って、またちょっと塗装しなおすということを永遠やります。。。。

f:id:tell-k:20160420011817p:plain

f:id:tell-k:20160420011826p:plain

f:id:tell-k:20160420011836p:plain

大変だった作業

胸パーツと腕パーツの2色塗り分け

今回は、胸と手の先の部分は、白と黒の部分を塗り分けるという仕様にしてしまったせいで
その塗り分けが異常に大変で、なんども失敗して、心が折れて、何もかも放り出しそうになりました。

f:id:tell-k:20160420012023p:plain

具体的には、まず白ベースで塗装が終わったら、完全に乾いたのをまって、マスキングテープ
貼って、その上から黒で塗装という感じです。

完全に乾いてからやるというのがポイントで、完全に乾かないうちに、マスキングテープ
貼ると、剥がした時に、テープ跡が残ってしまい。。。また白地から塗り直し。。。うぅ辛い。。

なんどやってもテープ跡が完全になくなるまでには至らなかったので最終的には妥協しました。
コンパウンドで根気よく磨けばある程度は目立たなくなります。

サーボが死んだ

これがきつい。サーボを塗装したせいなのかよく分からないけど、組み立て動作確認してたら
一個サーボが死んでることが発覚。ロビの公式サイトから、サーボを購入してまた塗り直すっていう
悪夢があった時には、「もうこれで終わってもいい」って心のゴンさんが言ってました。

f:id:tell-k:20160420012041p:plain

完成

そんなこんなでようやっと完成ですよ。

f:id:tell-k:20160420012404p:plain

f:id:tell-k:20160420012332p:plain

やっぱダメなところ

  • 胸パーツを何度も塗ってたら厚塗りになって、パーツが噛み合わなくなって、胸の縦線が目立つようになってしまった..
  • マフラー部分の後ろの空いてる部分をパテで埋めたら、重くなって、一人で立ち上がれなくなってしまった..
  • 全体的に白のサーフェイサーを使ったけど、もともと白いパーツにはグレイのサーフェイサーにした方が、均一の白になったんじゃなかろうか説
  • このへんはまぁおいおい考えます...

感想

  • 基本週1の3~4時間をリミットに作業したけど作業完了ま4〜5ヶ月かかって、まじなめてましたすいません。
  • 塗装1回失敗すると、すぐにはリカバリーできなくてだいぶ辛かった。
  • うまくいってる時は塗装はめちゃくちゃ楽しかった。(ただし時間はあっという間に過ぎる)
  • けどもうしばらくやんねぇぞ!!!!

Macでdnsmasqを使ってお手軽名前解決

最近興味があってBoxenを調べています。BoxenはMacで開発するための
環境をよしなに整えてくれるツールなんですが、その中で気になったのが下記のヤツ

dnsmasq w/ .dev resolver for localhost

via https://github.com/boxen/our-boxen

はて?dnsmasqで.dev resolver for localhostてどんな事してくれるんじゃろかい?

何してくれんの?

端的に言うと

  • dnsmasqでローカル向けにDNSサーバを立てる
  • .dev のドメインはローカル(127.0.0.1)で名前解決できるようにする

あぁ上に書いてある説明どおりですね。ていう事をやってくれます。

もう少し噛み砕くと、ローカルでの開発用に hoge.dev, fuga.devみたいなドメインが欲しくなった時って、/etc/hostsに一個一個定義してたりしましたが、もうこんな事しなくてもいいんですぜ旦那。「*.dev」のドメインであれば、勝手に127.0.0.1に向く用にできまっせ。という話

# /etc/hosts

127.0.0.1   hoge.dev
127.0.0.1   fuga.dev

ではboxenが自動でやってくれるような事をわざわざ手動でやってみます。アナログ最高。ヒャッハー!!!!

ちなみにboxenのpuppetのヤツはここです。

dnsmasq のインスコ

$ brew install dnsmasq

設定ファイルの用意

# 設定ファイルのコピペ
$ cp $(brew list dnsmasq | grep /dnsmasq.conf.example$) /usr/local/etc/dnsmasq.conf

# 自動起動の設定ファイルコピペ
$ sudo cp $(brew list dnsmasq | grep /homebrew.mxcl.dnsmasq.plist$) /Library/LaunchDaemons/
$ sudo launchctl load /Library/LaunchDaemons/homebrew.mxcl.dnsmasq.plist

dnsmasq.confの設定変更

# /usr/local/etc/dnsmasq.conf

# wildcardでの名前解決を許す?
bind-interfaces 
# launch deamonで動かすために常にforgroundで起動
keep-in-foreground  
#  /etc/resolve.confを見ない
no-resolv 

#  *.dev ドメインへのアクセスは全てlocalに。
address=/dev/127.0.0.1 
#  名前解決する時にローカルを見るためには自動的にloopbackしてくれんので、明示的に設定するとかなんとか?
listen-address=127.0.0.1 

/etc/resolver/devの設置

  • Macは特定のドメインDNSだけを切り替える事ができる
  • /etc/resolver配下にそのドメインと同じ名前でファイルを設置するればおk
  • 書式は /etc/resolve.confと一緒
# /et/resolver/devを作成
$ sudo mkdir -p /etc/resolver
$ sudo touch /etc/resolver/dev

# 中身はこの一行のみ
nameserver 127.0.0.1

DNSのキャッシュクリア

一応キャッシュのクリア

$ dscacheutil -flushcache

確認

ここまで作業は終わりあとは確認

# *.dev のドメインは全て127.0.0.1が返ってくればOK
$ ping -c 1 hoge.dev
$ ping -c 1 hoge.fuga.dev
$ ping -c 1 hoge.fuga.piyo.dev

# 他の名前解決に支障がないか一応確認
$ ping -c 1 www.google.com

余談

  • /etc/hostsを弄る必要が無くなったのは良い。
  • dev以外に対応するドメインを増やしたかったら? 例えば *.hogeみたいな。
    • /usr/loca/etc/dnsmasq.conf に "address=/hoge/127.0.0.1" の行を追加
    • /etc/resolver以下にhogeファイルを置けば良い。
  • もうちょっと修行しないとオジサンダメです。

Andorid標準ブラウザでiframeのスクロールがおかしくて久しぶりにキレちまった件

Androidのブラウザでiframe利用してコンテンツを表示した時に困った時の話。別にキレてないです。

前提

  • Android OSは 4.0.3
  • iframeで読み込むコンテンツはサブドメイン
  • iframeのコンテンツは親frameに収まらずにスクロールする。
  • iframeのコンテンツはフォーム的なもんが表示

現象

  • スマホ(Android 4.0.3)でiframeが存在するページを表示してフォームが表示されていた。
  • 画像の通り、radioボタンが並んだ縦長のフォームを表示している。


  • 初期表示では、radioボタンをポチポチチェックできる。


  • 送信ボタンを押そうと下に引っ張ると、iframeの中がスクロールする。


  • ここで問題が発生する。送信ボタンが押せないどころか、その状態でradioボタンを押すとチェックが入らない!!!

原因

  • 詳細な原因までは正直わからないが、要はこういう事らしい。

1. 初期表示の状態ではradioボタンを押せる
2. 一度スクロールすると、押せなくなる。

これは押せなくなってるんじゃなくて、初期表示の位置をタップしていると同義らしい。
実際に少しだけスクロールさせてradioボタンをクリックすると、上の方のradioボタンにチェックが入る。


対応

さてこれに対応するにはどうしたんもんかという話だが、要は「スクロールなんてしなくてもいいくらいにiframeの高さを調節すれば良い」という事だった。

その対応は、mixiさんが提示してるようにjsでiframe内の高さを取得して、iframeの高さを自動的に設定すれば良い。

ところがどっこいiframeはSameOriginPolicyによってサブドメインだろうが、port付きだろうが、httpsだろうが別ドメイン扱いなので、iframe内の情報を取得するのは無理ゲーだった。

はーマジなんなの?

f:id:tell-k:20140426132610p:plain

というわけで、単純にiframeのheight属性をスクロールが発生しないであろう高めに設定するだけにした。もうiframeなんてなかったんやと思いたくなる珠玉の一品。

余談

どういう了見でこんな事になってるかまでは、ソース的なものが見つからなかったので、もし知ってたら誰か教えてください。

他に方法を無いかなと探した結果、yet antother的にcross domainのiframeの情報を取得する方法があったけど、どれもBKな感じがいなめないので、まだ試していない。

ちなみに Androidの2.3.x系、Android4.2.x系では、この現象は発生しなかった。

夏までに痩せたい!厳選!超オススメダイエット商品10選!!!

さて本日は、数々のダイエット商品を使い続けて来た私が「絶対に」購入したい、超厳選ダイエット商品をランキング形式でご紹介したいと思います!今回はコンビニで買えるものばかり集めてみましたので、ネットや専門店でしか入手できないものは後日またご紹介したいと思います(^^)

それでは、ご覧ください!

↓↓↓




















第10位

http://www.amazon.co.jp/exec/obidos/ASIN/B00EOI6XVY/study02-22/


まずは定番、トクホ系のお茶「特茶」ですね。知る人ぞ知るお茶です。

お茶の記事では無いので詳しい説明は避けますが、特茶は「ケルセチン配糖体」という脂肪分解酵素を活性化させ、体脂肪を減らす効果がある特徴をもっています。日本でも根強いファンは多いです。ダイエットを検討してる方は購入すべきと言える商品でしょう。



















第9位

http://www.amazon.co.jp/exec/obidos/ASIN/B00EOI6XVY/study02-22/
お茶と言えばサントリーサントリーといえば飲み物、飲み物といえば食事です。 そう、せっかくお茶を買ったからには、食事を楽しまなければいけません。

食事楽しむためには、焼肉甲子園などでもおなじみの「烏龍茶」でもよいのですが、ここは食事を楽しみながら、さらに健康的な感じをアピールしつつクールさを演出したい所です。そんなあなたにオススメなのが、この「特茶」!

なんと飲んでるだけで脂肪がみるみるウチに分解されるお茶なのです!特茶は他のトクホ系の飲料(ヘルシア緑茶等)に比べて値段はほぼ同じ感じでペットボトルのサイズが大きいのでかなりお得感ありますね(かなり)。














第8位

http://www.amazon.co.jp/exec/obidos/ASIN/B00EOI6XVY/study02-22/

さて、お次にオススメしたいのが、特茶というお茶です。このお茶はいわゆる「特定保健用食品」で、特定をの保険の目的が期待することができます。
健康を維持するためのなんかすごい効用があるので、健康的で効率的にダイエットしていくことができます。そして、効率的で健康的ににダイエットしていくことができます。















第7位

http://www.amazon.co.jp/exec/obidos/ASIN/B00EOI6XVY/study02-22/

さて、世界中どこでも売られてる現代の必須飲料、それは「お茶」ですね。お茶はヨーロッパでは「紅茶」が古くから飲まれていると思いますがヨーロッパで最初に伝わったお茶は、17世紀にオランダ商人が平戸(長崎県)から輸入した「日本茶」だと言われてます。意外でしょう(笑)

日本では古来より茶筅で混ぜて飲む、いわゆる「抹茶スタイル」がありますが、普段から、茶筅を持ち歩いてる人もいませんし、そんなに時間に余裕がある人もいないので気軽にコンビニで美味しいお茶を買いたいし、飲みたいですよね。そこで特茶というお茶です(^^)

普通にコンビニで、お金を出せば、簡単に本格的なお茶が楽しめますよね!あと、効率的で健康的ににダイエットしていくことができます!













第6位

http://www.amazon.co.jp/exec/obidos/ASIN/B00EOI6XVY/study02-22/
えーと、トクホのお茶です。










第5位

http://www.amazon.co.jp/exec/obidos/ASIN/B00EOI6XVY/study02-22/
お茶です。サントリーの。














第4位

http://www.amazon.co.jp/exec/obidos/ASIN/B00EOI6XVY/study02-22/
お茶












第3位

http://www.amazon.co.jp/exec/obidos/ASIN/B00EOI6XVY/study02-22/
第3位は「特茶」です!世界には数多くお茶の種類がありますが、全て同じ「茶の木」という植物の葉から作られることは有名ですが、これは「特茶」です!サントリーのトクホのお茶です。

さて、この第3位の「特茶」というお茶なのですが、第4位の特茶と、どちらを3位にしようか、最後まですっご〜〜〜〜〜く悩みました!(笑)(^^;) それくらい、「特茶」と「特茶」、どちらもすごくいいお茶なんです!













第2位

http://www.amazon.co.jp/exec/obidos/ASIN/B00EOI6XVY/study02-22/
さて、惜しくも1位を逃すこととなった第2位は、「特茶」です!「特茶」、中には初めて耳にした方も居るかもしれませんね。一般的にトクホのお茶を購入した場合その用途の9割がダイエットで残り4割がダイエットだと言われています。

そう、つまり、ダイエットをするにあたって、どのようなトクホのお茶を選ぶべきかは非常に重要なのです。トクホのお茶は多く存在しますが、あなたにあった最適なお茶を選ぶという事はあなたの健康ライフをそのものを最適化することに他なりません。

そこで私がおすすめしたいのは、やはり「特茶」です。最終的なお茶として、例えばヘルシア緑茶などを選んだとしても、「効率的にダイエットする事」を突き詰め、ダイエット方法としての新しいパラダイムを実現したとも言える「特茶」を経験しておくことは非常に大切でしょう。













第1位

そして栄えある第一位は....

















http://www.amazon.co.jp/exec/obidos/ASIN/B00EOI6XVY/study02-22/
特茶です!!!!!!!!!!!!!!

で本当は?

  • 2014年1月中旬の時点で65kgでしたが現時点(2014/04/13)で55kgです。
  • 周りの人間に「太ってる」事を連続して強調されたため、ついカッとなって飲み始めた。反省はしてない。
  • 日々増減はしてるけど、少しずつ痩せっていってるイメージです。
  • 特茶以外にも、ストレッチやら、食事を気をつけるなどは以前からしてました。
  • 本当に効いてるかどうかは定かではないが、特茶を飲み始めた時期から痩せ始めたので何となくそのまま飲んでます。
  • ヘルシア緑茶よりはは苦くないので割と味的にも気にいってます。じゃなきゃ毎日飲めないし。
  • 特茶愛が極まって書きました。
  • 目下の心配は、飲むのやめたらリバウンドするのかなてのと、どこで下げ止まるのかなて所。

で効くの?

  • ググればすぐ分かると思いますが、万人に効果があるというものでも無いようです。
  • 割と眉唾なんじゃないか的なネガティブな記事はいくつか見つかると思います。
  • 真偽に関してはご自身で判断してください。私は一切責任を負う事はできません。ご自身の健康状態を考えた上で、ご購入、ご利用を検討してください。
  • 私と似た体質、生活リズムのヒトには効果があるかもしれないので。以下何となく思いつく特徴を列挙します。
    • そもそも小食である。(三食きっちり食べない、1回の量が少なめ)
    • 通常は殆ど運動しない。通勤やら、腰痛、肩こり軽減のためのストレッチ程度。
    • 社会人になって、大して生活スタイルが変わってないのに徐々に太り、徐々に痩せにくくなった。
    • 「食っても食っても太らないんだけど」そんな風に考えてる時期が私にもありました。
    • 水分を多く取る。1日に3〜5本の500mlのペットボトル位は取ってます。現在はその内2〜3本が「特茶」になってる感じです。
    • 最近は甘いもの控えてます。元々好きだけど、我慢してるしオジサン偉い。

結論

「齢三十も半ばを過ぎ、大した努力もせずに、10kg痩せられるの最高便利!!!」

P.S. サントリー社員のみなさん

朗報です。偶然なんですが、わたくし、本日誕生日でして、しかも特茶のストック切らしております!そしてここにはAmazonの欲しいものリストがあります!!!いやーもう本当に全然そういうんじゃないので、一緒に奥義「ステマ」を完成させましょう!!!

Amazon.co.jp: tell-k: 誕生日なので特茶が欲しいと思うヒトのリスト

いやー本当偶然てすごいなー、奇遇だなー、いやー本当に特茶サイコー!サントリー社員じゃなくても、送ってくれていいんですよ!特茶を送るのは全人類の自由意志です!あと明日以降でも大丈夫です、エブリディまってます!!

"^L" is 何?

割とどうでもいい話。python2.7 の 標準ライブラリのemail/message.pyの中で"^L"ていう制御コードを見つけた時の話。

f:id:tell-k:20140309224747p:plain

そもそも "^L"てなんだっけ。。。から始まり、調べてみたら改ページだった。

vimエディタの印刷で改ページ : サイト更新停滞ちうっ [ 名無しのVIM使い ]

それは良いとしてなんでこんな所に改ページの制御コード入ってるんだろうと思ってさらに調べたら、下記のような同じような疑問をもったヒトが書いたスレを見つけた。

Issue 7513: many source files contaminated with form feed (\f) characters - Python tracker

こんな事が書いてあった。

  • ivank 「Python 2.7の r76831 をチェックアウトしたら、大量のファイルに改ページが入ってるんやけど(震え声) ... 」
  • lemburg 「俺の覚えてる限り、Barryがそれ好きなんだよね。理由はよー知らんけど ;-) 」
  • barry 「それEmacsの次ページ、前ページへのナビゲーションコマンドなんだよね。 Pythonは空白扱いするけど、何か問題ある? :)」
  • amaury.forgeotdarc 「それPEP8でも許容されてっから。。。」

えw マジで? そんな事書いてありましたっけ?とPEP8を見に行く。

Python accepts the control-L (i.e. ^L) form feed character as whitespace; Many tools treat these characters as page separators, so you may use them to separate pages of related sections of your file. Note, some editors and web-based code viewers may not recognize control-L as a form feed and will show another glyph in its place.

via http://legacy.python.org/dev/peps/pep-0008/

Python は Control-L (^L: From Feed) 文字を空白文字として受け入れます。 多くのツールはこの文字をページ区切りに使うので、この文字をファイル内の セクションを分けるページに使うことができるかもしれません。 しかし、いくつかのエディターや Web ベースのコードビューアは Control-L を認識せず、その場所に別の文字を表示するかもしれません。

via https://dl.dropboxusercontent.com/u/555254/pep-0008.ja.html

ナルホディウス。

なんどかPEP8に目を通してるつもりだったけど、まったくもって頭に入ってないという事が良くわかったオジサンなのでした。

おわり。

Pythonのloggingで手出しできない所のhandlerを差し替える

元ネタ。コレをを見た時、確かにどうやったらいいんだろう? と思ってちょっと調べてみた。

やりたい事

  • ライブラリやらなんやらで書き出してるロギング部分を、自前で用意したロガーというかハンドラーに差し替えたい。

手出し出来ない例

例えば下記のような、hoge.py は手出しできないスクリプトだったとして、以下のようにログ取りになっていたとします。

# hoge.py 
# -*- coding: utf-8 -*-

from logging import warn

spam = u"スパム"
ham = u"ハムの人"

warn("%s %s", spam, ham)

handlerを差し替える

loggingモジュールの中を漁った結果、どうやら logging.root.handlersを弄れば、上記のような場合でも好きな LoggingHandlerに差し替えられるらしい。

1. root.handlers を強引に書き換える

# -*- coding: utf-8 -*-
import logging
import ltsvlogger

formatter = ltsvlogger.LTSVFormatter(fields={
    'asctime': 'time',
    'message': 'message',
})
ltsv_handler = logging.StreamHandler()
ltsv_handler.setFormatter(formatter)
logging.root.handlers = [ltsv_handler] # root.handlersを上書きする

# hogeが呼ばれる前にloggingの設定をする
import hoge # => message:スパム ハムの人 time:2014-02-10T23:41:54+09:00

行儀が悪い感じがとても怒られそうです。addHandlerというメソッドがあるのでそちらにしましょう。

2. addHandlerを使う

# -*- coding: utf-8 -*-
import logging
import ltsvlogger

formatter = ltsvlogger.LTSVFormatter(fields={
    'asctime': 'time',
    'message': 'message',
})
ltsv_handler = logging.StreamHandler()
ltsv_handler.setFormatter(formatter)
logging.root.addHandler(ltsv_handler) # addHandlerに変えた。

# hogeが呼ばれる前にloggingの設定をする
import hoge  # => message:スパム ハムの人 time:2014-02-10T23:41:54+09:00

というかそもそも、logging.getLogger()ていう風にやるとrootロガーだったのでそいつに対してaddHandlerすれば良かったという事実

3. rootロガーにaddHandlerを使う

# -*- coding: utf-8 -*-
import logging
import ltsvlogger

formatter = ltsvlogger.LTSVFormatter(fields={
    'asctime': 'time',
    'message': 'message',
})
ltsv_handler = logging.StreamHandler()
ltsv_handler.setFormatter(formatter)
root_logger = logging.getLogger()
root_logger.addHandler(ltsv_handler) # logging.getLogger() => rootロガー

# hogeが呼ばれる前にloggingの設定をする
import hoge  # => message:スパム ハムの人 time:2014-02-10T23:41:54+09:00

ここまで書いて気がつきましたが、fileConfigでrootロガーを書き換えたらいいのでは???

4. fileConfigを使う

  • logger.iniを用意
[loggers]
keys = root

[handlers]
keys = ltsvhdr

[formatters]
keys = ltsvfmt

[logger_root]
level = DEBUG
handlers = ltsvhdr

[handler_ltsvhdr]
class = StreamHandler
args = (sys.stderr,)
level = DEBUG
formatter = ltsvfmt

[formatter_ltsvfmt]
format = time:%(asctime)s\tmessage:%(message)s
datefmt = %Y-%m-%dT%H:%M:%S%z
class = ltsvlogger.LTSVFormatter

script側ではfileConfigするだけ。

# -*- coding: utf-8 -*-
import logging.config
logging.config.fileConfig('logger.ini')

# hogeが呼ばれる前にloggingの設定をする
import hoge  # => message:スパム ハムの人 time:2014-02-10T23:41:54+09:00

大体終わりです。

いろいろ怒られそうなので、書こうか迷うましたが、hogeを利用するスコープが限定的なら、mock.patchすればいいのでは!???とかいう愚行を一番最初に思いついた事を告白しておきます。石は投げないでください。

# -*- coding: utf-8 -*-
import mock
import logging
import ltsvlogger

formatter = ltsvlogger.LTSVFormatter(fields={
    'asctime': 'time',
    'message': 'message',
})
logger = logging.getLogger("nonrootlogger")
ltsv_handler = logging.StreamHandler()
ltsv_handler.setFormatter(formatter)
logger.addHandler(ltsv_handler)

with mock.patch("logging.warn", side_effect=logger.warn):
   import hoge # => message:スパム ハムの人 time:2014-02-10T23:41:54+09:00

ではではアデュー

Dockerをドカッと触ってみた(Macで)

Dockerが0.8でMac OSXのサポートをしたみたいな事をどっかでみたので、思考を停止してやってみた。触ってみただけなので全然ドカッと触れてない事に留意してください。言ってみたかっただけです。

あ。あけましておめでとうございます。

http://blog.docker.io/2014/02/docker-0-8-quality-new-builder-features-btrfs-storage-osx-support/

Dockerはそれまでは、Dockerを動かすためのVagrantfileを配布していて、VagrantVM起動、そのVM上でdockerを使ってくれよな!よろしくー!的な感じだった。

それがMac上から直接dockerコマンドを使えるようになったぜ!ヒャッハー!ていう話らしい。

0. 前提

1. boot2dockerとdocker client をセットアップ

マニュアルとほぼ同じような事をやる

$ cd /usr/local/bin

$ curl -o boot2docker https://raw.github.com/steeve/boot2docker/master/boot2docker
$ chmod +x boot2docker

$ curl -o docker http://get.docker.io/builds/Darwin/x86_64/docker-latest
$ chmod +x docker

$ export DOCKER_HOST=tcp://

$ boot2docker init
$ boot2docker up
# コマンド一覧の確認
$ boot2docker 
  • boot2dockerなんなの? - TinyCoreLinuxをベースにDockerを動かす設定をしたVMVirtualBoxに作ってくれる。それをコマンドラインで操作できるようにしてくれる。
  • Mac用のdockerて何さ? - 上記のVM経由でdockerコマンドを実行してくれるクライアント。Mac側で叩いたdockerコマンドをVMで実行してくるショートカットみたいなもん
  • 結局VM上でdockerを動かしてるのは、今までのVagrantFileを配布していた時と大して変わらない感じだった。

2. dockerコマンドを叩く

既にこの時点でdockerが利用可能になってる

 # versionの確認
 $ docker version
 Client version: 0.8.0
 Go version (client): go1.2
 Git commit (client): cc3a8c8
 Server version: 0.8.0
 Git commit (server): cc3a8c8
 Go version (server): go1.2

3. ssh出来るコンテナを作る

完全に目的なくセットアップしてたので何していいか分からなくなった

http://blog.ryotarai.info/blog/2013/07/25/docker-sshd-container/

とりあえずココを参考にsshできるコンテナを作成する。

下記のようなopenssh-serverをインスコしてsshdを立てて、rootてパスでログインできるようなイメージを作成する「Dockerfile」を置く

 FROM ubuntu:12.04
 MAINTAINER tell-k "ffk2005@gmail.com"

 RUN apt-get update
 RUN apt-get install -y openssh-server
 RUN mkdir /var/run/sshd
 RUN bash -c 'echo "root:root" | chpasswd'

 CMD /usr/sbin/sshd -D
 EXPOSE 22

ビルドする

 $ docker build ./
 Uploading context 1.842 GB
 Uploading context
 Step 0 : FROM ubuntu:12.04
  ---> 9cd978db300e
 Step 1 : MAINTAINER tell-k "ffk2005@gmail.com"
  ---> Using cache
  ---> f39bc83bc3a1
 Step 2 : RUN apt-get update
  ---> Using cache
  ---> 43349868d941
 Step 3 : RUN apt-get install -y openssh-server
  ---> Using cache
  ---> 71e6832c0d64
 Step 4 : RUN mkdir /var/run/sshd
  ---> Using cache
  ---> 14d8d5b361c1
 Step 5 : RUN bash -c 'echo "root:root" | chpasswd'
  ---> Using cache
  ---> d1ccd560aa9e
 Step 6 : CMD /usr/sbin/sshd -D
  ---> Using cache
  ---> fdf4c6068540
 Step 7 : EXPOSE 22
  ---> Running in 2b0a51afe8e3
  ---> 4aa9bed82ea4
 Successfully built 4aa9bed82ea4

ビルドしたイメージをtagとして保存する

 $ docker tag 4aa9bed82ea4 tellk/sshd

よーしパパ。コンテナつくっちゃうぞーハハハー。なんつってコンテナ作る

 $ docker run -d -p 22 tellk/sshd
 a1023b856c14286886e44485435cfda51d6f35a31c48a5fe76ccbac7aac9d3c3

コンテナIDから、SSHすべきportを調べる

 $ docker ps 
 CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS                   NAMES
 a1023b856c14        tellk/sshd:latest   /bin/sh -c /usr/sbin   50 seconds ago      Up 48 seconds       0.0.0.0:49154->22/tcp   evil_franklin       

 $ docker port a1023b856c14 22
 0.0.0.0:49154
 # 49154にSSHすればいいらしい

4. sshで繋いでみる

まずはMac -> boot2docker_vmsshする

 # とりあえず鍵作成
 $ ssh-keygen -t rsa
 
 # なんやかんや聞かれるのでnopassで鍵を作成して、
 # 下記のような感じで、鍵を置く。
 ~/.ssh/id_rsa_boot2docker_vm
 ~/.ssh/id_rsa_boot2docker_vm.pub

 # 公開鍵をboot2docker_vmにコピー
 $ ssh-copy-id -i ~/.ssh/id_rsa_boot2docker_vm.pub localhost -p 2022
 # パスが求められる「tcuser」がデフォのパス

 # ~/.ssh/configに以下を追加
 Host localhost
   User docker
   StrictHostKeyChecking no  
   UserKnownHostsFile /dev/null 
   IdentityFile /Users/tell_k/.ssh/id_rsa_boot2docker_vm
   HostName 127.0.0.1

 # sshをしてみる。パス無しでログインできる。
 $ ssh localhost -p 2022
 # boot2docker ssh でも パス無しでログイン可
 $ boot2docker ssh 

boot2docker_vmにログインしたらコンテナが起動してるIPを調べる

 docker@boot2docker:~$ ifconfig | grep -A4 docker0
 docker0   Link encap:Ethernet  HWaddr FE:17:B0:FF:B4:70  
             inet addr:172.17.42.1  Bcast:0.0.0.0  Mask:255.255.0.0
             inet6 addr: fe80::a055:fff:fe78:9134/64 Scope:Link
             UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

 # 172.17.42.1 として起動してるらしい

IPとポートが分かったんで、boot2docker_vm -> Dockerコンテナ(192.17.42.1:49154) にsshする

  docker@boot2docker:~ $ ssh root@172.17.42.1 -p 49154
  # passは「root」になってる
  root@172.17.42.1's password:

  Welcome to Ubuntu 12.04 LTS (GNU/Linux 3.12.1-tinycore64 x86_64)

   * Documentation:  https://help.ubuntu.com/
     Last login: Sun Feb  9 13:44:12 2014 from 172.17.42.1

  root@a1023b856c14:~#
  # 無事にログインできたぽい

こんどはSSHポートフォーディングで Mac -> (boot2docker_vm)-> Dockerコンテナ(192.17.42.1:49154) 的な感じでMacからDokcerコンテナに直ログインする。

 # Macに戻って ~/.ssh/configを以下の内容を追加
 Host container01
   ProxyCommand ssh localhost -p 2022 nc %h %p
   StrictHostKeyChecking no  
   User root
   Port 49154
   HostName 172.17.42.1

 # これで直接 Dockerコンテナにログインできる
 $ ssh container01 

 # ここでもパス入力省きたいから、boot2docker_vmと同じ公開鍵をコンテナに設置する。
 $ ssh-copy-id -i ~/.ssh/id_rsa_boot2docker_vm.pub container01

 # 上のssh-configに下記一行追加
   IdentityFile /Users/tell_k/.ssh/id_rsa_boot2docker_vm

 # これでnopassで鍵つかってsshできる
 $ ssh container01

 root@a1023b856c14:~#

とりあえず終わり

まとめ

  • boot2dockerとそれに対応したdockerによって,Macから透過的にVM上のdockerを操作出来る事が分かった。
  • コンテナの作成(docker run)は一瞬で終わるので、Vagrantよりはストレスフリーだった。
  • もうちょっとうまい事こなれてみたいと思った。
  • 複数コンテナを立ち上げて、chef-soloやら、ansibleやらでゴニョゴニョしてみたいと思った。