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

PRODUCED BY RECRUIT

第12話 git grepと普通のgrepってどう違うの?【連載】マンガでわかるGit ~コマンド編~

f:id:itstaffing:20200514133141j:plain

Webサービスやアプリ開発の現場では必須のバージョン管理システム「Git(ギット)」。Gitは、専用のソフトを使えばクリックで直感的に操作することもできますが、いざというときにコマンドが使えると便利です。

前回の 第11話 では、編集中のファイルを一時退避することができる「stash」について学びました。

・スタッシュを保存する

$ git stash save

・保存したリストを見る

$ git stash list

・スタッシュの復活と削除を同時に行う

$ git stash pop [スタッシュ名]

今回の第12話では、リポジトリ内の検索ができる「git grep(グレップ)」の使い方を学びます。このマンガを通して、わかばちゃんと一緒にGitの知識を身につけていきましょう!

【筆者】湊川 あいさん
【筆者】湊川 あいさん
フリーランスのWebデザイナー・漫画家・イラストレーター。マンガと図解で、技術をわかりやすく伝えることが好き。著書『わかばちゃんと学ぶ Git使い方入門』『わかばちゃんと学ぶ Googleアナリティクス』『わかばちゃんと学ぶ Webサイト制作の基本』『運用ちゃんと学ぶ システム運用の基本』が発売中のほか、マンガでわかるGit・マンガでわかるDocker・マンガでわかるRuby・マンガでわかるScrapbox・マンガでわかるLINE Clova開発・マンガでわかる衛星データ活用といった分野横断的なコンテンツを展開している。

・Amazon著者ページ
・Twitterアカウント

git grepと普通のgrepってどう違うの?

f:id:itstaffing:20200514133144j:plain
f:id:itstaffing:20200514133147j:plain
 
f:id:itstaffing:20190617145538j:plain
ところでgrepって何の略なんでしょうね?
f:id:itstaffing:20190617145541j:plain
global・regular expression・print の頭文字をとったものらしいぞ。「ファイル全体から・正規表現で・表示する」ってわけだな。

git grepと普通のgrepの違い

「git grep コマンドを使わなくても、Linux の grep コマンドがあるからそれを使えばいいじゃない」と思いますよね。改めて、普通の grepコマンドとの違いをご紹介します。

git grep コマンドが持つメリットは次の3点です。

1.リポジトリ内のみを検索するため、Linuxのgrepコマンドよりも検索速度が速い

ただし、あらかじめ $ cd コマンドで、リポジトリのディレクトリに移動しておく必要があります。

2.リポジトリ内で追跡しているファイルのみを対象に検索ができる

普通のgrepだと、キャッシュなどの必要ないファイルも検索対象になってしまいます。ところが git grep は、追跡中のファイルのみを対象にして検索することができます。

※ちなみに --untracked オプションをつけると、.gitignore に載っているファイルも合わせて検索できます

 
f:id:itstaffing:20190617145538j:plain
「追跡中のファイルってなんだっけ?」という方もいるかもしれないね。追跡中のファイルというのは、何か変更をするとGitが検知するファイルのこと。裏を返せば「.gitignore(無視リスト)」に載せていないファイルのことだよ。
 
3.過去の時点のファイルの状態を検索できる

普通のgrepにない特徴として、git grep は過去のコミットを指定して検索ができます。

たとえば、今からあなたはひとつ前のコミットに戻って検索をしたいとします。普通のgrepで検索をすると、次の手順になります。

$ git checkout HEAD^ //1つ前のコミットに戻る
$ grep -R “検索したい文字列” //文字列を検索する
$ git checkout - //もといたブランチに戻る

このように3つのコマンドを実行しなければなりませんが、git grep を使うと、次のとおり、たった1つのコマンドで済んでしまいます。

$ git grep “検索したい文字列” HEAD^
 
f:id:itstaffing:20190617145538j:plain
コミットやブランチを直接指定して過去の状態を検索できるんだ!3つのコマンドが1つで済んじゃう。ラクでいいね!

git grep の使い方

・特定の文字列を含む箇所を検索したい(大文字、小文字を区別する)

一番基本的なコマンドです。検索したい文字列をダブルクォーテーションで囲みます。

$ git grep “検索したい文字列”

ためしに「http://」という古い形式の外部リンクが残っていないかを サンプルリポジトリ で検索してみますね。

f:id:itstaffing:20200518120758j:plain

このように検索結果が表示されました。左側にファイル名が、右側に該当箇所が表示されています。

f:id:itstaffing:20190617145538j:plain
一瞬で出てきた!でもこれだと、どこの行にあるかが分からないからちょっと不便だなぁ。
f:id:itstaffing:20190617145541j:plain
では、次のようにして行番号を表示させるよう設定するがよい。
$ git config --global grep.lineNumber true


f:id:itstaffing:20190617145541j:plain
こうすれば行番号も一緒に表示されるようになるぞ。

f:id:itstaffing:20200518120801j:plain

f:id:itstaffing:20190617145538j:plain
コロンで囲まれた数字が行番号だね!これは便利!

・コミットやブランチを指定して検索したい

検索したい文字列に続けて、コミット識別子(コミットIDやブランチ等)を入力すると、その時点のファイルの状態で検索できます。

$ git grep “検索したい文字列” コミット識別子

・特定ワードを含むファイル名のみ表示したい

-l オプションを使うと、ファイル名だけを出力できます。

$ git grep -l “検索したい文字列”

まとめ

リポジトリ内の検索ができる「git grep(グレップ)」について学びました。

・特定の文字列を含む箇所を検索する(大文字、小文字を区別する)

$ git grep “検索したい文字列”

・コミットやブランチを指定して検索する

$ git grep “検索したい文字列” コミット識別子

・ファイル名のみ表示する

$ git grep -l “検索したい文字列”

Gitにはまだまだたくさんのコマンドがあります。
次回は、犯人探し(!?)ができるコマンド「git blame」を学びましょう。


▼登場キャラクター紹介
f:id:itstaffing:20200122103525j:plain

▼わかばちゃんが登場する書籍

▼ これまでの「マンガでわかるGit」

【動画】自宅にいながらスキルアップ!IT系の情報収集術

f:id:itstaffing:20200525140529j:plain

今このような状況のなか、皆さんはどのように最新のIT系情報を集めていますか?そして、それは本当に確かなものでしょうか。今回の動画では、書籍「Pythonではじめるアルゴリズム入門」や「基礎からのプログラミングリテラシー」などの著者である増井敏克さんに、自宅でひとりでできる情報収集のポイント をご解説いただきました。エンジニアの方はもちろん、どのような職種の方にとっても 実際に役立つ内容 をまとめていただいたので、ぜひご視聴ください。

▼視聴する
(動画再生時間:30分)


内容
・質か量?広く浅く?狭く深く?
・情報を見極めるポイント
・情報が降ってくる状態をつくる
・ツールとサービスのご紹介

【講師プロフィール】
増井 敏克さん
増井技術士事務所代表。技術士(情報工学部門)。情報処理技術者試験にも多数合格。ビジネス数学検定1級。「ビジネス」×「数学」×「IT」を組み合わせ、コンピュータを「正しく」「効率よく」使うためのスキルアップ支援や、各種ソフトウェアの開発、データ分析などを行う。著書に『Pythonではじめるアルゴリズム入門』『IT用語図鑑』『図解まるわかりセキュリティのしくみ』(以上、翔泳社)、『プログラマのためのディープラーニングのしくみがわかる数学入門』『プログラミング言語図鑑』(以上、ソシム)、『基礎からのプログラミングリテラシー』(技術評論社)などがある。

※動画内容に関するご質問はお受けいたしかねますのでご了承ください


【動画】AI向けの数学とPythonを基礎から学ぼう!

f:id:itstaffing:20200519123434j:plain

近年PyTorch、Kerasなど、さまざまなフレームワークの登場により、アルゴリズムや数学を理解しなくても機械学習を行うことは可能になりました。しかし、本当の意味で機械学習を理解し、使いこなすためには数学とプログラミングをベースにニューラルネットワークの仕組みとその可能性を学ぶ必要があります。

本動画では、プログラミング言語Pythonと数学を学び、機械学習の一種であるニューラルネットワークにつなげていきます。人工知能について勉強したいが、数学に敷居の高さを感じ、どのようにディープラーニングなどに繋げていくかがわからないといった方に、特にオススメです。

数式は、紙と鉛筆ではなく文書処理システムのLaTeXにより記述します。これにより、数式の複製やシェアが大幅に楽になります。ぜひ自宅でのスキルアップにご活用ください。

▼視聴する
(動画再生時間:84分)


内容
・人工知能、ディープラーニングとは
・Google ColaboratoryとLaTeX
・人工知能と数学
・ニューラルネットワークを数式で表す

【講師プロフィール】
我妻 幸長さん
「ヒトとAIの共生」がミッションの会社、SAI-Lab株式会社の代表取締役。AI関連の教育と研究開発に従事。東北大学大学院理学研究科修了。理学博士(物理学)。興味の対象は、人工知能(AI)、脳科学、シンギュラリティなど。オンライン教育プラットフォームUdemyで、3.5万人以上にAIを教える人気講師。著書に、「はじめてのディープラーニング」「はじめてのディープラーニング2」(SBクリエイティブ)、「Pythonで動かして学ぶ!あたらしい数学の教科書 機械学習・深層学習に必要な基礎知識」(翔泳社)。共著に「No.1スクール講師陣による 世界一受けたいiPhoneアプリ開発の授業」(技術評論社)。


※本動画は、2020年3月24日に開催しましたオンライン動画配信の内容を編集したものです。
※パソコン環境等により、映像や音声が途切れる、又は停止するなど正常に視聴できない事があります。ご了承ください。
※動画配信用のテキストは現在配布しておりません。また、動画配信の内容に関するご質問はお受けしかねますのでご了承ください。


【イベントレポート】Javaのスキルアップをしよう~Java SE 11 Silver認定試験ポイント解説~

この記事では、2020年2月14日に開催したイベント「Javaのスキルアップをしよう~Java SE 11 Silver認定試験ポイント解説~」をレポートします。

今回のイベントでは、書籍『オラクル認定資格教科書 Javaプログラマ Silver SE11 スピードマスター問題集(試験番号1Z0-815)』の著者である坂本浩之さんに、ズバリ、OCJP Silver SE 11の認定資格について、その出題傾向、受験する際の注意ポイントを解説していただきました。

■今回のイベントのポイント
・Silver試験の各項目の出題傾向やポイントを詳しく解説!
・Silverの難易度は、上級者の指導のもとで開発作業を行うことができる「開発初心者向け」

【講師プロフィール】
坂本 浩之さん
日本サード・パーティ株式会社 人財育成ソリューション部所属。Java言語のインストラクタとして、オープントレーニングや個社向けトレーニング、資格対策のトレーニングなど幅広く担当する。資格対策については主な著書として『Javaプログラマ スピードマスター問題集』(翔泳社)がある。

Oracle Certified Java Programmer(OCJP), Silver SE 11 認定資格について

OCJPの最新の試験のバージョンはJava 11に対応したもの。ちなみに一つ前のバージョンの試験はJava 8に対応したものだったので、一気に3段階もバージョンアップしたようなイメージです。

Bronze・Silver・Goldとレベルが分かれていますが、最も受験者数が多いのはSilver。エンジニアとして活躍している人の腕試しとしても、Silverはピッタリの難易度だそうです。試験は選択問題で、制限時間180分、全80問中合格ラインは63%とのこと。出題範囲は12のカテゴリに分かれていて、次のようになっています。

f:id:itstaffing:20200428140055j:plain
 
f:id:itstaffing:20200428140059j:plain
▲試験内容は上記の12項目に分かれている

実際に坂本さんが受験した感覚では、オブジェクト指向に関する問題は試験を問わず多く、Silverでは「4割近く」がオブジェクト指向関連の出題。また、新機能のモジュールシステムやLocal-Variable Type Interfaceは押さえておいたほうが良いそうです。

f:id:itstaffing:20200428140017j:plain
▲出題傾向は、オブジェクト指向関連で4割。Java SE8以降の内容も出やすく、上記の4項目で2割ぐらい。残り2割がループ文や分岐文など、従来の機能とのこと。これで8割程度は押さえられるそう

出題傾向

では、1~12までの全カテゴリについて、どんなところが問われやすいのでしょうか?坂本さんが、具体的にポイントを解説してくださいました。

・カテゴリ1
全て文章問題。コードを読んで答えるものは出ないそうです。このカテゴリは、出ても2~3問とのこと。
 
・カテゴリ2
Local-Variable Type Interfaceのvarの取り扱いを押さえておくと良いそうです。Javaはこれまで「型はきっちり宣言しましょう」という“型に厳密な言語”のイメージだったのですが、Java 8からは型推論(言わなくても推測できる)が行われるようになり、Java10からはローカル変数をvarで定義すれば右辺を参考に型を識別します。

このvarがコンパイルエラーになるパターンは、たとえばローカル変数でない、手がかりがなくて推論できないといったパターン。これらをきちんと押さえておくことが大切だそうです。

f:id:itstaffing:20200428140022j:plain
▲数値の中に含まれるアンダースコア(_)は、JavaSE7から登場した書式で、桁数を識別しやすくするためのもの。カンマの代わりに可読性を向上させる役割がある。先頭や末尾には付けられない

StringオブジェクトとStringBuilderオブジェクトの違いについても押さえておく必要があります。

f:id:itstaffing:20200428140024j:plain
▲StringオブジェクトとStringBuilderオブジェクトの違い。特にequals()メソッドによる文字列比較はよく出題されるとのこと

配列では、ひっかけ問題としてconcat()メソッドを使ったものが出題されることがあるそうです。

 String s1 = "Hello";
 s1.concat("Bye"); //新規オブジェクトが生成される
 System.out.println(s1);

文字列を連結するconcat()メソッドは使用時に「連結された文字列」が新規オブジェクトとして生成されるため、連結結果を受け取る変数を左辺に指定しなければなりません。上記プログラムでは、

 s1 = s1.concat("Bye");

としなければ、意図した結果を得られません。

・カテゴリ3
配列に関する出題ですが、初期化に関するものは押さえておくと良いそうです。

f:id:itstaffing:20200428140028j:plain
▲boolean型の配列で、要素を定義しない場合、初期値はfalseになる

また、二次元配列の定義や初期化も数問は出るそうなので、事前にしっかりと確認しておきましょう。

・カテゴリ4
このカテゴリ以降はオブジェクト指向関連の問題が頻出するため、いかにオブジェクト指向で点を稼ぐのかが、ポイントになるそうです。

f:id:itstaffing:20200428140032j:plain
▲メソッドとコンストラクタについては、よく出題されるとのこと。コンパイラは戻り値の型宣言があるかどうかで判断しており、戻り値の型宣言があればメソッド、無ければコンストラクタとして認識する

・カテゴリ5
継承についての王道的な問題が出るそうです。

f:id:itstaffing:20200428140034j:plain
▲カテゴリ5で押さえておくべきポイント

典型的な問題が次のようなものだそうです。

f:id:itstaffing:20200428140103j:plain
▲継承に利用の再実装に関する王道を行く問題の例。どのように継承しているかを理解していないと間違えてしまう

また、参照範囲を変更させて、キャスト演算子が必要かどうかを判断させるという問題も、よく出題されるそうです。

・カテゴリ6
さまざまな例外処理について問う問題が出されます。たとえば、throwsキーワード付きのメソッドをオーバーライドさせるには、どうすればいいかを問う次のような問題が出題されます。

f:id:itstaffing:20200428140107j:plain
▲TestクラスはExceptionクラスをthrowsする。func()メソッドをオーバーライドしたとき、何が書けるのか?

 ・throws自体を省略する
 ・スーパークラスと同じ例外クラスをthrowsキーワードで定義する
 ・サブクラス例外を定義する

上記3点が、このときコードとして通るケースだそうです。

・カテゴリ7
Java 11からの仕様である、javaコマンドでソースファイルを実行できるようになったところがポイントです。javaコマンドでソースを実行するには、main()メソッドを定義したクラスを先頭にもってくる必要があります。ただし、main()メソッド自体はクラス内に定義されていれば、定義場所は問いません。

・カテゴリ8
Java 11で新しくなった部分は特にありません。ただし、拡張forループにvarを使った書き方や、case文に定数を指定できるかどうかなどは押さえておくと良いそうです。

・カテゴリ9
ガベージコレクションのタイミングを問う問題が「必ずと言ってよいほど出題される」そうです。

・カテゴリ10
ここで押さえておくべきポイントはカプセル化ですが、カテゴリ10のみの内容で構成された出題はなく、必ず他のカテゴリの内容と組み合わされた問題が出題されるとのことです。

・カテゴリ11
インタフェースによる抽象化です。Silverで押さえておきたいのは、次の2つの項目だそうです。

 ・ListインタフェースとArrayListクラスの使用
 ・ラムダ式の理解

ListインタフェースとArrayListクラスの例題を見てみましょう。removeIfメソッドは引数をラムダ式で指定します。

f:id:itstaffing:20200428140112j:plain
▲6行目のremoveIfの引数「//insert code here」に何が入るか?という問題。正解はBのt -> t.contains(“o”)となる

ラムダ式は、関数を引数としてメソッドに渡す方法ですが、Javaはオブジェクト指向言語なので、関数のままでは引数として渡せませんでした。そこでJava SE8から、関数をオブジェクトとして扱うための関数型インタフェースが提供されています。 たとえば、従来は関数を引数として受け渡したい場合は次のように記述していました。

f:id:itstaffing:20200428140115j:plain
▲従来のインタフェースのオブジェクトの生成。もちろん現在もこの記述は可能

ラムダ式を用いると、型推論があるため、次のように簡潔に記述できます。

f:id:itstaffing:20200428140119j:plain
▲ラムダ式によるインタフェースのオブジェクト生成。敢えて記述しなくても分かる部分は省略できる

実はラムダ式の扱いはGoldの試験ではかなり深い内容の出題があるものの、Silverでは出題パターンが限られているそうで、上述のremoveIf()メソッドのようなPredicateインタフェースを利用するパターンさえ覚えておけば大丈夫とのこと。

職場によってはラムダ式を使わないと決めている現場もあるようですが、今後リリースされていくライブラリも、ラムダ式を前提に提供されるため、覚えておくべきとのことでした。

・カテゴリ12
パッケージとモジュールについて。クラスをまとめたものがパッケージで、パッケージをまとめたものがモジュールです。パッケージごとの公開/非公開の管理については、公開するパッケージの宣言と利用するモジュールの宣言について押さえておくと良いそうです。

本レポートでは全てをお伝えし切れませんでしたが、今回のイベントは、OCJPのSilver試験の出題傾向や押さえておくべきポイントが網羅されており、とても濃密な1時間半でした。

イベントにご参加いただいた方からは、「Javaの新機能を知ることができ、勉強になりました」という声や、「何が変更されたのかなどが分かりやすく、これから効率的に勉強にとりかかれそうでよかった」などの声をいただきました。

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

第11話 git stash でコミットしたくないファイルを一時退避!【連載】マンガでわかるGit ~コマンド編~

f:id:itstaffing:20200415103308j:plain

Webサービスやアプリ開発の現場では必須のバージョン管理システム「Git(ギット)」。Gitは、専用のソフトを使えばクリックで直感的に操作することもできますが、いざというときにコマンドが使えると便利です。

前回の 第10話 では、必要なコミットだけを取り込める「cherry-pick(チェリーピック)」を学びました。

・別のブランチから今いるブランチへ、必要なコミットだけをコピーしてくる

$ git cherry-pick [コミットID]

・複数のコミットを取り込みたい場合

$ git cherry-pick [コミットIDその1]..[コミットIDその2]

・コミットせずに作業ディレクトリだけに変更を留めたい場合

$ git cherry-pick -n [コミットID]

今回の第11話では、まだコミットしたくないファイルを一時退避できる「stash(スタッシュ)」の使い方を学びます。このマンガを通して、わかばちゃんと一緒にGitの知識を身につけていきましょう!

【筆者】湊川 あいさん
【筆者】湊川 あいさん
フリーランスのWebデザイナー・漫画家・イラストレーター。マンガと図解で、技術をわかりやすく伝えることが好き。 著書『わかばちゃんと学ぶ Git使い方入門』『わかばちゃんと学ぶ Googleアナリティクス』『わかばちゃんと学ぶ Webサイト制作の基本』『運用ちゃんと学ぶ システム運用の基本』が発売中のほか、マンガでわかるGit・マンガでわかるDocker・マンガでわかるRuby・マンガでわかるScrapbox・マンガでわかるLINE Clova開発・マンガでわかる衛星データ活用といった分野横断的なコンテンツを展開している。

・Amazon著者ページ
・Twitterアカウント

git stash で編集中のファイルを一時待避

f:id:itstaffing:20200415103301j:plain
f:id:itstaffing:20200415103305j:plain

基本的な git stash の使い方

 
・スタッシュを保存する

作業中のファイルを保存するには、まだコミットしていない状態で、次のコマンドを実行します。

$ git stash save

・保存したリストを見る

過去に保存したスタッシュのリストを見るには、次のコマンドを実行します。

$ git stash list
stash@{0}: WIP on branchA: 29a8f12 add fourth line
stash@{1}: WIP on branchB: 9s06dae add second line

この例では、過去に保存したスタッシュ2つが表示されています。

・stash@{n}と表示されている箇所
→各スタッシュに個別で付けられている名前

・branchA、branchBと表示されている箇所
→スタッシュを行ったときのブランチの名前

・ハッシュ、コミットメッセージ
(29a8f12 add fourth line、9s06dae add second lineの箇所)
→スタッシュを行ったときのHEADのもの

・スタッシュを復活させる

上記により復活させたいスタッシュの名前がわかったので、復活させます。

$ git stash apply stash@{0}

・スタッシュを削除する

復活させたスタッシュが不要になった場合は、こちらのコマンドで削除。

$ git stash drop stash@{0}

・スタッシュの復活と削除を同時に行う

apply → drop と2回打ち込むのが面倒ですよね。なんと、これらを同時に行う便利なコマンドもあります!

$ git stash pop stash@{0}
 
f:id:itstaffing:20190617145538j:plain
スタッシュがたまりすぎると、何がなんだかわからなくなるので、こまめに消すようにね。

まとめ

編集中のファイルを一時退避できる stash について学びました。

・スタッシュを保存する

$ git stash save

・保存したリストを見る

$ git stash list

・スタッシュの復活と削除を同時に行う

$ git stash pop [スタッシュ名]

Gitにはまだまだたくさんのコマンドがあります。
次回は、gitで管理されているソースだけを文字列検索(grep)できるコマンド「git-grep」を学びましょう。


▼登場キャラクター紹介
f:id:itstaffing:20200122103525j:plain

▼わかばちゃんが登場する書籍

▼ これまでの「マンガでわかるGit」

【イベントレポート】CCNA改定前の直前準備。ネットワークに必須のルーティング技術、NTP・DHCP・NATの設定についておさらいしよう!

この記事では、2020年1月31日に開催したイベント「【CCNA改定前の直前準備】ネットワークに必須のルーティング技術、NTP・DHCP・NATの設定についておさらいしよう!」をレポートします。

Cisco認定試験問題の大幅な改定が2020年2月に実施されました。そこで今回は、昨年9月に開催したイベント「初心者からCCNA合格を目指す!ネットワークの全体像を理解しよう」にご登壇してくださった林口裕志さんを講師にお招きし、前回触れられなかったCCNA試験でのメインとなるルーティングについて詳しく解説していただきました。なお、NTP・DHCP・NATは、時間の都合上惜しくも割愛となりました。

■今回のイベントのポイント
・CCNAの試験形式は3種類。難易度が高い「シナリオ問題」と「シミュレーション問題」は配点が高いため、これらの問題を押さえておく
・スイッチやルータの仕組みを含めた、ネットワークの基礎知識を身につけよう

【講師プロフィール】
林口 裕志さん
ITスクール「システムアーキテクチュアナレッジ」で、主にCCNAやCCNPといったネットワーク系の担当講師を務める。また、Linux・Windowsといったサーバ系、Java・PHP・Pythonといったプログラミング系の講義などもマルチにこなす。講師業以外にも数々の開発案件やセキュリティ診断の案件などを担当し、そこから得られるIT業界のトレンドや最新技術に常に目を光らせている。数多くのたとえ話や実際の業務での体験談を織り交ぜながら進める講義は受講する生徒にも好評を得ており、IT業界未経験・PCスキルがゼロに等しい生徒であっても、その分かりやすい説明でCCNA合格を最短距離で導いている。CCNAの講義だけでも年間100名以上の生徒を担当し、その合格率は9割以上を誇る。

CCNA試験形式について

CCNAの試験は、選択問題とシナリオ問題、シミュレーション問題の3種類から構成されており、林口さんによれば「このシナリオ問題とシミュレーション問題がやっかい」なのだそうです。

しかし、難易度が高い分、シナリオ問題とシミュレーション問題は配点が高いため、この両者の問題をきちんと押さえておくことが、合格へのポイントとなりそうです。

では、シナリオ問題の例を見てみましょう。

f:id:itstaffing:20200408101255j:plain
▲シナリオ問題は、実際のシーンを想定したシナリオが紹介される。showコマンドの使い方が問われる

シナリオ問題では、ルータの設定状況を表示させるコマンドを適切に実行できるかどうかが問われ、トラブルを解決する設定コマンドまでは問われることはないそうです。

一方、シミュレーション問題では、シナリオ問題を解く能力に加え、トラブルを解決するための設定コマンドを実行できるかどうかも問われます。

f:id:itstaffing:20200408101259j:plain
 

こうした問題を解くためには、スイッチやルータの仕組みを含めた、ネットワークの基礎知識をしっかりと学んでおく必要がありそうです。

スイッチの基本

出題傾向を踏まえた上で、まずは復習も兼ねて、ネットワーク構築の基礎となるスイッチについての仕組みを学んでいくことに。

f:id:itstaffing:20200408101304j:plain
▲スイッチはMACアドレステーブルを基にしてデータを正しい宛先に転送する

スイッチは、MACアドレスを頼りにデータを転送するため、IPアドレスは参照しません。その代わり、スイッチ内に保持したMACアドレステーブルを参照します。

このMACアドレステーブルは、スイッチが勝手に作成するため、人間の手で作成する必要がありません。

実は、スイッチがデータを受け取る際に、送信元MACアドレスを認識し、ポートとMACアドレスとを紐づけてテーブルに登録し、こっそり学習しているのだそうです。

しかし、宛先MACアドレスがどのポートにあるのかは分かりません。なので、最初のうちは宛先のポートが分からないデータをすべてのポートに転送(フラッディング)し、分かっている場合はピンポイントで該当ポートに転送するのだそうです。賢いですね。

f:id:itstaffing:20200408101306j:plain
▲データを送信してきたポートは、データに送信元MACアドレスが記載されているので、それをテーブルに登録。テーブルに載っている宛先ならばピンポイントにそのポートに転送し、載っていない宛先ならば全てのポートにコピーして送信する(フラッディング)

ルータの基本

次はルータについて。まずはスイッチとの違いについて見てみましょう。

f:id:itstaffing:20200408101309j:plain
▲ルータとスイッチの主な違い

ルータはスイッチと違い、テーブルを勝手に作ってはくれないそうです。また、スイッチは宛先が分からなくてもデータを自動的に送ってくれましたが、ルータはそうしたことをしてはくれません。

f:id:itstaffing:20200408101312j:plain
▲あらかじめ用意されたルーティングテーブルを参照し、端末Aから受け取ったデータを、ルータR1はルータR2に転送し、ルータR2が端末Bに送る。バケツリレーの要領

ルーティングテーブルに登録されている主な情報は、宛先ネットワークと、経由するルータのアドレス(ネクストホップ)、接続インターフェイスの3つ。

上記の例では、ルータR1は、端末Aからのデータの宛先IPアドレスが192.168.3.10ということで、ルーティングテーブルを参照します。192.168.3.0というネットワークは192.168.2.1(ルータR2)経由であることが分かるので、接続IFであるFa1を使い、ルータR2に転送しているそうです。

問題なのは、このルーティングテーブルです。ルーティングテーブルも最初は何も情報が登録されていない空っぽの状態。しかもスイッチングテーブルと違い、自動で作成してはくれません。そこでコマンドを設定していき、ルーティングテーブルを作成していく必要があります。その手順を次に説明してくださいました。

f:id:itstaffing:20200408101317j:plain
▲FastEthernet 0というデバイスに192.168.1.1/255.255.255.0というアドレスを設定。同様にFastEthernet 1に、192.168.2.2/255.255.255.0を設定。それぞれのデバイスをno shutdownで通信できる状態に変更している

最初の状態ではルーティングテーブルは空っぽ状態ですが、ルータのインターフェイスに、IPアドレスの設定とno shutdownという有効化のコマンドを実行することで、ルーティングテーブルに「C」と書かれたネットワーク情報が登録されます。「C」は「Connected」、つまり、ルータに直接繋がっているネットワークの情報になります。

ここで、ルーティングテーブルを確認するコマンドについての説明がありました。ルータに対して入力するshow ip routeはとても重要なコマンドだそうです。

f:id:itstaffing:20200408101321j:plain
▲赤枠のところが重要で、その上の各種表示は、ここではあまり重要ではないとのこと。Cは直接接続されているネットワークを表している

このように、show ip routeコマンドを実行することで、そのルータに登録されているルーティングテーブルの内容を確認することができます。

この段階で、「C」と書かれた直接繋がっているネットワークの情報が登録されましたが、離れたネットワークの情報(ルータ1の場合は192.168.3.0/24のネットワーク)は登録されていません。このままでは、通信は相手に届かず破棄されてしまいます。

そこで、離れたネットワークの情報をルーティングテーブルに登録していく必要があります。その設定こそが「ルーティングの設定」だそうです。

ルーティングの設定方法には、すべてのネットワーク情報を手作業で入力するスタティックルーティングと、「自動的に作成してね」というコマンドをあらかじめ実行しておくと、ルータ同士が情報交換しながらテーブルを作成してくれるダイナミックルーティングがあるとのこと。

まずは、スタティックルーティングの設定コマンドを見てみましょう。

f:id:itstaffing:20200408101324j:plain
▲ルータR1とR2にそれぞれ設定しておく

スタティックルーティングのコマンドを実行すると、その内容がダイレクトにルーティングテーブルに登録されます。また、先頭に「S」と表示されていますが、これは「Static」の略。つまり、スタティックルーティングで登録されたことを示す印となります。

次に、ダイナミックルーティングを見てみましょう。ダイナミックルーティングには、RIP、OSPF、EIGRP、BGPなどさまざまな種類がありますが、今回はOSPFについて紹介してくださいました。

f:id:itstaffing:20200408101329j:plain
▲ダイナミックルーティングは、ルータ同士が情報を交換しながらルーティングテーブルを構築していく。ルーティングテーブルの先頭の「O」はOSPFで設定された情報という印

ルータ同士が情報交換を行うには、最初にHelloパケットでネイバー関係を確立し、その後、情報交換を行います。

OSPFの設定コマンドはrouter ospfコマンドを使います。

f:id:itstaffing:20200408101332j:plain
▲プロセス番号は何でもいい。自分が知っている(相手に教えてあげたい)ネットワークを指定。スタティックでは知らないネットワークを設定する(ここが違い)

具体的には、ルータR1とR2に、それぞれ次のように設定します。

f:id:itstaffing:20200408101335j:plain
▲R1とR2に上記のように設定する

先ほど同様、show ip routeコマンドで確認すると、今度はルーティング情報の先頭に「O」が付いています。これはOSPFで設定された情報という印。こうして自動的にルーティングテーブルが作成されていきます。

実際の試験において「通信ができない」という設問は、たいていの場合「ルーティングテーブルが完成していない(不完全)」というケースです。

特にOSPFの問題では「OSPFの設定内容がずれている」ことがほとんどのため、show running-configコマンドで原因を突き止めます。

林口さんによれば、よくあるパターンが「ネイバー関係がそもそも築けていない」というものだそうです。ネイバー関係を確立するためには、いくつか条件があり、これを満たしているかどうかがチェックポイントになるそうです。

f:id:itstaffing:20200408101252j:plain
▲ネイバー関係を築くための条件。まずは、これらの条件が満たされているかどうかをチェックする

このあと、いくつか例題が紹介されましたが、ここでは省略します。今回の内容は基礎知識ながら、とても濃密なもので、CCNAの受験対策をこれから始める方にとって、大きな第一歩になったのではないでしょうか。

イベントにご参加いただいた方からは、「理解してなかったところが説明を聞いてよくわかった。OSPFについては独学で分かりにくいところだったので、ためになりました」という声や、「自分で対策本を用いるより、やはり有識者の方から、かみ砕いた内容を講義していただけると数倍効率が上がると感じました」などの声をいただきました。

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

【イベントレポート】絵と解説でわかる量子コンピュータの仕組み

この記事では、2020年1月10日に開催したイベント「絵と解説でわかる量子コンピュータの仕組み」をレポートします。

今回のイベントでは、コンピュータの処理能力を飛躍的に向上させるとして、最近何かと話題の量子コンピュータについて、書籍『絵で見てわかる量子コンピュータの仕組み』の著者である宇津木健さんを講師にお迎えし、どこがすごいのか、何に使えるのかなど、初心者が知りたい基礎の基礎を、分かりやすく教えていただきました。

■今回のイベントのポイント
・量子コンピュータは、これまで解けなかった問題を高速に計算できる可能性を持っている
・私たちが現在使っている古典コンピュータは、電気的な状態で0か1かという情報を表す古典ビットを利用
・量子コンピュータでは、0と1が重ね合わさった状態も表すことができる量子ビットを利用

【講師プロフィール】
宇津木 健さん
CodeZine「ITエンジニアのための量子コンピュータ入門」を連載。翔泳社『絵で見てわかる量子コンピュータの仕組み』の著者。東京工業大学大学院物理情報システム専攻卒業後、メーカーの研究所にて光学関係の研究開発を行う。また、早稲田大学社会人博士課程にて量子コンピュータに関する研究に携わる。

量子コンピュータって何?

量子コンピュータは、これまで解けなかった問題を高速に解ける可能性を持つとのこと。それは、一体、どのようなものなのでしょうか。ワクワクして待っていると、宇津木さんから「実は量子コンピュータの一般的な定義は未だない」という、なんとも拍子抜けするような答えが返ってきました。

簡単に言うと、従来型のコンピュータ(古典コンピュータと呼ぶそうです)が使う電気的なビット(古典ビット)に対して、量子ビットを使うのが量子コンピュータであるということですが、宇津木さんの書籍における定義では、より誤解がないように「量子力学特有の物理状態を積極的に用いて高速計算を実現するコンピュータ」としているとのこと。

さらに「まだ完成されていないので、量子コンピュータが、現在のコンピュータで解けない問題を本当に解けるかどうかは、実のところ分からない」というオマケもついてきました。なんだか急に頼りない感じがしてきました。しかし、その可能性はとても興味深いものだそうです。

量子コンピュータという考え方自体は、実はかなり前からあったそうですが、近年、IBMやGoogleといった、いわゆるテックジャイアントの積極投資と大々的な宣伝活動により注目度が高まっています。大手ばかりでなく、ベンチャー企業も取り組んでいて、日本でもいくつかのベンチャー企業がこの分野で活躍を始めているそうです。

f:id:itstaffing:20200323103218j:plain
▲さまざまな企業が量子コンピュータの実現に向け積極投資を行っている

なぜ今、量子コンピュータなのでしょうか。コンピュータで解決したい問題の難易度も時代が進むにつれ高くなっており、すでに量子コンピュータにしか解けないであろう問題が存在していることも知られていて、他に代替技術がないという点も、開発のための大きなモチベーションになっているそうです。

なお、現在開発されている量子コンピュータには大きく分け、量子ゲート方式(2000年頃までは唯一だった)と量子アニーリング方式(組み合わせ最適化問題に特化)の2種類があります。

量子アニーリング方式は、多数の粒子のふるまいを統計的に扱い、ミクロのふるまいからマクロ的な性質を導き出すというもので、組み合わせ最適化問題など、特定分野に効果を発揮するものと期待されていますが、あくまでも主流は万能量子コンピュータを目指す量子ゲート方式とのことです。この辺は、なんだかスーパーコンピュータのアプローチにクラスター型とベクトル型があるのと似た感じがします。

量子ゲート方式の量子コンピュータが万能になるためには課題もあります。現状では量子ビットを操作したときなどに数パーセント程度のエラー(ノイズ)が発生してしまうため、量子コンピュータに期待されるあらゆる計算ができるわけではありません。現状では非万能量子コンピュータという位置づけになります。これらの量子コンピュータはNISQ(ノイズのある中規模量子コンピュータ)と呼ばれているそうです。エラー訂正や、量子ビット数の多ビット化が、今後の「万能量子コンピュータ」実現への道を切り開くのだそうです。

古典コンピュータから量子コンピュータへの変遷をまとめると次のようになります。

f:id:itstaffing:20200323103158j:plain
▲現在は、非古典コンピュータ(量子アニーラー)と非万能量子コンピュータ(NISQ)のあたり。エラー訂正が行えるようにならないと万能量子コンピュータ実現には至らない

また、量子コンピュータが完成すれば、すべての古典コンピュータが完全に置き換わるというわけではなく、おそらく量子コンピュータの性能を引き出すために古典コンピュータが不可欠とも考えられているそうです。

量子コンピュータの基礎:量子力学と量子ビット

では、量子コンピュータはどのように計算処理を行うのでしょうか。

私たちが知る「量子」の性質を持つ物質に、電子や光(光子)があります。電子は当初、粒だと思われていましたが、波の性質も持つことが分かりました。いっぽうで光は当初、波だと思われていましたが、粒子の性質も持つことが分かりました。この量子の不思議な特性を情報処理に利用しようというのが量子コンピュータのアプローチです。

私たちが現在使っている古典コンピュータは、電気的な状態で0か1かという情報を表す古典ビットを利用していますが、量子コンピュータでは0と1が重ね合わさった状態も表すことができる量子ビットを利用しているそうです。

f:id:itstaffing:20200323103202j:plain
▲古典ビットでは0と1の間がなく離散的だが、粒子と波の性質を併せ持つ「量子」を使う量子ビットでは離散的と連続的という性質を併せて持っている

量子ビットは計算中、0と1の状態を、それぞれ確率振幅と位相として持つ波のような性質を持っており、測定するとその瞬間、0か1に収束されます。

f:id:itstaffing:20200323103204j:plain
▲波の性質を持つ量子ビットにさまざまな操作を行い計算し、測定時は粒子の性質を使って結果を読み出す

測定時に0に近ければ0、1に近ければ1に収束する確率が高いという、とても悩ましいものですが、この確率を制御して計算処理を行います。でも、確率をどうコントロールするのでしょうか。

f:id:itstaffing:20200323103207j:plain
▲量子ビットには確率振幅と位相があり、計算中にこの量子ビットを互いに作用させることで、両者が同位相ならば強め合い、逆位相なら弱め合うことになる。これを波の干渉という

古典コンピュータが(電気的な)古典ビットで演算する際に、ANDやOR、NANDといった電気的なビットを制御するための各種ゲートを使うのと同様に、量子コンピュータでは、ビットを入れ替えるXゲート(ビットフリップゲート)、位相を入れ替えるZゲート(位相フリップゲート)、量子的な重ね合わせ状態を作り出すHゲート(アダマールゲート)など、量子ビットを制御するさまざまな量子ゲートを使います。

f:id:itstaffing:20200323103210j:plain
▲量子ゲートのイメージ。矢印をぐるぐる回していく。矢印の位置は分からない。古典ビットのゲートと同様、量子ビットのゲートにもさまざまな種類のものがある

量子計算の仕組み

最後に、宇津木さんが、量子計算のアルゴリズムをいくつか紹介してくださいました。

量子コンピュータで高速な計算を行うためには、アルゴリズムにも工夫が必要で、そこで重要なのが、前述した波の干渉という性質を利用することだそうです。これをうまく使えている例が、量子フーリエ変換です。こちらは波の干渉を使って結果を一意に決めるゲートを作り出すことができ、例えばこれにより、隠れた周期性を高速に発見することができるそうです。

f:id:itstaffing:20200323103212j:plain
▲この計算処理により、素因数分解なども高速に解けるようになるため、たとえばRSA暗号を解くのにも応用できるとのこと。ちなみに|000>というのは、量子ビットの表記法で、古典ビットの000に相当。同様に|001>は001に相当する

現状の量子コンピュータはエラーが多いために、量子コンピュータの代表的なアルゴリズムである位相推定アルゴリズムをそのまま利用するにはハードルがあります。そこで、量子と古典のハイブリッド計算で使えるVQE(Variational Quantum Eigensolver)と呼ばれるアルゴリズムが考案されました。

VQEは、量子コンピュータと古典コンピュータを両方使って行列の固有値の最小値というものを計算する手法で、膨大な計算を必要とする量子化学計算の問題などへの応用が期待されているそうです。

f:id:itstaffing:20200323103215j:plain
▲複数の都市を1度ずつ巡って出発地に戻る経路が存在するかを探るハミルトン閉路問題の例。都市の数に対してパターンが指数関数的に増えることが知られている。量子コンピュータを使うことでN通りの順路について√N回の計算程度で求められるものと期待されているそう

イベントに参加いただいた方からは、「量子コンピュータがどのように計算をしているのかを理解するのは難しいと感じましたが、量子コンピュータの現在の位置づけ、解決すべき課題、将来の可能性などの概略を知ることができました」という声や、「難しい内容だが、テンポが良く、ある程度理解の手がかりとなった。勉強したいと思った」などの声をいただきました。

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

(2022年追記)
エンジニアスタイルで量子コンピュータの新連載が始まりました!随時更新していますので、こちらもぜひご覧ください。

▼これまでの「初心者でもわかる量子コンピュータの計算の仕組み」
【第1話】数式なしで量子コンピュータの現状を理解しよう
【第2話】量子コンピュータで使用する計算の土台を学ぼう
【第3話】量子コンピュータの基本のルールを学ぼう
【第4話】基本の量子ゲートと量子回路をおさえよう
【第5話】量子プログラミングをやってみよう
【最終話】現在の量子コンピュータの限界とこれから

▼エンジニアスタイルでご紹介した量子コンピュータに関する記事のまとめ
特別編集 量子コンピュータ、そういえば知らなかったなという方へ

リクルートスタッフィング