RAKUS Developers Blog | ラクス エンジニアブログ

株式会社ラクスのITエンジニアによる技術ブログです。

初心者向けSwiftプログラミング勉強会に参加しました

はじめに

こんにちは。ラクスエンジニアのstrongWhiteです。
今回は初心者向けSwiftプログラミング勉強会に参加したので、勉強会の内容や参加した感想を記事にしようと思います。

Swiftとは

本題に入る前にSwiftについて簡単に触れておきます。
Swiftとは、iOS向けのアプリケーションを開発するためのプログラミング言語で、Apple社が開発しました。
iPhoneiPadをお持ちの方で、ふだん何気なしに使っているアプリはこのSwiftによって作られています。
SwiftはXcode(統合開発環境)を使って記述していきます。

f:id:strongWhite:20180317201755j:plain:w400

参加した勉強会

ふだん私は自宅でプログラミング学習をしているのですが、たまたまSwiftに関する勉強会を調べていたところ、Swiftのスの字も知らない初心者でも気軽に受講できそうな勉強会を見つけたので、思い切って参加してみることにしました。

カフェサロンで学ぶ!超初心者向けのswiftプログラミングレッスン♪

  • 開催地:大阪 心斎橋レンタルオフィス salon HAJIMARI
  • 日時:2018年1月21日(日) 14:00〜18:00
  • 持ち物:ノートパソコン(Mac OS)、電源コード/電源アダプタ(又はバッテリ)
  • 参加費:2,000円

いわゆるもくもく会とは違い、講義形式で簡単なアプリを作成していきます。
Xcodeの設定やプロジェクトの作成から丁寧に教えてもらえるので、「アプリについて興味はあるけどどうやって作ればいいかわからない」という人にはオススメの勉強会でした。

会場の雰囲気

会場はレンタルオフィスのカフェスペースだったので、大学の講義室のような堅苦しい感じはなく、ゆったりと心を落ち着かせながら勉強できました。
会場の管理人さんからお菓子とコーヒーを出していただいたので、プログラミングで詰まった時はうまく気分転換させることができました。
カフェスペースでコーヒーを飲みながらMacを立ち上げている様は何だかすごくエンジニアっぽいなと感じました(笑)

f:id:strongWhite:20180317210602j:plain:w400

作成したアプリ

勉強会の開催日がバレンタインデーに近かったこともあり、「プレゼントボックスをタップするとバレンタインメッセージを送れる」アプリを作成しました。
会場ではシミュレータで動作確認を行っています(iPhoneなどの端末があれば実際にアプリをインストールすることも可能です)。

f:id:strongWhite:20180317223747g:plain:w400

画面や構成要素(プレゼントボックスなどのパーツ)が少なく、複雑な挙動もしないのでプログラム自体は数十行程度の簡単なものです。
Swiftに触れて日も浅い人にはちょうどいい難易度ではないでしょうか。

参加した感想

今回の勉強会で作成したプログラムはさほど難しくなかったので、少し物足りなかった印象です。
講義自体も最初の2時間ぐらいで終わってしまったので、後半は参加者との交流にあてる形になりました。
主催者側はむしろ後半の参加者との交流に重きを置いていたらしく、積極的に参加者との意見交換を促していました。
社外のかたと積極的に関われる貴重な機会でしたので、技術談話が盛んに行いました。

最後に

自宅でのプログラミング学習は何かで詰まったり、思うように理解が進まなかったとしても自分ひとりで解決しないといけないので結構つらいです。
分厚い参考書を読んだり、Webサイトで調べたりいろいろ右往左往しないといけないと思いますが、勉強会に行くとわからないことは気軽に質問できるのでいいです。
すぐにでも知識を身に付けたい人は参考書を買うよりも勉強会に行った方がいいかもしれません。

参考

「openSUSE」で始める初めてのLinuxデスクトップ

MasaKuです。もうすぐ社会人1年目終了です。
近況ですが、先日大阪で開催されたオープンソースのイベントOSC OSAKA 2018に参加しました。

www.ospn.jp

イベントの中で「openSUSE」のセッションがあったのですが、Linuxデスクトップを使ったことがない私のような初心者でも扱いやすそうなWindowsライクな画面で興味を持ちました。
また、発表者さんの展示ブースの方にも訪れたんですが、openSUSE Leap42.3のインストールディスクを頂いたので、古くなったノートパソコンにインストールして使ってみたいなと思いました。

f:id:MasaKu:20180319211310p:plain
openSUSE の公式マスコット「Geeko(ギーコ)」です。可愛いですね。

openSUSEとは

"Slackware”系Linuxディストリビューションで、主に欧州で人気のようです。
2017年7月より"Microsoft ストア”でもリリースされています。

f:id:MasaKu:20180318191907p:plain
デスクトップ画面

デスクトップは上図のような感じで、普段からWindowsマシンを利用する方はすぐに操作に慣れることができるのではないでしょうか。
また、仮想デスクトップや、「Alt + Tab」の画面切り替えなど、様々なデスクトップ効果が使えるため、WindowsMacでそのような機能を多様される方でも使いやすいのではないかと思います。

OSC OSAKA 2018の会場で聞いた話ですがopenSUSEはかなり初期から仮想デスクトップ機能を導入していたようです。

プライベート用としてのLinuxデスクトップの利用

私は業務でもプライベートでも、Windowsマシンを使っています。
openSUSEをプライベートで利用する場合、普段行っていることがどこまでできるのか、ということをリストアップしました。

  • 文章作成:googleドキュメントが利用できる
  • プログラミング:AtomLinux環境でも利用できる
  • 動画視聴:YouTube等の動画サイトが利用できる

FireFoxが標準搭載されているため、Windowsで利用してたクラウドサービスがそのまま利用できます。
環境を選ばないことの素晴らしさを改めて実感しました。
今のところ、プライベート利用する上では目立った問題は見つかっていません。

強いて問題点を上げるなら、トラブルシューティングがほぼ英語記事のため、問題が起きた場合は英語と向き合わなければならないという点があります。
日本語のトラブルシューティングを記事にして発信していく事で、わずかでもオープンソースの発展に貢献できるんじゃないかと思います。

パッケージ管理ソフト「YaST

LinuxディストリビューションはどのOSも類似機能があるため特徴が見つけにくいようですが、openSUSEの最大の特徴は「YaST」というパッケージ管理ソフトです。
YaSTとは、 Yet another Setup Tool (もう 1 つのセットアップツール) の略で、システム全体の設定を行なうことができるように目指して作られています。
Windowsのコントロールパネルのように見えますが、GUILinuxの操作ができるツールです。
ミドルウェアのインストールもYaSTで行うことができます。

f:id:MasaKu:20180318192253p:plain
YaSTのトップ画面

YaSTを利用したLAMP環境の構築

驚きだったのが、YaSTのソフトウェア管理メニューを利用することで、LAMP環境が一発で構築できてしまいます。

構築手順は以下の通りです。

  1. メニューの中からソフトウェアを選択しソフトウェア管理を選択
  2. 検索バーにLAMPと入力
  3. 検索で見つかった「patterns-openSUSE-lamp_server」を選択して了解ボタンを押下

f:id:MasaKu:20180318194956p:plainf:id:MasaKu:20180318192443p:plain
YaSTでのLAMP環境のインストール手順

あっという間にPHPが実行できる環境が出来上がりました。

YaSTを利用したApacheの起動

インストール完了後にApacheの動作確認を行います。
Apacheの起動もYaSTで行うことができます。

  1. メニューの中からシステムを選択し、サービスマネージャーを選択
  2. Apache2を選択して有効に変更し、開始を押下する
  3. OKを押下して、変更を確定する

f:id:MasaKu:20180318193037p:plainf:id:MasaKu:20180318193041p:plain
Apacheの起動方法

これでApacheの起動が完了です。

FireFoxlocalhostもしくはApacheを起動しているコンピュータのIPアドレスにアクセスするとApacheが起動したことを確認することができます。

f:id:MasaKu:20180318193053p:plain
Apacheの起動確認。「It works!」と表示されていれば起動成功

Apacheの設定

PHPを利用するためにはapacheを設定する必要がありますが、こちらもYaSTで設定することができます。

  1. ネットワークサービスを選択し、HTTPサーバを選択
  2. ウィザードに従ってサーバの設定を行う

f:id:MasaKu:20180318193836p:plain
PHPを利用できるようにするための設定

重要なのはSTEP2でPHPを設定することです。
それ以外は設定する必要はありません。

設定が完了したら以下のプログラムを作成して/srv/www/htdocs/に配置して確認してみましょう。

<?php
  phpinfo();

f:id:MasaKu:20180318193805p:plain
ApachePHPが使える状態になっていればphpinfo()が起動して画面が表示される

おわりに

いかがでしたでしょうか。
Linuxはサーバとしてしか利用したことがなかったため、Linuxデスクトップがここまで利用しやすいものだとは思いませんでした。
OS無しのノートパソコンを一台購入して、openSUSEを入れてしっかりと使ってみたいという気持ちにもなりました。
Linuxデスクトップに興味がある方や、古くなったパソコンを再利用してみたい、という方は利用してみてはいかがでしょうか。

参考サイト

「openSUSE Leap」がWindows 10の“ストア”に登場 ~「SUSE Linux Enterprise Server」も - 窓の杜
KDE4のデスクトップ効果の解説
さくらのVPSにopenSUSE Leap42.2が提供されたのでLAMPな環境を構築してみる

cVimを使ってブラウジングを快適に

はじめに

以前調べることが多い時期があり、効率的にブラウジングするため、cVimというgoogle Chromeで利用できる拡張機能を導入しました。cVimを使うとVimライクにブラウザを使うことができる他、ショートカットを自分で設定することができます。この記事ではcVimを使うとできることを紹介します。

やりたいこと

私がツールを導入しやりたかったことを記載します。

  • できるだけマウスを使わずにブラウジングをしたい
  • command + fのような2キーのショートカットを1キーで行いたかった
  • タブの複製や特定のページを開くといった、存在しないショートカットを使いたい

cVimのダウンロード

ダウンロードページから追加ボタン押してダウンロードします(私は追加済みのため「CHROMEに追加済み」という表示になっていますが)。 f:id:kuwa_38:20180318122758p:plain

cVimでできること(ショートカットキー)

cVimに元から備わっているショートカットキーについて幾つか紹介します。

  • fでページ内のリンクにショートカットを割り振る
    • 恐らくcVim(や似た拡張機能Vimium)を使った際に一番便利な機能です。下記の場合は続けてuを押せばラクスのホームページが開かれます f:id:kuwa_38:20180318122942p:plain
  • jで下、kで上にページスクロール(矢印キーの上下と同じ挙動)、dで下、uで上に半ページ分スクロール
  • ggでページの最上部へ移動、Gでページの最下部へ移動
  • /でページ内検索、Enterで検索文字列を確定後nで次の検索対象、Nで前の検索対象へ移動
  • giでページの一番上の検索欄にフォーカス

cVimでできること(コマンド)

:でコマンドが打てます。例えば:tabnew [URL]で「[URL]を新規タブで開く」、:tabnew [検索文字列]で「新規タブで[検索文字列]を検索した結果を開く」ことができます。また、:でコマンドモード起動した後、文字を入力するとその文字から始まるコマンドを表示してくれます(下記はtを入力した場合)。候補はtabshft + tabで移動できます。 f:id:kuwa_38:20180318123032p:plain

ショートカットのカスタマイズ

:でコマンドを打てると先ほど記述しました。とは言えコマンドを打つくらいならマウスで操作する方が早いという話です。ここではショートカットキーやコマンドを設定する方法をご紹介します。

ショートカットなどのカスタマイズはcvimのマーク > Settingsから設定できます。

f:id:kuwa_38:20180318123104p:plain

cVimrcと書かれた枠に設定を記述していきます。因みにHelpのリンクを押すと、cVimのショートカットキーやCSSの設定方法や例が載っていますので詳しく知りたい方はご参照下さい。

f:id:kuwa_38:20180318123140p:plain

ここでは例として、「ラクスのホームページを新規タブで開く」を設定してみます。

1.cVimrcに設定を記述

map [任意のキー] [挙動]で任意のキーに特定の挙動を設定できるので、下記のように設定します。これでaキーに:tabnew https://www.rakus.co.jp/が割り当てられます。

map a :tabnew https://www.rakus.co.jp/

2.画面下部のsaveボタンから設定を保存

これで設定は完了です。あとは新規のタブを開いて(設定前に開いていたタブだと設定が反映されていないためリロードが必要)、aと押せば下記のような画面が表示されるはずです。さらにEnterを押せばラクスのトップページが開かれるはずです。

f:id:kuwa_38:20180318123218p:plain

上記の例はコマンドを実行するものであったため、ショートカットキーを押したあとにEnterを押す必要がありましたが、cVimで用意されているショートカット(fjkなど)ならキーを押しただけで特定の挙動を実行できます。

設定例

最後に現在の私の設定を紹介します(使い始めて間もないのでそこまで設定してませんが...)

f:id:kuwa_38:20180318123238p:plain

unmap x

  • unmap [キー]と設定することで特定のキーをショートカットで使えなくします
    • Commandと間違ってxを押すとcVimに登録されている「現在のタブを閉じる」(closeTab)が実行されてしまうので無効にしました(タイポしなければいい話なんですけどね)

map w

  • Command + wの「現在のタブを閉じる」をw1つでできるようにしています
    • したかったことの1つ「2キーのショートカットを1キーで行いたい」を実現している設定です

map e :duplicate

  • eと押した後にEnterを押すと「現在のタブを複製する」を実行できます
    • したかったことの1つ「存在しないショートカットを使いたい」を実現している設定です

let hintcharacters "asdfgjklwertuioxcvnm"

  • fでページ内にリンクを割り振る際に使用できるキーを設定しています

set noautofocus

  • 開いた際に入力欄にフォーカスされるページだと、ショートカットを使う前に入力欄からでる(escを押す)必要があります。面倒なので、入力欄にフォーカスしないように設定しています

終わりに

この記事ではcVimについてご紹介しました。ここではCSSなどの設定には触れませんでしたが、他にも色々と設定ができるので気になった方は調べてみてください。

参考

クラウドサービスのエンジニアが読んでほしい!技術書・ビジネス書 2018

id:radiocat です。最近読んだ書籍は カイゼン・ジャーニー です。

先月、「ITエンジニアに読んでほしい!技術書・ビジネス書大賞 2018」が発表されました。

www.shoeisha.co.jp

今年の大賞は以下の通り決まったようです。

技術書部門

機械学習入門 ボルツマン機械学習から深層学習まで

機械学習入門 ボルツマン機械学習から深層学習まで

  • 作者:大関真之
  • 発売日: 2016/12/01
  • メディア: 単行本(ソフトカバー)

ビジネス書部門

職場の問題地図 ~「で、どこから変える?」残業だらけ・休めない働き方

職場の問題地図 ~「で、どこから変える?」残業だらけ・休めない働き方

  • 作者:沢渡 あまね
  • 発売日: 2016/09/16
  • メディア: 単行本(ソフトカバー)


この企画は翔泳社さんの主催で毎年開催されています。その年の旬な技術書を知ることができるので楽しみにしているエンジニアの人も多いのではないでしょうか?

というわけで、このイベントにあやかって弊社社内でもおすすめの書籍についてアンケートを取ってみました。開発部の新人から部長まで役職や職歴を問わず、特にテーマや制限も設けず、現時点で人におすすめできる書籍を1人最大5冊まで選んでもらいました。ただ、この記事のタイトルの通り弊社はクラウドサービスの会社でWeb系のエンジニアが多いため、本家の投票結果よりはジャンルが少し限定されてしまう点は念頭に置いていただければと思います。題して「クラウドサービスのエンジニアが読んでほしい!(と思っている)技術書・ビジネス書 2018」です。



RAKUS Developers に最も支持されている1冊

まずは最も多くの票を集めた技術書・ビジネス書をそれぞれ紹介します。

技術書部門:リーダブルコード

本家の技術書・ビジネス書大賞でも2014年に大賞に輝いた書籍が全体で最多の票数を集めました。初版は2012年ですが、いまだに新人からベテランまで多くのエンジニアが拠り所にしている不動の名著です。

  • 投票者のコメント

プログラマにとっては、教科書的な本だと思いました。

言わずもがなエンジニアは全員読んだほうがよい本。

ビジネス書部門:トヨタ生産方式

カイゼンのバイブルとも言える不動の名著がビジネス書のトップでした。初版は1978年で、業界を選ばず40年間読み続けられており、IT業界でもアジャイル開発を中心としてカンバンなどの形で取り入れられています。立場を選ばずマネジメントにも開発の現場にも支持されている1冊と言えます。

トヨタ生産方式――脱規模の経営をめざして

トヨタ生産方式――脱規模の経営をめざして

  • 投票者のコメント

何十年も前に考えられた方式「かんばん」が今のソフトウェア開発に生きているという点は感慨深い。

自身のソフトウェア開発プロセスを考えながら読むと、まったく製造業に限定されないことだと分かって驚く。

RAKUS Developers が選ぶオススメの5冊

次に、惜しくもトップの座は逃しましたが、多くの票を集めたベスト5を投票者のコメントと合わせて紹介します。どの本もトップの1冊に劣らない名著で、開発チーム内で話題になって薦め合ったり、読書会の題材になったりしたことで票が集まったようです。

技術書:達人プログラマー

新装版 達人プログラマー 職人から名匠への道

新装版 達人プログラマー 職人から名匠への道

エンジニアが基本とすべき考え方や視点がたくさん含まれており、経験を経てから読んでも新たな気付きがあるため手元において数年おきに読みたい本。

初心者の自分にとっては「銀の弾丸は無い」ということに改めて気付かされる一冊でした。

技術書:デザイン組織のつくりかた

UIパーツのデザインやリサーチ、UX設計など広範囲に渡っているデザイナーの仕事を1人でこなすのは現実的ではなく、ユーザーの利用とビジネス上の要求を充たすためのデザイン組織をどのようにして組み立てていくのが良いか、示唆に富んだ内容。

技術書:SCRUM BOOT CAMP THE BOOK

SCRUM BOOT CAMP THE BOOK

SCRUM BOOT CAMP THE BOOK

スクラムとは何か・どういった流れで進んでいくのかが漫画を交えて分かりやすく説明されています。

スクラムをやったことが無い人向けにスクラムがどういうものかを説明した解説書の中で最もわかりやすく、それでいて重要な要素がしっかり説明されている。

ビジネス書:「残業しないチーム」と「残業だらけチーム」の習慣

「残業しないチーム」と「残業だらけチーム」を比較しながら様々なケースを例に書いてあり読みやすいです。

すぐに実践出来ることが多いので読んですぐに試せます。

ビジネス書:入社1年目の教科書

入社1年目の教科書

入社1年目の教科書

  • 作者:岩瀬 大輔
  • 発売日: 2011/05/20
  • メディア: 単行本(ソフトカバー)

配属されて間もない頃は相談や質問の仕方で戸惑う場面もあるので参考になりました。

社会人の心構えについて大事なポイントを丁寧に解説されています。

RAKUS Developers のひとりひとりが厳選した1冊

ここまで紹介した書籍以外にもその人の立場や仕事内容によって、おすすめの書籍はまだまだたくさんあります。アンケートでは合計で100冊近くの書籍が投票されました。そこで、せっかくなので投票者ひとりひとりの推しが特に強かった1冊を、選んだ人の立場や仕事内容ごとに分類してピックアップしてみました。

若手エンジニアが選んだ6冊

前出の『リーダブルコード』や『入社1年目の教科書』も若手の票が多く集まった書籍でしたが、他にもたくさんの名著が選ばれました。これから社会人になる人にもオススメできそうです。

7つの習慣

適切な内省で自身の成長させるフローが明確かつ説得力ある形で記載されており、技術にかぎらず自身のキャリアパスなり日々の行動のヒントとなる

99%の人がしていないたった1%の仕事のコツ

99%の人がしていないたった1%の仕事のコツ (たった1%のコツシリーズ)

99%の人がしていないたった1%の仕事のコツ (たった1%のコツシリーズ)

  • 作者:河野 英太郎
  • 発売日: 2012/03/12
  • メディア: 単行本(ソフトカバー)

仕事に取り組むための姿勢やとるべき態度が記載されています

レバレッジ・リーディング

レバレッジ・リーディング

レバレッジ・リーディング

忙しい社会人でも多くの本を読むべきなので、そのノウハウを紹介している本書はとても有用です。

エンジニアを説明上手にする本

エンジニアを説明上手にする本 相手に応じた技術情報や知識の伝え方

エンジニアを説明上手にする本 相手に応じた技術情報や知識の伝え方

  • 作者:開米 瑞浩
  • 発売日: 2016/12/02
  • メディア: 単行本(ソフトカバー)

顧客/オペレーター/経営者/新人...前提知識がそれぞれ異なる人にうまく説明するにはどうすればいいかがわかりやすく掲載されています

プリンシプル オブ プログラミング

「達人プログラマー」「プログラマが知るべき97のこと」等の名著のエッセンス(=プリンシプル)が凝縮されています。

現場で使えるデバッグ & トラブルシュート Java

実践的なトラブルシュート対応方法(Javaのみ)が書いてある本。初心者向けにJavaリソースの仕組みなども学べる。

熟練エンジニアが選んだ4冊

経験を積んだエンジニアからは、さらに熟達を目指すテーマの書籍が選ばれています。経験と領域は選びますが側に置いて長く活用できそうな書籍ばかりです。

Java言語で学ぶデザインパターン入門

増補改訂版Java言語で学ぶデザインパターン入門

増補改訂版Java言語で学ぶデザインパターン入門

  • 作者:結城 浩
  • 発売日: 2004/06/19
  • メディア: 大型本

言わずとしれた名著でJavaで仕事をするなら読んでおきたい本。

カンバン仕事術

カンバン仕事術

カンバン仕事術

カンバンのやり方をよく理解することができた。

情熱プログラマー

情熱プログラマー ソフトウェア開発者の幸せな生き方

情熱プログラマー ソフトウェア開発者の幸せな生き方

  • 作者:Chad Fowler
  • 発売日: 2010/02/26
  • メディア: 単行本(ソフトカバー)

プログラマーにとって大切なことが詰まっていて、読むと前向きになれる。定期的に読み返したい。"

40歳を過ぎたら、働き方を変えなさい

40歳を過ぎたら、働き方を変えなさい

40歳を過ぎたら、働き方を変えなさい

  • 作者:佐々木 常夫
  • 発売日: 2017/05/24
  • メディア: 単行本(ソフトカバー)

色々と省略しましょうとか、若手に任せましょうとかは共感できました。

スペシャリストが選んだ4冊

社内でも特に技術志向の強いのエンジニアが選んだ書籍を集めてみました。選んだ本のタイトルからもその志向が垣間見える気がします。そして何よりも投票者のコメントがみんなアツすぎて記事を編集するほうも圧倒されてしまいました。

入門 コンピュータ科学 ITを支える技術と理論の基礎知識

コンピュータサイエンスの教科書。学生時代に情報学部ではなかった人はあまり体系的に学ぶ機会がないので読んでおいた方がいいというか読まないとどこかでITエンジニアとして頭打ちになる。

アーキテクチャを考えるとき、トラブルシューティングするとき、より良い設計やソースコードを判断するときなど、あらゆる場面の基礎となる知識が含まれる。

UNIXという考え方

UNIXという考え方―その設計思想と哲学

UNIXという考え方―その設計思想と哲学

  • 作者:Mike Gancarz
  • 発売日: 2001/02/01
  • メディア: 単行本

良い設計を考えるきっかけになった本。様々なプログラミング原則やプラクティスはここに帰着する。

どのプログラミングハウツー本を読むべきか迷ったらまずはこの1冊を読むことをおすすめする。

テスト駆動開発

テスト駆動開発

テスト駆動開発

  • 作者:Kent Beck
  • 発売日: 2017/10/14
  • メディア: 単行本(ソフトカバー)

原理主義的なテストファーストをするかどうかは別として、自動テストを書くことで得られる心理的な安心感や、高速なフィードバックループ、動くものを作ってからリファクタリング、というTDDの良さを感じてほしい。

本書前半の多国通貨を実際に写経することで、タスクを細かく(執拗なまでに細かく)分割し、自動テストに支えながら1つずつやっつけていく気持ちよさをぜひ味わってほしい。

すごいHaskellたのしく学ぼう!

すごいHaskellたのしく学ぼう!

すごいHaskellたのしく学ぼう!

  • 作者:Miran Lipovača
  • 発売日: 2012/05/23
  • メディア: 単行本(ソフトカバー)

Haskell言語の入門的読み物として代表的な本です。

実際にアプリを作れるところまではいきませんが、ファンクターやモナドといったHaskellで中心的な概念を読みやすく説明してくれています。

読んでいると何となく自分もHaskellで何か作れそうな気がしてきます。

デザイナーが選んだ4冊

デザイナーからのオススメもその仕事に沿った特徴的な書籍が選ばれました。Web系エンジニアとしても抑えておきたい本が並んでいます。

ユースケース駆動開発実践ガイド

要求からドメインモデルとユースケースを作い、ソフトのあり方を段階的に明らかにしていくICONIXプロセスについての本。 実践を想定した具体的な内容で、「こうしましょう」でなく「こうすると失敗しやすい」が書かれているので心強い。

エンジニアのための図解思考

自分の頭の中の整理の方法や考えかたなど図示するテクニックが載っているので、業務で実践しやすい。

SOSの猿

SOSの猿 (中公文庫)

SOSの猿 (中公文庫)

「自社開発した株の発注システムが誤動作して300億円の損失を出した原因を調べる」...いや、怖いです。 これを実は顧客より、UIのせいにされるんですが、UIデザイナの友人などは身に染みると申しておりました。

問題解決ラボ

固い頭を柔らかくする本

マネージャーが選んだ5冊

最後にマネージャーからもオススメの書籍を選んでもらいました。組織の方向性を示してエンジニアを束ねる視点で選ばれているのがわかります。これからマネジメントを学ぼうとしているエンジニアも読みたい書籍の数々です。

ケン・ブランチャード リーダーシップ論

リーダー、管理職等マネジメントを担うメンバは読んでおくべき基本書。

サーバント型リーダシップ、重要ですね。

1分間マネジャー―何を示し、どう褒め、どう叱るか!

管理職としてメンバーと接する時に1分という短い時間で大きな成果を得るためにを考えさせられた。

本自体は古いが1分間振り返りなどためになるものがあった。

なぜ、あなたの仕事は終わらないのか

なぜ、あなたの仕事は終わらないのか

なぜ、あなたの仕事は終わらないのか

  • 作者:中島聡
  • 発売日: 2016/06/01
  • メディア: 単行本(ソフトカバー)

タスクの進め方でお悩みの方、段取りが悪くてタスクが上手く進めれない方へ 時間術、仕事術についてわかりやすく書いています。エンジニアの著書でもあり日々の自分たちの状況とマッチする話も多いと思います。

Inspired: 顧客の心を捉える製品の創り方

[asin:B00TCM8TB4:detail]

正しい製品とは何かを考えさせられ、また正しく製品を作る方法が解説されている。

製品にはエンジニアリングはもちろんのこと、その他にもプロダクトマネジメント、UX/UIデザイン、プロジェクトマネジメント、システム運用、プロダクトマーケティングが必要で開発で関われる範囲の広さを知ることができると共にキャリアプランを考える際に参考にできる。

Joy, Inc.

ジョイ・インク 役職も部署もない全員主役のマネジメント

ジョイ・インク 役職も部署もない全員主役のマネジメント

アジャイルの理想型のイメージが掴めた

世の中にこれほどまでにJOYを突き詰めた会社がある事に驚き。その会社が口コミだけで仕事が舞い込み、ビジネスが機能しているのはまさにwin-winな関係性。素晴らしいの一言。

おわりに

手元のアンケート結果をながめてみると紹介したい本はまだまだたくさんありますが、これだけでも30冊になったので今回はここまでにしたいと思います。30冊もありますが、知らないタイトルは無いくらいどれも著名な書籍ばかりだと思います。また、投票した人の仕事内容に合わせて分類してみるとそれぞれ選ばれた書籍に特徴があったのも興味深い結果でした。自分の興味のある分野の本で未読のものがあれば読んでみてはいかがでしょうか。そして機会があればまた来年も実施してみますのでお楽しみに。

Node.js + Express + Socket.ioで遊んでみた

はじめに

id:d_shrです。
担当している商材の機能を実装する上でNode.js, Express, Socket.ioについて学習する機会があったのでまとめてみようと思います。 Socket.ioのサンプルコードを参考に簡単にチャットアプリの基本的な機能を作ってみました。
簡単にWebアプリケーションを作ってみたいという方やNode.jsやSocket.ioを学習し始めた方の参考になればと思います。

Node.js

Node.jsについては過去の記事で紹介されているので割愛します。
Node.jsの勉強会でお手軽にWebアプリを作った話 - RAKUS Developers Blog | ラクス エンジニアブログ

知ってる?nodemailerを使ってメールを送る方法 - RAKUS Developers Blog | ラクス エンジニアブログ

Express

ExpressはNode.js向けの軽量なフレームワークです。
ちょっとめんどくさい外部からの要求と内部ロジックをマッピングする基本的なルーティング機能が簡単にできたり、express-generatorによってアプリケーションの雛型が簡単に作れる便利なやつ。
詳しい説明や使い方は公式サイトに書かれています。

Socket.io

サーバとクライアント間の通信で非同期かつ双方向の通信を実現するためのプロトコルであるWebSocketを手軽に利用できるモジュールです。 Node.jsのnpmで提供されています。
詳しい説明や使い方は公式サイトに書かれています。

チャットを作ってみた

Node.js, Express, Socket.ioを利用して作ってみました。

実装した機能は2点です。
1. メッセージの送受信と表示
2. ログイン機能(Nodeサーバにリクエストがあるとログイン画面へ)

1. メッセージの送受信と表示

チャットの基本的な機能。
Socket.ioのGet startedをとりあえずやってみました。
チャットのサンプルコードでメッセージの送受信をどのように行うか説明されています。

クライアント側の処理
  • メッセージの表示や入力欄

f:id:d_shr:20180313144146p:plain

<!-- メッセージの表示 -->
<ul id="messages"></ul>

<!-- メッセージ入力欄 -->
<form action="#" id="chatForm">
  <input id="m" autocomplete="off" />
  <button>Send</button>
</form>

受信したメッセージを表示する部分と送信するメッセージの入力欄です。

  • メッセージ送信や受信メッセージの表示ロジック
<script src="/socket.io/socket.io.js"></script>
<script src="https://code.jquery.com/jquery-1.11.1.js"></script>
<script>
  var socket = io();
  var userName = '';
  $(function () {

    // メッセージを送信する
    $('form').submit(function(){
      socket.emit('chat message', $('#m').val());
      $('#m').val('');
      return false;
    });

    // 受信したメッセージを表示
    socket.on('chat message', function(data){
      var chat = data.userName + " : " + data.message;
      $('#messages').append($('<li>').text(chat));
    });
  });
</script>

通信を行うための基本的な操作は以下の2つです。
socket.emit('event', data);
イベントの発火、接続している全員(送信者含む)へdataを送信します。
socket.on('event', callback);
イベントの検知、送信されたdataを受信します。

ここでは、入力されたメッセージのSubmitをイベントchat messsageとしてサーバへメッセージが送られます。
イベントchat messsageを検知すると、サーバで処理され送信されてきたメッセージを受け取り表示します。

サーバ側の処理
  • サーバにアクセスすると実行される部分。
// モジュールを読み込む
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);

// Nodeサーバにアクセスがあるとindex.htmlへ遷移
app.get('/', function(req, res){
 res.sendFile(__dirname + '/index.html');
});

必要なモジュールをrequireで読み込み、index.html(クライアントの処理)へ遷移します。

  • メッセージの送信ロジック
// メッセージ送信処理
socket.on('chat message', function(msg){
  io.emit('chat message', msg);
});

クライアント側から送信されてきたメッセージをサーバで受け取り処理するところです。
接続しているクライアントへメッセージを送信します。
以上がチャットの基本的なメッセージのやりとりの処理になります。

2. Nodeサーバにリクエストがあるとログイン画面へ遷移

f:id:d_shr:20180313144150p:plain

理解を深めるために、データのやり取りをもう少し複雑にしてみようと思いつきで実装してみた機能。
実装したもの以下のとおりです。

  • ユーザ名を入力してログイン
  • ユーザ名を表示してメッセージを識別
  • データのやり取りにユーザの情報を追加
クライアント側の処理
  • ログインフォーム
<!-- ログインフォーム -->
<form id="loginForm">
  <div>
    <input id="username" name="username" type="text" class="form-control" placeholder="ユーザ名" autofocus />
    <button id="btnLogin">ログイン</button>
  </div>
</form>
  • ログイン処理
<script src="/socket.io/socket.io.js"></script>
<script src="https://code.jquery.com/jquery-1.11.1.js"></script>
<script>
  var socket = io();
  var userName = '';
  $(function () {
    // ログイン画面表示
    $('#loginForm').show();
    $('#chatForm').hide();

    // ログイン処理
    $('#btnLogin').on('click', function (e) {
      userName = $('#username').val();
      if (userName) {
        // チャット画面表示
        $('#loginForm').hide();
        $('#chatForm').show();
        // ユーザ情報をサーバへ通知する
        socket.emit('login', {
          userID: socket.id,
          userName: userName
        });
      }
      e.preventDefault();
    });
  });
</script>

主に追加したものはログイン時の処理です。
ログインフォームとチャットフォームの切り替え処理も入れたりしています。
socket.emit()で送信者のsocketのidと入力されたユーザ名を送信します。

サーバ側の処理
io.on('connection', function(socket){

  var loginUsers = []; //ログインユーザ

  // ログイン処理
  socket.on('login', function(userInfo){
    loginUsers[userInfo.userID] = userInfo.userName;
  });

  // メッセージ送信処理
  socket.on('chat message', function(msg){
    userName = loginUsers[socket.id];
    io.emit('chat message', {
      userName: userName,
      message: msg
    });
  });
});

ログイン時の処理とメッセージ送信時のデータを追加してみました。
ユーザの情報としてソケットIDをユーザID、クライアント側でログイン時に入力された値をユーザ名を持っています。 メッセージの送信時には、送信したユーザとそのメッセージを紐づけて、クライアント側へ送信します。
これでログイン機能、ユーザ名による識別を実現し、よりチャットっぽくなりました。

おわりに

学習したNode.js, Express, Socket.ioを使って実際にアウトプットしてみたことをまとめてみました。
環境構築と実装がすごく簡単ですぐにできます。
チャットについては、もう少し機能拡張したりコード自体をキレイにしたいと思います。

参考


  • エンジニア中途採用サイト
    ラクスでは、エンジニア・デザイナーの中途採用を積極的に行っております!
    ご興味ありましたら是非ご確認をお願いします。
    20210916153018
    https://career-recruit.rakus.co.jp/career_engineer/

  • カジュアル面談お申込みフォーム
    どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。
    以下フォームよりお申込みください。
    forms.gle

  • イベント情報
    会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください! rakus.connpass.com

人生初の勉強会参加!勉強会の選び方と参加した感想

はじめに

先日、初めて勉強会に参加したのでそのことについて記載します。初めてだったため、どんな勉強会に行けばいいのか(行きたいのか)、そもそも勉強会ってどんなものかも分かっていませんでした。この記事では、行った勉強会の内容に加え、どういった基準で選んだか、実際に行ってみてどのように感じたか、どのように情報をキャッチアップしたかについても紹介します。

参加した勉強会

私が参加した2つの勉強会と、その概要について記載します。

最新技術てんこ盛り!新年なにわTECH 祭り2018(AI・IoT編)

  • 分野:AI、IoT、Deep Learnig
  • 開催:株式会社パソナテック
  • 発表時間:25〜50分
  • 登壇者の発表を聞く聴講型
  • スケジュール:
    • 12:50〜13:00:開会挨拶
    • 13:00〜17:50:発表
    • 17:50〜18:00:閉会挨拶
  • AIやDeep Learnigの業務利用に関するお話が多めでした。ある程度AIやDeep Learningの知識はある前提で、どのように業務適用をしているかについての発表が多かった印象です

Mobile Act OSAKA #3

  • 分野:iOS、アンドロイド開発
  • 開催:フェンリル株式会社
  • 発表時間:5分のLT & 5分の質疑応答
  • 登壇者の発表を聞く聴講型
  • スケジュール:
    • 18:45〜18:50:開会挨拶
    • 18:50〜20:00:発表
    • 20:10〜21:20:懇親会
  • 発表のテーマは様々だった印象です。また、企業の方だけでなく、学生さんも登壇されており、自由な(いい意味で緩い)雰囲気でした
  • こちらもある程度、前提知識はあることが前提で発表されている人が多かった印象です

勉強会を選んだ理由と参加してみて

参加した2つの勉強会を「選んだ基準」、「参加前に考えていたこと」、「実際参加して感じたこと」、その理由を記載します。もちろん、勉強会の内容(私の場合、iOSやアンドロイドといったモバイル開発、AIやDeepLearningの業務利用)に興味があり聞いてみたかったことが大前提としてあります。

料金

  • 参加前

    • 料金が安い方がいい
      • 結果的にどちらも無料の勉強会に参加しました
      • 勉強会を探しているうちにあまり気にしなくなりました(見ていた勉強会の殆どが無料か少額だったからかもしれませんが)
  • 参加後

    • 無料でなくてもいいかなと最近は考えています
      • テーマや日程で絞るとそこまで数があるわけではないためです
      • 自分の糧になるので、払ってもいいと感じるようになったためです

形式

  • 参加前

    • 聴講形式がいい
      • ハッカソンやハンズオンなど手を動かすタイプは前提知識が必要そうだったため敷居が高かったためです
  • 参加後

    • 次はハンズオンに挑戦したい
      • 聴講形式は前提知識がないと聞いても分からないことが多い印象です。事前に調べるか、一度行って重要そうな単語は調べて次に望むといいかもと思います
      • ハンズオンでは前提知識がない人がある程度実装できるようになることが目的になっている印象です。聴講形式も良かったですが、その日中に「xxxができるようになった」という状態になるのは達成感がありそうです

懇親会

  • 参加前

    • 分からなかったため、ある勉強会とない勉強会に参加
  • 参加後

    • 懇親会はあった方がいいと感じた
      • 発表内容が専門的で分からなくても、世間話から入り自分の興味のある分野を聞けます
      • 分からない内容はその場で質問したりと柔軟に動けます(調べて分かることは後で調べる方がいいでしょうが)
      • 技術的な面のみだけでなく、他社の活動などの情報を得られることが良かったです

短時間or長時間

  • 参加前

    • 分からなかったため、以下の両方に参加してみました
      • 会社終わりに短時間
      • 休日に1日ガッツリ
  • 参加後

    • 休日の方が合っていると感じた
      • 会社終わりに短時間:
        • 会社終わりの疲れた状態では、集中力が高い状態で聞けなかった発表もありました
        • 情報のキャッチアップが主目的なら短い時間で色々な情報が得られるため適していそうです。特にMobile Actの場合は懇親会もあったので、興味ある内容を直接聞く事もできる点も良かったと思います
      • 休日にガッツリ:
        • 疲れていない状態で参加できたため、集中できた点がよかったです
        • LTでは伝えきれないような深い(詳細な)内容まで聞けたように思います

情報のキャッチアップ

参加前に一番悩んだと言っても過言でないのが、情報のキャッチアップでした。私の情報のキャッチアップの方法と登録しているサイトについて記載します。

  • 情報のキャッチアップは基本的にtwitter
    • IT勉強会@近畿をフォローして情報をキャッチアップしています
      • 1日に大体20ツイート程度勉強会の情報を発信してくれているようです
      • 個人的には、多すぎて追えないということもなく、情報が少ないということもない良い感じの量なので情報のキャッチアップに利用しています
  • 何のサイトに登録すればいいの?
    • 何かに登録しないといけないという印象はないです
      • 勉強会参加に登録が必要であったため登録している状態です
    • 今のところconnpassDoorkeeperに登録しています
      • twitterでキャッチアップして、必要であれば登録、でいいと思います

その他

  • 名刺を持って行きましょう
    • 受付で身分証明の代わりに渡すところもあります
  • 勉強会の資料はアップされることがあるので、その場合は後で見返すことも可能です
    • 私が今回参加した2つの勉強会は資料がアップされているものもありましたので、興味がある人は見てみてください

終わりに

参加した2つの勉強会と、新人の視点から行く前に抱えていた懸念事項と実際に行ってみて感じたことについて述べました。まだ2件しか参加できていませんが、(例え分からない内容が多くとも)勉強会は行っておいて損はないなと感じています。次はハンズオンにも参加してみたいと思います。

Node.jsの勉強会でお手軽にWebアプリを作った話

はじめに

こんにちは、rs_tukkiです。最近、様々な勉強会に行くことが多くなりました。
大学時代は講義だけ聞いていればいいやーの精神で、自分から技術を学ぶといったことはしてこなかったのですが、
社会人、特にエンジニアともなると、様々な技術へのアンテナを張ることが意外と重要になってきたりします。
で、それは何も特定の技術に絞る必要はなくて、新しい言語のことでも、今話題のスマートスピーカーのことでも、
なんだったらバーチャルYouTuberのことでも大丈夫です。*1その技術を知っているということが、いつか会社内でも大きなアドバンテージになるかもしれません。

さて、今回はそんな勉強会の中から先日参加させていただいたユメノソラホールディングス株式会社様主催のNode.js勉強会で、お手軽にWebアプリケーションを作ったお話をしたいと思います。

yumenosora.connpass.com

大丈夫です。許可は頂きました。

Node.jsとは?

まず作成したものの紹介をする前に、Node.jsという言語の話をしたいと思います。
Node.jsというのは一言でいえば、

サーバサイドで動作できるJavaScript環境のことです。

特徴

サーバサイドで動作できるJavaScript

さて、ここまでの三行で既に、「?」が浮かんでいる人もいるのではないでしょうか。
JavaScriptという言語は本来、ページに動きを与えることをメインとした言語です。Webページに対して、

  • 時計を表示させてみたり
  • 文字をループさせてみたり

等の動作を、いちいちサーバと通信しなくても可能にします。つまり、クライアント側で処理を行うことがほとんどなのです。
ですが、あくまでここまでの仕事は「メイン」です。Node.jsを利用すれば、サーバ側で行っているごにょごにょをJavaScriptで記述して

Node.js「クライアントもサーバも、だいたい全部私におまかせっ!」

な状態にできるのです。全ての処理をほぼNode.js一つで。おお、なんと頼もしい。

シングルスレッド

シングルスレッドとは、
Node.js「同時に一つのことしかできないんだ。ごめんね」
な仕組みのことです。
Apacheなどのウェブサーバでは、マルチスレッド(=同時にいろいろすること)によって沢山の処理をしていますが、それゆえに同時に大量のアクセスがあると、同時にすることが増えすぎて
リソースがなくなってしまう、ということが起こります。この臨界点がだいたい10,000件以上の同時接続にあることから、「C10K(クライアント1万台)問題」と
呼ばれていましたが、Node.jsはこれを解決することができるのです。

ノンブロッキングI/O

さて、Node.jsがシングルスレッドであることは説明しましたが、「じゃあNode.jsは一度にできる処理が少ないの?」というとそうでもありません。
そこで使われるのがノンブロッキングI/Oという仕組みです。これは言ってしまえば
Node.js「こっちの入力、結果出るのに時間かかりそうだから待っててね。代わりにこっちの処理先にやっちゃうよ」
という仕組みのことです。
普通のシングルスレッドの場合は、どんなに処理が遅かろうが出力が出てこなかろうが、ひとつの処理が終わらなければ次の処理に入れませんでした。
この「待ち時間」が多数の処理ができない原因なのですが、ノンブロッキングI/Oだと待ち時間の間に次に来た処理をやっておくので、
一度にたくさんのことをやっ(ているように見せかけ)たりしながら、かつ処理のためのメモリは少なくて済むのです。

メリット

フロント/サーバどちらも一貫してJavaScriptで書ける

先程も説明しましたが、これがNode.jsの最大の魅力だと思います。
簡単なWebアプリケーションをローカルで動かすだけならWebサーバすら不要で、全部Node.jsがやってくれます。

ライブラリが豊富

Node.js、本当にライブラリが多いです。適当におすすめを検索してみるだけでも出てくる出てくる。やってみたいことはだいたいできるんじゃないかってくらいの勢いです。*2
qiita.com
http://cabbalog.blogspot.jp/2017/12/npm-package-25.htmlcabbalog.blogspot.jp

npmってなんぞや?ってなるかと思いますが、
これはNode.jsのライブラリやパッケージなどを管理してくれるツールのことで、Node.jsのインストールにくっついてきます。詳しくはのちほど。

小さな処理を素早く行うのが得意

Node.jsは総じて、小さな処理を次から次へと素早く行うのに適しています。
チャットアプリなど、発言を読み込んで出力する、といった処理なら大得意と言っていいでしょう。

デメリット

同期処理が苦手

できない...とは言わないのですが、Node.js、というかJavascript自体が基本的に非同期処理で動いているので、
同期処理を実現しようとすると結構大変だったりします。このあたりは仕方ないのかも。

重い処理をすると全体のパフォーマンスが低下する

さきほど説明したように、Node.jsはノンブロッキングI/Oなどの仕組みによって少ないメモリで小さな処理を
数多くこなすことができるのですが、その処理自体が大きいと、数をこなすどころの話ではなくなってしまいます。
そのため、なるべく重い処理が関わるアプリには使わないほうが無難でしょう。

Webアプリケーションを作ってみる

さて、それでは早速、Node.jsを使って簡単なWebアプリケーションを作成してみたいと思います。
今回の勉強会で作成したのは、「今(2018年2月)現在放送しているアニメの一覧を表示する」アプリケーションです。

環境構築

Node.js

まずはNode.jsのインストールから。

今回の勉強会では、v8.9.4を利用しました。
一般にNode.jsは、「偶数verが長期サポート型、奇数verが最新機能型」らしいです。推奨は前者なのでこちらをインストール。

インストーラの起動後は画面の指示に従うだけです。インストールするコンポーネントの選択などがありますが基本はデフォルトでOK。 インストールが成功していれば、コマンドプロンプト(orターミナル)を開いて、

node -v 

と打って実行したときに、

v8.9.4

と出てくるはずです。

Atom

続いてエディターですが、特に指定はありません。
今回は使いやすさからAtomをインストールしましたが、EclipseなどのIDEを使う人もいるとか。

npm

さて、Node.jsをインストールした際に、もう一つおまけでインストールされているものがあります。
それが先ほど説明したnpm。Node.jsのライブラリやパッケージなんかを管理してくれるすごいやつです。

ひとまずは初期化処理から。 npmがインストールしたものを管理する、package.jsonというファイルを作成します。
インストール用のフォルダを作成して、その中で

npm init

を実行してください。すると、

Press ^C at any time to quit.
package name: (test)  //パッケージ名
version: (1.0.0)  //バージョン名
description:  //概要説明
entry point: (index.js)  //初期表示させるファイル名
test command:  //テストコマンド
git repository:  //Githubに保存するリポジトリ情報
keywords:  //npmの公開時に使用されるキーワード
author:  //作者情報
license: (ISC)  //npmの公開時に適用する権利情報

とまあやたら入力を求められます。とはいえ、パッケージの公開をしないのならこの辺りは全部無視でもOKです。
これが完了すると、初期化を行ったフォルダ内に、フォルダとファイルが1つづつ作成されています。

package.jsonにはインストールしていったものの情報が蓄積されていきます。そして、その実体はnode_moduleフォルダに格納されていきます。
今後、package.jsonがあるこのフォルダ内で色々インストールしていくことになります。

EJS

では早速、npmでひとつインストールしてみましょう。
今回は、Node.jsを使ったサイトのコーディングを、jspのような感じにできるEJSというテンプレートエンジンをインストールします。
テンプレートエンジンも他に色々ありますので、よければ探してみてください。

さて、先ほどのpackage.jsonがあるフォルダで

npm install ejs

と打ち込みます。package.jsonの設定を無視したので何やら警告は出ます*3が、大体数秒でインストールは完了します。
これでもう今回のコードを書く準備が完了しました。さすが環境設定も早い。

コードを書いてみる

ではここからやっとこさコードを書く作業に移ります。
勉強会では何回かに分けて順番にコードを書いたのですが...せっかくなので、完成版を見て解説していきましょう。
まずは肝となるjsファイルから。

practice2.js

//モジュールを拡張機能として読み込む
var http = require('http');
var fs = require('fs');
var ejs = require('ejs');
var url = 'http://api.moemoe.tokyo/anime/v1/master/2018/1?ogp=1';//取得するjsonファイル

var hostname = '127.0.0.1';
var port = 3000;
var server = http.createServer();//httpのサーバを作成するぞー、という関数

server.on('request', function(req, res) {//httpリクエストがあった(=アクセスされた)時に呼ばれる  

    http.get(url, function(apiRes) {//指定したURLが取得出来たら呼ばれる

        var body = '';
        apiRes.setEncoding('utf8');
    
        apiRes.on('data', function(chunk) {//データが受信されたら呼ばれる
            body += chunk;
        });

        apiRes.on('end', function() {//データの受信が終わったら呼ばれる
            var data = {};
            data.animes = JSON.parse(body);
            var template = fs.readFileSync('./practice2.ejs', 'utf-8');
            var page = ejs.render(template, data);
            res.writeHead(200, {'Content-Type': 'text/html; charset=UTF-8'});
            res.write(page);
            res.end();
        });
    });
});

server.listen(port, hostname, function() {//サーバ起動時に呼ばれる
    console.log(`Server runnning at http://${hostname}:${port}/`);
});

色々と関数がありますが、だいたいは~したときに呼ばれるという形になっています。これはイベントループという仕組みが使われているためで、平たく言えば

Node.js「とりあえず待ってるから、来たものから先にやるからね!」

という処理です。今回の場合は、最初に呼ばれるのは一番下のserver.listenになるでしょう。
...私の解説は上から行きます。

//モジュールを拡張機能として読み込む
var http = require('http');
var fs = require('fs');
var ejs = require('ejs');
var url = 'http://api.moemoe.tokyo/anime/v1/master/2018/1?ogp=1';//取得するjsonファイル

var hostname = '127.0.0.1';
var port = 3000;
var server = http.createServer();//httpのサーバを作成するぞー、という関数

まずは必要な変数の指定です。
requierというのは、Node.jsのモジュールを拡張機能として読み込む処理です。先ほどインストールしたejsの姿も。
httpは文字通りHTTPの各種機能をまとめたもので、fsはファイル操作関連の機能が入っています。

urlには、表示させるアニメ情報が書かれたテキストファイル*4が入っています。このデータを取得してejsで表示させるのが今回の目標。

hostnameportは文字通りですね。アクセスに必要です。127.0.0.1というのはいわばlocalhostのことです。

そしてserver。この処理だけでhttpサーバは作成できます。簡単すぎる...
この引数に、作成時の処理を書くのが一般的らしいですが、今回は分かりにくいのでその処理は後で。

server.on('request', function(req, res) {//httpリクエストがあった(=アクセスされた)時に呼ばれる  

    http.get(url, function(apiRes) {//指定したURLが取得出来たら呼ばれる

        var body = '';
        apiRes.setEncoding('utf8');

サーバはずっと待機状態で、指定されたポートにアクセスがあった場合に「待ってました!」と言ってserver.on以降の処理を始めます。
http.getは、引数に指定されたurlの中身を取得しようとします。成功すると次へ。
今回取得したファイルの中身はテキストファイルなので、まずは格納用の変数の用意と、文字コードのセットを行いましょう。

        apiRes.on('data', function(chunk) {//データが受信されたら呼ばれる
            body += chunk;
        });

        apiRes.on('end', function() {//データの受信が終わったら呼ばれる
            var data = {};
            data.animes = JSON.parse(body);
            var template = fs.readFileSync('./practice2.ejs', 'utf-8');
            var page = ejs.render(template, data);
            res.writeHead(200, {'Content-Type': 'text/html; charset=UTF-8'});
            res.write(page);
            res.end();
        });
    });
});

では、ここからファイルの中身を取得していきます。
「受信したら~」と「受信が終わったら~」に分かれているのは、データがあまりにも多すぎると
Node.jsは取得の完了を待たずに次の処理を始めることができるためです。
いちいち全部取得してからやるより、データを取得するたびにbodyの中に次から次へと追加していったほうが処理が早いのです。
で、無事受信が完了したら、取得したテキストファイルはjson形式に変えられて、dataに格納されます。

さて、次に行う処理ですが、ここでは表示するページの設定を行っています。
ejsファイルを読み込み、ejs.renderで先ほど取得したデータをejsページに送信しています。
res.writeHeadでHTTPヘッダを記述し、res.writeでページを指定してやればページが表示できます。

最後に、res.endで読み込みを完了させてやれば終了です。

server.listen(port, hostname, function() {//サーバ起動時に呼ばれる
    console.log(`Server runnning at http://${hostname}:${port}/`);
});

そして、これが本来最初に行われる処理です。サーバ起動時にどのような動作をするか、を記述します。
今回はコンソール出力をしておきましょう。

では、続いて表示側。

practice2.ejs

<html>
  <head>
    <title>ejs_sample</title>
    <style type="text/css">
      .div_block { width: 300px; display: inline-block; vertical-align: top;
                   margin: 5px; border: 1px solid #555; }
      .div_header { background-color: #CCC; padding: 10px;
                    height: 26px; font-size: 12px;}
      img { object-fit: cover; width: 300px; height: 160px; display:block;}
      .nodata { width: 300px; height: 160px; background-color: #EEE;}
      p { padding: 5px; font-size: 10px; display: block; height: 60px;}
    </style>
  </head>
  <body>

    <%# ヘッダー %>
    <h1>今期のアニメ</h1>
    <%# アニメ数分ループ %>
    <% for (anime of animes) { %>
      <div class="div_block">
        <div class="div_header">
          <a href="<%= anime.public_url %>"><%= anime.title %></a>
        </div>
        <% if (!!anime.ogp.og_image) { %>
          <img src="<%= anime.ogp.og_image %>" />
        <% } else { %>
          <div class="nodata">no data</div>
        <% } %>  
        <p>
          <% if (!!anime.ogp.og_description) { %>
            <%= anime.ogp.og_description %>
          <% } else { %>
            no data
          <% } %>
        </p>
      </div>
    <% } %>
  </body>
</html>

jspライクに記述ができるので、htmlに見えるけどfor文やif文が入ってたりします。
では上から。

<html>
  <head>
    <title>ejs_sample</title>
    <style type="text/css">
      .div_block { width: 300px; display: inline-block; vertical-align: top;
                   margin: 5px; border: 1px solid #555; }
      .div_header { background-color: #CCC; padding: 10px;
                    height: 26px; font-size: 12px;}
      img { object-fit: cover; width: 300px; height: 160px; display:block;}
      .nodata { width: 300px; height: 160px; background-color: #EEE;}
      p { padding: 5px; font-size: 10px; display: block; height: 60px;}
    </style>
  </head>

この部分は丸々cssが記述されています。詳しくは見ませんが、アニメ情報を一つづつ並べるためのstyleを設定しています。

    <%# ヘッダー %>
    <h1>今期のアニメ</h1>
    <%# アニメ数分ループ %>
    <% for (anime of animes) { %>
      <div class="div_block">
        <div class="div_header">
          <a href="<%= anime.public_url %>"><%= anime.title %></a>
        </div>

for文が出てきました。ひとまず、EJS独自の構文について説明します。
<%# %>はコメント扱いです。出力結果には影響しません。
<% %>は、内部がそのままjavascript構文になります。for文やif文を使いたい場所に仕込めば、簡単にループや分岐が実現できます。
<%= %>は、javascript内の変数の出力です。今回はjsonの中身を指定して出力しています。

        <% if (!!anime.ogp.og_image) { %>
          <img src="<%= anime.ogp.og_image %>" />
        <% } else { %>
          <div class="nodata">no data</div>
        <% } %>  
        <p>
          <% if (!!anime.ogp.og_description) { %>
            <%= anime.ogp.og_description %>
          <% } else { %>
            no data
          <% } %>
        </p>
      </div>
    <% } %>
  </body>
</html>

今度はif文です。取得したjsonファイルには、画像や説明の中身がないものもあるので、
そういった箇所にはとりあえずno dataと書いておきましょう。

...あ、for文やif文の閉じタグも<% %>で囲うのを忘れずに。

実行!

はい、これでひとまず完成です!すごい!かんたん!

というわけで、とりあえず実行してみます。コマンドプロンプト(or ターミナル) を開いて、

node practice2.js

...これだけ。上手く起動できれば、

Server running at http://127.0.0.1:3000

と出てきますので、早速このアドレスにアクセスしてみましょう。

しっかり画像付きで、アニメの一覧が表示されました!(流石にここに表示するわけにはいかないので隠してますが...)

おわりに

Node.jsがサーバサイドでしっかり動作してるのを確認いただけたでしょうか。
今回は簡単なアプリの作成のみでしたが、実際はもっとずっと色々なことが出来たりします。
言語を色々覚えなくてもサーバサイドまで処理できるので、初心者向けではないでしょうか。ぜひともみんなでやってみましょう!

あ、それと、勉強会、楽しいからみんな参加しよう!

おまけ

就活、いよいよ始まりましたね!
私としては、この時期だからこそ合同説明会に参加すべきだと考えています。
自分の働きたい職種が決まっていればそれらを全部見て回ると比較ができますし、そうでなくても
気になった会社の話を聴いてみると、就活のイメージがつかめると思います!

ぜひとも就活、頑張ってください!そしてご縁がありましたら、ラクスでお待ちしています!
fresh-recruit.rakus.co.jp

参考


◆TECH PLAY
techplay.jp

◆connpass
rakus.connpass.com

*1:この辺り、私が実際に参加した/参加を予定している勉強会の実例です

*2:その数、2017年11月現在で475,000件!

*3:descriptionがないとか、repositoryがないとかいった感じです。package.json自体がなくても警告が出ます

*4:のちほどjsonに変換するため、json形式で書かれています。

Copyright © RAKUS Co., Ltd. All rights reserved.