うなすけとあれこれ

2015年09月23日

ブログをblog.unasuke.conに移動しました

引っ越し

3回めの移動

はてなダイアリーから、tumblr、さくらのレンタルサーバー上のwordpressと渡り歩いてきた"うなすけとあれこれ"が、さらにもう一回引っ越しをしました。今回は、さくらのVPSとmiddlemanを組み合わせたものとなっています。

移動の理由

仕事でwebサービスを構築していくうちに、webサイトを構築する上で必要となる様々な知識が、以前と比べて格段に増えました。それに伴い、今までは用意された編集エリア、用意されたブログテーマには満足できなくなり、一から構築してみたい、という気持ちが大きくなってきました。

また、wordpressを使っていると、その管理が思ったよりも手間がかかるものであることがわかりました。定期的なアップデート、セキュリティ対策、壊れた時の対処などに振り回されるのには嫌気が差しました。

http://t.co/rE9z6Wrxzu 見れない

— うなすけ(偏差値6) (@yu_suke1994) 2015, 6月 3

http://t.co/rE9z6Wrxzu 復活しました

— うなすけ(偏差値6) (@yu_suke1994) 2015, 6月 3

http://t.co/rE9z6Wrxzu のメンテナンス時間は10分間でした。

— うなすけ(偏差値6) (@yu_suke1994) 2015, 6月 3

ということで、静的なhtmlを生成することによる懸念事項の減少、新しい技術の勉強なども兼ねて、middlemanでブログを構築することにしました。

移動の顛末

middlemanとh2oとVPSによるブログ構築

2015年09月23日
2015年08月24日

YAPC::Asia Tokyo 2015に参加した

夜の東京ビッグサイト

前夜祭

PHP帝国の逆襲!(を願うPHPerが話す最近のPHPについてのクイックツアー PHP7対応版)

PHPはこわくないよ PHPerが話す最近のPHPについてのクイックツアー #yapcasia #yapcasiaE - Togetterまとめ

途中で来て、最後の方だけ聞いていました。 PHP7が速いとか、最近のモダンなサービス(Slack)でもPHPを使っているところはまだあるとか、負債のない言語はないとか、グワッとつくり上げるにはやはりPHPでは?みたいな話でした。 自分はPHPは書いたことがなくて、使ってると言ってもWordpressぐらいなものですし(近々捨てる)、あまり興味が無いです。 けどこういうアツい人がいる言語、とても幸せものだなと思います。こういうでかいカンファレンスでD言語のアツい人とか見たこと無いもの……(需要を優先という面で見れば仕方ないのかもしれないけれども)

はてなブックマークのトピックページの裏側

はてなブックマークのトピックページの裏側 in YAPC::Asia Tokyo 2015

はてブのトピックページはこう作られている! 中の人による実装解説 #yapcasia #yapcasiaE - Togetterまとめ

とんでもなく学術!って感じでした。形態素解析とか……うわぁ……わからないぞ はてブ10週年とのことですが、使ってないです。

技術ブログを書くことについて語るときに僕の語ること

ホッテントリ入りの極意から哲学まで! はてなエンジニアが語る技術ブログを書くことについて #yapcasia #yapcasiaE - Togetterまとめ

まとめると、

だいたいこんな感じなように思いました。

僕(ら)はやはり多くの人に読んでもらいたい文章を書くし、その指標のひとつとしてはてブ数を見ます。なので、はてブ数はあればあるほどうれしいものです。そのためにはタイトルとか工夫しないと読んでもらいづらいから、勉強になりました。

ssig33.com - Docker についてアメリカの大学で工学博士から英語で話を聞いてきました 一方で、

「先頭しか読まない」って分かってるならちゃんと人々がエントリ読んでいくような仕組み作るのがはてなのお前らの仕事なんじゃないのかと思って、それについても質問しようと思ったのだけどもう無駄だなと思って聞かなかった。

これも至極まっとうな意見だと思っています。タイトルによらず、いい記事はいい記事で、そういう小手先の細工でリーチしにくいとかしやすいとか本質ではないのでは?と思います。

「ブログは俺の場所」というのはすごく納得できるのです。じゃなきゃなんで僕ははてなダイアリーを捨てtumblrを捨て、わざわざ面倒でお金のかかるWordpress in レン鯖を選んだのだという感じです。俺の場所は俺が作る。

1日目

メリークリスマス!

Perlの父 Larry Wall が描く『指輪物語』 そしてメリークリスマス! #yapcasia #yapcasiaA - Togetterまとめ

ちょっと遅れて入ったら同時通訳の機械がなくてウオーとなってました。 とりあえずLoRの映画とか小説読みたくなりました。

I FAIL GOOD

しましょう。

Effective ES6

Effective ES6

これからのJavaScriptを知ろう! Effective ES6 #yapcasia #yapcasiaC - Togetterまとめ

はじめから柔軟性のある言語として設計されたのが功を奏したのかここまで広まったけど、反面罠や謎が多くなってしまったのでしょうか。開眼する必要まで出てきたJavaScript。 ES5から6年経ち、ES6では何が新しくなったのでしょう。

ではAltJSの立場はどうなるんでしょう?多分syntaxの好みぐらいになって、わざわざcoffeeを選ぶ理由もなくなっていくかもしれないですね。かといって最新のブラウザでES6はまだサポートされていません。だからbabel。

TypeScriptの立ち位置はまだでかいかも……でもどうせbabeるのならAltJS使おうがES6だろうが関係ないのかも?と思いました。この辺どうなんでしょう。

HTTP/2 & クラウド時代のウェブアプリケーション実行基盤

HTTP/2時代のウェブサイト設計

H2Oは先を行く!HTTP/2時代にむけたウェブサイト設計のポイント #yapcasia #yapcasiaD #http2 - Togetterまとめ

HTTP/2最高ですね。描画までが速いし、配信も速いし、とにかく速い。 はやくぼくのかんがえたさいきょうのブログをh2oでやりたいです。個人ブログのくせして暗号化とかめっちゃ頑張りたいです。無駄に差先端を走っていたいです。 Let’s Encryptのスケジュール、遅れているような??

【sponsored contents】若手エンジニア達の生存戦略

若さは特権!?~若手エンジニアの生き方~#yapcasia #yapcasiaD - Togetterまとめ

papixさんは若手なのか…… 言語は違えどだいたい感じてることは同じで、お金がほしいし貢献していきたいしいろいろなことに手を出していきたいし。

Electron: Building desktop apps with web technologies

WEB技術を使ってデスクトップ開発!Electronとは!? #yapcasia #yapcasiaA - Togetterまとめ

こんな大規模化カンファレンスで40MBのgit clone薦めてくるし正気かよ、と思いました。案の定回線は不安定になったようです。 Nuclide こんなのあったのか。 electronで何ができるのか、ということに始終徹した発表だったように思う。 クロスプラットフォームなデスクトップアプリも簡単に作れる時代になって、とてもいい。

esa.io - 趣味から育てたWebサービスで生きていく

esa.io - 趣味から育てたWebサービスで生きていく // Speaker Deck

趣味からサービスへ!esa.ioの中の人に学ぶプロダクト開発 #yapcasia #yapcasiaA - Togetterまとめ

とにかく開発の仕方の違いを思い知らされました。Heroku使っているのもあって、出先でスマホだけで変更のcommitからdeployまで出来るのは超カッコイイし、価値の提供がとにかく速いと感じました。 自分プロダクツも、たぶんURLを持つと意気込みや愛着が違うのでしょう。Herokuで自動生成されるstill-hoge-7828.herokuapp.comなんてURLのプロダクトに愛着が湧くでしょうか。

2日目

3分でサービスのOSを入れ替える技術

突然のCM放映に対応せよ!3分でOSを入れ替える技術 #yapcasia #yapcasiaE - Togetterまとめ

インフラをコードで表現していく、とにかく自動化できるように。 このノウハウ(Blue-Green deploymentなどなど)が必要になるくらいtmixも周知されたいものだなぁ。ばんばかスケールアウトしたいです。

ソーシャルゲームにおける AWS 移行事例

209分かかった処理を90分に!?実例に見る、RDS移行 #yapcasia #yapcasiaE - Togetterまとめ

Single-AZにした後からMulti-AZにするまでの変更も複数のAZに保管されるならまあ、一時的にはいいんじゃないでしょうか? しかし稼働中のものを入れ替えるのは考えることが多くて大変(sessionの保存とか)だと思いました。

カンファレンスネットワークの作り方

YAPCの2000人をインターネットに繋げる!! CONBUが語るネットワーク構築舞台裏 #yapcasia #yapcasiaB - Togetterまとめ

カンファでのネットワーク、非常にありがたいもので、どのように構築しているのか気になったので見に行きました。 意外や意外、機材はconbu側が持っているとのことです。それで2000人規模のカンファに対応できるのすごいな…… コアネットワークのライブラリ化、クラウド時代の勝利という感じがします。

感想

前夜祭と2日目には銅鑼Tシャツを着て行きました。esaの方々、鶉さん、naoyaさん、その他いろいろな方に銅鑼を叩いていただけたので嬉しかったです。すみませんでした。 サイン入り銅鑼Tシャツ

Perlと銘打っておきながら何もかもを受け入れるYAPCはすごいです。いろいろな方と交流出来ました。懇親会ではしらなかった分野の話、これからどうしていくべきななどの話、アレは本当にダメみたいな話をして、楽しかったです。なぜ僕は懇親会に銅鑼Tシャツを着て行かなかったのでしょう。本当に悔やまれます。

ちはみに、1日目と2日目の間に出来事がありました。LTぐらいはできそうな感じなので、どこかで話します。

さて、Beaconはどうなるのでしょう。

2015年08月24日
2015年08月19日

C88に行ってきた話

コミケ初体験

ビッグサイト

コミケの存在は知っていたけど、毎夏毎冬にまとめを読んだり大量のツイート群を読んだりで満足していました。

そこに、友人のふーゆた君がサークル参加するということなので、僕も売り子をするかわりにサークルチケットで入場させてもらうことになりました。

またそれとは別に、情報共有おじさんの発案によりコミケでtmixのチラシを配る事にもなりました。

よって、コミケ初体験で、サークル側、設営側、一般側の3つの体験をすることになりました。設営というのも違う気がするけれど。

-1日目 チラシ配布

配布許可証 とにかく疲れたのであまり思い出したくない。

ビッグサイト、人がいない状態でも汗がダラダラ止まらないので当日ヤバい

— うなすけ(new daybreak) (@yu_suke1994) 2015, 8月 13

1日目 売り子

売り子やってます https://t.co/vUPf0D57F8

— うなすけ(new daybreak) (@yu_suke1994) 2015, 8月 14

はーい pic.twitter.com/jb6VQZ27VB

— うなすけ(new daybreak) (@yu_suke1994) 2015, 8月 14

目の前でドンドン新刊が消えていくのは見ててとても気持ちのいいものです。

この後にチラシ配りもありましたが、とにかく疲れたのであまり思い出したくない。

2日目 チラシ配布

2日目には参加せず、チラシを配るだけでした。とにかく疲れたのであまり思い出したくない。

3日目 一般参加

この日は音楽系のサークルがたくさんあるので、始発参加することにしました。

後ろの奴らの延々と続くアニメ批判聞いててゲンナリしてきた

— うなすけ(new daybreak) (@yu_suke1994) 2015, 8月 15

後ろの奴らの話、とにかく聞いてゲンナリする内容しかない

— うなすけ(new daybreak) (@yu_suke1994) 2015, 8月 15

もう「ぼくのかんがえたいちばんおもしろいアニメ」でも作ってろよ……

— うなすけ(new daybreak) (@yu_suke1994) 2015, 8月 16

待機列はこんな感じでした。とにかく汗がどんどん出てきて体力がガンガン減っていきます。東から並んで、入場即西の壁サークルに向かいましたが、まったく並ばずに買えて(かめりあさんにCD渡してもらって、「がんばってください!」って言えて感激)最高の体験をしました。

昼ごろ、ぶらぶらしてたら突然「かにTの人ですよね!それ欲しいんですけど、どこで買えますか?!」みたいなことを聞かれました。ちなみにこんなTシャツです。

今日は かに pic.twitter.com/CcqxFTEAAL

— うなすけ(new daybreak) (@yu_suke1994) 2015, 8月 15

戦利品

戦利品 CDが多いですね。まだ全然聴けてません。

感想

また行きたいです。

ふーゆた、はたっく、本当にありがとうございます。

2015年08月19日
2015年07月20日

情報共有おじさんとサバゲーにいったら

武器とか

あらすじ

入社後すぐにサバゲ部に入部し、何もかもをレンタル&貸してもらって屋内フィールドでサバゲデビューをしたうなすけ。適度に物欲を刺激された直後、追い打ちを掛けるように予定される屋外サバゲ。その日程は、給料日の数日後であった。そして給料日当日、情報共有おじさんと共にサバゲショップに向かったうなすけの運命やいかに……

武器を買いました

散財だよ〜〜٩(ˊᗜˋ*)و pic.twitter.com/6z9eHMcuTm

— うなすけ(借金予定有) (@yu_suke1994) 2015, 7月 15

買ったのは、東京マルイ MP7A1(フルセット)と、東京マルイ コルト M1911A1ガバメント(エアーコッキングガン)、あとBB弾とか手袋とかです。

給料日ということでテンション上がりつつも、使い過ぎはヤバいと自分に言い聞かせた結果、出費は6万円強に収まりました。よかったですね。

サバゲ当日

いつの間にか参加人数が膨れ上がって(計5人)、レンタカーを借りることになったりしました。情報共有おじさんのお陰で、集合場所、遅刻勢のピックアップ、会場までの道のり案内がスムーズにfacebook messenger上で執り行われました。

実際の会場がこちらです。サバイバルゲームフィールド HEADSHOT(ヘッドショット)

写真など

会場パノラマ 会場パノラマその2 蜂の巣

蜂の巣とか蜘蛛の巣があって虫苦手な人は絶対無理だなって思いました。

tweetたち

うなすけ「なにいってんですか!みなごろしですよ!!」

— ゆーけー/赤松 祐希 (@ukstudio) 2015, 7月 19

ものを壊す若者とサバゲーにきたら、リードエンジニアの銃が壊れた

— ゆーけー/赤松 祐希 (@ukstudio) 2015, 7月 19

物を壊す伝説をつくってる新卒の隣に座ったばかりに僕のエアガンが壊れた… pic.twitter.com/peJCdEjxs0

— あそなす (@asonas) 2015, 7月 19

新卒の隣に座るのをやめたらめっちゃ調子良くなってきた…

— あそなす (@asonas) 2015, 7月 19

朝の7時に集まって乗り合いで会場に向かって、一日中スポーツして、夕方には温泉に入って汗を流すの、昔の人たちはゴルフというスポーツでこれをしていたらしいが、現代人はサバゲでこれをします。

— Atom(アトム) (@FromAtom) 2015, 7月 19

新卒、俺が後部座席で寝てたらいきなりゆびならしながら「You!You!」とか言って指差してくるし、「water」とか言ってくるしほんと治安わるい

— ゆーけー/赤松 祐希 (@ukstudio) 2015, 7月 19

うなすけくんに3000円貸してるから財布に金が少ない

— ゆーけー/赤松 祐希 (@ukstudio) 2015, 7月 20

感想

今回のイベントは、カウント戦(撃たれたら自陣に戻ってカウンターを押して復活)とかフラッグ戦(撃たれたら退場、敵陣のフラッグを取ったら勝ち)を何回もやっていく感じでした。初心者の僕はあまり立ち回りとかもわかってないので、撃たれたけど、どこからかがわからないということも多く、復活できるカウント戦のほうが好きです。(適度に退場しないと暑さでやられてしまうので、やり過ぎないよう注意)

それでも回数を重ねていくうち、1対1の打ち合いになったり、自分が見つかるより先に相手を見つけることもできるようになりました。

フィールド内ではマスクをつけるので、顔がだいぶ隠れます。そのおかげか?知らない人に話しかけられる(話しかける)ことのハードルがずいぶん下がる気がします。なんかフィールド内では男性より女性と多く話してました。何なんでしょうね。

あと、迷彩 + 武器 + 眼鏡 + ポニテとか最強だなって思いました。

夏場の屋外はとても暑く、熱中症対策もしっかりしていく必用があることを思い知らされました。水分はたくさんとってるはずなのに頭が痛くなったりするので、逸る気持ちを抑えて休憩をこまめに取っていきました。

テンションが上って、サバゲ終わったあと温泉行こうとなったのは結果的にすごく良かったと思います。帰ってベッドにダイブ出来ましたから。

まとめ

サドンを糞ゲー糞ゲー言いながらやってる人、一度サバゲしたらいいと思う

— うなすけ(借金予定有) (@yu_suke1994) 2015, 7月 19
2015年07月20日
2015年07月12日

vimべんきょうにっき その2

vim logo

dotfilesの整理から

ukstudio先輩のdotfile(ukstudio/dotfiles)見てたら、stowを使ってdotfileへのsymlinkを貼っていてマジヤベエって気持ちになって、とりあえずstowを使えるようにしました。(Using stow instead of shell script:c97f1f8)

lightlineの設定を見直す

atomに代わってvimをメインのエディタにしていく決意をしたので、本格的に環境を整えていくことにします。これが今までのstatuslineです。 以前のstatusline

とりあえず作者さんの、作者が教える! lightline.vimの導入・設定方法! 〜 初級編 - インストールしよう - プログラムモグモグを参考にして、サクッとvimrcをコピペした結果がこちらになります。(Update lightline setting:c2461db) statusline変更後

こちらからは以上です。

あの……fugitive使って現在のbranchを表示させるのってどうやって……

2015年07月12日
2015年07月11日

6月辺りに買った漫画

本棚がない

漫画を買う量が一気に増えた

職場の先輩(HolyGrail先輩)がこんなエントリ(今買うべきおすすめのラブコメ漫画(追記あり))を書いたり、職場におすすめの漫画(1巻目だけ)を持ってきたりすすので、どうにも欲しい漫画が増えていきます。

オフィスで試し読み業が始まりました。1巻のみになるのでよさを感じたらみなさん買っていきましょう。

Kuniaki Horiさん(@holygrail)が投稿した写真 -

それに加え、社会人となったことで、学生時代に比べ自由にできるお金も増えたので、自制しないと際限なく漫画を買ってしまいそうになります。そんな僕が6月あたりに買った漫画を列挙します。

買った漫画

※画像は大抵amazonへのリンクです

恋と嘘

試し読み マンガボックス (MangaBox) / 人気マンガ家の新作連載が無料で読める!

政府通知届かないしなにをやっても駄目。禁じられた恋的な感じでもないけど、いけないことって感じがする。3人の関係がこれからどうなっていくのか……いや4人か?とりあえず買って読んでください。

不器用な匠ちゃん

試し読み 不器用な匠ちゃん - pixivコミックで漫画を無料試し読み

いいですね、趣味の話になるととたんに饒舌になる感じ。僕らそのものじゃないですか。それでいて、こう「私なんかが」みたいな意識が見える気がして、なんかすごく感情移入しやすい。とりあえず買って読んでください。

制服あばんちゅーる

試し読み 制服あばんちゅーる / さぬいゆう、伊丹澄一 / まんがライフWIN

は〜なんだこのハッキリ表には出さないけどお互いがお互いを好き合ってる感じ!!学生って感じがして読んでて「は~」ってなりました。とりあえず買って読んでください。

お前ら全員めんどくさい!

試し読み お前ら全員めんどくさい! | 日本最大級の無料Webコミック[COMICメテオ]

確かに登場人物全員めんどくさいし、読者から見れば國立先生も十分めんどくさい。めんどくさかわいい。webで試し読みもできますし、とりあえず買って読んでください。

つるつるとザラザラの間

試し読み つるつるとザラザラの間/月子 - モーニング・アフタヌーン・イブニング合同Webコミックサイト モアイ

虻川さん、本当に白瀬くんのこと好きなんだな……というのが1巻の終盤から2巻にかけての話とかでわかります。HolyGrail先輩も言ってますが、ヒロインの虻川さやちゃんがかわいいのでとりあえず買って読んでください。

第13保健室

試し読み 「第13保健室 1」 | ゲッサン少年サンデーコミックス | 小学館

マンモス校すぎて、保健室が12もある学校の話。個性的すぎる保健室の先生がまだ全員登場していないあたり恐ろしい。2巻が出てるようですが、まだ買ってないです。何かと2人の先生が絡み合うのでとりあえず買って読んでください。

ダンジョン飯

独特の世界観というか、説得力というか、食べてみたくなるというか。「ヤダーーーーッ!!」ってなる気持ちもわかりますが、ちょっと好奇心のほうが勝っちゃいそう。とりあえず買って読んでください。

くまみこ

試し読み くまみこ - 無料コミック ComicWalker

これは前々から欲しかったけど、amazonで品薄で、店頭で見つけてアッアッとなって一気に買いました。4巻以降、一体どうなるんだ…… まちがかわいいのでとりあえず買って読んでください。

とりきっさ

試し読み とりきっさ!|月刊COMICリュウ

これは友人のふゆたくんにおすすめされて買った漫画。ラブコメばっか読んでるせいか、「ここからどういう恋に発展するんだ?」と考えてしまいますがほのぼの系漫画だと思うのでずっとこのまま……なのかな?数日後に2巻が出るので、とりあえず買って読んでください。

あせびと空世界の冒険者

試し読み あせびと空世界の冒険者|月刊COMICリュウ

これは上の本を見てた時に同じ出版社のページで紹介されてて気になって買ってしまった漫画。異世界ファンタジー系で、絵が綺麗です。あと、あせびさんが変形してカッコイイです。とりあえず買って読んでください。

まとめ

これ以外にも「とんかつDJアゲ太郎」とか「ジョジョ」とか買わないといけないので財布がマッハ。とりあえず買って読んでください。この記事書くためにamazonアソシエイトに参加しました。

2015年07月11日
2015年07月10日

atom plugin "do-not-use-atom"を作った

do-not-use-atom

結局vimを使おうという目標

結局、hackableなeditorとは言ってもかゆいところに手が届かない、という事態がありました。具体的には、「拡張子のない、とあるファイルをrubyとみなしてsyntax highlightしてほしい」という願いです。vimであれば、filetypedetectなどで設定できますが、atomだと……その手のプラグインを入れてみましたが、バグかなにかで期待通りの動作をしてくれませんでした。

vim(emacs)での設定法は後ろの席の人に聞けばすぐわかるのですが、atomだとどこを設定すればいいのかわからず、stackoverflowを見てもなにやらよくわからないディレクトリに潜って設定しなければいけないような解説がいくつも出てきて、結局わかりません。

やはり……vimか……

atomを起動すると警告が出るatom package

そこで、「atomを起動すると警告が出るatom package」を作りました。と言いたいのですが、まだそこまではできていません。プラグインを起動するとアラートが出て、atomが閉じるプラグインを作りました。

do-not-use-atom

do-not-use-atom page

こんな感じで動作します。

do-not-use-atom 動作

ctrl + alt + o でアラートが出ます。閉じているのはatomのウィンドウのみで、プロセスは死んでいません。

まとめ

機能増やすためにはatom使わなくちゃいけないしなんのために作ったか全くわからないのにもうstarが付いている。

2015年07月10日
2015年06月15日

esaの日報から勤務時間を計算するRubyスクリプトをつくった

esaとは

弊社では、業務日報はesa(https://esa.io)で管理しています。

さてそのesaですが、先日APIがpublic β公開されました(release_note/2015/05/27/esa API v1をβ公開しました)。同時にAPI docsとRuby Gem(esaio/esa-ruby)も公開されました。

ということで、勤務時間を計算するRubyスクリプトを作れそうだったので、作ることにしました。

スクリプト作成までの道のり

access token取得

まず、今回は読めればいいだけなのでread onlyでaccess tokenを取得します。右上にある自分のアイコンを押して飛ぶ画面でaccess tokenを発行します。 access token

とりあえずサンプルコードを実行

access tokenが取得できたら、githubのREADMEに記載されているusageに記載されているコードを試してみます。

require 'esa'

client = Esa::Client.new(access_token: "xxxxxxxxxxxxxxxxxxxxxxxx", current_team: "xxxxxx")
puts client.posts

このコマンドで、esaに投稿されている記事がガッと取得出来ました。多すぎますね。

検索クエリで絞り込む

欲しい記事のカテゴリ、投稿者はわかっている(日報なので)ので、検索クエリを用いて特定の記事を取得します。usageを読むと、postsに引数としてクエリを渡してやると良さそうです。

require 'esa'

client = Esa::Client.new(access_token: "xxxxxxxxxxxxxxxxxxxxxxxx", current_team: "xxxxxx")
puts client.posts(q: "user:unasuke category:日報/2016/06")

これで、投稿者が"unasuke"で、カテゴリが"日報/2015/06"の記事(今月の日報)が取得できます。15分毎にAPIリミットがリセットされるとはいえ、あんまり何回もGETするのもアレなので応答を何かに格納しておきましょう。

require 'esa'

client = Esa::Client.new(access_token: "xxxxxxxxxxxxxxxxxxxxxxxx", current_team: "xxxxxx")
response = client.posts(q: "user:unasuke category:日報/2015/06")

記事の本文を取得する

取得ができたので、本文の解析に移ります。まず本文はどこに入っているかというと、こうなっています。

{"posts"=>
    [{"number"=>3949,
      "name"=>"unasuke",
      "full_name"=>"日報/2015/06/15/unasuke",
      "wip"=>true,
      "body_md"=>"markdown文字列",
      "body_html"=>"html文字列",
      "created_at"=>"2015-06-15T20:05:50+09:00",
      "message"=>"Update post.",
      "url"=>"https://hoge.esa.io/posts/3949",
      "updated_at"=>"2015-06-15T20:34:16+09:00",
      "tags"=>[],
      "category"=>"日報/2015/06/15",
      "revision_number"=>2,
      "created_by"=>
...

解析するのに便利なのはmarkdownなので、markdownでの記事内容を取得します。このようにします。

require 'esa'

client = Esa::Client.new(access_token: "xxxxxxxxxxxxxxxxxxxxxxxx", current_team: "xxxxxx")
response = client.posts(q: "user:unasuke category:日報/2015/06")

for i in 1...response.body["posts"].size do
  puts response.body["posts"][i]["body_md"]
end

日報の中から時間が書いてある部分を抜き出す

日報の中から合計勤務時間が書いてある部分を抜き出します。僕は日報の勤務時間を

# 勤務時間

| 場所 | 時間 | 小計 |
| --- | --- | --- |
| オフィス | 10:50 - 13:00 | 2:10 |
| オフィス | 14:00 - 20:30 | 6:30 |
| 合計 |  | 8:40 |

このように書いているので、「合計」が含まれる行を持ってくれば良さそうです。また、その中でも、コロンで区切られている数字のみを持ってくればいいので、以下の様に正規表現オブジェクトを作成して抜き出しました。

require 'esa'

client = Esa::Client.new(access_token: "xxxxxxxxxxxxxxxxxxxxxxxx", current_team: "xxxxxx")
response = client.posts(q: "user:unasuke category:日報/2015/06")

for i in 1...response.body["posts"].size do
  puts response.body["posts"][i]["body_md"].scan(/^.*合計.*$/)[0].scan(/\d+:\d+/)
end

これで、以下の様な配列が得られました。

["8:00", "9:10", "8:00", "10:00", "7:30", "7:50", "7:30", "7:30", "8:30", "8:00"]

時間の計算をする

あとは簡単で、時間の計算をしてやれば合計勤務時間が求まります。最終的なコードはこのようになりました。

まとめ

esaがどんどん便利になっていきます。(scriptの名前はアイドルマスターシンデレラガールズの三好紗南から取りました)

2015-06-21 追記

sana.rbの動作を修正しました。

2015年06月15日
2015年06月14日

vimべんきょうにっき その1

vim logo

きっかけ

あこがれの先輩とペアでvimの練習とかしてた

— うなすけ(偏差値5) (@yu_suke1994) 2015, 6月 12

べんきょう

Vim plugin

新しくNERDTree(scrooloose/nerdtree)と、vim-slim(slim-template/vim-slim)と、vimshell.vim(Shougo/vimshell.vim)をインストールした。

NERDTreeの設定も先輩のからもってきて、space+eで開閉できるようにした。

nmap <silent> <Space>e :NERDTreeToggle<CR>

autocmd vimenter * if !argc() | NERDTree | endif
autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTreeType") && b:NERDTreeType == "primary") | q | endif

let g:NERDTreeShowHidden=1

また、インストールしたきり設定が書いてないneocompleteの設定も行った。

他にも、ウィンドウ分割の方法など教えて頂いた。

まとめ

ペアvim前 .vimrc

"neobundle.vimの設定
if has('vim_starting')
    set runtimepath+=~/.vim/bundle/neobundle.vim/
endif

call neobundle#begin(expand('~/.vim/bundle/'))

NeoBundleFetch 'Shougo/neobundle.vim'

"install plugins
NeoBundle 'Shougo/vimproc.vim', {
    \ 'build' : {
    \   'windows' : 'make -f make_mingw32.mak',
    \   'cygwin' : 'make -f make_cygwin.mak',
    \   'mac' : 'make -f make_mac.mak',
    \   'unix' : 'make -f make_unix.mak',
    \   },
    \}

NeoBundle 'Shougo/unite.vim'
NeoBundle 'thinca/vim-quickrun'
NeoBundle 'altercation/vim-colors-solarized'
NeoBundle 'Shougo/neocomplete.vim'
NeoBundle 'itchyny/lightline.vim'
NeoBundle 'vim-jp/vimdoc-ja'
NeoBundle 'vim-ruby/vim-ruby'
NeoBundle 'wakatime/vim-wakatime'

call neobundle#end()
NeoBundleCheck

"help language use Japanese
set helplang=ja,en

"vimを使ってくれてありがとう!!!!!!!!!!
set notitle

"Ricty
set guifont=Ricty\ 11

"use UTF-8
set encoding=UTF-8

"syntax
syntax on

"line number
set number

"indent setting
set autoindent
set smartindent
filetype plugin indent on

"no more swapfile
set noswapfile
set nobackup

"status line setting
set laststatus=2
let g:lightline = {
    \ 'colorscheme' : 'solarized' ,
    \}

"colorscheme setting
set t_Co=256
set background=dark
colorscheme solarized

"convert file encode
function SetUU()
    set ff=unix
    set fenc=utf8
endfunction
command -nargs=0 SetUU call SetUU()

"use backspace
set backspace=indent,eol,start

ペアvim後 .vimrc

"neobundle.vimの設定
if has('vim_starting')
    set runtimepath+=~/.vim/bundle/neobundle.vim/
endif

call neobundle#begin(expand('~/.vim/bundle/'))

NeoBundleFetch 'Shougo/neobundle.vim'

"install plugins
NeoBundle 'Shougo/vimproc.vim', {
    \ 'build' : {
    \   'windows' : 'make -f make_mingw32.mak',
    \   'cygwin' : 'make -f make_cygwin.mak',
    \   'mac' : 'make -f make_mac.mak',
    \   'unix' : 'make -f make_unix.mak',
    \   },
    \}

NeoBundle 'Shougo/unite.vim'
NeoBundle 'thinca/vim-quickrun'
NeoBundle 'altercation/vim-colors-solarized'
NeoBundle 'Shougo/neocomplete.vim'
NeoBundle 'itchyny/lightline.vim'
NeoBundle 'vim-jp/vimdoc-ja'
NeoBundle 'vim-ruby/vim-ruby'
NeoBundle 'wakatime/vim-wakatime'
NeoBundle 'slim-template/vim-slim'
NeoBundle 'scrooloose/nerdtree'
NeoBundle 'Shougo/vimshell.vim'

call neobundle#end()
NeoBundleCheck

"help language use Japanese
set helplang=ja,en

"vimを使ってくれてありがとう!!!!!!!!!!
set notitle

"Ricty(only gvim?)
set guifont=Ricty:h16

"use UTF-8
set encoding=UTF-8

"syntax
syntax on

"line number
set number

"indent setting
set autoindent
set smartindent
filetype plugin indent on
set expandtab
set shiftwidth=2
set softtabstop=2

"no more swapfile
set noswapfile
set nobackup

"status line setting
set laststatus=2
let g:lightline = {
    \ 'colorscheme' : 'solarized' ,
    \}

"colorscheme setting
set t_Co=256
set background=dark
colorscheme solarized

"convert file encode
function SetUU()
  set ff=unix
  set fenc=utf8
endfunction
command -nargs=0 SetUU call SetUU()

"use backspace
set backspace=indent,eol,start

"Neocomplete
source ~/.neocomplete.vim

"NerdTree
source ~/.nerdtree.vim

当該コミット github.com/unasuke/dotfiles pair vim lesson

2015年06月14日
2015年06月10日

複数アプリケーションから参照されるDBをridgepoleで管理する

ridgepole

忙しい人のためのまとめ

tmixの現状

最近の大規模なwebサービスが、1つのアプリケーションとして動いているというのは珍しいだろう。cookpad社がそうであるように、tmixも裏ではいくつかのRails Applicationが同時に動作している。 そしてそれらのRailsが見に行くデータベースはもちろん共通の1つである。

Railsは、そのアプリケーション内でschema.rbを用いてデータベースの定義を行っている。そしてRailsアプリケーションの数だけschema.rbが存在し、各アプリケーションの開発者が各々でschema.rbを好きに編集すると、conflictは避けられない。実際、tmixでもschema.rbを別リポジトリからコピーしてくるなんて作業はしょっちゅう行われていた。

この状況が好ましくないことは誰の目にも明らかであり、解決策としてのridgepoleの導入が必要だった。(参考 クックパッドにおける最近のActiveRecord運用事情)

ridgepoleの導入

現状の把握

ridgepoleを導入する前に、まずは現状を正しく把握する必要がある。

tmixは、メイン、画像生成、発注管理で3つのRails Applicationが動作している。それぞれはCircle CIによってGitHub Pushのタイミングでテストされ、production deploy時にはCircle CIからcapistranoを用いて本番環境にdeployされるようになっている。 環境は、development、staging、production、testの4つあり、それぞれにデータベースが存在する。

各リポジトリからschemaを適用させる(没案)

まず僕は、schemaを管理するためのリポジトリを作成し、それぞれのリポジトリがdeploy taskのなかでgit cloneを行い、ridgepole applyをさせれば良いと考えた。ridgepoleでは冪等性が保証されているので、schemafileの適用は何度走ってもよい。各アプリケーションがdeployされるたびに、データベースは更新される。

そのために、次のようなシェルスクリプトを作成し、circle.ymlで実行させるようにした。

cd ../
git clone git@github.com:spice-life/tmix-schema.git
cd tmix-schema
bundle install
bundle exec ridgepole -c ../tmix/config/database.yml --apply

当然のように、これはうまく動作しない。なぜなら、Circle CIでテストを行う環境は、その環境と結びついたリポジトリにしかアクセスできず、他のリポジトリをcloneする権限は持っていないからだ。(もちろんこの記事で出てくるリポジトリは大半がprivate)

そこで、いい方法はないものかとCircle CIのchatで聞いてみたところ、user keyを追加しろとの返答があった。しかし、それでは僕がアクセスできる全リポジトリへの権限が渡ってしまう。それに、サービスの運用が属人性の高いものになってしまう。これは良くない。 そのような返答をすると、今度はkey pairをCircle CIとGitHubに登録しろと言われた。これなら、権限が最小に抑えられて望ましい。 circle ciでのchatの様子

さて、SSH keyを登録するにしても、hostnameがgithub.comではいろいろと都合が悪い。そこで、hostanemeを"ridgepole"として登録し、git cloneするときには明示的にその鍵を使うようにした。具体的には以下のようにした。

cd ../
GIT_SSH=tmix-web/bin/git-ssh.sh git clone git@github.com:spice-life/tmix-schema.git
cd tmix-schema
bundle install
bundle exec ridgepole -c ../tmix/config/database.yml --apply
#!/bin/sh
exec ssh -oIdentityFile=~/.ssh/id_ridgepole "$@"

Circle CIで追加した鍵は、内部ではid_をhostnameの前に付与して保存されるのでこのようにしている。

このようにしたことで、git cloneができるようになり、めでたしめでたし……と思っていると、おかしなことが起こり始めた。cap deploy時に次のようなエラーメッセージが表示されるようになったのである。

ERROR: Repository not found. fatal: Could not read from remote repository.

Please make sure you have the correct access rights and the repository exists.

もちろん追加した鍵のhostnameはridgepoleなので使われるはずはないのだが、鍵を削除するとdeployができるようになったので、仕方なく鍵を削除した。どうすれば良かったのだろう……

結局、user keyを追加するしか無い。そこで、chat deployを行うbotのuser keyを追加した。これで、git cloneができるようになり、ridgepole applyもできるようになった。

だが、この方針では、本番サーバーそれぞれがschemaリポジトリを保持することになり無駄であること、データベースの変更を単体で行えないなど問題点も多い。

ridgepoleをcapistrano deployさせる

なので、schemaが存在するリポジトリをcap deployできるようにした。ただ、このためにサーバーを持つのも無駄なので、deploy先は既存アプリケーションのサーバーを間借りする形にした。

具体的には、以下の記述をdeploy.rbに追記した。

namespace :deploy do
  after :published, :ridgepole do
    on roles(:db) do
      execute "cd #{fetch(:release_path)}; bundle exec ridgepole -E #{fetch(:stage)} -c database.yml --apply"
    end
  end
end

これでbundle exec cap hoge deployするとその環境のデータベースにridgepole applyができるようになった。

テストについて

ridgepoleで読み込むschemafileについてsyatax errorがないか確認する簡単なテストを書いた。

require "spec_helper"

describe "Schemafile" do
  it "should correct syntax" do
    `bundle exec ridgepole -c database.yml -E test --apply --dry-run`
    expect($?).to eq(0)
  end
end

schemafileについてはこれくらいでいいとして、問題は各アプリケーションのテストである。テスト時に、schema.rbを読み込んであれこれする動作をする場合、やめさせなければならない。Rspecを使用している場合、spec/rails_hepler.rbの

ActiveRecord::Migration.maintain_test_schema!

この記述を削除する必要がある。

業務フローがどうなったか

ridgepoleの導入によって、業務の流れは次のようになった。

例えば共用の開発用データベースが存在する場合は、それに対しては手動でridgepole applyする必要がある。

2015年06月10日
新しい投稿
古い投稿