無限大な夢のあと

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

「プログラマ脳を鍛える数学パズル」で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アプリケーションコース) 体験記でした。

【書評】10日でおぼえるJSP&サーブレット入門教室 第4版 -WINGSプロジェクト( @yyamada ) 

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

10日でおぼえるJSP&サーブレット入門教室 第4版

10日でおぼえるJSP&サーブレット入門教室 第4版

まず、書籍を読む前の前提知識に関しては、以下のレビューをご参照してください。
【書評】サーブレット&JSPポケットリファレンス -WINGSプロジェクト( @yyamada ) - スーツとギークのはざまで

それでは、書籍についてのレビューをさせていただきます。
まず、本書の特徴としては、プログラム初心者およびJava初心者であってもJSP/サーブレットを使って、Webアプリケーションを作れる点にあります。
ターゲットとしては、以下の3つがあげられると思います。
・プログラム初心者の方
サーブレット/JSPを使用したことがないJavaを少し書ける方
・新人研修でJavaのWebフレームワークを覚えたけれど、内部がどんな仕組みで動いているかわからない方

私が本書を読んでみた感想として、新人研修時代にJSP/サーブレットの部分に関して学んだこと+αを学べる内容であり、良い復習になりました。
上記であげたターゲットの方に取っては、中身のあるかなり勉強になる内容であることは間違いないです。

以下の書籍と同様に図が豊富に使用されていることもあり、とてもおすすめです。

サーブレット&JSP ポケットリファレンス

サーブレット&JSP ポケットリファレンス

図のサンプルをいくつか転載します。

JDBCの仕組み
f:id:noimpslmtbrk:20150502171635j:plain

・コネクションプーリングの説明
f:id:noimpslmtbrk:20150502171709j:plain

JDBCドライバーとデータベース接続
f:id:noimpslmtbrk:20150502173501j:plain

JDBCドライバーの種類
f:id:noimpslmtbrk:20150502173449j:plain

最後に、WINGSプロジェクト様のページからの転載になりますが、
目次についても記載させていただきます。
もし、本レビューで書籍について興味をお持ちの方は、まずは書店にて中身を読んでみることをおすすめ致します。
また、JSP/サーブレットを学ぶにあたって、Webの基礎知識を押さえたいという方は以下の書籍も併せて読んでみることをおすすめ致します。

「プロになるためのWeb技術入門」 ――なぜ、あなたはWebシステムを開発できないのか

「プロになるためのWeb技術入門」 ――なぜ、あなたはWebシステムを開発できないのか

目次参考URL
10日でおぼえるJSP&サーブレット入門教室 第4版 - WINGS

CHAPTER 01 JSPの基本
LESSON 01 JSPサーブレットの環境を準備しよう
LESSON 02 おぼえようJSPの基本
LESSON 03 繰り返し処理を実行しよう(1)
LESSON 04 フォームからの入力を受け取ろう
LESSON 05 繰り返し処理を実行しよう(2)
CHAPTER 02 ブラウザーからの入力を処理しよう
LESSON 06 クエリ情報を活用しよう
LESSON 07 ヘッダー情報を取得しよう
LESSON 08 クッキー情報を活用しよう
LESSON 09 セッション機能を活用しよう
CHAPTER 03 クラスで拡がるJSPの世界
LESSON 10 HTMLの予約文字をエンコードしよう
LESSON 11 日付の計算をしよう
LESSON 12 連想配列を活用しよう
LESSON 13 テキストファイルを読み取ろう
LESSON 14 カスタムログを記録しよう
LESSON 15 正規表現検索に挑戦しよう
SUPPLEMENTARY LESSON Commons Emailでメールを送信しよう
CHAPTER 04 JDBCでカンタン データベース連携
LESSON 16 MySQLをインストールしよう
LESSON 17 MySQLの基本的な操作を理解しよう
LESSON 18 アプリケーションからデータベースに接続しよう
LESSON 19 データベースに新規データを登録しよう
LESSON 20 データベースを検索しよう
LESSON 21 データベースのデータを更新/削除しよう
LESSON 22 データベースからデータをダウンロードしよう
CHAPTER 05 サーブレットの基本的な構造を学ぼう
LESSON 23 おぼえよう! サーブレットの基本
LESSON 24 JSPからサーブレットを呼び出そう
LESSON 25 サーブレットから初期化パラメーターを引用しよう
CHAPTER 06 JavaBeans導入でWeb開発の効率化
LESSON 26 サーブレットからJavaBeansを呼び出そう
LESSON 27 JavaBeansからサーブレットにデータを渡そう
LESSON 28 JSPサーブレット/JavaBeansの連携を学ぼう
CHAPTER 07 JSTL+式言語でスクリプトレスJSPページに挑戦
LESSON 29 JSTL+式言語の基本を学ぼう
LESSON 30 JSTL活用でデータベース連携
LESSON 31 JSPページからスクリプティング要素を取り除こう
CHAPTER 08 カスタムタグ、フィルタによる開発/運用の効率化
LESSON 32 オリジナルのタグを作成しよう
LESSON 33 タグファイル活用でカスタムタグ作成を効率化
LESSON 34 フィルターでログ収集をしよう
LESSON 35 デプロイメントディスクリプターでアプリケーション管理を学ぼう

スッキリわかるサーブレット&JSP入門

スッキリわかるサーブレット&JSP入門

独習Javaサーバサイド編 第2版

独習Javaサーバサイド編 第2版

スッキリわかるJava入門 第2版

スッキリわかるJava入門 第2版

【書評】サーブレット&JSPポケットリファレンス  -WINGSプロジェクト( @yyamada ) 

今回もWINGSプロジェクト様( @yyamada )で書籍レビュアーに応募させていただき書評を書かせていただくことになりました。
まずは、前回、前々回に引き続き応募を受けて下さったWINGSプロジェクトの皆様、著者の山田様ありがとうございます。
今後もどうぞよろしくお願い致します。

今回は表題にある以下の書籍を献本していただきましたので、こちらのレビューをさせていただきます。

サーブレット&JSP ポケットリファレンス

サーブレット&JSP ポケットリファレンス

まず、レビューの前に、前提として、私のサーブレットあるいはJSPを用いたWebシステム開発経験についてお話させてください。
経験としては約2年前の新人研修の課題作成時(サーブレット/JSP)、2014年12月から始まった現在のプロジェクト(サーブレット)のみで、とても短い期間となります。
それまでの間は、Webシステムではなく、画面がないIFシステムやSwingで画面を作っているようなプロジェクトばかり経験してきました。

よって、経験はかなり少ない中でのレビューとなりますので、内容についてはご容赦ください。

それでは、書籍についてのレビューをさせていただきます。
まず、リファレンスとしてやりたいことがすぐ見つかるという点では、現在行っている業務の中で使う分にはとても活用できています。
ターゲットとしては、以下の3つがあげられると思います。
サーブレット/JSPを使用しているプロジェクトで仕事をされている方
サーブレット/JSPを使用しているSpringFW当を使用しているプロジェクトで仕事をされている方
JavaでWeb開発の経験が少ない方

経験が長い方でも、リファレンスという点でかゆいところに手が届く内容なので手元においておくと便利だと思います。

個人的に使用していてうれしい点として、あまりWeb開発をしてこなかった身としては、イントロダクションという章を設けてあり基礎知識の確認ができたり、以下のコラムの内容などをはじめ、周辺技術についての補足がある点です。

コラムの目次
  Tomcat Web Application Manager
  Jasper JSP Engineの設定方法
  デフォルトサーブレットの設定
  JSPファイルの初回起動を高速化したい
  クラスローダーの仕組み
  サーブレットJSPをより深く学ぶための参考書籍

また、リファレンスではありますが、図がふんだんに使用されており、リファレンス以外の用途でも理解の再確認という用途でも使える内容となっています。
特に私は新人研修以来、Webシステム開発に携わっていなかったため、内容的に忘れている部分も多くとても助かりました。

以下、例として1つリファレンス本書にある画像を転載させていただきます。
※転載に問題がございましたら、ご指摘お願い致します!

コンパイルが必要なサーブレットコンパイル不要のJSP
f:id:noimpslmtbrk:20150207210607j:plain


最後に、WINGSプロジェクト様のページからの転載になりますが、
目次についても記載させていただきます。
もし、本レビューで書籍について興味をお持ちの方は、まずは書店にて中身を読んでみることをおすすめ致します。
また、JSP/サーブレットを学ぶにあたって、Webの基礎知識を押さえたいという方は以下の書籍も併せて読んでみることをおすすめ致します。

「プロになるためのWeb技術入門」 ――なぜ、あなたはWebシステムを開発できないのか

「プロになるためのWeb技術入門」 ――なぜ、あなたはWebシステムを開発できないのか



目次参考URL
サーブレット&JSPポケットリファレンス - WINGS

CHAPTER 1 イントロダクション
概要
  サーブレットJSPとは何か
  サーブレットJSPとを使い分ける意味
  Java技術の構成
環境の準備
  JSPサーブレット利用に必要な環境
  開発/実行環境のインストール
プログラミングの基本
  サーブレットJSP活用のための基礎知識
CHAPTER 2 サーブレット API
概要
  サーブレット APIとは
基本
  サーブレットクラスを定義する
  サーブレットクラスの初期化/終了処理を定義する
  サーブレットクラスの情報を取得する
  コンテナーにログ情報を記録する
  サーブレット固有の初期化パラメーターを取得する
  サーブレット名を取得する
リクエスト情報
  リクエストデータの文字エンコーディングを設定する
  リクエストパラメーターを取得する
  複数値のリクエストパラメーターを取得する
  すべてのリクエストパラメーター名を取得する
  すべてのリクエストパラメーターを名前/値のマップとして取得する
  リクエストヘッダー情報を取得する
  リクエストヘッダー情報を取得する(専用メソッド
  複数のヘッダー値を取得する
  すべてのヘッダー名を取得する
  クッキー情報を取得する
  リクエストデータをバイナリデータとして取得する
  ファイルをアップロードする
  リクエスト属性を取得/設定/削除する
  認証情報を取得する
  セッションに関わる諸情報を取得する
  現在のセッションIDを変更する
  リクエストされたパスの情報を取得する
  リクエスト本体をReaderオブジェクトとして取得する
  独自の認証機能を実装する1
  ログアウト機能を実装する
  独自の認証機能を実装する2
  リクエスト情報を転送する
  外部ファイルをインクルードする
  サーブレットを非同期に実行する
レスポンス
  出力のためのPrintWriterオブジェクトを生成する
  HTTPヘッダーが出力済みかを判定する
  コンテンツタイプ/文字コードロケール情報を取得する
  コンテンツタイプ/コンテンツサイズ/文字コードロケール情報を設定する
  クッキーをクライアントに送信する
  応答ヘッダーを発行する
  HTTPステータスコードを発行する
  HTTPステータス/レスポンスヘッダーを取得する
  ページをリダイレクトする
  バッファーの内容を参照/制御する
  クッキーが使えないブラウザーにセッションIDを渡す
  バイナリデータを出力する
  HTTPリクエスト/レスポンスの処理をカスタマイズする
セッション情報
  セッション属性を取得/設定/削除する
  セッションを破棄する
  セッションに関わる諸情報を取得する
  セッションのタイムアウト時間を設定する
コンテキスト情報
  複数ユーザー間でコンテキスト情報を共有する
  ほかのアプリケーションコンテキストを取得する
  アプリケーション共通の初期化パラメーターを取得する
  アプリケーション共通の初期化パラメーターを設定する
  コンテナー/アプリケーションの情報を取得する
  ファイルのMIMEタイプを取得する
  指定されたフォルダー配下のすべてのファイルを取得する
  仮想パスを絶対パスに変換する
  外部リソースを取得する
  別のサーブレットJSPに処理を転送する
  JSPページの構成情報を取得する
  セッションクッキーの設定情報を取得/設定する
  サーブレットの登録情報を取得する
  フィルターの登録情報を取得する
  サーブレット/フィルター/リスナーをインスタンス化する
  サーブレットをアプリケーションに登録する
  フィルターをアプリケーションに登録する
  リスナーをアプリケーションに登録する
  Jarファイルのサーブレット/フィルター/リスナーをアプリケーションに登録する
フィルター
  フィルタークラスを定義する
  フィルターチェーン上の次のフィルターを起動する
  フィルター名/初期化パラメーターを取得する
リスナー
  アプリケーション開始/終了時の挙動を定義する
  コンテキスト属性の追加/削除/更新時の処理を定義する
  セッション生成/破棄時の処理を定義する
  セッション属性の追加/削除/更新時の処理を定義する
  セッションIDが変更されたときの挙動を定義する
  オブジェクトがセッションにバインド/アンバインドされたときの処理を定義する
  リクエスト処理開始/終了時の処理を定義する
  リクエスト属性の追加/削除/更新時の処理を定義する
アノテーション
  サーブレットの基本情報を宣言する
  フィルターの基本情報を定義する
  サーブレット/フィルターの初期化パラメーターを定義する
  リスナークラスを定義する
  アップロードファイルの上限/一時保存先を設定する
  アクセス規則を定義する
CHAPTER 3 JSP基本構文
概要
  JSPの基本
ディレクティブ
  ディレクティブとは
  ページ出力時のバッファー処理を有効にする
  ページのコンテンツタイプ/出力文字コードを宣言する
  .jspファイルの文字コードを宣言する
  エラーページを設定する
  パッケージをインポートする
  式言語を利用するかどうかを指定する
  セッション機能を利用するかどうかを指定する
  ディレクティブ宣言による空行の出力を抑制する
  ページに関する説明を記述する
  外部ファイルをインクルードする
  タグライブラリをページに登録する
  タグファイルをページに登録する
  タグファイルの基本情報を定義する
  タグファイルで利用可能な属性を宣言する
  タグファイルで動的属性を利用する
  タグファイル内で利用可能な変数を宣言する
  スクリプティング変数の名前を.jspファイルで設定する
スクリプティング要素
  変数/定数/ユーザー定義メソッドを宣言する
  JSPページの初期化/終了処理を定義する
  JSPページ内にコードを埋め込む
  コメントを定義する
式言語
  式言語とは
  Expression Languageで式を出力する
  式言語からJavaクラスの静的メソッドを呼び出す
アクションタグ
  アクションタグとは
  ページの処理を転送する
  外部ファイルをインクルードする
  JSPページでJavaBeansをインスタンス化する
  JavaBeansのプロパティを設定する
  属性値をタグ本体に記述する
  タグファイルからフラグメントを実行する
  タグ本体を定義する
  タグファイルからタグ本体を実行する
CHAPTER 4 JSP API
概要
  JSP(JavaServer Pages) APIとは
出力
  クライアントに文字列を出力する
  改行文字を出力する
  出力バッファーを制御する
コンテキスト情報
  タグハンドラークラスで暗黙オブジェクトを利用する
  エラー情報を取得する
  スコープ属性を取得/設定する
カスタムタグ
  処理すべき本体を持たないカスタムタグを定義する
  本体付きのカスタムタグを処理する
  シンプルなカスタムタグを定義する
  上位タグへの参照を取得する
  タグ本体をフラグメントとして取得する
  フラグメントを実行する
  動的属性の値を処理する
  タグハンドラークラスで利用する値を取得/設定/削除する
  タグ配下のテキストを操作する
  カスタムタグの妥当性を検証する
  タグライブラリの妥当性を検証する
CHAPTER 5 デプロイメントディスクリプタ
概要
  デプロイメントディスクリプターとは
アプリケーション
  アプリケーションの基本情報を定義する
  初期化パラメーターを設定する
  ウェルカムページを指定する
  エラーページを設定する
  特定のフォルダーに対して認証を設定する
  特定のHTTPメソッド以外のアクセスを禁止する
  認証方法を定義する
  セッションに関する挙動を設定する
  MIMEタイプを設定する
  アプリケーションの構成情報を.jarファイルに分離する
サーブレットJSP
  サーブレットクラスの設定を定義する
  JSPページの基本設定を宣言する
  JSPページで利用するタグライブラリを登録する
フィルター/リスナー
  フィルターを有効化する
  アプリケーションイベントのリスナーを登録する
CHAPTER 6 タグライブラリディスクリプタ
概要
  タグライブラリディスクリプターとは
タグライブラリ
  タグライブラリの基本情報を定義する
  タグライブラリを含んだJSPページの妥当性を検証する
タグ/関数
  カスタムタグの情報を定義する
  遅延評価の式言語を利用する
  遅延評価式でメソッドを受け渡す
  タグファイルの情報を定義する
  Function(関数)の情報を定義する
CHAPTER 7 JSTLJSP Standard Tag Library)
概要
  JSTLとは
基本機能
  変数を出力する
  変数を設定する
  変数を破棄する
  処理を分岐する
  複数の条件で処理を分岐する
  指定回数だけ処理を繰り返す
  配列/コレクションを順番に処理する
  文字列を指定された区切り文字で分割する
  外部ファイルをインポートする
  ページをリダイレクトする
  URL文字列をエンコードする
  例外を処理する
データベース
  データベースへの接続を確立する
  データベースから結果セットを取得する
  データベースの内容を登録/更新/削除する
  トランザクションを定義する
  JSTLで利用するデフォルトの接続を定義する
  データベースから取得する最大レコード数を設定する
国際化
  リクエスト情報の文字コードを設定する
  ロケールを設定する
  デフォルトのロケールを宣言する
  タイムゾーンを設定する
  配下で有効なタイムゾーンを設定する
  デフォルトのタイムゾーンを宣言する
  数値データを決められたパターンで整形する
  数値データをユーザー定義の書式で整形する
  文字列を数値に変換する
  日付データを決められたパターンで整形する
  日付時刻値をユーザー定義の書式で整形する
  文字列を日付時刻値に変換する
  ロケール設定に応じてプロパティファイルを読み込む
  ロケール設定に応じてメッセージを切り替える
  リソースの共通の接頭辞を宣言する
  デフォルトのプロパティファイルを宣言する
  指定されたロケールが存在しない場合の代替ロケールを宣言する
XML
  XML文書を解析する
  XML文書からノード値を取得する
  取得したノード群を順番に処理する
  XPath式によって処理を分岐する
  XPath式によって処理を多岐分岐する
  XML文書をXSLTスタイルシートで整形する
文字列操作
  文字列を大文字⇔小文字に変換する
  文字列に含まれるXML予約文字でエスケープする
  文字列に部分文字列が含まれているかを確認する
  文字列の前後から空白を除去する
  文字列の登場位置を検索する
  文字列が指定された部分文字列で始まる/終わるかを判定する
  指定された文字列を置き換える
  文字列を指定された区切り文字で分割する
  文字列から部分文字列を取得する
  配列要素を指定された区切り文字で連結する
  コレクション/配列のサイズや文字列の長さを取得する
APPENDIX Server.xml
概要
  Server.xmlとは
構成要素
  サーバー/クライアント間の接続を管理する
  仮想ホストを定義する
  アプリケーションの構成情報を定義する
  データソースを定義する
  ユーザー/ロール情報の保存先を定義する
  リクエスト時に独自のフィルターを実行する

JavaScript逆引きレシピ jQuery対応 (PROGRAMMER’S RECiPE)

JavaScript逆引きレシピ jQuery対応 (PROGRAMMER’S RECiPE)

10日でおぼえるJSP&サーブレット入門教室 第4版

10日でおぼえるJSP&サーブレット入門教室 第4版

スッキリわかるサーブレット&JSP入門

スッキリわかるサーブレット&JSP入門

基礎からのサーブレット/JSP 第3版 (基礎からのシリーズ)

基礎からのサーブレット/JSP 第3版 (基礎からのシリーズ)

TypeScript+Underscore.jsで関数型プログラミング 第1回 ワードカウント問題

altJSであるTypeScriptと関数型でのプログラミングをサポートするUnderscore.jsを使い、関数型プログラミングについての理解を深めていくために、様々な問題を解いていく記事を定期的に記載していきたいと思います。

TypeScriptについて簡単に知りたい方はこちらを参照してください。
公式ページ
Welcome to TypeScript

参考になる記事
TypeScriptで学ぶJavaScript入門:第1回 TypeScriptの概要 (1/4) - @IT

Underscore.jsについて簡単に知りたい方はこちらを参照してください。
公式ページ
Underscore.js

参考になる記事
Underscore.jsの入り口:連載|gihyo.jp … 技術評論社


さて、第1回はワードカウント問題を解いていきたいと思います。
※ワードカウント問題などの例は下記のかとうじゅんいちさんの問題例から拝借させていただきました。
https://gist.github.com/j5ik2o/7210762

私は下記のように解いてみました。

ここからはコードの解説をしていきたいと思います。

  • 1行目

下記のコードでUnderscore.jsを読み込んでいます。

/// <reference path='typings/tsd.d.ts' />

TypeScriptでJavaScriptのライブラリを読み込む際にはHTMLでライブラリ自身を読み込む他に、別途方定義ファイルを読み込むことが必要となります。
型定義ファイルについて、詳しくはこちら。

TypeScriptの型定義ファイルを共有しよう! - Qiita
JavaScript - WebStorm で TypeScript を始めよう!《Advent Calendar 2014》 - Qiita
TypeScriptの型定義ファイル(d.ts)をTSDを用いて管理する。 | Developers.IO

  • 4行目

ここでは関数定義をしていますが、ここではTypeScriptのアロー関数式を使用しています。
ここのアロー関数式では{}を使わない記法を用いているため、関数定義ですがreturnを書く必要がありません。
値を返すことを前提としている関数型っぽい書き方を実現できるわけです。

var countFruitsFromLines = (list:string[]) =>

アロー関数式については下記を参考にしてください。
Playground - Welcome to TypeScript

  • 5行目

ここではUnderscore.jsを使用し、chainメソッドを使用しています。
Underscore.jsは_.メソッド名という形で使用します。
chainメソッドは、チェーン記法で連続処理を行うメソッドです。
チェーン内のそれぞれの関数はchainメソッドの引数で渡されたオブジェクトを処理した結果をラッパーオブジェクトに格納して、チェーン上の次のメソッドに渡します。
チェーン内のメソッドにはラッパーオブジェクトが渡され、メソッドの1つ目のパラメータは省略されます。

__.chain(list:string[])

chainメソッドについて、説明がわかりにくかった場合は下記の記事を参考にしてください。
第3回 underscore.jsの関数とユーティリティとChaining:Underscore.jsの入り口|gihyo.jp … 技術評論社

  • 7行目

ここでは、mapメソッドを使い、mapメソッドの引数にmapメソッドで実行されるメソッドの定義をアロー関数式で記述しています。
mapメソッドは、第1引数で渡される配列/オブジェクトのそれぞれの要素に対して、第2引数で定義された関数に渡して、実行した結果を配列で返します。
また、第1引数がオブジェクト型であっても戻り値は配列となります。
そして、今回はchainメソッドにより、mapメソッドに渡される第1引数は省略されています。
splitメソッドは、JavaScipt自体のメソッドで、引数で渡された文字列を区切り文字とし、レシーバの文字列を配列にして返すものです。

   .map((_list:string[]) => _list.split(' '))

mapメソッドについて、説明がわかりにくかった場合は下記の記事を参考にしてください。
第2回 Underscore.jsのコレクションと配列とオブジェクトの機能:Underscore.jsの入り口|gihyo.jp … 技術評論社

  • 9行目

ここでは、flattenメソッドを使い、ネストされている配列に関して、ネストを解いて平坦な新しい配列にして返しています。

   .flatten()

flattenメソッドについて、説明がわかりにくかった場合は下記の記事を参考にしてください。
第3回 underscore.jsの関数とユーティリティとChaining:Underscore.jsの入り口|gihyo.jp … 技術評論社

  • 11行目

ここでは、配列の要素をカウントし、それぞれの要素とその出現回数をキー値として格納したオブジェクトを返します。

   .countBy()

この関数の存在を知る前には下記のようなコードを記述していました。

   .reduce(function (counts, word) {
    counts[word] = (counts[word] || 0) + 1;
     return counts;
        },  {})

ちなみにreduce関数は第1引数に渡された配列/オブジェクトに関して、それぞれの要素を左から順番に第2引数で定義された関数に渡して実行し、その結果を結合することで単一の値まで煮詰めると言ったようなものです。
すごく簡単に言えば、再帰関数をこの関数で置き換えできるようなイメージです。
reduceの引数で定義している関数については、JavaScriptでよく使うイディオムを使用していますので初めて見た方は調べてみてください。

reduceメソッドについて、説明がわかりにくかった場合は下記の記事を参考にしてください。
第2回 Underscore.jsのコレクションと配列とオブジェクトの機能:Underscore.jsの入り口|gihyo.jp … 技術評論社

  • 13行目

このvalueメソッドは、chainメソッドの最後に記述するもので、ラッパーオブジェクトからchainメソッドの処理結果を抽出して返します。

  .value();

いかがでしたでしょうか。
関数型がまだあまりよくわかっていなくてコードを記述しているので、もっと良いやり方があるなど突っ込み等ありましたら、コメントしてくださると嬉しいです。

JavaScriptで学ぶ関数型プログラミング

JavaScriptで学ぶ関数型プログラミング

関数プログラミング 珠玉のアルゴリズムデザイン

関数プログラミング 珠玉のアルゴリズムデザイン

TypeScriptリファレンス Ver.1.0対応

TypeScriptリファレンス Ver.1.0対応

TypeScript実践プログラミング (Programmer's SELECTION)

TypeScript実践プログラミング (Programmer's SELECTION)