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

PRODUCED BY RECRUIT

【イベントレポート】AI向けの数学とPythonを基礎から学ぼう!

この記事では2020年3月24日に開催した、オンライン動画配信イベント「人工知能(AI)、機械学習のための数学の基礎-Pythonのコードと共に学ぶ人工知能/深層学習に必要な数学-」をレポートします。

昨年11月のイベントで「どのように数学を機械学習で活用するか」についてお話しいただいた、我妻幸長さん。今回のイベントでは、前回よりも一つレベルアップをした内容で、人工知能に必要な数学を我妻さんにご解説いただきました。

■今回のイベントのポイント
・人工知能の学習に必要な数学知識は、主に線形代数、微分、確率/統計
・特に線形代数と微分が大事
・Pythonには、AI向けの数学用ライブラリが用意されている

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

人工知能、ディープラーニングとは?

人工知能(AI)の定義は人によりさまざまですが、我妻さんによれば、次のような3つの大きな捉え方があるそうです。

・自ら考える力が備わっているコンピュータのプログラム
・コンピュータによる知的な情報処理システム
・生物の知能、もしくはその延長線上にあるものを再現する技術

また、AIには「強いAI」と「弱いAI」があるそうです。強いAIとは、テレビや映画に登場するロボットのようなものを指しますが、これらの共通点は、残念ながらまだ実現していないところだそうです。

一方で、ニュースなどでよく耳にする人間を打ち負かすようなチェスのプログラムは弱いAIに分類されるそうです。身近な存在としては、スマートフォンの操作を代わりに行ってくれるアシスタント機能のようなものも弱いAIに分類されます。

現在は第三次AIブームであると言われていますが、その主役はこうした弱いAIを指しています。もちろん、一口に「AI」と言っても、そのカテゴリは多岐にわたっているそうです。

「AI=機械学習」のイメージを持たれる方も多いかと思いますが、それ以外にも、アルゴリズムが交配して突然変異なども起こす「遺伝的アルゴリズム」、シロアリや鳥の群れのふるまいを再現する群知能といったものもAIのカテゴリに入るとのことでした。

f:id:itstaffing:20200605141101j:plain
▲人工知能は、流行りの機械学習だけではなく、分野は多岐にわたる

もちろん、今回のテーマは機械学習。機械学習の実現にも、強化学習、決定木、ニューラルネットワークなど、さまざまなアルゴリズムがありますが、今回紹介してくださったのは「ニューラルネットワーク」です。

これは脳の神経細胞をモデル化し、それらを多階層で結合したものです。

f:id:itstaffing:20200605141104j:plain
▲脳の神経細胞が層を形成して接続されたニューラルネットワークのモデル図。人によって見解は違うものの、一般には4層以上あるものがディープラーニングと呼ばれているとのこと

さらにニューラルネットワークにおいてもアルゴリズムがいくつかあり、たとえば、画像認識には「畳み込みニューラルネットワーク(CNN)」、画像生成には「敵対的生成ネットワーク(GAN)」、自然言語処理には「再帰型ニューラルネットワーク(RNN)」といったアルゴリズムが使われているそうです。

今回扱うのは、とてもシンプルなニューラルネットワークのモデルだそうです。

人工知能と数学

人工知能の学習に必要な数学知識には主に線形代数、微分、確率・統計という3つの分野があり、特に線形代数と微分が大事とのことで、今回は、そのうちの線形代数にフォーカスし、行列について、実際にプログラミングを交えながら解説してくださいました。

数式からコードへの変換は、数式という「言語」をプログラミング言語に変換していくこと。プログラミング言語のコード化をすることで、数式にさまざまな値を代入し、試行錯誤することができるようになります。しかもPythonには、そうしたAI向けの数学用ライブラリが用意されているため、AIの勉強に最適なのだそうです。

今回解説してくださったのは行列積と転置について。

行列積とは行列同士の掛け算のことですが、そもそもAIの学習で、なぜ行列積を求めるのでしょうか。実はAIの学習において積の総和を扱うことが多いのだそうです。

たとえば先ほど登場した脳の神経細胞であるニューロンでは、つながっている複数の神経細胞それぞれからの入力を基に、次の神経細胞に対して値を出力していきますが、このとき、それぞれの値の総和を求める必要があります。

そして積の総和を簡潔に記述できるのが行列積です。

f:id:itstaffing:20200605141107j:plain
▲行列積の考え方と計算方法

たとえば次のような行列式を考えます。

f:id:itstaffing:20200605141110j:plain
▲単純な行列式の例。行列aと行列bの行列積は、Pythonではnp.dot(a, b)で求められる

ただし、行列積で掛け算を行う際は、前の行列の行と、次の行列の列の要素数が一致していなければなりません。たとえば上図のような4行3列の行列と3行4列の行列の行列積は求められますが、4行3列同士の行列積は求めることができません。

そこで登場するのが転置です。転置とは、その名の通り、行列の行と列を置き換えます。

f:id:itstaffing:20200605141113j:plain
▲転置の例。行列bの転置は、Pythonではb.Tで求められる

ニューラルネットワークを数式で表す

最後に、簡単なニューラルネットワークのモデルを数式で表し、それをプログラムで実装・実行してくださいました。

ここで紹介しているディープラーニングでは、脳の神経細胞であるニューロンの動作を次の図のようなものと捉えます。

f:id:itstaffing:20200605141117j:plain
▲ニューロンへの入力に重み付けをし、バイアスをかけたあと、活性化関数で処理した結果を出力する。各入力は、そのままではなく重み付けされた上で処理される。バイアスとは、ニューロンの感度を調整するためのもので、後述する逆伝播でダイナミックに調整される。また、活性化関数は、このニューロンが興奮するかしないかを導き出すものとのこと

このとき、ニューロンへの入力をx、重みをwとすると、重み付けされた入力はxwとなり、k個の入力があるとすると、k個分のxwの総和を求め、そこにバイアス値bを加えたものをuとし、活性化関数をf(u)とすると、数式は上図のようになります。

活性化関数にはシグモイド関数というものを使用します。これはyが0のときはニューロンが興奮していない状態、yが1のときは興奮している状態を表します。

f:id:itstaffing:20200605141119j:plain
▲ここでは処理を簡潔にするため、シグモイド関数もシンプルなものを使用

一通りの流れを説明したあと、これらの処理をPythonのコードにしたものを実行してくださいました。

f:id:itstaffing:20200605141122j:plain
▲複雑な部分を可能な限りシンプルなものとし、動作の仕組みを理解できる形のプログラムで示してくださった

実際には、入力から各階層のニューロンへの順伝播が行われたあと、得られた結果を基に、バックプロパゲーションと呼ばれる逆伝播を行って各ニューロンのバイアス調整などを行っていく必要があるそうですが、そのためには偏微分など、さらなる高等数学の理解が必要になるそうです。

イベントにご参加いただいた方からは、「デモがあったので理解しやすかった。本を読むだけで手を動かして学んでいなかったのですが、実際に簡単なコードから書いてみようと思えました」という声や、「コードを一から書いてみたい」などの声をいただきました。

我妻さんによれば「コードを書くのはスポーツと一緒。練習で素振りをするように、何かを作ってみる。数式に落とし込んで、Pythonで書いていくことに慣れることが大切です」とのこと。そして、いきなり複雑で難しい4×4のルービックキューブよりも、2×2のルービックキューブから始めるのが簡単なように、プログラミングも、まずはシンプルな課題を解いていくことが、楽しむ秘訣だそうです。

▼本イベントは動画でも公開しています。ぜひこちらからご視聴ください
https://www.r-staffing.co.jp/engineer/entry/20200522_1

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

【イベントレポート】目で見て体感する、ブロックチェーンのインパクト

この記事では2020年3月6日に開催した、オンライン動画配信イベント「目で見て体感する、ブロックチェーンのインパクト」をレポートします。

仮想通貨でおなじみのブロックチェーン技術とは一体どのようなものなのか、その仕組みに迫ります。講師には、FLOCブロックチェーン大学校講師で、ブロックチェーンエンジニアである赤澤直樹さんをお招きし、概要やデータ構造、そして最新動向まで解説いただきました。

■今回のイベントのポイント
・ブロックチェーンは、「誰の管理にもよらず、正しいデータをみんなでつかえるようにしたこと」を成し遂げた
・ブロックチェーンの本質は、タイムスタンプの再発明

【講師プロフィール】
赤澤 直樹さん
FLOCブロックチェーン大学校講師(ベーシック、エンジニア)。専門分野はToken Engineering、データサイエンスなど。大学院在籍中から独学でAIやデータ解析、ブロックチェーンを学び、専門家として多数仕事を請け負う。執筆協力に書籍『Pythonで動かして学ぶ!あたらしいブロックチェーンの教科書』(翔泳社)がある。

ブロックチェーンの概要

ブロックチェーンと聞いて何を思い浮かべるかは、それぞれのバックグラウンドによって異なるそうです。「仮想通貨」や「分散処理」、「データを改ざんされないための技術」など、さまざまな答えが返ってくるかもしれませんが、実はこれらは表面的な特長に過ぎないのだそうです。

では、ブロックチェーンの本質とは、どのようなものでしょうか。それは、タイムスタンプの再発明なのだそうです。

そもそもブロックチェーン登場以前にも、ある程度のことはできていました。たとえば取引(トランザクション)は電子署名で改ざんされていないことが保証されていましたし、親になるトランザクションから継承して参照していくという信頼性の担保も、ブロックチェーン以前から提案されていたそうです。

f:id:itstaffing:20200514131655j:plain
▲今までは「TX#3'」と「TX#3"」はどちらが先に作られたのかということが証明できなかった。その難しいテーマの解決を突き詰めていき、たどりついたのがブロックチェーンという技術

しかも、ブロックチェーンに使われている一つひとつの技術は昔からある「枯れた技術」で、それらを組み合わせて難題を解決しているそうです。

f:id:itstaffing:20200514131658j:plain
▲サトシナカモトはブロックチェーンを論文発表した謎の人物。コピペできず「このデータは確実に私のものです」と言えるため、仮想通貨だけでなく、医療データから電力使用量の請求まで、あらゆる分野での応用が期待されている

ブロックチェーンを構成する技術は大きく次の3つだそうです。

f:id:itstaffing:20200514131702j:plain
▲コンセンサスアルゴリズムというのはあまり耳慣れないものの、暗号化やP2Pはいろいろなシーンでよく耳にする

ブロックチェーンのデータ構造

ブロックチェーンに使われている技術の1つにハッシュ関数があります。ハッシュ関数は入力したデータを一定の長さのデータに変換する関数で、出力値(ハッシュ値)から入力値(元のデータ)を逆算できない一方向関数で、同じデータを入力すると同じハッシュ値が得られます。

f:id:itstaffing:20200514131705j:plain
▲入力元のデータの量によらず結果の長さが同じになる。Webアプリでもユーザー認証で利用するパスワードの安全な保管に使われている

仮想通貨ビットコインでは数千、数万といったトランザクションを処理しますが、これをブロックヘッダに入れなければなりません。そこで、ハッシュ関数を利用したマークルツリーというデータ構造を使っています。

f:id:itstaffing:20200514131708j:plain
▲マークルツリーは、二分木やハッシュツリーの一種。隣り合うデータを合体させハッシュ値を求め、それが1つになるまで繰り返していく。最終的に1つになったハッシュ値をマークルルートと呼ぶ

もし、マークルツリーのどこかの値を変えてしまうと、マークルルートの値も変わってしまいます。またハッシュ関数は一方向関数であるため、マークルルートから元のデータを復元することもできません。そのためトランザクションの履歴が改ざんされていないかどうかが、すぐに分かります。

次に、ブロックチェーンで使われているもう1つの技術要素であるハッシュチェーンについてです。ハッシュチェーンとは、その名の通り、ハッシュ値を用いてデータの連鎖を作り上げていくものだそうです。

f:id:itstaffing:20200514131711j:plain
▲ハッシュチェーンでは、直前のデータのハッシュ値に、新しいトランザクションデータを加えて、そのハッシュ値を求めるということを繰り返していく

上図のようにハッシュチェーンを構築することで、途中のデータを改ざんすると以降のハッシュ値が異なってしまうため、すぐに改ざんを検知できるようになり、「しなやかなセキュリティの強さ」を実現しています。

ハッシュチェーンは、ブロックチェーンにおける「マイニング」というプロセスの中で利用されているそうです。

f:id:itstaffing:20200514131713j:plain
▲ハッシュチェーンを作成するには、Nonceの値を変えながら、ハッシュ値の先頭に0がいくつ並ぶかという条件に当てはまる値を計算で求めていく。この計算を何度も繰り返すため、マイニングはCPUリソースを大量に消費する

今回のイベントでは、赤澤さんが要所要所で実際のプログラムを実行して、どのような結果が出力されるのかをデモンストレーションしてくださいました。

f:id:itstaffing:20200514131716j:plain
▲マークルルートの計算やマイニングの様子などを、実際のプログラムで示してくれた

プログラムの目的はブロックチェーンの動作を知るためということで、計算時間を短くするためにハッシュ値の条件(先頭の0の数)を緩めるなどしているそうです。マイニングの結果も1~2秒ほどで表示されていました。条件をやや厳しくして実行すると、確かに、より時間がかかっていました。ビットコインのマイニングでは、より条件が厳しいため、さらに多くの時間がかかるとのことでした。

プロトコルとしてのブロックチェーンの強みと弱み

ところで、ブロックチェーンには強みだけでなく弱みもあるそうです。

強みは、基本的に一度決まったことは翻らないという耐改ざん性や、複数主体で同じデータを持ちあえるという分散性です。誰かに「このデータは本当に正しいか?」と尋ねなくても、正しいかどうかが分かるそうです。

一方、弱みは、今のところ処理能力がイマイチでスケーラビリティに問題があることです。

赤澤さんによれば、VISAカードのシステムでは1秒間に約4000トランザクションを処理しているそうですが、ビットコインではせいぜい5~7トランザクションほどだそうで、処理データが増えると処理しきれないといいます。

また、マイニングは計算競争のようにとらえられています。これはプルーフオブワーク(PoW)と呼ばれるコンセンサスアルゴリズムを利用しているためで、適切なNonceをいち早く見つけた人、つまり計算能力の高いコンピュータを所有する人に優先的に承認する権利(報酬を受け取る権利)が与えられるという仕組みだからとのこと。その権利を得るため世界中でマイニングにCPUパワーが注ぎ込まれていて、エネルギー問題を懸念する声もあるそうです。

ブロックチェーンの最新動向

最後にブロックチェーンの最新動向を紹介してくださいました。

先ほどのスケーラビリティの問題については、ブロックサイズを拡大したり、中身のデータを小さくし効率化するといった方法が研究されていたり、ブロックチェーンの外側で取引の一部を行い、スケーラビリティの問題を解決する取組み「Layer2技術」などの研究も進められているそうです。

f:id:itstaffing:20200514131719j:plain
▲Layer2技術にはいくつかあり、それぞれサービスに応じた技術の採用を検討、あるいは実施しているという

たとえばコンセンサスアルゴリズムとしてPoWではなく、プルーフオブステーク(PoS)を採用するというのも問題解決の一つだそうです。PoSは、現時点での通貨保有量が多いコンピュータの持ち主に優先的に承認する権利を与えるというものだそうで、ビットコインと並ぶ有名な仮想通貨イーサリアムでは、将来的にPoSを採用していくことが計画されているとのことでした。

イベントにご参加いただいた方からは、「理論に寄った講義かと思っていたら技術よりで大変面白かったし、ビットコインを身近に感じた」という声や、「実際のコードを見せていただけると、面白さも理解のしやすさも全く違うなと思いました。出席できて本当に良かった」などの声をいただきました。また、オンライン動画配信であったため、周囲を気にせずリラックスしながら受講できた方も多かったのではないでしょうか。

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

第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」