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

PRODUCED BY RECRUIT

第10話 git cherry-pick でいいとこ取り!【連載】マンガでわかるGit ~コマンド編~

f:id:itstaffing:20200316101115j:plain

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

前回の 第9話 では、ファイルの差分を確認できる「diff(ディフ)」を学びました。

・差分を確認する

$ git diff [変更前のコミット識別子]..[変更後のコミット識別子]

今回の第10話では、必要なコミットだけを取り込める「cherry-pick(チェリーピック)」をご紹介します。このマンガを通して、わかばちゃんと一緒にGitの知識を身につけていきましょう!

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

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

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

git cherry-pick で「いいとこ取り」をしよう

f:id:itstaffing:20200316101118j:plain
f:id:itstaffing:20200316101121j:plain

・基本的な cherry-pick の構文

cherry-pickは、別のブランチから今いるブランチへ、必要なコミットだけをコピーできる便利なコマンドです。1つのコミットを取り込みたい場合は次のとおりです。

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

複数のコミットを取り込みたい場合は、このように2点を指定します。

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


f:id:itstaffing:20190617145538j:plain
2点間の指定方法は、第9話 で出てきたdiffと同じだね。
・取り込みたいけどコミットはしたくない場合

cherry-pickを実行すると、その内容がそのままコミットされます。コミットせずに作業ディレクトリだけに変更を留めたい場合は、オプション「-n」を使います。

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


f:id:itstaffing:20190617145538j:plain
コミットIDは $ git log で調べられるよ!
f:id:itstaffing:20190617145541j:plain
マージしたいけど、JavaScriptの変更は取り込まずにCSSの変更だけコミットしたいとか、部分的に変更を試してみたいときに便利だな。

まとめ

今回は、必要なコミットだけを取り込める cherry-pick について学びました。

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

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

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

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

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

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

Gitにはまだまだたくさんのコマンドがあります。
次回は、まだコミットしたくないファイルを一時退避できる「stash」(スタッシュ)を学びましょう。


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

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

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

第9話 git diff で差分を確認!【連載】マンガでわかるGit ~コマンド編~

f:id:itstaffing:20200214110629j:plain

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

前回の 第8話 では、checkoutの機能を2つに分けた新コマンド「switch」 と「restore」を学びました。

・ブランチを切り替える

$ git switch [ブランチ名]

・作業ディレクトリ上の編集内容を取り消す

$ git restore [ファイル名]

今回の第9話では、ファイルの差分を確認できる「diff」(ディフ)をご紹介します。「diff」は使う機会も多く、便利なコマンドのひとつです。このマンガを通して、わかばちゃんと一緒にGitの知識を身につけていきましょう!

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

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

ファイルの変更差分を確認するには、git diff

f:id:itstaffing:20200214110632j:plain
f:id:itstaffing:20200214110636j:plain

・基本的なdiffの構文

$ git diff [変更前のコミット識別子]..[変更後のコミット識別子]

diffコマンドを使うと、指定した2点間のファイルの差分を確認できます。

f:id:itstaffing:20190617145538j:plain
diff は Difference、つまり英語で「違い」という意味かな。

git diff を使ってみよう

4つのケースごとに、git diffコマンドの実例を見てみましょう。

◆コミット同士の差分を確認する

f:id:itstaffing:20200214110639j:plain

上のように2点間のファイルの差分を確認したい場合は簡単です。

$ git diff 1ccc226..cffb553

このように git diff コマンドを実行すると、次のように違いがある部分が表示されます。

f:id:itstaffing:20200214110642j:plain

+マーク・・・追加された行
-マーク・・・削除された行

◆ブランチ同士の差分を確認する

ブランチ同士の差分を見ることもできます。

$ git diff master..develop

たとえば「masterブランチにプルリクエストを送る前に、developブランチに追加した内容を確認したい」といった場合に使えます。

◆git pullする前に、リモート追跡ブランチとの差分を確認する

たとえば今あなたがmasterブランチにチェックアウトしていて、リモートリポジトリのmasterと比較したい場合、次のとおり操作します。

1.まずリモートリポジトリから更新内容を取得してきて

$ git fetch origin

2.ローカルリポジトリのmasterブランチの最新コミット(HEAD)と、リモート追跡ブランチ(origin/master)を比較する

$ git diff HEAD..origin/master

◆git push する前に、リモート追跡ブランチとの差分を確認する

ひとつ前の例とは逆のパターンも可能です。ローカルで進めたコミットをpushする前に、リモートリポジトリの状態と比較したいときにはこのように実行します。

$ git diff origin/master..HEAD
 
f:id:itstaffing:20190617145538j:plain
いずれにせよ、 $ git diff [変更前]..[変更後] っていう形式で書けばいいんだ。わかりやすいね!
f:id:itstaffing:20190617145541j:plain
ちなみに $ git add する前に、 $ git diff とだけ書いて実行すると、編集した箇所と直前のコミットの差分が確認できるぞ。

まとめ

今回は、ファイルの差分を確認できる diff について学びました。

・差分を確認する

$ git diff [変更前のコミット識別子]..[変更後のコミット識別子]

Gitにはまだまだたくさんのコマンドがあります。
次回は、必要なコミットだけを取り込める「cherry-pick」(チェリーピック)を学びましょう。

参考:Git公式ドキュメント(英語)

・git switch
・git restore

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

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

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

【イベントレポート】R言語で始めるデータ分析入門

この記事では、2019年12月6日に開催したイベント「R言語で始めるデータ分析入門」をレポートします。

今回のイベントでは、Pythonと比較をしながら、 R言語を用いてデータ分析をするための技術を学びました。講師にお迎えしたのは、昨年開催したイベント「Pythonでデータ処理と機械学習を始めよう」にご登壇いただいた、早川敦士さん。前回の内容のR言語版といった位置づけで、PythonとR言語の違いや、R言語によるデータ処理の実装などを、分かりやすく解説してくださいました。

■今回のイベントのポイント
・R言語専用の開発環境「Rstudio」は、環境構築がGUIで完結するので、プログラミング未経験者にもお勧め
・ベクトル演算をする場合、PythonではNumPyが必要になるが、R言語では外部ライブラリを必要としない

【講師プロフィール】
早川 敦士さん
株式会社FORCAS、株式会社ホクソエムに所属。前職のリクルートコミュニケーションズではB2Cマーケティング、現職のFORCASではB2Bマーケティングプラットフォームのデータ分析及び開発を担当。大学在学中に『データサイエンティスト養成読本』(技術評論社刊)を共著にて執筆。その後も『機械学習のための特徴量エンジニアリング』(オライリー・ジャパン刊)や『Pythonによるはじめての機械学習プログラミング』(技術評論社刊)などで執筆活動を続けている。国内最大級のR言語コミュニティであるJapan.Rを主催。株式会社ホクソエム執行役員。

R言語の環境構築、入門

初めに、R言語とはどのようなものなのかということからスタートしました。

R言語は、オープンソースで誰でも無料で使うことができ、データ解析や統計プログラミングとして開発された言語です。データアナリストが使うBIツールとしての側面もあるため、他のプログラミング言語とは少し勝手が違う部分があるのだそうです。

「Tableau」に代表されるBIツールは、導入時は効率的にスキルを身につけることができますが、職場が変わると、せっかく身につけたスキルが次の職場では使えない可能性もあります。その点、OSSのR言語ならば、どの職場でも導入のハードルが低く、また自宅でも使うことができ、身につけたスキルがムダになりません。さらに、BIツールでは扱いにくいような複雑な処理も可能なのだそうです。いいこと尽くめですね。

R言語の利用には、処理系をダウンロードして利用しますが、よく使われている開発環境は「Rstudio」と「Jupyter Notebook」の2つがあり、このいずれかを選んでおくのがお勧めだそうです。

f:id:itstaffing:20200203112602j:plain
▲R言語専用の開発環境「Rstudio」。環境がGUIで完結しているため、手軽にインストールして、すぐにプログラミングに集中したいという人に向いているとのこと

f:id:itstaffing:20200203112604j:plain
▲Pythonを使っている方には馴染みのある「Jupyter Notebook」。WindowsではWSL(Windows Subsystem for Linux)上でインストールし利用する

R言語の基礎的な文法

ここからはR言語の基礎的な文法についてです。

まず、四則演算ですが、これは「+、-、*、/」と、どのプログラミング言語でも一緒です。R言語も例外ではありません。

一方で、変数では値代入時の表記が少し異なり、「=」でなく「<-」を使います。実は「=」でも動くのですが、R言語では「<-」が推奨されているそうです。

文字列はダブルクォートで括ります。これは他の言語とあまり変わりません。変数mojiに「hensu」という文字列を代入するには次のように表記します。

―――
moji <- "hensu"

print(moji)
―――

リストの記述方法は、PythonとR言語で異なります。Pythonでは[ ]で括りますが、Rではc( )で括ります。

―――
hairetsu <- c(1, 2, 3)
―――

また、「1, 2, 3」のように連続する値は「1:3」と記述することもできます。ここはPythonにない便利なところかもしれません。この応用として、ベクトル演算で[1+4, 2+5, 3+6]のような計算をする際、次のように記述することができます。

f:id:itstaffing:20200203112607j:plain
▲ベクトル演算をする場合、PythonではNumPyが必要になるが、R言語では外部ライブラリを必要としない。しかも独特なリスト表記で簡潔に記述できる

そして、最も大きな違いであり、かつ間違いのもとになりそうなのが、配列の添字が0オリジンでなく、1オリジンである点です。配列の1番目の要素は次のように指定します。

―――
hairetsu[1]
―――

分岐やループは、ブロックの処理やelse ifなどの表記が違いますが、文の構造自体は一般的です。

f:id:itstaffing:20200203112614j:plain
▲PythonとR言語での条件分岐の表記の違い

そして、関数定義もPythonなどとは異なり、関数に値を代入するような形式で記述します。

―――
kansu <- function(hensu){ }
―――

PythonとR言語の主な文法の違いをまとめると次のようになります。

f:id:itstaffing:20200203112617j:plain
▲基本的なプログラムを組む上では大きなハードルは無さそうに見える

R言語では、データの加工、列の追加、フィルターでの絞り込み、集計などのさまざまなことが簡単な命令で行えますが、覚えるのは大変です。そこで早川さんがお勧めするのが常に手元に「カンペ(カンニングペーパー)」を用意しておくことだそうです。

f:id:itstaffing:20200203112619j:plain
▲「Data Wrangling with dplyr and tidyr Cheat Sheet」は、R言語の命令や、具体的な使い方などが紹介されていてわかりやすい「カンペ」とのこと

さて、ここから先は前回のPythonでのイベント内容と同じ内容をR言語で示してくださいました。

まずはCSVデータの読み込みです。

―――
survey_results <- read.csv("survey_results_public.csv")
―――

読み込んだデータを上から10行分表示させるには、次のような命令を実行します。

―――
head(survey_resalts)
―――

下から10行分ならば次の通り。

―――
tail(survey_results)
―――

当然とも言えますが、基本的な分析は命令の書式こそ違いますが、R言語でも同様に行えます。重複回答がないかどうかは、次のような命令で導き出せます。

―――
length(unique(survey_results$Respondent))
―――

合計はsum( )、平均はmean( )、最大値はmax( )で求められます。これらの命令では<N/A > を除去するために、na.rm = TRUEというオプションを指定します。

―――
sum(survey_results$ConvertedSalary, na.rm = TRUE) # 合計
―――

dplyrでデータの集計・加工

ここまでは1変数に対する処理でした。ここから2変数に対する処理についてです。2変数に対する処理にはライブラリ「dplyr」を使うのが一般的なのだそうです。

ただし、dplyrの記法にはクセがあり、プログラミング経験がある人には、ちょっと違和感を覚えるかもしれませんが、プログラミング経験のない人には、むしろ分かりやすいかもしれないとのことでした。代表的なのが「%>%」という表記によるものです。

たとえば、「survey_results」に格納したデータフレームから、「Hobby」と答えた人のデータについて、「ConvertedSalary」の値の合計を求めるとします。そのときのコードは次のように記述します。

―――
# install.packages("dplyr") # dplyrをインストール
library("dplyr")

survey_results %>%
 group_by(Hobby) %>%
 summarise(
  ConvertedSalarySum = sum(ConvertedSalary, na.rm=TRUE)
)
―――

そのほか、縦方向のデータを横方向のデータに変換する処理も紹介してくださったのですが、処理手順が長くなるため、ここでは割愛します。データが膨大な量になると、Excelのピボットテーブルでは作業が重たくなってしまうため、そうした処理は一度R言語でプログラムを書いておくと、あとで使いまわせるので便利だそうです。

ggplot2で可視化

最後に「ggplot2」というライブラリを使ったデータの可視化の例も紹介してくださいました。早川さんによれば、ggplot2も、少々クセがあるそうです。たとえばグラフのサイズ変更を行うために、ggplot2のほかに、あらかじめ「repr」というライブラリも読み込んでおきます。

―――
library("ggplot2")
#https://rstudio.com/wp-content/uploads/2015/03/ggplot2-
cheatsheet.pdf

# jupyter notebookでグラフサイズを変えるために利用
library("repr")
options(repr.plot.width=12, repr.plot.height=7)
―――

棒グラフや円グラフ、フォントのサイズ変更、色の変更、塗りつぶしなど、グラフの処理についても、デモ画面上で、命令を付け加えながら説明してくださいました。

f:id:itstaffing:20200203112626j:plain
▲先ほどのdplyrと同様、ggplot2には「Data Visualization with ggplot2 Cheat Sheet」という「カンペ」があるので、そちらを手元に置きながら勉強すると良いとのこと

イベントに参加いただいた方からは、「Pythonとの違いを確認しながら、R言語を学べたことは有意義でした」という声や、「R言語を学んだことはなかったが、Python利用経験のある私にとって、簡潔でわかりやすい解説でした」などの声をいただきました。

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

【イベントレポート】人工知能(AI)、機械学習のための数学入門-Pythonのコードを書きながら学ぶ人工知能/深層学習に必要な数学

この記事では、2019年11月22日に開催したイベント「人工知能(AI)、機械学習のための数学入門-Pythonのコードを書きながら学ぶ人工知能/深層学習に必要な数学」をレポートします。

さまざまなフレームワークの登場により、アルゴリズムや数学を理解しなくても機械学習を行うことが可能に。しかし、本当の意味で機械学習を理解するためには、数学とプログラミングを駆使してアルゴリズムを根幹から学ぶ必要があります。今回のイベントでは、書籍『Pythonで動かして学ぶ!あたらしい数学の教科書 機械学習・深層学習に必要な基礎知識』の著者である我妻幸長さんに、どのように数学を機械学習で活用するかを教えていただき、数式の攻略方法も解説していただきました。

■今回のイベントのポイント
・数式という「言語」を「プログラミング言語」に変換する
・コードにすることで、手軽に試行錯誤が可能になる
・NumPyで高速な演算、matplotlibで可視化

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

環境構築なしに試せるGoogle Colaboratory

今回のイベントでは、環境にGoogle Colaboratoryを用い、数式の記述に、文書処理システムのLaTeXを使用していきます。Google Colaboratoryは、Googleアカウントがあれば利用可能なサービスで、機械学習やディープラーニングなどを、煩わしい環境構築なしに試すことができます。Jupyter Notebookのように、記述したソースコードをインタラクティブに実行することができるなど、とても便利です。

f:id:itstaffing:20200210112226j:plain
▲Google Colaboratoryの画面

Google DriveからメニューでGoogle Colaboratoryを起動します。なお、Googleによれば、Google ColaboratoryはGoogle Chrome、Firefox、Safariのブラウザでは動作確認済みとのことですが、Windowsに標準のEdgeでは動かないこともあるようです。

ここではブラウザにGoogle Chromeを選び、Google Colaboratoryを使って、次のように入力してみます。

a = 3
b = 4
print( a + b )

Google Colaboratoryで[+コード]をクリックし、コードを入力していきます。コード入力欄の左側にある[セルを実行]ボタン(黒丸の中に白三角)をクリックすると、プログラムが実行され、結果として「7」と表示されます。

また、Google Colaboratoryのメニューから[+コード]をクリックするとコード用セルが追加され、[+テキスト]をクリックするとテキスト用セルが追加されます。

Notebook形式のファイルにしておけば、テキストを書き、プログラムのコードを記述して、勉強していくノートとして使うことができます。

さらに、Google Colaboratoryでは、LaTeX形式による数式の入力と出力も可能です。LaTeXは数式を表現するための言語で、論文や出版物などにも利用されています。LaTeXでの数式の記述は、LaTeXに則った数式表記法の前後は「$」あるいは「$$」で囲みます。文章中に数式を入れる場合は「$」で、数式を独立した行に表示する場合は「$$」で囲みます。

$y = x^2 + 3x + 5$
$$y = x^2 + \frac{1}{x} + 5$$

f:id:itstaffing:20200210112230j:plain
▲LaTeXは、このように数式を混在させる文章を書くときに便利なマークアップ言語

機械学習の勉強では行列式なども登場し、数式を参照する機会が多いため、LaTeXで記述した数式を併記しておく習慣をつけておくと良いそうです。

人工知能に必要な「線形代数」

次に線形代数についてです。線形代数とは、ベクトル、行列、テンソルによる演算など、多次元の構造を持った数値の並びを扱う数学の分野の一つです。

この分野では、数億、数十億といったパラメータを扱うこともあるそうですが、そうした計算も、数式を使えば簡単に記述することができます。

また、Pythonには「NumPy」という充実した数学用ライブラリパッケージがあり、行列演算や微積分、確率と統計などの計算に役立つ関数が多数用意されており、高速な演算を行うことができるそうです。

確率と統計の分野では、コードからグラフを描画すると分かりやすいのですが、その点も、Pythonの「matplotlib」というライブラリを利用することで、計算結果を手軽に可視化することができるとのこと。

数式という「言語」を「プログラミング言語」に変換することで、手軽に試行錯誤が可能になります。試行錯誤という意味では、いちいちコンパイルして実行するという手間のないPythonは向いており、ソースコードを入力し、すぐに同じアプリ内で結果を参照できるGoogle Colaboratoryを使う学習方法はお勧めであるそうです。

ニューラルネットワークの実装に必要な線形代数「行列積」

こうしたことを踏まえ、ここから先は我妻さんが、Google Colaboratoryを使って高等数学の説明をしてくださいました。

ディープラーニングにおける行列の処理そのものは、Pythonのライブラリを使えば、コマンド一発で答えを導きだせるのですが、もしライブラリを使わずに実装するならば、行列積と転置を理解しておく必要があるそうです。

行列積とは、前の行と後ろの列の各要素を掛けた総和のこと。実は、機械学習で各ニューロンが行っているのも、入力されたデータを当てはめた行列積の演算だそうで、何億もあるパラメータの積の総和も、Pythonでプログラムを書けば簡単に求められるということです。

f:id:itstaffing:20200210112205j:plain
▲2つの行列の互いの行と列を掛け算し、足していく

次のような行列積を求めてみます。

f:id:itstaffing:20200210112208j:plain
▲我妻さんの丁寧な解説と共に、実際に試された行列積

この答えを求めるプログラムをPythonで記述すると、次のようになります。また、NumPyでは、np.dot()命令で行列積を求めることができます。

import numpy as np
A = np.array([[1, 2, 3],[3, 2, 1]])
B = np.array([[3, 2],[2, 0],[1, 1]])
print (np.dot(A, B))

結果は次のようになります。

f:id:itstaffing:20200210112210j:plain
▲すぐに実行・結果を参照できるため、Google ColaboratoryはPythonと数学の学習に最適

ニューラルネットワークの実装に必要な線形代数「転置」

次は転置の例を学びます。転置とは、行列の行と列を入れ替えることで、こちらも機械学習では頻繁に登場するそうです。

行列式では、互いの行と列の要素数が同じでないと計算ができません。そうしたとき、転置を行うと計算ができるようになることがあります。

たとえば、次のプログラムは実行するとエラーになります。

import numpy as np
A = np.array([[1, 2, 3],[3, 2, 1]])
B = np.array([[3, 2, 0],[1, 1, 2]])
print (np.dot(A, B)) # エラーになる

これは行列Aと行列Bの互いの行と列の要素数が異なっているためです。そこで行列Bの行と列を入れ替える転置を行うことで、行列積が求められるようになります。

NumPyでは、行列に対してTというメソッドを使うことで転置が行えます。

print(B.T) # 行列Bが転置される

つまり、先ほどのプログラムの最終行を次のように書き換えると、エラーを出さずに行列積が求められるようになります。

print (np.dot(A, B.T))

人工知能に必要な数学「微分」

機械学習では「バックプロパゲーション」という処理が行われます。この処理は、数学的には偏微分が使われているそうです。いわゆる微分・積分は、選択によっては、高校での数学でもギリギリ習いますが、偏微分は、もはや大学で勉強する領域。この短い時間でのイベントでは、そこまで到達することはできません。

そこで、ここでは微分の復習をし、最後に偏微分とはこういうものといったプログラムを紹介してくださることになりました。

「極限」とは、関数における「ある変数」を「ある値」に近づけるとき、関数の値が近づく値のことを指します。

f:id:itstaffing:20200217124925j:plain
▲xを限りなく小さくして0に近づけていくという極限を式で表すとこうなる

たとえば、y = f(x)という関数において、変数x の微小な変化Δxは、y = f(x + Δx)と表されます。このときyの微小な変化Δyと、x の微小な変化Δxの割合は次の式で示されます。

f:id:itstaffing:20200210112216j:plain
▲Δxの変化に対するΔyの変化の割合

このとき、関数f(x)の値を最小化することを導関数f′(x)で表すことができます。関数f(x)から導関数f′(x)を求めるのが「微分」です。

f:id:itstaffing:20200210112218j:plain
▲f(x)から導関数f′(x)を求めるのが微分。いくつかの関数は公式を用いて微分することができる

機械学習では、1つのパラメータが全体に与える影響を求めますが、このときに偏微分を使います。機械学習で登場するバックプロパゲーションは、偏微分を使って、誤差に対して偏微分をかけ勾配の更新を行うことで、学習の精度を向上させていくのだそうです。

次に微分のプログラムについて解説していただきました。ここでは詳細を割愛しますが、「matplotlib」を使って結果をグラフに示せることは、とても興味深く感じた参加者の方も多かったようです。

f:id:itstaffing:20200210112220j:plain
▲matplotlibによる微分の接線描画プログラム

f:id:itstaffing:20200210112223j:plain
▲プログラムの実行結果

数字の基礎やLaTeXの使い方などが参考になったという声や、実際に数式の結果を見ることによって、よりわかりやすく感じ、本を見ながら、さらに勉強を進めていきたい意欲が湧きました、との声も参加者からいただきました。

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

第8話 switchとrestoreを使ってみよう 【連載】マンガでわかるGit ~コマンド編~

f:id:itstaffing:20200130131104j:plain

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

前回の 第7話 では、間違えてリセットしてしまっても元に戻せる「リフログ」を学びました。

・HEAD の移動履歴一覧を表示

$ git reflog

・特定の時点までファイルを巻き戻す(nには戻りたい地点の数字を入力)

$ git reset --hard HEAD@{n}

今回の第8話では、2019年夏にリリースされた新コマンド「switch」 と「restore」 をご紹介します。このコマンドは、checkoutの機能である 「ブランチの切り替え」と「ファイルの変更」を2つに分けたものです。このマンガを通して、わかばちゃんと一緒に知識を身につけていきましょう!

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

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

Gitの新コマンド switch と restore って?

f:id:itstaffing:20200130131106j:plain
f:id:itstaffing:20200130131109j:plain

2019年8月16日に Git 2.23 がリリースされ、2つの新コマンドが実験的に追加されました。それが switch(スイッチ) と restore(リストア)です。

新コマンドが追加された理由

checkout コマンドは便利である故に「できることが多すぎる」といった点もありました。たとえば、ブランチの切り替え、コミット履歴からのファイル復元、編集内容の取り消しなどです。そこで、checkoutの機能をブランチの切り替え「switch」 と ファイルの変更「restore」 の2つに分け、更に使いやすくしたというわけです。

f:id:itstaffing:20190617145538j:plain
switch と restore 、早く使ってみたい!

まずはGitのバージョンを最新版にする

新コマンドを使う前に、まずは自分のパソコンに入っているGitのバージョンを確認してみましょう。次のコマンドを打ち込んで、Gitのバージョンを調べます。

$ git --version

すると、次のようにバージョンが表示されるはずです。

> git version 2.19.0

新コマンドの「switch」と 「restore」 が使えるのは、バージョン2.23からですので、表示されたバージョンがそれ以下の場合は、次の手順でアップグレードしましょう。

◆Mac

Homebrewを使えば、次の一行でバージョンを上げることができます。

$ brew upgrade git

◆Windows

次のコマンドを打ち込みます。

$ git update-git-for-windows

【インストールでエラーが出てしまった場合】

> git: ‘update-git-for-windows’ is not a git command. See ‘git –help’

このような表示が出たら、コマンド「update-git-for-windows」が存在していないという意味です。Git公式サイトから最新のインストーラーをダウンロードして、再チャレンジしましょう。

git switch を使ってみよう

switch コマンドは、ブランチを切り替えることができます。checkout と並べて比較してみましょう。

・ブランチを切り替える

$ git switch [ブランチ名]
$ git checkout [ブランチ名]

・ブランチを新規作成して切り替える

$ git switch -c [ブランチ名]
$ git checkout -b [ブランチ名]
 
f:id:itstaffing:20190617145538j:plain
わかりやすい!「スイッチ」っていう名前の通り、自分が作業するブランチを切り替える(スイッチする)ってことだね。

git restore を使ってみよう

続いて restore コマンドを使ってみましょう。こちらもcheckout と並べて比較してみます。

・作業ディレクトリ上の編集内容を取り消す
(addする前の状態から、直前のコミットの状態に戻す)

$ git restore [ファイル名]
$ git checkout [ファイル名]

・特定のファイルを、特定のコミット時点に戻す

$ git restore --source [コミット識別子] [ファイル名]
$ git checkout [コミット識別子] [ファイル名]
 
f:id:itstaffing:20190617145538j:plain
restoreって、辞書で引くと「復元する」とか「データを元に戻す」っていう意味だって出てきたよ。たしかに、過去のコミットに checkout すると、作業ディレクトリにその時点のデータが復元されるけど、その機能だけ切り出したって感じだね。
f:id:itstaffing:20190617145541j:plain
ちなみに restore はステージングの状態を変更することもできるんだ。reset と並べて比較してみよう。
・ステージしたファイルを、ステージングエリアから下ろす
(addしたあとの状態から、addする前に戻す)

$ git restore --staged [ファイル名]
$ git reset --mixed [ファイル名]

・作業ディレクトリ上の編集内容を取り消したい
(addする前の状態から、直前のコミットの状態に戻したい)

$ git restore --worktree [ファイル名] (※1)
$ git checkout [ファイル名]
$ git reset --hard HEAD(※2)

※1 オプションを指定しない場合は、--worktree をつけたときと同じ動きをします
※2 reset --hard は引数にファイル名を指定できません。ファイル名を指定して reset --hard をしようとすると、fatal: Cannot do hard reset with paths.と注意されてしまいます
f:id:itstaffing:20200130131112j:plain
f:id:itstaffing:20190617145538j:plain
ファイルをまとめて一括で操作したいときはどうすればいいの?ステージングエリアから下ろしたいときに、ファイル名をいちいち指定して下ろすのは面倒だわ。
f:id:itstaffing:20190617145541j:plain
ファイル名の代わりに「.(ドット)」を使えば、すべてのファイルをまとめて操作できるぞ。たとえば
$ git restore .

みたいに使えばよい。

まとめ

今回は、新コマンド switch と restore について学びました。

・ブランチを切り替える

$ git switch [ブランチ名]

・ブランチを新規作成して切り替える

$ git switch -c [ブランチ名]

・作業ディレクトリ上の編集内容を取り消す

$ git restore [ファイル名]

・特定のファイルを、特定のコミット時点に戻す

$ git restore --source [コミット識別子] [ファイル名]


※ switch と restore は、あくまでも実験的なものであり、今後仕様が変わる可能性もあります。

Gitにはまだまだたくさんのコマンドがあります。
次回はファイルの差分を確認できる diff(ディフ)を学びましょう。

参考:Git公式ドキュメント(英語)
・git switch
・git restore


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

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

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

【イベントレポート】チャットボットをつくってみよう!使いやすいAI(人工知能)「Watson Assistant」ハンズオン

この記事では、2019年11月8日に開催したイベント「チャットボットをつくってみよう!使いやすいAI(人工知能)「Watson Assistant」ハンズオン」をレポートします。

前回、大好評に終わった羽山さん、樋口さん、江澤さんの講師3名によるIBM Watsonのイベント。実際に自分で使ってみたいという声を多くいただき、ハンズオン形式による今回のイベントが実現しました。Watsonの機能の1つである「Watson Assistant」を利用し、チャットボットを作成する方法を教えていただきました。

■今回のイベントのポイント
・Watsonでチャットボットを作る前に、Intent・Entity・Dialogの3つの要素について、概念を知っておく
・チャットボットで質問をされたとき、どれだけの言い方があるのかを考え、ボットが柔軟に対応できるように考える
・そのとき、文章のなかにスペースを入れると文脈として認識しないため、できるだけつながった自然な文章を入力するのがコツ

【講師プロフィール】
樋口 文恵さん
SI企業に入社後、8年間をインフラエンジニア、ネットワークエンジニアとして、お客様先でのネットワーク構築、コンサル業務に従事。2017年1月にAI専任のエンジニアになりWatsonに携わる。主担当はWatson AssistantとNatural Language Classifier。リリースをサポートしたチャットボットは50本以上。

【ティーチングアシスタント(TA)】
羽山 祥樹さん
IBM Champion。2016年より IBM Watson に携わる。HCD-Net認定 人間中心設計専門家。使いやすいプロダクトを作る専門家。担当したウェブサイトが、雑誌のユーザビリティランキングで国内トップクラスの評価を受ける。 専門はユーザーエクスペリエンス、情報アーキテクチャ、アクセシビリティ。ライター。IBM Watson。翻訳書に『メンタルモデル──ユーザーへの共感から生まれるUX デザイン戦略』『モバイルフロンティア──よりよいモバイルUXを生み出すためのデザインガイド』(いずれも丸善出版)がある。

江澤 美保さん
株式会社クレスコ AIサービスエバンジェリスト。企業向けWebポータル製品の開発、大規模事務管理の海外移管プロジェクト、企業向け決済サービスのフィールドエンジニア等を経て先端技術(人工知能・コミュニケーションロボット)の法人営業に転向。2015年よりIBM Watsonに携わり、経営層へのWatson導入提案を多く経験。現在は企業のAI導入支援を手掛けるAIコンサルタント・エンジニアとして活動中。2016年3月「第2回 IBM Watson日本語版ハッカソン」にてアイディア賞受賞。2019年IBM Champion。

IBM CloudでWatson Assistantを立ち上げる

普段の生活のなかでチャットボットにお世話になっている方もあまり気づくことはないと思いますが、チャットボットには大きく分けて「一問一答タイプ」と、「要望受付タイプ」の2種類があるそうです。たとえば、LINEで使える有名なボット「元女子高生AIりんな」は「一問一答タイプ」で、ヤマト運輸の再配達依頼は「要望受付タイプ」。そう言われると、確かに種類が違うような気がします。

f:id:itstaffing:20200116135249j:plain
▲今回作成する「一問一答タイプ」のチャットボットのイメージ。Watson Assistantはどちらのタイプも作れるが、一問一答タイプのほうが難易度的に低いそう

Watsonでチャットボットを作る前に、まず、Intent、Entity、Dialogという3つの要素について、概念を知っておく必要があります。

・Intent
文章の意図を理解させるためのものです。たとえば私たちには「Watsonについて教えて」と「Watsonって何?」と「Watsonについて知りたい」が、すべて同じ意味だということがわかりますが、Watsonには分かりません

・Entity
単語や表記のゆれをフォローするものです。たとえば、和食、洋食、中華、フレンチ、イタリアンの単語すべてが、同じ料理ジャンルであるということはWatsonには分かりません

・Dialog
会話の流れを組み立てるものです。どう言われたらどう返すのかというもの。会話の構成を組み立てる要素です

3つの要素を理解したところで、いよいよ実際にWatsonを使ってみます。IBM Cloudにログインして、サービスを作成します。

f:id:itstaffing:20200116135251j:plain
▲IBM Cloudにログインし、[カタログ]をクリックする。読み込みが長いが辛抱して待つ。サービスからWatson Assistantを起動する

次にエリアや料金プランを選択します。

f:id:itstaffing:20200116135255j:plain
▲ライトプランを選んでおけば料金は発生しない。ちなみにサービス名はどのような名前でもいいとのこと

次にSkillを作成します。

f:id:itstaffing:20200116135257j:plain
▲右上のサービスボタンをクリック。次に作成ボタンをクリックしてSkillを作る。ボタンをマウスオーバーすると「Skills」と表示される

f:id:itstaffing:20200116135300j:plain
▲Dialog skillが選ばれていることを確認し、[Next]をクリック。次画面で名前をつけ、言語を選び[Create dialog skill]を選ぶ。名前は日本語でもOK

Intentの作成

ここから先の作業は「センス」が必要になるそうです。今回は、架空のピザ店「Pizza Watson(ピザ・ワトソン)」の注文受け付けシステムを作成していきます。

まずはIntentから作成していきます。

f:id:itstaffing:20200116135303j:plain
▲画面左端のメニューが「Intents」になっていることを確認し、[Create intent]をクリック。次画面でIntent Nameに「ピザの注文」と入力したあと、[Add example]をクリックして、ピザの注文の言い回しを追加していく

「センスが必要になる」のはココ。ピザを注文するのにどれだけの言い方があるのかを考え、ボットが柔軟に対応できるように入力していきます。

また、このとき、スペースを入れると文脈として認識しないので、できるだけつながった自然な文章を入力するのがコツだそうです。なぜなら、Watsonは前後の係り受け、主語・述語を認識しながら学習しているそうで、スペースを入れると、前後関係がわからなくなり、学習効果が薄まるからとのことでした。

f:id:itstaffing:20200116135305j:plain
▲最低でも10種以上のバリエーションを用意するといいそう。同じ文章でも、漢字とひらがなの両方で入力しておくと、対応力が広がる

入力したら、画面上の青い[←]で戻ります。確定しなくても反映されます。他のアプリケーションと勝手が違うので、少し不安になりますが、これでIntentの作成は終了です。

Entityの作成

次にEntityを作成していきます。

f:id:itstaffing:20200116135307j:plain
▲今度は画面左端のメニューが「Entities」になっていることを確認し、[Create entity]をクリック。次画面でEntityの名前を設定し、[Create entity]をクリックしたあと、カプリチョーザに関する情報を追加し[Add value]をクリックする

カタカナ、ひらがな、アルファベットなどはもちろんですが、名前をうろ覚えで「カプリなんとか」と注文する人もいるかもしれません。そうした可能性までも網羅しておくと良いそうです。

Dialogの作成

IntentとEntityは、Dialogを組み立てるための部品です。部品が揃ったところで、それらを機能させるDialogを構築していきます。

f:id:itstaffing:20200116135311j:plain
▲画面左端のメニューが「Dialogs」になっているのを確認し、[Create dialog]をクリックして次画面へ。Dialogの作成では、線でつながった白い四角が表示される。この白い四角をノードと呼び、ノードは上から順に処理されていく

上記画面の「ようこそ」と書かれたノードは自動的に作成されます。これをクリックし、内容を「いらっしゃいませ。Pizza Watsonです!ご用件をどうぞ!」と、それらしい内容に変えてみます。ここの文章は学習に関係ありません。また、入力後は反映ボタンが無く、[×]ボタンで閉じて問題はありません。もちろん変更は反映されています。

では、新しいノードを追加してみましょう。

f:id:itstaffing:20200116135315j:plain
▲[Add node]ボタンをクリックすると、新しいノードが追加され、空のノードの詳細が表示される。ノード名に「ピザの注文対応」と入力し、対応するIntentを選択する

f:id:itstaffing:20200116135317j:plain
▲次に「Assistant responds」の下のプルダウンメニューから「Option」を選び、Titleに「ピザのメニューを選んでください!」と入力して[Add Option]をクリックする

f:id:itstaffing:20200116135319j:plain
▲LIST LABEL と VALUE に「カプリチョーザ」と入力する

ピザの注文以外に「営業時間は何時から何時までですか」など、想定されるいろいろな質問に対応できるようにするとなると、ノードの数も何十個と増えていきます。

Dialog作成中に[Try It]ボタンをクリックすると、ここまでの入力結果を実際に試すことができます。

f:id:itstaffing:20200116135321j:plain
▲Try Itでは[Clear]ボタンを押すと最初からやり直せるため、違う言葉で質問することができる。近い意味の言い回しも入力して、うまく返答できなければEntityなどを増やして鍛えていく

基本的な作成はここまで。

参加者は30名強。IBM Championの肩書を持つお二人のTAが席を回りながら、分からないところ、つまずいたところをフォローしてくださったため、参加者のほとんどが基本機能の実装は完成された様子でした。余った時間は、追加機能の実装に取り組まれていました。

樋口さんは、できればやって欲しい要素も紹介してくださり、各自が「Pizza Watson」から依頼されてチャットボットを作るエンジニアになったつもりで、完成度を高めていきました。

f:id:itstaffing:20200116135325j:plain
▲これらの機能を満たすサンプルも参加者に配られた

最後に、樋口さんが作成した完成度の高いチャットボットのソースデータが配布されました。これは樋口さんがチャットボット作成をはじめた当初に「誰かが、出来上がったお手本をくれないかな」と思ったことがあり、参加者が同じ思いを抱いたときのために用意してくださったとのことでした。

樋口さん提供の完成品では「カプリチョーザって何?」と聞くと、その説明もしてくれるなど、かなり多機能。これをお手本に、Watson Assistantを使いこなせるようになりたいと参加者の皆さんは感じたのではないでしょうか。

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

【イベントレポート】VBA+SQLで作るAccessデータベースアプリケーション

この記事では、2019年10月25日に開催したイベント「VBA+SQLで作るAccessデータベースアプリケーション」をレポートします。

業務で使用することも多い、AccessVBAとSQL。今回のイベントでは、AccessVBAとSQLを組み合わせて、レコードセットの取得、展開、レコードの追加、更新、削除などの基本的な方法を、書籍『Access VBA 実践マスターガイド ~仕事の現場で即使える』の著者である今村ゆうこさんに解説いただきました。

■今回のイベントのポイント
・Accessはテーブルとフォームを「連結」させることで、アプリケーションのユーザインタフェース部分を簡単に作成することができる
・「連結」のフォームは便利だがデメリットもあり、その対策として「非連結」のフォームとVBA+SQLを使ったテクニックも覚えておくと実装の幅が広がる
・テーブルやパーツの名前には、コントロール別に規則をつけるとコード上で識別しやすくなる。テーブル名は「T_」、フィールド名は「fld_」で始めるなど

【講師プロフィール】
今村 ゆうこさん
地方の非IT系企業に勤務し、Web担当と業務アプリケーション開発を手掛ける。小学生と保育園児の2人の子供を抱えるワーキングマザー。著書に『Access VBA 実践マスターガイド ~仕事の現場で即使える』『Access マクロ入門 ~仕事の現場で即使える』『Access レポート&フォーム 完全操作ガイド ~仕事の現場で即使える』『Access データベース本格作成入門 ~仕事の現場で即使える』『Excel & Access 連携実践ガイド ~仕事の現場で即使える』『スピードマスター 1時間でわかる Accessデータベース超入門』(すべて技術評論社)がある。

Accessの特徴

まずは、VBAについて学ぶうえで必要となるオブジェクトの確認からスタートしました。

Access VBAで使うオブジェクトには、次の4種類があります。

・テーブル:データを溜め込む
・クエリ:抽出して計算する(利用)
・レポート:印刷用テンプレを作る
・フォーム:データ入力フォーム

わかりやすく言うと、テーブルはExcelの表のようにデータが整理されているもので、これらが複数集まったものがデータベースというイメージだそうです。

そして「あっちのテーブルのここのデータ」「こっちのテーブルのここのデータ」という指示でデータを集めたり計算したりするのがクエリ、結果を印刷するための体裁を整えるのがレポートで、データベース(テーブル)にデータを入力するインターフェイスがフォームとのことです。

f:id:itstaffing:20200106130011j:plain
▲テーブルとフォーム、レポートの関係

次にマクロとVBAの違いです。マクロは、VBAをベースに日本語でプログラムが作れるというイメージで「実は、マクロでだいたいのことはできる」そうですが、SQLを使うことはできません。

クエリとSQLは、どちらも似たような目的で利用できます。それもそのはずで、クエリはSQLがベースになっているからだそうです。

f:id:itstaffing:20200106130014j:plain
▲クエリで指示した操作をSQL文として取得することもできる。それらをコピペしてVBAで使うのも便利

一般的なデータベースアプリケーションは、3層アーキテクチャの形をとります。ユーザインタフェースとデータベース、その間をつなぐビジネスロジックの3層です。一般的に3層アーキテクチャのアプリを一つ作るには、たくさんのファイルが必要となりますが、Accessの場合、1つのファイルでこの3層を実現できます。

ビジネスロジックの部分をマクロまたはVBA、クエリまたはSQLで作り込むことになりますが、VBAとSQLを使ったテクニックを覚えておくと、応用が効いて便利だそうです。

また、Accessで作成するアプリケーションは、データベースファイルの容量制限などから、小規模な会社や部署で使うのに向いていると、今村さんはお話しされました。

f:id:itstaffing:20200106130016j:plain
▲大規模なシステムはSQL ServerやOracle DBなどを使い、Webアプリケーションなどで構築するのが主流。Accessのアプリケーションは中小規模向け

Accessファイルを共有サーバに置き複数名で使うことも可能ですが、使用者は少数に限られるべきと、説明されました。同時にレコード更新の際に排他的処理が必要な場合には、Accessは不適切だそうです。

また、Accessはテーブルとフォームを「連結」させることで、アプリケーションのユーザインタフェース部分をとても簡単に作成することができますが、デメリットもあるそうです。

f:id:itstaffing:20200106130019j:plain
▲「連結」のフォームを使わない「非連結」の状態で、データの取り出しや書き込む方法もある

これらを踏まえ、今村さんはVBAとSQLでアプリケーションの実装に入り、一つひとつ丁寧に解説されました。

短い時間の中、完成まで分かりやすく解説してくださったのですが、このレポートではボリュームの都合により、テーブルの設計と、単一フォーム(一対多の関係を持たない構造)におけるデータの読み書きの実装までの内容をお伝えします。

テーブル設計

まずはテーブルを設計していきます。ここで例として扱ったのはマスターテーブルである「商品マスター」と、トランザクションテーブルである「販売データ」「販売データ詳細」の計3つ。

マスターテーブルは、新商品の追加など比較的更新頻度が低いテーブルですが、トランザクションテーブルは毎日の商取引に応じてデータが増えていきます。

f:id:itstaffing:20200106130022j:plain
▲マスターテーブル「商品マスター」

f:id:itstaffing:20200106130024j:plain
▲トランザクションテーブル「販売データ」

f:id:itstaffing:20200106130026j:plain
▲トランザクションテーブル「販売データ詳細」

テーブルやテーブルを構成するパーツには名前を付けますが、テーブル名は「T_」で、フィールド名は「fld_」で始めるというように、コントロール別に命名規則を定めておくと、あとからSQL文を書くときに便利だそうです。

フォーム設計

次にフォームを設計します。商品マスターのデータ入力用と、販売データの入力用がそれぞれ必要になります。詳細は次の通りです。

f:id:itstaffing:20200106130029j:plain
▲「商品マスター」フォームの詳細

f:id:itstaffing:20200106130031j:plain
▲「販売データ」フォームの詳細

「ラベル」や「ボタン」などのコントロールでは、プログラム上で識別に使う「名前」(例:btn_ボタン)と、コントロール上に表示される文字列の「標題」(例:ボタン)があるので、混同しないように命名します。

f:id:itstaffing:20200117132516j:plain

▲「標題」と「名前」が混ざらないように注意

販売データのフォームで「親レコード削除のチェックボックスがあると便利」ということや、「1~10までの数字を順につけておくと後でループを使って処理できる」などのポイントも教えていただきました。

VBA+SQLでアプリケーションの実装

いよいよVBAとSQLで実装していきます。

まず、単一フォームの初期化を行います。フォームを開いたときと、[新規]ボタンがクリックされたときに、初期化の処理を行います。どちらも同じ処理なので、InitializeForm()という処理にまとめて、呼び出すようにしています。

f:id:itstaffing:20200106130036j:plain
▲InitializeFormという処理を別に作成しておき、呼び出すようにする

次に、テーブルからデータを読み込む処理を実装します。次のようにレコードセットを取得する部分のコードを作成します。

f:id:itstaffing:20200106130038j:plain
▲レコードセット取得のテンプレート・詳細1

f:id:itstaffing:20200106130041j:plain
▲レコードセット取得のテンプレート・詳細2

エラーが起きたときも、起きなかったときも、最後の処理(Finally)が必要です。続いて、SQLのSELECT文を実装します。SQL文を途中改行する際は、文末「_」を付ける点に注意してください。

Dim 変数名 as String
変数名 = "SELECT フィールド名" & "FROM テーブル名" & "WHERE 条件;"

上記の文を見やすくするために改行するには、次のようになります。

Dim 変数名 as String
変数名 = "SELECT フィールド名" & _
"FROM テーブル名" & _
"WHERE 条件;"

改行時に「_」を入れている箇所に注目です。ここに実際のコントロール名を当てはめると、次のようになります。

f:id:itstaffing:20200106130044j:plain
▲シングルクォートの扱いに注目。また「Me.」はこのフォーム自身を指すときに使う

次に、データベースに変更を加える処理の実装です。まず、SQL文を実行する部分のコードを作成します。

f:id:itstaffing:20200106130047j:plain
▲SQL文を実行し、結果に応じた戻り値を返す

次に、INSERT、UPDATE、DELETEの各SQL文の実行部分を実装していきます。

f:id:itstaffing:20200106130009j:plain
▲INSERT文の実装。SQLのINSERT文をセットしtryExecuteを呼び出す。同様にUPDATE、DELETEも実装していく

このほか、DELETE文の実装では「本当によろしいですか?」の確認機能を追加しました。複数レコードの展開とトランザクション(複数レコード取得/複数命令処理の実装)についても実装すると、きちんと動作するAccessのアプリケーションが完成しました。

今回のイベントでは、VBAを使えば、Accessで手軽に本格的なアプリケーションが作成できるという点が、とてもよく分かりました。参加者からは、「実際のコードを例にノウハウを解説いただいて、今後取り組む業務に役立つ内容でとてもためになった」「非連結状態での処理方法は初めてだったので、とても参考になりました」などの声をいただきました。

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