派遣で働くエンジニアのスキルアップを応援するサイト

PRODUCED BY RECRUIT

【イベントレポート】VMwareのデータセンター仮想化技術 ~仮想化の「はじまり」から、仮想化最前線まで~

株式会社リクルートスタッフィングが運営するITSTAFFINGでは、弊社に派遣登録いただいている皆さまのスキル向上を支援するイベントを、定期的に開催しています。

2018年6月29日のイベントでは「VMwareのデータセンター仮想化技術 ~仮想化の『はじまり』から、仮想化最前線まで~」と題して、ヴイエムウェア株式会社のエバンジェリストである中島淳之介さんを講師にお迎えし、仮想化ソフトウェアの定番であるVMwareによる、最新の仮想環境についてレクチャーしていただきました。

f:id:itstaffing:20180822122248j:plain

■今回のイベントのポイント

・サーバー仮想化とは?
・サーバー仮想化の設計・構築のポイント
・次世代仮想化基盤であるデータセンターの仮想化
・ネットワーク仮想化とは?
・ストレージ仮想化とは?
・AWSやAzure等のパブリッククラウドとの使い分け


【講 師】中島 淳之介さん
▲【講 師】中島 淳之介さん
ヴイエムウェア株式会社ゼネラルビジネスSE本部公共第二SE部部長兼フィールド・テクノロジスト。2010年にヴイエムウェア株式会社に入社。プリセールスエンジニアとして活躍する傍ら、エバンジェリストとして執筆活動やさまざまな研究会、イベントにて仮想化、クラウドの重要性と必然性を紹介し、最新のトレンドやテクノロジーを周知させる活動を行っている。著書に『改訂新版VMwareの基本』(技術評論社)がある。

サーバー仮想化とは?

イベントではVMwareの最新事情を知る前に、まず、サーバーの仮想化をおさらいするところからスタートしました。

f:id:itstaffing:20180822122255j:plain
▲まずは、おさらいの意味も含めて基本的なサーバーの仮想化から解説がスタート。

私たちが普段利用しているPCで、CPU使用率がずっと100%のままということはありません。ハイスペックなサーバーならば、なおのことです。

実際に、サーバーの平均CPU使用率は8.61%で、ピーク時でも14.2%という数字があるそうです。そこでソフトウェアでVM(仮想マシン)を作り、物理サーバーのハードウェアリソースを効率よく使おうというのが、サーバーの仮想化の考え方です。

f:id:itstaffing:20180822122258j:plain
▲物理サーバーをVMに置き換え、その上でOSやアプリケーションを稼働させるのがサーバーの仮想化。これにより1台の物理サーバー上で複数のVMを実行させることもでき、ハードウェアリソースを効率良く利用できるようになる。

たとえば、それまで100台の物理サーバーで動かしていたものを、10台の物理サーバー上で稼働する100台の仮想サーバーに置き換えることができるようになり、コスト面や運用・管理面、消費電力面でも大きなメリットが生じます。

サーバー仮想化の設計・構築のポイント

さて、1台の物理サーバー上で1つのOSといくつかのアプリケーションを動かすときと違い、複数のVMを動かすときには、いくつかのコツが必要になります。

個別物理システムは、いわば一戸建てのようなもので、1つのシステムがハードウェアを占有しても他のシステムに迷惑をかけません。しかし、仮想共通基盤は、いわばマンションのようなもので、1つのシステムがハードウェアを占有してしまうと他のシステムがハードウェアを使えなくなってしまいます。

特に、仮想環境ならではのリソース競合に注意が必要だそうです。

f:id:itstaffing:20180822122301j:plain
▲仮想環境では、割り込み処理が発生してもすぐに処理できず待ち時間が発生してしまう「CPU Ready」や、必要とするCPUリソースが使える状態になるまで待ってしまう「Co-Stop」が発生することもある。

また、5台の物理サーバーでクラスタリングする場合、4台を実稼働させ、1台を丸々スペアホストとして待機させておこうと考えがちですが、5台すべてを稼働させ、フェイルオーバー用のスペアリソースも5台分の余剰リソースを利用して分散させておくという考え方のほうが良いそうです。

負荷分散においてもVMwareのvSphere DRSを使うと、ライブマイグレーション(vMotion)で、メモリやCPUの負荷状況に応じて自動的にVMを異なる物理サーバー上に移動させて「統合率」の向上を図ってくれるほか、vSphere DPMでは、不要なサーバーの電源をオフにして、電力消費量を削減することも可能とのことでした。

VMwareならではの機能として、負荷分散でWebサーバーが同一の物理サーバー上に配置されてしまうような事態を避けるため、指定のVMは異なる物理サーバー上に配置するよう設定したり、アプリケーションサーバーとDBサーバーを必ず同じ物理サーバー上に配置して通信の負荷軽減を図ったりすることもできるそうです。

次世代仮想化基盤であるデータセンターの仮想化

サーバーの仮想化の先は、どこに向かうのでしょうか。

VMwareでは「Any Cloud」として、SDDC(Software Defined Data Center)を提案しています。SDDCはデータセンターを丸ごと仮想化してしまうというもので、具体的には、サーバーの仮想化、ネットワークの仮想化、ストレージの仮想化という3つの技術によって実現するそうです。

ネットワークの仮想化とは、ロードバランサー、VPN、ファイアウォール、ルーター、スイッチといった要素をそれぞれソフトウェアで仮想化するもので、大きく分けて「仮想アプライアンス型」と「分散型」の2種類の提供形態があります。

f:id:itstaffing:20180822122305j:plain
▲仮想アプライアンス型は、セグメントとセグメントの間に仮想ネットワーク機器を設置。分散型は設置する必要がなく、発生するトラフィックに対して都度かかるもの。

世の中のほとんどはデータセンター内の通信で、そのうちルーターを経由する通信は半分以下だとされています。ネットワークを仮想化すれば、ルーターやファイアウォール機器などの台数を削減し、ダウンサイジングネットワークを構築できます。

また、セキュリティ面でも大きな効果を発揮します。

たとえば、現状、マルウェアの感染を100%止めることは難しく、ゼロデイ攻撃を仕掛けられれば、数時間で情報漏洩してしまうこともあります。分散型では、このマルウェアの行動パターンを利用して、より細かくアクセスを制御することで、効果的なセキュリティ対策を施すことができるそうです。

f:id:itstaffing:20180822122308j:plain
▲マルウェアは感染したPCを起点にActive Directoryのようなディレクトリサービスを探したり、自身のIPの隣のIPを探ったりする。通常、PC間の通信はほとんど発生しないので、これをブロックする。WebサーバーとDBサーバーの通信は頻繁に行われるので必要なポートへのアクセスのみ許可する。

次にストレージの仮想化です。VMwareでは、一般的なx86サーバーの内蔵ディスクを使用して仮想的な共有ストレージを構築できます。これにより、専用のストレージ機器やSAN(ストレージエリアネットワーク)を用意する必要がなくなり、コスト面や管理面に優れ、かつ容量の融通なども利く、ストレージシステムが実現します。

f:id:itstaffing:20180822122311j:plain
▲内蔵ディスクを統合し、共有ストレージを構築。キャッシュは内蔵のSSDを利用し、SANは仮想化されたストレージネットワークVSANにより構成する。

従来のサーバーの仮想化から、このSDDCへは、段階的に移行していくことも可能だそうです。

f:id:itstaffing:20180822122315j:plain
▲従来のサーバー仮想化からSDDC実現へのロードマップ

AWSやAzure等のパブリッククラウドとの使い分け

では、SDDCと、AWSやAzureといったパブリッククラウドサービスとの使い分けについては、どのように考えればよいでしょうか。

f:id:itstaffing:20180822122317j:plain
▲SDDCとパブリッククラウドはどう使い分ければ良いのか?とても気になるところ。

コスト削減やオペレーションフリー、一時利用など、パブリッククラウドならではのメリットは多く、オンプレミスから移行したいと考える人も多いはずです。

しかし、オンプレミスにもメリットはあります。たとえば、ライブマイグレーションによる耐障害性やサービスレベルの担保は、パブリッククラウドでは利用できません。フェイルオーバーの仕組みも、アプリケーション側に実装する必要があるため、アプリケーションの再設計が必要になることがあります。

こうした諸課題を解決するべく、VMwareは2016年10月に、Amazonと提携しVMware Cloud on AWSの提供をスタートさせました。

f:id:itstaffing:20180822122321j:plain
▲VMware Cloud on AWSは、AWSのベアメタルにVMwareをフルスタックで実装したもので、オンプレミスのVMをAWSにライブマイグレーションさせることもできるようになる。

VMware Cloud on AWSは、2018年末に日本でも使えるようになる予定とのことなので、今から楽しみにしておきましょう。また、今後はAmazonだけでなく、他のパブリッククラウドベンダーとも提携していく予定だといいます。今後の動向もチェックしておきましょう。

【イベントレポート】エンジニアが生き残るためのテクノロジーの授業 [第3回]「セキュリティを確保する考え方」

株式会社リクルートスタッフィングが運営するITSTAFFINGでは、弊社に派遣登録いただいている皆さまのスキル向上を支援するイベントを、定期的に開催しています。

2018年6月15日のイベントでは「エンジニアが生き残るためのテクノロジーの授業」の第3回として「セキュリティを確保する考え方」を開催。

よく、「大事なのはわかっているけれど、何をすれば良いのかわからない」「やってもなかなか効果が見えない」という声が聞かれることの多いセキュリティ対策。今回のイベントでは、増井さんならではの視点から、セキュリティの確保について、どのように考えたら良いかを教えてもらいます。

f:id:itstaffing:20180809144634j:plain

■今回のイベントのポイント

・セキュリティに対する考え方
・個人情報を取り巻く環境の変化
・意図せず漏れるデータ
・情報漏えいを防ぐために
・役割別のセキュリティ対策


【講 師】増井 敏克さん
▲【講 師】増井 敏克さん
増井技術士事務所代表。技術士(情報工学部門)。情報処理技術者試験にも多数合格。ビジネス数学検定1級。「ビジネス」×「数学」×「IT」を組み合わせ、コンピュータを「正しく」「効率よく」使うためのスキルアップ支援や、各種ソフトウェアの開発、データ分析などを行う。著書に『おうちで学べるセキュリティのきほん』『プログラマ脳を鍛える数学パズル』『エンジニアが生き残るためのテクノロジーの授業』『もっとプログラマ脳を鍛える数学パズル』(以上、翔泳社)、『シゴトに役立つデータ分析・統計のトリセツ』『プログラミング言語図鑑』(以上、ソシム)がある。

セキュリティに対する考え方

セキュリティと聞くと「やることが多い」「やってもやってもきりがない」「効果が見えない」という声が聞かれます。確かに、何らかのインシデントが発生して初めてセキュリティ対策が機能しているかどうかがわかるため、普段から、その効果が見えるわけではありません。

そんな私たちに、増井さんは「セキュリティ対策についての考え方を理解する」ことが大切だと説明します。

たとえば、一般のインターネットユーザーとセキュリティのエキスパートでは、セキュリティ対策に対する考え方が違います。

f:id:itstaffing:20180809144640j:plain
▲一般ユーザーはアンチウイルスソフトを使うが一位だが、エキスパートはアップデートが一位。強固なパスワードを使うは、両者で順位が異なる。

IPAの調査によると、近年、情報セキュリティの脅威は、お金にからむものが多くなっているそうです。コンピュータを使用不能にして、直接身代金を要求するランサムウェアはもちろんですが、不正アクセスにより情報を盗み出すのも、結局はその情報を販売するという金儲けが目的です。したがって、悪意のある相手に情報を渡さないこと、コンピュータを使用不能にされた場合の対策を立てることが重要となってきます。

「最近、銀行強盗って聞いたことがありますか?近年は専門家がいろいろな対策を講じているので、銀行強盗はなかなか成功しません。そこで成功率の高い、お年寄りに対する詐欺が横行しています。それと同じようなことがネットでも起きているのです」(増井さん)

f:id:itstaffing:20180809144644j:plain
▲専門化集団を抱えている組織よりも、全然知らない素人を狙うというターゲット変更がネット上でも起きている

では専門家のいない組織、あるいは個人における対策はどうすれば良いのでしょうか?
増井さんによれば「対策自体は、これまでとそう大きくは変わりません。それより、今、どんな手口があるか知っておくことが大切」だそうです。

そして、対策という点では「みなさんの側にも問題がある」と言います。

f:id:itstaffing:20180809144647j:plain
▲いくらセキュリティソフトウェアが優れ、対策の方法が確立されていても、人の脆弱性があると効果がない。個人の意識を高めておく必要がある

個人情報を取り巻く環境の変化

個人情報保護法やサイバーセキュリティ基本法、マイナンバー法など、個人情報の取り扱いを制限しつつ、個人情報を有効に活用するための法律や制度も、時代と共に変わっています。

そのいっぽうで、情報漏えい事件も2009年以前と2010年以降では、その手口が変わってきており、2010年以降は、100万件以上の情報漏えい事件はほぼ不正アクセスによる漏えいとなっています。不正アクセスとは、インターネットやLANなどから不正にシステムを利用することを指します。

そうした不正アクセスの手口として特定の組織を狙ったメールに、ウィルス入りのファイルを添付し、開封させ感染させるという標的型攻撃があります。標的型攻撃への抜本的な対策は、ほとんどないのが実情だそうです。したがって、感染を広げない、情報を漏えいさせないといった、入口・出口対策が必要となるそうです。

f:id:itstaffing:20180809144650j:plain
▲標的型攻撃の抜本的な対策はないのが実情

意図せず漏れるデータ

ユーザーのセキュリティ意識によっては、意図せず情報漏えいになってしまうケースもあるそうです。

f:id:itstaffing:20180809144653j:plain
▲情報漏えい対策には、ユーザーの意識の持ち方も大切

たとえば、メールソフトの誤操作や、誤送信などで、自ら他人に情報を送ってしまうというケースがあります。グーグルのGmailには、送信ボタンを押してから一定時間経過後に送信する、誤送信防止機能が用意されており、このような機能を使うことも有効です。

また、SNSやブログに書き込んだ何気ない一言で会社の動きなどを読み取られてしまったり、写真をアップロードすることで、自ら位置情報を発信してしまったり、というケースもあります。

f:id:itstaffing:20180809144657j:plain
▲情報発信のつもりが情報漏えいをさせていたということもある。

情報漏えいを防ぐために

では、情報漏えいを防ぐにはどうすれば良いのでしょうか?

まず、認可と認証についての管理をしっかりと行うこと。認可はアクセス権のことで、認証はユーザーが本人であることの確認(いわゆるIDとパスワード)です。

f:id:itstaffing:20180809144700j:plain
▲共用のアカウントが存在していないか、退職した人のIDやパスワードが、そのままになっていないかなども注意

次に、ファイルと通信の暗号化です。Excelでもワークシートを暗号化してパスワードを設定できますが、ユーザーは、鍵の強度や管理を意識しておく必要があります。一方で、通信の暗号化は、ユーザーが鍵を意識する必要はありません。

f:id:itstaffing:20180809144703j:plain
▲ユーザーも暗号化が適用される範囲を意識しておく必要はある

不正な持ち出しを防ぐには、持ち出しの管理、USB接続の禁止のほか、上司の承認がないと外部接続できないような制度作りも挙げられます。

盗難・紛失を防ぐには、入退室の管理、キャビネットへの保管、IDカードの装着、監視カメラの導入、座席配置の変更などがあります。

複雑なパスワードを設定するという対策は、IDとパスワードを不正に入手されてしまった場合には意味を持ちません。むしろ、ICカードや指紋認証の導入や、IDとパスワードを入力すると携帯やスマホにキーワードを送信する二要素認証が有効だそうです。

結論として、「お金は銀行に預ける」のと同じように「データはデータセンターに預ける」という考え方で、データセンターやクラウドサービスを利用するというのが、増井さんのお勧めだそうです。

役割別のセキュリティ対策

自前でセキュリティ対策を講じる場合、どうすればよいのでしょうか。組織ならば、それぞれ役割があり、役割に応じたセキュリティ対策があります。

脆弱性への対応(ソフトウェアの更新)やバックアップは、全員がとるべき対策です。バックアップは、かつてはディスクの故障やウィルスに感染したファイルを元に戻すという目的でしたが、今では、ランサムウェアにPCを乗っ取られたときの対策という意味合いが大きいそうです。

開発者は脆弱性診断の実施とWAFの導入、管理者はIDSやIPS、ファイアウォールなどの導入・ログチェックを忘れないこと。

f:id:itstaffing:20180809144705j:plain
▲不正アクセスを見つけるには、平時からログをチェックしておくことも重要

Web管理者は、常時SSL(トップページからHTTPSを使用)を検討すべきで、セキュリティの面もさることながら、Google検索の結果ではHTTPSのサイトを上位に表示するようになっているため、SEO対策としても意味があるそうです。

メール管理者はSMTP over SSLや POP over SSLを導入するか、無理ならGmailへの移行を検討するべきだそうです。

経営者や管理者は、システム全体を俯瞰し、入口と出口で、情報漏えいを防ぐための対策を意識し、講じておく必要があります。

f:id:itstaffing:20180809144708j:plain
▲ウィルスの侵入を100%防ぐのが難しい。そのため被害を最小限にとどめる措置を講じておく

今回のイベントを通じて、普段なかなか実感のわかないセキュリティ対策について、知ることができたのではないでしょうか。特に、増井さんの「お金は銀行に、情報はデータセンターに」という言葉はとても印象的でした。セキュリティを学ぶ第一歩として、身の回りの情報の管理を見直すのもよいでしょう。

【イベントレポート】堅牢で使いやすいUIを効率良く設計するためにAtomic Designを知る

株式会社リクルートスタッフィングが運営するITSTAFFINGでは、弊社に派遣登録いただいている皆さまのスキル向上を支援するイベントを、定期的に開催しています。

2018年6月6日には「堅牢で使いやすいUIを効率良く設計するためにAtomic Designを知る」を開催。「UI設計」という言葉はよく耳にする、目にもする。しかし、何から学べばいいのか、という人も多いはず。「UIを化学の原子に見立てて設計する」という「Atomic Design」を、実装レベルで国内において初めて導入した五藤佑典さんを講師にお迎えし、近年増えているアジャイル開発にも適した堅牢で使いやすいUI設計について、今、開発者が知っておくべきことをレクチャーしていただきました。

f:id:itstaffing:20180724105812j:plain

■今回のイベントのポイント

・アジャイルな開発現場とデザイン
・UI 開発の現場における問題
・UI構造のデザイン
・UIのコンポーネント化
・Atomic Design 方法論、実践論
・現場におけるポイント


【講 師】五藤 佑典さん
▲【講 師】五藤 佑典さん
株式会社サイバーエージェント所属のエンジニア。米国カリフォルニア州立大学サンバナディーノ校でグラフィックデザインを学んだ後、大手IT会社にてマーケティングとデザイン業務に従事。現職でエンジニアに転向。「AbemaTV」にてUI設計に携わり、実装レベルで国内において初めてAtomic Designを導入した。技術領域を動画へと広げて、「AbemaTV」の動画技術戦略に携わり、国内外で動画事業における技術研究を行っている。著書に『Atomic Design~堅牢で使いやすいUIを効率良く設計する』(技術評論社)がある。

▼今回の投影スライドは、こちらから確認できます
https://www.slideshare.net/ygoto3q/atomic-design-for-agile-ui-development-100961721

アジャイルな開発環境

参加者の中で、アジャイル型の開発に参画しているという方は少なめでしたが、五藤さんが勤務しているサイバーエージェントでは、社内の携わったすべてのプロジェクトがアジャイル型で開発されているそうです。

「アジャイル型の開発は、おおまかな計画と仕様で、イテレーションごとに機能リリースを繰り返していくため、開発途中に仕様変更や設計変更があることが前提となります」(五藤さん)

f:id:itstaffing:20180724105818j:plain
▲UI変更が多発するアジャイル開発に強いデザインとは?

そうしたアジャイルな開発におけるデザインをどうしていくかは、開発チームにとって大きな課題だったと言います。なぜなら、UI変更を繰り返し適用することで、せっかくのデザインが壊れてしまうことがあるからです。そこで、アジャイル開発に適した、強い構造のUIデザインが必要になります。それが今回のテーマでもある「Atomic Design」です。

「Atomic Design」では、UIのパーツを、次の5階層に分けます。

・Pages(ページ)
・Templates(テンプレート)
・Organisms(有機体)
・Molecules(分子)
・Atoms(原子)

f:id:itstaffing:20180724105821j:plain
▲各階層レベルのパーツは、単体でも使用可能で、小さいパーツを組み合わせて、上位層の大きいパーツを組み立てる。大きいパーツは小さいパーツに依存するが、依存は一方向で、小さいパーツは大きいパーツには依存しない。

「これにより、たとえばOrganismsに属するパーツに変更が入っても、そのパーツを利用しているTemplatesやPagesといった上位層のパーツにしか変更が発生しません。したがって、変更の影響が及ぶ範囲を制限できます。このように、階層構造にすることで変更に強いデザインが生まれます」(五藤さん)

構造のデザイン

UI開発のワークフローは、一般的に、ディレクターがワイヤーフレームを作り、デザイナーに伝え、デザイナーはデザインカンプを作ってエンジニアに伝えます。

こうしたデザインカンプ・ファーストのワークフローでは、たとえば「端末によっては描画が異なる」とか「ここはなぜ赤なの?」とか「この微妙なラインの太さの重要性は?」など、デザインカンプだけでは伝えきれないデザインの要素や意図があります。

「これらのデザインの要素や意図は、デザイナーの頭の中にしか無く、エンジニアはこれを想像で補うことも多く、また、後に引き継いだデザイナーも想像で、補います。これを繰り返すうちに、少しずつズレが生じ、どんどん負債として溜まっていきます」(五藤さん)

これを抑止するツールとして、スタイルガイド、コンポーネントリスト、パターンライブラリ、デザインフレームワーク、デザインシステムなどが知られています。Atomic Designもデザインフレームワークの一つと考えることができるそうです。

デザインカンプ・ファーストでUIを構造化する場合は、行動プロセスを基準に考えることをお勧めします。

f:id:itstaffing:20180724105824j:plain
▲デザインカンプ・ファーストにおけるUIの構造化

Atomic Designのような階層化アーキテクチャを使ってUIを構造化する場合は、行動プロセスを「デザインにおける関心の層」で階層化すると良いでしょう。

f:id:itstaffing:20180724105828j:plain
▲Atomic Designを使ったUIの構造化

関心の層で階層化することで、問題を同じ層の中で解決するという基本原則が成り立ちます。同一層の関心事なら、別のコンポーネントに差し替えることで解決が図れるというのが階層化アーキテクチャの考え方です。

Atomic Designでは、UIのコンポーネント化を図り、各階層内で差し替え可能になるようにデザインしていきます。

f:id:itstaffing:20180724105831j:plain
▲Atomic Designのコンポーネントのイメージ

Atomic Designの方法論

では、Atomic Designのコンポーネントとは、具体的にどのようなものでしょうか。五藤さんは、最小要素から順に、紹介してくれました。

・Atoms
機能的にこれ以上分解できないUIの最小要素。たとえば、LABEL、INPUT、BUTTONなど、プラットフォームのデフォルトUIにスタイルを適用して、デザインする。

・Molecules
Atomsを組み合わせてユーザーの具体的な動機に応える機能を提供する。たとえば、LABELとINPUTとBUTTONを組み合わせて、検索ボタンのコンポーネントをデザインする。

・Organisms
Moleculesを組み合わせて、単体コンポーネントで完結するコンテンツを提供する。たとえば、検索ボタンコンポーネントを配置し、グローバルナビゲーションを含んだヘッダなどは、この階層のコンポーネントとしてデザインする。

・Templates
その名の通り、ページのひな形を提供する。下位層の各コンポーネントが、ページ上で正しくレイアウトされるかを確認することができる。

・Pages
Templateのコンポーネントに実際にコンテンツを流し込んだもの。

Atomic Design実践論

さらに、あるインターネットTVのWebサイトを例にデザインされた実際のページで具体的な実装についても紹介してくれました。

f:id:itstaffing:20180724105834j:plain
▲ページ全体がTemplate。ヘッダやパンくずリスト、通知一覧(コンテンツ)などがOrganismsとしてデザインされていますが、通知一覧を構成するそれぞれの通知もOrganismsである。

通知の中の要素を順に切り出していきます。画像はAtomsで、番組系の表示もAtomsですが、バルーンチップやゴミ箱のように、さらに細かく分解できる削除ボタンはMoleculesとして切り出します。

切り出した削除ボタンを例にとると、まず構成要素であるAtoms: Balloonを実装します。例えばReactを使って簡単なサンプルコードを書くと次のようになります。

f:id:itstaffing:20180724105837j:plain
▲<Balloon>削除する</Balloon>と記述すると「削除する」というメッセージのバルーンを表示します。

同様に<TrashCanIcon/>と記述することでゴミ箱アイコンを表示するコンポーネントもAtoms: TrashCanIconとして実装します。そして、これらのAtomsを組み合わせてMolecules: DeleteButtonを実装します。

f:id:itstaffing:20180724105843j:plain
▲<DeleteButton/>と記述することでバルーンチップを備えたゴミ箱アイコンを表示する。

そして、DeleteButtonや、画像、番組系など他のAtomsを組み合わせて、通知領域をOrganisms: Notificationとして実装します。

f:id:itstaffing:20180724105846j:plain
▲Notificationを実装する。
f:id:itstaffing:20180724105849j:plain
▲NortificationListを表示させるには、上記のようなコードを記述する。

こうして階層別にコンポーネントを作っていき、最終的にPagesを作り上げていくのだそうです。

現場におけるポイント

最後に、現場でAtomic Designを導入する際のポイントや、メリットについても紹介してくれました。

「コンポーネント・ベースでUIを開発すれば、レビューコストを下げることができます」(五藤さん)

Atomic Designでは、UIコンポーネントごとにレビューできるため、スコープも限定されます。また、文言レビューやデザインレビューにおいて、ディレクターやデザイナーがコードを直接修正する場合も、GitやGitHubのようなソースコード管理ツールの決まった使い方を少し覚えるだけで可能になり「全体の構造を知らないから怖くてできない」という課題を解決できます。しかもこのとき、修正者がデザイナーならば、デザインレビュー・コストはゼロで済むといいます。

五藤さんは「既存のワークフローを活かすのであれば、デザインカンプを情報デザインと認識すると良い」とアドバイス。そして、カンプからこぼれた要素を、デザイナーとエンジニアが一緒に時間を取り、拾っていけば良いそうです。

また、Atomic Designにより、テストコストを下げる働きもあるとのこと。たとえば、退会手続きのUIを変更した場合に、テスト用のユーザーを作り、退会の手続きをとるテストを行いますが、Atomic Designならば、アプリケーションと切り離されているので、パターン再現が容易であり、コンポーネント単位でテストできます。

今回のイベントで、UIデザインの方法論も、開発スタイルに合わせて進化していることがわかりました。まだまだ、Atomic Designが導入されている現場は限られていると思いますが、その考え方はとても合理的で、普段のデザインにも応用できそうです。

【イベントレポート】エンジニアだからこそ、今さら聞けないアルゴリズムの基本

株式会社リクルートスタッフィングが運営するITSTAFFINGでは、弊社に派遣登録いただいている皆さまのスキル向上を支援するイベントを、定期的に開催しています。

2018年5月30日のイベントは「話題の人気アプリの作者が登場!エンジニアだからこそ、今さら聞けないアルゴリズムの基本」を開催。

エンジニアなら誰もが耳にしたことがある「アルゴリズム」。なんとなく知ってはいるけれど、細かく学んではいないという人も多いのではないでしょうか。2018年5月現在で100万ダウンロード越えを達成、2016年のApp Store「今年のベストApp 10選」に選出されたアプリ「アルゴリズム図鑑」の作者である石田保輝さんを講師にお迎えして、楽しくアルゴリズムの基礎の基礎を教えていただきました。

f:id:itstaffing:20180719122112j:plain

■今回のイベントのポイント

・アルゴリズムとは
・具体的なアルゴリズムのご紹介
・アルゴリズムと計算量
・アルゴリズムの理論


【講 師】石田 保輝さん
▲【講 師】石田 保輝さん
東京在住のフリーランスエンジニア。2011年、京都大学大学院修士課程修了。いくつかのベンチャー企業を渡り歩いたのち、フリーランスとして独立。2016年、個人で制作したエンジニア向け学習アプリ「アルゴリズム図鑑」をリリース。世界100万DLを達成。「Appleの選ぶ2016年のベストアプリ」に選出される。

アルゴリズムとは

アルゴリズムとは、ある問題を解決するときの計算の厳密な手順で、例えるなら料理のレシピのようなもの。たとえばカレーを作るレシピならば、玉ねぎを炒める、肉を炒める、野菜と水を入れて煮込む、ルーを入れるという手順が一般的です。しかし、ルーを使わずスパイスを調合して本格的に作るなど、その他のレシピも存在します。同じ料理を作るにも、いくつかのレシピがあるように、アルゴリズムも、同じ問題を解決する複数のアルゴリズムがあるそうです。

また、ソート(バラバラに並んだ数字を小さい順に整列させる)や探索(多数のデータの中から目的の値に一致するデータを探す)など、さまざまな問題を解決するアルゴリズムがあるそうです。

f:id:itstaffing:20180719122118j:plain
▲カレーを作る手順がレシピ、問題を解決する手順がアルゴリズムということに納得しました

近年ではコンピュータと人間の将棋の対戦が注目されていました。十年前はコンピュータが人間に勝てなかったのですが、今はコンピュータが圧勝しています。「これは将棋のアルゴリズムが、ここ十年で格段に進歩したからなのです」(石田さん)

具体的なアルゴリズムの紹介

ここで、アプリ「アルゴリズム図鑑」を使って、バブルソートやリスト探索のアルゴリズムをデモンストレーションしてくれました。

f:id:itstaffing:20180719122122j:plain
▲バブルソートのアルゴリズムが動きでわかるスマホアプリ「アルゴリズム図鑑」

アプリ「アルゴリズム図鑑」は、アニメーションを使って説明が行われるため、リスト探索では線形探索と2分探索の考え方の違いだけでなく、両者の処理時間の差もよくわかりました。

f:id:itstaffing:20180719122125j:plain
▲中央値で2つのグループに分け、探索する値が含まれていないグループをバッサリと切り捨てていく2分探索のアルゴリズムは、正直、目からウロコでした

次に暗号のアルゴリズムについてです。石田さんは「いるぎなえ」という文字列を示し、これはどういう意味かと問います。実は、あいうえお順に1文字ずつ前にずらすと「ありがとう」という文字列になります。昔からある「シーザー暗号」と呼ばれるアルゴリズムですが、暗号は、このように元の文に戻す(復号)方法を相手が知らなければ通用しません。

コンピュータのデータは数値なので、暗号アルゴリズムでは、ある数を別の数に変換します。このときに鍵(何らかの関数)を使います。暗号化と復号化に同じ鍵を使う暗号方式を「共通鍵暗号」と呼び、前述のシーザー暗号のほかにも、AES、DESなどのアルゴリズムが知られているそうです。

共通鍵暗号方式の課題は、鍵を相手にどう渡すかということ。ネット経由で送ると、途中で鍵そのものが盗まれてしまう危険性がありますし、(メモリカード等にコピーして)直接受け渡しするとなると、相手が手渡しできる人に限定されてしまいます。

そこで登場するのが鍵交換プロトコルや、公開鍵暗号というアルゴリズムです。公開鍵暗号は、暗号化に使う公開鍵と復号化に使う秘密鍵という、2つで一組の鍵を使います。そして、公開鍵や暗号化されたデータから、秘密鍵を割り出すことができません。

f:id:itstaffing:20180719122128j:plain
▲ペアとなる公開鍵(P)と秘密鍵(S)でそれぞれ暗号化と復号化を行う

つまり、公開鍵で暗号化したデータは、秘密鍵を持つ人にしか元に戻せません。そのため公開鍵を文字通り公開し、それを使って暗号化したデータを送ってもらい、自分だけが持っている秘密鍵で復号します。公開鍵暗号方式ではRSA暗号が有名だそうです。

また、ハッシュ関数についての解説もありました。ハッシュ関数は、データを通すと元の状態が失われバラバラになり、また、どのようなデータを入力しても、出力値の桁数(ビット数)が同じになります。しかも、同じデータを入力すると同じ結果になる一方で、1ビットでも違うデータを入力すると全く違う結果になります(ただし、ごく稀に別のデータでも同じ結果になることもあるそうです)。そのため、ハッシュ値から元の状態を推測することはできません。

ハッシュ関数は、パスワードの保存やハッシュテーブル、仮想通貨のマイニングなどにも利用されているそうです。

f:id:itstaffing:20180719122132j:plain
▲ハッシュテーブルはどこかで聞いたことがあるような……

ハッシュテーブルは「連想配列」とも呼ばれ、最新のプログラミング言語には漏れなく実装されていて、rubyならば次のように記述します。

fruit_colors = {"apple" => "red", "banana" => "yellow"}

上の例ではfruit_colorという配列で「apple」や「banana」という文字列のハッシュ値を添え字にして、色の名前を格納します。もし、同じハッシュ値になる場合は、色名をリストとして保存し、アクセス時は線形探索をするそうです。

f:id:itstaffing:20180719122135j:plain
▲ハッシュ値が同じときは、線形リストとして保存する

ハッシュテーブルは、要素数が増えても、一般に、配列に比べて、速くアクセスできるという特長があるのだそうです。

アルゴリズムと計算量

「バブルソートの計算量は?」と問われたときに、何と答えれば良いでしょうか。「1秒」「1000回」「10Mバイト」という答えは、ハードウェアの処理速度やデータ量により異なるため、いずれも意味がありません。

アルゴリズムにおいては、入力量が変わると実行時間がどのように変化するかが重要で、この変化量を表すためにオーダーという考え方を用いるそうです。たとえば入力量nに対してn~2(nの2乗)に比例して実行時間が増える場合はO(n^2)と記述します。

主要なアルゴリズムの計算量は次の通りだそうです。

f:id:itstaffing:20180719122139j:plain
▲上から順に、入力量nが増えると重くなることを示しているそうです

線形探索はO(n)で、プログラミングにおいて配列を列挙するのは線形検索と同じなので計算量はO(n)となります。ただし、これを二重ループにしてしまうとO(n^2)となり、処理がとても重くなってしまいます。

f:id:itstaffing:20180719122142j:plain
▲データ量が増えたときの計算量の増加パターン。O(n)に対するO(n^2)の上昇率に注目

したがって大量の要素数になるプログラムでは、極力、配列の二重ループを避けるべきだそうです(意図せず二重ループになっていることもあるので、注意が必要)。

f:id:itstaffing:20180719122147j:plain
▲for文で配列にアクセスしている部分は意識しやすいが、forループの中に無意識のうちに線形探索を使っていることもある

これを回避するには、前述のハッシュテーブルを使うと良いとのことです。ハッシュテーブルの計算量はO(1)で、入力量nに依存せず、定数的な処理ができるため、入力量の増加に伴って急激に処理が重くなるということはなくなります。

石田さんによれば、あらかじめnが小さいことがわかっているならば、人が見てわかりやすい、実装が単純なアルゴリズムを選ぶというのもありなので、状況に合わせて選べば良いということでした。

アルゴリズムの理論

最後に、アルゴリズムでは解けない問題や、アルゴリズムで解くのが難しい問題についても解説してくれました。

その中でも有名な「巡回セールスマン問題」では、計算量nが指数になってしまいます。「オーダーが指数になると、コンピュータで解くのは現実的でなくなる」のだそうです。

f:id:itstaffing:20180719122152j:plain
▲アルゴリズムについて深く考えたことがなかったので、とても勉強になりました

アルゴリズムという言葉はよく聞きますし、プログラミングの入門書でもほんの少しだけかじったことがあるものの、計算量がこれほど違うということを知らなかった方も多いのではないでしょうか。大規模なプログラムを開発するときには、本当に大切なことなのですね。また、アルゴリズム図鑑のアプリは、動きで説明してくれるので、とてもわかりやすいです。皆さんもダウンロードしてみてください。

【イベントレポート】エンジニアが生き残るためのテクノロジーの授業 [第2回]「プログラミングとアルゴリズムの学び方」

株式会社リクルートスタッフィングが運営するITSTAFFINGでは、弊社に派遣登録いただいている皆さまのスキル向上を支援するイベントを、定期的に開催しています。

2018年5月18日のイベントでは「エンジニアが生き残るためのテクノロジーの授業」の第2回目として「プログラミングとアルゴリズムの学び方」を開催。

常に学ぶことが求められるエンジニアですが、何を学んだらよいのかが見えないという状態に陥りやすいもの。そんな状態を打破するために、今回は、増井さんならではの視点から、技術の学び方や最低限の知識を考えるきっかけを教えてもらいました。

▼第1回のイベントレポートはこちら
https://www.r-staffing.co.jp/engineer/entry/20180608_1

f:id:itstaffing:20180710110320j:plain

■今回のイベントのポイント

・プログラミングを学ぶ前に
・プログラミング言語を選ぶ
・どうやってプログラミングを学ぶか
・なぜアルゴリズムの勉強が大切なのか


【講 師】増井 敏克さん
▲【講 師】増井 敏克さん
増井技術士事務所代表。技術士(情報工学部門)。情報処理技術者試験にも多数合格。ビジネス数学検定1級。「ビジネス」×「数学」×「IT」を組み合わせ、コンピュータを「正しく」「効率よく」使うためのスキルアップ支援や、各種ソフトウェアの開発、データ分析などを行う。著書に『おうちで学べるセキュリティのきほん』『プログラマ脳を鍛える数学パズル』『エンジニアが生き残るためのテクノロジーの授業』『もっとプログラマ脳を鍛える数学パズル』(以上、翔泳社)、『シゴトに役立つデータ分析・統計のトリセツ』『プログラミング言語図鑑』(以上、ソシム)がある。

プログラミングを学ぶ前に

「エンジニアが生き残るためのテクノロジーの授業」の第2回は、「学び方」を中心に紹介してくださりました。

まずは会場の参加者に対するアンケートからスタート。「作りたいソフト、ありますか?」という質問です。選択肢は「既に作っている」「作りたいものはある」「まずは勉強してから」「まったく思い浮かばない」の4つ。最も多かった回答は「まずは勉強してから」でした。

このうち「作りたいものはある」という人は、すぐにアクションを起こすべきだそうです。しかし「まずは勉強してから」という人は、問題があるとのこと。これを選ぶ人は、言語を選ぶまでに悩み、環境を作るのに悩み、始めた後も少し難しいことが出てくると投げ出してしまう傾向にあるそうです。プログラミングはあくまでも手段であり、目的をしっかり持つことが重要だと説きます。

f:id:itstaffing:20180710110327j:plain
▲「まずは勉強してから」は本末転倒。まずは目的を持つことが先決

増井さんによれば、世の中には「今からプログラミングを勉強してどうするの?」という懐疑的な人もいるそうです。しかし、増井さんの第1回イベントでも紹介があったように、エンジニアのキャリアパスは一直線ではありません。プログラミングの知識を養うことでキャリアパスが多彩に広がります。では、いつ学べば良いのでしょうか?やはり、歳をとってから学ぶよりも、今のうちに学んでおいたほうが良さそうです。

プログラミング言語を選ぶ

では、プログラミングを始めるにあたって、どのプログラミング言語を選べば良いのでしょうか?
これからプログラミングを始める人にとって、一番気になるテーマでしょう。

増井さんはポイントを次のようにまとめてくれました。

・必ずしも新しいものが良い、というわけではない
・これを学んでおけば絶対という言語はない
・最終的には2~3種類の言語を学ぶべき

趣味でプログラミングを行うならば自分の好きなものが選べます。このとき、自分の目的とするアプリやサービスが、どのような言語で開発されているかを調べると良いそうです。

f:id:itstaffing:20180710110330j:plain
▲趣味ならば、目的に合わせた言語を自由に選べる

次に開発環境を考えます。現在はIDE(統合開発環境)が普及しており、コーディング~コンパイル~実行~デバッグといった一連の作業を同一環境内で行えます。また、さまざまなフレームワークや自動化ツールの登場により、工数のかかる開発も効率良く行えるようになっています。

f:id:itstaffing:20180710110333j:plain
▲言語を選ぶ際、開発環境も考えておく

環境構築で悩みたくなければ、手軽に利用できる言語を選ぶという方法もあります。JavaScriptは、Webブラウザさえあれば実行できるので、すぐに始めたい人に向いており、VBAはPCにExcelが入っていれば使えます。PHPはレンタルサーバーを借りると、概ねどのサービスでも用意されているそうです。

どうやってプログラミングを学ぶか

言語が決まれば、次はどう学ぶかです。

まずは、最も一般的な書籍で学ぶ方法から。増井さんのお勧めは3種類の本で学ぶこと。最初は基礎を理解するための入門書、次はより深く理解するための詳しい解説書、そして最後は、実際にプログラムを作成するときに役立つ逆引き書だそうです。また、サンプルコードをコピー&ペーストでなく、自身で入力していくことも大切とのことです。

いっぽう、IDEや自動化ツールなどの使い方については動画を見るのがお勧めで、動画サイトで検索すると、見つかるそうです。

また、プログラミングそのものもオンラインで学ぶ方法もあります。

f:id:itstaffing:20180710110336j:plain
▲「ドットインストール」「Schoo」のほか、予備校や放送大学を利用するという手も

そのほかにも、勉強会で学ぶという方法があります。また、継続するには仲間を作るというのも大切なこと。勉強会に行って友達を作れれば一石二鳥ですね。

注意したいこと

プログラムにバグがあるのは論外ですが、予期せぬ脆弱性があると攻撃の対象とされてしまう危険性もあります。そのため入念なテストが必要ですが、近年では、端末の多様化、タッチパネルの普及、位置情報を使ったアプリケーションなど、テストが困難になりつつあります。

その点、公開されているライブラリならば大勢の人の手でテストも行われているため、セキュリティの確保には、そうしたライブラリを積極的に利用するのも有効です。

f:id:itstaffing:20180710110339j:plain
▲欲しい機能はライブラリにすでにテスト済みのものが存在する可能性も高い

なぜアルゴリズムの勉強が大切なのか

アルゴリズムがしっかりしていないと、良いプログラムはできません。たとえば、データが一定量を超えると、急に処理時間が増えるようなアプリケーションは、最適なアルゴリズムを使っていない可能性があるそうです。

「アルゴリズムは、一度勉強すると、ずっと使え、どのような言語にも応用できます。アルゴリズムは永久に不滅です」(増井さん)

f:id:itstaffing:20180710110342j:plain
▲アルゴリズムを自分で実装すると理解が深まる。ただし仕事ではライブラリを使うのがお勧め

また、「アルゴリズムを楽しむ」ことも重要だそうです。アルゴリズムの解説書などを参考に、自分で実装してみたり、オンラインで問題を解くサイトにチャレンジしてみたりするのも面白いそうです。

セミナーの締めとして、増井さんはプログラミングを学ぶ上での4つのポイントを紹介してくれました。

・プログラミングを目的にしない
・複数のプログラミング言語を学ぶ
・基本となるアルゴリズムは知っておく
・アルゴリズムを楽しみながら学ぶ

質問タイムでは、会場から「もし、増井さんが今からプログラミングの勉強を始めるとしたら、どの言語を選びますか?」という質問が寄せられました。

f:id:itstaffing:20180710110345j:plain
▲会場から、増井さんならどの言語を選びますか?という質問も

増井さんは、少し考えてから「私ならJavaScriptを選びます」と答えてくれました。その理由は、前述のように環境構築が楽なこと、そしてJavaScriptは、今やサーバサイドプログラミング(Node.js等)や、iOSやAndroid OS用のネイティブアプリ開発を可能にする各種フレームワークも登場しており、応用が利くこと、だそうです。

今回のイベントで、JavaScriptから始めてみるのもいいなと思いました。でも、プログラミングは手段であり、まずは目的。作りたいプログラムを見つけることが先決かもしれません。

【イベントレポート】初心者がつまずきやすいポイントを解説!PHP入門

株式会社リクルートスタッフィングが運営するITSTAFFINGでは、弊社に派遣登録いただいている皆さまのスキル向上を支援するイベントを、定期的に開催しています。2018年5月11日のイベントでは「10年使える最大効率の学習法~PHP学習から基礎作りの大切さを考える~」を開催。

プログラミングを学ぶための複数の環境が整いつつあるなかで、レガシーな書き方で無駄に回り道をしないためには、どうすれば良いのでしょうか。『PHPしっかり入門教室 使える力が身につく、仕組みからわかる。』の著者でもある小原隆義さんが、PHPの学習を題材に、効率的な学習方法を詳しく紹介してくださいました。

f:id:itstaffing:20180625105141j:plain

■今回のイベントのポイント

1. どれが正解?コードの書き方
2. 最大効率の学習法
3. キャリアの積み上げ方


【講 師】小原 隆義さん
▲【講 師】小原 隆義さん
塾講師として働いた後、独学でプログラミングを学びエンジニアに。その時の苦戦した経験をもとにプログラミングスクールのオンラインチューターを立ちあげる。長い間の教育経験からITにおける教育方法に疑問を持ち、一からカリキュラムを構築。現在は株式会社トレノケートでプログラミングからデータベースまでの企業研修を担当。著書に『PHPしっかり入門教室 使える力が身につく、仕組みからわかる。』(翔泳社)。

どれが正解?コードの書き方

小原さんは、最初に次のようなクイズを出しました。

f:id:itstaffing:20180625105154j:plain
▲あなたはどれに頼る?

会場内でAを選ぶ人は6割り近く、Bを選ぶ人は1割程度、Cを選ぶ人はチラホラという感じでした。小原さんはCを選ぶそうです。その理由として、80%外れるなら、70%当たるよりも予測が的確と言えるからだそうです。

しかし、小原さんは「では、本当にCなのか?」とさらに疑問を投げかけます。もし、これが商品ならば「80%も外れるって、どういうことなの?」と、メーカーの姿勢を疑うこともできますし「後々、バージョンアップされることを考慮すれば、Aが最も信頼できる」という考え方もできます。したがって、正解は無いのだそうです。

次は、どちらのコードが正しいか? という問題です。

f:id:itstaffing:20180625105158j:plain
▲どちらも3つのメッセージのうちの1つがランダムに表示される「おみくじ機能」を持つWebページ

大きな違いとして、Aは「おみくじ機能」を実装したPHPのコードが上のブロックにくくり出されているのに対して、BはHTMLのコード中に「おみくじ機能」を記述しています。

これはAが正解。なぜでしょうか?

Aは、ページデザインを変える人はHTMLブロックを見れば良いし、おみくじ機能を変えたい人はPHPブロックを見れば良い。つまり、立場の違う複数の人が手を入れる際に合理的だからです。

さらに言えば、次のように「おみくじ機能」を別ファイル(functions.php)に収め、それをWebページを記述しているファイル(fortune.php)に読み込むようにしておくのが望ましいそうです。

f:id:itstaffing:20180625105201j:plain
▲「おみくじ機能」を別ファイルにくくり出しておく

ファイル数も増え、コードの記述も増えますが、リファクタリング(改善)を考慮すれば、こちらが断然合理的です。

たとえば、新たに別ページを作り、そちらにもおみくじ機能を持たせる場合を考えましょう。後から「メッセージを4つに増やして」と言われたときに、毎度各ページを修正しなくとも、functions.phpの中身を修正すればよいからです。

この「一度作ったものを使いまわす」という考え方が重要で、それこそがプログラミングの歴史を形成しているのだそうです。

最大効率の学習法

では、こうしたプログラミングをどのように学んでいけば良いのでしょうか。まずは、書籍等の教材選びから。

会場の参加者からは、教材選びの基準として「ジャケ買い(表紙の見た目)」「通販のランキングを参考にする」という意見が挙げられました。小原さんがお勧めするのは「著者のプロフィール」だそうです。

f:id:itstaffing:20180625105204j:plain
▲異なるプロフィールの著者Aと著者B

著者Aが執筆する書籍は、ページ数も少な目な傾向にあり「理解するために最初に読む本」としておすすめだそうです。一方、著者Bが執筆する書籍は、ページ数は多い傾向にあるものの、現場で求められるコードの書き方をしていることが多いです。したがって「業務に入る前に1冊は読んで欲しい本」として、小原さんはおすすめします。

書籍以外に、ビデオ学習など、インターネットサービスを利用した学習方法もあります。小原さんはおすすめするサービスとして次のものを挙げました。

「ドットインストール」( https://dotinstall.com/
「Schoo」( https://schoo.jp
「Udemy」( https://www.udemy.com/jp/

Udemyは有料サービスですが、プロのエンジニアが講師を務めているのが特徴とのことです。

f:id:itstaffing:20180625105207j:plain
▲小原さんが実際に試したものの中からお勧めのサービスを紹介

勉強していくうちに「エラーが出たが直せない。どうすれば?」という状況に陥ったら、エンジニアの質問サイト「Teratail」( https://teratail.com )で質問するのもおすすめ。また、エンジニア向けブログサイト「Qiita」( https://qiita.com )で「こういうコードを書いたが、これでいいのだろうか?」と記事を掲載すると、経験豊富なエンジニアがアドバイスをくれることも多いそうです。

また、「ストアカ」( http://street-academy.com )で自分に合うセミナーを探す方法や、クラウドソーシングを使ってプロジェクトマネージャーを1時間雇い、質問しまくるという勉強法も紹介してくれました。

教材のサンプルコードは一部を書き写し、あとは、ひたすら読むのが良いそうです。コードを試して疑問に思ったことを調べ、検索する習慣を身につけていきます。このとき、PHP付属のドキュメントを読む習慣を付けることが大切だそうです。

f:id:itstaffing:20180625105210j:plain
▲ドキュメントには、PHPのステートメントの凡例や、プロのエンジニアが書いたサンプルコードが載っている

「実務でドキュメントを参照しながらコードを書く」ためにも、ドキュメントを読むクセを付けておきましょう。

キャリアの積み上げ方

小原さんは「この先も、ずっと使い続けられる技術は無い」と考えるべきだといいます。

その上で「一つの技術を専門レベルまで身につけることが大切」だと提言します。決して、いろいろな言語を学ぶのがダメというわけではなく、むしろ、いろいろな言語を習得するためにも、どれか一つを深く理解しておくべきだそうです。

f:id:itstaffing:20180625105213j:plain
▲PHPを深く理解しておけば、他言語にもすぐに移行できる

たとえば、PHPの基礎を勉強した後は「オブジェクト指向」について勉強し、その後、PHPで機能拡張が可能なCMS「WordPress」について勉強したり、PHPの「アプリケーションフレームワーク」について勉強したりして、段階的に掘り下げて勉強していくのだそうです。

また、実践を意識した技術を持つことが大切です。たとえば、バージョン管理ツール「Git」や、継続的インテグレーションツール「Jenkins」など、開発実務で使われる周辺技術についても幅広く知っておくべきだと言います。

最後に小原さんは「基礎を築くには最初の一歩が大事です。何をどう学んでいくかは人それぞれですが、常にいろいろな選択肢を考えながら学習を進めてほしい」と締めくくりました。

f:id:itstaffing:20180625105216j:plain
▲基礎を築くには最初の一歩が大事です

今回のイベントで、現場で求められるコードの書き方を学ぶ重要性と、「いろいろな言語を理解するために、まず一つを深く理解しておく」という考え方が、とても印象的でした。ぜひ、皆さんの学習にも採り入れてみてください。

【イベントレポート】今こそ、Pythonや人工知能の基礎知識を学ぼう

株式会社リクルートスタッフィングが運営するITSTAFFINGでは、弊社に派遣登録いただいている皆さまのスキル向上を支援するイベントを、定期的に開催しています。

2018年4月27日のイベントは「一度は挫折しかけた、そんなあなたに贈るPythonプログラムの超入門」を開催。

今回は「やさしくPythonを知りたい超入門者」「一度は挫折しかけたけど、やっぱりPythonをやってみたい人」「Pythonで人工知能がどんな風に作られているのか興味のある人」に贈る、Pythonプログラムの超入門。書籍『Python 1年生』の著者、森 巧尚さんをお迎えして、講義形式で解説していただきました。

f:id:itstaffing:20180613130647j:plain

■今回のイベントのポイント

・Pythonってなに?
・Pythonプログラムの基本
・プログラムはどんな感じで作る?
・人工知能ってなに?


【講 師】森 巧尚さん
▲【講 師】森 巧尚さん
WebコンテンツやiPhoneアプリなどの受託開発を行うフリープログラマ。プログラミング書籍の執筆業、関西学院大学非常勤講師、PCN大阪プログラミング講師なども務める。パソコン黎明期からゲームソフト、音楽ソフト、教育ソフト、3Dソフトなど、様々な開発に携わる。著書は『Python 1年生』(翔泳社)『作って学ぶ iPhoneアプリの教科書』(マイナビ)『なるほど!プログラミング』(SBクリエイティブ)『小学生でもわかるiPhoneアプリのつくり方』(秀和システム)など30数冊。

Pythonってなに?

まずはPythonについての基礎知識から。Pythonは「YouTube」や「Dropbox」といったインターネットサービスの開発、お馴染みのロボット「Pepper」のアプリケーション開発などで知られているほか、NASAの研究開発や、Pixer社の映画のCG制作などにも使われているそうです。ビッグデータや人工知能分野でよく利用されるプログラミング言語としても知られています。

f:id:itstaffing:20180613130656j:plain
▲言葉を選んで解説してくださるので、プログラミング経験のない人にも分かりやすい

最近よく耳にするようになったPythonは、新しい技術かと思ったら、誕生は1991年(27年前)。理想的なプログラムを書くことを目指して作られたのですが、理想が高過ぎたために、当時のコンピュータでは処理が重く、一般には普及せず、主にコンピュータリソースの豊富な研究分野で使われてきたそうです。そのため、人工知能や大量のデータ処理が得意。ところが近年、コンピュータの性能が向上したため、一般でも利用できるようになりました。

Pythonは、構文がとてもシンプル。文のひとまとまり(ブロック)は、インデント(字下げ)で表し、他のプログラミング言語に比べて記述に必要な文字数が少ないという特徴があります。

f:id:itstaffing:20180613130700j:plain
▲構文がとてもシンプル

扱えるデータ型にはint(整数)、float(小数)、str(文字列)、bool(ブール)があります。文字列はシングルクオートとダブルクオートのどちらで括ってもOK。他の言語同様、計算は「+-* /」の演算子を使います。

変数の型は、宣言をせずとも、値を代入すると自動判別されます。あらかじめ型を宣言しなければならないJavaに比べると手軽な感じがします。

f:id:itstaffing:20180613130703j:plain
▲変数の型は自動的に判別される

Pythonプログラムの基本

次にPythonのプログラミングの基本を教えてもらいました。

Pythonのプログラムは上の行から順に処理されます。順に処理するだけでは複雑な処理ができないので、if文により条件に応じて処理を分岐させたり、for文により条件を満たすまで反復させたりすることができます。書式が少し違うだけで、他のプログラミング言語と同じです。

f:id:itstaffing:20180613130707j:plain
▲for文でリスト(配列)の内容を表示させる。リストも代入時に型が判別される

頻繁に使う処理は、何度も書かなくて済むようにdef文で関数としてまとめておき、場合によってはモジュールとして別のファイルに保存しておき、import文で読み込みます。

f:id:itstaffing:20180613130710j:plain
▲関数といっても数学に出てくるものと違い、定型の処理をまとめておくもの

こうして先人たちが、よく使う処理をまとめてくれた関数の集まりが標準ライブラリです。標準ライブラリが充実しているのもPythonの大きな特長だそうです。

プログラムはどんな感じで作る?

具体的なプログラムの例も、詳しく紹介してくださいました。

最初はウィンドウを作る標準ライブラリtkinterをつかったおみくじプログラム。ウィンドウの上にメッセージとボタンを表示させ、ボタンを押すたびに運勢を表示させるものです。

f:id:itstaffing:20180613130714j:plain
▲おみくじプログラムの例

次は、画像をファイルから読み込んでウィンドウ表示させるプログラムを作成。

f:id:itstaffing:20180613130717j:plain
▲画像を読み込んで表示するプログラム例

Pythonでは、コマンドをドット(.)でつなげられ、たとえば「画像ファイルを開いて」「リサイズをする」という2つのコマンドの間に「画像をモノクロ化する」というコマンドを挟む、といったこともできます。

ここでは読み込んだ画像をモノクロ化して、一度16×16ピクセルの解像度にリサイズし、再度300×300ピクセルに拡大するという処理をします。結果は、画像の情報量が減り、モザイク表示のようになりました。

f:id:itstaffing:20180613130721j:plain
▲画像を読み込みモノクロ、モザイク表示にするプログラム例

この時点では、このプログラムにどのような意味があるのかわかりませんでした。しかし、後で、このプログラムが活躍します。

人工知能ってなに?

いよいよPythonの得意分野である人工知能について。

人工知能(機械学習)には「教師あり」「教師なし」「強化学習」という3つの学習方法があります。

教師あり学習は「問題と答えのペア」を大量に見ることで特徴を学習させる方法で、学習すると「これはなにか」を予測できるようになります。身近なところでは手書き文字や音声の認識などに使われています。

教師なし学習は「問題と答えのペア」のないデータを調べます。こちらは答えを見つけるための学習ではなく、似たデータをまとめて特徴を抽出したり、グループ分け(クラスタリング)をしたりするときに使います。

強化学習は「問題と答えのペア」は教えないけれど、よい結果が出たときに強化していく学習方法で、答えのない問題で、よりよい方法を見つけることができるようなります。人間を負かしたことで話題になった、将棋や囲碁のソフトでも利用されています。

f:id:itstaffing:20180613130724j:plain
▲いよいよ人工知能のプログラムをPythonで作る

Pythonで人工知能を作るには、人工知能ライブラリを利用します。ここで利用するsklearnというライブラリには、学習用にあらかじめ手書き数字のデータも用意されています。これを基に、新たなデータがどの数字を手書きしたものかを予測するプログラムを作成します。

サンプルデータは、容量を減らすため解像度の粗いものが使われています。新たに予測させるデータも同様に解像度を下げますが、このとき先ほど作ったモザイク化の処理が活躍します。

最終的なプログラムは次のようなものになりました。

f:id:itstaffing:20180613130727j:plain
▲手書き文字を予測するプログラム。思った以上に短いことにびっくり

今までは機械学習といっても雲をつかむような感じでしたが、森さんが丁寧に噛み砕いて解説してくださったので、どのようなことをしているのか、その一端を垣間見ることができました。勉強しようと思いつつ、まだ手を付けられていない方、『Python 1年生』から、はじめてみませんか。