読者です 読者をやめる 読者になる 読者になる

TitaniumMobile勉強記

Web系エンジニア向けのキャリアアドバイザーやってましたが現在はフリーランスで開発含めて色々やってます。技術ネタとしてはRuby/RailsとJavaScript関連(Node.js、Titanium)あたり

海外のユーザー向けプロダクト開発~現場のリアルな工夫&ガチな悩みを語る~イベントのモデレーターやってきました

f:id:h5y1m141:20170117203808j:plain

昨日ですが、海外のユーザー向けプロダクト開発~現場のリアルな工夫&ガチな悩みを語る~というイベントのモデレーターしてきました。

今回は自分が企画して・・・というわけではなく、過去に何度かイベントで協力してもらってる和田さんから、縁があってモデレーターやってほしいと頼まれてやってきました

会場は今回登壇いただいた岡根谷さんの協力で、クックパッドさんのオシャレなオフィス(キッチンスペース?)を利用させてもらいました

f:id:h5y1m141:20170117183454j:plain

f:id:h5y1m141:20170117185632j:plain

ポケットメニューさんの話

運営してるポケットコンシェルジュについてサービスの紹介と事例を簡単にお話いただきました。

気になった話

事例の話の中で、Webサイトの中国語対応というのがあったのですが、中国と言っても

  • 中国本土
  • 香港
  • 台湾

という3つの地域では、言語の違いは当然のことながら、個々の地域で

  • 中国本土
    • ほとんどWeChat
  • 香港
    • WhatsAppが主流。若者はFacebookやインスタを使う
  • 台湾
    • LINEが主流

というように、主流のインターネットサービスの違いもあるとのこと。

こういう状況の中で、中国語対応をするというのは中々難しいのかなという印象がありました。

工夫してると思った所

異なる国の人が、地域間でも特性が異なるというような状況を把握するのにどのような工夫があるのかちょっと質問した所、社内で学生のインターン生が数名いるとのこと。

そういう人達がフットワーク軽く、色々情報収集してきてくれるみたいで、社内に、そういう国や地域について詳しい人がいるというのは、ちょっとしたことでも気軽に聞けるという意味では自分たちのサービスのニーズを確認しやすい印象を受けました。

DeNAトラベルさんの話

和田さんは、これまで国内向けのサービスに長年関わっていて、そこでの知見をベースに海外向けのサービスに関わるようになったそうで、その中での苦労や工夫してることについてお話いただきました。

スライドがすでにアップされてるので詳しいことはそちらを

印象に残った話

見えないものを見るという話。

社内の人に協力をしてもらって、インタビューを記録しつつ、ユーザーにとって重要なポイントが何なのか、その行動の背景(コンテキスト)を探る取り組みは面白いなあと感じました。

メールを読むという行為でも、自分と違う国の人がどういう所に着目してるのかを意識して観察してみることで、実は自分たちと同じような行動をしてるという部分があるみたいで、そういうちょっとした気づきが次の施策立案に活かせるような感じがしました。

マーケティングが難しい・・・ということをちょっと話をしてて、具体的にどういう部分が難しいのか質問しようと思ったけど、質問するタイミングを逃したので、聞けなかった^^;

クックパッドさんの話

最後に、岡根谷さんからクックパッドさんでのグローバルに展開してるアプリのリニューアルの話についてお話いただきました。

印象に残った話

リニューアル時に、物理的に遠隔地の人同士で、非同期のコミュニケーションになるみたいな話題も自分の中で似た経験があったのでそこも気になったのですが、それと同じくらいに興味深く感じたのが、国際化対応の話題

グローバルに展開してるアプリが15ヶ国以上で展開されてるようなので、各国の状況はある程度ふまえつつも、そこのニーズを汲みとりしすぎるわけにもいかず、この辺りのさじ加減がすごく難しいように感じました。

絶対的な正解が無いだけに今後もずっと試行錯誤しながら対応していくのかなという印象を受けました。

最後に

3社の事例発表を踏まえて、参加者同士ペアーになってもらって、交流してもらいつつ、発表いただいた人も参加者とも交流して話してもらうような形の運営をしました。

海外のユーザー向けにそもそもサービスをやってる人とか会社はまだまだ多くないだろうけど、その分そういうサービスに関わってる人は各自色々な悩みがあるのかなというのが、発表後の交流してる様子から伺えたので、10名〜15名位で、特定のテーマに絞った形で人があつまってこういう形で交流するのは、やはり面白いなぁと改めて思いました!

第二回JavaScriptステップアップ勉強会を行いました

昨日ですがJavaScriptステップアップ勉強会の2回めを実施しました。

いつも利用させてもらってるCo-Edoではなく、自宅から割りとアクセスしやすい池袋にあるOpen Office Forestさんの場所を利用させてもらいました。

Co-Edo同様にOpen Office Forestさんもアットホームな雰囲気が感じられるのと、最大10名規模での運営をしようと思ってるのでそのイメージからすると調度良い広さで結構好みな空間でした!

f:id:h5y1m141:20160525190033j:plain

ちなみに

  • 前回から引き続き申し込んでくれた方が2名
  • 今回はじめて参加いただいた方が8名

という形で申し込みは最大10名だったのですが、その後に数名キャンセルされたので最終的な予約数は6名。

嬉しいことに実際に参加いただいた方は6名でドタキャン0名でした!

規模の違いがあるので単純比較できないけどこういう勉強会・イベントでドタキャンが出なかったのはとっても嬉しいですね~

前回の反省点を踏まえた今回の対応

前回やった点を踏まえてちょっとした改善あるのでその点の振り返りを簡単にしておきます。

環境構築に関して

前回のエントリ

開催後の反省点

ハンズオンでの最大の問題はやっぱり環境構築っていうのをつくづく実感。

基本的にvagrant upすればOKな状態のVagrantfileを作っておいたのですが、Windows環境でどうもうまくいかないことが当日わかった・・・

こう書いてましたが、環境はCloud9を利用する方針にしました。

元々、Cloud9は知っていて以前ちょっとだけ使ったことがあったのですが、Node.jsの環境をベースに作業をする程度だったらパフォーマンス面で気になることは少ない印象を受けました。

むしろWebブラウザ上で統合開発環境の機能が利用できる意味では、参加者の最初の色々な敷居が下げられそうなのでそちらのメリットを考えるとこちらも念頭に置いた形にしていこうと思ってます。

資料配布

コンテンツを都度増やしてて、PDFにした状態で200ページ近くのボリュームになってるので印刷しようとすると、印刷代も大変なことになるし、印刷物を持って帰る参加者的にもあまり嬉しくないのかなと思い、資料配布はやめることにしました。

その代わりというわけではないのですが、Webブラウザでの閲覧以外のことを考慮して

という形でそれぞれ資料のダウンロード先だけ案内して後は各自の好みのスタイルで閲覧してもらうことにしました。

これが最適かどうかはわからないのですが、無理なく運営をしてく上では今のところこれがベターなのかなと思ってます

参加者巻き込んだコミュニケーション

前回

資料の中で勉強したい箇所が同じ人同士をうまくグループ化&そのグループの中でコミュニケーションが生まれるようなスタイルというのをちょっと目指してみたいので、そんなことが出来るように今後も月に1回位のペースで開催していこうと思ってます。

ということを書いてましたがグループ化するための場作りがそんなに出来なかったものの、席が隣同士になった人で互いに助け合うような感じでちょっとした交流なんかもあったりしたので、今後はそういうのが安定して出来るようにもう少し工夫の余地があるかなと思ってます。

今回追加した内容と今後の追加予定

自分の過去の経験を振り返ると、JavaScriptでのプログラミングの苦手意識が払拭出来ない要因として

  • 非同期処理の概念
  • thisについて

あたりがポイントになるかと思ったので、概念説明を交えつつサンプルコードを書いてもらってその部分について理解を深めてもらうと思ってこんな感じの絵を書きながら情報まとめていきました。

※サブウェイとドトールコーヒーでのオペレーションを例にしながら、同期・非同期処理を対比させた説明の概念図

同期処理イメージ

f:id:h5y1m141:20160526132433p:plain

f:id:h5y1m141:20160526132445p:plain

非同期処理イメージ

f:id:h5y1m141:20160526132457p:plain

f:id:h5y1m141:20160526132509p:plain ただ今回参加された方達は、それ以外の所に興味・関心があったので今回追加した箇所はあまり役に立たたなかったみたいですが今後役に立つ時がくることを祈って都度情報更新していこうと思ってます。

あと、今後の追加予定として最近の仕事を通じて得た成果の1つのChromeDeveloperTools使ったデバッグあたりを少し掘り下げてまとめていこうと思ってます。

この辺りは知っておくと色々便利なことがあるんだけど、着手するのに腰が重くなりがちな気がしてるのでそういう所を丁寧に解説する形でまとめていきたいなぁと思ってます。

ハンズオン形式の勉強会を行ったので事前準備や運営上の工夫をまとめてみました

先日ですが第一回目のJavaScriptステップアップ勉強会を開催しました。

ハンズオン形式勉強会開催は過去に2回やったことがあるのですが、いづれもある会社の方と協力してやる形で今回は告知から当日運営まで全部1人でやったので開催までにやったことを振り返っておこうと思います。

なぜやろうと思ったか?

先日書いたエントリで触れたのですが、以下のが主な理由かなと。

  • PHPRubyなどの言語を利用してWebアプリケーション開発をしてる方の中でなんとなくJavaScript苦手という方の何か手助けをしてみたい
  • 最近やっていた仕事を通じて以下のような情報をひたすら脳に詰め込んでいて、この情報を吐き出したい(※アウトプットしないとこれ以上インプットするのがツライっていうのが本音かも^^;)気持ちが強い
    • フロントエンドの開発をする時に知っておくと便利なツールが色々あることを実感
    • ある程度肥大化したアプリを適切な粒度に分けつつユニットテストを整備することでアプリの設計が意識できるようになる

当日までに行った準備

細かい所含めて色々準備したのでその辺りちょっとまとめておきます。

会場手配

勉強会・イベントで何度も利用させてもらってるCo-Edoでやることにしました。インターネットが使えて適度な広さとなると、Co-Edo以外の選択肢というのはちょっと考えづらいですが、我が家からだとCo-Edoまでちょっと遠く、ふと気になってぐぐったらこういう情報も見つけたので、次回以降開催する時に改めて調べ直してもいいのかな。

告知

過去何度も利用してるDoorkeeper通じてやりました。

自分の身近な人でおそらく参加してくれそうな人がいたのでそういう人に個別にお伝えして全部で4名位申し込みあればいいかなと思っていたら、何故かはわからないけどDoorkeeperによってプロモーション↓されることになったおかげで、その後、申し込みが一気に増えて、一時期キャンセル待ちもそれなりに発生するという嬉しい状況になりました^^

f:id:h5y1m141:20160421081612p:plain

ただ、その後にキャンセルされた方も結構いたので、最終的には全部で5名の参加者で、1人でやるのにちょうど良い規模になったかなと思ってます

原稿を書く

資料のサンプルコード通りにやってもうまく動作しないということが過去経験がありました。

何故そうなる理由としては自分で書いた資料を見て、自分でコードを書いてないからなのかなと思ったので今回は、

  1. 最初にサンプルコードを考えて、動作するものを作り、それは別ディレクトリにまとめておく
  2. 上記とは別のディレクトリで作業することを前提に説明文を書く
  3. 説明文の中で埋め込んだコードが期待するような動作になってるのか自分で手を動かして動作確認

という感じで書くことで回避出来た気がします。

説明の文章自体は、過去にQiitaなどで書いた情報があるのでそれをベースにしてるので、実はそんなに大変ではないのですが強いていうと、JavaScriptに苦手意識がある人にとってどういう所がわかりづらいのかが、自分自身でうまく把握出来てないので、どこまで図解しておくのがいいのかという所でちょっと悩んでしまった所が大変だったかなと思ってます。

作った資料の共有

Markdownで書いた内容をGitBookを使って資料を作っていたのですが、GitBookコマンドラインツールの使い方の情報がとても参考になり、ローカルでビルドしてGithub Pagesを使って以下のように公開することでいつでも閲覧できるようにしておきました

http://h5y1m141.github.io/step-up-javascript/

※サンプルコードと説明の時に利用してる資料一式も以下で公開してます https://github.com/h5y1m141/step-up-javascript

上記のWebは、予習・復習みたな位置づけにしようと思っていて、やはりハンズオンだと、手元に印刷された資料があったほうが作業やりやすいと思ったのでgitbookでPDF/epub出力できるようにする(calibre)を参考にこんな感じ↓でPDFを生成&印刷したものを当日配布。

f:id:h5y1m141:20160421081638p:plain

PDF版の改行位置をちょっと微調整

ちなみにGitbookでpdfとebookを作成するで改行がツライって書いてあって実際そうで自分の場合には

<div style="page-break-before: always"></div>

をうまく使って、これを挿入する箇所で改行させるという地味に面倒な事をやってひとまず対処しました。

資料の印刷

参考情報含めてすでに100ページ超えてる資料になっていたので、2ページを1枚で印刷したとしても50ページx10円→500円っていう状態は流石につらいので、ひとまず当日利用しそうな箇所に絞って30ページ程度にしました。

2ページを1枚で印刷しつつ、5円コピーというサイトで近所で5円コピー出来る所を探して

実施時のポイントと今後の反省点

当日の実施時に心がけたこととか、実施した後の反省点について簡単にまとめておきます

極力個別質問に答える

JavaScriptスキルアップみたいな題名にすると、参加される方の技術的なレベル感や期待感にばらつきがあると思ったので、こんな感じで、ホワイトボードに自己紹介的も兼ねて今回の勉強会に関係なくJavaScriptに関連して聞いてみたいこととか、日頃難しいなと思ってることなんかを書いてもらいました

f:id:h5y1m141:20160421081104j:plain

あとは、レベル感や期待感にばらつきがある状態の中で、講義形式で一律同じペースで話を進めるのはそもそも無理があるかなと思ったので、配布した資料を見ながら各自のペースで実際に作業してもらって、私は、各自の進捗を見ながら、個別質問に答える形にしました。

日頃疑問に思ってることをその場で聞けるような空気にしたいと思っていたので今回みたいな形で運営してそれなりの手応えは掴めた気がします。

開催後の反省点

ハンズオンでの最大の問題はやっぱり環境構築っていうのをつくづく実感。

基本的にvagrant upすればOKな状態のVagrantfileを作っておいたのですが、Windows環境でどうもうまくいかないことが当日わかった・・・

手元にすぐに起動できるWindowsマシンがないので、何故こうなるのかとか、どうすれば回避出来るのかとかが、ちょっと検証出来ないのがちょっとネックだから、仕事の合間にWindows環境を作ることを考えないとダメな気もしてきた。

終わりに

取り上げたいテーマについての原稿がまだ整ってないので今回はテーマを絞りましたが、次回からは、資料の中にある内容ならどこから手を付けてもOKな形にしようと思います。

資料の中で勉強したい箇所が同じ人同士をうまくグループ化&そのグループの中でコミュニケーションが生まれるようなスタイルというのをちょっと目指してみたいので、そんなことが出来るように今後も月に1回位のペースで開催していこうと思ってます。

フリーランスになって1年9ヶ月の振り返り

フリーランス

昨年の月末に1年9ヶ月経過した振り返りをしないといけなかったのでだいぶ遅れたけど、ひとまず振り返りをしておきます。

目次

1つお仕事が終了になったのをきっかけに自分仕事の機会を確保する

昨年の年末に書いたエントリ

またお金に関して言うと、割りと小さい会社さんとの取引があるからこそ、資本政策とかについては知っておく必要があるかなと思ってます。

っていうことを書いていたのですが、まぁこういうのを書いたのは何となくそういう予兆を自分なりに感じていたので、結果その通りの展開になりました^^;

知り合い経由などでお仕事の話を聞けたので、もう1つ入れようかと思ったのですが、

  • 何度か過去書いてるけど1人でやる仕事には限界がある
  • 収益源としては分散しているとは、どこかの会社で、Webサービスに関する開発の仕事をしてるという意味では本質的に分散してるといはいえないことにずっともどかしさを感じていた
  • ここ最近ずっとフロントエンド側の地道な作業をしてて、これまで理解が曖昧だった所をちょっと深く理解出来てきたのでこの辺りの知見を活かした何かをやってみたい
  • 1つに絞った場合の売上で仮に年間ずっと推移したとして、最低限の生活費は確保できそう

というようなこと重なり、3月末までは、昨年から継続してやってるお仕事1つに絞ってみることにしました。

1つに絞ったことで時間的な余裕が出来たので、自分の時間を売切りするスタイルだけではなく、自分から仕掛けて、何か収益をあげる「自分仕事」をどうやって作るのかを考えて、行動に移せる状況を整えることができました。

時間が確保できたことでこれまでやってなかったトークイベントや小規模な勉強会をしてみた

第1回クローラー開発勉強会だったり、1年ぶりにWeb系な人のキャリアカフェでなぜポジションレスな働き方が求められてるのか?をやったりと久しく出来てなかったトークイベントっぽい活動が出来ました。

それ以降のイベント関連のネタとしては

  • 私は男性だけど、Web系の仕事をしてる女性のキャリアみたいなテーマ
  • 仕事柄座ってる時間が長いから体のコンディショニングに関心があり、縁あってちょっと前にフリーランスiOSエンジニア兼ヨガのインストラクターという面白い人と知り合いになったのでその人を招いた何かイベント
  • クローラー開発勉強会の2回目以降を継続的にやるための仕組み作り(前回の参加者の属性が幅広いことに気づいたので、当日に参加者からアイデアを募ってその場でテーマを決めるようなアンカンファレンスのやり方を参考にする方法)

みたいな感じでいくつかあるのですが、4月はちょっと時間的な余裕がないので5月以降にちょっとづつやっていこうと思ってます

今後にむけて

今回のエントリがちょっと遅れたのも4月になって色々動き出してきたのが大きいかなと思ってます

スクールで学んだ人が次のステップに進むためのお手伝い

1つは前職時代&フリーランスになってからもずっと興味を持ってるこういう↓やつに近いことが出来る仕事を来月から入れる予定です。

f:id:h5y1m141:20150124093400p:plain

f:id:h5y1m141:20150124093421p:plain

単に教えるだけとか開発するだけの仕事ではなく両方の素養をうまく組み合わせた形で関わることが出来るのと、時間もそれほど拘束されないので、トータルで見てとても良い案件かなと思ってます

上記に関連して、JavaScriptのステップアップを意識したハンズオントレーニング

このエントリ

WebアプリケーションエンジニアのためのJavaScript中級者講座

自分の周囲の人でJavaScriptに苦手意識あるWebエンジニアな人が一定数いるのでそこの課題解決をしたい

みたいなことを書きましたが、上記のスクールで学んだ人というのはRailsが中心でフロントエンド側はそれほどやってないみたいなので、そのあたりもうまくフォローをしてあげたいと思ってます。

最近やっていた仕事を通じて

  • ChromeDeveloperToolsを使いこなす
    • ブレークポイントの設定とか今までやったことがなかったり、Networkタブに有る機能を活用して擬似的な低回線シュミレーション出来るとか色々知らないことだらけだった
  • JavaScriptでどういう書き方をするとメモリリークを引き起こしてしまうか
  • フロントエンドのアプリを書く上でどういう設計が考えられそうか
  • ある程度肥大化したアプリを、適切な粒度に分けつつ、ユニットテストを整備する方法

という所の理解が深まったので、こういう内容を来月からやる仕事でもうまく還元したいと思ってます。

ただ、どういう内容を最初に教えるのが良いのかちょっとイメージが湧かない部分があるので、まずはその下調べという感じでJavaScriptステップアップ勉強会というのをやってみることにしました。

4名前後位申し込みがあればいいかなと思っていたのですが、自分の予想に反して意外と申し込みがあったのと、これは今後もうまく継続して色々出来そうな予感がしてきたので、割りと気合を入れて資料を作ってます

自分のサービスを立ち上げるためにインスタントチームを使ったらイイ感じの人達と出会えた

っていうことをtweetしてましたが、インスタントチームを使って告知をしたら、おかげさまで申し込みがあって、昨日顔合わせという名の飲み会をしたいのですが、割りと面白いことが出来そうな予感がしてて良い感じのチームが立ち上がった気がしてます

インスタントチームは、開発チームを気軽に立ち上げることができるサービスです。

InstantTeam(インスタントチーム)とは何ですか?

こうして書いてみると、1人でやるには限界があるという問題をどうにかして解消したいと思ってたのですが、ふとしたきっかけで歯車が噛み合ったことで、物事が進み始めた予感がしてます。

第2回GemJam:Kaminari編を行いました

前回やったのが、2014年12月なのでだいぶ久しぶりな感じになったけど、2回目を昨日実施しました。

ちなみに、GemJamは

GemJamについて

何気なく使ってるgemについて各自のレベルに応じて今よりもちょっと深く理解する インプットだけではなくアウトプットもセットで行うことでアウトプットするという習慣を得るきっかけ作り を目的にしたもくもく会形式の勉強会です。

という感じの勉強会です。

ちょっと長いので目次つけておきます

当日のおおまかな流れ

f:id:h5y1m141:20160407065646j:plain

  • 会場に来た順番でこんな↑感じで今日やることをザックリ書いてもらって後はもくもくと作業
  • 時間になったら振り返りをしてもらう

という感じで運営しました。

イベントページでそれぞれのレベルに応じて勉強してもらうようにガイドラインとなるものを書いておいたのですが、Kaminariはそれなりに使ったことがあるのでコードを読む (Kaminariのキモとなるようなページネーション処理の実装がどうなってるのか調べる)を行いました

当日の作業振り返り

コールドリーディングをした時にメモを取りながら作業をしていたので、以下にその記録まとめておきます

ページネーション処理がどうやって実現されてるのかとっかかりとなる箇所を調べる

最初は、spec/配下のファイルをじっくり読もうと思ったのですが、結構な分量だったので、ちょっと方針変換して、2016年4月6日時点でのGitHub上のコミットのページで一番最後のページを見つけて、そこから最初にページネーションの実装をしたと思われるものを履歴から見つけようと思いました。

それで、the first implementation of pagination helperといういかにもそれっぽいのを見つけて、そこの変更履歴で

module Kaminari
  module Helpers
    def paginate(scope, options = {}, &block)
      prev_label, next_label, left, window, right, truncate, style = (options[:prev] || '&laquo; Prev'.html_safe), (options[:next] || 'Next &raquo;'.html_safe), (options[:left] || 2), (options[:window] || 5), (options[:right] || 2), (options[:truncate] || '...'), (options[:style] || 'page')
      current_page, num_pages = scope.current_page, scope.num_pages
      content_tag :div, :class => 'pagination' do

とあったので、どうも個々の処理が関連ありそうと判断。

上記とは別に手元のRailsのアプリで導入したKaminariのソースコードに対して、ターミナル上でfindで以下のように調べることも行ってみました

find ./vendor/bundle/ruby/2.2.0/gems/kaminari-0.16.3 -type f -name "*.*" | xargs grep 'paginate' -n | more

すると

./vendor/bundle/ruby/2.2.0/gems/kaminari-0.16.3/lib/kaminari/helpers/action_view_extension.rb:17:    def paginate(scope, options = {}, &block)
./vendor/bundle/ruby/2.2.0/gems/kaminari-0.16.3/lib/kaminari/helpers/action_view_extension.rb:75:    # Ported from mislav/will_paginate

という情報があって、action_viewという単語が気になったのでこれがそもそも何かを知らなかったのでそれを調べることにした

ActionViewについて調べた記録

ActionView を単体で使ってみるがとてもわかりやすい情報があったのと、幸いにそこの記事で紹介してた内容のサンプルコードが あったのでそのコードを写経しながら理解を深めることにしました

サンプルコードをベースにして、以下の様なコードを書いてみました

require 'bundler/setup'
Bundler.require(:default)
lookup_context = ActionView::LookupContext.new('./views')
lookup_context.cache = false
view_context = ActionView::Base.new(lookup_context)
view_context.assign(first_name: 'xx')
view_context.assign(last_name: 'xxxxx')
result = view_context.render(template: 'main', 
                             prefixes: 'prefix', 
                             layout: 'layouts/appliation')
puts result

上記はmain.rbとしたので、こんな風にして実行

bundle exec ruby ./main.rb
/Path/to/ruby/use-actionview/vendor/bundle/ruby/2.1.0/gems/actionview-4.1.4/lib/action_view/path_set.rb:46:in `find': Missing template layouts/appliation with {:locale=>[:en], :formats=>[:html], :variants=>[], :handlers=>[:erb, :builder, :raw, :ruby, :slim]}. Searched in: (ActionView::MissingTemplate)

あー、Railsのアプリ作ってよく見かけMissing Templateのエラーにここで出くわすとは思わなかった^^;

require 'bundler/setup'
Bundler.require(:default)
lookup_context = ActionView::LookupContext.new('./views')
lookup_context.cache = false
view_context = ActionView::Base.new(lookup_context)
view_context.assign(first_name: 'xxx')
view_context.assign(last_name: 'xxxxx')
view_context.assign(name: 'xxxxxx')
result = view_context.render(template: 'hoge',
                          prefixes: 'prefix',
                          layout: 'layouts/application')
puts result

としたら以下のように問題なく表示されました

--
Hello, xxxxxxxxx
--

で、よくよく見ると、タイプミスをしてました・・

正しくない:layout: 'layouts/appliation' 正しい: layout: 'layouts/application'

ここまででActionViewについてわかったこと

  • ActionViewというgemがあった
  • そこで行われてるのは、インスタンス変数をセットすることが出来る
  • render()メソッドを通じてテンプレートファイルを呼び出すことが出来る
    • テンプレートとなるファイルを探すのはActionView::LookupContextを通じてディレクトリを指定
    • テンプレート自体の参照は、ActionView::Baseのrenderのオプションを指定することで行える感じ
      • template: xxx
      • prefix: これを指定しないとテンプレートが見つけられないらしい
ActionView::Base.new
view_context = ActionView::Base.new(lookup_context)
view_context.assign(first_name: 'ファーストネーム') => @first_name というインスタンス変数にファーストネームという値が格納される

ActionViewがわかった上で、Kaminariのページネーションについて改めて調べる

ここまででおおまかにActionViewの位置づけとか仕組みがわかったので改めてページネーション処理の実装がどこでされてるのか調べることにしました。

spec/controllers/application_helper_spec.rbで

equire File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
class ApplicationController < ActionController::Base; end
class UsersController < ApplicationController
  def index
    @users = User.page params[:page]
    render :inline => '<%= paginate @users %>'
  end
end

というのがあったけど、

:inline => '<%= paginate @users %>'

というコードがありました。

作業してる時に参考にさせてもらったActionViewのサンプルコード

# 02_assign.rb
ret = view_context.render(inline: '<%= @last_name %> <%= @first_name %>')

という感じで、inline: xxxx という似た感じの処理になっていることに気づきました。

Kaminariのpaginate()はどこで定義されてるかthe first implementation of pagination helperのコードを調べてみたところ、lib/kaminari/railtie.rbで

module Kaminari
    class Railtie < ::Rails::Railtie
    initializer 'paginatablize' do |app|
      ::ActionView::Base.send :include, Kaminari::Helpers

というのをした上で

module Kaminari
  module Helpers
    def paginate(scope, options = {}, &block)

が定義されてるので、この↑paginateが鍵になりそうな感じがしたのでここを深掘りしてみることにしました

実際のpaginateを読む

初期の頃の実装を順番に読んでいきました

scope.num_pagesまでの処理

ここは引数のscope, optionsのオブジェクトの値をチェックしつつ、値が存在してたらそれを変数に代入して、値が存在しない場合には、デフォルト値を設定する処理のようでした。

Ruby多重代入についてよく理解してなかったので、以下コードを読んでて、すぐにわからずかなりの時間を費やしたのはここだけの話

def paginate(scope, options = {}, &block)
  prev_label, next_label, left, window, right, truncate, style = (options[:prev] || '&laquo; Prev'.html_safe), (options[:next] || 'Next &raquo;'.html_safe), (options[:left] || 2), (options[:window] || 5), (options[:right] || 2), (options[:truncate] || '...'), (options[:style] || 'page')
  current_page, num_pages = scope.current_page, scope.num_pages

content_tagの処理

content_tagはしっかり調べたことがなかったけど、2009年08月29日22:28に書かれた Railsのcontent_tagメソッドが便利で使い方も簡単を読みつつ、content_tagの使い方が紹介されていたので、Pry上で試してみた

include ActionView::Helpers
=> Object
[11] pry(main)> content_tag(:h1, 'ふー', :style => 'color:red')
=> "<h1 style=\"color:red\">ふー</h1>"

ここまで理解できた上でさらに読み進めようと思ったのですが、時間になったので今回の作業はここまででした

コールドリーディングをしてみて

Kaminariは普段何気なく利用していたのですが、今回コードを読んでみて、その下ではActionViewという仕組みを利用してる→そもそもActionViewという存在を知らなかったのでそれだけでも自分にとってはプラスでした。

また、他の人の振り返りを聞いてて、知らない機能とかがちょっと出てきたりして改めてRailsの奥深さを実感したのと、1つのgemに絞って、各自のレベルに応じてもくもく勉強してアウトプットしてもらうというスタイルにしたことの良さを実感できた勉強会かなと思ってます

今度はDevise あたりをとりあげてやろうかなと何となく考えてます

Matcher経由で就活相談してFAQになりそうなことをまとめた

キャリア 働き方

Matcherというサービスがあるのですが

Matcher(マッチャー)は、社会人の「就活相談にのるので、○○してくれませんか?」というお願いを叶えることで、大学の先輩以外の人にも気軽にOB/OG訪問ができるソーシャルマッチングサービスです。

という感じで、自分と接点が無い人と出会える意味では 昔良く使っていたCoffeeMeetingに通じる所がありそうで、少し前に登録をしてました。

おかげさまでエンジニア希望の2名の学生さんとお会いして就活相談をしました。

Matcherのコメント欄で、こういう補足の情報が登録できたら嬉しかったけどそういう機能がないことに文章を書いてから気づいて折角まとめた情報なので今後申し込みがまたあった場合に、おそらく似たようなことを今後も聞かれる気がしたので、自分の考えをちょっとまとめておこうと思います。

エンジニアとして大事なこと

エンジニアとしての技術スキルを、これから社会人になろうとする人に対して過度に期待は出来ないと思うので私個人的には、以下3つが大事かと思ってます。

  • 相手の話をしっかりと「聴く」
  • 自分自身を「内省するチカラ」がありそうか
  • 抽象化するチカラを持っているか

1つ目ですが、「聞く」ではなく「聴く」の方です。前者は、受け身というか、聞き流す感覚になると思うので、そういう形ではなく、相手がどういう意図を持って話をしてるのかという姿勢で聴くという意味です。(聴くを真剣にやると精神的にはとても大変だったりするので、インタビューがしっかり出来る人は個人的にとても尊敬してます)

2つ目の内省するは小難しいですが、色々な角度からその人のエピソードを聞いて、挫折した経験とかあると、そういう経験から教訓として何を得てるのかという感じで自分自身で振り返るような意識づけをちょっとでも持っていたらエンジニアとしての素養はあるかなと思ってます。 エンジニアの世界観では、「KPT」というのが1つキーワードになるので「KPT エンジニア」とかで、ググッてみてください

3つ目ですが以前まとめた記事で抽象化についてちょっと触れていてそれがヒントになるかなと思ってます。

勉強方法

エンジニアとしてやっていくには常に勉強するのが必要になるのですが、理想的な状態としては

インプット ↓ アウトプット ↓ フィードバック ↓ インプット (以下繰り返し)

というのが常にあるのが望ましいいかなと思ってます。

この形を目指しつ、勉強方法というインプットの手段としては書籍で学ぶ、ネット上の情報を頼りに学ぶ、オンライン・リアルのスクールで学ぶ、etc・・・と色々あると思います。

大事なことしては、読んだだけとか、聞いただけにせず、自分で手を動かす(エンジニア的にはコードを写経するという言い方をしてます)が大事かと思ってます。

インプット以外の所も補足しておきます

アウトプットの手段

アウトプットするためには、理解が曖昧だと、文章書いたり発表したりというのはとても難しいので、理解度を試す意味でとても良いかと思ってます

手段としてはブログを書く、勉強会で自分のノウハウを発表する(LTをするという)、etc・・・というのがあるかと思いますが、アウトプットはある程度の場数を踏むのが大事かと思うので、その人にとって気軽にアウトプット出来る手段を見つけて、継続的に実施していくのが良いのかなと思ってます

フィードバックについて

自分がアウトプットしたことに対して、コメントを貰ったり、アドバイスをもらったりすることで自分と違う視点を得られることで、これまでと違う分野について学んだほうが良いと感じられることが出てきます。

こういうフィードバックというのはとても大事で、特に最近のエンジニア界隈では、コードレビューという他人が書いたプログラムのソースコードを読んで、それについて疑問点とか改善点をフィードバックして、それをベースに必要に応じてソースコードを書き換える習慣を仕事の仕組みとして上手に取り入れてる会社・チームはレベルの高い人が集まってる印象を個人的に思ってます。

これから社会人になるような人にとって完全には理解できないかもしれませんが、Wantedlyに勤めてるエンジニアの方がQiitaでとても良いことを書いてるので紹介しておきます

その他おまけ

Matherで就活相談の対応をする時に、プランというのを作るのですが、差し障りの無さそうな美味しい珈琲を教えてと書いたら、ある人はわざわざ豆を買ってきてくれた。しかも私が豆を挽く器具を持ってないかもしれないと思って、挽いた状態の方をチョイスするという細かい気遣いをしれくれていて、そういうのが自然にできるのは凄いなぁー

f:id:h5y1m141:20160317075035j:plain

実は最初このエントリ書いてる時にMatcher通じてエンジニア希望の人の就活相談をしたので今後聞かれそうなことをまとめましたというタイトルにしていたのですが、記事タイトルは32文字以内に収めるのがSEO的には良いらしいということを最近しって、今自分が作ってるプロダクトの↓機能を実装してるのでそっち使って試行錯誤してこのタイトルに落ち着きました

f:id:h5y1m141:20160317074615p:plain

なぜポジションレスな働き方が求められてるのかをテーマにしたキャリアトークイベントをやりました

キャリアトーク イベント 働き方

なぜポジションレスな働き方が求められてるのか?というテーマで昨日キャリアトークイベントを1年半振りにやりました。

しばらくやらなかった理由として

収支的に赤字にならないようなイベントでない限り、当面活動ストップしようかなと思ってます。

スタートアップのWebエンジニアとチームの文化の作り方考えませんか?というテーマでトークイベント実施しましたより

ということを1年以上前に書いて、実際今回もイベント単体の収益だけを見ると、まぁちょっと赤字^^; になってしまってるのですが、

  • 受託ではない自分の仕事を作るための営業機会
  • 年間での収支考えるとここでの持ち出しは実はそんなに大きな影響がない

を考えると、トータルで見て損なことではないかなということがわかってきたので今回実施しました。

簡単に昨日のイベントを振り返る

昨日のイベントの内容はもう@azumi0812さんに描いてもらったこの↓グラフィックレコーディングを見てもらうと、おおよその内容が伝わるかなと思うので、ひとまず貼っておきます。

f:id:h5y1m141:20160311080339j:plain

グラフィックレコーディングしてくれた@azumi0812さん自身も、今回のテーマにとても興味持ってくれていたみたいで、その場での対話を可視化してくれながら、適宜対話に参加してくれたので、可視化されたものを見つつまた違った対話が産まれ、それがまた可視化されて・・・というのは、とっても新鮮な場だったので、今回企画して良かったなぁと思ってます。

イベント開始前から本編までの雰囲気

参加される人が仕事帰りで予定通りに来れるかどうかわからない+その場の雰囲気を温めるということを狙って、いつも通り、最初に会場に来た人を順番に交えながら交流会→本編のトークイベント→任意でまた懇親会という流れで行いました。

最初の交流タイム

f:id:h5y1m141:20160311105825j:plain

f:id:h5y1m141:20160311105834j:plain

f:id:h5y1m141:20160311105841j:plain

f:id:h5y1m141:20160311105850j:plain

本編のトークイベント

f:id:h5y1m141:20160311105902j:plain

f:id:h5y1m141:20160311105909j:plain

f:id:h5y1m141:20160311105953j:plain

振り返りで何も書かないと手抜きっぽいので「評価」というテーマでちょっとだけ深掘り

従来の役割に固執しない働き方をしてる人をどう評価するのかが気になっていたテーマだったのでそこについてちょっと触れておこうと思います。

あるレベルになってくると、客観的な評価は無理。

すべての状況に当てはまらないと思うのですが、少なくとも新しい領域にチャレンジしてる事業・会社の中で仕事をしてると、数値化して、みんなにとって納得の行くような客観的な評価を作るのが難しいのかなというのが、登壇した2人+参加していた人との対話で気付かされました。

互いの信頼関係が構築できてるのが重要

客観的な評価は無理だから、「えいや」で評価を決めざるを得ないという状況だと、互いの信頼関係が構築できてるのがとても大事というような話が出ました。

この話を聞いた時にふと、Googleについてのこの記事のことが頭をよぎりました

社員一人ひとりが会社で本来の自分を曝け出すことができること、そして、それを受け入れるための「心理的安全性」、つまり他者への心遣いや共感、理解力を醸成することが、間接的にではあるが、チームの生産性を高めることにつながる。

グーグルが突きとめた!社員の「生産性」を高める唯一の方法はこうだプロジェクト・アリストテレスの全貌より

評価をする上で、他者への心遣いや共感、理解力を醸成できていれば、その空気が相手に伝わり、そういう人が所属するチームに入れば、「えいや」で決まる評価であっても互いに納得感がある形になるのかなと気付かされた感じがします。

イベント告知文で触れたNBAのウォリアーズの凄さ

今回のイベントの告知文で、アメリカのプロバスケットボールリーグのNBAに所属してるウォリアーズというチームの話をこんな感じ↓で書いてました。

f:id:h5y1m141:20160311110124p:plain

ウォリアーズは昨季優勝してある種の目標を達成してしまってモチベーションを保ちづらそうな上に

  • ヘッドコーチが腰の手術を受けた影響で、開幕から不在
  • ヘッドコーチ不在の間、NBAコーチになってわずか2年目のアシスタントコーチが引き継いでいる

という状況みたいなのですが、現在どうなってるのかというと、【NBA】まだ6敗のウォリアーズ。ブルズ超えの史上最高勝率なるかという凄い状況になってるみたいで、しかも

そして、みんな役割を受け入れてる。NBAはビジネスです。評価はあくまで個人。それなのにそこを度外視してチームとしてまとまってます。

NBAのウォリアーズが、あんなに強い理由が

というのを考えると、ウォリアーズというチームが醸し出してる空気ってどんなものなのか、個人的にとても興味が湧いてきて、NBAとは言わないので、バスケットボールのヘッドコーチやサッカーの監督とかが普段どんなことを考えてるのかをうかがい知る機会とかを作れたらいいなぁと思っているので、遠い先のことかもしれないけど、いつか実現したいなぁとちょっと妄想してます^^;

これまでと違ったステージに進めそうな感触をつかめた

2年半ほどまえに第一回目をやったのですが、その時からずっとどうせやるなら、みんなにとってWin-Win-Winになるようにするということを心がけてて、これまでもその場にいた人達の表情だったり交流具合などを見てて

  • 登壇してもらった人
  • 参加した人

が満足いただけてるのかなと思っていました。

今回はグラフィックレコーディングをその場にいた人達が体験できて、トークイベントとしてもこれまでと違ったスタイルの体験が生み出せたのかなと思ってます。

また、グラフィックレコーディングをしれくれたご本人も、対話終わったあともだれかの対話を新たに生み出せてるということを実感されていたようで、ご本人の言葉を借りると

グラフィックレコーダー冥利につきる

ということを書かれていて、みんなにとってのWin-Win-Winというものが、これまでよりも、ちょっとアップした形のトークイベントに出来つつある手応えを得た夜だったかなと思います

最後になりましたが、毎回会場利用させてもらってるCo-Edo&登壇いただいた小林さん&高柳さん&グラフィックレコーディングしてくださった@azumi0812さんありがとうございました〜