OmniAICreator/Qiita-1.07M huggingface dataset:
PHP: The Right Way

[PHPの効率的な学習法] » [学びの実践] » [ウェブ上の資料を活用して学ぶ] » **PHP: The Right Way**

PHPは歴史が長いため、古い情報を知らずのうちに目にしていることがあるはずです。古い情報の中には今となっては「やってはならないこと」や「避けたほうがいいこと」、「もっとましなやり方があること」などが含まれていることがあります。古くなった情報はアップデートされることが望ましいですが、情報の取捨選択の責任は読み手にあるのも現実です。今日において、何がベストプラクティスとされており、一方で何が避けられるべきとされているかを、読み手のあなた自身が判断しなければなりません。[PHP: The Right Way](http://ja.phptherightway.com/)は良くないやり方とベストプラクティスを学ぶには良い情報源です。

**前ページ**: [php.net(PHP公式マニュアル)]
**次ページ**: [slideshareにアップされているスライド資料]


[PHPの効率的な学習法]: /suin/items/edb067f2e5df713e966d

[学びのガイドライン]: /suin/items/edb067f2e5df713e966d#学びのガイドライン
[知らないことを放置しない]: /suin/items/ef5b0ba6392f01c54466
[正しいところにお金を使う]: /suin/items/802aed54852480c53f17
[技術に対する「愛」を持つ]: /suin/items/425fdb14f054722011bd
[PHPとフレームワークは分けて学ぶ]: /suin/items/fb85f760343b836b09b9
[情報収集源に英語を加える]: /suin/items/b713631fe5ea4dc54b44
[必要になったら、必要なところだけ勉強する]: /suin/items/d15411c8d7a48219b3f5

[学びの実践]: /suin/items/edb067f2e5df713e966d#学びの実践
[手を動かして学ぶ]: /suin/items/edb067f2e5df713e966d#手を動かして学ぶ
[作りたいものを作る]: /suin/items/5d232e6602244c6809cd
[ゼロからはじめない]: /suin/items/706d0a63b30cb9d2a8cf
[シェルアプリケーションを作る]: /suin/items/04b3a55a035f9c556e41
[PHPで書き直してみる]: /suin/items/556118d28f1e1cf11729
[自分のサーバを持つ]: /suin/items/97537e52f66bd6fb2a1e

[ウェブ上の資料を活用して学ぶ]: /suin/items/edb067f2e5df713e966d#ウェブ上の資料を活用して学ぶ
[php.net(PHP公式マニュアル)]: /suin/items/79a6851f83ac5dfdca94
[slideshareにアップされているスライド資料]: /suin/items/0e4a4abdfb5d6969ff02

[受講して学ぶ]: /suin/items/edb067f2e5df713e966d#受講して学ぶ

[『絶対に挫折させないアプリ開発　はじめてのLaravel』]: https://plumsa.booth.pm/items/1048008
[『パーフェクトPHP』]: https://amzn.to/2PHt4Pt
[『PHP中級者を目指す 〜言語を使いこなすための本〜』]: https://amzn.to/2zhoddu
[『独習PHP 第3版』]: https://amzn.to/2QXEYkW
[『プログラミングPHP 第3版』]: https://amzn.to/2QXI5cq
[『初めてのPHP』]: https://amzn.to/2QXIOua
[『いちばんやさしいPHPの教本 人気講師が教える実践Webプログラミング 』]: https://amzn.to/2zuiZvb
[『体系的に学ぶ 安全なWebアプリケーションの作り方 第2版 脆弱性が生まれる原理と対策の実践』]: https://amzn.to/2ScNKvz
[『現場で役立つシステム設計の原則』]: https://amzn.to/2SeHIuC
[『Clean Code アジャイルソフトウェア達人の技』]: https://amzn.to/2Rj4l0z
[『リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック』]: https://amzn.to/2Rnbq0s
[『CODE COMPLETE 第2版 上 完全なプログラミングを目指して』]: https://amzn.to/2zrt63I
[『CODE COMPLETE 第2版 下 完全なプログラミングを目指して』]: https://amzn.to/2DYmJsN
[『PHPフレームワーク Laravel入門』]: https://amzn.to/2zx9Ge2
[『Laravelエキスパート養成読本』]: https://amzn.to/2Q1Lzyt

[YYPHP]: https://yyphp.connpass.com
PhantomJSについて

#PhantomJSとは
webkitベースのヘッドレスブラウザ。webkitとは主にWebブラウザーで用いられているレンダリングエンジン。PhantomJSはwebkitにbuilt-inされているJavaScriptCore (safariとかもこれを使っている) というjavascriptエンジンを採用している。スクレイピングやスクリーンキャプチャなどにも活用可能。

ヘッドレスブラウザ：ヘッドレス・ブラウザとは、Webコンテンツを画面上に描くグラフィック・ユーザ・インタフェース（GUI）を省略したブラウザ

####要はコマンド（プログラム）でブラウザを実行できる環境

プログラムで動きを制御できるので、
「自動化テスト」
「スクレイピング」
などを行なってくれます。

#Node.jsを使ったインストール方法

```
$ brew install nodebrew
```

```
$ nodebrew setup//これをしないと次のコマンドでエラー吐く。必要なフォルダ等々を生成してくれるらしい
```
```
$ echo export PATH=$HOME/.nodebrew/current/bin:$PATH >> ~/.bash_profile //書き込み
```
```
$ source ~/.bash_profile //読み込み
```
```
$ nodebrew install-binary latest //最新版のインストール
```
```
$ nodebrew list //インストール確認
```
```
$ npm -v //バージョン確認
```

```
$ nodebrew use v11.1.0 //使用するバージョンを指定することも可能
```
```
$ npm install -g phantomjs
```
#Node.jsでなくても

```
$ brew cask install phantomjs
```
こちらの方法でも可能

#Railsのスクレイピングで私が使っているCapybara/Poltergeist
####Capybara = UIテストのためのrubyフレームワーク

オープンソース / MITライセンス
ページの表示、フォームの入力、ボタンのクリック等のUI操作をテストコード上で実行できる

複数のテストフレームワークから利用できる

MiniTest, RSpec, Cucumberなど
複数の ドライバ (テスト環境, ヘッドレスブラウザ)を選択して利用できる

Rack::Test, Selenium, Webkitなど

####poltergeist
Capybaraのドライバーの一つです。
他にもselenium, rack-test（デフォルトのドライバー）などがあります。rack-testは高速ですが、JSに対応してなかったり、seleniumはJSに対応してるがヘッドレスではないため処理が遅かったりと、それぞれ一長一短です。

#Gemのインストール

```
$ gem 'capybara'
$ gem 'poltergeist'
```
`bundle install`をしましょう。

#PhantomJSの今後
PhantomJSの開発は終了し、リポジトリはアーカイブ化されました。本記事は参考程度にご覧ください。
[参考](https://jser.info/2018/06/11/phantomjs-ended/)

ですので、現在私は他の方法も模索中です。
Puppeteer + Headless Chromeの方法なども気になります。
php.net(PHP公式マニュアル)

[PHPの効率的な学習法] » [学びの実践] » [ウェブ上の資料を活用して学ぶ] » **php.net(PHP公式マニュアル)**

PHPを上達させるには、公式のマニュアルにしっかりお世話になることです。PHPのマニュアルは、日本語で読めますし、サンプルコードも充実していて、読めば読むほどPHPに詳しくなれます。

知らない関数について調べるときは、非公式な情報だけでなく、**公式マニュアルの関数のページを欠かさずに読むことを強くおすすめします**。

余談ですが、YYPHPの参加者たちで「**php.netの中でおすすめのページはどれか**」について話したことがあります。そのとき特に話題になったのは、[配列関数](http://php.net/manual/ja/ref.array.php)のページです。「配列系の関数は全て目を通すと信じられないほどはかどる」といった声もありました。PHPは他の言語と比べ、いろんなデータを配列で表現する傾向があるためだと考えられます。加えて、[文字列関数](http://php.net/manual/ja/ref.strings.php)についてもよく読んでおくと良いそうです。


**前ページ**: [ウェブ上の資料を活用して学ぶ]
**次ページ**: [PHP: The Right Way]

[PHPの効率的な学習法]: /suin/items/edb067f2e5df713e966d

[学びのガイドライン]: /suin/items/edb067f2e5df713e966d#学びのガイドライン
[知らないことを放置しない]: /suin/items/ef5b0ba6392f01c54466
[正しいところにお金を使う]: /suin/items/802aed54852480c53f17
[技術に対する「愛」を持つ]: /suin/items/425fdb14f054722011bd
[PHPとフレームワークは分けて学ぶ]: /suin/items/fb85f760343b836b09b9
[情報収集源に英語を加える]: /suin/items/b713631fe5ea4dc54b44
[必要になったら、必要なところだけ勉強する]: /suin/items/d15411c8d7a48219b3f5

[学びの実践]: /suin/items/edb067f2e5df713e966d#学びの実践
[手を動かして学ぶ]: /suin/items/edb067f2e5df713e966d#手を動かして学ぶ
[作りたいものを作る]: /suin/items/5d232e6602244c6809cd
[ゼロからはじめない]: /suin/items/706d0a63b30cb9d2a8cf
[シェルアプリケーションを作る]: /suin/items/04b3a55a035f9c556e41
[PHPで書き直してみる]: /suin/items/556118d28f1e1cf11729
[自分のサーバを持つ]: /suin/items/97537e52f66bd6fb2a1e

[ウェブ上の資料を活用して学ぶ]: /suin/items/edb067f2e5df713e966d#ウェブ上の資料を活用して学ぶ
[PHP: The Right Way]: /suin/items/af37e052daeda403a9aa

[受講して学ぶ]: /suin/items/edb067f2e5df713e966d#受講して学ぶ

[『絶対に挫折させないアプリ開発　はじめてのLaravel』]: https://plumsa.booth.pm/items/1048008
[『パーフェクトPHP』]: https://amzn.to/2PHt4Pt
[『PHP中級者を目指す 〜言語を使いこなすための本〜』]: https://amzn.to/2zhoddu
[『独習PHP 第3版』]: https://amzn.to/2QXEYkW
[『プログラミングPHP 第3版』]: https://amzn.to/2QXI5cq
[『初めてのPHP』]: https://amzn.to/2QXIOua
[『いちばんやさしいPHPの教本 人気講師が教える実践Webプログラミング 』]: https://amzn.to/2zuiZvb
[『体系的に学ぶ 安全なWebアプリケーションの作り方 第2版 脆弱性が生まれる原理と対策の実践』]: https://amzn.to/2ScNKvz
[『現場で役立つシステム設計の原則』]: https://amzn.to/2SeHIuC
[『Clean Code アジャイルソフトウェア達人の技』]: https://amzn.to/2Rj4l0z
[『リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック』]: https://amzn.to/2Rnbq0s
[『CODE COMPLETE 第2版 上 完全なプログラミングを目指して』]: https://amzn.to/2zrt63I
[『CODE COMPLETE 第2版 下 完全なプログラミングを目指して』]: https://amzn.to/2DYmJsN
[『PHPフレームワーク Laravel入門』]: https://amzn.to/2zx9Ge2
[『Laravelエキスパート養成読本』]: https://amzn.to/2Q1Lzyt

[YYPHP]: https://yyphp.connpass.com
自分のサーバを持つ

[PHPの効率的な学習法] » [学びの実践] » [手を動かして学ぶ] » **自分のサーバを持つ**

一歩進んでPHPを学びたいと思ったら、自分のサーバを持つのも良い方法です。その理由に、**インフラを相手していると楽しくなって自然と学びが捗る**(個人差があります)という意見もありました。

たとえば、[さくらのVPS](https://vps.sakura.ad.jp/)では、クラウド上に自分専用のLinuxを借りることができ、そこに好きな環境を構築し、ウェブサイトを世界に向けて公開することができます。さくらのVPSは月額685円からレンタルすることができます。1000円以下のサーバで遊び倒すのもよいかもしれません。

ただし、インターネットに公開したサーバを借りるときは、セキュリティに気をつけなければなりません。逆にこうした環境が、iptables(Linuxのファイアウォール)など**セキュリティについて気にさせるようになり、スキルアップにつながる**メリットもあります。

インターネットにサーバを公開するのが怖かったり、月額で課金されるのに抵抗がある方は、手のひらサイズのコンピュータ[Raspberry Pi](https://ja.wikipedia.org/wiki/Raspberry_Pi)(ラズベリーパイ)にサーバを構築してみると面白いかもしれません。Raspberry Piはハードウェアとしても遊べるので、箱物がないVPSよりも遊びの幅が広がることでしょう。

**前ページ**: [シェルアプリケーションを作る]
**次ページ**: [ウェブ上の資料を活用して学ぶ]

[PHPの効率的な学習法]: /suin/items/edb067f2e5df713e966d

[学びのガイドライン]: /suin/items/edb067f2e5df713e966d#学びのガイドライン
[知らないことを放置しない]: /suin/items/ef5b0ba6392f01c54466
[正しいところにお金を使う]: /suin/items/802aed54852480c53f17
[技術に対する「愛」を持つ]: /suin/items/425fdb14f054722011bd
[PHPとフレームワークは分けて学ぶ]: /suin/items/fb85f760343b836b09b9
[情報収集源に英語を加える]: /suin/items/b713631fe5ea4dc54b44
[必要になったら、必要なところだけ勉強する]: /suin/items/d15411c8d7a48219b3f5

[学びの実践]: /suin/items/edb067f2e5df713e966d#学びの実践
[手を動かして学ぶ]: /suin/items/edb067f2e5df713e966d#手を動かして学ぶ
[作りたいものを作る]: /suin/items/5d232e6602244c6809cd
[ゼロからはじめない]: /suin/items/706d0a63b30cb9d2a8cf
[シェルアプリケーションを作る]: /suin/items/04b3a55a035f9c556e41
[PHPで書き直してみる]: /suin/items/556118d28f1e1cf11729

[ウェブ上の資料を活用して学ぶ]: /suin/items/edb067f2e5df713e966d#ウェブ上の資料を活用して学ぶ

[受講して学ぶ]: /suin/items/edb067f2e5df713e966d#受講して学ぶ

[『絶対に挫折させないアプリ開発　はじめてのLaravel』]: https://plumsa.booth.pm/items/1048008
[『パーフェクトPHP』]: https://amzn.to/2PHt4Pt
[『PHP中級者を目指す 〜言語を使いこなすための本〜』]: https://amzn.to/2zhoddu
[『独習PHP 第3版』]: https://amzn.to/2QXEYkW
[『プログラミングPHP 第3版』]: https://amzn.to/2QXI5cq
[『初めてのPHP』]: https://amzn.to/2QXIOua
[『いちばんやさしいPHPの教本 人気講師が教える実践Webプログラミング 』]: https://amzn.to/2zuiZvb
[『体系的に学ぶ 安全なWebアプリケーションの作り方 第2版 脆弱性が生まれる原理と対策の実践』]: https://amzn.to/2ScNKvz
[『現場で役立つシステム設計の原則』]: https://amzn.to/2SeHIuC
[『Clean Code アジャイルソフトウェア達人の技』]: https://amzn.to/2Rj4l0z
[『リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック』]: https://amzn.to/2Rnbq0s
[『CODE COMPLETE 第2版 上 完全なプログラミングを目指して』]: https://amzn.to/2zrt63I
[『CODE COMPLETE 第2版 下 完全なプログラミングを目指して』]: https://amzn.to/2DYmJsN
[『PHPフレームワーク Laravel入門』]: https://amzn.to/2zx9Ge2
[『Laravelエキスパート養成読本』]: https://amzn.to/2Q1Lzyt

[YYPHP]: https://yyphp.connpass.com
PHPで書き直してみる

[PHPの効率的な学習法] » [学びの実践] » [手を動かして学ぶ] » **PHPで書き直してみる**

[YYPHP]の参加者の中には、PHPは始めたばかりでも他のプログラミング言語経験がある人がいます。彼らからは「PHPを効率的に学ぶにはどうしたらいいか？」といった質問が出てくることがありました。

他のプログラミング言語をやったことがあるということは、その言語で自分が作ったプログラムがあるはずです。他の言語で書いたコードをPHPで書き直してみるのも良い学習法です。そのプログラムが解決しようとしていることやロジックをよく理解しているため、PHPそのものを勉強することに集中できるからです。

**前ページ**: [シェルアプリケーションを作る]
**次ページ**: [自分のサーバを持つ]

[PHPの効率的な学習法]: /suin/items/edb067f2e5df713e966d

[学びのガイドライン]: /suin/items/edb067f2e5df713e966d#学びのガイドライン
[知らないことを放置しない]: /suin/items/ef5b0ba6392f01c54466
[正しいところにお金を使う]: /suin/items/802aed54852480c53f17
[技術に対する「愛」を持つ]: /suin/items/425fdb14f054722011bd
[PHPとフレームワークは分けて学ぶ]: /suin/items/fb85f760343b836b09b9
[情報収集源に英語を加える]: /suin/items/b713631fe5ea4dc54b44
[必要になったら、必要なところだけ勉強する]: /suin/items/d15411c8d7a48219b3f5

[学びの実践]: /suin/items/edb067f2e5df713e966d#学びの実践
[手を動かして学ぶ]: /suin/items/edb067f2e5df713e966d#手を動かして学ぶ
[作りたいものを作る]: /suin/items/5d232e6602244c6809cd
[ゼロからはじめない]: /suin/items/706d0a63b30cb9d2a8cf
[シェルアプリケーションを作る]: /suin/items/04b3a55a035f9c556e41
[自分のサーバを持つ]: /suin/items/97537e52f66bd6fb2a1e

[受講して学ぶ]: /suin/items/edb067f2e5df713e966d#受講して学ぶ

[『絶対に挫折させないアプリ開発　はじめてのLaravel』]: https://plumsa.booth.pm/items/1048008
[『パーフェクトPHP』]: https://amzn.to/2PHt4Pt
[『PHP中級者を目指す 〜言語を使いこなすための本〜』]: https://amzn.to/2zhoddu
[『独習PHP 第3版』]: https://amzn.to/2QXEYkW
[『プログラミングPHP 第3版』]: https://amzn.to/2QXI5cq
[『初めてのPHP』]: https://amzn.to/2QXIOua
[『いちばんやさしいPHPの教本 人気講師が教える実践Webプログラミング 』]: https://amzn.to/2zuiZvb
[『体系的に学ぶ 安全なWebアプリケーションの作り方 第2版 脆弱性が生まれる原理と対策の実践』]: https://amzn.to/2ScNKvz
[『現場で役立つシステム設計の原則』]: https://amzn.to/2SeHIuC
[『Clean Code アジャイルソフトウェア達人の技』]: https://amzn.to/2Rj4l0z
[『リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック』]: https://amzn.to/2Rnbq0s
[『CODE COMPLETE 第2版 上 完全なプログラミングを目指して』]: https://amzn.to/2zrt63I
[『CODE COMPLETE 第2版 下 完全なプログラミングを目指して』]: https://amzn.to/2DYmJsN
[『PHPフレームワーク Laravel入門』]: https://amzn.to/2zx9Ge2
[『Laravelエキスパート養成読本』]: https://amzn.to/2Q1Lzyt

[YYPHP]: https://yyphp.connpass.com
シェルアプリケーションを作る

[PHPの効率的な学習法] » [学びの実践] » [手を動かして学ぶ] » **シェルアプリケーションを作る**

PHPはウェブアプリを作るのが一般的な用途ですが、[コマンドラインで実行できるシェルアプリケーション](http://php.net/manual/ja/features.commandline.usage.php)を作ることができます。インフラエンジニアの @nouphet さんが、本質的なプログラミングとしてのPHPを学ぶのにおすすめしているのが、このPHPのシェルアプリケーションを作る方法です。

実用的なウェブアプリケーションを作るには、ApacheのようなWebサーバ、HTTPの知識、HTMLの知識、データベース、セッションといった、PHPとは別の技術をいくつも技術が求められ、必然的に考えなければならないことが多くなります。

一方のシェルアプリケーションは、`php`コマンドでPHPを実行する方法が分かりさえすれば、PHPのコードを動かしてみることができます。PHP以外のことをあまり考えなくて良くなり、PHPそのものに集中できるため、プログラミングとして学びやすくなります。**特にPHPでロジックを考える練習には良いアプローチ**だそうです。

@nouphet さんはPHPのアルゴリズムを考えるエキササイズとして、[多次元配列を1次元配列に変換する関数](https://qiita.com/nouphet/items/a666e359e43c6e28ef6b)や[カレンダーを出力する関数](https://qiita.com/nouphet/items/886bf5d42a5d13be1b2e#45%E6%AD%B3%E3%81%8B%E3%82%89%E5%88%9D%E3%82%81%E3%82%8Bphp%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0)を実装するのに、この方法を適用しています。また、@nouphet さんがこの方法をどのように試したか[PHPプログラミングを始めて16日目の軌跡](https://qiita.com/nouphet/items/ad5a644adb8d59f1574a)の中で記しているので、読んでみるといいかと思います。

**前ページ**: [ゼロからはじめない]
**次ページ**: [PHPで書き直してみる]

[PHPの効率的な学習法]: /suin/items/edb067f2e5df713e966d

[学びのガイドライン]: /suin/items/edb067f2e5df713e966d#学びのガイドライン
[知らないことを放置しない]: /suin/items/ef5b0ba6392f01c54466
[正しいところにお金を使う]: /suin/items/802aed54852480c53f17
[技術に対する「愛」を持つ]: /suin/items/425fdb14f054722011bd
[PHPとフレームワークは分けて学ぶ]: /suin/items/fb85f760343b836b09b9
[情報収集源に英語を加える]: /suin/items/b713631fe5ea4dc54b44
[必要になったら、必要なところだけ勉強する]: /suin/items/d15411c8d7a48219b3f5

[学びの実践]: /suin/items/edb067f2e5df713e966d#学びの実践
[手を動かして学ぶ]: /suin/items/edb067f2e5df713e966d#手を動かして学ぶ
[作りたいものを作る]: /suin/items/5d232e6602244c6809cd
[ゼロからはじめない]: /suin/items/706d0a63b30cb9d2a8cf
[PHPで書き直してみる]: /suin/items/556118d28f1e1cf11729

[受講して学ぶ]: /suin/items/edb067f2e5df713e966d#受講して学ぶ

[『絶対に挫折させないアプリ開発　はじめてのLaravel』]: https://plumsa.booth.pm/items/1048008
[『パーフェクトPHP』]: https://amzn.to/2PHt4Pt
[『PHP中級者を目指す 〜言語を使いこなすための本〜』]: https://amzn.to/2zhoddu
[『独習PHP 第3版』]: https://amzn.to/2QXEYkW
[『プログラミングPHP 第3版』]: https://amzn.to/2QXI5cq
[『初めてのPHP』]: https://amzn.to/2QXIOua
[『いちばんやさしいPHPの教本 人気講師が教える実践Webプログラミング 』]: https://amzn.to/2zuiZvb
[『体系的に学ぶ 安全なWebアプリケーションの作り方 第2版 脆弱性が生まれる原理と対策の実践』]: https://amzn.to/2ScNKvz
[『現場で役立つシステム設計の原則』]: https://amzn.to/2SeHIuC
[『Clean Code アジャイルソフトウェア達人の技』]: https://amzn.to/2Rj4l0z
[『リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック』]: https://amzn.to/2Rnbq0s
[『CODE COMPLETE 第2版 上 完全なプログラミングを目指して』]: https://amzn.to/2zrt63I
[『CODE COMPLETE 第2版 下 完全なプログラミングを目指して』]: https://amzn.to/2DYmJsN
[『PHPフレームワーク Laravel入門』]: https://amzn.to/2zx9Ge2
[『Laravelエキスパート養成読本』]: https://amzn.to/2Q1Lzyt

[YYPHP]: https://yyphp.connpass.com
ゼロからはじめない

[PHPの効率的な学習法] » [学びの実践] » [手を動かして学ぶ] » **ゼロからはじめない**

初学者が何も無いところからひとつのアプリケーションを作るのは、ハードルが高すぎる場合があります。その場合、**誰かが作ったプログラムを直すところから始める**のもプログラミングの学習には良い方法です。

誰かが作ったものというのは、職場の同僚が作ったものでもいいですし、[PHP製のオープンソースプロダクト](https://www.moongift.jp/tag/php)でも構いません。誰かが書いたアプリケーションを入手してきて、そこに自分が付け足したい機能のコードを書いたり、ちょっとした文言修正をしたりします。

誰かが作ったものを、**「直す」のではなく「壊してみる」という勉強方法もあります**。わざとコードを削ってみたり、書き換えてみたりして、どういう影響が出るのか観察します。そして、その影響がどうして出たのかを探ってみると、プログラムの書き方や構成について学ぶことができます。

**前ページ**: [作りたいものを作る]
**次ページ**: [シェルアプリケーションを作る]

[PHPの効率的な学習法]: /suin/items/edb067f2e5df713e966d

[学びのガイドライン]: /suin/items/edb067f2e5df713e966d#学びのガイドライン
[知らないことを放置しない]: /suin/items/ef5b0ba6392f01c54466
[正しいところにお金を使う]: /suin/items/802aed54852480c53f17
[技術に対する「愛」を持つ]: /suin/items/425fdb14f054722011bd
[PHPとフレームワークは分けて学ぶ]: /suin/items/fb85f760343b836b09b9
[情報収集源に英語を加える]: /suin/items/b713631fe5ea4dc54b44
[必要になったら、必要なところだけ勉強する]: /suin/items/d15411c8d7a48219b3f5

[学びの実践]: /suin/items/edb067f2e5df713e966d#学びの実践
[手を動かして学ぶ]: /suin/items/edb067f2e5df713e966d#手を動かして学ぶ
[作りたいものを作る]: /suin/items/5d232e6602244c6809cd
[シェルアプリケーションを作る]: /suin/items/04b3a55a035f9c556e41

[受講して学ぶ]: /suin/items/edb067f2e5df713e966d#受講して学ぶ

[『絶対に挫折させないアプリ開発　はじめてのLaravel』]: https://plumsa.booth.pm/items/1048008
[『パーフェクトPHP』]: https://amzn.to/2PHt4Pt
[『PHP中級者を目指す 〜言語を使いこなすための本〜』]: https://amzn.to/2zhoddu
[『独習PHP 第3版』]: https://amzn.to/2QXEYkW
[『プログラミングPHP 第3版』]: https://amzn.to/2QXI5cq
[『初めてのPHP』]: https://amzn.to/2QXIOua
[『いちばんやさしいPHPの教本 人気講師が教える実践Webプログラミング 』]: https://amzn.to/2zuiZvb
[『体系的に学ぶ 安全なWebアプリケーションの作り方 第2版 脆弱性が生まれる原理と対策の実践』]: https://amzn.to/2ScNKvz
[『現場で役立つシステム設計の原則』]: https://amzn.to/2SeHIuC
[『Clean Code アジャイルソフトウェア達人の技』]: https://amzn.to/2Rj4l0z
[『リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック』]: https://amzn.to/2Rnbq0s
[『CODE COMPLETE 第2版 上 完全なプログラミングを目指して』]: https://amzn.to/2zrt63I
[『CODE COMPLETE 第2版 下 完全なプログラミングを目指して』]: https://amzn.to/2DYmJsN
[『PHPフレームワーク Laravel入門』]: https://amzn.to/2zx9Ge2
[『Laravelエキスパート養成読本』]: https://amzn.to/2Q1Lzyt

[YYPHP]: https://yyphp.connpass.com
作りたいものを作る

[PHPの効率的な学習法] » [学びの実践] » [手を動かして学ぶ] » **作りたいものを作る**

[YYPHP]に参加したプログラマが多く賛同した助言が「作りたいものを作る」というものです。必要は発明の母と言われるように、作りたい具体的なものが決まっていると、自然と学習が進んでいくからです。

#### 作りたいものがありません。どうやって見つけたら良いですか？

PHPを仕事のために始めた人の中には、個人的に作りたいものを持っていない人もいるはずです。そういう場合は、次の観点で探してみると、モチベーションを保てるため良いでしょう。

* 自分のために役立つもの
* 身近な人に役立つもの

**前ページ**: [手を動かして学ぶ]
**次ページ**: [ゼロからはじめない]

[PHPの効率的な学習法]: /suin/items/edb067f2e5df713e966d

[学びのガイドライン]: /suin/items/edb067f2e5df713e966d#学びのガイドライン
[知らないことを放置しない]: /suin/items/ef5b0ba6392f01c54466
[正しいところにお金を使う]: /suin/items/802aed54852480c53f17
[技術に対する「愛」を持つ]: /suin/items/425fdb14f054722011bd
[PHPとフレームワークは分けて学ぶ]: /suin/items/fb85f760343b836b09b9
[情報収集源に英語を加える]: /suin/items/b713631fe5ea4dc54b44
[必要になったら、必要なところだけ勉強する]: /suin/items/d15411c8d7a48219b3f5

[学びの実践]: /suin/items/edb067f2e5df713e966d#学びの実践
[手を動かして学ぶ]: /suin/items/edb067f2e5df713e966d#手を動かして学ぶ
[ゼロからはじめない]: /suin/items/706d0a63b30cb9d2a8cf

[受講して学ぶ]: /suin/items/edb067f2e5df713e966d#受講して学ぶ

[『絶対に挫折させないアプリ開発　はじめてのLaravel』]: https://plumsa.booth.pm/items/1048008
[『パーフェクトPHP』]: https://amzn.to/2PHt4Pt
[『PHP中級者を目指す 〜言語を使いこなすための本〜』]: https://amzn.to/2zhoddu
[『独習PHP 第3版』]: https://amzn.to/2QXEYkW
[『プログラミングPHP 第3版』]: https://amzn.to/2QXI5cq
[『初めてのPHP』]: https://amzn.to/2QXIOua
[『いちばんやさしいPHPの教本 人気講師が教える実践Webプログラミング 』]: https://amzn.to/2zuiZvb
[『体系的に学ぶ 安全なWebアプリケーションの作り方 第2版 脆弱性が生まれる原理と対策の実践』]: https://amzn.to/2ScNKvz
[『現場で役立つシステム設計の原則』]: https://amzn.to/2SeHIuC
[『Clean Code アジャイルソフトウェア達人の技』]: https://amzn.to/2Rj4l0z
[『リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック』]: https://amzn.to/2Rnbq0s
[『CODE COMPLETE 第2版 上 完全なプログラミングを目指して』]: https://amzn.to/2zrt63I
[『CODE COMPLETE 第2版 下 完全なプログラミングを目指して』]: https://amzn.to/2DYmJsN
[『PHPフレームワーク Laravel入門』]: https://amzn.to/2zx9Ge2
[『Laravelエキスパート養成読本』]: https://amzn.to/2Q1Lzyt

[YYPHP]: https://yyphp.connpass.com
必要になったら、必要なところだけ勉強する

[PHPの効率的な学習法] » [学びのガイドライン] » **必要になったら、必要なところだけ勉強する**

PHPを学ぶときに、すべてを一気に吸収しようとしてませんでしょうか？ 例えば、技術書を読むとき知識を逃すまいと、1ページ目からスキャンするように順番に読んでいくような勉強法をしてませんでしょうか？

このような勉強法が自分に合っているならそれで構いませんが、なんとなく続かない方は[遅延評価勉強法](https://amachang.hatenablog.com/entry/20080204/1202104260)のアプローチが合っているかもしれません。**遅延評価勉強法とは、必要になったら、必要なところだけ勉強する**やりかたです。分かりやすい例を[けんすうさんの記事から引用](http://blog.livedoor.jp/kensuu/archives/50555054.html)しますが、どういうことかと言うとこういうことです:

> たとえばプログラムを勉強するときに、「書籍を1ページ目からやる」のではなく「2ch型掲示板が作りたいから必要なところを勉強する」のが遅延評価勉強法になります。
> 
> 通常の勉強法と比べて、モチベーションが高く保てます。また、インプットとアウトプットがほぼ同時になされるので理解度、定着率がダントツに違います。

ちなみに、買った技術書をあまり読まずに本棚の肥やしにするのも決して悪いことではありません。いつでも手にとって読める状態になっていれば、「必要になったら、必要なところだけ勉強する」ことができるわけですから、持っているだけでも一歩勉強を進めたと言えるでしょう。知識は背表紙からにじみ出てくるものです。

**前ページ**: [情報収集源に英語を加える]
**次ページ**: [手を動かして学ぶ]

[PHPの効率的な学習法]: /suin/items/edb067f2e5df713e966d

[学びのガイドライン]: /suin/items/edb067f2e5df713e966d#学びのガイドライン
[知らないことを放置しない]: /suin/items/ef5b0ba6392f01c54466
[正しいところにお金を使う]: /suin/items/802aed54852480c53f17
[技術に対する「愛」を持つ]: /suin/items/425fdb14f054722011bd
[PHPとフレームワークは分けて学ぶ]: /suin/items/fb85f760343b836b09b9
[情報収集源に英語を加える]: /suin/items/b713631fe5ea4dc54b44

[手を動かして学ぶ]: /suin/items/edb067f2e5df713e966d#手を動かして学ぶ

[受講して学ぶ]: /suin/items/edb067f2e5df713e966d#受講して学ぶ

[『絶対に挫折させないアプリ開発　はじめてのLaravel』]: https://plumsa.booth.pm/items/1048008
[『パーフェクトPHP』]: https://amzn.to/2PHt4Pt
[『PHP中級者を目指す 〜言語を使いこなすための本〜』]: https://amzn.to/2zhoddu
[『独習PHP 第3版』]: https://amzn.to/2QXEYkW
[『プログラミングPHP 第3版』]: https://amzn.to/2QXI5cq
[『初めてのPHP』]: https://amzn.to/2QXIOua
[『いちばんやさしいPHPの教本 人気講師が教える実践Webプログラミング 』]: https://amzn.to/2zuiZvb
[『体系的に学ぶ 安全なWebアプリケーションの作り方 第2版 脆弱性が生まれる原理と対策の実践』]: https://amzn.to/2ScNKvz
[『現場で役立つシステム設計の原則』]: https://amzn.to/2SeHIuC
[『Clean Code アジャイルソフトウェア達人の技』]: https://amzn.to/2Rj4l0z
[『リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック』]: https://amzn.to/2Rnbq0s
[『CODE COMPLETE 第2版 上 完全なプログラミングを目指して』]: https://amzn.to/2zrt63I
[『CODE COMPLETE 第2版 下 完全なプログラミングを目指して』]: https://amzn.to/2DYmJsN
[『PHPフレームワーク Laravel入門』]: https://amzn.to/2zx9Ge2
[『Laravelエキスパート養成読本』]: https://amzn.to/2Q1Lzyt

[YYPHP]: https://yyphp.connpass.com
情報収集源に英語を加える

[PHPの効率的な学習法] » [学びのガイドライン] » **情報収集源に英語を加える**

日本人は恵まれていいて、プログラミングのような専門知識を日本語で学ぶことができます。日本語で書かれたPHPの書籍も、ウェブ上の情報も溢れています。特にPHPは[公式マニュアルのphp.net](http://php.net/manual/ja/)がすごい勢いで和訳されたり、[Laravelには立派な日本語サイト](http://laravel.jp/)があったりと、言語としても日本語情報に恵まれているほうです。

しかし一方で、日本語で書かれた情報よりも英語で書かれた情報のほうが豊富で、内容も新しいということがよくあります。英語の情報に触れることができれば、より詳しく、より新しいものを学べるチャンスが増えます。特に海外の技術Q&Aサイトの[Stackoverflow](http://stackoverflow.com)は、質の高い回答が集めらています。自ら質問しないにしても、情報源に含めておくとかなり役に立ちます。

まずは、[Google検索の対象言語設定](https://www.google.com/preferences#languages)を見直すことをおすすめします。その設定で「検索結果の表示言語」に「English」を含めるようにしておきましょう。英語リーディングが苦手という方は、Google Chromeに搭載された翻訳機能を使うと良いでしょう。最近のGoogle翻訳は、技術的な英語もかなりの精度で翻訳してくれます。

**前ページ**: [PHPとフレームワークは分けて学ぶ]
**次ページ**: [必要になったら、必要なところだけ勉強する]

[PHPの効率的な学習法]: /suin/items/edb067f2e5df713e966d

[学びのガイドライン]: /suin/items/edb067f2e5df713e966d#学びのガイドライン
[知らないことを放置しない]: /suin/items/ef5b0ba6392f01c54466
[正しいところにお金を使う]: /suin/items/802aed54852480c53f17
[技術に対する「愛」を持つ]: /suin/items/425fdb14f054722011bd
[PHPとフレームワークは分けて学ぶ]: /suin/items/fb85f760343b836b09b9
[必要になったら、必要なところだけ勉強する]: /suin/items/d15411c8d7a48219b3f5

[受講して学ぶ]: /suin/items/edb067f2e5df713e966d#受講して学ぶ

[『絶対に挫折させないアプリ開発　はじめてのLaravel』]: https://plumsa.booth.pm/items/1048008
[『パーフェクトPHP』]: https://amzn.to/2PHt4Pt
[『PHP中級者を目指す 〜言語を使いこなすための本〜』]: https://amzn.to/2zhoddu
[『独習PHP 第3版』]: https://amzn.to/2QXEYkW
[『プログラミングPHP 第3版』]: https://amzn.to/2QXI5cq
[『初めてのPHP』]: https://amzn.to/2QXIOua
[『いちばんやさしいPHPの教本 人気講師が教える実践Webプログラミング 』]: https://amzn.to/2zuiZvb
[『体系的に学ぶ 安全なWebアプリケーションの作り方 第2版 脆弱性が生まれる原理と対策の実践』]: https://amzn.to/2ScNKvz
[『現場で役立つシステム設計の原則』]: https://amzn.to/2SeHIuC
[『Clean Code アジャイルソフトウェア達人の技』]: https://amzn.to/2Rj4l0z
[『リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック』]: https://amzn.to/2Rnbq0s
[『CODE COMPLETE 第2版 上 完全なプログラミングを目指して』]: https://amzn.to/2zrt63I
[『CODE COMPLETE 第2版 下 完全なプログラミングを目指して』]: https://amzn.to/2DYmJsN
[『PHPフレームワーク Laravel入門』]: https://amzn.to/2zx9Ge2
[『Laravelエキスパート養成読本』]: https://amzn.to/2Q1Lzyt

[YYPHP]: https://yyphp.connpass.com
PHPとフレームワークは分けて学ぶ

[PHPの効率的な学習法] » [学びのガイドライン] » **PHPとフレームワークは分けて学ぶ**

PHPを学ぶ以上は、何か作るべきものがあるはずです。それを実現するためには、PHPだけでなくLaravelのようなフレームワークや、MySQLのようなデータベースとSQL、HTMLやCSSなど様々な技術を同時進行で学んでいるはずです。

実践的な入門書や職場での教育は、何かを作れるようになることを目標に書かれていたり教えられたりします。そのため、PHPの機能なのかフレームワークの機能なのか分からないまま学習進んでいきます。

そうなると、プログラミングしていて、疑問が出たときにそれがPHPについて調べたらいいのか、フレームワークについて調べたらいいのかわからなくなってしまいます。
PHPはウェブアプリを作るための言語なので、ウェブの他技術と切り離して情報収集することは簡単ではありませんが、できるだけPHPとフレームワークなどの技術の境界線を意識して学んでいくことも重要です。

PHPとLaravelを同時に学ぶのであれば[『絶対に挫折させないアプリ開発　はじめてのLaravel』]がおすすめです。本書ではToDoリストを三度開発するチュートリアルがありますが、一度目はフレームワークを使わずに、二度目は同じアプリをLaravelを使って作り直します。

### まずはPHPをマスターしてから、フレームワークを勉強したほうがいいですか？

PHPそのものをしっかり学ぶことはもちろん大事です。しかし、最近の開発現場はフレームワークを使っているところが多いです。PHPだけ知っていても、実践的なコードを書けないことがあります。

PHPをマスターしてから、フレームワークを勉強するよりは、どちらも平行して勉強していったほうが現実的でしょう。その際には、フレームワークが入っていないPHPだけの環境(ApacheとPHPだけ入ったXAMPPなど)を用意し、PHPはPHPとして勉強できるようにしておくと良いです。

### PHPの言語仕様を把握する

PHPそのものを勉強するときにオススメの書籍は、PHPについて網羅的に書かれている[『独習PHP 第3版』]です。脱初心者向けとしては、[『PHP中級者を目指す 〜言語を使いこなすための本〜』]がPHP7系の言語仕様を詳しく書いてあるのでおすすめです。

**前ページ**: [技術に対する「愛」を持つ]
**次ページ**: [情報収集源に英語を加える]

[PHPの効率的な学習法]: /suin/items/edb067f2e5df713e966d

[学びのガイドライン]: /suin/items/edb067f2e5df713e966d#学びのガイドライン
[知らないことを放置しない]: /suin/items/ef5b0ba6392f01c54466
[正しいところにお金を使う]: /suin/items/802aed54852480c53f17
[技術に対する「愛」を持つ]: /suin/items/425fdb14f054722011bd
[情報収集源に英語を加える]: /suin/items/b713631fe5ea4dc54b44

[受講して学ぶ]: /suin/items/edb067f2e5df713e966d#受講して学ぶ

[『絶対に挫折させないアプリ開発　はじめてのLaravel』]: https://plumsa.booth.pm/items/1048008
[『パーフェクトPHP』]: https://amzn.to/2PHt4Pt
[『PHP中級者を目指す 〜言語を使いこなすための本〜』]: https://amzn.to/2zhoddu
[『独習PHP 第3版』]: https://amzn.to/2QXEYkW
[『プログラミングPHP 第3版』]: https://amzn.to/2QXI5cq
[『初めてのPHP』]: https://amzn.to/2QXIOua
[『いちばんやさしいPHPの教本 人気講師が教える実践Webプログラミング 』]: https://amzn.to/2zuiZvb
[『体系的に学ぶ 安全なWebアプリケーションの作り方 第2版 脆弱性が生まれる原理と対策の実践』]: https://amzn.to/2ScNKvz
[『現場で役立つシステム設計の原則』]: https://amzn.to/2SeHIuC
[『Clean Code アジャイルソフトウェア達人の技』]: https://amzn.to/2Rj4l0z
[『リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック』]: https://amzn.to/2Rnbq0s
[『CODE COMPLETE 第2版 上 完全なプログラミングを目指して』]: https://amzn.to/2zrt63I
[『CODE COMPLETE 第2版 下 完全なプログラミングを目指して』]: https://amzn.to/2DYmJsN
[『PHPフレームワーク Laravel入門』]: https://amzn.to/2zx9Ge2
[『Laravelエキスパート養成読本』]: https://amzn.to/2Q1Lzyt

[YYPHP]: https://yyphp.connpass.com
Twigで開発していた困ったところまとめ

最近、フレームワークを使っていない環境で、Twigを使う機会があったのですが、
わからない事も多く、その上日本語の解説ページがなくて詰まる場面がありました。

そのため、自分への備忘録も兼ねて、記事にまとめておきたいと思います。

#共通テンプレートを読み込み時のパス指定
共通テンプレートを作成して、別画面で読み込み時は`{% include 'テンプレート名' %}`を使うのですが、
テンプレート名に以下のような相対パスや絶対パスを指定するとエラーになってしまいます。

```html:エラーになる例
{% include '/path/to/common_templates/sample.twig' %}
```

正しく読み込むには、Twigの組み込みローダーを呼び出した後に、
`addPath`に共通テンプレートのパスを渡す必要があります。

```php:呼び出し元PHP
$loader = new Twig_Loader_Filesystem('/path/to/templates');
$twig = new Twig_Environment($loader, array(
    'cache' => '/path/to/compilation_cache',
));
$twig->addPath(/path/to/common_templates/);
```

```html:画面
{% include 'sample.twig' %}
```

`addPath`の第2引数に名前空間も指定する事ができます。

```php:呼び出し元PHP
$twig->addPath(/path/to/common_templates/, 'common_templates');
```

```html:画面
{% include '@common_templates/sample.twig' %}
```

#配列のキー名を動的に生成して値を取得する

以下のようなキー名に数字の連番が含まれる配列データを、
画面にrenderしていて、その配列の値を、キー値を動的に生成して取得したい場合、
以下のようにすれば取得ができます。


```php:呼び出し元PHP
$data = [
  'sample_1' => '1',
  'sample_2' => '2',
  'sample_3' => '3',
];

$loader = new Twig_Loader_Filesystem('/path/to/templates');
$twig = new Twig_Environment($loader, array(
    'cache' => '/path/to/compilation_cache',
));
$twig->render('sample.html', $data);

```

```html:sample.html
<select name="sample_select">
   {% for index in 1..data|length %}
      {% set data_index = "sample_" ~ index %}
      <option value="{{attribute(data, data_index)}}">{{attribute(data, data_index)}}</option>
   {% endfor %}
</select>
```


#自作フィルターを読み込み
Twigで用意されているフィルターではなく、自作フィルターを読み込みたい場合、
Twigの組み込みローダーを呼び出した後に、`Twig_Filter`クラスにフィルター名と
実行したファンクションを引数に渡してあげて、生成されたオブジェクトを`addFilter`に渡してあげる必要があります。

```php:呼び出し元PHP
$loader = new Twig_Loader_Filesystem('/path/to/templates');
$twig = new Twig_Environment($loader, array(
    'cache' => '/path/to/compilation_cache',
));
$filter = new Twig_Filter('フィルター名', 'ファンクション');
$twig->addFilter($filter);
```

画面側では通常のフィルターと同じ使い方が出来るようになります。

```html:画面
{{処理したいデータ|フィルター名}}
```

また、`Twig_Filter`クラスの引数にはクラスを指定することもできます。

```php:クラスを指定する場合
$filter = new Twig_Filter('フィルター名', ['クラスオブジェクト', 'ファンクション']);
```

私が開発した環境では自作フィルター用のクラスを作成して、
そのクラスからフィルターを読み込むようにしました。

```php:CustomFilter.class.php
<?php

class CustomFilter
{
   private $customFilterList = [
       'customFilter' => 'customFunction',
   ];

    public function getCustomFilterList(): array
    {
        return $this->customFilterList;
    }

   public function customFunction(string $string): string
   {
       $result = $string . 'CustomFilter';
       return $result;
   }
}
```

```php:呼び出し元PHP

$customFilter = new CustomFilter();
$loader = new Twig_Loader_Filesystem('/path/to/templates');
$twig = new Twig_Environment($loader, array(
    'cache' => '/path/to/compilation_cache',
));

$customFilterList = $customFilter->getCustomFilterList();
foreach ($customFilterList as $filterName => $functionName) {
      $filter = new Twig_Filter($filterName, [$customFilter, $functionName]);
      $this->twig->addFilter($filter);
}
```

```html:画面
{{処理したいデータ|customFilter}}
```

#まとめ

今後もTwigを使っていくと思うので、
この備忘録を更新していけたらと思います。

Twigを使いはじめて日が浅いので、
間違いや、こうしたほうが良いんじゃないかといった意見がありましたら、
ご指摘していただけましたら嬉しいです。
技術に対する「愛」を持つ

[PHPの効率的な学習法] » [学びのガイドライン] » **技術に対する「愛」を持つ**

技術に対して愛着を持つことも、学習を促進する起爆剤になりうります。職人が自分の工具を大事に扱うように、プログラマも好きなプログラミング言語やフレームワークを持っている人がいます。愛着があると、意識せずとももっとよく知りたい気持ちが湧いてくるものです。

**前ページ**: [正しいところにお金を使う]
**次ページ**: [PHPとフレームワークは分けて学ぶ]

[PHPの効率的な学習法]: /suin/items/edb067f2e5df713e966d

[学びのガイドライン]: /suin/items/edb067f2e5df713e966d#学びのガイドライン
[知らないことを放置しない]: /suin/items/ef5b0ba6392f01c54466
[正しいところにお金を使う]: /suin/items/802aed54852480c53f17
[PHPとフレームワークは分けて学ぶ]: /suin/items/fb85f760343b836b09b9

[受講して学ぶ]: /suin/items/edb067f2e5df713e966d#受講して学ぶ
google-home-notifierでError: get key failed from googleの対処(2018.12.1版)

# 事象
google-home-notifierでGoogle Homeを喋らせている際、以下エラーで弾かれる。
Google TTSの仕様変更が入り、Google Translate APIのバージョンが0.0.4に上がっていた。
参考URL: https://github.com/zlargon/google-tts/blob/master/CHANGELOG.md

```
Error: get key failed from google
    at /google-home/node_modules/google-tts-api/lib/key.js:23:23
    at process.internalTickCallback (internal/process/next_tick.js:77:7)
```

# 解決策
以下URLを参考にしてgoogle-tts-apiを0.0.4にアップデート。
参考URL: https://github.com/zlargon/google-tts/issues/22

```json:node_modules/google-home-notifier/package.json
  "dependencies": {
    "body-parser": "^1.15.2",
    "castv2-client": "^1.1.2",
    "express": "^4.14.0",
    "google-tts-api": "0.0.4", //ここを0.0.4に変更
    "mdns": "^2.3.3",
    "ngrok": "^2.2.4"
  },
```
```
cd node_modules/google-home-notifier
npm update google-tts-api
```
正しいところにお金を使う

[PHPの効率的な学習法] » [学びのガイドライン] » **正しいところにお金を使う**

技術力はある程度お金で買うことができます。インターネットがあるので、公開されている無償の情報の中から学んでいくことも可能です。無償の情報の多くは断片的なので、自分自身でバラバラの情報の中から関連性のあるものを取捨選択していかなければなりません。

一方で、技術書を買ってしまえば、もっと近道をして知識を得ることができます。書籍は体系的に編集されているため、自分でやらなければならなかった情報の整理の手間を省くことができます。

技術書の値段を見てしまうと、高くて手が出せないと感じるかもしれませんが、あなたの時間も無料ではないはずです。その書物に書かれていることと同等の情報を自力で集めるとしたら何円の時間的コストが消費されるでしょうか。あなたの時給x情報収集にかかる時間で求められます。

お金をかける先は書籍以外にも、オンライン講座を受講する方法もあります。詳しくは[受講して学ぶ]のセクションを御覧ください。

**前ページ**: [知らないことを放置しない]
**次ページ**: [技術に対する「愛」を持つ]

[PHPの効率的な学習法]: /suin/items/edb067f2e5df713e966d

[学びのガイドライン]: /suin/items/edb067f2e5df713e966d#学びのガイドライン
[知らないことを放置しない]: /suin/items/ef5b0ba6392f01c54466
[技術に対する「愛」を持つ]: /suin/items/425fdb14f054722011bd

[受講して学ぶ]: /suin/items/edb067f2e5df713e966d#受講して学ぶ
Scalaで日付を丸めたいときのサンプルコード

## 概要
Scalaで日付を扱う際に、丸めを行いたいときのサンプルコードです。丸目とは例えば日付単位であれば、12月1日の1時1分1秒を、12月1日の0時0分0秒にしたいときのことを指します。

## 方法
JavaのライブラリであるJoda-Timeを使用して丸目をおこないます。Javaでの対応は@rubytomato@githubさんの[Joda-Timeを使った日付処理まとめ](https://qiita.com/rubytomato@github/items/a9abb4f766e905c0c227)のroundの項にありますので、Scalaでも同様の方法で実装します。
ScalaではJoda-Timeをラッパーした「nscala-time」というライブラリがあるので、nscala-timeを使用します。（nscala-timeの詳細は@yhidaiさんの[nscala-timeで学ぶImplicit Conversion](https://qiita.com/yhidai/items/c7248201328827299d90)を参照）

## サンプルコード

```NscalaTest.scala
import com.github.nscala_time.time.Imports._

object NscalaTest{
  def main() = {
    // (1)現在時刻
    println(DateTime.now)
    // (2)minute以降を切り捨て
    println(DateTime.now.hour.roundFloor)
    // (3)hour以降を切り捨て
    println(DateTime.now.day.roundFloor)
  }
}
```
現在日時が2018/12/1 01:05:41の場合の、(1)～(3)の結果は以下の通りとなります。

```
// (1)
2018-12-01T01:05:41.788+09:00
// (2)
2018-12-01T01:00:00.000+09:00
// (3)
2018-12-01T00:00:00.000+09:00
```
知らないことを放置しない

[PHPの効率的な学習法] » [学びのガイドライン] » **知らないことを放置しない**

分からないことが出てきたときに、その疑問を放置しないようにすることが習慣になっていると、目まぐるしいスピードで学習していけるようになります。

例えば、同僚が話していて知らない言葉が出てきたら、すぐにGoogleで検索すると良いでしょう。検索ワードをフォームに入力して送信するくらいはそんな手間ではないはずです。

もし、話していて知らない単語が出てきたら「それってなんですか？」と質問するのも良いでしょう。せっかく目の前に知っている人がいるわけだから学ぶには絶好の機会です。聞くは一時の恥聞かぬは一生の恥と言われるように、知らないことを放置しないことが大切です。

**前ページ**: [学びのガイドライン]
**次ページ**: [正しいところにお金を使う]

[PHPの効率的な学習法]: /suin/items/edb067f2e5df713e966d
[学びのガイドライン]: /suin/items/edb067f2e5df713e966d#学びのガイドライン
[正しいところにお金を使う]: /suin/items/802aed54852480c53f17
GoogleBigQueryで強引に売上の着地見込みを集計する

#### 目的
 - GoogleBigQueryで強引に売上の着地見込みを集計します。非エンジニア向けです。
 - もっとスマートな書き方もあるはずなので、エンジニアのみなさんお手すきでレビューください。
 - toBなら土日のユーザー数は減りますし、toCなら増えるので、ちゃんとやるなら土日とかを考慮すべきだと思います。


#### Query

```sql
SELECT
    month,
    DATE_DIFF(last_day_of_month,last_date, DAY) as remaining_days/*当月残日数*/,
    passing_days/*経過日数*/,
    revenue/passing_days as ad_revenue_per_day/*1日あたりの売上*/,
    ROUND(revenue+((revenue/passing_days)*(DATE_DIFF(last_day_of_month,DATE_SUB(CURRENT_DATE(), INTERVAL 0 DAY), DAY)))) as landing_forecast /*着地見込み*/
FROM
	(
	SELECT
	    CONCAT(SUBSTR(CAST(dt as string),1,7),"-01") as month,
	    COUNT(distinct CAST(dt as date)) as passing_days /*経過日数*/,
	    cast(FORMAT_DATE('%Y-%m-%d',  DATE_ADD(DATE_ADD(DATE_TRUNC(CURRENT_DATE("Asia/Tokyo"), MONTH), INTERVAL 1 MONTH), INTERVAL -1 DAY)) as DATE)as last_day_of_month /*月末日*/,
	    cast(max(CAST(_PARTITIONTIME as date))as date) as last_date /*レポート最終日*/,
	    SUM(revenue) as revenue
	FROM `revenue`
	WHERE CONCAT(SUBSTR(CAST(dt as string),1,7),"-01") = CONCAT(SUBSTR(CAST(CURRENT_DATE() as string),1,7),"-01") /*当月*/
	GROUP BY
	    month,
	    last_day_of_month
	)
```

#### 考え方
①　集計当月のyyyy/MM/ddの売上
②　1日あたりの売上（①÷経過日数）
③　月末までの残日数
④　①+（②*③）= 着地見込み


 - 1日あたりの売上を求める

```
revenue/COUNT(distinct CAST(dt as date)) as ad_revenue_per_day/*1日あたりの売上*/
```
 - 月末の日付を求める

```
cast(FORMAT_DATE('%Y-%m-%d',  DATE_ADD(DATE_ADD(DATE_TRUNC(CURRENT_DATE("Asia/Tokyo"), MONTH), INTERVAL 1 MONTH), INTERVAL -1 DAY)) as DATE)as last_day_of_month /*月末日*/
```
始まるよ、Diverse Advent Calendar！！

MacOSを利用しているあなたは、何も考えずに以下のコマンドを実行してほしい。[^1]

```
gem install osxdsp
brew install sox
```

次に以下のプログラムを作って欲しい。

```rb:sound.rb
BaseRate = 4000
Freq = 440.0

C=3
D=5
E=7
F=8
G=10
A=12
B=14

def play(sounds, rate)
  data = []

  sounds.each do |scale|
    (0..1).step(1.0 / rate) do |t|
      value = Math.sin(2 * Math::PI * Freq * 2**(scale / 12.0) * t)
      data << 128 + (value * 60).round
    end
  end

  open("/dev/dsp","wb") do |io|
    io.puts(data.pack("C*"))
  end
end

play [B,G,A], BaseRate
play [D+12], BaseRate*2
sleep 1
play [D,A,B], BaseRate
play [G+12], BaseRate*2
```

オーディオはONにして、以下のコマンドを実行してみよう。[^2]

```
ruby -rosxdsp sound.rb
```

さぁ、どうだろう？
始まりを感じることが出来たかな？？？

[^1]: Linuxの人は何もしなくても大丈夫なはず、Windowsの人はよくわかりません！
[^2]: Linuxの人は`-rosxdsp`の引数が不要です。
【ログ】勉強

エフェクターウェーブを使ったインスタンスまでやりました。
22/52　だんだん難しくなってきた！


・クォータニオン
サイズが小さい（回転行列よりも少ない数で表せる）
ジンバルロックが起きない
補間が容易

オイラー角


ジンバルロック

機体の回転によって3つのジンバルリングのうち2つの軸が同一平面上にそろってしまう
誰も教えてくれない、サービスを終了する技術〜 SPA で作ったサービスを閉じる時にやるべきこと 〜

ランサーズアドベントカレンダー1日目の @numanomanu です。 [Lancers](https://qiita.com/organizations/lancers) という会社で [サービスリード](https://note.mu/lancerspr/n/n7409c2dbd451) をしています。
pook というスキルシェアのサービスを運営しておりましたが、この度終了することになった為、 SPA でつくったサービスを終了する方法をまとめました。
なかなか調べてもサービスの終了方法は見つからなかったので、その知見をシェアできればと思い、投稿しました。

### 前提
- [React Redux の SPA を運用して得られた知見と実装例、開発フローもあるよ！](https://qiita.com/numanomanu/items/af97312f34cf1388cee6) という記事で紹介したような技術スタックです。
- React で作った SPA を AWS の S3 でホスティングしつつ、API サーバーは EC2 に Rails で作っている構成です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/26095/63dd78a8-e444-3612-b837-b9bc3e28d0e1.png)

### 早速、サービスを終了する手順
1. S3 でホスティングしていた index.html を終了ページ用に書き換える。

以上です。





![image.png](https://qiita-image-store.s3.amazonaws.com/0/26095/2ff963b1-e8fc-15a0-3fb1-ccc3e31f6e91.png)


### まとめ
- SPA で作ると index.html しか実体がないので、終了ページに差し替えるだけで作業はほぼ終了しました。
- いろいろ期待された方、申し訳ございませんでした。技術的な部分は本当にこれだけでした。。。
- SPA で作ると、終了するのもコストが掛からないというメリットがあるようです。
- サービスを作るのはとても時間がかかりましたが、終了するのは一瞬でした。

明日は弊社 SRE のあだちんによる[
ランサーズの分析基盤(capybara)と運用について紹介](https://engineer.blog.lancers.jp/2018/12/lancers-capybara/)
の記事です。乞うご期待！

### おまけ
- 実際の構成はこんな感じになっており、S3 とクラウドフロントの構成です。
- EC2 の API サーバーは別になっており、そこを AWS の管理画面からポチッと消すという作業もあります。
- 終了後も終了ページを S3 で運用できるので、コストもおさえることができます。

終了前|終了後　index.html を書き換えて、js ファイルを削除
---|----
![image.png](https://qiita-image-store.s3.amazonaws.com/0/26095/edf178d8-ca26-6674-0bcf-4336b1591047.png)|![image.png](https://qiita-image-store.s3.amazonaws.com/0/26095/133f1808-0740-8d1a-6406-fecb8046e3b2.png)

### おまけ２

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">サービスリードとして、プロダクトでなんともできない仕組みについては、ユーザーに直接電話してお伝えするという業務を行っている。<br><br>とてもやり切り感がある。<br><br>(pook のサービスが終了するので、報酬があるのに振込申請してくれてない方に、振込先の銀行口座教えてくださいという架電ナウ。)</p>&mdash; numa🏅さすらいのライターエンジニア@Lancers, inc. (@numanomanu) <a href="https://twitter.com/numanomanu/status/1068373292300423170?ref_src=twsrc%5Etfw">2018年11月30日</a></blockquote>

- 技術的な部分以外では、こういう地味な取り組みなどをおこなってました。
- 使っていただいた皆さん！ありがとうございました！
既存のAngularプロジェクトにJestを導入する方法

先日[bitbank LT Night](https://bitbank.connpass.com/event/103649/)で発表をきいてからJestの単体テストに興味津々になったのでJestを入れてみました。あっちを見たりこっちを見たりしたので備忘を兼ねて手順をまとめてみます。淡々と自分の行った手順をまとめていきます。

参考にしたあっちやこっちは以下のとおりです。
- [Azure DevOpsでAngularのJestテストのCIをまわせるか試してみた](http://takasdev.hatenablog.com/entry/2018/11/11/212534)
- [Unit testing Angular applications with Jest](https://izifortune.com/unit-testing-angular-applications-with-jest/)
- [@jest-preset-angularのレポジトリ](https://github.com/thymikee/jest-preset-angular)
- [Angular 6: “ng test” with Jest in 3 minutes](https://codeburst.io/angular-6-ng-test-with-jest-in-3-minutes-b1fe5ed3417c)

[jest-schematic](https://github.com/briebug/jest-schematic)を利用して```ng add @briebug/jest-schematic```でも導入できるのですが、私の場合jasmineを消してしまいたくなかったのでこの方法を使いました。

# 1. 必要なパッケージのインストール
```npm i -D @types/jest jest jest-preset-angular```
# 2. package.jsonの修正
```
"scripts": {
    "ng": "ng",
    "start": "ng serve",
    "build": "ng build",
    "lint": "ng lint",
    "e2e": "ng e2e",
    "test": "jest",
    "test:watch": "jest --watch"
  },
  "jest": {
    "preset": "jest-preset-angular",
    "setupTestFrameworkScriptFile": "<rootDir>/src/jest.ts"
  }
```
私の場合はtestを書き換えてtest:watchとjest以下を足しました。setupTestFrameworkScriptFileはこのあと作成するファイルの置き場を書いているだけなので指定と違う場所におきたかったら適宜編集すればOKです。

# 3. jest.tsを作成する
```
import 'jest-preset-angular';  
import './jest-global-mocks';  
```
以上の内容を記載したjest.tsを作ります。ファイル名は2で指定したものと同じであればなんでも大丈夫です。今回はjest.tsにします。

# 4. jest-global-mocks.tsを作成する
こちらは特別中身を触りたいとき以外は公式の例をコピっておけば大丈夫とのことなので最初にインストールした[@jest-preset-angularのレポジトリ](https://github.com/thymikee/jest-preset-angular/blob/master/example/src/jestGlobalMocks.ts)にあるjestGlobalMocks.tsの中身をそのまま持ってきてはります。特に設定を触っていない限りjest.tsと同じディレクトリに作ります。

# 5. tsconfig.spec.jsonを編集する
(おそらく大概の場合)すでにtsconfig.spec.jsonが存在するのでその内容を書き換えるだけで良いです。

```
  "extends": "../tsconfig.json",
  "compilerOptions": {
    "outDir": "../out-tsc/spec",
    "baseUrl": "./",
    "module": "commonjs",
    "target": "es5",
    "types": [
      "jest",
      "node"
    ]
  },
  "include": [
    "**/*.spec.ts",
    "**/*.d.ts"
  ]
```
私が書き換えたのはtypesのjasmineをjestに変えたくらいだったと思います。tsconfig.spec.jsonが見つからないよ！と言われてしまった場合は[@jest-preset-angularのREADMEのExposed Configuration](https://github.com/thymikee/jest-preset-angular#exposed-configuration)にあるようにpackage.jsonの"jest"以下に

```
"globals": {
    "ts-jest": {
      "tsConfigFile": "src/tsconfig.spec.json"
    },
    "__TRANSFORM_HTML__": true
  },
```
を追加し、tsConfigFileのところを実際のパスに合わせてあげれば大丈夫です。他に設定を触りたい場合もここを参考にすると良いと思います。

ここまでで、```npm test```を実行するとjestが走るようになっているはずです。

# 6. angular.jsonを編集する
私の場合、このあと変更をpushしたときに"ng test"がコケるという理由でパイプラインがfailになったのでangular.jsonを編集する必要がありました。
angular.jsonの"projects">"project-name">"architect">"test">"builder"がデフォルトでは
```@angular-devkit/build-angular:karma
```になっているので
```"builder": "@angular-builders/jest:run"
```に書き換えます。
このあと確認で"ng test"を走らせたところ、```@angular-builders```がないよ！といわれたので```npm i -D @angular-builders```しました。これで"ng test"でもJestが走るようになり、無事導入完了です！
サクサクとテストが実行できます:hatching_chick:
SVG で遊ぶのに Vue.js を利用する

この記事は [Vue.js Advent Calendar 2018](https://qiita.com/advent-calendar/2018/vuejs) の 1 日目の記事です。

SVG 初心者が SVG で遊んでいる記録です。
Vue を使うことで状態管理が簡単にでき、SVG を書くことに集中できました。

![vue-svg.gif](https://qiita-image-store.s3.amazonaws.com/0/62259/c05980fc-e5fe-bbb6-c1b6-127141cf1143.gif)

- [こちらから実際に触れます https://akifo.github.io/vue-svg-text/](https://akifo.github.io/vue-svg-text/)
- [GitHubリポジトリ（動かなかったらごめんなさい..） https://github.com/akifo/vue-svg-text](https://github.com/akifo/vue-svg-text)

## 背景
アドベントカレンダー初日の枠を確保し、SVG で2018 年 Vue カレンダーを盛り上げるぞ！と思っていたのですが、未完成のため、Vue に関する情報はサクっと軽めに記載させていただきます。

以下、GitHub にあるコードとは異なりますが、元となる考え方を少し記録しておきます。

## `<polygon>` の `points` を配列から文字列に

`<polygon>` で正方形を指定するには次のように `"0,0 100,0 100,100 0,100"` と書きます。

```html
<polygon points="0,0 100,0 100,100 0,100"></polygon>
```

`points` を Vue で操作できるようにするため、次のように書き換えます。

```vue
<polygon :points="points"></polygon>
```

この `points` を JavaScript で文字列として保持させますが、元のデータ（`pointsArray`）は配列として保持しています。将来的にポイントを増やしたり変更したりできるようにするのが目的で配列にしています。

配列の `pointsArray` から、文字列の `points` へ良い感じに変換しています。


```js
  data() {
    return {
      pointsArray: [[0, 0], [100, 0], [100, 100], [0, 100]],
    }
  },
  computed: {
    points() {
      return this.pointsArray.join(' ') // "0,0 100,0 100,100 0,100"
    }
  }
```

これで、ポイントを増やす時は `pointsArray` を操作すれば自動的に `points` も変更され、良い感じになりました。

## SVG の `<text>` の再描画がうまくいかない問題

msg というデータが存在し、次のように SVG でレンダリングしようとしている場合、`msg` の変更時に再描画されないという問題がありました。

```html
<text>{{ msg }}</text>
```

この問題を解決するために、watch を利用し `msg` 変更時に、空の文字列を一度代入しています。

```html
<text>{{ text }}</text>
```

```js
  watch: {
    msg(val) {
      this.text = ''
      this.$nextTick(() => {
        this.text = val
      })
    }
  }
```

## 今後の更新予定


- リファクタし、GitHub Qiita にアップする
- $emit と Vuex の使いわけ
- Vuex: getters を使う時に state にあるデータを書き換えない書き方
- SVG の知見まとめる `<linearGradient>` `<pattern>` `<mask>` `<clipPath>` etc
- ロゴを作って PNG 画像としてダウンロード可能なところまでコードを書く

## ライセンスについて
まだ、どのライセンスにするか決めていませんが、これから素材サービスを利用してテクスチャを追加しようと考えているので、それにあわせたライセンスになると思います。
【iOS】アプリアップデートのテスト方法

５度目の投稿です。社会人になって初めての冬が訪れようとしています。
最近ほんとに寒くなってきたので家から出たくありません。ので、引きこもって、いっぱい記事書こうね。

# 本題です。
皆さんはアプリのバージョンアップ時、ちゃんとアップデートのテストをしていますでしょうか？当たり前じゃん、ていう方、ちゃんと正しい方法で行えていますでしょうか？

自分はiOSアプリの開発をやり始めた当初は、
`古いバージョンのアプリが入ったデバイスを用意 -> xcodeから実機でrun`
で、アップデートと同じ挙動を再現できると思っていました。

しかし、[appleのデベロッパーサイト](https://developer.apple.com/library/archive/technotes/tn2285/_index.html)には、
>Xcodeのアプリインストールプロセスは開発のために最適化されていますが、iTunesやApp Storeのアプリケーションのインストール方法とは少し異なります。

とあります。

具体的には、

- .appバンドル内に、App Storeのアップデート後には存在しないはずの"frankenbuild"が作成される。
- アップグレードに時間がかかりすぎると発生するはずの"watchdog crashes"が隠されてしまう。

などの問題が起こりうるとのこと。（frankenbuild...？watchdog crashes...？）
とにかく、xcodeからのインストールによるアップデートの再現は、テストのやり方としては完璧ではないらしい。。

ということで今回は、正しいアプリアップデートのテストのやり方についてのお話です。（内部テスト向けのお話です）


# 古いやり方（前置き）
[昔のappleのデベロッパーサイト](https://developer.apple.com/library/archive/technotes/tn2285/_index.html)にはiTunesを利用したアップデートのやり方が記載されています。しかし、**最新バージョンのiTunesではこの方法は使用することができなくなっています。**
### 1. ビルドをアーカイブ
xcodeでプロジェクトを開き、メニューから`Product -> Archive`と選択。アーカイブが作成され、Organizerウィンドウが開きます。
### ２. ipaファイルの作成
Organizerウィンドウで先ほど作成したアーカイブを選択し、`Distribute App`を押します。
"Ad Hoc"を選択し"Next" 、その後適切な項目入力して"Next"、最後に"Export"でipaファイルが作成されます。
### ~~3.iTunesを使って実機にインストール~~
~~先ほどexportした.ipaファイルをダブルクリックするとiTunesで開かれます。~~
**<- 最新のiTunes(12.8)では.ipaファイルを開くことはできません！**
iTunes12.7からAppの管理方法が変わり、iTunes上でアプリの管理ができなくなりました。アプリの管理については全て、iOSデバイス上で完結させる仕組みに変更されたのです。ので、現在、以上の方法でのアップデートのテストはできなくなりました。

# 今のやり方
TestFlightを使いましょう。
古いバージョンアプリが入っている端末で、TestFlightによるインストールを行うことでアップデートと同じ挙動を再現できます。
以下具体的なやり方です。

(前提)
- [AppStoreConnect](https://appstoreconnect.apple.com/login)にビルドをアップロード済みであること
- [デベロッパーサイト](https://idmsa.apple.com/IDMSWebAuth/login?appIdKey=891bd3417a7776362562d2197f89480a8547b108fd934911bcbea0110d07f757&path=%2Faccount%2F&rv=1)の[Certificates, Identifiers & Profiles]で、検証端末のUDIDが登録済みであること。


### 1. AppStoreConnectでテスターを登録&アプリ配布
[AppStoreConnect](https://appstoreconnect.apple.com/login)にログインします。`マイApp -> テストを行いたいアプリを選択　-> TestFlightタブ　-> AppStoreConnectユーザ`を選択します。
<img width="1197" alt="スクリーンショット 2018-11-30 17.56.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/277638/4101a2a4-f2a8-7028-4a8b-24ceb13c8985.png">
[AppStoreConnectユーザを追加]ウィンドウが表示されます。AppStoreConnectユーザがリストで表示される（初めはAppStoreConnectにログインしているユーザのみが表示されているはず）ので、適当なテスターを選択します。ここで選択したテスターのメールアドレス宛にテストアプリが配布されることになります。
適当なユーザが登録されていない場合は、ウィンドウ内にある「ユーザと役割」から該当テスターを登録してください。
テスター選択後、追加ボタンを押します。これでテスターの登録が完了です。
この段階で、自動的にテストアプリがメールで対象のテスターのメールアドレス宛に配布されているはずです。
### ２. 検証端末でアップデートテスト
検証端末に「TestFlight」アプリをAppStoreからインストールしておきましょう。また、アップデートのテストを行いたいアプリの古いバージョンをインストールしておきましょう。
さっき登録したテスターのメールアドレス宛にテストアプリが配布されているはずですので、検証端末でそのメールを開きます。（検証端末内のメールアプリでメール受け取れるようにしてると楽です）。メール内の「View in TestFlight」を押すとTestFlightアプリが起動し、アプリをインストールできるようになります。
「Install」を押して、アップデートのテストを行いましょう！

# 結
DeployGateやTestFairyなどでもアップデートと同じ挙動させることは可能ですが、そこには触れませんでした。
アップデートの検証の仕方をGoogole検索すると[昔のappleのデベロッパーサイト](https://developer.apple.com/library/archive/technotes/tn2285/_index.html)で紹介されているやり方が今でも出てくるので、それに騙される人が少しでも減ってくれれば、というのが今回の記事の主旨となっております笑
少しでも誰かのお役に立てれば幸いです。
GitのフックスクリプトでUTF-8BOMチェック(Windows)

Gitのフックスクリプトを使ってコミット時にエンコーディングがUTF-8BOMかどうかチェックして，そうでないならコミット失敗にする方法です．今更な内容ですが，備忘録として残しておきます．

やりたいことは次の３つです．

- チェックする対象を制御できる
- フックスクリプトを他の人の環境と同じにしてバージョン管理下におきたい
- UTF-8 BOM チェック

## チェックする対象を制御できる

`.gitattributes` で制御します．このファイルにチェックするファイルを指定します．

以下を参考にさせてもらいました．

- [git check-attr による Git 属性の活用](http://blog.keshi.org/hogememo/2012/05/10/using-git-check-attr)
- [Git Companion Scripts](http://blog.keshi.org/hogememo/2012/04/22/git-companion-scripts)

私の場合は次のように記述しました．

```
[attr]bomcheck encoding=utf-8,utf-8-bom
*.c bomcheck
*.h bomcheck
*.cpp bomcheck
*.hpp bomcheck
```

特定のフォルダ以下だけを指定したい場合，例えば`source`以下の場合は

```
[attr]bomcheck encoding=utf-8,utf-8-bom
source/*.c bomcheck
source/*.h bomcheck
source/*.cpp bomcheck
source/*.hpp bomcheck
```

サブフォルダ以下も対象にしたい場合は

```
[attr]bomcheck encoding=utf-8,utf-8-bom
source/**/*.c bomcheck
source/**/*.h bomcheck
source/**/*.cpp bomcheck
source/**/*.hpp bomcheck
```

とします．

## フックスクリプトを他の人の環境と同じにしてバージョン管理下におきたい

`custom_hooks` というフォルダを作ってそこにフックスクリプトを入れます．そして，`custom_hooks`フォルダをバージョン管理して，他の人でも取得できるようにします．
次に，フックスクリプトは `.git/hooks` を見にいくのでこれを変更する必要があります．

```
git config core.hooksPath ./custom_hooks
```

一度設定すれば，`custom_hooks` にあるフックスクリプトを更新することで他の人にも反映させることができます．別に`custom_hooks`という名前である必要はありません．

## UTF-8 BOM チェック

以上の設定をもとにフックスクリプトを作成します．Git Bashを使います．

`custom_hooks/pre-commit`

```
#!C:/Program\ Files/Git/usr/bin/sh.exe
 
CHANGED_FILES=$(git diff --cached --name-only --diff-filter=ACM)
FILES=$(echo $CHANGED_FILES | xargs git check-attr encoding | grep 'utf-8-bom' | sed -e 's/: encoding: utf-8,utf-8-bom//')
for FILE in $FILES;  do
  if [[ !  $(file $FILE | grep 'with BOM') ]];  then
    result+=`file $FILE`
  fi
done

if [ -n  "$result" ];  then
  echo  "エンコーディングを UTF-8 BOM に変更してください"
  echo -e "$result"
  exit 1
fi
```

`git diff --cached --name-only --diff-filter=ACM`でコミットファイルを取得し，`git check-attr encoding`で.gitattributesで設定したencodingを取得します．指定していれば，そのencodingが，指定していなければencodingは`unspecified`が得られます．それを`grep 'utf-8-bom'`にしてチェックし，`sed -e 's/: encoding: utf-8,utf-8-bom//'`でファイルの部分だけ取り出します．実際のUTF-8 BOMチェックは`$(file $FILE | grep 'with BOM')`でやっています．
JavaOneはOracle Code Oneになったよ

この記事は[SRA Advent Calendar 2018](http://qiita.com/advent-calendar/2018/sra)の1日目の記事です。

こんにちは！　関西事業部の佐々木です。

## JavaOneはOracleCodeOneになりました
世界最大のJavaのカンファレンスといえばもちろんJavaOneです。
1996年から20年以上続いてきたカンファレンスですが、今年2018年はJavaOneではなくOracle Code Oneという名前になりました。
内容もJavaOneの時に比べJava以外の言語やその他技術などをテーマとしたセッションが増えました。
一応JavaOneの時からJava以外のテーマのセッションも一部ありましたが、ScalaやKotlinなど少しはJavaに関連するものがほとんどです。
私の個人的な印象ですが、JavaScriptに関するセッションが特に増えたように思います。
また、JavaOneは例年5日間だったのがOracle Code One2018では4日間になっていました。
来年のOracle Code One2019も、あるいはその後もずっと4日間となるのかどうかはわかりません。

## 印象に残ったセッション
Oracle Code Oneではたくさんのセッションを聞きましたが、特に印象に残ったセッションは「**Stop Using JSON Web Tokens**」というタイトルのセッションでした。
というのも、仕事でJWT（JSON Web Tokenの略で"ジョット"と発音します）を使うことが多いからです。
最初は「わざと煽ったタイトルをつけたな」と思ったのですが、実際にセッションを聞いてみるとJWTとSession Cookiesを比較してSession Cookiesの方が良い点が多いから、Session Cookiesを使おうという結構マジメな内容でした。
セッションの内容は概ね納得したのですが、やはり改ざんチェックできるJWTにもメリットはあると思っています。
ただ、日本に返ってきてから少し調べてみるとJWTはその規格自体がアンセキュアな状態をもたらすだとかいう情報もあり、JWTの使用についてはもう少し慎重になったほうがいいのかなとも思うようになりました。
また、このセッションの最後には他の選択肢として[PASETO](https://paseto.io/)というものを紹介していました。JWTの欠点を色々解消しているようです。

## 自分に課したミッション
Oracle Code Oneのセッションの話しではないのですが、サンフランシスコに行くにあたって自分に2つのミッションを課しました。

* Amazon.comで買い物する
* 毎日同じバーに行く

「Amazon.comで買い物する」というのは、最近Amazonプライムで良く観ている「The Big Bang Theory」（略してTBBT）というシットコムのBlu-rayを買いたかったのです。TBBTは日本版のDVD／Blu-rayは発売されていなくて、オリジナル版を買おうと思っていました。
「オリジナルのBlu-rayでも日本のアマゾンで買えるんじゃないの？」と思う方もおられるかもしれません。確かにAmazon.co.jpでも売っていますがAmazon.comの価格よりかなり高額です。また、Amazon.comで買って日本に発送してもらうこともできるのですが高い送料や関税がかかり、やはり割高になります。
そこで、せっかくサンフランシスコに行くのだからAmazon.comで買ってホテルに届けてもらえばいいのじゃないかと考えたのです。
まずホテルのスタッフに「Amazonで買い物して届け先をこのホテルにしたいので預かってもらえるか？」と尋ねたら「OK!」と快諾してくれたのですぐに注文しました。
荷物はすぐに届き、無事１つ目のミッションを達成できました。

もう一つの「毎日同じバーに行く」というのは、毎日同じバーに行くことでバーテンダーさんと顔なじみになり、英語で会話を楽しもうという魂胆でした。
ホテルの近くにある「The Douglas Room」というバーがYelp（日本の食べログのようなサイト）でも評価が高く、とりあえずそのバーに行ってみました。するとすごく感じのいいバーで「よし、ここに毎日来よう」と決めました。
それから毎日そのバーに行ったのですが、バーテンダーさんが日替わりで変わるような店だったので顔なじみにはなれませんでした。
もし来年も行くようなことがあれば、今度は最初のうちは複数のバーをはしごして顔なじみになれそうな店の検討をつけてから絞ろうと思います。

以上、Oracle Code One2018参加メモでした。