無限大な夢のあと

テニスとアニメが大好きな厨二病SEのブログ

「プログラマ脳を鍛える数学パズル」でGolang入門 2問目(数列 の 四則演算) 文法解説編

普段はJavaプログラマな私が「プログラマ脳を鍛える数学パズル」の問題を解いていく中で、Golangに入門していく記事。

コードを解くに当たって、参考にしたページなども合わせて記載してみる。
ちなみにGoのバージョンは1.6。


1問目の解答編はこちら。
「プログラマ脳を鍛える数学パズル」でGolang入門 1問目(10進数で回文) 解答編 - スーツとギークのはざまで


2問目の解答編はこちら。
「プログラマ脳を鍛える数学パズル」でGolang入門 2問目(数列 の 四則演算) 解答編 - スーツとギークのはざまで



※本記事は主に以下の記事を参考に記載されています。
Scanner周りは記事の中身から抜粋させて頂いています。
お気楽 Go 言語プログラミング入門




1.構造体について
まだ自分の言葉で説明できるほど理解が進んでいないので、記事へのリンクを記載します。

概要のみ押さえたい方はこちら。
dev.classmethod.jp

私のようにC言語等の経験がほぼない方はこちら。
お気楽 Go 言語プログラミング入門

Javaenumっぽいイメージだけど、厳密には違う(enumに比べて機能が足りない)みたい。
oinume.hatenablog.com
mattn.kaoriya.net


2.Scannerクラスについて
Go 言語のパッケージ text/scanner には字句解析を行うScannerが用意されている。
Scanner は UTF-8エンコードされたテキストを Go 言語の文法に従って解析する。
Sccanner の使い方は簡単。基本的には次に示す 3 つの関数 (メソッド) で字句解析を行う。

func (s *Scanner) Init(src io.Reader) *Scanner
func (s *Scanner) Scan() rune
func (s *Scanner) TokenText() string

Scanner は字句解析を制御するための構造体。
メソッド Init は Scanner を初期化します。
ソース (テキストファイル) として io.Reader を渡します。
解答では、strings.NewReaderメソッドを引数に渡している。
qiita.com

メソッド Scan はソースから空白文字と Go 言語のコメントを読み飛ばしてトークンを切り出す。
返り値の型 rune は int32 の別名で、UTF-8文字コードを表す。
Scan はトークンの種別を負の整数で返し、+ や * などの記号はその文字コードを返す。
切り分けたトークンはメソッド TokenText で取り出すことができる。

リスト : トークンの種別

const (
    EOF = -(iota + 1)
    Ident
    Int
    Float
    Char
    String
    RawString
    Comment
)

EOF はファイルの終了を表す。Ident は識別子、Int は整数、Float は実数、Char は文字 ('a', 'b' など)、String は文字列 ("foo", "bar" など) を表す。



3.Scannerクラスでのサンプル

それでは実際に scanner を使ってみよう。

package main

 import (
    "fmt"
    "os"
    "text/scanner"
)

func main() {
    var s scanner.Scanner
    s.Init(os.Stdin)
    for {
        fmt.Print("> ")
        x := s.Scan()
        fmt.Println(x, s.TokenText())
    }
}

変数 s に Scanner を用意。
s.Init(os.Stdin) で Scanner を初期化し、次の for ループで標準入力からのテキストを s.Scan() で字句解析する。
TokenText は Scan を実行したあと有効で、そのとき切り分けたトークンを文字列にして返す。
Scanner の場合、for や if も識別子 (Ident) として認識される。

実際には、次のような構造体とメソッドを定義して、切り分けたトークンを保存しておくと便利。

リスト : 字句解析

type Lex struct {
    scanner.Scanner
    Token rune
}

func (lex *Lex) getToken() {
    lex.Token = lex.Scan()
}

構造体 Lex は Scanner を埋め込み、切り分けたトークンをフィールド変数 Token に格納します。メソッド getToken は Scan を呼び出してトークンを切り出し、その結果を Token にセットします。

改訂2版 基礎からわかる Go言語

改訂2版 基礎からわかる Go言語

Go言語によるWebアプリケーション開発

Go言語によるWebアプリケーション開発

スターティングGo言語 (CodeZine BOOKS)

スターティングGo言語 (CodeZine BOOKS)

「プログラマ脳を鍛える数学パズル」でGolang入門 2問目(数列 の 四則演算) 解答編

普段はJavaプログラマな私が「プログラマ脳を鍛える数学パズル」の問題を解いていく中で、Golangに入門していく記事。

コードを解くに当たって、参考にしたページなども合わせて記載してみる。
ちなみにGoのバージョンは1.6。


1問目はこちら。
「プログラマ脳を鍛える数学パズル」でGolang入門 1問目(10進数で回文) 解答編 - スーツとギークのはざまで


2問目
といきたいところですが、問題文の提示等が著作権的に問題がありそうなので、思考過程(文法の調査)と答えのみ載せます。
どのような問題かは書籍を購入してご確認ください。



1.アルゴリズムを考える前にeval関数の存在の確認
まず、この問題を解くにあたって、JavaScriptにあるeval関数(コードを評価し、実行する関数)があるかを確認してみる。
→以下の記事などで試している人はいそうだけど、サンプルが動かなかったため諦めることに。
Goをちょっと使ってみた - ラシウラ



2.eval関数相当のことができるようなプログラムのサンプルを探す。
→以下の記事で電卓プログラム作成のサンプルを作っているのを見つけたので、参考にしてみることに。
www.geocities.jp

昔、この本読んで途中で積読したのを思い出した。

2週間でできる! スクリプト言語の作り方 (Software Design plus)

2週間でできる! スクリプト言語の作り方 (Software Design plus)



3.電卓プログラム内で、読み解くにあたって以下の事項を確認
・字句解析
構文解析
・式評価
→上記の処理を実現するためのGoの文法の話は、のちに記事をまとめる予定。



4.電卓プログラムの各メソッドを利用
参考にした電卓プログラムで、入力がos.stdinでユーザーからの入力になっていた初期化の箇所を修正。
(変更前) lex.Init(os.Stdin)
(変更後) lex.Init(strings.NewReader(計算式))



5.電卓プログラムの不要な処理を削除
以下の処理を削除
・ユーザ入力待ちの無限ループ
・入力開始
・「;」での計算式終了判定
・quitでの終了判定



6.文字列連結について
どの言語でも話題になる文字列連結。
Golangでは、文字列はImmutableらしいので、少し調べてみた。
Golang の文字列連結はどちらが速い? - Qiita
→今回はそんなに遅くならないという+演算子で手を打つことに。



7.数値から文字列への変換
ここが今回、少しはまったところ。
以前は、「fmt.SprintF("%d",数字型)」で文字列を出力したが、このメソッドで作った文字列を配列に入れて処理した時に通常の文字列として入ってくれない。
(今、思い返したら%#をつけたら良かった?)
今回は以前も紹介した以下の記事を参考に「strconv.Itoa(int型)」を使用。
matope.hatenablog.com



8.部分文字列の取得方法を確認。
計算式構築にあたり、部分文字列を取得するために、以下の記事を参考にした。

逆引きGolang (文字列)

今回は対象の文字列が4桁だけど、文字列が長い場合は、文字列をスライスの要素に入れて、アクセスしても良いかも。



9.実装
色々はまったが、実装完了。
以下、実装しながら気づいた修正した点。
・元の電卓プログラムがFloat64型で計算してたが、int型で十分だったので、変更。
・+,-,/演算子は桁が変わってしまうので、使えない。電卓プログラムの該当箇所を変更および削除。



10.今回の実装にあたっての深掘り
別記事にて、のちに追記予定。
電卓プログラムの中身を理解できていないとこだらけ。
また、C言語での経験がほぼないので、ポインタ、構造体が全然わかっていないので、これを機会にしっかり勉強しよう。



11.感想
eval関数自作は、参考にしたプログラムがあったとはいえ、大変だった( ;´Д`)


3問目も頑張ります。

改訂2版 基礎からわかる Go言語

改訂2版 基礎からわかる Go言語

Go言語によるWebアプリケーション開発

Go言語によるWebアプリケーション開発

スターティングGo言語 (CodeZine BOOKS)

スターティングGo言語 (CodeZine BOOKS)

「プログラマ脳を鍛える数学パズル」でGolang入門 1問目(10進数で回文) Go言語仕様理解編

普段はJavaプログラマな私が「プログラマ脳を鍛える数学パズル」の問題を解いていく中で、Golangに入門していく記事となります。

dke-msy-node.hatenablog.com

上記の記事で、解答、解答までのプロセスなどを記述したので、本記事では個々の文法の要素をJavaと比較して理解を深めていきます。


7-0.実装後の疑問点潰し(深堀り)

以下の記事でstringとruneについて、確認。
knightso.hateblo.jp

上記の記事で、意味がよく分からなかったり、A Tour of Goを読んだ時の疑問点を潰していく
Unicodeのコードポイント
・byteスライス
・int8、int32などの違い
・fmt.Printfのフォーマットの書式の確認(%#、%U、%x)

7-1 Unicodeのコードポイント
→以下の記事で理解。
バイトオーダーの話や文字コード周りはあんまり調べすぎると戻ってこれなくなるので、ほどほどに。
equj65.net
バイトオーダ - ビッグエンディアン/リトルエディアン

以下の書籍を半分くらい読んで中身をすっかり忘れてしまっているので、再度よみ直さねばと実感。

プログラマのための文字コード技術入門 (WEB+DB PRESS plus) (WEB+DB PRESS plusシリーズ)

プログラマのための文字コード技術入門 (WEB+DB PRESS plus) (WEB+DB PRESS plusシリーズ)



7-2 byteスライス
配列とスライスの違いがわからず。
以下の記事で大まかに理解。

www.slideshare.net



7-3 int8、int32などの違い
以下の記事のGoの言語仕様から確認。
golang.jp

Javaに当てはめて考えてみる。

uint8 符号なし 8-ビット 整数 (0 to 255)
uint16 符号なし 16-ビット 整数 (0 to 65535)
uint32 符号なし 32-ビット 整数 (0 to 4294967295)
uint64 符号なし 64-ビット 整数 (0 to 18446744073709551615)
Javaではプリミティブ型の整数は符号付きだが、JDK1.8で符号なし整数として扱うメソッドがラッパークラスに追加された。
Java型メモ(Hishidama's Java type Memo)


・int8 符号あり 8-ビット 整数 (-128 to 127)
Javaのbyte型

・int16 符号あり 16-ビット 整数 (-32768 to 32767)
Javaのshort型

・int32 符号あり 32-ビット 整数 (-2147483648 to 2147483647)
Javaのint型

・int64 符号あり 64-ビット 整数 (-9223372036854775808 to 9223372036854775807)
Javaのlong型。

float32 IEEE-754 32-ビット 浮動小数
Javaのfloat型

float64 IEEE-754 64-ビット 浮動小数
Javaのdouble型

complex64 float32の実数部と虚数部を持つ複素数
complex128 float64の実数部と虚数部を持つ複素数
Javaの標準ライブラリには存在しない。

byte uint8の別名(エイリアス)
rune int32の別名(エイリアス)

uint 32 または 64 ビット
→32bitマシンか64bitマシンかでサイズに違いが出る。

int uintと同じサイズ
uintptr ポインタの値をそのまま格納するのに充分な大きさの符号なし整数

string型の変数 != byte配列

文字列型は文字列の値を表現します。文字列はbyteのスライスのように振舞いますが値は不変です。つまり一度作成されたあとは文字列の内容を変更できません。文字列型として事前宣言済みの型はstringです。

文字列型の要素はbyte型データを持っているため、一般的なインデックスを使ったアクセスが可能です。ただし要素のアドレスを取得することはできません。すなわちs[i]がある文字列のi番目のバイトであるとして、&s[i]とすることはできません。文字列の長さは組み込み関数lenを使用して調べることができます。文字列sがリテラルであれば文字列長はコンパイル時に定数となります。




7-4 fmt.Printfのフォーマットの書式の確認(%#、%U、%x)

以下の記事で確認。
golang.jp
・%U ユニコードフォーマット: U+1234; "U+%x"と同じ。デフォルトは、4桁
・%# この値をGo言語の構文で表現する
・%x 基数16、10以上の数には小文字(a-f)を使用



深掘りもほどほどにして、2問目も頑張ります。

改訂2版 基礎からわかる Go言語

改訂2版 基礎からわかる Go言語

Go言語によるWebアプリケーション開発

Go言語によるWebアプリケーション開発

スターティングGo言語 (CodeZine BOOKS)

スターティングGo言語 (CodeZine BOOKS)

「プログラマ脳を鍛える数学パズル」でGolang入門 1問目(10進数で回文) 解答編

普段はJavaプログラマな私が「プログラマ脳を鍛える数学パズル」の問題を解いていく中で、Golangに入門していく記事となります。

コードを解くに当たって、参考にしたページなども合わせて記載してみる。
では早速、1問目。

といきたいところですが、問題文の提示等が著作権的に問題がありそうなので、思考過程(文法の調査)と答えのみ載せます。
どのような問題かは書籍を購入してご確認ください。


1.まずは基本的な文法から勉強。
問題を解くに当たっては、Goの文法が全くわからないということで、入門記事を漁ることに。
「A Tour of Go」が良いと以下の記事に書いてあったので、そこから始めてみた。
qiita.com

以下の2つの章を写経し、今回やりたい処理は事足りるかなと思い、問題に取り掛かることに。
A Tour of Go

・Packages, variables, and functions.

・Flow control statements: for, if, else, switch and defer
A Tour of Go



2.数字から文字列の変換方法を調べる。
以下の記事を読み、「strconv.Itoa」メソッドだといけそうだなと判断。
matope.hatenablog.com



3.10進数から2進数、8進数への変換方法を調べる。
以下の記事を読み、「fmt.Sprintf」で変換はできそうだと判断。
逆引きGolang (数値)


4.文字列を逆にする方法を調べる。
以下の記事を読み、この方法でいけばできそうだなと考える。
Go言語で文字列を逆順に並び替える - 雑記
runeの配列生成時のコンストラクタに文字列を入れると、文字がそれぞれ分解して配列になる?
一旦実装しきってから確認しよう。
→lenメソッドはbyte数を返す。
→よって、byte毎に配列に格納されているよう。


5.実装。
実装完了。
もう少し慣れてきたら、APIリファレンスだけを読みながら実装できるようにしよう。


6-0.実装後の疑問点潰し(深堀り)
Golangの文法の深掘りについては、別記事を書く予定。


おまけ

JavaScript

Ruby




2問目も頑張ります。

改訂2版 基礎からわかる Go言語

改訂2版 基礎からわかる Go言語

Go言語によるWebアプリケーション開発

Go言語によるWebアプリケーション開発

スターティングGo言語 (CodeZine BOOKS)

スターティングGo言語 (CodeZine BOOKS)

【書評】プログラマのためのDocker教科書( @yyamada ) 

今回もWINGSプロジェクト様( @yyamada )の書籍レビュアーに応募させていただき書評を書かせていただくことになりました。
WINGSプロジェクトの皆様、著者の山田様ありがとうございます。
今回は表題にもある以下のURLの書籍を献本していただきましたので、こちらのレビューをさせていただきます。

プログラマのためのDocker教科書 インフラの基礎知識&コードによる環境構築の自動化

プログラマのためのDocker教科書 インフラの基礎知識&コードによる環境構築の自動化


私の書籍を読む前のDockerの理解度ですが、下記の書籍のDockerの特集を読み、1-2年前に動かしたくらいでそこからは活用できていませんでした。

WEB+DB PRESS Vol.79

WEB+DB PRESS Vol.79

  • 作者: 成瀬ゆい,そらは(福森匠大),西磨翁,小川航佑,佐藤新悟,塚越啓介,藤原亮,堀哲也,田村孝文,桑野章弘,松浦隼人,中村俊之,田中哲,福永亘,杉山仁則,伊藤直也,登尾徳誠,近藤宇智朗,若原祥正,松木雅幸,奥野幹也,後藤秀宣,羽二生厚美,笹田耕一,平河正博,東舘智浩,渡邊恵太,中島聡,A-Listers,はまちや2,川添貴生,山田育矢,伊藤友隆,村田賢太,まつもとゆきひろ,佐野岳人,山口恭兵,千葉俊輝,平松亮介,WEB+DB PRESS編集部
  • 出版社/メーカー: 技術評論社
  • 発売日: 2014/02/22
  • メディア: 大型本
  • この商品を含むブログ (5件) を見る

今回の書籍レビューア応募により、ただ記事にある通りに動かしただけでなく、色々な使い方ができるのを学ぶことができたので、現場で活用する機会がある時に提案できるくらい学ぶことができました。
ありがとうございます。

ここから書籍レビューに入らせていただきます。
今回書籍を読んで、思った一番の印象はインフラに詳しくない人が挫折しないように、本当に丁寧に書かれているということでした。
例えば、1章の導入編では、システム基盤・ネットワーク/ハードウェア、Linuxミドルウェア、インフラ構成管理の基礎知識を学ぶことができます。
個人的には、普段アプリケーションエンジニアのレイヤーで仕事をしていることもあり、システム基盤の構築/運用の流れについて、すべての流れをまだ経験したこともないこともあり、今後参考にしていきたいと感じました。
また、Linuxの基礎知識に関しては、現場で学んだことやLPIC Level1/Level2で学んだことなどが凝縮されて、うまくまとまっていると感じました。

Linux教科書 LPICレベル1 第5版

Linux教科書 LPICレベル1 第5版

Linux教科書 LPICレベル1 スピードマスター問題集 Version4.0対応

Linux教科書 LPICレベル1 スピードマスター問題集 Version4.0対応

Linux教科書 LPICレベル2 Version4.0対応 (EXAMPRESS)

Linux教科書 LPICレベル2 Version4.0対応 (EXAMPRESS)

Linux教科書 LPIC レベル2 スピードマスター問題集 Version4.0対応

Linux教科書 LPIC レベル2 スピードマスター問題集 Version4.0対応

2章もコンテナ仮想化/Dockerの話が基礎からまとまっていて、3章以降の理解を助けてくれます。
Dockerが動く仕組みをLinuxカーネルの機能理解(namespaceなど)から説明してくれていて、知らなかったことだらけで勉強になりました。

3章-5章は、Dockerの基本的な使い方から実際のサーバ構築、Dockerイメージの共有について書かれています。
こちらは、1-2章の理解があれば、実際に使用する際にコマンドリファレンス的に使うことができます。
6-8章からは、実際にWordPressのシステム構築やマルチホスト環境/クラウドでのDocker運用と、実務で実際に使う際のヒントとなる内容が記載されています。

まとめとして、Infrastructure as Codeの話はよく聞くけどどんなものかを知らない方やDockerってどんな場面に活用できるかといういうのがいまいちわからない方、Dockerを使用することになった方などにおすすめできる書籍となっています。
繰り返しになりますが、題名にもある通りインフラに詳しくないプログラマの方でも学びやすい書籍になっているため、該当される方はぜひ購入してみてください。

以上、レビューとさせていただきます。
最後に目次も紹介させていただきます。
以下のページから引用させていただきました。
[http://www.wings.msn.to/index.php/-/A-03/978-4-7981-4102-2/


第1章 おさえておきたいシステム/インフラの知識
1-1 システム基盤の基礎知識
 システム基盤の構成要素
  機能要件(functional requirement)
  非機能要件(non-functional requirement)
  ハードウェア
  ネットワーク
  OS(オペレーションシステム)
  ミドルウェア
 システム基盤の種類(クラウドとオンプレミス環境)
  オンプレミス(on-premises)
  パブリッククラウド(public cloud)
  プライベートクラウド(private cloud)
  クラウドが適しているケース
  オンプレミスが適しているケース
 システム基盤の構築/運用の流れ
1-2 ネットワーク/ハードウェアの基礎知識
 ネットワークアドレス
  MACアドレス物理アドレスイーサネットアドレス)
  IPアドレス
 OSI基本参照モデル通信プロトコル
  アプリケーション層(レイヤー7)
  プレゼンテーション層(レイヤー6)
  セッション層(レイヤー5)
  トランスポート層(レイヤー4)
  ネットワーク層(レイヤー3)
  データリンク層(レイヤー2)
  物理層(レイヤー1)
 ファイアウォール
  パケットフィルタ型
  アプリケーションゲートウェイ
 ルータ/レイヤー3スイッチ
 サーバ機器
  CPU
  メモリ
  ストレージ
1-3 OS(Linux)の基礎知識
 Linuxの概要
  Linuxカーネル
  Linuxディストリビューション
 Linuxカーネル
  デバイス管理
  プロセス管理
  メモリ管理
 Linuxファイルシステム
 Linuxのディレクトリ構成
 Linuxのセキュリティ機能
  アカウントによる権限設定
  ネットワークフィルタリングによる機能
  SELinux(Security-Enhanced Linux
1-4 ミドルウェアの基礎知識
 Webサーバ/Webアプリケーションサーバ
 データベースサーバ
 システム統合運用監視ツール
1-5 インフラ構成管理の基礎知識
 インフラ構成管理
 Infrastructure as Code
 代表的なインフラ構成管理ツール
  OSの起動を自動化するツール(Bootstrapping)
  OSやミドルウェアの設定を自動化するツール(Configuration)
  複数サーバの管理を自動化するツール(Orchestration)
第2章 コンテナ仮想化技術とDocker
2-1 仮想化技術
 仮想環境
 ホスト型仮想化
 ハイパーバイザー型仮想化
 コンテナ型仮想化
2-2 コンテナ仮想化技術の歴史
 2000年~FreeBSD Jail
  プロセスの区画化
  ネットワークの区画化
  ファイルシステムの区画化
 2005年~Solaris Containers
  Solarisゾーン機能
  Solarisリソースマネージャ機能
2-3 Dockerの特徴
 移植性
 相互接続性
 Docker専用Linuxディストリビューション
  Red Hat Enterprise Linux Atomic Host(RHEL Atomic Host)
  Project Atomic
  Snappy Ubuntu Core
  CoreOS
2-4 Dockerの基本機能
 Dockerイメージを作る機能
 Dockerコンテナを動かす機能
 Dockerイメージを公開/共有する機能
 Dockerコンポーネント
  Docker Engine(Dockerのコア機能)
  Docker Kitematic(DockerのGUIツール
  Docker Registry(イメージ公開/共有)
  Docker Compose(複数コンテナ一元管理)
  Docker Machine(Docker実行環境構築)
  Docker Swarm(クラスタ管理)
2-5 Dockerが動く仕組み
 コンテナを区画化する仕組み(namespace)
  PID namespace
  Network namespace
  UID namespace
  MOUNT namespace
  UTS namespace
  IPC namespace
 リソース管理の仕組み(cgroup)
 ネットワーク構成(仮想ブリッジ/仮想NIC
  Dockerコンテナ同士の通信
  Dockerコンテナと外部ネットワークの通信
 Dockerイメージのデータ管理の仕組み
  Btrfs
  AUFS
  Device Mapper
  overlay
第3章 Dockerのインストールと基本コマンド
3-1 Dockerのインストールと動作確認
 Windowsへのインストール
  Docker Toolboxのダウンロードとインストール
 Linuxへのインストール
 TeraTermのインストールと使い方
 Dockerで「Hello world
 Docker KitematicによるGUIでのDockerの動作確認
3-2 Dockerイメージの操作
 Docker Hub
 イメージのダウンロード(docker pull)
 イメージの一覧表示(docker images)
 イメージの詳細確認(docker inspect)
 イメージのタグ設定(docker tag)
 イメージの検索(docker search)
 イメージの削除(docker rmi
 Docker Hubへのログイン(docker login)
 イメージのアップロード(docker push)
 Docker Hubからのログアウト(docker logout)
3-3 Dockerコンテナの生成/起動/停止
 Dockerコンテナのライフサイクル
  コンテナ生成(docker createコマンド)
  コンテナ生成/起動(docker runコマンド)
  コンテナ起動(docker startコマンド)
  コンテナ停止(docker stopコマンド)
  コンテナ削除(docker rmコマンド)
 コンテナの生成/起動(docker run)
 コンテナのバックグラウンド実行(docker run)
 コンテナのネットワーク設定(docker run)
 リソースを指定してコンテナを生成/実行(docker run)
 コンテナを生成/起動する環境を指定(docker run)
 稼働コンテナの一覧表示(docker ps)
 コンテナの稼働確認(docker stats)
 コンテナの起動(docker start)
 コンテナの停止(docker stop)
 コンテナの再起動(docker restart)
 コンテナの削除(docker rm)
 コンテナの中断/再開(docker pause/docker unpause)
3-4 稼働しているDockerコンテナの操作
 稼働コンテナへの接続(docker attach)
 稼働コンテナでプロセス実行(docker exec)
 稼働コンテナのプロセス確認(docker top)
 稼働コンテナのポート転送確認(docker port)
 コンテナの名前変更(docker rename)
 コンテナ内のファイルをコピー(docker cp)
 コンテナ操作の差分確認(docker diff)
3-5 Dockerの情報確認
 Dockerのバージョン確認(docker version)
 Dockerの実行環境確認(docker info)
3-6 コンテナからイメージの作成
 コンテナからイメージ作成(docker commit)
 コンテナをtarファイル出力(docker export)
 tarファイルからイメージ作成(docker import)
 イメージの保存(docker save)
 イメージの読み込み(docker load)
第4章 Dockerfileを使ったコードによるサーバ構築
4-1 Dockerfileの基本
 Dockerfileの用途
 Dockerfileの基本構成
 Dockerfileの作成
 DockerfileからDockerイメージの作成
 Dockerイメージのレイヤー構造
4-2 コマンド/デーモンの実行
 コマンドの実行(RUN命令)
  Shell形式での記述
  Exec形式での記述
 デーモンの実行(CMD命令)
  Shell形式での記述
  Exec形式での記述
  ENTRYPOINT命令のパラメータとしての記述
 デーモンの実行(ENTRYPOINT命令)
  Shell形式での記述
  Exec形式での記述
 ビルド完了後に実行される命令(ONBUILD命令)
  手順1 ベースイメージの作成
  手順2 Webコンテンツの開発
  手順3 Webサーバ用イメージの作成
  手順4 Webサーバ用コンテナの起動
4-3 環境/ネットワークの設定
 環境変数の設定(ENV命令)
  key value型で指定する場合
  key=valueで指定する場合
 作業ディレクトリの指定(WORKDIR命令)
 ユーザの指定(USER命令)
 ラベルの指定(LABEL命令)
 ポートの設定(EXPOSE命令)
4-4 ファイルシステムの設定
 ファイル/ディレクトリの追加(ADD命令)
 ファイルのコピー(COPY命令)
 ボリュームのマウント(VOLUME命令)
  手順1 ログ用イメージの作成
  手順2 ログ用コンテナの起動
  手順3 Webサーバ用イメージの作成
  手順4 Webサーバ用コンテナの起動
  手順5 ログの確認
4-5 Dockerイメージの自動生成/公開
 Automated Buildの流れ
 GitHubへの公開
 Docker Hubのリンク設定
 Dockerfileのビルド
 Dockerイメージの確認
第5章 Dockerイメージの共有――Docker Registry
5-1 プライベートレジストリの構築/管理
 Dockerレジストリの構築
 イメージのアップロード
 イメージのダウンロード
5-2 Amazon S3を使ったイメージ共有
 Amazon S3バケットの作成
 Amazon S3バケットのアクセスキー取得
 プライベートレジストリの起動
 イメージのアップロード/ダウンロード
第6章 複数コンテナの一元管理――Docker Compose
6-1 DockerによるWebシステム構築の基礎知識
 Web3層システムアーキテクチャ
  フロントサーバ
  アプリケーションサーバ
  データベース(DB)サーバ
 永続データの管理
  データのバックアップ/リストア
  ログの収集
 Dockerコンテナ間のリンク
6-2 Docker Composeのインストール
 Docker Compose
 Docker Composeのインストール
6-3 構成ファイル(docker-compose.yml)の構文
 docker-compose.ymlによる構成管理
 ベースイメージの指定(image/build)
 コンテナ内で動かすコマンド指定(command)
 コンテナ間Link連携(link/external_links)
 コンテナ間の通信(ports/expose)
 コンテナのデータ管理(volumes /volumes_from)
 コンテナの環境変数指定(environment)
 コンテナの情報設定(container_name /labels)
6-4 Docker Composeコマンド
 Docker Composeのコマンド
 複数コンテナの生成(up)
 生成するコンテナ数の指定(scale)
 複数コンテナの確認(ps/logs)
 コンテナでのコマンド実行(run)
 複数コンテナの起動/停止/再起動(start/stop/restart)
 複数コンテナの強制停止/削除(kill/rm)
6-5 Docker Composeを使ったWordPressシステム構築
 WordPressのシステム構成
 データ専用コンテナの作成
  1.ベースイメージの取得
  2.作成者情報
  3.データの設定
 WebサーバとDBサーバ用のコンテナ作成
  1.Webサーバ(webserverコンテナ)
  2.DBサーバ(dbserverコンテナ)
  1.Webサーバの設定
  2.DBサーバの設定
 コンテナの起動とデータの確認
 コンテナ群の稼働確認/コマンド実行/停止/削除
 データ専用コンテナのバックアップとリストア
第7章 マルチホスト環境でのDocker 運用――Docker Machine、Docker Swarm
7-1 マルチホスト環境でのコンテナ運用
 マルチホスト環境とクラスタリング
  可用性(アベイラビリティ
  拡張性(スケーラビリティ)
 Docker MachineとDocker Swarm
7-2 Docker Machineコマンド
 Docker Machineのコマンド
 実行環境の作成(create)
 実行環境の一覧表示(ls/status)
 実行環境へのSSH接続(ssh
 環境変数の確認(env)
 実行環境の起動/停止/再起動(start/stop/restart)
 実行環境からのファイルダウンロード(scp)
 実行環境の削除(rm/kill)
 実行環境の情報確認(ip/inspect)
7-3 Docker MachineによるDocker実行環境構築
 Docker Machineを使ったDcoker実行環境の構成
 VirtualBoxでのDocker実行環境構築手順
 Amazon EC2でのDocker実行環境構築手順
7-4 Docker Swarmによるクラスタ管理
 Docker Swarmによるクラスタ環境構築
 クラスタ環境でのコンテナ動作確認
7-5 SaaSによるコンテナ監視
 サーバ稼働監視の概要
  マシンの死活監視
  サービスの稼働監視
  サーバ/ネットワークのリソース監視
  ジョブ監視
 Mackerelでのコンテナ監視手順
  アカウントの作成
  Dockerコンテナの監視
 Datadogでのコンテナ監視手順
第8章 クラウドでのDocker運用
8-1 クラウド環境でのDockerサポート
 Dockerをとりまくクラウド環境
  Amazon Web Service
  Microsoft Azure
  Google Cloud Platform
  IBM SoftLayer
  Joyent Public Cloud
 Amazon Web ServicesのDockerサポート
  Amazon EC2を使う
  Amazon ECSを使う
  Elastic Beanstalkを使う
8-2 Amazon EC2 Container ServiceでのDocker実行環境構築
 Amazon EC2 Container Service
  Amazon ECSの主な特徴
  AWS用語
 Amazon ECSでのDocker実行環境構築/運用
  タスク定義
  サービス定義
  クラスタ設定
note
クラウドサービスのオートスケール機能
シェルの種類
Linuxカーネルの正体「vmlinuz」の名前の由来
システム運用設計の難しさ
コンテナの統一仕様を進める「Open Container Project」
Dockerイメージの改ざん防止機能
NATとNAPTの違い
Dockerのオープンソース開発
Mac OSへのDockerのインストール
イメージのなりすましや改ざんを防ぐには
プロンプト
Linuxコマンドは覚えないとダメ?
ウェルノウンポートについて
export/importとsave/loadの違い
中間イメージの再利用
Docker Hubはどんどん肥大化しない?
イメージのレイヤーの制限
コンテナ実行時にコマンド引数を任意に指定したいときは
ONBUILD命令を使ったチーム開発の進め方
ビルドに不必要なファイルの除外
Dockerfileの格納場所
時刻合わせのプロトコルNTPとは
GitとGitHub
ディザスタリカバリシステム
Amazon Web Services
Dockerを開発環境で利用する
コンテナで永続データを扱うときの注意点
ドメインネームについて
docker-compose.ymlをGUIで作成できるWebサイト
Linuxのシグナル
FigとDocker Compose
Raspberry Piで動かすDocker
冗長化構成の種類
Docker Swarmのホスト決定方式
Dockerの運用ツールあれこれ
運用監視ツールのグラフ表示機能
コンテナ構成図を表示できる「Weave Scope」

【書評】AngularJS アプリケーションプログラミング

今回もWINGSプロジェクト様( @yyamada )の書籍レビュアーに応募させていただき書評を書かせていただくことになりました。
WINGSプロジェクトの皆様、著者の山田様ありがとうございます。
今回は表題にもある以下の書籍を献本していただきましたので、こちらのレビューをさせていただきます。

AngularJS アプリケーションプログラミング

AngularJS アプリケーションプログラミング

私のAngularJSの理解度ですが、元々実務でのフロントエンドでの開発経験は乏しく、当初は個人的にドットインストールやAPIレファレンスを参考に最初は勉強していた程度になっています。
AngularJS入門 (全12回) - プログラミングならドットインストール
AngularJS入門 | AngularJS 1.2 日本語リファレンス | js STUDIO

上記で簡単に勉強した後に、実際にRailsと連携しようとして以下の記事を参考にして画面開発に取り組んではいました。
ただ、AngularJSがよくわかっていないこともあり、実際に開発を進めていくと実現したいことができなかったり、JavaScriptの理解度も低いことも関係してうまくデバッグできなかったりしてそのまま挫折してしまっていました。ruby-rails.hatenadiary.com

また、書籍を読んで1から勉強し直そうと思い、以下の書籍を手にしたのですが、実現したい機能を実装するにはどうすれば良いかどこを読めばいいかわからずという状況でした。

AngularJSリファレンス

AngularJSリファレンス

リファレンスということもあり詳細に記載はしてある部分はすごく良かったのですが、導入の1冊目としては私にとっては厳しかったです。
ただ、2章のビルドインディレクティブまでしか読んでないからそう感じたかもあるかもしません。。


今回の書籍レビューア応募により、本格的にまた勉強し始めるきっかけを作ることが出来ました。
ありがとうございます。

ここから書籍レビューに入らせていただきます。
目次を読み、最初の導入まで読み切った時点の感想としては、導入の1冊目として最適だということです。
今回も図をふんだんに使用してくれているおかげで理解の助けにもつながっています。
個人的にはまず全体感をつかむ意味で、第2章のAngularJSの基本の章はとても勉強になりました。
第3章 ディレクティブ~ 第6章 スコープオブジェクトに関しては、実現したい機能を実装するにはという観点で読むと、内容が頭にすっと入ってきやすかったです。
また、特筆する点としては、テストについても内容に含まれていることです。
UnitTestレベルはもちろんのこと、モックを使ったテスト、E2Eテストまで記載されているのを見て、感動しました!
対象プロダクトの性質にもよりますが、E2Eテストまでしっかり作ることにより、保守・運用の負担が減ると思うのですが、その環境を作ったりテスト記載するのも大変なので、AngularJSの書籍の中でもこのようにしっかり書いてくれていたりすると助かります。
また、関連するライブラリの話でも、YoemanやBower、Gruntについて記載されていたのも、初学者にとても参考になると思いました。
私自身は1-2度使ったことありますが、Webの記事の方法をならって実施しただけなので、自分の理解の浅さを感じました。

AngularJSを始めの1冊としては、強くオススメできる1冊となっているので、ぜひ皆さんも購入して活用してみてください。


以上、レビューとさせていただきます。
最後に恒例ですが、目次も紹介させていただきます。
以下のページから引用させていただきました。
http://www.wings.msn.to/index.php/-/A-03/978-4-7741-7568-3/


第1章 イントロダクション
1.1 JavaScript の歴史
  1.1.1 不遇の時代を経てきた JavaScript
  1.1.2 復権のきっかけは Ajax、そして HTML5 の時代へ
  1.1.3 JavaScript ライブラリから JavaScript フレームワーク
1.2 フレームワークとは?
  1.2.1 フレームワークの本質
  1.2.2 フレームワーク導入の利点
1.3 JavaScript で利用可能なフレームワーク
第2章 AngularJS の基本
2.1 AngularJS を利用するための準備
  2.1.1 AngularJS アプリの実行
  2.1.2 補足:オフライン環境で AngularJS を動作する
2.2 コントローラー/サービスの基本
  2.2.1 コントローラー/ビューの連携
  2.2.2 コントローラー/ビューの連携 - オブジェクト配列
  2.2.3 サービスへの分離
2.3 AngularJS を理解する 3 つのしくみ
  2.3.1 モジュール
  2.3.2 DI コンテナー
  2.3.3 双方向データバインディング
第3章 ディレクティブ
3.1 ディレクティブの基本
  3.1.1 ディレクティブの記法
3.2 バインド関連のディレクティブ
  3.2.1 バインド式を属性値として指定する - ng-bind
  3.2.2 Angular 式による画面のチラツキを防ぐ - ng-cloak
  3.2.3 データバインドを無効化する - ng-non-bindable
  3.2.4 HTML 文字列をバインドする - ng-bind-html
  3.2.5 テンプレートをビューにバインドする - ng-bind-template
  3.2.6 数値によってバインドする文字列を変化させる - ng-plurlize
  3.3 外部リソース関連のディレクティブ
  3.3.1 アンカータグを動的に生成する - ng-href
  3.3.2 画像を動的に生成する - ng-src/ng-srcset
  3.3.3 補足:iframe/object などで別ドメインのリソースを取得する  
  3.3.4 別ファイルのテンプレートを取得する - ng-include
  3.3.5 インクルードするテンプレートを先読みする - script
3.4 イベント関連のディレクティブ
  3.4.1 イベント関連の主なディレクティブ
  3.4.2 イベント情報を取得する - $event
3.5 制御関連のディレクティブ
  3.5.1 要素にスタイルプロパティを付与する - ng-style
  3.5.2 要素にスタイルクラスを付与する - ng-class
  3.5.3 式の真偽によって表示/非表示を切り替える(1) - ng-if
  3.5.4 式の真偽によって表示/非表示を切り替える(2) - ng-show/ng-hide
  3.5.5 式の真偽に応じて詳細の表示/非表示を切り替える - ng-open
  3.5.6 式の値によって表示を切り替える - ng-switch
  3.5.7 配列/オブジェクトをループ処理する - ng-repeat
  3.5.8 偶数/奇数行に対してだけスタイルを適用する - ng-class-even/ng-class-odd
  3.5.9 モデルの初期値を設定する - ng-init
3.6 フォーム関連のディレクティブ
  3.6.1 入力ボックスで利用できる属性 - input/textarea 要素
  3.6.2 フォーム要素の値が変更された時の処理を定義する - ng-change
  3.6.3 ラジオボタンを設置する - input(radio)
  3.6.4 チェックボックスを設置する - input(checkbox)
  3.6.5 チェックボックスのオンオフを切り替える - ng-checked
  3.6.6 選択ボックスを設置する - select(ng-options)
  3.6.7 テキストボックスの内容を区切り文字で分割する - ng-list
  3.6.8 フォーム要素を読み取り専用/利用不可にする - ng-disabled/ng-readonly
  3.6.9 フォームの状態を検知する
3.7 その他のディレクティブ
  3.7.1 メッセージの表示/非表示を条件に応じて切り替える - ng-messages
  3.7.2 モデルの更新方法を設定する - ng-model-options
  3.7.3 Content Security Policy を利用する - ng-csp
  3.7.4 要素の表示/非表示時にアニメーションを適用する - ngAnimate
第4章 フィルター
4.1 フィルターの基本
  4.1.1 テンプレートからのフィルター利用
  4.1.2 JavaScript からのフィルター利用
4.2 文字列関連のフィルター
  4.2.1 文字列を大文字⇔小文字に変換する - lowercase/uppercase
  4.2.2 オブジェクトを JSON 形式に変換する - json
  4.2.3 URL/メールアドレスをリンクに整形する - linky フィルター
4.3 配列関連のフィルター
  4.3.1 配列をソートする - orderBy
  4.3.2 例:ソート可能なテーブルを作成する
  4.3.3 配列の件数を制限する - limitTo
  4.3.4 配列を特定の条件で絞り込む - filter
4.4 数値/日付関連のフィルター
  4.4.1 数値を桁区切り文字で整形して出力する - number
  4.4.2 数値を通貨形式に整形する - currency
  4.4.3 日付を整形する - date
第5章 サービス
5.1 サービスの基本
5.2 非同期通信の実行 - $http サービス
  5.2.1 $http サービスの基本
  5.2.2 HTTP POST による非同期通信
  5.2.3 JSON 形式の Web API にアクセスする
  5.2.4 非同期通信時のデフォルト値を設定する
5.3 HTTP 経由での CRUD 処理 - $resource サービス
  5.3.1 サーバーサイドの準備
  5.3.2 クライアントサイドの実装
  5.3.3 resource オブジェクトの生成
  5.3.4 アクションの実行
5.4 ルーティング - $routeProvider プロバイダー
  5.4.1 ルーティングの基本
  5.4.2 $routeProvider.when メソッドのパラメーター
  5.4.3 例:決められたルールで別のルートにリダイレクトする
  5.4.4 例:コントローラーの処理前に任意の処理を挿入する
5.5 標準オブジェクトのラッパー
  5.5.1 指定された時間単位に処理を実行する - $interval サービス
  5.5.2 指定時間の経過によって処理を実行する - $timeout サービス
  5.5.3 ページのアドレス情報を取得/設定する - $location サービス
5.6 Promise による非同期処理 - $q サービス
  5.6.1 Promise の基本
  5.6.2 非同期処理の連結
  5.6.3 例:現在地から日の入り時刻を求める
  5.6.4 複数の非同期処理を監視する
5.7 その他のサービス
  5.7.1 クッキーを登録/削除する - $cookies/$cookiesProvider
  5.7.2 開発者ツールにログを出力する - $log/$logProvider
  5.7.3 アプリ共通の例外処理を定義する - $exceptionHandler
  5.7.4 非 AngularJS アプリで AngularJS のサービスを利用する - $injector
  5.7.5 モバイルデバイスへの対応 - $swipe(ngTouch)
5.8 グローバル API
  5.8.1 AngularJS の現在のバージョン情報を取得する - version プロパティ
  5.8.2 オブジェクトが等しいかどうかを判定する - equals メソッド
  5.8.3 変数の型を判定する - isXxxxx メソッド
  5.8.4 文字列を大文字⇔小文字に変換する - lowercase/uppercase メソッド
  5.8.5 JSON 文字列⇔ JavaScript オブジェクトを変換する
  5.8.6 配列/オブジェクトの要素を順番に処理する - forEach メソッド
  5.8.7 オブジェクト/配列をコピーする - copy メソッド
  5.8.8 オブジェクト同士をマージする - extend/merge メソッド
  5.8.9 jQuery 互換オブジェクトを取得する - element メソッド
  5.8.10 AngularJS アプリを手動で起動する - bootstrap メソッド
  5.8.11 this キーワードのコンテキストを強制的に変更する - bind メソッド
  5.8.12 空の関数を取得する - noop メソッド
  5.8.13 デフォルトの関数を準備する - identity メソッド
第6章 スコープオブジェクト
6.1 スコープの有効範囲
  6.1.1 有効範囲の基本
  6.1.2 複数のコントローラーを配置した場合
  6.1.3 コントローラーを入れ子に配置した場合
  6.1.4 入れ子となったコントローラーでの注意点
6.2 コントローラー間の情報共有
  6.2.1 親コントローラーのスコープを取得する - $parent
  6.2.2 アプリ唯一のスコープを取得する - $rootScope
  6.2.3 イベントによるスコープ間のデータ交換
  6.2.4 並列関係にあるスコープでイベントを通知する
  6.2.5 補足:標準サービス/ディレクティブでの $broadcast/$emit イベント
6.3 スコープの監視
  6.3.1 スコープの変更をビューに反映する - $apply メソッド
  6.3.2 アプリ内データの更新を監視する - $watch メソッド
  6.3.3 スコープの監視を中止する
  6.3.4 複数の値セットを監視する - $watchGroup メソッド
  6.3.5 配列の追加/削除/変更を監視する - $watchCollection メソッド
  6.3.6 補足:$digest ループ
第7章 ディレクティブ/フィルター/サービスの自作
7.1 フィルターの自作
  7.1.1 フィルターの基本
  7.1.2 パラメーター付きのフィルターを定義する
  7.1.3 例:配列の内容を任意の条件でフィルターする
  7.1.4 既存のフィルターを利用する - $filter
7.2 サービスの自作
  7.2.1 シンプルな値を共有する(1) - value メソッド
  7.2.2 シンプルな値を共有する(2) - constant メソッド
  7.2.3 ビジネスロジックを定義する(1) - service メソッド
  7.2.4 ビジネスロジックを定義する(2) - factory メソッド
  7.2.5 パラメーター情報を伴うサービスを定義する - provider メソッド
  7.2.6 より本格的な自作のための補足
7.3 ディレクティブの自作
  7.3.1 ディレクティブ定義の基本
  7.3.2 利用するテンプレートを指定する - template/templateUrl プロパティ
  7.3.3 現在の要素をテンプレートで置き換える - replace プロパティ
  7.3.4 ディレクティブの適用箇所を宣言する - restrict プロパティ
  7.3.5 子要素のコンテンツをテンプレートに反映させる - transclude プロパティ
  7.3.6 ディレクティブに適用すべきスコープを設定する - scope プロパティ
  7.3.7 ディレクティブの挙動を定義する - link プロパティ
  7.3.8 コンパイル時の挙動を定義する - compile プロパティ
  7.3.9 ディレクティブの優先順位と処理方法を決める - priority/terminal プロパティ
  7.3.10 ディレクティブ同士で情報を交換する - controller/require プロパティ
  7.3.11 コントローラーに別名を付ける - controllerAs パラメーター
  7.3.12 複数の要素にまたがってディレクティブを適用する - multi Element パラメーター
7.4 自作ディレクティブの具体例
  7.4.1 タブパネルを実装する
  7.4.2 ng-required 属性の実装を読み解く
  7.4.3 $asyncValidators プロパティによる非同期検証の実装
  7.4.4 例:jQuery UI のウィジェットをディレクティブ化する
第8章 テスト
8.1 テストの基本
8.2 ユニットテスト(基本)
  8.2.1 ユニットテストのためのツール
  8.2.2 ユニットテストの準備
  8.2.3 テストの基本
8.3 ユニットテスト(AngularJS アプリ)
  8.3.1 フィルターのテスト
  8.3.2 サービスのテスト
  8.3.3 コントローラーのテスト
  8.3.4 ディレクティブのテスト
8.4 モック
  8.4.1 タイムアウト/インターバル時間を経過させる - $timeout/$interval モック
  8.4.2 ログの内容を配列に蓄積する - $log モック
  8.4.3 HTTP 通信を擬似的に実行する - $httpBackend モック
  8.4.4 非同期処理における例外の有無をチェックする - $exceptionHandler モック
  8.4.5 タイムゾーン固定の日付オブジェクトを生成する - angular.mock.TzDate オブジェクト
8.5 E2E(End to End)テスト
  8.5.1 E2E テストの準備
  8.5.2 E2E テストの基本
  8.5.3 E2E テストで HTTP 通信を擬似的に実行する - $httpBackend モック
第9章 関連ライブラリ/ツール
9.1 AngularJS アプリで利用できる関連ライブラリ
  9.1.1 Bootstrap を AngularJS アプリで活用する - UI Bootstrap
  9.1.2 標準以外のイベントを処理する - UI Event
  9.1.3 自作の検証機能を実装する - UI Validate
  9.1.4 より高度なルーティングを実装する - UI Router
  9.1.5 ソート/フィルター/ページング機能を備えたグリッド表を生成する - UI Grid
  9.1.6 国際化対応ページを実装する - angular-translate
  9.1.7 AngularJS アプリに Google Maps を導入する - Angular Google Maps
  9.1.8 定型的なチャートを生成する - angular-google-chart
9.2 開発に役立つソフトウェア/ツール
  9.2.1 アプリのひな形を自動生成するツール Yeoman
  9.2.2 定型作業を自動化するビルドツール Grunt
  9.2.3 クライアントサイド JavaScript のパッケージ管理ツール Bower
Column
  アプリ開発に役立つ支援ツール(1) - AngularJS Sublime Text Package
  コントローラーのプロパティにアクセスする - controller as 構文
  アプリ開発に役立つ支援ツール(2) - WebStorm
  AngularJS/JavaScript のコーディング規約
  アプリ開発に役立つ支援ツール(3) - AngularJS Batarang
  Chrome デベロッパツールの便利な機能(1) - Pretty Print
  Chrome デベロッパツールの便利な機能(2) - DOM Breakpoints
  関連書籍「AngularJSライブラリ 厳選108」
  Chrome デベロッパツールの便利な機能(3) - Audits
  JavaScript の代替言語 altJS

TECH::CAMP(Webアプリケーションコース) 体験記ブログ

表題の通り、以下のURLのTECH::CAMP(Webアプリケーションコース) に参加しましたので、体験記として残したいと思います。tech-camp.in

コースの概要としては、WebアプリケーションコースとiPhoneアプリコースに分かれています。
https://tech-camp.in/course

今回の体験記はWebアプリケーションコースです。

私の経歴を簡単に紹介させていただくと、社会人4年目のエンジニアです。
主に開発を行う会社に所属しており、広告配信(DSP/RTB)のシステムの開発チームに参加させて頂いており、過去は金融系のシステムや仮想ルーターの監視のシステムなどの開発/保守に携わっていました。
ただ、業務ではクラサバシステム(クライアントサーバシステム)ばかりで、Webアプリケーションに関しては新人研修時代以来、本格的に携わってこなかったので、TECH::CAMPでの体験はとても新鮮でした。


Webアプリケーションコースで学ぶ内容は大きく3つあり、HTML/CSSRubyRuby on Railsの3つとなります。
Rubyの文法は復習程度の位置づけだったのですが、HTML/CSSは今まであまり書いてこなかったので、このタイミングで改めて勉強できて良かったです。
Ruby on Rails自体は書籍の書評や資料を参考にアプリを作ったりはしていましたが、時間を作って本格的に取りかかったのは初めてでした。
※ちなみに書評の記事はこちらになります。dke-msy-node.hatenablog.com
カリキュラムではRuby on Rails自体の使い方を学べたのはもちろん、クローラーを用いてWeb上からデータを引っ張ってくるなど今までにやったことなかったことを経験できてとても楽しかったです。

基本は土日合わせて16時間くらいしか学習時間を確保できなかったため、オリジナルアプリケーション作成の途中までしか取りかかれなかったのが唯一の心残りです。
これから受講される方には、1ヶ月でがっつり時間を確保するか、2ヶ月コースにすることをオススメ致します。

TECH::CAMPを受講して思った感想としては、学生時代で受講することができていれば、まとまった時間を使って自分の使いたいWebサービス等を短期間で作れていただろうなということでした。
学生時代にはトライしては挫折の繰り返しで、独学では限界があると感じていて、プログラミングに関して本格的に学んだのは会社の新人研修だったので、このような機会に恵まれている今の学生さん達はうらやましいです。

TECH::CAMPで活かした知識を活かし、自分の使いたいアプリを作成中です。
どうしてもiPhoneアプリでリリースしたいため、本日からTECH::CAMP(iPhoneアプリ)受講はじめました。

もし、受講で悩んだりしている方などいらっしゃいましたら、まずは事務局でお話を聞いてみることなどをオススメ致します。

以上、TECH::CAMP(Webアプリケーションコース) 体験記でした。