To the backbone
2020-09-06T05:04:11+00:00
https://blog.pinekta.tech
pinekta
h03a081b@gmail.com
エンジニアこそ「カスタマーサクセス」を意識しよう
2020-09-06T01:23:26+00:00
https://blog.pinekta.tech/book/2020/09/06/customer-success
<p>エンジニアは開発することが仕事だけれども、 開発するシステムは当然使う人がいる。<br />
使う人のことを考えずに設計・実装してしまうと、使う人はシステムの利用にストレスを感じて使うのをやめてしまうかもしれない。使う人、すなわちユーザーのことを考えずにシステムを作ると誰も幸せにならないものができあがる。<br />
作り手としてそれは避けたい。</p>
<p>ではユーザーにシステムを使い続けてもらうためにはどうしたらいいのだろうか。そのヒントになるかと思い『カスタマーサクセスとは何か』という本を読んでみた。</p>
<p><img src="/public/image/20200906/customer_success.jpg" alt="customer-success-book" /></p>
<p>本書によると、インターネットの発達した現代では前時代的な「モノの売り切りモデル」では成功できず、継続した利用が前提の「リテンションモデル」じゃないと成功できないようになったとのこと。<br />
「モノの売り切りモデル」だと商品・サービスを売ってしまったらあとはおしまい。売る前(成約)にいたる前のマーケティング・サポートに全力を注げ、というモデルである。<br />
「リテンションモデル」は成約後も継続的に利用してもらうことでLTVを最大化させるモデル。売った後も継続的に長く利用してもらう(リテンションしてもらう)ことにマーケティング・サポートに全力を注げ、というモデルである。<br />
サブスクリプションのSaaSがいい例だ。</p>
<p>インターネットの発達でカスタマーはモノについての情報を手に入れやすくなった。売ったもの、売るものについての評判を誰にでもすぐ知ることができる。<br />
売ってしまったらあとはおしまい、というモデルだとカスタマーはファンにならない。リテンションモデルでは、売ったあとカスタマーがサクセスするためにカスタマーに寄り添うモデルであるため、その質・体験がよければよいほどカスタマーはファンになる。ファンになることでLTVが最大化する。</p>
<p>ではカスタマーサクセスとは何か?<br />
本書ではそれは「サザエさんの三河屋のサブちゃん」と説明している。
サブちゃんは御用聞きで足りなくなったであろうものを補充しに、ついでに新しい商品とか便利そうなものを提案しにくる。押し売りはしない。磯野家の成功(成功と書くとニュアンスがちょっと違うけど)のために動いてくれる。(たまに磯野家が変なもの買っちゃって一騒動っていう話もあったりするけど…まぁカスタマーサクセスとしておこう。)<br />
要するに、カスタマーのことを考えてフォローをしっかりやろうということである。
デジタル時代だからこその「お得意さま」戦略である。</p>
<p>リテンションしてもらうために重要なことが2つあって、これは作り手であるエンジニアがやらなければいけないことである。それは</p>
<ul>
<li>エフォートレス</li>
<li>WOWな体験</li>
</ul>
<p>である。前者は簡単に言うとイライラさせない使用感を目指すこと。後者はすげぇと思わせること。
この2つが揃うとリテンションしやすくなるとのこと。<br />
そうするためには、エンジニアであろうがカスタマーのことをよく知る必要がある。データの力でカスタマーの一人一人を知り尽くすことが大事。<br />
そして、サクセスしないカスタマーに時間を費やさないことも必要で、プロダクトの目的とカスタマーの目的が一致しない場合はお互いが不幸になるため、ときには買ってもらわないという選択肢も必要。<br />
ここで無理に売り切ってしまうと、ファンにならずそれが口コミで悪影響になるかもしれない。<br />
LTVの最大化のためにはプロダクトの信念に沿わずカスタマーのサクセスを約束できそうになければ、そこに注力するなと本書にはあった。</p>
<p>エンジニアにとっては、WOWな体験の実装については花形の実装でもあるのでそこには気が回るが、エフォートレスについては気が回らないことが多い。<br />
作り手であるため使い方を知っているので、ユーザーの気持ちにとって考えられなかったりする。そのためユーザーが使用にストレスを感じたりしてしまうことがある。<br />
なのでどれだけユーザーの気持ちになって作れるか。ユーザーのことをもっと考えよう。</p>
<p>また、本書ではカスタマーサクセスは特定の部門・チームだけでなく全体がカスタマーサクセスを意識しないと成功しないとあった。そのため、組織文化にカスタマーサクセスを刷り込ませることが大事であり、組織自体を大胆にチェンジすることも必要であるとのこと。</p>
<p>一人一人がカスタマーサクセスを意識しないと、カスタマーに対するサポートがばらばらになってしまう。<br />
そのためには普段からカスタマーが喜ぶものは何かを意識しなければならない。作り手であるなら尚更。<br />
今ドキのエンジニアなら「カスタマーサクセス」を踏まえて開発できるようにならなければ!<br />
エンジニアこそ「カスタマーサクセス」を意識しよう。</p>
<p><a target="_blank" href="https://www.amazon.co.jp/gp/product/B07T64CMPT/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=B07T64CMPT&linkCode=as2&tag=pinekta02-22&linkId=f2375ae0c9c9d13471d0aa37dd46351d"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&MarketPlace=JP&ASIN=B07T64CMPT&ServiceVersion=20070822&ID=AsinImage&WS=1&Format=_SL250_&tag=pinekta02-22" /></a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=pinekta02-22&l=am2&o=9&a=B07T64CMPT" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /></p>
ティール組織は理想論?
2020-08-13T11:10:26+00:00
https://blog.pinekta.tech/book/2020/08/13/teal-organization
<p>前々から読もうと思っていたが読む機会がなくて積ん読状態になっていた『ティール組織――マネジメントの常識を覆す次世代型組織の出現』をようやく読んだ。<br />
読むまでティール組織について憧れみたいなものがあったが、現実を見れば見るほど理想論のように思えてくる。現在の自分の状況にうまく落とし込めるかどうか想像しながら読んだけど難しそうだ。</p>
<p><a target="_blank" href="https://www.amazon.co.jp/gp/product/B078YJV9ZW/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=B078YJV9ZW&linkCode=as2&tag=pinekta02-22&linkId=ba5133a019c1ffa08924e138b1f66131"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&MarketPlace=JP&ASIN=B078YJV9ZW&ServiceVersion=20070822&ID=AsinImage&WS=1&Format=_SL250_&tag=pinekta02-22" /></a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=pinekta02-22&l=am2&o=9&a=B078YJV9ZW" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /></p>
<p>本書の内容を平たくいうと、
歴史を見ると組織構造は進化していて、衝動型(レッド)組織(マフィアとか力・恐怖による支配)、順応型(アンバー)組織(教会や軍隊)、達成型(オレンジ)組織(多国籍企業)、多元型(グリーン)組織(多様性と文化を尊重)という組織構造だったが新たに進化型(ティール)組織というものが出てきており、この進化型組織というものは、</p>
<ul>
<li>セルフマネジメント</li>
<li>ホールネス(全体性)</li>
<li>存在目的</li>
</ul>
<p>という3つの要素で構成されている。<br />
組織の存在目的の沿って構成員は自主的に仕事を決定・遂行し(セルフマネジメント)、最大のパフォーマンスを発揮するために仕事用の仮面を被らずにありのままの自分で仕事をする(ホールネス)、ということがティール組織の特徴であるとされる。</p>
<p>なかなか面白い本だと思ったが読み手を選びそうだと思った。というのは、ティールのパラダイムに親しんでいないもしくはその素養がないと読むのが苦痛になりそう。<br />
達成型のパラダイムに染まっていてその中で戦っている人にとっては本書がティール組織に言っていることが「何うだうだ言ってるの。そんなの言う暇あったら結果出してよ。」と思うだろう。</p>
<p>達成型のパラダイムでの成功体験があり、その信奉者であれば、
交換可能な機械部品とみなす労働者たちを統制して利益の追求、競合との勝利することを重視しているから、
統制を放棄して組織の存在目的になぞらえて各チーム・各個人にセルフマネジメントさせるティールのパラダイムと相入れないだろう。
そんなんで成果出るんか?という結論にいたるはず。</p>
<p>組織の存在目的については達成型のパラダイムであっても批判はなさそうだし、ホールネスも許容はしそうだが、ホールネスを発現できるのは一部の人だけに限られる。<br />
結果が全てのため、結果がついてこない人は「恐れ」がついて回るため自分を曝け出せようもない。</p>
<p>じゃあ達成型の組織はいつまでもティールにはなれないのだろうか?<br />
本書によると「無駄な努力はやめたほうがいい」とのことである。
上層部にティールのパラダイムの理解がないと、管理者の統制を放棄する「セルフマネジメント」がまず許容できないからだ。</p>
<p>確かにそれは納得で、
「できるやつ」が「できないやつ」をうまく統率することで成果はあげられる。<br />
「できないやつ」にセルフマネジメントさせてしまうと、「できるやつ」の基準で物事を考えられないから成果は出なくなるわけで、「できるやつ」が絶えず基準を押し上げていかなければ成果は伸びていかない。</p>
<p>スキルレベルが高いチームであれば、集団的知性が働いて局所的にはうまくいくかもしれない。
が、強いリーダーシップが無ければその船は沈没してしまいそうだ。</p>
<hr />
<p>と、ここまで否定的に書いたものの、ティール組織について羨ましく思うこともある。<br />
明確な組織の存在目的に沿って、なにものかの仮面を被らずにプロダクトのためにプロダクトを作れたらどんなにいいことか。</p>
<p>何のためにプロダクトを作るのか、なぜそのプロダクトに関わっているのか、
これらの理由は人それぞれで、
給料高いとか、最新技術を使っているからとか、いろいろあるけれど、
自分の場合は、自分の力を社会に役立てられるものに使ってもらいたいという欲があるせいか、組織の存在目的になぞらえることと、ホールネスというものに強くあこがれる。</p>
<p>書きながら気づいたけど、自分は「セルフマネジメント」はそれほど重要視していないな。<br />
ホールネスがあるのと組織の存在目的が自分のやりたいこと・成し遂げたいことの方向性がマッチしてればいいのかもしれない。</p>
<p>ティール組織に入るにせよ、作るにせよ、既存のを組み換えるにせよ、
達成型のパラダイムの向こう側に行くには達成型のパラダイムで勝ち抜いてから。
そうじゃないと結局ティール組織になっても沈没するわけで。</p>
<p><a target="_blank" href="https://www.amazon.co.jp/gp/product/B078YJV9ZW/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=B078YJV9ZW&linkCode=as2&tag=pinekta02-22&linkId=ba5133a019c1ffa08924e138b1f66131"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&MarketPlace=JP&ASIN=B078YJV9ZW&ServiceVersion=20070822&ID=AsinImage&WS=1&Format=_SL250_&tag=pinekta02-22" /></a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=pinekta02-22&l=am2&o=9&a=B078YJV9ZW" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /></p>
Sketchをもっと使えるようにするために 『UIデザイナーのためのSketch入門&実践ガイド』を読んで
2018-05-04T03:10:26+00:00
https://blog.pinekta.tech/book/2018/05/04/sketch
<p>関わっている案件の一つでUIデザインも手伝うことになったり、新しく作ったライブラリのサイトのデザインをカッコよくしたいなと思ってたりで、UI周りは今までちょろっとSketchを使っていたけれどしっかり使えるようにするためにもSketchの本を読んでみた。</p>
<p><a target="_blank" href="https://www.amazon.co.jp/gp/product/4802510578/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4802510578&linkCode=as2&tag=pinekta02-22&linkId=306064bedecc3f95011f0d8d05ddd206"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&MarketPlace=JP&ASIN=4802510578&ServiceVersion=20070822&ID=AsinImage&WS=1&Format=_SL250_&tag=pinekta02-22" /></a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=pinekta02-22&l=am2&o=9&a=4802510578" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /></p>
<p>Sketchは英語メニューということもあり、それぞれのメニューはどういったものなのかを詳しくひとつずつ説明しており、英語という理由でSketchを敬遠してる人にとってはうれしいかもしれない。本書の半分くらいをメニューの説明にあてていると思うくらい手厚い。</p>
<p>しかし自分にとっては英語メニューで慣れてしまっているので流し読み。<br />
デザイナーなら他にもデザインツールを使ったことがあるはずなので、大体使い方はわかると思うからChapter1 - Chapter5は読み飛ばしてもよさげな気がする。</p>
<p>Chapter6でSketchの主要な機能・概念である「スタイル」と「シンボル」について詳しく説明しておりわかりやすかったと思う。<br />
まぁSketchを触ってる人なら言わなくてもわかる話かな…。</p>
<p>自分のSketchはプラグインを入れていないプレーンな環境だったので、Chapter7で便利なプラグインがいくつか紹介されていて非常に参考になった。またデザイン周りのツールについてもそれほど知っているわけではないので、へーなるほどな感じ。いろいろ使ってみようっと。</p>
<p>最後のChapter8では実際にSketchを使ってどうUIデザインしていくかを実例をあげて説明している。<br />
Sketch使えばだいたいこんな感じというのが伝わってくる。</p>
<p>多分本書のターゲットはSketchをまったく知らない&UIデザインやったことありません、という人なように感じる。<br />
デザインツールを使ったことがある人ならなんとなくでもSketchは使えると思う。とはいえ読むことでなんらかの気づきはあるとは思うけど。<br />
自分にとってはどちらかというとデザイン周りは畑違いなので本書は役に立ちそう。実践あるのみ。</p>
<p>一つ注意する点は、本書はSketch43を対象としており2018/05時点ではSketchのバージョンは49なので、内容が古い可能性があること。<br />
フロントエンド周りも進化が早いけど、デザイン周りのツール・エコシステムも進化が早くて大変そうだ…<br />
(InVision Studio無料で使えるし使って良さげだったのでそっちのほうに乗り換えようかなと実は思ってたり…)</p>
エンジニアとアドテクノロジー 『アドテクノロジーの教科書』を読んで
2018-04-30T19:10:26+00:00
https://blog.pinekta.tech/book/2018/04/30/marketing-textbook
<p>サービスをグロースするためにはどうしたらいいんだろう?<br />
ユーザビリティを検証して使いやすいように修正したりABテストをしてユーザビリティの向上をはかるとかSNSを利用して拡散させるとか、広告費をぶっこむとか、BtoBなら営業に物言わすとか、やり方はいろいろある。<br />
そしてそれらを組み合わせるのが一般的だと思う。</p>
<p>広告をどう利用するか、というところに興味があったので本屋に並んでいた本書をたまたま手にとって読んでみたところいい感じだったので即購入。</p>
<p>けれども買ってからまとまった時間が取れなかったりして読了まで半年以上かかってしまった…</p>
<p>とてもよい本だった。<br />
アドテクノロジーの歴史から説明しており、それぞれの年代(2000年代後半くらいから)でアドテクノロジーがどのような課題を抱えていてどのような手段で解決してきたかが記載されていて単純に読み物として面白かった。<br />
普段あまり広告を意識しなかったけれども広告の裏側を知って、ああなるほどだからこうなるのかー、とエンジニア視点で納得した。<br />
今後色々なWeb広告の形式が出てくることとか想像すると胸熱。</p>
<p>そういった裏側がみえてくるとWeb広告というものが今まで以上に面白くみえてきた気がする。広告のクリエイティブとか、枠とか、リターゲッティングとか。想像を巡らせると面白い。<br />
あと、巻末の用語集が地味に良い。勉強になる。用語集だけで10回以上は読んだかもしれない。</p>
<p>アドテクノロジーに関わるエンジニアは読むとためになるし、そうでなくともサービスを開発者はアドテクノロジーをどう使うかということも考えるべきなので読むとためになる。<br />
広告の運用とか開発者がやらなくてもいいよねーじゃなくて読んでみるのをオススメする。気づきがあるよ。</p>
<p>初版は2016年の終わり頃なので内容は2018/05現在はちょっと古くはなっているけれどそれでも面白い。<br />
この本自体がデジタルマーケティング情報サイト「<a href="https://dmlab.jp/">Degital Marketing Lab</a>」をまとめたものなので、最新情報は本サイトを参考にされたし。</p>
<p><a target="_blank" href="https://www.amazon.co.jp/gp/product/4798144606/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4798144606&linkCode=as2&tag=pinekta02-22&linkId=6af747d08adab5423a0ea0fae97fd991"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&MarketPlace=JP&ASIN=4798144606&ServiceVersion=20070822&ID=AsinImage&WS=1&Format=_SL250_&tag=pinekta02-22" /></a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=pinekta02-22&l=am2&o=9&a=4798144606" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /></p>
『RUNNING LEAN 実践リーンスタートアップ』を読んだ
2017-11-12T19:10:26+00:00
https://blog.pinekta.tech/book/2017/11/12/running-lean-book
<p>『RUNNING LEAN 実践リーンスタートアップ』を読んだ。<br />
リーンスタートアップというものを知ってはいたけれど、それを実践させる場合はどうするんだろう?と思って本書を読んだ。<br />
読んで思ったのは「なんでこの本をもっと早く読まなかったのか?」ということ。起業を考えているエンジニアは絶対読んだほうがいい。<br />
起業を考えていなくとも、スタートアップで働くエンジニアやマネージャでもあるエンジニアは読んだほうがいい。
自分の読んだ技術書ランキングで「リーダブルコード」と比肩しうるくらいの良い本。</p>
<p><img src="/public/image/20171113/running_lean.jpg" alt="running-lean" /></p>
<p>ランニングリーンとは「リソースを使い切る前にうまくいくプランに反復的に接近していくやり方」である。<br />
そのため、いかに無駄を省きながら最大の効果をあげるか、ということに価値を置いている。</p>
<p>そうするためにこうしたらよいという手法を本書では提示している。</p>
<ul>
<li>顧客が必要とするMVP(実用最小限の製品)を作るやり方</li>
<li>顧客への学習を高速化する手法</li>
<li>製品/市場フィットを達成させるためのやり方</li>
</ul>
<p>収益の源泉を発見するために絶えず実験を繰り返しその結果から方向修正し、
すばやくイテレーションを回す。そのために速度・学習・集中を重要視する。</p>
<p>これらを実現させるための以下の要素について深い説明がある。</p>
<ul>
<li>リーンキャンバス</li>
<li>顧客インタビュー</li>
</ul>
<p>リーンキャンバスとは「ビジネスモデルのブレインストーミング・優先順位の決定・継続的学習の管理に最適なフォーマット」であり、
1ページにおさまる表で表すことができる。<br />
こういうのがチームにあるととても便利そう。</p>
<p>本書では
プロダクトを作る前にプロダクトが解決したい課題が正しい課題なのか、ということについてよく調査すべき、と言及していて
「何を構築するか」ではなく「これは構築すべきか」ということを大事にしており、</p>
<blockquote>
<p>スタートアップは人生を消費する。解決に値する課題を選択すべし。</p>
</blockquote>
<blockquote>
<p>信念だけでスタートアップを経営するのは危険です</p>
</blockquote>
<p>と説明している。<br />
ブートストラップで低燃費に走りつつ成功するためにはときに信念は邪魔であり
課題を解決しながらお金も稼げなきゃダメとある。
起業のエネルギーの源泉としてはいいのだけれどそれだけじゃ成功しないのでこれは肝に銘じておこう。</p>
<p>本書の内容は以下のとおり</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>第1部
1章 メタ原則
2章 Running Leanの実例
第2部
3章 リーンキャンバスの作成
第3部
4章 ビジネスモデルの優先順位
5章 実験の準備
第4部
6章 顧客インタビューの準備
7章 課題インタビュー
8章 ソリューションインタビュー
9章 バージョン1.0をリリース
10章 計測の準備
11章 MVPインタビュー
12章 顧客ライフサイクルの検証
13章 昨日の押し売りはやめよう
14章 製品/市場フィットの計測
15章 結論
付録 低燃費スタートアップの作り方
</code></pre></div></div>
<p>本編もさることながら、付録の「低燃費スタートアップの作り方」も参考になる。<br />
とくに「毎日のフローを作る」というところはいいなと思った。<br />
というのは、著者のアッシュマウリヤは毎日の活動は</p>
<ul>
<li>予定しているクリエイターの活動</li>
<li>予定しているマネージャーの活動</li>
<li>予定していないクリエイターとマネージャーの活動</li>
</ul>
<p>と3つ分けているのだが、</p>
<ul>
<li>クリエイターの仕事をするときには中断されない時間を作る</li>
<li>クリエイターの目標はできるだけ早い時間に達成する</li>
<li>マネージャーの活動をできるだけ遅い時間に割り当てる</li>
<li>顧客サポートなどの予定していない活動の準備をしておく</li>
</ul>
<p>とそれぞれの活動において、いかにフロー状態を作り出すかということについて言及していて、
自分の場合だと、エンジニア・スクラムマスターの2つの帽子を被っていてなかなか集中できていないという現状があるので、
上記の考え方は参考になりそう。</p>
<p>Web系だと、エンジニア・デザイナーに集中させるという理解はあるんだけれど、そういうのよりコミュニケーション大事!というだとなかなか集中できないこともある。集中することもコミュニケーションすることもどちらも大事なんだけど、そこはなんとか折り合いはつけてもっと集中できるようにしていこう。</p>
<p>今は開発とその調整に専念しているけれど、落ち着いたら本書にあるとおり</p>
<blockquote>
<p>建物の外に出よ</p>
</blockquote>
<p>顧客開発していきたい。</p>
<p><a target="_blank" href="https://www.amazon.co.jp/gp/product/4873115914/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4873115914&linkCode=as2&tag=pinekta02-22&linkId=659a365d6ca3b7050ebfc0424a9b159c"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&MarketPlace=JP&ASIN=4873115914&ServiceVersion=20070822&ID=AsinImage&WS=1&Format=_SL250_&tag=pinekta02-22" /></a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=pinekta02-22&l=am2&o=9&a=4873115914" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /></p>
『SCRUM BOOTCAMP THE BOOK』を読んだ
2017-10-26T13:13:19+00:00
https://blog.pinekta.tech/book/2017/10/26/scrum-bootcamp-book
<p>『SCRUM BOOTCAMP THE BOOK』を読んだ。<br />
今までスクラムについて知っていたけれども、本格的にやったことがなかったので細かいところまでは知らなかった。</p>
<p>現在のプロジェクトで思ったより進捗が出ていない現実があって、パフォーマンスを最大化したいためにやり方を考えていたんだけれど、
スクラムだと開発者にスプリントでの成果物をコミットメントをさせられる(強制ではない)ので、
現状の進捗があがらないのを解決できるのではないか、と思ってチームに提言してみた。<br />
コードを書くだけでなくマネジメントも期待されているらしいのでやってみることに。
とはいえ、必然的にスクラムマスターも自分がやることになってふと気づくと、<strong>オレ仕事増えとるやないけ!</strong>という感じなのだがそこはグッとこらえる。<br />
プロダクトが成功するならそれでよしなのだから。</p>
<p><img src="/public/image/20171026/scrum-bootcamp.jpg" alt="scrum-bootcamp-book" /></p>
<p>読んだのだが非常に読みやすいしわかりやすい。サクサク読める。<br />
漫画もあるので飽きずに最後まで読むことができる。<br />
もっと文字が多くて退屈な本なのかな、と思ってたけれどそうでもない。<br />
基礎編と実践編の2部構成なのだが、基礎編はスクラムに関連するキーワードが出てくるんだけれど、思ったより多くはない。<br />
すぐ概念を把握できる。<br />
だいたいスクラムについてわかったところで実践編に進むのだが、実践編は漫画があったり、文章も砕けているので読みやすい。</p>
<p>漫画の内容も開発現場のあるあるがあってすごく共感できる。<br />
絵もこういう本にありがちな萌え絵でもなくキャッチーな感じ。<br />
エンジニアでない人にも読んでもらえそう。<br />
チームのみんなにも読んでもらいたいな。</p>
<p>さて、この本の目次は以下のとおり</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>基礎編 Scrum ってなに?
実践編 どうやればうまくいくの?
</code></pre></div></div>
<p>2部しかないため非常にシンプル。</p>
<p>スクラムをするためにチームのRedmineにスクラム開発用のプラグイン、「Backlogs」をインストールしようとしてインストールしようとしたけれど、
DBのマイグレーションが動作しなかった…そのためBacklogsの使用は諦めた…公式にもredmineの3系はサポートしないとも書いてあったし…
いちおう、RedmineのプラグインでAgileというのが既存のプロジェクトに入れていたのでそれを使っている。<br />
ただし、不要なステータスがあったりしたのでいろいろ整備してやってはいる。<br />
スクラムをやる場合はどのツールがいいんだろう?それともホワイトボードでやっているのかな?<br />
自分のチームはリモート前提なのでホワイトボードだと無理だな。<br />
ホワイトボードを共有するサービスとかがいいのだろうか?</p>
<p><a target="_blank" href="https://www.amazon.co.jp/gp/product/4798129712/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4798129712&linkCode=as2&tag=pinekta02-22&linkId=586649d70b11a4ed2f7c27282d86a6e6"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&MarketPlace=JP&ASIN=4798129712&ServiceVersion=20070822&ID=AsinImage&WS=1&Format=_SL250_&tag=pinekta02-22" /></a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=pinekta02-22&l=am2&o=9&a=4798129712" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /></p>
変化を厭わず学び続けよう - 『GE 巨人の復活 - シリコンバレー式「デジタル製造業」への挑戦』を読んだ
2017-10-21T13:10:12+00:00
https://blog.pinekta.tech/book/2017/10/21/ge-book
<p>『GE 巨人の復活 - シリコンバレー式「デジタル製造業」への挑戦』を読んだ。<br />
この本はビジネス書だけれどもエンジニアやデザイナー・プロダクトマネージャ、経営幹部にもぜひ読んでもらいたい本。<br />
こちらの本も会社の人に勧められて読んだのだけれど、とても参考になった。感謝。</p>
<p><img src="/public/image/20171021/ge_book.jpg" alt="ge-book" /></p>
<p>本の内容だけれど、エンジニア界隈の話題を追っかけている人なら、「ああそんなの知ってるよ」ということが多く感じると思う。<br />
シリコンバレーのディシプリンである「リーンスタートアップ」「デザイン思考」「アジャイル開発」についてはだいたい知っていた。アジャイル開発なんてエンジニアにとっては今や常識。<br />
新たな気づきはそれほどなかったといえば嘘ではない。けれどGEについては自分にとってはあまり馴染みがなく、
古い企業だからどうせ古臭いやり方でやってるんだろ?SIerみたいな身動きが取りづらい枠組みでやっているんだろ?というように思っていたのが見事に打ち砕かれた。GEかなりモダン。</p>
<p>GEのすごいところは文化。<br />
あれだけ大きい企業なのに、学ぶ文化・変化を厭わない文化があり、そのような文化的下地があったから、
抜本的に「シリコンバレーのディシプリン」のやり方に変えることに成功した。<br />
経営トップは頭が凝り固まった人間ではなく、めちゃくちゃシリコンバレーのディシプリンを学んでいて、
今までのやり方を変えるという情熱と、変化を許容する文化があるからうまくいった。
そんなドデカイ企業なのに挑戦的な姿勢は多いに見習える。ほんとすごい。<br />
文化は大事だな。自分も変化を厭わず絶えず学んでトライしていこう。</p>
<p>この本の内容は以下のとおり</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>プロローグ さらばウェルチ、過去と真逆に歩む
第1章 設立125年のスタートアップ
第2章 GEデジタルはこうして生まれた
第3章 目指すはエアビーとウーバー
第4章 アイデアはデザイン思考で育む
第5章 グーグルそっくりのPredix
第6章 デジタルで製造現場も変わる
第7章 失敗が心地よい企業へ
おわりに
</code></pre></div></div>
<p>GEは産業機械で圧倒的なシェアがあり、それらの機械にセンサーを取り付けてそれらのビッグデータを分析するプラットフォームのPredixというのをサブスクリプション型で提供している。IoTとビッグデータという、アツい分野。<br />
また機械の製造の分野でも、工場の自動化の導入・データ分析、3Dプリンタによる素早いプロトタイプの開発など面白いことをやっている。工場の現場にもリーンスタートアップが入り込んでいる。<br />
今後GEがどうなるのか目を離せないな。</p>
<p>基本のデータベースにRDBMSではなくグラフDBを使っているとのこと。<br />
これ読んで思ったけれど、自分が参画しているサービスでも利用が可能だなって思った。Titan取り入れてみよう。</p>
<p>しっかし、自分が業界に入ったときは、しきりに「アウトソーシング」が叫ばれていたけどそれが今や時代遅れ。<br />
ナレッジがたまらないアウトソーシングではなく「インソーシング」という流れになっている。<br />
ほんと変化に許容できるのって大事だな。</p>
<p><a target="_blank" href="https://www.amazon.co.jp/gp/product/4822255115/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4822255115&linkCode=as2&tag=pinekta02-22&linkId=e4c92ef443c4a469e6775a3f4fed817f"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&MarketPlace=JP&ASIN=4822255115&ServiceVersion=20070822&ID=AsinImage&WS=1&Format=_SL250_&tag=pinekta02-22" /></a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=pinekta02-22&l=am2&o=9&a=4822255115" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /></p>
人生の3分の1の睡眠を最高のものにして残りの3分の2も最高のものにする - 『スタンフォード式最高の睡眠』を読んだ
2017-10-10T22:12:45+00:00
https://blog.pinekta.tech/book/2017/10/10/stanford-method-sleep
<p>『スタンフォード式最高の睡眠』を読んだ。<br />
本書はビジネス書だけれどもエンジニアにもぜひ勧めたい良書。<br />
会社の人に勧められて読んだけれどとてもよかった。感謝。<br />
人生の3分の1を占める睡眠を最高のものにすることによって残りの3分の2も最高にするというアイディアは目から鱗だった。<br />
考えれば当たり前なんだけれど、けっこう睡眠をないがしろにして働いたり勉強したりしているのでちょっとこれからは考えを改めたいと思う。</p>
<p><img src="/public/image/20171011/stanford-method-sleep.jpg" alt="stanford-method-sleep-book" /></p>
<p>本のカバーデザインもいいね。コピーもよく考えられていると思う。<br />
最近は技術書ばかり読んでいたのでデザインがしょぼいのもさして気にならなかったけれど、こういうビジネス書は「売れるように」細部まで考えられているな。アクセントカラーの水色も睡眠をイメージする色にあっている。<br />
そして技術書の読みづらさといったら!</p>
<p>ビジネス書は読みやすいし頭をそれほど使わずとも読める。スラスラ読める。気軽に読めるくらい心理的ハードルは低い。<br />
業務終了後の頭を使わずかつ自分のためになることをするにあたりこういう本を読むのはいいかもしれない。<br />
マインドの強化にも繋がるし。なによりこの本にも書いてあったけれど、良質な睡眠をとるために寝る前は頭を使うなってあったのでいいかも。</p>
<p>この本の内容は以下のとおり</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>プロローグ 「ぐっすり」を追求した究極のスタンフォード・メソッド
0章 「よく寝る」だけでパフォーマンスは上がらない
1章 なぜ人は「人生の3分の1」も眠るのか
2章 夜に秘められた「黄金の90分」の法則
3章 スタンフォード式 最高の睡眠法
4章 超究極! 熟眠をもたらすスタンフォード覚醒戦略
5章 「眠気」を制する者が人生を制す
エピローグ 睡眠研究の最前線「スタンフォード」で見つけたこと
</code></pre></div></div>
<p>この本で説明されていることは以下に尽きる。</p>
<p><strong>睡眠の質は最初の90分間で決まる。この90分間の睡眠をいかに良いものにしていくかが一番大事。</strong></p>
<p>良質な睡眠を取るために大事なものは「脳のスイッチ」と「体温のスイッチ」と説明されていて、
脳のスイッチをうまく切ると良質な睡眠がとれる。そのためには、</p>
<ul>
<li>睡眠は習慣化する</li>
<li>夜は頭を使わない</li>
</ul>
<p>を守るのがよい。</p>
<p>決まった時間に寝ることを習慣化していくとその時間に眠くなり、そのときに寝るのが質のよい睡眠をとる鍵らしい。<br />
また、夜は頭を使わずいいのは頭を使うと脳が覚醒されて脳のスイッチが切れなくなるとのこと。
とはいえエンジニアだと夜こそ勉強でいろいろ頭を使っているんだよなぁ。就業前の朝にも勉強しているし減らしたくないな…</p>
<p>体温のスイッチは人間は深部体温と皮膚体温の差が縮まると眠くなりそのタイミングで寝るとよい睡眠がとれるらしい。
そのためには就寝時間の90分前に入浴するといい具合に体温が調整されてい質のよい睡眠がとれるとのこと。</p>
<p>また睡眠と覚醒はセットになっていて、良質な睡眠を取るためには良質な覚醒をすることが大事とも説いている。<br />
そのためには</p>
<ul>
<li>朝は日の光を浴びること</li>
<li>よく噛むこと</li>
<li>ノンレム睡眠時に起きないようアラームを工夫すること</li>
<li>朝は裸足でいること。</li>
<li>起き抜けに手を洗うこと</li>
</ul>
<p>といったものが推奨されている。</p>
<p>この本で学んだ内容を生かして3分の1の睡眠も良いものにしなおかつ3分の2も良くしていこう。<br />
なので残業はせず寝るぞー(結局はこれの正当化だったりする)。
残業しないで勉強してるかもしれない…本末転倒だなぁ。</p>
<p><a target="_blank" href="https://www.amazon.co.jp/gp/product/4763136011/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4763136011&linkCode=as2&tag=pinekta02-22&linkId=2e8ebebc393069e60584f3cdc0de40c0"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&MarketPlace=JP&ASIN=4763136011&ServiceVersion=20070822&ID=AsinImage&WS=1&Format=_SL250_&tag=pinekta02-22" /></a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=pinekta02-22&l=am2&o=9&a=4763136011" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /></p>
強制的にPHPを勉強するためにやっていたこと
2017-09-18T10:04:20+00:00
https://blog.pinekta.tech/php/2017/09/18/php-chorome-addon
<p>勉強ってやり始めるまでが大変。<br />
じゃあ強制的に勉強する環境を作ってみよう、と思い立って過去いろいろやってみたことを記す。</p>
<p><a href="https://qiita.com/pinekta/items/60d1e5c8462731678a5f">PHP.netをWebスクレイピングしたものを音声ファイルにしてBGMとする</a>とか、
Chromeで新しいタブを開いたらPHP.netの関数のリファレンスページを開くChrome拡張機能を作ったりとか、
Chromeのプッシュ通知機能を利用して定期的に関数のランダムで通知するChrome拡張機能を作ったりとか、
いろいろやった。</p>
<p>PHP.netをBGMとしたのはQiitaにもあるので、
今回はその一環で作ったChrome拡張機能について紹介しようと思う。</p>
<h3 id="newtab-php-functions">newtab-php-functions</h3>
<p>新しいタブを開くと、PHP.netの関数のリファレンスページをランダムで開くChrome拡張機能で、
日常的に新しいタブはどんどん開かれるので、PHPの関数を強制的に目にする機会を増やして覚えようという作戦。<br />
こんな感じ。</p>
<p><img src="/public/image/20170918/newtab-php-functions.gif" alt="newtab-php-functions" /></p>
<p>こんな感じで新しいタブを開くと次々にPHPの関数が表示される。<br />
へーこういう関数もあったのかーと思ったりする。</p>
<p>コードは以下に置いてある。<br />
<a href="https://github.com/pinekta/newtab-php-functions">newtab-php-functions</a></p>
<p>コードをちょろっと説明すると、
新しいタブの起動をフックするためにmanifest.jsonの<code class="language-plaintext highlighter-rouge">chrome_url_overrides</code> に<code class="language-plaintext highlighter-rouge">newtab</code>の指定をしている。</p>
<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
</span><span class="nl">"manifest_version"</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w">
</span><span class="nl">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"New Tab PHP Functions"</span><span class="p">,</span><span class="w">
</span><span class="nl">"version"</span><span class="p">:</span><span class="w"> </span><span class="s2">"0.1"</span><span class="p">,</span><span class="w">
</span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">"When you open new tab, the page what you want to learn is displayed."</span><span class="p">,</span><span class="w">
</span><span class="nl">"incognito"</span><span class="p">:</span><span class="w"> </span><span class="s2">"split"</span><span class="p">,</span><span class="w">
</span><span class="nl">"chrome_url_overrides"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span><span class="nl">"newtab"</span><span class="p">:</span><span class="w"> </span><span class="s2">"blank.html"</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>
<p>でblank.htmlでは</p>
<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp"><!DOCTYPE html></span>
<span class="nt"><html</span> <span class="na">lang=</span><span class="s">"ja"</span><span class="nt">></span>
<span class="nt"><head></span>
<span class="nt"><meta</span> <span class="na">charset=</span><span class="s">"utf-8"</span><span class="nt">></span>
<span class="nt"><title></span>RedirectUrlLists<span class="nt"></title></span>
<span class="nt"></head></span>
<span class="nt"><body></span>
<span class="nt"><script </span><span class="na">src=</span><span class="s">"js/main.js"</span><span class="nt">></script></span>
<span class="nt"></body></span>
<span class="nt"></html></span>
</code></pre></div></div>
<p>main.jsを呼び出しているだけ。</p>
<div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">document</span><span class="p">.</span><span class="nx">write</span><span class="p">(</span><span class="dl">'</span><span class="s1"><script src="js/urlList.js"></script></span><span class="dl">'</span><span class="p">);</span>
<span class="nb">document</span><span class="p">.</span><span class="nx">write</span><span class="p">(</span><span class="dl">'</span><span class="s1"><script src="js/redirect.js"></script></span><span class="dl">'</span><span class="p">);</span>
</code></pre></div></div>
<p>2つのJavaScriptファイルを読み込んでいる。</p>
<div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">var</span> <span class="nx">urlList</span> <span class="o">=</span> <span class="p">[</span>
<span class="dl">"</span><span class="s2">function.abs</span><span class="dl">"</span><span class="p">,</span>
<span class="dl">"</span><span class="s2">function.addslashes</span><span class="dl">"</span><span class="p">,</span>
<span class="dl">"</span><span class="s2">function.array</span><span class="dl">"</span><span class="p">,</span>
<span class="c1">// 省略</span>
<span class="dl">"</span><span class="s2">function.vprintf</span><span class="dl">"</span><span class="p">,</span>
<span class="dl">"</span><span class="s2">function.vsprintf</span><span class="dl">"</span>
<span class="p">];</span>
</code></pre></div></div>
<p>配列をここで定義して、</p>
<div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">document</span><span class="p">.</span><span class="nx">location</span><span class="p">.</span><span class="nx">href</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">http://php.net/manual/ja/</span><span class="dl">"</span> <span class="o">+</span> <span class="nx">urlList</span><span class="p">[</span><span class="nb">Math</span><span class="p">.</span><span class="nx">floor</span><span class="p">(</span><span class="nb">Math</span><span class="p">.</span><span class="nx">random</span> <span class="p">()</span> <span class="o">*</span> <span class="nx">urlList</span><span class="p">.</span><span class="nx">length</span><span class="p">)]</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">.php</span><span class="dl">"</span><span class="p">;</span>
</code></pre></div></div>
<p>これだけ。
ランダムにurlListの値を取得し、そのページにリダイレクトさせているだけ。
めっちゃ簡単。</p>
<h3 id="notify-php-functions">notify-php-functions</h3>
<p>こちらは5分ごとにChromeの通知機能を使ってプッシュ通知を行うという拡張機能。<br />
作業によってはChromeを使っていないこともあるので、そんなときにも強制的にPHPの関数を目にするようにした。<br />
こんな感じ。</p>
<p><img src="/public/image/20170918/notify-php-functions.gif" alt="notify-php-functions" /></p>
<p>拡張機能をONにすると通知が飛んでくる。5分たてば別の関数で通知が飛んでくる。<br />
通知をクリックすればその関数のページを開く、というようになっている。</p>
<p>コードは以下に置いてある。<br />
<a href="https://github.com/pinekta/notify-php-functions">notify-php-functions</a></p>
<p>これもコードを説明する。<br />
manifest.jsonで通知を送れるように設定しておく。</p>
<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
</span><span class="nl">"manifest_version"</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w">
</span><span class="nl">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"notify-php-functions"</span><span class="p">,</span><span class="w">
</span><span class="nl">"version"</span><span class="p">:</span><span class="w"> </span><span class="s2">"0.1"</span><span class="p">,</span><span class="w">
</span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Sometimes the word what you want to learn is displayed."</span><span class="p">,</span><span class="w">
</span><span class="nl">"permissions"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
</span><span class="s2">"notifications"</span><span class="p">,</span><span class="w">
</span><span class="s2">"http://php.net/"</span><span class="w">
</span><span class="p">],</span><span class="w">
</span><span class="nl">"background"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span><span class="nl">"scripts"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">"js/background.js"</span><span class="p">]</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>
<p><code class="language-plaintext highlighter-rouge">permissions</code> で<code class="language-plaintext highlighter-rouge">notifications</code> を指定することでChromeのプッシュ通知を利用できるようになる。<br />
あとはphp.netからの情報をスクレイピングするので<code class="language-plaintext highlighter-rouge">http://php.net/</code> も追加する。<br />
バックグラウンドで実行するスクリプトは<code class="language-plaintext highlighter-rouge">background</code>で指定する。<br />
newtab-php-functionsと同じように対象の関数ページは別ページに定義してありランダムで通知する。
通知部分に関しては以下のとおり。</p>
<div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cm">/**
* Create Notification
* @param string functionName
* @param string title
* @param string description
* @param string methodsynopsis
*/</span>
<span class="kd">var</span> <span class="nx">createNotification</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">functionName</span><span class="p">,</span> <span class="nx">title</span><span class="p">,</span> <span class="nx">description</span><span class="p">,</span> <span class="nx">methodsynopsis</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">option</span> <span class="o">=</span> <span class="p">{</span>
<span class="na">type</span><span class="p">:</span> <span class="dl">"</span><span class="s2">basic</span><span class="dl">"</span><span class="p">,</span>
<span class="na">title</span><span class="p">:</span> <span class="nx">title</span><span class="p">,</span>
<span class="na">message</span><span class="p">:</span> <span class="nx">description</span> <span class="o">+</span> <span class="dl">"</span><span class="se">\r</span><span class="dl">"</span> <span class="o">+</span> <span class="nx">methodsynopsis</span><span class="p">,</span>
<span class="na">iconUrl</span><span class="p">:</span> <span class="dl">"</span><span class="s2">img/logo.gif</span><span class="dl">"</span>
<span class="p">};</span>
<span class="kd">var</span> <span class="nx">notifications</span> <span class="o">=</span> <span class="nx">chrome</span><span class="p">.</span><span class="nx">notifications</span><span class="p">;</span>
<span class="nx">notifications</span><span class="p">.</span><span class="nx">create</span><span class="p">(</span><span class="nx">title</span><span class="p">,</span> <span class="nx">option</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{});</span>
<span class="nx">notifications</span><span class="p">.</span><span class="nx">onClicked</span><span class="p">.</span><span class="nx">addListener</span><span class="p">(</span><span class="kd">function</span> <span class="p">(</span><span class="nx">clickedFunctionName</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">splits</span> <span class="o">=</span> <span class="nx">functionName</span><span class="p">.</span><span class="nx">split</span><span class="p">(</span><span class="dl">'</span><span class="s1">.</span><span class="dl">'</span><span class="p">);</span>
<span class="kd">var</span> <span class="nx">type</span> <span class="o">=</span> <span class="nx">splits</span><span class="p">[</span><span class="mi">0</span><span class="p">];</span>
<span class="kd">var</span> <span class="nx">splitedFunctionName</span> <span class="o">=</span> <span class="nx">splits</span><span class="p">[</span><span class="mi">1</span><span class="p">].</span><span class="nx">replace</span><span class="p">(</span><span class="sr">/-/g</span><span class="p">,</span> <span class="dl">'</span><span class="s1">_</span><span class="dl">'</span><span class="p">);</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">type</span> <span class="o">!=</span> <span class="dl">'</span><span class="s1">function</span><span class="dl">'</span><span class="p">)</span> <span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">type</span> <span class="o">==</span> <span class="dl">'</span><span class="s1">serializable</span><span class="dl">'</span> <span class="o">||</span> <span class="nx">type</span> <span class="o">==</span> <span class="dl">'</span><span class="s1">exception</span><span class="dl">'</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">splitedFunctionName</span> <span class="o">=</span> <span class="p">(</span><span class="nx">type</span><span class="p">.</span><span class="nx">charAt</span><span class="p">(</span><span class="mi">0</span><span class="p">).</span><span class="nx">toUpperCase</span><span class="p">()</span> <span class="o">+</span> <span class="nx">type</span><span class="p">.</span><span class="nx">slice</span><span class="p">(</span><span class="mi">1</span><span class="p">))</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">::</span><span class="dl">'</span> <span class="o">+</span> <span class="nx">splitedFunctionName</span><span class="p">;</span>
<span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="nx">type</span> <span class="o">==</span> <span class="dl">"</span><span class="s2">dateinterval</span><span class="dl">"</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">splitedFunctionName</span> <span class="o">=</span> <span class="dl">'</span><span class="s1">DateInterval::</span><span class="dl">'</span> <span class="o">+</span> <span class="nx">splitedFunctionName</span><span class="p">;</span>
<span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="nx">type</span> <span class="o">==</span> <span class="dl">"</span><span class="s2">dateperiod</span><span class="dl">"</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">splitedFunctionName</span> <span class="o">=</span> <span class="dl">'</span><span class="s1">DatePeriod::</span><span class="dl">'</span> <span class="o">+</span> <span class="nx">splitedFunctionName</span><span class="p">;</span>
<span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="nx">type</span> <span class="o">==</span> <span class="dl">"</span><span class="s2">datetime</span><span class="dl">"</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">splitedFunctionName</span> <span class="o">=</span> <span class="dl">'</span><span class="s1">DateTime::</span><span class="dl">'</span> <span class="o">+</span> <span class="nx">splitedFunctionName</span><span class="p">;</span>
<span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="nx">type</span> <span class="o">==</span> <span class="dl">"</span><span class="s2">datetimezone</span><span class="dl">"</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">splitedFunctionName</span> <span class="o">=</span> <span class="dl">'</span><span class="s1">DateTimeZone::</span><span class="dl">'</span> <span class="o">+</span> <span class="nx">splitedFunctionName</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">clickedFunctionName</span> <span class="o">==</span> <span class="nx">splitedFunctionName</span><span class="p">)</span> <span class="p">{</span>
<span class="nb">window</span><span class="p">.</span><span class="nx">open</span><span class="p">(</span><span class="dl">"</span><span class="s2">http://php.net/manual/ja/</span><span class="dl">"</span> <span class="o">+</span> <span class="nx">functionName</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">.php</span><span class="dl">"</span><span class="p">,</span> <span class="nx">functionName</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">});</span>
<span class="p">}</span>
<span class="cm">/**
* Notify
*/</span>
<span class="kd">var</span> <span class="nx">notify</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">functionName</span> <span class="o">=</span> <span class="nx">urlList</span><span class="p">[</span><span class="nb">Math</span><span class="p">.</span><span class="nx">floor</span><span class="p">(</span><span class="nb">Math</span><span class="p">.</span><span class="nx">random</span><span class="p">()</span> <span class="o">*</span> <span class="nx">urlList</span><span class="p">.</span><span class="nx">length</span><span class="p">)];</span>
<span class="nx">$</span><span class="p">.</span><span class="nx">ajax</span><span class="p">({</span>
<span class="na">url</span><span class="p">:</span> <span class="dl">"</span><span class="s2">http://php.net/manual/ja/</span><span class="dl">"</span> <span class="o">+</span> <span class="nx">functionName</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">.php</span><span class="dl">"</span><span class="p">,</span>
<span class="na">type</span><span class="p">:</span> <span class="dl">"</span><span class="s2">GET</span><span class="dl">"</span><span class="p">,</span>
<span class="na">success</span><span class="p">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">data</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">title</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="nx">data</span><span class="p">).</span><span class="nx">find</span><span class="p">(</span><span class="dl">'</span><span class="s1">h1</span><span class="dl">'</span><span class="p">).</span><span class="nx">text</span><span class="p">();</span>
<span class="kd">var</span> <span class="nx">description</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="nx">data</span><span class="p">).</span><span class="nx">find</span><span class="p">(</span><span class="dl">'</span><span class="s1">p.refpurpose</span><span class="dl">'</span><span class="p">).</span><span class="nx">text</span><span class="p">();</span>
<span class="kd">var</span> <span class="nx">methodsynopsis</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="nx">data</span><span class="p">).</span><span class="nx">find</span><span class="p">(</span><span class="dl">'</span><span class="s1">div.methodsynopsis</span><span class="dl">'</span><span class="p">).</span><span class="nx">text</span><span class="p">().</span><span class="nx">replace</span><span class="p">(</span><span class="sr">/</span><span class="se">[\r\n]</span><span class="sr">/g</span><span class="p">,</span> <span class="dl">""</span><span class="p">);</span>
<span class="nx">createNotification</span><span class="p">(</span><span class="nx">functionName</span><span class="p">,</span> <span class="nx">title</span><span class="p">,</span> <span class="nx">description</span><span class="p">,</span> <span class="nx">methodsynopsis</span><span class="p">);</span>
<span class="p">},</span>
<span class="na">error</span><span class="p">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
<span class="nx">createNotification</span><span class="p">(</span><span class="nx">functionName</span><span class="p">,</span> <span class="dl">"</span><span class="s2">Error!!!</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">Error:</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">The URL is invallid.</span><span class="dl">"</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">});</span>
<span class="p">};</span>
<span class="nx">notify</span><span class="p">();</span>
<span class="kd">var</span> <span class="nx">minuteInterval</span> <span class="o">=</span> <span class="mi">5</span> <span class="o">*</span> <span class="p">(</span><span class="mi">60</span> <span class="o">*</span> <span class="mi">1000</span><span class="p">);</span>
<span class="kd">var</span> <span class="nx">timer</span> <span class="o">=</span> <span class="nx">setInterval</span><span class="p">(</span><span class="nx">notify</span> <span class="p">,</span> <span class="nx">minuteInterval</span><span class="p">);</span>
</code></pre></div></div>
<p>5分に1回notifyメソッドを実行している。そのnotifyメソッドではurlList.jsで定義したページをスクレイピングして関数のタイトルと説明を取得しcreateNotificationメソッドに渡す。そしてcreateNotificationメソッドで<code class="language-plaintext highlighter-rouge">notifications.create</code>を実行することでプッシュ通知をしている。</p>
<p>こっちも簡単。</p>
<h2 id="インストール方法">インストール方法</h2>
<p>どちらのChrome拡張もChromeのストアには配信していないので、GitHubからcloneしたものを読み込む必要がある。<br />
<img src="/public/image/20170918/add-addon.png" alt="add addon" />
「デベロッパーモード」のチェックボックスをONにすると「パッケージ化されていない拡張機能を読み込む」ボタンが表示されるのでcloneしたリポジトリのディレクトリを指定する。
これで拡張がインストールされる。</p>
<h2 id="まとめ">まとめ</h2>
<p>やっぱり強制的に勉強できる環境を作るのは大事。<br />
これらのChrome拡張や車でphp.netを1ヶ月ほど聴いて勉強したんだけど、
その成果はPHP5技術者認定上級試験にも合格という結果にもあらわれたのでよかった。<br />
まぁ取ったのはだいぶ昔だけど…</p>
<p>なかなか勉強し始めるまでが大変だから、こういうようなハックをして少しでもやる気を起こさせるようにしていこう。</p>
<p>※ちなみに↓の黒本は良本。試験勉強本だけどPHPの細かいところまで記載されていてとてもよい。</p>
<p><a target="_blank" href="https://www.amazon.co.jp/gp/product/4844334670/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4844334670&linkCode=as2&tag=pinekta02-22&linkId=d84b29c28d20828dd83f4597a5079fa7"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&MarketPlace=JP&ASIN=4844334670&ServiceVersion=20070822&ID=AsinImage&WS=1&Format=_SL250_&tag=pinekta02-22" /></a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=pinekta02-22&l=am2&o=9&a=4844334670" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /></p>
Windowsマシンのキーボードとキーバインド
2017-09-15T16:12:45+00:00
https://blog.pinekta.tech/keyboard/2017/09/15/windows-keyboard
<p>久しぶりにWindowsで開発している。<br />
開発といっても本気で開発するのではなく、過去に作成したコードを拾い上げるために環境を整えている。</p>
<p>普段はBluetoothの小さいキーボードを接続している。<br />
ブラウザからキーを入力するだけなのでそれで問題なかったのだが、コードを触るならもっと触りやすいキーボードを使いたい。
キータッチが軽くキーストロークも浅い。<br />
自分の好みはキータッチが多少ありストロークも深いしっかりしたキーボードじゃないとタイピングしていて気持ち良くないのだ。</p>
<p>以前使っていたHHKB Lite2を引っ張り出してきた。<br />
WindowsでもHHKB Lite2を使っている。<br />
このキーボードじゃないとダメだ。
Escキーの位置が近いこのキーボードじゃないとダメなんだ。</p>
<p>Win用のHHKB Lite2は2個ある。<br />
(Mac用のHHKB Lite2は1個。)<br />
以前は職場と自宅の2環境で使っていたが今はMac用のだけ使っている。</p>
<p><img src="/public/image/20170916/hhkb_lite2.jpg" alt="HHKB Lite2" /></p>
<p>さっそく打ち込んでいくぞ、と思ったらキーバインドが気に入らない。<br />
「無変換」は「英字」、「変換」は「Kana」であってほしいのだ。<br />
そして「半角全角」はCtrlになってほしい。</p>
<p>これらのキーバインドを変更した。
キーバインドはAutoHotKeyを使って変更している。
AutoHotKeyスクリプトは以下のとおり</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>;
; AutoHotkey Version: 1.x
; Language: English
; Platform: Win9x/NT
; Author: A.N.Other <myemail@nowhere.com>
;
; Script Function:
; Template script (you can customize this template by editing "ShellNew\Template.ahk" in your Windows folder)
;
#NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases.
SendMode Input ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir% ; Ensures a consistent starting directory.
; 無変換を半角全角
vk1Dsc07B::vkF3sc029
; 変換を半角全角
vk1Csc079::vkF3sc029
; 半角全角をCtrl
vkF3sc029::Ctrl
; 右Altを右コントロール
RAlt::Ctrl
; Alt + 4 で Alt + F4
!4::!F4
</code></pre></div></div>
<p>このスクリプトをコンパイルして生成されたexeをスタートアップに登録してマシンを立ち上げたときに実行してもらうようにする。<br />
あれ、スタートアップってどこだっけ?<br />
Windows 8.1 だと<code class="language-plaintext highlighter-rouge">C:\Users\keita\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup</code> だったそういえば。
ここに上記のexeのショートカットリンクを配置して起動時に実行されるようにする。</p>
<p>これでようやく開発できる環境が整った。</p>
<p><a target="_blank" href="https://www.amazon.co.jp/gp/product/B00008B61F/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=B00008B61F&linkCode=as2&tag=pinekta02-22&linkId=4c682052f85c1df1937fc0c04f8114be"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&MarketPlace=JP&ASIN=B00008B61F&ServiceVersion=20070822&ID=AsinImage&WS=1&Format=_SL250_&tag=pinekta02-22" /></a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=pinekta02-22&l=am2&o=9&a=B00008B61F" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /></p>
育児と自己研鑽とのはざまでゆれるエンジニア
2017-09-11T22:12:45+00:00
https://blog.pinekta.tech/life/2017/09/11/parenting-engineer
<p>もっと優れたエンジニアになりたいと常に思っている。
そうなるためには努力することが必要だ。
けれど自分一人だけの人生でないのでそうもいかない。<br />
育児エンジニアは時間がないのでいかに勉強時間を作れるか・集中できる環境が作れるか、この2点ができるかが重要になる。<br />
そして物理的に使える時間が少ないので諦めることも必要になってくる。
諦めきれず悶々としてストレスをためて家族に迷惑をかけないように、いっそ思い切って諦めることも重要。
何かを諦めるかわりにこれだけは諦めずにやる、という取捨選択をしなければいけない。この取捨選択は大事。</p>
<p>少ない時間の中で家族に迷惑をかけずに努力するにはどうするか?<br />
こどもたちが寝静まったら勉強時間として使うこと。こどもたちと一緒に寝てしまわない。ゲームしない(最近Nintendo Switch買ってしまった。スプラトゥーンやりたい)。テレビ見ない。コードを書くのだ。</p>
<p>コードを書く上で最大の敵はこどもたちからの妨害工作である。なのでコードを書く時間はこの時間しかない。
だがしかしこの時間は嫁からの妨害工作がある。彼女も人間なので構ってもらいたいのだ。
週末はどこ行くかだの、この服いいだの、このドラマ面白いだの、色々ある。そう色々。
なのでできるだけコードを書きながら適当に相槌を打ち、集中しひたすらコードを書く。いや結局集中できないんだけれども。<br />
最近はミシンにハマっているので非常にありがたい。おかげでコードに集中できる。</p>
<p>ではちびっこたちが起きているときはどうするか?
起きているときにPCを開いてコードを書いていると嫁からの目が厳しい。怒られてしまう。
よしんば嫁がその場にいなかったとしてもヤツらからの妨害工作が始まる。そう。ヤツらからの妨害工作だ。<br />
最初のうちは邪魔されないために余ったネットブックを彼らに渡して一緒にパソコンごっこをしていた。
しかし彼らはそのうち満足できなくなり電源を入れて遊ぶようになった。
OSはLinux Mint。彼らのはじめてのOS。<br />
自分が黒い画面で作業していることも多いので、彼らはPCは黒い画面で遊ぶもの、と思っている。</p>
<p>自慢じゃないが上のちびっこは3歳10ヶ月の頃にはターミナルから<code class="language-plaintext highlighter-rouge">sl -F</code>でSLを空に向かって走らせることができていた。
パソコンは黒い画面でコマンドを打つという認識になっている。<br />
今では勝手にマシンにログインしターミナルを立ち上げてSLコマンドを打ったりls叩いたりしている。
最近のお気に入りはcowsayコマンドだ。オプションはまだ知らないので指定できないが。
ちょっと教えただけなのに、ちゃんと覚えていてこどもの学習能力はすごいと感心する。</p>
<p>PCを開いているとかまって攻撃が始まったりコマンド教えて攻撃が始まる。
もしくはYouTube見せて攻撃だ。なぜかTVでも自分たちでYouTube見ているのにPCになると「ひつじのショーン」の英語版だ。
よくわからない。
ともかく彼らの妨害工作でとてもじゃないがコードなんて書けやしない。</p>
<p>なのでこどもたちといるときは圧倒的に本を読むことが多い。だからこのブログも本読んだというポストが多い。<br />
いつも本を読んでいるせいかちびっこたちも本を読むことに抵抗を持っていないというのはいい影響だ。
自分が常に勉強しているので彼らも勉強のまねごとをしている。勉強に対して抵抗がないというか新しい知識を
身につけるための手段という認識でいるようなので非常に嬉しい。<br />
ちなみにオライリー本は表紙が動物のスケッチなので彼らからの反応は良い。「パパ、くじらの本読んでるね〜」とか「サイの本読んでる」とか「ちょんまげ」とか様々なリアクションがある。</p>
<p>本を読むことはこどもたちからの妨害工作はないのだが嫁からの妨害工作がある。勉強していることで怒られてしまうのだ。<br />
時間があればずっと本を読んでいるので、時々勉強禁止令が出てしまう。こどもたちと遊んでやれとのこと。確かにそのとおりで、みんなで幸せになりつつ自分のやりたいこともしつつで研鑽していかなければならないのだ。だから完全に自分が悪いといつも思っている。でも読んでしまうんだよなぁ。このページまでは読むぞって思ってしまって…。<br />
少しでも勉強したいがために、近場のイオンに遊びに行った時は本を持っていく。おもちゃ売り場でちびっこが夢中になっている隙に本を読んでいる。3秒に一回の目視確認は欠かさない。周りの大人はみんなスマホを触っているというのに自分だけゴツイ技術書だ。
ただこれもやはり怒られる。当たり前だ。こどもから目を離してはいけない。</p>
<p>こうしぶとくやっているのは諦めきれていないからなんだろうな。
大事なのはみんなで幸せになりつつ自分のペースで研鑽に励むこと。みんなの幸せを犠牲にしてまで必死こいて勉強する必要はないのだ。<br />
その歩みがカメでもウサギに勝てるかもしれない。
まぁでもそもそも勝ち負けなんてないよね。だから折り合いつけながらハッピーであればそれはそれでいいんだよ。</p>
『Laravelリファレンス』を読んだ
2017-09-10T22:12:45+00:00
https://blog.pinekta.tech/book/2017/09/10/laravel-reference-book
<p>『Laravelリファレンス』を読んだ。<br />
このフレームワークがどういったものなのか、より詳しく知りたいのであれば読む価値はある本。
養成読本はLaravelの紹介という感じが強かったが、この本は紹介+こんな使い方です、という感じ。<br />
フレームワークやPHPがわからないという初級者ではなく、ある程度わかっている中級者向けの本。
DIなどは初級者じゃわからないんじゃないかな…</p>
<p><img src="/public/image/20170911/laravel_reference_book.jpg" alt="laravel-reference-book" /></p>
<p>Chapter 01からChapter 05まではとてもよい。
Laravelの概念や、フレームワークがどういう機能をサポートしているかが細かく書いてあった。
Laravelがどういうことができるのかを想像させるに十分な内容だった。<br />
しかしそれ以降の章がわかりづらかった…。</p>
<p>Chapter 06ではテストについて扱っているのだが、
テストの例がちょっと悪い。実践的なテストではなくて、テストの説明のために作られたようなクラスとテストのため
テストの意義・意図が伝わりづらい。
もう少し意味のあるテストだったらよかったなぁ。<br />
また、テストのファンクショナルテストのところで、テストのヘルパーメソッドの説明をしているのだが、
メソッドの名の羅列でしかなかったので、メソッドの引数・戻り値・コード例の記載があったらもっとよかった。</p>
<p>Chapter 07ではセキュリティに関して詳細に説明しているが、セキュリティに関しては他の本で知識があるので自分にとっては別の解説があったほうがありがたかったかも。でもここは大事だからこれはこれであり。</p>
<p>あと全体的に図や画面がなくて文章がメインなので図・画像があればもっとよかったかも。</p>
<p>とはいえ、現在Laravelを使ったアプリケーションの開発をしていて、
手元に置いてまさに「リファレンス」として使っている。<br />
めっちゃ開発に助かっている。ありがたい。</p>
<p>この本の内容は以下のとおり</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Chapter 01 Laravelの概要
Chapter 02 Laravelの基本
Chapter 03 データベース
Chapter 04 フレームワークの機能
Chapter 05 フレームワークの拡張
Chapter 06 テスト
Chapter 07 実践的なアプリケーション構築
Chapter 08 Laravelの実践
</code></pre></div></div>
<p>だいたいLaravelというものがわかってきた。<br />
Laravelというフレームワークの場合、どういう風に設計するのがベストなのか
掴めたのでこの本を読んでよかったと思う。<br />
とはいえLaravelは進化のスピードが早い。おそらくこの本の内容も陳腐化しているだろう。
ただ概念・フレームワークの根幹など変わらないところはあるはずなのでそれを知ることができたのはよい。<br />
あとはガリガリ書いていくぞー!</p>
<p><a target="_blank" href="https://www.amazon.co.jp/gp/product/4844339451/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4844339451&linkCode=as2&tag=pinekta02-22&linkId=d6d66580d50ea487005397bbbedf5d60"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&MarketPlace=JP&ASIN=4844339451&ServiceVersion=20070822&ID=AsinImage&WS=1&Format=_SL250_&tag=pinekta02-22" /></a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=pinekta02-22&l=am2&o=9&a=4844339451" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /></p>
『Laravelエキスパート養成読本』を再読した
2017-09-03T10:54:21+00:00
https://blog.pinekta.tech/book/2017/09/03/laravel-mook-book
<p>『Laravel養成読本』を再読した。<br />
Laravelを俯瞰するための本としてはよいけれど、
これを参考にしてプロダクトが作れるかというとそこまでLaravelの機能について深く説明はないので
実際にLaravelを使ったアプリケーションを作るときはLaravelの公式のドキュメントを読み込む必要がある。</p>
<p><img src="/public/image/20170903/laravel_mook_book.jpg" alt="laravel-mook-book" /></p>
<p>出版が2016年と古いこともあり、内容の半分がLaravel4で説明されていて
バージョン5系と4系はディレクトリ構造など違うため参考にできない箇所が多い。
とはいえLaravelの雰囲気を感じるものとしては役に立つだろう。
2017年9月現在ではLaravel5.5まで進んでおりいまだとLaravel4の内容はちょっと役に立てられないかも。</p>
<p>この本の見所はChapter 3とChapter 4。<br />
Chapter 3のLaravelの根幹の概念である、ファサード・IoCコンテナについての説明が非常に為になった。<br />
最初IoCコンテナって何ぞ?と思っていたが何のことはないただのDIコンテナだった。
同じものを別の言葉が当てられていて非常に紛らわしい。<br />
ファサードもデザインパターンのファサードと厳密に意味が違う気がするので、
Laravelは概念の名前づけがちょっと変わっている気がする。</p>
<p>Chapter 4ではLaravel5の新機能を紹介しており、Laravel4と比べてどう違ったか、
Laravel4からLaravel5に移行するときにどのようなことに気をつけたらいいか書いてある。</p>
<p>この本の内容は以下のとおり</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Chapter 1 Laravelをはじえよう - PHPでの開発が楽しくなる -
Chapter 2 MVCモデルが基礎からわかる - Laravelで作るWebアプリケーション
Chapter 3 IoCコンテナ、ファサード、サービスプロバイダ、Eloquent - Laravelをより理解するために -
Chapter 4 Laravel5の新機能を紹介 - 開発効率アップのエッセンス -
Chapter 5 実践!REST APIアプリケーション - 手を動かして学ぼう! -
</code></pre></div></div>
<p>現在ではちょっと内容が古くなってしまったとはいえ、
この本はLaravelを始める前にLaravelはどういうものなのかを知るのにはいい本だと思う。</p>
<p><a target="_blank" href="https://www.amazon.co.jp/gp/product/4774173134/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4774173134&linkCode=as2&tag=pinekta02-22&linkId=c664be7ef7df143e3c519ff6f50a6032"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&MarketPlace=JP&ASIN=4774173134&ServiceVersion=20070822&ID=AsinImage&WS=1&Format=_SL250_&tag=pinekta02-22" /></a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=pinekta02-22&l=am2&o=9&a=4774173134" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /></p>
『なるほどデザイン』を読んだ
2017-09-02T10:54:21+00:00
https://blog.pinekta.tech/book/2017/09/02/naruhodo-design-book
<p>『なるほどデザイン』を読んだ。<br />
デザインに関するものごとを視覚的に「なるほど」とわかるように説明した本。<br />
とてもわかりやすく、デザイナーだけでなくエンジニアや資料を日常的に作るビジネスパーソンにも役に立つ本。気軽に読める内容の本でとても面白い。</p>
<p><img src="/public/image/20170902/naruhodo_design.jpg" alt="naruhodo-degisn-book" /></p>
<p>オライリーの本やお堅い技術書と比べると、本自体が見やすくて読み手が理解しやすいようにデザインされている。<br />
どのページにも「伝わるデザイン」というものが徹底されている。<br />
眺めるだけで勉強になる本。<br />
それに比べて技術書は…特にオライリー。見出しと本文がほとんどでたまに図表。もうちょいなんとかならんのかな。<br />
まぁあのくらいのお堅い感じがレベルの高い技術書っぽくさせてるんだろうな。<br />
オライリー本がデザインされたら逆に売れないのかも。</p>
<p>本書は以下の内容で構成されている。</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Chapter 1 編集×デザイン
編集とデザインの関係
デザインしてみよう
Chapter 2 デザイナーの7つ道具
ダイジ度天秤
スポットライト
擬人化力
連想力
翻訳機
虫めがね
愛
Chapter 3 デザインの素
文字と組み
言葉と文章
色
写真
グラフとチャート
参考文献
おわりに
</code></pre></div></div>
<p>Chapter 1 ではデザインされるまでのプロセスについて説明されている。
デザインしたことがないエンジニアにとって、どのようなプロセスでデザインしていったらいいのか説明されていて非常に参考になる。<br />
Chapter 2 でデザインのコツ・気をつけるべき7つのポイントについて言及している。
こちらも非常に興味深いかつ役にたつ内容。<br />
Chapter 3はデザインの構成要素となる「タイポグラフィ」「タイトルや見出し・本文などの段組」「色」「写真」「グラフ・チャート」について、それぞれどのようにデザインしたらいいかが説明されている。</p>
<p>全体をとおして「なるほど」と頷かずにはいられない、まさしくタイトルに恥じない良本。<br />
また、本の帯に「ビジネス文書は見た目が勝負!」と書いてあるとおり、プレゼン資料などの作成にも役にたつ内容。
帯にこのように書くくらいなので、本書がターゲットとしている読者層ももちろんのこと、ひょっとしたらクリエイター職以外によく読まれているのかも。</p>
<p>やっぱデザインが一番大事だな。</p>
<p><a target="_blank" href="https://www.amazon.co.jp/gp/product/4844365177/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4844365177&linkCode=as2&tag=pinekta02-22&linkId=fd246854b057335151a5b6d103046c19"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&MarketPlace=JP&ASIN=4844365177&ServiceVersion=20070822&ID=AsinImage&WS=1&Format=_SL250_&tag=pinekta02-22" /></a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=pinekta02-22&l=am2&o=9&a=4844365177" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /></p>
『いちばんよくわかるWebデザインの基本 きちんと入門』を読んだ
2017-08-25T00:15:54+00:00
https://blog.pinekta.tech/book/2017/08/25/webdesign-basic-book
<p>『いちばんよくわかるWebデザインの基本 きちんと入門』を読んだ。<br />
タイトルのとおりとてもわかりやすかった。デザインの説明のための事例も豊富だし見てて飽きない。<br />
Webデザイナーだけでなくエンジニアやディレクターにもおすすめ。</p>
<p><img src="/public/image/20170825/webdesign-basic-book.jpg" alt="webdesign-basic-book" /></p>
<p>どんなにインフラやバックエンドが作り込まれていても見た目が良くなければユーザーは見向きもしない。
ユーザーが見てくれる・触ってくれるようなものを作りたい。
自分で見た目のデザインまである程度のレベルのものを提示できたら、
と最近強く思うようになったのでデザインに関する勉強を始めた。<br />
この本はWebデザインで必要なものをひととおり学べるので非常によい。</p>
<p>フロントエンドをいじるときはおおいにこの本の内容が参考になる。<br />
たとえばレイアウトを組んだり、マイクロインタラクションとしてアニメーションを入れたりするとき、
ボタンの色をCSSで指定するとき、UIを設計するとき、
今まではなんとなくでやっていたけれど、どのようにやれば効果的なのかわかるようになった。<br />
また、特に読んでいて面白かったのは配色の章で、
普段なにげなく見ているものもしっかり考えられて配色されているんだなーと思うようになった。
当たり前なんだけれども、人が作ったもの全てが誰かによってデザインされているものだと認識するようになった。<br />
身の回りのものは使用者のためにルールに則って(時には逸脱して)デザインされていると気づくと、
どうしてその形状をしているのか、どうしてその配色なのか、ということをルールに照らしながら考えるようになった。<br />
物の見方が変わって、デザインって素晴らしいし面白いんだな、とちょっと感動。</p>
<p>本は以下の内容で構成されている。</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>CHAPTER1 Webデザインの基本
CHAPTER2 レイアウト
CHAPTER3 配色
CHAPTER4 写真と図版
CHAPTER5 タイポグラフィー
CHAPTER6 HTML5とCSS3
CHAPTER7 インタラクション
CHAPTER8 運用とマーケティング
</code></pre></div></div>
<p>どの章も読みやすく面白かった。<br />
デザインの心構えを説き課題解決のためのデザインをするためのワークフローを説明するCHAPTER1、
デザインをしたものをいかに広めていくかを説明するCHAPTER8、
これらが特に面白かった。</p>
<p>本当にこれ一冊でWebデザイナーに必須な基礎知識は全て網羅できてる感じ。<br />
良い本。</p>
<p><a target="_blank" href="https://www.amazon.co.jp/gp/product/4797389656/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4797389656&linkCode=as2&tag=pinekta02-22&linkId=1e5158780effba7d522ccaef59b3b1dd"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&MarketPlace=JP&ASIN=4797389656&ServiceVersion=20070822&ID=AsinImage&WS=1&Format=_SL250_&tag=pinekta02-22" /></a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=pinekta02-22&l=am2&o=9&a=4797389656" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /></p>
技術は手段。大事なのはユーザーが喜ぶかどうか - 『Web製作者のためのUXデザインをはじめる本』を読んだ
2017-08-16T14:20:36+00:00
https://blog.pinekta.tech/book/2017/08/16/uxdesign-book
<p>最近、エンジニアとして仕事をしていて「ユーザーに本当に価値が届いているのか」
「本当に自分が作ったものでユーザーが喜んでいるのか」と疑問に思いながら
日々のタスクを忠実にこなしていたのだけれど、
チームにUX/UIデザイナーがJOINすることになり、UXも合わせてUI・画面のデザインを再デザインしてもらったところ、
今までのものとははるかにユーザーに寄り添ったものになっていくのを目の当たりにした。<br />
これまでのものは、ディレクターからのふんわりとした要件をエンジニアが
ポイントを抑えつつ試行錯誤しながら画面設計も含めて実装に落とし込んでいたのだけれど、
アクティブなユーザーがなかなか増えていかない。<br />
機能を作った自分は、「とりあえずタスクが消化されたし問題があればあとで改善すればいいか」としてそこで達成感だけ味わって後は塩漬け。
そうやっていつまでも改善されていかない。<br />
このやり方でいいものかと思っていた矢先、上記の改善を目の当たりにしてカルチャーショック。</p>
<p>サービスをサービス足らしめるのは技術ではないんだな、と納得した。<br />
あくまで技術というのは実現するためのサポート・手段でしかない。そうであるならエンジニアってWeb開発における主体性ってあまりないんじゃないか?
もちろん技術は楽しいものだけれど、作ったサービスで誰かを幸せにしたいって思うならエンジニアリングだけじゃダメなんじゃないか?<br />
キラキラした最新技術だけを追っかけてそれで満足して本当に大事なものを見失ってないか?</p>
<p>ユーザーがサービスを利用したくなるような条件って何だろう?<br />
UX、UI、デザイン。これらをもっと学ぶ必要があると思った。
そう思ったのが本書を手に取った次第。</p>
<p><img src="/public/image/20170816/uxdesign.jpg" alt="uxdesign-book" /></p>
<p>本は大まかに以下のとおり。</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>1章 UX デザインとは?
2章 ユーザビリティ評価からはじめる
3章 プロトタイピングで設計を練り上げる
4章 ペルソナから画面までをシナリオで繋ぐ
5章 ユーザー調査を行う
6章 カスタマージャーニーマップで顧客体験を可視化する
7章 共感ペルソナによるユーザーモデリング
8章 UX デザインを組織に導入する
</code></pre></div></div>
<p>特に面白かったのは1章で、目からウロコだった。<br />
UXの言葉の意味にギャップがある、というのはその通りで自分の周りでも「UX」は「ユーザビリティ」の意味でしか使われていない節がある。UXは</p>
<blockquote>
<p>該当の製品・サービスを使っているときだけでなく、その前後の時間の中にもユーザー体験は拡がっている</p>
</blockquote>
<p>というものであり、さらには他社サービスや個人的事情も一体となってUXを為している。
つまりサービスの画面・UIというのはUX全体における一部分でしかないのでUXの向上を目指すにはUIだけを良くするだけではなく、UXの主体であるユーザーの心理・ニーズを徹底的に学ばなければUXの向上は望めない。そのためにUXデザインには様々な手法(ユーザビリティ評価・プロトタイピング・構造化シナリオ・カスタマージャーニーマップ・ユーザーモデリング)があるということが腑に落ちた。<br />
ただ、本書に指摘があるとおり、UXデザイン手法を取り入れることはけっこうハードルが高いような気がしている。
UXデザインは新しい手法を導入するだけでなく、新しいプロセスと新しい価値判断の導入が必須であり、既存のフローを変更する必要があるため抵抗がある人はありそう。また真面目にUXデザインをすると「そもそもの前提」もひっくり返す可能性があるため場合によってはステークホルダーの顰蹙も買いかねない。文化の下地がなければこれはつらい。<br />
以前、UXのコンサルティングをするとある会社の方とお話をする機会があったのだけれど、しきりに組織構造や組織文化について気にしていたのは、UXデザインの成否は組織構造・組織文化に強く影響されるから、という理由があるからなんだなと納得できた。</p>
<p>なお、この本のスタンスはUXデザインの下地がない組織にUXデザインができるようボトムアップで改善していく、というスタンスなのでそこは非常に参考になる。
こういうスタンスを取っているくらいだから、まだまだ正しい意味で「UX」を理解している人は少ないんだろうなぁ、と思った。<br />
UXって言葉を聞いたら正しい意味の「UX」なのか、「ユーザビリティ」という意味合いで使っているのか、確認した上で話をしないと話がズレそう。</p>
<p>本書に記載されたやり方が自分の関わるサービスに本当に有効なのかどうかはわからないけれど、これまでのやり方でうまく行かなかったのだから、UXデザイン手法を取り入れていきたい。</p>
<p>最後にひとつだけちょっと残念なところがあって、本の表紙の絵をみると「1. 基本」から「8. 組織導入」とあるんだけれど、
そのうちの「4. ユーザー調査」「5. 構造化シナリオ」とあるけれど、目次をみるかぎり、4章が構造化シナリオの話で5章がユーザー調査となっている。
おそらく表紙の絵が間違っているかと思う。でもそこくらいしか残念なとこは見当たらなかったくらい良い本だった。
本書の想定読者としてWebデザイナーを第一のペルソナとしているけれども、エンジニアこそ読んでほしい。いやまぁチーム全員が読んでほしいなぁ。できれば全章読んでほしいけど少なくとも1章を読むだけでも価値は十分ある。</p>
<p><a target="_blank" href="https://www.amazon.co.jp/gp/product/4798143332/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4798143332&linkCode=as2&tag=pinekta02-22&linkId=4f02a45c23392bd95598a8e90cb92b43"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&MarketPlace=JP&ASIN=4798143332&ServiceVersion=20070822&ID=AsinImage&WS=1&Format=_SL250_&tag=pinekta02-22" /></a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=pinekta02-22&l=am2&o=9&a=4798143332" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /></p>
『初めてのAnsible』を読んだ
2017-07-14T00:43:12+00:00
https://blog.pinekta.tech/book/2017/07/14/ansible-book
<p>オライリーの『初めてのAnsible』を読んだ。
原題は『Ansible: Up and Running』。<br />
「初めて」はどこから来たのか…。まぁ初心者をターゲットにすると売れるからなぁ。
先日の『Infrastructure as Code』に引き続きインフラ本2つ目。
最近のオライリーのインフラ本は青いね。Docker本も青いし。
てか最近本しか読んでねぇな。オライリーの書評ブログになってるなぁ…子守しながらだと本しか読めない…</p>
<p><img src="/public/image/20170714/ansible-book.jpg" alt="ansible-book" /></p>
<p>本書はタイトルに「初めて」と冠してあるとおり、内容はとてもわかりやすい。<br />
どうAnsibleを使ったらいいのか実践形式で簡単なPlaybookの実行から複雑なPlaybookの実行をとおして教えてくれる。
また、カスタムモジュールの作り方も記載されてあるので、もしモジュールがない場合はここを読むと役に立ちそう。</p>
<p>実践形式であるが故にAnsibleの細部のモジュールまでの詳細な説明はない。そこは公式のドキュメントで補う必要がありそうだ。
とはいえ、イチからPlaybookを作るよりはAnsible GalaxyからPlaybookを取得してそれを参考にしてカスタマイズしていけばいいと思っているのでそこは気にしなくてもよいかな。</p>
<p>VagrantやEC2、Dockerへのプロビジョニングについても詳しく言及していて業務で使うヒントになった。
また、Ansibleには関係ないけどDjangoのアプリケーションをプロビジョニング・デプロイするという項目があり、
Djangoの勉強にもなった。</p>
<p>本の内容は以下のとおり。</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>第1章 イントロダクション
第2章 Playbook: 始めてみよう
第3章 インベントリ: サーバーの記述
第4章 変数とファクト
第5章 Mezzanine の紹介: 本書でのテスト用アプリケーション
第6章 Ansible によるMezzanine のデプロイ
第7章 複雑なPlaybook
第8章 ロール: プレイブックのスケールアップ
第9章 Ansible の高速化
第10章 カスタムモジュール
第11章 Vagrant
第12章 Amazon EC2
第13章 Docker
第14章 Playbook のデバッグ
付録A SSH
付録B デフォルトの設定
付録C EC2クレデンシャルのためのIAMロールの利用
付録D Ansible を利用したプロビジョニング方法
付録E Ansible 2.0
付録F 用語集
付録G 参考文献
</code></pre></div></div>
<p>「初めて」とあるとおり、Ansibleを知らない人が読むと概要がほどよくつかめる本ではあるが、
知っているが読むとあまりAnsibleについての発見は多くはなさそう。
できればAnsibleの各モジュールについての説明・使い方などが載っているとよかった。が、そこは公式マニュアルで保管はできるのでいいのかもしれない。</p>
<p>Ansibleは冪等性を全面的に謳っているが、commandやscriptモジュールを利用した場合は冪等にならないし、
独自のモジュールを開発した際も冪等になるように作成しなければいけない。
つまり、コマンドやシェルスクリプト・独自モジュールなど複雑なプロビジョニングをする際は自前で冪等に実装しなければいけないので、そこはAnsibleの冪等性の落とし穴だと思う。</p>
<p>ただAnsibleはとてもよいツールで自分も前々からウォッチしたり自分でも使っているので、
少しずつ業務にもAnsibleを導入していきたい。</p>
<p><a target="_blank" href="https://www.amazon.co.jp/gp/product/4873117658/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4873117658&linkCode=as2&tag=pinekta02-22&linkId=ba6928b45c8edfdf3fcad97239c9d0ca"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&MarketPlace=JP&ASIN=4873117658&ServiceVersion=20070822&ID=AsinImage&WS=1&Format=_SL250_&tag=pinekta02-22" /></a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=pinekta02-22&l=am2&o=9&a=4873117658" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /></p>
『Infrastructure as Code』を読んだ
2017-07-11T00:40:34+00:00
https://blog.pinekta.tech/book/2017/07/11/infra-stracture-code-book
<p>オライリーの『Infrastructure as Code −クラウドにおけるサーバ管理の原則とプラクティス』を読んだ。
原題は『Infrastructure as Code -Managing Servers in the Cloud』。<br />
この本の内容を簡潔に説明すると、「デプロイパイプラインを整備せよ」「そのためにテストを書け」
という内容に尽きる。</p>
<p><img src="/public/image/20170711/infrastructure_as_code_book.jpg" alt="infrastructure-as-code" /></p>
<p>説明している技術的な要素についてはインフラ界隈をウォッチしていればなんてことはない内容だと思う。
なんてことはないというのはInfrastructure as Codeを構成するもの、たとえばAWSなどのクラウド、Ansibleなどのプロビジョニングツール、Dockerなどのコンテナ、このあたりの情報はなんてことはないものだったけれど、Infrastructure as Codeを実現させるための考え方については非常にためになった。</p>
<p>システムはバグがつきものだし完璧な設計など存在せずフェーズによって設計は変化・進化していくものなので、
バグの修正やシステムの変更を手早くリリースするためにデプロイパイプラインを整備する。<br />
そうすれば変化の激しい昨今の流れについていくことができる。<br />
手作業でサーバーの設定を変更するようなことは、結果的にはバグを埋め込みユーザーへの価値提供が遅くなる。
その結果、変化のペースについていけなくなってしまう。<br />
デプロイパイプラインを整える、ということは継続的に安全・簡単に低コストで変更を加えることができる土台を用意することを意味する。
つまり、Infrastructure as Codeは競争力の原動力となる。</p>
<p>Infrastructure as Code を実践していくには条件があって、
組織的な観点からの条件と、システムの設計・構造からの条件とに分けられる。<br />
まず組織的な面から説明すると、
中央集権的な開発体制や職能分割された組織だと、システム全体にわたる権限がないために
Infrastructure as Code が根付かない。
近年のDevOpsでのチーム体制でこそInfrastructure as Codeは真価を発揮する。<br />
本書で説明してある言葉を借りると</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>「構築するのも運用するのも同じチーム」。「You build it, You run it.」
</code></pre></div></div>
<p>の場合、Infrastructure as Code をチームに根付かせることができる。</p>
<p>システムの設計・構造からの面からだと、
Infrastructure as Code はTDDやXPといったプラクティスと非常に親和性があるので、
それらのプラクティスに則って実践していくとよい。<br />
また、モノリシックなアーキテクチャーではデプロイパイプラインに限界がくるので、
分割してマイクロサービスにすることで、デプロイパイプラインを疎結合にしInfrastructure as Codeをより深化させることができる。
また、継続的にデプロイするために、本番環境へのデプロイを止めてしまうことはよくないので、
機能が完了していなくとも「機能トグル」といった形でどんどんデプロイするべき、としている。</p>
<p>本の内容は以下のとおり。</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>第I部 基礎
第1章 課題と原則
第2章 ダイナミックインフラストラクチャプラットフォーム
第3章 インフラストラクチャ定義ツール
第4章 サーバー構成ツール
第5章 主要なインフラストラクチャサービス
第Ⅱ部 パターン
第6章 サーバーのプロビジョニングのパターン
第7章 サーバーテンプレート管理のパターン
第8章 サーバーのアップデート/変更のパターン
第9章 インフラストラクチャ定義のパターン
第Ⅲ部プラクティス
第10章 インフラストラクチャのためのソフトウェア工学プラクティス
第11章 インフラストラクチャの変更のテスト
第12章 インフラストラクチャの変更管理パイプライン
第13章 インフラストラクチャチームのワークフロー
第14章 継続性とダイナミックインフラストラクチャ
第15章 Infrastructure as Code のための組織
</code></pre></div></div>
<p>技術的な要素についてはとりわけすごいものはないけれど、
Infrastructure as Codeをチームで使うようにするにはどうしたらよいか、という示唆に非常に富んでいる本である。
よい本だった。<br />
今のチームではAMIのテンプレート作成は手作業でやっているので
まずはPackerを使ってテンプレートを作成できないか検討してみようかな。</p>
<p><a target="_blank" href="https://www.amazon.co.jp/gp/product/4873117968/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4873117968&linkCode=as2&tag=pinekta02-22&linkId=cf3acdda65ee867883450630cf8bd6be"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&MarketPlace=JP&ASIN=4873117968&ServiceVersion=20070822&ID=AsinImage&WS=1&Format=_SL250_&tag=pinekta02-22" /></a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=pinekta02-22&l=am2&o=9&a=4873117968" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /></p>
『ゼロから作るDeep Learning』を読んだ
2017-05-09T00:40:34+00:00
https://blog.pinekta.tech/book/2017/05/09/deep-learning-from-scratch
<p>『ゼロから作るDeep Learning』を読んだ。<br />
ライブラリの使用は<code class="language-plaintext highlighter-rouge">numpy</code>と<code class="language-plaintext highlighter-rouge">matplotlib</code>だけに留めスクラッチでDeep Learningのプログラムを作りながらDeep Learningについて学ぶ本。<br />
冒頭で「誰のための本か?」と「誰のための本でないか?」ということを明確にしており、この本を読めば何がわかるのか、わからないものは何か、というのがはっきりしているので読みやすい。<br />
ちなみに本書では<code class="language-plaintext highlighter-rouge">Caffe</code>や<code class="language-plaintext highlighter-rouge">TensorFlow</code>、<code class="language-plaintext highlighter-rouge">Chainer</code>などのディープラーニングのフレームワークの使い方の説明はしないし、自然言語処理や音声認識は扱わない。個人的には音声認識のディープラーニングに興味があるので残念。</p>
<p><img src="/public/image/20170510/deep-learning-from-scratch.jpg" alt="building-machine-learning" /></p>
<p>いろいろ本を読んでようやく機械学習を俯瞰できるようになった。
ここまででわかったのが、やはり一般の人々とAI・人工知能という言葉に対しての認識が違うということ。
ターミネーターのような「強いAI」はまだまだ先の世界であって、局所的にしか考えられない「弱いAI」がほとんど。<br />
一般の人は前者の認識でいて、そこで大きなズレがあるんだろうな。<br />
「AIに仕事が奪われる」とよくメディアが喧伝しているけれど、それはまだ先のような気がする。まぁ、ターミネーターとかそういうのでAI=人類に仇なすみたいな図式が想像されやすいから仕方ないんだろう。</p>
<p>本の内容は以下のとおり。</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>第1章 Python入門
第2章 パーセプトロン
第3章 ニューラルネットワーク
第4章 ニューラルネットワークの学習
第5章 誤差逆伝播法
第6章 学習に関するテクニック
第7章 畳み込みニューラルネットワーク
第8章 ディープラーニング
付録A Softmax-with-Lossレイヤの計算グラフ
</code></pre></div></div>
<p>スクラッチで作るのでPythonを知らない人向けのために第1章のPython入門があるのだろうが、Pythonについて知っているのでこの章を入れるくらいならもっと深い内容を扱う章を入れて欲しかった。まぁ仕方ないか。</p>
<p>特に興味深かったのは第8章で、ディープラーニングの現状とこれからについて説明されている。<br />
しかし、層を深くすることでよい結果が得られるという理由は理論的には解明されていないとのこと。オドロキ。
また、ディープラーニングの実用例もあり面白いし参考になる。
強化学習のところが特に面白かった。Deep Q-Network通称 <strong>DQN</strong> !!! Alpha GOではディープラーニングとDQNを使っているらしい。</p>
<p>業務でディープラーニングを取り入れることを考えたときに少し心配になったのが、マシンスペックである。
macにグラボつけてGPU使った演算は難しそうだし、そうなるとクラウドでハイスペックなマシンを一時的にレンタルするしかないけどそうすると料金が…並列化するにも料金がかかるし…</p>
<p>最近本しか読んでいないからそろそろコードが書きたくなってきた。
でも積ん読も消化しないといけないし…<br />
コード書きつつ本も読みつつマルチプロセスでやるしかないか。</p>
<p><a target="_blank" href="https://www.amazon.co.jp/gp/product/4873117585/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4873117585&linkCode=as2&tag=pinekta02-22&linkId=077e9f2a0aa864396545fffbf94e079e"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&MarketPlace=JP&ASIN=4873117585&ServiceVersion=20070822&ID=AsinImage&WS=1&Format=_SL250_&tag=pinekta02-22" /></a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=pinekta02-22&l=am2&o=9&a=4873117585" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /></p>
「GW」それはゲートウェイと読む
2017-05-07T14:01:11+00:00
https://blog.pinekta.tech/life/2017/05/07/gw
<p>「GW」と書いてあるならそれは「ゲートウェイ」と読む。<br />
プログラマまたはネットワークエンジニアならでは。</p>
<p>今年のGWは前半は仕事をして後半は子どもを連れて帰省した。</p>
<p>GW中に仕事に家族からのブーイングを受けながら仕事。<br />
午前は家族サービス、午後は仕事。<br />
気分的に休みだと頭も休みな感じ。
その分リラックスしてコーディングができるからかえって良かったりする。<br />
窓の外に広がる田んぼも田植えが終わった様子。<br />
のんびりしながらコーディング。よい。</p>
<p><img src="/public/image/20170507/tanbo.jpeg" alt="tanbo" /></p>
<hr />
<p>後半は子どもの顔を親に見せに帰省した。<br />
富山から函館まで飛行機を乗り継いでいった。下の子どもが言うこと聞かない、すぐ逃げる、暴れまわるで大変だった。<br />
SNSに投稿するヒマもないほど。
帰省先でもコーディングしたかったけれども本を読むことで精一杯だった…</p>
<p>北海道ではGWはちょうど桜の見頃。五稜郭公園の桜はきれいだった。</p>
<p><img src="/public/image/20170507/goryokaku_sakura.jpeg" alt="goryokaku_sakura" /></p>
<p>帰省するのはまた来年くらいになるだろうな。<br />
休んでいるときこそアラートが来ると思って身構えていたけれども幸い何もなかった。<br />
やっぱり身構えてるとアラートは来ないんだよな…</p>
『実践 機械学習システム』を読んだ
2017-05-06T13:42:54+00:00
https://blog.pinekta.tech/book/2017/05/06/building-machine-learning
<p>オライリーの『実践 機械学習システム』を読んだ。<br />
内容はこの前読んだ『集合知プログラミング』と似ていて、機械学習ではこんなことができる、ということがいろいろ紹介されている。
もちろん色々紹介されているから中身が薄いというわけではなく十分満足できる内容だった。<br />
でも、もうすでに機械学習をバリバリやっているような人が読んでもふーんで終わるかもしれない。</p>
<p>著者ができるだけ数学や統計学の知識がなくても読めるようにわかりやすく噛み砕いて説明しようと努めているため非常に読みやすい。<br />
本で記載されているコードでは積極的にライブラリを使用している。<br />
『集合知プログラミング』ではアルゴリズムやロジックをコードでわかりやすく説明するというスタンスだったがこの本は文章で説明して実装はscikit-learnなどのすでにあるライブラリを使用するというものになっている。<br />
業務では実際のところ、スクラッチで機械学習部分をコーディングすることはほとんどないのでライブラリを使ったコードになっているのは実用的でありがたい。</p>
<p><img src="/public/image/20170506/building-machine-learning.jpg" alt="building-machine-learning" /></p>
<p>特に読んでいて興味深かったのは「トピックモデル」と「音楽ジャンル分類」のところだった。<br />
トピックモデルに関しては、データ量が多いのをトピック単位でまとめあげて中間的なデータセットとして他の分析にも使えそうだと思った。<br />
音楽ジャンル分類のところでは、scipyでwavファイルを読み込める、というのを知ってびっくりした。<br />
まさか音声ファイルも読み込めるとは…
他にも調べるとnumpy、scipy、scikit-learnは色々できそう。
numpy, scipy, scikit-learnは機械学習のデパートみたいだ。</p>
<p>本の内容は以下のとおり。</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>第1章 Pythonではじめる機械学習
第2章 実例を対象とした分類法入門
第3章 クラスタリング:関連のある文書を見つける
第4章 トピックモデル
第5章 クラス分類:悪い回答を判別する
第6章 クラス分類2:感情分析
第7章 回帰:レコメンド
第8章 回帰:レコメンドの改良
第9章 クラス分類3:音楽ジャンル分類
第10章 コンビュータビジョン:パターン認識
第11章 次元削減
第12章 ビッグデータ
付録 機械学習についてさらに学ぶために
</code></pre></div></div>
<p>11章で次元削減について1章丸ごと使って説明しており、非常にためになった。これはデータセットを作るときに役立ちそう。</p>
<p>最近の機械学習(ディープラーニングは除く)についていろいろ言及していて読んでいて面白いけれど、ひとつだけいらないなーと思ったのが、
12章のAWSの説明の部分はいらなかった。AWSはゴリゴリ触っているのでEC2の説明のところは何をいまさらという感じだったのが残念。</p>
<p>この本を読んで収穫だったのが、機械学習の肝はどんな手法を使うかではなくていかにして良いデータセットをつくるか、ということがわかったことと
、機械学習を利用した新しい何かをするときは流用できそうなまたは参考になりそうな論文をまず探すことということがわかったことである。</p>
<p>次はディープラーニングの本を読もうかな。</p>
<p><a target="_blank" href="https://www.amazon.co.jp/gp/product/4873116988/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4873116988&linkCode=as2&tag=pinekta02-22&linkId=3adb782bfd0f95e40f6cff2f1a15b490"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&MarketPlace=JP&ASIN=4873116988&ServiceVersion=20070822&ID=AsinImage&WS=1&Format=_SL250_&tag=pinekta02-22" /></a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=pinekta02-22&l=am2&o=9&a=4873116988" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /></p>
『集合知プログラミング』を読んだ
2017-05-04T14:12:32+00:00
https://blog.pinekta.tech/book/2017/05/04/programming-collective-intelligence
<p>『集合知プログラミング』を読んだ。<br />
この本が出たのは2008年なので技術書にしては古い。<br />
古いので自分の読みたい本リストに入っていなかったのだが、
けっこういい本という噂を聞いたのと今仕事で機械学習を扱うようになったので知識を深めるためにも読んでみることにした。</p>
<p>実際とてもよい本。<br />
機械学習について知らない人でもわかるように、統計学的な知識や数学の知識がなくても読めるように考えられている。<br />
そして例がわかりやすい。こういう問題があってそれをこう解決したいのでこのアルゴリズムで学習させてよい結果を得られるようにします、という感じで終始進むのですんなり頭に入ってくる。<br />
自分のプロダクトに組み込むならこのアルゴリズムが使えそう、などそういうのが閃いたりした。</p>
<p><img src="/public/image/20170504/programming-collective-intelligence.jpg" alt="programming-collective-intelligence" /></p>
<p>さすがに出た時期が時期なのでディープラーニングなどは扱っていなかったが、
現在の機械学習界隈と比べても違いはディープラーニングがあるかないかぐらいだった。<br />
実際のところ機械学習の分野は進んでいるものと思っていたが違いはそこだけだったので、実際はそれほど進歩的ではないのかもしれない。</p>
<p>ディープラーニングがないものの、それ登場以前の機械学習について包括的に扱っており非常にわかりやすかった。<br />
記載されているコードは誤植が多いらしいのとPython2系なこともあってコード部分はさらっと目を通して参考にするぐらいがちょうど良さそう。
コードを写経するには向いてないかな。</p>
<p>面白いなと思ったことが、本書ではほとんど「機械学習」という言葉が使われていないということだ。<br />
かわりに邦題でもあるとおり「集合知」というワードがよく出ていた。<br />
個人的な所感だが「集合知」という言葉は昨今エンジニア界隈であまり聞かない。<br />
いつからか言葉が「機械学習」に変わっていったのだろうか?</p>
<p>「機械学習」という言葉がバズワードとなってしまって必要以上に機械学習すごいと誤解されている感じを個人的には持っているので、この本の「集合知」という言葉を貫くスタンスはよいと思う。「集合知」を様々な分析手法で分析しその結果をビジネスに活かせ、という姿勢がこの本にはあり、昨今のバズワード化した「機械学習」ではなく手段として「機械学習」を徹頭徹尾扱っているのが好感が持てる。</p>
<p>さて、本の内容は以下のとおり。</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>第1章 集合知への招待
第2章 推薦を行う
第3章 グループを見つけ出す
第4章 検索とランキング
第5章 最適化
第6章 ドキュメントフィルタリング
第7章 決定木によるモデリング
第8章 価格モデルの構築
第9章 高度な分類手法:カーネルメソッドとSVM
第10章 特徴を発見する
第11章 進化する知性
第12章 アルゴリズムのまとめ
付録A サードパーティによるライブラリたち
付録B 数式
付録B 日本語のテキスト処理
</code></pre></div></div>
<p>最終章である「第12章 アルゴリズムのまとめ」は本書で扱っているアルゴリズムのおさらいとなっておりリファレンスとして非常に有用だなと思う。
こういう風に機械学習のロジックは使うのだ、ということを教えてくれるよい本だった。</p>
<p><a target="_blank" href="https://www.amazon.co.jp/gp/product/4873113644/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4873113644&linkCode=as2&tag=pinekta02-22&linkId=8c994f6648b2ce09dfe2687acd09c9e8"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&MarketPlace=JP&ASIN=4873113644&ServiceVersion=20070822&ID=AsinImage&WS=1&Format=_SL250_&tag=pinekta02-22" /></a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=pinekta02-22&l=am2&o=9&a=4873113644" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /></p>
『データ解析のための統計モデリング入門』(通称緑本)を読んだ
2017-04-16T07:30:04+00:00
https://blog.pinekta.tech/book/2017/04/16/statisticsmodelingbook
<p>ようやく緑本を読んだ。<br />
緑本とはデータサイエンティスト界隈で有名な『データ解析のための統計モデリング入門』という本のことである。<br />
この本はデータ解析を学ぶ入門本としてとても評価が高くいつかは読まなければなあと思っていて、仕事でデータ解析のタスクもやることになったのでこれはいい機会だと思って読んでみた。</p>
<p><img src="/public/image/20170428/statisticsmodelingbook.jpg" alt="statisticsmodelingbook" /></p>
<p>難しい…なんて難しいんだ。<br />
平易な文章なので終わりまでさらっと読めるので、読んだだけでできる気になってしまうが内容は入門といえど難しい。<br />
1回読んだだけで理解したと勘違いしてしまったら終わり。<br />
難しいと感じてしまうのはところどころ数学が絡んでおり、行列やら積分やらが出て来るので高校数学を復習した上で再読したほうがよさそう。<br />
そのほうが深い理解に繋がるはず。</p>
<p>なので高校の数学の教科書を引っ張り出した。<br />
もう一度基礎を復習してからこの本を再読することにする。</p>
<p>この本を読み始めたときは、ロジスティック回帰、ランダムフォレスト、エラスティックネットで確度の高い統計モデルを構築しなければ!そのために知識を得なければ!という事情があり必要に迫られてこの本を読んでいたのだが、これらの統計モデリングよりも協調フィルタリングでのレコメンドのほうが今のシステムと相性よさそう、という方向になったため今はこの本で言及しているデータ解析・統計モデリングについての知識がそれほど必要ではなくなったのがちょっと残念と感じている。
ただ、Webシステム以外にデータ解析のところの知識を得ることができたので非常によいことだと思っている。</p>
<p>分析対象のデータに応じてどのような確率分布を選択すればいいか、など非常にためになった。</p>
<p>本の内容は以下となっている。</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>第1章 データを理解するために統計モデルを作る
第2章 確率分布と統計モデルの最尤推定
第3章 一般化線形モデル(GLM) -ポアソン回帰-
第4章 GLMのモデル選択 -AICとモデルの予測の良さ-
第5章 GLMの尤度比検定と検定の非対称性
第6章 GLMの応用範囲をひろげる -ロジスティック回帰など-
第7章 一般化線形混合モデル(GLMM) -個体差のモデリング-
第8章 マルコフ連鎖モンテカルロ(MCMC)法とベイズ統計モデル
第9章 GLMのベイズモデル化と事後分布の推定
第10章 階層ベイズモデル -GLMMのベイズモデル化-
第11章 空間構造のある階層ベイズモデル
</code></pre></div></div>
<p>この本を読んで一番ドキッとしたのは下記の一句である。</p>
<blockquote>
<p>このように「理解しないままソフトウェアを使う」作法を、仮にブラックボックス統計学と呼ぶことにしましょう。これは疑似科学の作法です。</p>
</blockquote>
<p>正直、自分のやっていることをブラックボックス統計学ではないと否定できない。<br />
そのためには知識が肉となるまで学習しなければ。</p>
<p>世間一般のデータサイエンティストはこのくらいは常識なのだろうか?
もしかしたら多数のデータサイエンティストもブラックボックス統計学なのかもしれない。<br />
この本は非常に学べるものが多かったので何度も読み返そうと思う。</p>
<p>最近は新しい分野に挑戦することが多く入門本を読むことが多いなぁ…<br />
でもどれも入門レベルと謳ってるわりには難しいという…</p>
<p><a target="_blank" href="https://www.amazon.co.jp/gp/product/400006973X/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=400006973X&linkCode=as2&tag=pinekta02-22&linkId=b1d4282cc498a369f51099a2b747b4f0"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&MarketPlace=JP&ASIN=400006973X&ServiceVersion=20070822&ID=AsinImage&WS=1&Format=_SL250_&tag=pinekta02-22" /></a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=pinekta02-22&l=am2&o=9&a=400006973X" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /></p>
『Pythonエンジニア養成読本』を再読した
2017-04-16T07:30:04+00:00
https://blog.pinekta.tech/book/2017/04/16/pythonistabook
<p>最近Pythonを触る機会が増えたため、『Pythonエンジニア養成読本』をもう一度読んでみた。</p>
<p>この本はPythonを触ったことがないけれど、別のプログラム言語を触ったことがある、という人が読むべき本だと思う。<br />
おそらく上記を対象読者としているのだろう。
そのためか全体的に内容が浅く、再読したが何も発見はなかった。<br />
(だいたいの本は再読しても何かしらの発見があるのだが…)</p>
<p>ただし、Python触ってみたい、最近のPython界隈はどんな感じなんだろう?、という人は読んでみて損はない本だと思う。<br />
むしろそういう意味ならとてもよい本。</p>
<p>特に第3章は最近のPythonの開発まわりについて記されていてよかった。<br />
(自分は全部知っているので特に発見はなかったが…)</p>
<p>あと第4章のIPython Notebookのところを読んで、自分もIPython Notebookを使いたいと思った。絶対使うと思う。</p>
<p><img src="/public/image/20170416/pythonista_book.jpg" alt="pythonista_book" /></p>
<p>やっぱり内容が浅いのは否めない…<br />
ためになるのもいくつかあるが、どの章も表面をすくっただけのような内容。<br />
Ansibleについて説明された第6章なんでほとんどPython関係ない…AnsibleがPythonで書かれているからこの本に入れてみたというような感じ…<br />
それよりももっと別の記事がよかったな…</p>
<p>本の内容は以下となっている。</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>1章 よくわかるPythonの世界
2章 これだけはしっておきたいPython言語はじめの一歩
3章 開発環境とチーム開発
4章 PyData入門
5章 入門Webアプリケーション開発
6章 環境構築の自動化
</code></pre></div></div>
<p>いろいろ読みたい本はいっぱいあるけれど、次はデータ分析・統計の本になりそう。<br />
積ん読が増えてきた…今6冊の技術書が積ん読状態。</p>
<p>そして次に読む予定の本は積ん読の本ではないという…<br />
たぶん統計の緑本かな。</p>
<p><a target="_blank" href="https://www.amazon.co.jp/gp/product/B00ZR7WZOU/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=B00ZR7WZOU&linkCode=as2&tag=pinekta02-22&linkId=b161def1fe37788291df0fdce93f7063"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&MarketPlace=JP&ASIN=B00ZR7WZOU&ServiceVersion=20070822&ID=AsinImage&WS=1&Format=_SL250_&tag=pinekta02-22" /></a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=pinekta02-22&l=am2&o=9&a=B00ZR7WZOU" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /></p>
『Effective Python』を読んだ
2017-04-15T12:12:04+00:00
https://blog.pinekta.tech/book/2017/04/15/effectivepython
<p>『Effective Python』を読んだ。<br />
メインで扱っている言語がPHPとJavaScriptで、これらのコードの書き方の作法はわかっているがPythonのそれはわかっていない。<br />
Pythonらしい書き方、行儀のよいPythonコードの書き方を学ぶためにこの本を読んだ。</p>
<p>よく、他の言語から入ってきた人が書いたコードで
「あーこれPHPじゃこんなやり方しないよなー。ちょっといけてねーなー」と思うことがよくあり、
自分の書いたPythonコードがそう思われたくない。<br />
Pythonicな書き方を学ぶにはこの本がよい、と風の噂で聞いたので読んでみた。</p>
<p><img src="/public/image/20170415/effective_python.jpg" alt="effective_python" /></p>
<p>中級者・上級者向けの本であるためか、Pythonの文法・基本的な知識がないと読めない本である。<br />
一番自分が知りたかったPythonicな書き方というものは最低限知れたのかなと思う。<br />
最低限というのは、小さい単位でコードを分割したときの場合においてPythonicに書けそうだが、
大規模のコードだとどのようになるのか、どのような書き方がベストなのか、というのがイメージしづらかった。<br />
このへんはDjangoで何かアプリを書いてみて、自分なりに噛み砕きながら理解していくしかなさそう。
Pythonでこの辺を記してある本をさがすか。</p>
<p>さて、この本の感想だが、Pythonを扱うならぜひ読んでおくべき本だと思う。<br />
Pythonicな書き方について1章にわたって解説されている。<br />
この章は必読に値する。</p>
<p>本の内容は以下のとおり。</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>1章 Python流思考(Pythonic Thinking)
2章 関数
3章 クラスと継承
4章 メタクラスと属性
5章 並行性と並列性
6章 組み込みモジュール
7章 協働作業(コラボレーション)
8章 本番運用準備
</code></pre></div></div>
<p>1章はもちろんのこと『2章 関数』『3章 クラスと継承』『4章 メタクラスと属性』『6章 組み込みモジュール』は読み応えがあった。<br />
Pythonの良いところとして、メタクラスやデコレーターを使って既存のクラス・メソッドを変更せずに振る舞いを変えることができるのがとても良いと思っていて、それが4章と6章で言及されていて大変ためになった。</p>
<p>5章はPythonでより速度を出すには、マシンの性能をうまく使うには、ということを処理の並列化によって実現するにあたって注意すべきことが書いてあり、いまのところそれほど性能が求められるようなものを書く予定はないが、今後必ず役に立つと思う。<br />
Pythonのパフォーマンスについては、オライリーから『ハイパフォーマンスPython』や『Cython - Cとの融合によるPythonの高速化』といった書籍がありいつか読んでみたい。</p>
<p><a target="_blank" href="https://www.amazon.co.jp/gp/product/4873117569/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4873117569&linkCode=as2&tag=pinekta02-22&linkId=a0ef74a6850e678f28fe7bb501e8f401"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&MarketPlace=JP&ASIN=4873117569&ServiceVersion=20070822&ID=AsinImage&WS=1&Format=_SL250_&tag=pinekta02-22" /></a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=pinekta02-22&l=am2&o=9&a=4873117569" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /></p>
『入門 Python 3』を読んだ
2017-04-06T14:50:32+00:00
https://blog.pinekta.tech/book/2017/04/06/intropython3
<p>来週から本格的にPythonでデータ分析を始めることになるので、
そのまえにPythonの復習をすることにした。<br />
オライリーの『入門 Python 3』を読んだ。
原題は『Introducing Python』。</p>
<p>対象としている読者は「プログラミング初心者」らしい。<br />
さすがオライリー。こんなん初心者殺しやわ。<br />
オライリーの本で初心者向けというのはだいたいウソ。<br />
別のプログラミング言語をやったことがある人じゃないと30ページくらいで挫折すると思う。</p>
<p><img src="/public/image/20170406/introduction_python3.jpg" alt="introduction_python3" /></p>
<p>中級者以上にとっては、今からPythonを学ぶために読む本としてはとてもよいと思う。</p>
<p>本の内容は以下のとおり。</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>1章 Pyの味
2章 Pyの成分:数値、文字列、変数
3章 Pyの具:リスト、タプル、辞書、集合
4章 Pyの皮:コード構造
5章 Pyの化粧箱:モジュール、パッケージ、プログラム
6章 オブジェクトとクラス
7章 プロのようにデータを操る
8章 データの行き先
9章 ウェブを解きほぐす
10章 システム
11章 並行処理とネットワーク
12章 パイソニスタになろう
付録A Pyアート
付録B ビジネス現場のPy
付録C 科学におけるPy
付録D Python3のインストール
付録E 復習課題の解答
付録F 早見表
</code></pre></div></div>
<p>1章から6章までがPythonの言語についての説明となり、残りの章はライブラリの説明が主となっておりあまり見るべきものはなかった。<br />
付録だけで120ページほどある。全部で567ページあるうちの120ページほどが付録である。
ここまでくると付録ではなくて新たに章立てしたほうがよいのではないかと思うくらいだ。</p>
<p>最近はPythonを長らく書いていないが、Pythonを書いていたときはとてもいい言語だと思っていた。<br />
言語仕様がシンプルで美しい。<br />
そしてスピードも出る。科学計算に強い。Webアプリケーションも書ける。CUIのアプリケーションも書ける。なにより機械学習方面にも強い。<br />
自分の印象だと隙がない言語。</p>
<p>Pythonは内包表記や後置if文とかがとても良い。<br />
ただ、Pythonは抽象クラスはライブラリをインポートしないと使えないし、インターフェースがない。<br />
下位クラスに実装を強制させるような仕組みがない。</p>
<p>また、privateやprotectedといった概念がないし、
constやfinalがない、というところはいただけない。</p>
<p>あとメンバメソッドの第一引数がselfとなるのも若干キモさを感じる。</p>
<p>面白いところは多重継承をサポートしているところ。<br />
けど実装が煩雑になりそうだ。</p>
<p>しかし、Pythonはとても面白い言語ではあると思うので積極的に使っていきたい。<br />
また1章から6章までを読んでみようかな。</p>
<p><a target="_blank" href="https://www.amazon.co.jp/gp/product/4873117380/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4873117380&linkCode=as2&tag=pinekta02-22&linkId=540793ea099253e29fe95682a9829086"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&MarketPlace=JP&ASIN=4873117380&ServiceVersion=20070822&ID=AsinImage&WS=1&Format=_SL250_&tag=pinekta02-22" /></a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=pinekta02-22&l=am2&o=9&a=4873117380" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /></p>
こだわりの作業用音楽
2017-03-25T04:22:54+00:00
https://blog.pinekta.tech/music/2017/03/25/musicforwork
<p>作業開始の合図はTMGEのゲットアップルーシー。<br />
朝からテンションをあげるには最適な曲である。</p>
<p><img src="/public/image/20170325/tmge_playlist.png" alt="tmge_playlist.png" /></p>
<p>全曲TMGEで占められたプレイリストが終わる頃にちょうどよくミーティングが始まる。<br />
リモートワークだと当然ひとりで作業することになるので、自分でモチベートさせていかなければならない。<br />
競技開始前に精神集中または闘争心に火をつけるためにアスリートが音楽を聴くのと似たようなものである。</p>
<p>闘争心だいじ。<br />
TMGEは闘争心に火をつけるのにまさにうってつけ。<br />
(本当は最後のスタジオアルバムの曲を入れたいんだけどCD失くしてしまって聴けない…)<br />
プログラマには闘争心が必要だ。
闘争心を持たずにコードリーディングすると、クソコードというモンスターにやられてしまう…</p>
<p>昼食後はお腹が膨れてテンションが緩むので午後業務開始時には別のプレイリストを聴く。</p>
<p><img src="/public/image/20170325/up_playlist1.png" alt="up_playlist1.png" />
<img src="/public/image/20170325/up_playlist2.png" alt="up_playlist2.png" /></p>
<p>5時間40分もあるプレイリストなので、これらを聴き終わるころには業務が終了している。<br />
これらはテンションがあがるかどうか、の観点で選曲している。<br />
ジャンルはRockが多めだがFusionとかR&B、Electronikaとかもある。</p>
<p>個人的にはRage Against The MachineのWake upとか、Joy DivisionのAtorocity Exhibition、Dinosaur Jr.のLittle Fury Thingsといった絶叫(というか咆哮)があるような曲がとくに好みでテンションあがる。</p>
<p>John FruscianteのI May Again Know Johnとかもよい。<br />
DeepでDopeで破滅的でよい。<br />
これは普通の人が聴いたら気持ち悪さを感じるだろうな。</p>
<p>脳にガツンとくるような音楽を聴きながら仕事するのが性に合っている。<br />
一般的な作業用の音楽だと歌がなく、クラブミュージックのようなリズム主体でメロディが主張しないとものが多いと思う。<br />
エンジニアの作業用音楽だとそういった音楽かアニソンが多いけれど、自分の場合はバンドをやっていたこともあり音楽を聴くと反射的にフレーズを頭でなぞったり展開を追ってしまって集中できなくなってしまう。<br />
そのため頭で考えなくてもよい昔から聴いていたものを聴くようにしている。</p>
<p>リモートワークするにあたって音楽は自分にとってはなくてはならないものである。</p>
<p><a target="_blank" href="https://www.amazon.co.jp/gp/product/B001PM0CGE/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=B001PM0CGE&linkCode=as2&tag=pinekta02-22&linkId=35a1773fb1c63186a6e6ece4acd91cd1"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&MarketPlace=JP&ASIN=B001PM0CGE&ServiceVersion=20070822&ID=AsinImage&WS=1&Format=_SL250_&tag=pinekta02-22" /></a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=pinekta02-22&l=am2&o=9&a=B001PM0CGE" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /></p>
<p><a target="_blank" href="https://www.amazon.co.jp/gp/product/B0000028RR/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=B0000028RR&linkCode=as2&tag=pinekta02-22&linkId=73c491c4ed3fe8b3342d6b6d641bd538"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&MarketPlace=JP&ASIN=B0000028RR&ServiceVersion=20070822&ID=AsinImage&WS=1&Format=_SL250_&tag=pinekta02-22" /></a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=pinekta02-22&l=am2&o=9&a=B0000028RR" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /></p>
<p><a target="_blank" href="https://www.amazon.co.jp/gp/product/B001277M7O/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=B001277M7O&linkCode=as2&tag=pinekta02-22&linkId=d1e9e50d31f71940904083949f681a19"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&MarketPlace=JP&ASIN=B001277M7O&ServiceVersion=20070822&ID=AsinImage&WS=1&Format=_SL250_&tag=pinekta02-22" /></a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=pinekta02-22&l=am2&o=9&a=B001277M7O" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /></p>
<p><a target="_blank" href="https://www.amazon.co.jp/gp/product/B0007M42Z0/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=B0007M42Z0&linkCode=as2&tag=pinekta02-22&linkId=3917acb024df42330966cddff9d8495f"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&MarketPlace=JP&ASIN=B0007M42Z0&ServiceVersion=20070822&ID=AsinImage&WS=1&Format=_SL250_&tag=pinekta02-22" /></a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=pinekta02-22&l=am2&o=9&a=B0007M42Z0" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /></p>
<p><a target="_blank" href="https://www.amazon.co.jp/gp/product/B000005HOF/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=B000005HOF&linkCode=as2&tag=pinekta02-22&linkId=28269dbda4e6401691f71b536eb1bffd"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&MarketPlace=JP&ASIN=B000005HOF&ServiceVersion=20070822&ID=AsinImage&WS=1&Format=_SL250_&tag=pinekta02-22" /></a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=pinekta02-22&l=am2&o=9&a=B000005HOF" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /></p>
エンジニアにとっての資格は技術力のものさしにならないが非エンジニア向けへの証明書にはなる
2017-03-23T10:52:11+00:00
https://blog.pinekta.tech/capabilities/2017/03/23/capabilities
<p>エンジニアにとって資格はあまり意味はない。<br />
IT資格は弁護士免許、医師免許といった業務独占資格ではない。<br />
エンジニアになるのに資格は必要ないのである。</p>
<p>ではどうしてIT資格というものがあるのか。<br />
純粋に技術力を測るものさしの役割を担うのだが、昔ならいざしらず現在ではGitHubやQiitaなどがものさしとしての役割を担っている。<br />
資格が優れたエンジニアということを証明するものではない。</p>
<p>だが、その分野について「勉強した」ということの証明にはなる。<br />
過去勉強したことは今でも役に立っている。</p>
<p>以下は過去取得したものである。</p>
<p><img src="/public/image/20170323/capabilities.jpg" alt="capabilities" /></p>
<p>上段左から</p>
<ul>
<li>PHP準上級技術者</li>
<li>PHP上級技術者</li>
<li>OSS-DB Silver</li>
<li>OSS-DB Gold</li>
<li>HTML5 Level1</li>
<li>HTML5 Level2</li>
<li>Microsoft Certified Professional</li>
</ul>
<p>これらだけをみれば、
PHPでサーバサイドをゴリゴリ書けて、
RDBMSのPostgreSQLが詳しくて、
HTMLもCSSもJavaScriptもゴリゴリ書けて、
Windows Serverも扱える技術者、のよう。<br />
しかし完璧なものさしとはなり得ない。
必ずしも資格があるからと言って現実問題その証明とはならない。
ただし取得のために勉強した、という証明にはなる。</p>
<p>これらを取得にむけてどう勉強したかについては、少しは需要があると思うので別の記事で解説する予定。</p>
<p>さて、<br />
資格は技術力のものさしでないとわかっていながら
IT資格を取得したのは理由がある。</p>
<p>エンジニアがエンジニアの技術力を測るにはコードを見ればわかるけれど、<br />
非エンジニアはコードを読めないので、成果物の印象でしか技術力を測れない。</p>
<p>前職ではエンジニアが正当に評価されない仕組みになっていた。<br />
新しい技術的な提案をしても却下されることがよくあった。</p>
<p>技術力の担保となる資格を取得することで、提案もとおるようになった。<br />
<strong>技術的な提案をエンジニア以外に展開する場合は資格はときには有効になりうる。</strong></p>
<p>また資格の勉強をしたことでより知識が身につくというのもよい。
次はAWSの資格をとろうかと考えているが、他に勉強することもあるので迷う。<br />
資格の勉強するよりかはオープンソースに貢献すべきかとも思っているし、データサイエンスも勉強したい。<br />
まぁたぶんAWSの資格はしばらく後回しかな。AWSの資格なくてもAWSは扱えているしAWSまわりの改善の提案もとおるし。</p>
<p>そもそもエンジニアは勉強しなきゃいけないことが多い。<br />
技術の他にもWebマーケティングやビジネスのことまでいっぱいだ。<br />
なので各々の専門性を生かしお互いを補完しあうようなチームにするとうまくいく。</p>
<p>もっと技術書を読む時間・業務以外でコードを書く時間がほしいなぁ。<br />
寝る時間を削るか?<br />
そうすると業務時間中眠くなるしなぁ。むずかしい。</p>
田舎でリモートワーク
2017-03-20T05:34:48+00:00
https://blog.pinekta.tech/remotework/2017/03/20/country
<p>田舎はよい。</p>
<p>空気がうまい。<br />
水がうまい。<br />
米がうまい。<br />
野菜がうまい。<br />
人混みがない。<br />
星空がきれい。</p>
<p>田舎なので小洒落た格好をする必要もない。<br />
田舎なので電車に乗らなくてもよい。</p>
<p>こんな田舎に住んでいる。</p>
<p><img src="/public/image/20170320/country1.jpg" alt="country1" /></p>
<p>仕事部屋の窓からの景色。</p>
<p>初秋の稲の刈り取り前はこんな感じ。<br />
黄金色の絨毯みたい。</p>
<p><img src="/public/image/20170320/country2.jpg" alt="country2" /></p>
<p>こちらは別の方角の景色。<br />
一応田舎だけれども方角によっては近くに住宅街はある。</p>
<p><img src="/public/image/20170320/country3.jpg" alt="country3" /></p>
<p>春にとった画像。<br />
山が見える。<br />
遮る建物はほとんどない。</p>
<p><img src="/public/image/20170320/country_landscape.jpg" alt="country_landscape" /></p>
<p>山からとった画像。<br />
田んぼばっかり。<br />
そして田んぼの中にぽつぽつと家があるのがわかる。</p>
<p>富山県砺波市というところに住んでいるのだが、<br />
ここは「散居村」としても有名で、日本の散居村としては日本国内最大とされている。</p>
<p>近くには世界遺産もある。</p>
<p><img src="/public/image/20170320/traditional_village.jpg" alt="traditional_village" /></p>
<p>家から車で40分ほどの深い山間にある「相倉合掌集落」である。</p>
<hr />
<p>田舎といっても、砺波市はとてもいいところで街に行きたければ、車で40分ほど走れば金沢市や富山市にもいける。<br />
車で30分もかからないところに、三井アウトレットパークもあればイオンもある。</p>
<p>とてもよいところである。<br />
動物も多い。<br />
蛙はたくさんいるし、蛇も納屋にいたし、雉もよく見かける。庭にはもぐら塚があることも。
納屋でねずみも見たし、夜はコウモリがでる。</p>
<p>こんなのんびりしたところで仕事をしていると気が抜けそうだがそうでもない。<br />
日々、目標を追い四苦八苦していると家の外に出ないことも多い。<br />
ひどいときは月曜から金曜まで家の外に出ない、ということもある。</p>
<p>田舎で仕事しているからといってゆったり仕事ができるとは限らない。<br />
ゆったり仕事するよりは気張ってプログラム書く方がよい。</p>
<p>のんびりとした田舎で気張ってリモートワークするのは性に合っていると思う。</p>
自宅開発環境について
2017-03-18T13:02:16+00:00
https://blog.pinekta.tech/remotework/2017/03/18/devenvironment
<p>リモートワークをしているので、
当然、会社で仕事をすることはほとんどない。
「ノマドワーキング」という言葉がようやく一般的になったかと思うが、自分の場合は外で作業することはなくほぼ自宅の自分の机で作業している。<br />
座り慣れた椅子と複数のディスプレイ、使い慣れたキーボードがないと作業効率が落ちてしまう(気がする)。<br />
リモートワークのよいところは作業効率の改善のためにいろいろ工夫できることである。</p>
<p>いろいろ工夫した結果、現在以下のような環境で作業している。</p>
<p><img src="/public/image/20170318/desk1.jpg" alt="desk1" /></p>
<p>上の画像じゃわかりづらいかもしれないが、
21インチのディスプレイ2枚と16インチのディスプレイ1枚+MacBookProのディスプレイ1枚の4枚。<br />
タブレット端末のディスプレイもあわせると5枚もある。<br />
人によってはこんなにディスプレイはいらないかもしれないが、個人的にはディスプレイは最低2枚、できれば3枚は欲しい。</p>
<p>基本的に正面の2枚をMacBookProに繋げている。<br />
右側がメインのディスプレイでブラウザ(Chrome)とエディタ(VS Code)を置いておく。<br />
左側のディスプレイにはターミナル(iTerm)、Slackがあり、一番右のMacBookProのディスプレイはメーラーとappear.inを表示している。<br />
<em>※画像では個人情報保護のためデスクトップ画像を表示しています。</em></p>
<p><img src="/public/image/20170318/desk2.jpg" alt="desk2" /></p>
<p>MacBookProはノートPC用のスタンドの上においておく。
配線の取り回しがよくなるのと、視線が上がっていい感じ。</p>
<p>タブレット(Android5.1のNexus 2012)には、チームのKPIダッシュボードを常に表示している。<br />
数字を常に意識することになるのでとてもよい。<br />
<em>※画像では個人情報保護のためデスクトップ画像を表示しています。</em></p>
<p><img src="/public/image/20170318/desk3.jpg" alt="desk3" /></p>
<p>右上部のディスプレイはMacではなく自作のWindows機に繋げている。<br />
これはLINEとiTunesとブラウザ(Chrome)を表示させている。<br />
※画像では個人情報保護のためデスクトップ画像を表示しています。</p>
<p>非エンジニアとのやりとりでLINEを使っており、MacでLINEを起動していると、
通知に気づかないことが多いため、Windows機でLINEを確認している。</p>
<p>たまにMacではなくてWindows機でテストしなければいけないこともあるのだが、
リモートだとこういうときに気軽にスイッチしてテストできるからよい。</p>
<p>Windows機にはBluetoothのキーボードを接続している。<br />
LINEで返信する際や、Windowsでのテストをする場合に使っている。<br />
有線じゃないので取り回しがきくので机の上がスッキリする。</p>
<p>Macに接続しているキーボードはHHKB Lite2 For Macで、これじゃないと10%は能率が落ちるかもしれない。</p>
<p><img src="/public/image/20170318/keyboard.jpg" alt="keyboard" /></p>
<p>というのはブラウザもVS CodeもキーバインドをVimにしており、Escキーを非常に多用する。<br />
Escではなくて<code class="language-plaintext highlighter-rouge">Ctrl + [</code>でいいじゃん!と思う方もいるだろうが、Escキーに慣れてしまっており、
左手の小指でEscをすぐ叩けるか、ということを考えるとHHKBはとてもよい選択肢のひとつ。
Escの位置を重要視しており、Lite2のキータッチに不満があるわけではないので、高いHHKBである必要がないので、Lite2 for Macを利用している。<br />
個人的にはLiteでも十分にタイピングしやすい。</p>
<p>あと、みえるところに会社の社是のポスターを置いている。<br />
家で作業しているとどうしても帰属意識が薄れてしまいがち。<br />
それを強制的に自覚することになるし、社是自体も個人的にはとても共感できるものだと思っているので常に目にするようにしている。<br />
ふとしたときに視線をあげると壁に貼った社是が、<br />
ミスって顔を伏せると、デスクマットと机の間に挟んだ社是が、それぞれ目にすることができる。</p>
<p>しばらくはこの環境のままだとは思うが変更があったらブログで報告したいと思う。</p>
<p><a target="_blank" href="https://www.amazon.co.jp/gp/product/B000MTELLI/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=B000MTELLI&linkCode=as2&tag=pinekta02-22&linkId=5cd3d00700f3d1c85e0c81e73aec180b"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&MarketPlace=JP&ASIN=B000MTELLI&ServiceVersion=20070822&ID=AsinImage&WS=1&Format=_SL250_&tag=pinekta02-22" /></a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=pinekta02-22&l=am2&o=9&a=B000MTELLI" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /></p>
リモートワークにおけるテキストでのコミュニケーション
2017-03-16T14:12:34+00:00
https://blog.pinekta.tech/remotework/2017/03/16/remotework
<p>リモートワークを開始して2ヶ月が経とうとしている。</p>
<p>リモートワークは難しい。<br />
やはりコミュニケーションコストがかかってしまうのは否めない。<br />
ただ、難しいが工夫次第でいくらでも改良は可能だと今のところは思っている。</p>
<p>テキストのやりとり限定だが、
リモートでもコミュニケーションをうまく取るために、以下のことを心がけている。</p>
<ul>
<li>テキストはやわらかく。なるべく絵文字を使う。</li>
<li>用がなくてもつぶやく。</li>
<li>文章にできるだけ情報を詰める。</li>
<li>抽象的なことはつぶやかない。具体的なことをつぶやく。</li>
<li>あえて行間を読まない。</li>
<li>言葉の選択を間違ってもくよくよしない。</li>
</ul>
<p>以下、ひとつずつ説明する。</p>
<h2 id="テキストはやわらかくなるべく絵文字を使う">テキストはやわらかく。なるべく絵文字を使う</h2>
<p>テキスト中心のコミュニケーションの場合、
ほんとにテキストだけだと、文章からは感情が伝わらずかなり冷淡な文章になってしまう。</p>
<p>絵文字・顔文字があると、
文章にフランクな印象を与えることができる。<br />
同じ言葉でも絵文字・顔文字があるだけでだいぶ印象が違う。</p>
<p>事実だけをやりとりするような場合は、絵文字・顔文字を使用しなくてもいいのだが、
一緒に仕事をして目標を追うとなると、冷淡な印象になってしまうのはまずい。<br />
ましてや相手にいらぬ誤解を与えるかもしれない。</p>
<p><a href="http://cast-er.com/remo/mood/">この記事</a> にもあるとおり、
絵文字・顔文字を使うとチャットの雰囲気が明るくなる。<br />
また「会話しやすい雰囲気」ができるのもミソ。</p>
<p>絵文字はSlackだけではなくGitHubやRedmineでも使うことができる。
Redmineはプラグインを入れる必要があるが、GitHubは何もしなくても使える。</p>
<h2 id="用がなくてもつぶやく">用がなくてもつぶやく</h2>
<p>リモートで仕事をしていると、
仕事しているかみんなはわからないので仕事しているアピールor生存確認のためにつぶやいている。<br />
要するにpingされなくてもセンターサーバにpingのリプライを自発的にやっているようなものだ。</p>
<p>また、困っていることをつぶやけばすぐに優秀なチームメンバが解決してくれる、というメリットもある。</p>
<h2 id="文章にできるだけ情報を詰める">文章にできるだけ情報を詰める</h2>
<p>テキストだけでわかるようにできるだけ情報を詰める。<br />
それでもコミュニケーションロスしそうな場合は大人しくappear.inを使って対面で話して解決する。</p>
<h2 id="抽象的なことはつぶやかない具体的なことをつぶやく">抽象的なことはつぶやかない。具体的なことをつぶやく</h2>
<p>テキスト中心のやりとりの問題の一つで、
抽象的なメッセージは具体性を欠くため、メッセージを受け取った人が邪推してしまう可能性がある。<br />
邪推させてしまうと疑心暗鬼につながってチームの機能不全を引き起こしてしまう。</p>
<p>なので、受け手がいろいろな解釈ができそうな表現は避ける。<br />
具体的に、はっきりと文章を書く。</p>
<h2 id="あえて行間を読まない">あえて行間を読まない</h2>
<p>抽象的なことをつぶやかないのと目的はほとんど同じ。<br />
他の人たちのメッセージの行間を必要以上に読んでしまうと、全てが自分に対する批判のように見えてしまう。<br />
リモートワークでは、見えない敵とつい戦いがちである。<br />
自分への明確な批判については金言だが、全てを自分への金言として考えてしまうと不要な重荷を背負うだけ。</p>
<p>基本的には、自分を信頼しているものだと信じ、
自分もみんなを信頼しよう。
そのほうが集中できる。</p>
<h2 id="言葉の選択を間違ってもくよくよしない">言葉の選択を間違ってもくよくよしない</h2>
<p>テキストでのやりとりが中心になるので、誤解されないよう言葉の選択に非常に気を使っている。<br />
しかしときには時間的な制約のために中途半端な文章だったり、わけわからない文章だったり、邪推されかねない文章だったりするときがある。<br />
そういう場合はあとで後悔するのだが、そこはくよくよしてもしょうがない。<br />
ひどい時には日本語がそもそも間違っているという場合があり、穴に入りたくなるときもある。</p>
<p>そんなときは発想を変えよう。<br />
日本語すら不自由してしまうアホであることのアピールになったとする。<br />
それはそれでよい。<br />
「自分がよく見られたい」という気持ちは邪魔だ。
むしろそういうことを気にしなくなり、本当にやりたいことに集中できるようになる。</p>
<h1 id="まとめ">まとめ</h1>
<p>リモートワークは難しいけれど、できないことはない。<br />
コミュニケーションについて多少の問題はあるが、<br />
個人的にはメリットのほうが多いと思っている。</p>
『データサイエンティスト養成読本 機械学習入門編』を再読した
2017-03-12T13:11:13+00:00
https://blog.pinekta.tech/book/2017/03/12/datasciencebook2
<p>データサイエンス、機械学習について復習のため、<br />
過去に読んだ『データサイエンティスト養成読本 機械学習入門編』をもう一度読んだ。</p>
<p><img src="/public/image/20170312/datascience.jpg" alt="datascience" width="350" /></p>
<p>この本は、データサイエンス・機械学習ではじめに読む本としてはとてもいいと思う。<br />
内容も平易で文章も読みやすい。<br />
機械学習はこういうものです、というのをわかりやすく教えてくれる。</p>
<p>前半はデータサイエンス・機械学習の概要から基礎、理論、それらのユースケースについてわかりやすく説明されている。<br />
後半はライブラリを使った実践となっている。</p>
<p>後半部分はエンジニアじゃないと読んでもしょうがない内容だと思うが、
前半部分は非エンジニアにも読んでもらいたい内容だった。<br />
ビジネスにどう統計的手法・機械学習が使えるかヒントを与えてくれる。</p>
<p>出版されたのが、2015年10月ということで最新の内容ではない。<br />
例えば、TensorFlowについては言及されていない。<br />
しかし、前半部分の機械学習についての説明は今も大枠は変わらないので、何を読んだらわからないという方はこれを読んでみるのもいいかもしれない。</p>
<p>ふたつ残念だと感じる点があった。<br />
ひとつはディープラーニングについての実践についての内容が乏しいことである。<br />
ディープラーニングの隆盛で昨今の機械学習ブームが訪れたにも関わらず、理論的な説明に終始してばかりで、<br />
Chainerなどを使ってディープラーニングなどといった、もっと実践的な内容に触れてほしかった。</p>
<p>もうひとつは、最後の特集のJubatusはあまり面白くなかった。<br />
オンラインでやれることは魅力的ではあるが、やれることも限られているし(現在はどうかわからないが)、<br />
何より宣伝の匂いを感じてしまう…</p>
<p>ただ、これらを差し引いてもこの本はいい本だと思う。
先日読んだオライリーの『ゼロからはじめるデータサイエンス』よりわかりやすい。<br />
というのは数学的知識が先にあげた本よりは必要とされないからかもしれない。<br />
いずれにせよ、この分野を学ぶなら数学・統計の知識は必須だが…</p>
<p>本の内容は以下のとおり。</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>第1部 しくみと概要を学ぼう
特集1 機械学習を使いたい人のための入門講座
第1章 機械学習の概要
第2章 機械学習の歴史と今後の応用例
第3章 データサイエンティストのための機械学習
第4章 Q&Aとまとめ
特集2 機械学習の基礎知識
第1章 機械学習の問題設定
第2章 教師あり学習
第3章 教師なし学習
第4章 応用
特集3 ビジネスに導入する機会学習
第1章 ビジネスデータのクラスタリング
第2章 予測モデルの構築
特集4 深層学習最前線
第1章 準備
第2章 多層パーセプトロンの書き方
第3章 ニューラルネットの学習方法
第4章 画像認識のためのアーキテクチャ
第2部 手を動かして学ぼう
特集1 機械学習ソフトウェアの概観
第1章 開発が進む機械学習のソフトウェア
第2章 機械学習のソフトウェアを用いた実行例
第3章 機械学習ソフトウェア選択の指針
特集2 Pythonによる機械学習入門
第1章 イントロダクション
第2章 Numpy, Scipy, matplotlibの基礎
第3章 scikit-learn入門
特集3 推薦システム入門
第1章 推薦システムのキホン
第2章 推薦システムを作る
第3章 推薦システムの高度化
第4章 良い推薦システムを作るために
特集4 Pythonで画像認識にチャレンジ
第1章 画像認識とは?
第2章 準備
第3章 シンプルな画像認識を実装
第4章 猫顔検出に挑戦
特集5 Jubatusによる異常検知
第1章 はじめに
第2章 アーキテクチャ
第3章 テストデータからの異常検知
第4章 サーバログからの異常検知
</code></pre></div></div>
<p>これでデータサイエンス・機械学習の基本的な知識は身につけたから次は数学・統計を学びつつ実践していこうかと思う。</p>
<p><a target="_blank" href="https://www.amazon.co.jp/gp/product/4774176311/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4774176311&linkCode=as2&tag=pinekta02-22&linkId=66693378ed127837bade9c4b55b7843a"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&MarketPlace=JP&ASIN=4774176311&ServiceVersion=20070822&ID=AsinImage&WS=1&Format=_SL250_&tag=pinekta02-22" /></a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=pinekta02-22&l=am2&o=9&a=4774176311" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /></p>
『ゼロからはじめるデータサイエンス』を読んだ
2017-03-06T13:45:19+00:00
https://blog.pinekta.tech/book/2017/03/06/datasciencebook
<p>データサイエンス、機械学習の勉強のために『ゼロからはじめるデータサイエンス』を読んだ。</p>
<p><img src="/public/image/20170306/datascience.jpg" alt="datascience" width="350" /></p>
<p>本書の構成を大きく分けると、1章から11章まではデータサイエンスの土台となる基礎部分について、
12章から22章までは応用、23と24はRDBとMapReduceの説明になっている。</p>
<p>読み進めるとわかるが、各章の内容が浅い…
わずかばかりの用語説明とPythonのコードがあるのみで、あとは各自調べてね、というスタンス。<br />
数学に関する章も多く、途中から高校の教科書を引っ張り出したくらいだ。</p>
<p>Amazonのレビューの評価が低いのもうなづける。<br />
この本だけでデータサイエンスを学ぼうとしているならやめたほうがいい。</p>
<p>これを読むと、データサイエンスという分野が
本一冊で十分に学べるほどではないことがわかる。</p>
<p>これからデータサイエンスを学ぶ足がかりとして読むならいいかもしれない。
データサイエンスについて今後学んでいくにあたって、
どのようなものを学んだらいいかのあたりはつけることができた。</p>
<p>まずは数学の基礎から身につけなくてはいけない。高校の数学から学び直そう。<br />
そうじゃないとわからない…</p>
<p>本の内容は以下のとおり。</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>はじめに
1章 イントロダクション
2章 Python速習コース
3章 データの可視化
4章 線形代数
5章 統計
6章 確率
7章 仮説と推定
8章 勾配下降法
9章 データの取得
10章 データの操作
11章 機械学習
12章 k近傍法
13章 ナイーブベイズ
14章 単純な線形回帰
15章 重回帰分析
16章 ロジスティック回帰
17章 決定木
18章 ニューラルネットワーク
19章 クラスタリング
20章 自然言語処理
21章 ネットワーク分析
22章 リコメンドシステム
23章 データベースとSQL
24章 MapReduce
25章 前進しよう、データサイエンティストとして
付録A 日本語に関する補足
</code></pre></div></div>
<p>先に述べたとおり、どの章も話が浅い。<br />
また、Pythonのコードもスクラッチで書いており、この分野では使用することが当たり前の<code class="language-plaintext highlighter-rouge">Pandas</code>や<code class="language-plaintext highlighter-rouge">NumPy</code>、<code class="language-plaintext highlighter-rouge">scikit-learn</code>といったライブラリを使ったコードではない…<br />
原題が『Data Science from Scratch』とあるとおりしょうがないんだが。</p>
<p>今後、どういうことを学べばいいか、それを確認するための本としてはよかったと思う。</p>
<p><a target="_blank" href="https://www.amazon.co.jp/gp/product/4873117860/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4873117860&linkCode=as2&tag=pinekta02-22&linkId=123b65bb2eeec3f56fa0f03a96fed297"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&MarketPlace=JP&ASIN=4873117860&ServiceVersion=20070822&ID=AsinImage&WS=1&Format=_SL250_&tag=pinekta02-22" /></a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=pinekta02-22&l=am2&o=9&a=4873117860" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /></p>
Route53とCloudFrontで独自ドメインのGitHub PagesをHTTPS化した
2017-02-21T14:10:42+00:00
https://blog.pinekta.tech/aws/2017/02/21/sslchange
<p>タイトルのとおりHTTPS化した。<br />
さすがにいまどきのページでHTTPSにしてないページはどうかと思う。<br />
<a href="https://letsencrypt.org/">Let’s Encrypt</a> などの無料でSSL証明書を取得できるサービスも出てきたのに、平文でやりとりするのはよくない。</p>
<p>今回はCloudFrontを利用するので、SSL証明書をAmazon Certificate Manager(ACM)で <strong>無料で利用できる。</strong><br />
しかも <strong>更新は自動だ!</strong></p>
<p>今回の作業するにあたって以下の記事が参考になった。<br />
<a href="http://qiita.com/kechol/items/9609e1ab4a673e05b613">Github Pagesでホスティングしつつ、CloudFrontを使ってサイトをSSL対応の独自ドメインにする</a></p>
<p>しかし、ここで問題が発生。</p>
<h2 id="問題">問題</h2>
<p>ACMはドメイン認証の証明書を発行するのだが、ドメイン認証をするためのドメインでメールを受信できる必要があるとのこと。<br />
つまり、<code class="language-plaintext highlighter-rouge">pinekta.tech</code>ドメインでメールを受信できるよう、メールサーバを立てなければならない…
おぉ、めんどくせー。<br />
仕方ないのでEC2のインスタンスにメールサーバを構築する。</p>
<p>ついでに証明書の更新がエラーになっていたLet’s Encryptも確認する。</p>
<h2 id="lets-encryptの更新">Let’s Encryptの更新</h2>
<p>Let’ Encryptは簡単にSSL証明書の更新ができる。<br />
コマンドを実行して更新をトライしたところ</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>./certbot-auto renew --force-renew && service httpd reload
Error: couldn't get currently installed version for /root/.local/share/letsencrypt/bin/letsencrypt:
Traceback (most recent call last):
File "/root/.local/share/letsencrypt/bin/letsencrypt", line 7, in <module>
from certbot.main import main
File "/root/.local/share/letsencrypt/local/lib/python2.7/dist-packages/certbot/main.py", line 11, in <module>
import zope.component
File "/root/.local/share/letsencrypt/local/lib/python2.7/dist-packages/zope/component/__init__.py", line 16, in <module>
from zope.interface import Interface
ImportError: No module named interface
</code></pre></div></div>
<p>エラー…</p>
<p>以下のページを参考にして解決。<br />
<a href="https://blog.yskw.info/articles/326/">Amazon Linux 上の Let’s Encrypt で証明書更新エラーが出た時の対処方法</a></p>
<h2 id="メールサーバの構築">メールサーバの構築</h2>
<p>おなじみの(自分にとっては)PostfixとDovecotを入れます。</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># yum -y install postfix dovecot
</code></pre></div></div>
<p>基本的には以下の記事と同じように設定します。</p>
<p><a href="http://qiita.com/shohohoh/items/05b0a3a5d6e6df8f34a8">Amazon Linux on EC2にPostfix+Dovecotでメールサーバー構築</a></p>
<p>設定したのち、テストでメールを送信するも送信がうまく行かない…<br />
EC2インスタンスのセキュリティグループで22と80と443しか開けていないことを思い出し、セキュリティグループを変更してポートを開ける。<br />
SMTP, SMTPS, POP3, POP3S, IMTP, IMTPSといったこれらのポートを開けておく。</p>
<p>そしてACMの画面から申請すると、構築したメールサーバにメールが配信されるので、メールクライアントでメールを受信し、AmazonからのACMの認証のリンクを実行し、証明書を有効化する。</p>
<p>ただ、ACMから配信されるメールアドレスはAWSが以下のようなアドレスを決め打ちで送信する。</p>
<ul>
<li>administrator@your_domain</li>
<li>admin@your_domain</li>
<li>hostmaster@your_domain</li>
<li>postmaster@your_domain</li>
<li>webmaster@your_domain</li>
</ul>
<p>メールのエイリアス設定を変更して、pinektaユーザで受信できるよう変更。</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># vim /etc/aliases
-----------
postmaster: pinekta
</code></pre></div></div>
<p>上記、rootからpinektaに変更し、</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># newaliases
</code></pre></div></div>
<p>で反映して、<code class="language-plaintext highlighter-rouge">pinekta@pinekta.tech</code> のメールアドレスで <code class="language-plaintext highlighter-rouge">postmaster@pinekta.tech</code> 宛てのメールを受信できるようにした。</p>
<p>以下のメールが届いたので、URLをクリックして証明書を有効化する。</p>
<p><img src="/public/image/20170221/acm_mail.png" alt="ACMのメール" />
<img src="/public/image/20170221/acm.png" alt="ACM" /></p>
<h2 id="cloudfrontの設定">CloudFrontの設定</h2>
<p>HTTPSで配信したいため、ACMで証明書を取得する。<br />
よくある下記の罠に注意!<br />
<strong>CloudFrontでACMの証明書を使う場合、リージョンはアメリカバージニア北部(us-east-1)で証明書を作成すること</strong></p>
<p>CloudFrontのディストリビューションを作成し、ドメインを指定しACMで作成した証明書を選択する。そしてOKを押していくとCloudFrontにデータが追加される。<br />
注意するのは、CloudFrontのOriginal Domainは[ユーザ名].github.ioを指定すること。</p>
<p>結果的に以下の値で作成。</p>
<p>ディストリビューションの設定
<img src="/public/image/20170221/cf_distribution1.png" alt="ディストリビューションの設定1" />
<img src="/public/image/20170221/cf_distribution2.png" alt="ディストリビューションの設定2" /></p>
<p>Originの設定
<img src="/public/image/20170221/cf_origin.png" alt="originの設定" /></p>
<p>Behaviorの設定
<img src="/public/image/20170221/cf_behavior1.png" alt="Behaviorの設定1" />
<img src="/public/image/20170221/cf_behavior2.png" alt="Behaviorの設定2" /></p>
<h2 id="route53の設定">Route53の設定</h2>
<p>Route53に設定したblog.pinekta.techのAレコードはGitHub PagesのIPを指定していたが、作成したCloudFrontのDomain NameをAレコードのAliasとして更新する。</p>
<p><img src="/public/image/20170221/route53.png" alt="route53の設定" /></p>
<h2 id="cnameファイルの削除">CNAMEファイルの削除</h2>
<p>あと、GitHub PagesのCNAMEファイルを削除すること。<br />
プロジェクトディレクトリ直下にあるCNAMEファイルを削除し、commitしてpush。</p>
<h1 id="https化">HTTPS化</h1>
<p><code class="language-plaintext highlighter-rouge">http://blog.pinekta.tech</code> にアクセスすると</p>
<p><img src="/public/image/20170221/https1.png" alt="https1" />
<img src="/public/image/20170221/https2.png" alt="https2" /></p>
<p>やった!<br />
httpsにリダイレクトされているし、証明書も問題ない。</p>
<p>これで普通にblogを運用できる環境になったかな。</p>
DNSをRoute53に移行した
2017-02-20T11:53:12+00:00
https://blog.pinekta.tech/aws/2017/02/20/dnsmigration
<p>いま使っているドメインである、<code class="language-plaintext highlighter-rouge">pinekta.tech</code> のDNSはお名前.comのDNSを使っている。<br />
勉強のためにAWS Route53にDNSを移行する。<br />
別にお名前.comに不満があるわけではない。DNSは無料で使えている。<br />
Route53は無料枠はないようだが、<a href="https://www.lancork.net/2014/05/amazon-route53-monthly-cost/">このサイト</a>によると月額64円と安い。<br />
64円ならRoute53にしてみよう。</p>
<p>移行の手順は以下が参考になる。<br />
<a href="http://dev.classmethod.jp/cloud/aws/onamae-to-route53/">お名前.comからAmazon Route 53へドメインを移管する</a><br />
ドメインの取得したてや、移管したばかり、また期限切れのものはRoute53に移管できないとのこと。</p>
<ol>
<li>Route53にドメインを登録する。</li>
<li>登録したドメインにDNSレコードを追加する</li>
<li>お名前.comでドメインのアンロック、プライバシー保護の無効、authorization codeの取得、を行う</li>
<li>ここで問題が発生…</li>
</ol>
<h2 id="問題">問題</h2>
<p>ドメインを移管しようとしたら、な、なんと!</p>
<p><img src="/public/image/20170220/transfer.png" alt="Route53 transfer" /></p>
<p><strong>Route53はTLDが.techのものは対応していなかったんだよ!</strong><br />
<strong>な、なんだってー!</strong></p>
<h2 id="なぜドメインを移管しようとしたかったのか">なぜドメインを移管しようとしたかったのか</h2>
<p>それは、本ブログはGitHub Pagesを使っているのだが、独自ドメインを使用した場合にそのままではhttpsで通信できないため、Route53とCloudFrontを利用してhttpsにしたかったからである。<br />
あと、AWSの勉強も兼ねてである。<br />
仕方ないのでCloudFlareを使うことにする。<br />
(後述するがCloudFlareは使わなくてもよいがこの時点で気づいていなかった。)</p>
<h2 id="cloudflare">CloudFlare</h2>
<p><img src="/public/image/20170220/cloudflare.png" alt="CloudFlare" width="600" /></p>
<p>トップページにいくと、メールアドレスとパスワードの入力欄があるので入力すると、ドメインの入力が求められる。<br />
ドメインを入力すると、DNSレコードの検索がウラで行われている間CloudFlareのサービスについての動画を無条件に見せられる。<br />
動画が終わったあと、DNSレコードの確認が求められるのでOKを押すと、CloudFlareのネームサーバが表示されるのでそれらをメモしておく</p>
<h2 id="route53">Route53</h2>
<p>ここまでやって思ったが、そもそも
Route53のネームサーバをお名前.comで指定すればよかったことに気づく。<br />
CloudFlareに設定したWebSite情報を削除する…
そして、Route53にドメインのレコードを登録し、Route53のNSレコードでお名前.comのネームサーバを更新させる。</p>
<h2 id="疎通確認">疎通確認</h2>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>➜ ~ dig blog.pinekta.tech
; <<>> DiG 9.8.3-P1 <<>> blog.pinekta.tech
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 42509
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;blog.pinekta.tech. IN A
;; ANSWER SECTION:
blog.pinekta.tech. 300 IN A 192.30.252.153
blog.pinekta.tech. 300 IN A 192.30.252.154
;; Query time: 195 msec
;; SERVER: 192.168.0.1#53(192.168.0.1)
;; WHEN: Tue Mar 7 09:08:51 2017
;; MSG SIZE rcvd: 67
</code></pre></div></div>
<p>名前が解決できるようになった。</p>
<p>ネームサーバもRoute53のものになっている。</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>➜ ~ dig pinekta.tech ns
; <<>> DiG 9.8.3-P1 <<>> pinekta.tech ns
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 21632
;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 8
;; QUESTION SECTION:
;pinekta.tech. IN NS
;; ANSWER SECTION:
pinekta.tech. 172800 IN NS ns-1073.awsdns-06.org.
pinekta.tech. 172800 IN NS ns-166.awsdns-20.com.
pinekta.tech. 172800 IN NS ns-1988.awsdns-56.co.uk.
pinekta.tech. 172800 IN NS ns-826.awsdns-39.net.
;; ADDITIONAL SECTION:
ns-1073.awsdns-06.org. 128965 IN A 205.251.196.49
ns-1073.awsdns-06.org. 129369 IN AAAA 2600:9000:5304:3100::1
ns-166.awsdns-20.com. 129046 IN A 205.251.192.166
ns-166.awsdns-20.com. 129005 IN AAAA 2600:9000:5300:a600::1
ns-1988.awsdns-56.co.uk. 128801 IN A 205.251.199.196
ns-1988.awsdns-56.co.uk. 128883 IN AAAA 2600:9000:5307:c400::1
ns-826.awsdns-39.net. 129907 IN A 205.251.195.58
ns-826.awsdns-39.net. 132497 IN AAAA 2600:9000:5303:3a00::1
;; Query time: 63 msec
;; SERVER: 192.168.0.1#53(192.168.0.1)
;; WHEN: Tue Mar 7 09:14:43 2017
;; MSG SIZE rcvd: 346
</code></pre></div></div>
<p>あとは、CloudFrontを利用してSSLにしないといけない。<br />
イマドキhttpsじゃないってのはなー。</p>
『実践Node.jsプログラミング』を読んだ
2017-02-14T10:59:30+00:00
https://blog.pinekta.tech/node.js/book/2017/02/14/nodejsbook
<p>『実践Node.jsプログラミング』という本を読んだ。<br />
非常にいい本だった。<br />
Node.jsの本ならおそらくこの本が一番ではないだろうか。</p>
<p><img src="/public/image/20170214/nodejs_book.jpg" alt="nodejs_book" width="300" /></p>
<p>今までNode.jsをちょくちょく触ることはあったが、<br />
本格的に使用したことはなかった。</p>
<p>クライアントJavaScriptは書き慣れていたので、<br />
Node.jsも簡単だと思っていたが、
実際やってみるとそうではなかった。<br />
そのためにこの本を読んでみたのだが、<br />
非常にためになった。</p>
<p>JavaScriptの初心者には厳しいが、クライアントJavaScriptは書き慣れている<br />
かつNode.jsで書いた事がなくてこれから書く・勉強したいという人にぜひ読んでもらいたい本である。</p>
<p>本の内容は以下のとおり。</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>第Ⅰ部 Nodeの基礎知識
第1章 Node.jsに、ようこそ!
第2章 マルチルーム・チャットアプリの構築
第3章 Nodeプログラミングの基礎知識
第Ⅱ部 NodeでWebアプリケーションを開発する
第4章 Webアプリケーションの構築
第5章 アプリケーションのデータをストアする
第6章 Connect
第7章 Connectの組み込みミドルウェア
第8章 Express
第9章 Expressの高度な使い方
第10章 Nodeアプリケーションをテストする
第11章 Webアプリケーションでテンプレートを使う
第Ⅲ部 NodeでWebアプリケーションを開発する
第12章 Nodeアプリケーションのデプロイと可用性
第13章 WebサーバばかりがNodeではない
第14章 Nodeのエコシステム
</code></pre></div></div>
<p>Node.jsの流儀を知らない人は、第3章を読むとよい。<br />
プログラムの分割や分割されたモジュールの読み込みの仕方、<br />
非同期で実行されるNode.jsで同期的に実行するやり方など、<br />
Node.jsのハマりどころについて詳細に解説されている。</p>
<p>また、Node.jsのフレームワークであるExpressの詳細な説明がある。<br />
Expressが利用するConnectの詳細な説明もあるので、Expressを勉強にもなる。</p>
<p>この本はExpressを使ったWebアプリケーション作成について多くの紙面を割いているが、<br />
個人的には第13章も面白いと思う。<br />
Node.jsはWebアプリケーションだけではないということをこの章が示している。</p>
<p>Socket.ioでのリアルタイムでのやりとりが可能であることや、簡単にTCPのサーバ・クライアントが書けるということが記載されている。</p>
<p>Node.jsはJavaScriptなので非常にとっつきやすい言語かと思ったが、実際はそうではなくクセが強いが、<br />
ローレベルなものからリアルタイムアプリケーションまで作れる、とても面白いものだと思う。<br />
何かNode.jsで作りたくなった。</p>
<p><a target="_blank" href="https://www.amazon.co.jp/gp/product/479812947X/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=479812947X&linkCode=as2&tag=pinekta02-22&linkId=d8aab24a58166cd1dc5b14183a48d751"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&MarketPlace=JP&ASIN=479812947X&ServiceVersion=20070822&ID=AsinImage&WS=1&Format=_SL250_&tag=pinekta02-22" /></a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=pinekta02-22&l=am2&o=9&a=479812947X" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /></p>
GitHub PagesにJekyllを使ってブログサイトを作る
2017-02-13T04:55:31+00:00
https://blog.pinekta.tech/jekyll/update/2017/02/13/jekyllblog
<h2 id="github-pagesで静的なサイトを立てる">GitHub Pagesで静的なサイトを立てる</h2>
<p>まずは、GitHub Pagesを使えるようにするには、
自分のGitHubアカウントに
<code class="language-plaintext highlighter-rouge">[ユーザ名].github.io</code>
というリポジトリを作成します。<br />
そして、そのリポジトリのmasterブランチに適当なHTMLファイル、
例えばindex.htmlをプッシュすると、</p>
<p><code class="language-plaintext highlighter-rouge">https://[ユーザ名].github.io/</code><br />
でアクセスすると、プッシュしたHTMLファイルが表示されます。</p>
<p>とても簡単。
ただ、これだけだと自分でHTML, CSSを組まなければいけないので大変。
記事が増えたときの管理も面倒。</p>
<h2 id="jekyll-で簡単にページを作成する">Jekyll で簡単にページを作成する</h2>
<p>そこで「Jekyll」の出番です。<br />
JekyllはMarkdownをHTMLに変換するツールです。<br />
エンジニアにとっては馴染みがあるMarkdownでサイトは作れるのは非常に楽です。</p>
<p><a href="https://jekyllrb.com/">Jekyll</a></p>
<p><img src="/public/image/20170213/jekyll.png" alt="Jekyll" /></p>
<h3 id="jekyll-のインストール">Jekyll のインストール</h3>
<p>以下の手順でインストールします。<br />
なお、環境はMac OS Sierra 10.12.3 で行なっています。</p>
<p>1.Jekyll, Bundlerをインストール</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ sudo gem install jekyll
$ sudo gem install bundler
</code></pre></div></div>
<p>2.不要なファイルを削除しJekyllプロジェクトのひながたを作成</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ rm -f [ユーザ名].github.io/index.html
$ jekyll new --force [ユーザ名].github.io
</code></pre></div></div>
<p>3.確認</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ cd [ユーザ名].github.io
➜ pinekta.github.io git:(master) ✗ ls -l
total 56
-rw-r--r-- 1 keita staff 953 2 11 13:55 Gemfile
-rw-r--r-- 1 keita staff 1180 2 11 13:55 Gemfile.lock
-rw-r--r-- 1 keita staff 1402 2 11 13:55 _config.yml
drwxr-xr-x 3 keita staff 102 2 11 13:55 _posts
-rw-r--r-- 1 keita staff 525 2 11 13:55 about.md
-rw-r--r-- 1 keita staff 1231 2 11 13:57 github_pages.md
-rw-r--r-- 1 keita staff 12 2 11 12:23 index.html
-rw-r--r-- 1 keita staff 213 2 11 13:55 index.md
</code></pre></div></div>
<p>4.Jekyllを起動</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ jekyll serve
Configuration file: /Users/keita/Documents/gitProjects/pinekta.github.io/_config.yml
Configuration file: /Users/keita/Documents/gitProjects/pinekta.github.io/_config.yml
Source: /Users/keita/Documents/gitProjects/pinekta.github.io
Destination: /Users/keita/Documents/gitProjects/pinekta.github.io/_site
Incremental build: disabled. Enable with --incremental
Generating...
done in 0.57 seconds.
Auto-regeneration: enabled for '/Users/keita/Documents/gitProjects/pinekta.github.io'
Configuration file: /Users/keita/Documents/gitProjects/pinekta.github.io/_config.yml
Server address: http://127.0.0.1:4000/
Server running... press ctrl-c to stop.
Regenerating: 1 file(s) changed at 2017-02-11 14:05:07 ...done in 0.195867 seconds.
</code></pre></div></div>
<p><code class="language-plaintext highlighter-rouge">Server address: http://127.0.0.1:4000/</code> にあるとおり、
http://127.0.0.1:4000/ にアクセスすると、Jekyllが生成したページにアクセスすることができます。</p>
<p><img src="/public/image/20170213/jekyll_default1.png" alt="Jekyll default1" />
以下は記事のページです。
<img src="/public/image/20170213/jekyll_default2.png" alt="Jekyll default2" />
以下はaboutリンクのページです。
<img src="/public/image/20170213/jekyll_default3.png" alt="Jekyll default3" /></p>
<p>シンプルだけれどもよいデザインです。
そのまま使えそうです。</p>
<h3 id="記事の追加">記事の追加</h3>
<p>記事を追加するには<code class="language-plaintext highlighter-rouge">_posts</code> ディレクトリにマークダウンファイルを追加します。</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ vim _posts/2017-02-16-test.md
</code></pre></div></div>
<p>以下の内容を記載します。</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>---
layout: post
title: "test"
date: 2017-02-16 09:32:34 +0900
categories: test
---
I do test.
</code></pre></div></div>
<p>すると、トップページに記事が追加されます。</p>
<p><img src="/public/image/20170213/post1.png" alt="post1" />
以下は記事のページです。
<img src="/public/image/20170213/post2.png" alt="post2" /></p>
<p>記事のファイル名は
<code class="language-plaintext highlighter-rouge">YYYY-mm-dd-適当な値.md</code> である必要があります。<br />
このようにしないとJekyllがうまくファイルを認識してくれません。</p>
<p>また、記事の内容の頭に、記事のレイアウトやタイトル、日付などを記載しなくてはなりません。<br />
これを正しく記載していないとうまく表示されない可能性があります。</p>
<h3 id="jekyll-のカスタマイズ">Jekyll のカスタマイズ</h3>
<p>次にタイトルを編集します。</p>
<p><code class="language-plaintext highlighter-rouge">_config.yml</code>に各種設定があるので編集します。</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>title: To the backbone
email: h03a081b@gmail.com
description: > # this means to ignore newlines until "baseurl:"
pinektaのブログ
baseurl: "" # the subpath of your site, e.g. /blog
url: "" # the base hostname & protocol for your site, e.g. http://example.com
twitter_username: pinekta
github_username: pinekta
</code></pre></div></div>
<p>変更したら再度Jekyllを再起動します。</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ jekyll serve
</code></pre></div></div>
<p>これでタイトルなどといったサイト情報の編集ができました。</p>
<h2 id="テーマの変更">テーマの変更</h2>
<p>デフォルトのテーマでも十分使えそうだけれども、
もう少しシンプルなテーマを使いたかったので<br />
<a href="http://lanyon.getpoole.com/">Lanyon</a> というテーマを使うことにした。</p>
<p>横着して、Lanyonをローカルにcloneしたものをそのままコピーして被せて、
<code class="language-plaintext highlighter-rouge">jekyll serve</code> したところ、エラーになる。</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>➜ pinekta.github.io git:(master) ✗ jekyll serve
Configuration file: /Users/keita/Documents/gitProjects/pinekta.github.io/_config.yml
Configuration file: /Users/keita/Documents/gitProjects/pinekta.github.io/_config.yml
Deprecation: You appear to have pagination turned on, but you haven't included the `jekyll-paginate` gem. Ensure you have `gems: [jekyll-paginate]` in your configuration file.
Source: /Users/keita/Documents/gitProjects/pinekta.github.io
Destination: /Users/keita/Documents/gitProjects/pinekta.github.io/_site
Incremental build: disabled. Enable with --incremental
Generating...
Since v3.0, permalinks for pages in subfolders must be relative to the site source directory, not the parent directory. Check https://jekyllrb.com/docs/upgrading/ for more info.
</code></pre></div></div>
<p>ググってみると、GitHubの<a href="https://github.com/jekyll/jekyll/issues/4124">Jekyllのイシュー</a> に _config.ymlに記述を追加すればいいとあったので、</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># Gems
gems: [jekyll-paginate]
</code></pre></div></div>
<p>を追加して再度jekyll serveしたところ下記のエラーに…</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>➜ pinekta.github.io git:(master) ✗ jekyll serve
Configuration file: /Users/keita/Documents/gitProjects/pinekta.github.io/_config.yml
Configuration file: /Users/keita/Documents/gitProjects/pinekta.github.io/_config.yml
Dependency Error: Yikes! It looks like you don't have jekyll-paginate or one of its dependencies installed. In order to use Jekyll as currently configured, you'll need to install this gem. The full error message from Ruby is: 'cannot load such file -- jekyll-paginate' If you run into trouble, you can find helpful resources at https://jekyllrb.com/help/!
jekyll 3.4.0 | Error: jekyll-paginate
</code></pre></div></div>
<p>そのため、 Gemfileの</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>gem "jekyll", "3.4.0"
</code></pre></div></div>
<p>を下記に変更した。</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>gem "jekyll"
gem "jekyll-paginate"
</code></pre></div></div>
<p>気を取り直して、jekyll serve するとまた下記のエラーが…</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>➜ pinekta.github.io git:(master) ✗ jekyll serve
Configuration file: /Users/keita/Documents/gitProjects/pinekta.github.io/_config.yml
Configuration file: /Users/keita/Documents/gitProjects/pinekta.github.io/_config.yml
Source: /Users/keita/Documents/gitProjects/pinekta.github.io
Destination: /Users/keita/Documents/gitProjects/pinekta.github.io/_site
Incremental build: disabled. Enable with --incremental
Generating...
Since v3.0, permalinks for pages in subfolders must be relative to the site source directory, not the parent directory. Check https://jekyllrb.com/docs/upgrading/ for more info.
</code></pre></div></div>
<p><a href="https://github.com/poole/poole/issues/99">GitHubのイシュー</a> によると
permalinkの設定が変わった模様。<br />
_config.ymlの下記をコメントアウトする。</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>#relative_permalinks: true # comment out
</code></pre></div></div>
<p>再度、jekyll serveすると</p>
<p><img src="/public/image/20170213/laynon.png" alt="laynon" />
というように新しいテーマで無事表示される。</p>
<p>最終的には、</p>
<ul>
<li>ヘッダのハンバーガーメニューとサブタイトルの削除、フッタの追加, aboutページの削除
<code class="language-plaintext highlighter-rouge">_layout/default.html</code> を修正</li>
<li>トップページの記事を20語以降は「続きを読む」リンクを表示する
<code class="language-plaintext highlighter-rouge">index.html</code> を修正 ex.<a href="http://shopify.github.io/liquid/filters/truncatewords/">Liquid truncatewords</a></li>
</ul>
<h2 id="複数github-pagesを使いたい場合">複数GitHub Pagesを使いたい場合</h2>
<p>[アカウント名].github.io というリポジトリを作ってしまったら、
同じリポジトリを作れないので、GitHub Pagesは一つしか作れない?<br />
実はそうではない。</p>
<p>リポジトリに「gh-pages」というブランチ名でプッシュすれば、
それがGitHub Pagesとなる。</p>
<p>OSSのGitHub Pagesはこっちのほうが多い思う。</p>
<h2 id="独自ドメインにする">独自ドメインにする</h2>
<p>GitHub Pagesで作ったサイトを独自ドメインにする場合は、
プロジェクトルートにCNAMEというファイルに設定したドメインを記載するだけです。</p>
<p>つまりこのブログの場合は</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ echo blog.pinekta.tech > CNAME
</code></pre></div></div>
<p>そして、設定したいドメイン(blog.pinekta.tech)のAレコードがGitHub PagesのIPにすればOKです。
<a href="https://help.github.com/articles/setting-up-an-apex-domain/">GitHub のこのページ</a> に書かれているとおり、</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>192.30.252.153
192.30.252.154
</code></pre></div></div>
<p>をIPにしたAレコードをお使いのDNSサーバに設定してください。</p>
<p>ただ、これだけだとHTTPSで使用することはできない。<br />
<code class="language-plaintext highlighter-rouge">[ユーザ名].github.io</code> だとHTTPSを使えたが、独自ドメインにすると使えない模様。<br />
<a href="https://www.cloudflare.com/">CloudFlare</a> を利用するとできるらしいが、また今度。</p>
<h2 id="まとめ">まとめ</h2>
<p>Jekyll on GitHub Pages で簡単にブログができる。</p>