OmniAICreator/Qiita-1.07M huggingface dataset:
TensorFlow > API > tf.RunOptions(trace_level=tf.RunOptions.FULL_TRACE) / tf.RunMetadata() > 使用例のみ見つかる

```txt:動作確認
Ubuntu 14.04 LTS desktop amd64
GeForce GTX 750 Ti
ASRock Z170M Pro4S [Intel Z170chipset]
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v7.5
Python 2.7.6
IPython 5.1.0 -- An enhanced Interactive Python.
```

TensorFlowというDeep Learning関連コードを学習中。
https://www.tensorflow.org/versions/master/tutorials/mnist/tf/index.html#tensorflow-mechanics-101

以下の部分が気になった。

```mnist_with_summaries.py
...
  for i in range(FLAGS.max_steps):
    if i % 10 == 0:  # Record summaries and test-set accuracy
      summary, acc = sess.run([merged, accuracy], feed_dict=feed_dict(False))
      test_writer.add_summary(summary, i)
      print('Accuracy at step %s: %s' % (i, acc))
    else:  # Record train set summaries, and train
      if i % 100 == 99:  # Record execution stats
        run_options = tf.RunOptions(trace_level=tf.RunOptions.FULL_TRACE)
        run_metadata = tf.RunMetadata()
        summary, _ = sess.run([merged, train_step],
                              feed_dict=feed_dict(True),
                              options=run_options,
                              run_metadata=run_metadata)
...
```

上記において、以下が何をしているのか。
`run_options = tf.RunOptions(trace_level=tf.RunOptions.FULL_TRACE)`
`run_metadata = tf.RunMetadata()`

google検索したが、使用例のみ見つかってAPIの説明は見つからず。

関連ドキュメントなし
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/g3doc/api_docs/python/index.md

使用例
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/client/timeline_test.py

疑問点

- 何をしているのか
- 他にどういう設定を可能なのか

資料を読み進めるうちにわかるのかもしれないが、検索で見つからないのはちょっと残念。
技術英語 > Testing can never completely prove the absense of errors. / ソフトウェア開発に終わりはない。あるのはリリースだけだ。

@ Code Complete (No. 16270 / 36077)

> Testing can never completely prove the absense of errors.

...

> If you want to improve your software, don't just test more; develop better.

@ UNIXという考え方 by Mike Gancarz

> 「そろそろ出荷する時期だ。」ボスは宣言した。

>「し、しかし、まだ終わっていません。あと、２、３日ください。そうすれば・・・」

>「ソフトウェア開発に終わりはない。あるのはリリースだけだ。」
Touch Bar Simulatorを表示する


Apple Special Event. October 2016で発表されたMacBook Proに搭載されるTouch Barですが、
非搭載のMacでもXcodeからシミュレーターを利用できます。

`Window > Show Touch Bar`で表示。

![Screen Shot 2016-10-29 at 6.05.31.png](https://qiita-image-store.s3.amazonaws.com/0/45742/5b7e4770-ad32-a68b-acfa-d703bc5e8ac1.png "Screen Shot 2016-10-29 at 6.05.31.png")

![Screen Shot 2016-10-29 at 6.06.15.png](https://qiita-image-store.s3.amazonaws.com/0/45742/2007ed46-3698-63ef-6e8e-c0047a1c4c4a.png "Screen Shot 2016-10-29 at 6.06.15.png")

## macOS 10.12.1 build 16B2555 では使用できない
ただ現在はMac App Storeから `Xcode 8.1` 及び `macOS 10.12.1 build 16B2555` をインストールするだけでは使用できず、
[https://support.apple.com/kb/dl1897](https://support.apple.com/kb/dl1897)から`macOS 10.12.1 build 12B2657` をダウンロードしてインストールする必要があるそうです。

> Note: To develop apps that use Touch Bar, you must run Xcode 8.1 on macOS 10.12.1 build 12B2657 or later.
If you want to develop for Touch Bar, check your macOS build number using the system's About This Mac dialog.
If you do not have macOS 12B2657 or later,
install the macOS Sierra 10.12.1 Update from https://support.apple.com/kb/dl1897.
If you set your deployment target as 10.12.1, weak-link AppKit.
This is done automatically if you set a deployment target earlier than 10.12.1.

[Xcode 8.1 Release Notes](https://developer.apple.com/library/content/releasenotes/DeveloperTools/RN-Xcode/Introduction.html)より引用

Mac App Storeの `macOS 10.12.1 build 16B2555` が `macOS 10.12.1 build 12B2657 or later` の `or later` に掛かるバージョンだと思いこんでいたのでハマりました・・・
GTC Japan 2016で面白かったセッション

# GTC Japanとは
* NVIDIA主催のGPU利活用イベント
  * 2016/10/5 @ お台場ヒルトンホテル
  * 今年の主要テーマはAI・VR・自動運転
* 午前中が基調講演で、午後がセッション形式

https://www.gputechconf.jp/

# お断り
セッション形式のため、参加しなかったセッションの情報は書けません。あしからず。

# 参加したセッション一覧
* 大規模進化計算による音声認識システム開発の自動化 (2016-1031)
* MPIを用いたDeep Learning処理高速化の提案 (2016-1032)
* 人工知能が放射線科診療を変える (2016-1043)
* 格子ボルツマン法を用いた大規模数値解析による多孔体界面乱流構造の解明 (2016-1034)
* MATLABで始めるGPUコンピューティング (2016-1015)
* デジタルソリューションを活用した新しい建築設計 (2016-1046)
* Iray(アイレイ)で再現する建築VR (2016-1047) 祖先の知恵博物館(フィリピン) http://kkaa.co.jp/works/architecture/museum-of-indigenous-knowledge/

# MATLABで始めるGPUコンピューティング (2016-1015)
太田 英司氏, マスワークス アプリケーションエンジニアリング部・アプリケーションエンジニア

* 簡単
  * MATLABで画像を表示・編集する際に簡単にCUDAを利用できるという話
  * 簡単すぎてバッファ要らず発表時間が余る
  * CUDAライブラリ利用するかどうかは、MATLABの関数引数、CUDA利用フラグで制御する
* メリット
  * 切り替え簡単なので、CPUで試して、GPUに簡単に持っていける

# 人工知能が放射線科診療を変える (2016-1043)
中田 典生氏, 東京慈恵会医科大学 放射線医学講座 准教授 兼 IT戦略室 室長

* 日本の放射線科の事情
  * 人口一人当たりのMRI・CTの数は世界第一位
  * 人口一人当たりの医師数は世界でビリ
* その結果起きていること
  * 撮影した画像データが統計分類しきれない
* 海外で進む読影自動化
  * 楽観的ケースでは20年後にすべての画像診断自動化
  * そんなに上手くいかないかもだけど、最低限は自動化しないとパンクする

* 今後期待している技術革新・進歩
  * 細胞を生かしたまま診断する技術と病理学
  * MRI画像のk-spaceでの直接診断
  * ARの活用
  * 使いやすいUIを持ったアプリ
  * 優秀な画像診断アルゴリズムを取引するためのマーケット

# デジタルソリューションを活用した新しい建築設計 (2016-1046)
名城俊樹氏 / 松長知宏氏, 隈研吾建築都市設計事務所 設計室長 / 主任技師 (Sponsored by 日本HP)

* 設計事例紹介
  * 公共の建物メイン
  * 日本だけでなく世界各地の建物のデザインを手掛ける
  * 日本なら木、中国なら竹など現地調達の素材を生かす設計
  * 長岡市役所
http://kkaa.co.jp/works/architecture/nagaoka-city-hall-aore/  
  * 浅草文化観光センター http://kkaa.co.jp/works/architecture/asakusa-culture-tourist-information-center/
  * 万里の長城 竹屋 http://kkaa.co.jp/works/architecture/great-bamboo-wall/
  * 設計のデジタル化により、GPUレンダリングが必須になっている

* 照明再現
  * 照明の当て方をGPUレンダリングでシミュレートする(再現率すごい
  * 最終的には下から当てるものを選んだ
  * http://kkaa.co.jp/works/architecture/iiyama-cultural-hall/

* 外観再現
  * 素材テクスチャを張り付けて外観をシミュレートする(これも再現率すごい
  * 近くに寄ったり、遠くから見たりを簡単に試せる
  * 素材ごとにテクスチャを用意しておけば、ある程度使いまわしが効く
    * http://kkaa.co.jp/works/architecture/wuxi-vanke/
    * http://kkaa.co.jp/works/architecture/hongkou-soho/

* 組み方再現
  * 複雑な木組みの物件はモデルを組んで、3Dプリンタで出力することもあるとな
  * 梼原 木橋ミュージアム http://kkaa.co.jp/works/architecture/yusuhara-wooden-bridge-museum/
  * GC プロソミュージアム・リサーチセンター http://kkaa.co.jp/works/architecture/prostho-museum-research-center/
  * 太宰府天満宮のスタバ http://kkaa.co.jp/works/architecture/starbucks-coffee-at-dazaifutenmangu-omotesando/
  * サニーヒルズジャパン http://kkaa.co.jp/works/architecture/sunny-hills-japan/
* 寸法再現
  * 大工さんが材料を用意するときに使える(歌舞伎座の再建にて実際に使ったとな)
PHP7で「使える！」と思ったこと

##??演算子 （Null 合体演算子）

値が存在すればその値を、なければ右のオペランドを返す

```php

PHP5↓
isset($hoge) ? $hoge : '';

PHP7↓
$hoge ?? '';
```

##スカラー型を宣言できる

```php

function sumOfInts(int ...$ints)
{
    return array_sum($ints);
}
```
一行目カッコの中の`int`です

##戻り値の型を宣言できる

```php
function arraysSum(array ...$arrays): array
{
    return array_map(function(array $array): int {
        return array_sum($array);
    }, $arrays);
}
```
一行目の一番右の`:array`ってやつです

##参考
http://php.net/manual/ja/migration70.new-features.php
http://www.slideshare.net/hnw/phpcon-kansai20150530

その他にも**無名クラス**や**宇宙船演算子**などありますが、僕があんまし使わなそうだったんで載せません。
どなたか良いユースケースなどありましたら教えてください！
WebGLライブラリ「GLBoost」のご紹介

この記事は[GLBoost Advent Calendar 2016](http://qiita.com/advent-calendar/2016/glboost)の１日目の記事です。

# はじめに

みなさんこんにちは、GLBoost開発者の @emadurandal です。

去年、WebGL Advent Calendar 2015 で [こんな記事](http://qiita.com/emadurandal/items/3e8e336759f079bd2886) を書きました。

それから１年。ゆるふわなノリで始まったWebGLライブラリはどこまで成長したのか。どんな感じのライブラリになっているのか。もし冷やかしに見てみたい人は見にきておいで！　ということでAdvent Calendar作っちゃいました。

日本人って、「もっとちゃんとした状態にならないと恥ずかして外に出せない」とかそういうのあるじゃないですか。
打破したいんです。そういうの。ならまず自分からだよね。ってことで、恥を忍んでやっちゃった次第。

みんなもやるといいよ！

# GLBoostとは

まずはGithubのプロジェクトサイトをご覧ください。

[https://github.com/emadurandal/GLBoost](https://github.com/emadurandal/GLBoost)

![スクリーンショット 2016-10-29 3.48.56.jpg](https://qiita-image-store.s3.amazonaws.com/0/12753/c6d87f3c-5073-cc86-67c3-f1a4e40fd8a7.jpeg "スクリーンショット 2016-10-29 3.48.56.jpg")

　しょっぱなから「このライブラリはまだ開発の最初期段階です。 使い物になる状態になるまで、もうしばらくお待ちください。」なる文があって、これで多くの方に素通りされている感はあるのですがw
　実を言うと機能数とかはまだすごい少ないんですが、ライブラリとして全く体をなしていない使えない状況、というわけではありません。

コンセプトで

*"Convenience like Three.js, Infinite Flexibility like raw WebGL, We get both."*

（日本語訳）*Three.jsのような便利さ、そして生WebGLのような無限の柔軟性。両方取りするぜ！* 

って感じで強気にぶち上げてますね。まぁ実際にできるのか、についてはなかなか大変ですが、目指すところはそこだったりします。

　世にあるWebGLライブラリは、WebGLのローレベルの機能・APIを内部でうまく活用して（隠蔽して）、ユーザーサイドとして本質的に３Dでやりたいことを高級APIを通してできるようにするものが多いです。

　なので、便利なんですけど、その点CG研究者やゲーム開発者がやりたいような、レンダリングのいろんな実験とか、レンダリングパイプラインに介入してガリガリカスタマイズするとか、そういうことはやりにくい設計になっていたりするんですね。

　そこで、GLBoostでは、便利さは狙いつつも、カスタマイズ性・WebGLとしての柔軟性は手放さない、という設計思想で行こうとしています。

# GLBoostでどんなことができるの？

　まずは[公式のサンプルページ](http://gitcdn.xyz/cdn/emadurandal/GLBoost/fb9f4b132829280ed26fce272e72515df9bb7538/examples/index.html)をみてください。これらはデモンストレーションというより、むしろそれぞれの３D機能がちゃんとエラーなく表示できるかのテストページに近いので、派手なものは全くないんですが（汗）

　あとは、GLBoostの熱心なユーザーさんである @cx20 さんの[jsdoページ](http://jsdo.it/search?q=GLBoost&search_order=new)とかですかね。
　
　あとは、私 @emadurandal が作っている3DRPG制作Webサービス「WebRPGTool」では、最初3D実装にThree.jsやBabylon.jsを使っていたんですが、[少し前からGLBoostに切り替えています](https://www.youtube.com/watch?v=383edUtv9M8)。
　
# GLBoostの特徴と現状

サポートされている機能を列挙しますね。

* 頂点データを与えて表示するMeshやGeometryクラス
* カメラクラス
* クラシックなマテリアルクラス（物理ベースにはまだ未対応です）
* スフィアや平面、四角形などのプリミティブクラス
* Objファイルローダー
* glTFファイルローダー（スキニングアニメーションまで対応しています）
* アニメーション機能
* スキニングアニメーション機能
* Phong、Lambert、HalfLambertシェーダー
* ドノーマルなForwardレンダラー（Deferred未対応）
* ドノーマルなシャドウマップもできなくはない

うーん。ちょっとまだお寒い状況ですね。この２０１６年においては。
なので、まだThree.jsのようなメジャーなライブラリには全然比べ物になりません。まだ生暖かく成長を見守って頂くフェーズではあるのですが、それでも恥を忍んで、世に出しちゃうのは結構大事なことだと思うんだ…。

# GLBoostの今後

## 国産2Dゲームライブラリ`phina.js`との連携
　もともとこのGLBoostプロジェクトは、私の友達の @phi さんが作られている2Dゲームライブラリ [phina.js](http://phinajs.com)の3D機能部分として機能するよう、開発を始めた…はずなのですが、いつの間にか単体WebGLライブラリになって今に至る状況です。
　（ただ、すでにphina.jsと疎結合で連携できるようにはなっています）
　
　今後、より深く連携できるように、ということで @phiさんたちと話はしていまして、おそらく今後何か展開があるのではないかな、と思います。
　
## 今後の機能増強について

以下を予定しています。

* PBR（物理ベースレンダリング）対応
* Deferred Shading対応
* もう少しまともなシャドウマップ（影）を
* 処理パフォーマンス向上
* TypeScriptでコード書きなおし
* Low、Middle、Highと３層に設計をレイヤー分けし、好きなレイヤーで開発ができるようにする（別途記事で解説）
* 3Dゲーム開発に便利なよう意識して開発

# 最後に

GLBoost、どんなライブラリなのか。どんな状況なのか。知っていただけましたでしょうか。

まだまだ未熟なライブラリではありますが、これからどう成長していくのか、見守っていただけると幸いです。

本記事はGLBoost Advent Calendar 2016の最初の記事ですが、この後もバンバン記事を公開していきますので、どうぞお付き合いのほどを。
Cocoapodsの導入

# まえがき

この記事では、Cocoapodsの導入、バージョンの更新について、説明します。

## どんな人向けか

- 以前Cocoapodsを入れようとしたが失敗した方
- Cocoapodsのバージョンがよくわからないことになってしまった方
- その他、初めて入れる人以外で上手く導入できない方

# 本題
## 通常のインストール方法
まだCocoapodsをインストールしたことがない方はこちらのコマンドでインストールしましょう

```ruby:Terminal
$ sudo gem install cocoapods
```
## 通常のアップデート方法
まだCocoapodsをインストールしたことがない方は素直にインストールしましょう

```ruby:Terminal
$ sudo gem update cocoapods
```

## 通常インストール、アップデートができなかった場合

以前のバージョンが残っている場合、アップデートに失敗することが多いです。その対策について説明します。　

まずRubyのバージョン問題を回避します。

```ruby:Terminal
$ sudo gem install activesupport -v 4.2.6
```

そしていままでinstallに失敗してきたすべてのCocoapodsを一度全削除しましょう

```ruby:Terminal
$ sudo gem uninstall cocoapods cocoapods-core cocoapods-downloader cocoapods-plugins cocoapods-stats cocoapods-trunk cocoapods-try
```

そして再度Cocoapodsをinstallしましょう。

```ruby:Termianl
$ sudo gem install -n /usr/local/bin cocoapods
```

## インストールが完了したら
正常にインストールが終わるとこう表示されます
![image.png](https://qiita-image-store.s3.amazonaws.com/0/123416/a6a9ae6c-3ca8-8208-c837-67d5d4a088bb.png)

ここまでできたら最後にセットアップして完了です

```ruby:Terminal
$ pod setup
```

`pod setup`は完了するまで時間がかかることがあります。およそ3分〜3０分くらいです。
エラーが出ない限り辛抱強く待ちましょう。

ここでエラーが出たらそのエラーコードをよく読みましょう。
githubに上がっている似たようなエラーの対処法のリンクがあったらそれを見てみましょう。

以上です。
Xamarinでの初androidアプリ作成でハマった３つの点

知人の依頼で、初めてアプリを作成することに。
慣れ親しんだ（といっても使い始めたのはここ１、２年ですが）Visual Studioで作成できるXamarinで開発してみることにしました。
内容は非常にシンプルで１０点ほどの数値データの平均値、標準偏差、相対標準偏差を求めるアプリが欲しいとのこと。
簡単にできそう！と思ったもののいざ取り組んでみると、あちこちで躓いてしまったため、その内容を備忘の意味も含めてまとめておきます。
##ハマりポイントその１
**「ツール→Android→Publish Android」が無い！**
まずはblankモデルをコンパイルしてみることにしました。
visual studio2015でBlank App(Android)を選択して、まずはコンパイル、、、の方法がまずわかりません。
![VSCap1.PNG](https://qiita-image-store.s3.amazonaws.com/0/119667/701a1f3f-1dd3-c1dd-3de8-50d903292de8.png)

色々とＨＰを調べると、例えば[こちらのxlfsoftさんのＨＰ](https://www.xlsoft.com/jp/products/xamarin/publish_android.html "xlsoftさんのＨＰ")等は非常に分かりやすくて参考になったのですが、肝心のPublish Android...というコマンドがツールの中にありませんでした。
かなり長い時間調べ、漸くたどり着いたのが、[こちらのブログ](http://itblogdsi.blog.fc2.com/blog-entry-49.html"ITブログ時々なんでもブログ")。正にドンピシャの内容で非常に助かりました。
ビルドの中に確かにArchiveコマンドありました。更にキーの発行方法まで詳しく解説してあり、この通りの手順で問題なくコンパイル→発行できることが確認できました。
ただ、違うＰＣで確認した時にはツール→Android→Publish Androidが確認できたので、Visual Studio 2015のupdateバージョンか、Xamarinのバージョンで違うのかもしれません。

##ハマりポイントその２
知人の依頼は元々10点ほどのデータに対しての統計計算だったのですが、20点ほどに変更して欲しいという話に。そうなると、画面の中にテキストボックスが収まらなくなってしまいます。なんとかスクロールできるようにしたいなと思ってツールボックスを見ていると、Scrollviewというそのままズバリのツールを発見。早速Designer画面でScrollViewを置いて、Source側で自動生成したコードを、以下のように、コンテンツを丸ごとScrollViewの中に入れ込むような形に変更してみました。

![ScrollViewI.PNG](https://qiita-image-store.s3.amazonaws.com/0/119667/cb1db189-8ef9-dc9c-d97f-e0457b02f319.png)

これで上手くいくだろうと思ったのですが、いざDesigner画面に戻ると以下のように直属の子要素は複数にできない旨のエラーメッセージが、、、。

![ScrollView.PNG](https://qiita-image-store.s3.amazonaws.com/0/119667/27bc5b25-7466-8a14-5f69-96090ed4ea09.png)

こちらもかなり調べるのに時間がかかりましたが、最終的には[こちらの動画](https://www.youtube.com/watch?v=FxmkGHES8oc)を見て解決しました。９分程度の動画ですが、余計な個所も多いので結論だけ乗せると、複数の子要素をまとめてScrollViewの中に入れ込みたい場合は、すべての子要素を一旦TableLayoutの中にまとめて入れれば良いようです。
具体的には、以下のようにコーディングします。
![ScrollView2.PNG](https://qiita-image-store.s3.amazonaws.com/0/119667/15ff7659-18bc-4b1e-c141-1a17e1c20800.png)
これで、すべての要素をスクロールの中に入れ込むことができます。

##ハマりポイントその３
これで完璧と思って知人に渡した所、小数点以下の数字が入れられないという連絡が、、、。確かめてみると確かに小数点が入れられません。
なにか入力規則を入れるところでもあったのかと思って、長いプロパティ欄を小まめに確認していたところ、Input FormatのinputTypeがNumberになっていました。
![Number.PNG](https://qiita-image-store.s3.amazonaws.com/0/119667/9fce6f16-281d-cb66-c0eb-05922f7936f8.png)

後で気が付いたのですが、ツールボックスの中にNumberとNumber(Decimal)がありました。作成当時は数値だからとなにも意識せずNumberを選んで配置していってしまったのですが、よく見ればテキストボックスも様々なタイプがあり、とりあえずで進めると痛い目を見るなと痛感しました。

##最後に
３つ目のポイントは小さいことなのですが、ここで苦戦した一番大きなポイントがデバッグでした。Visual Studio付属のデバッグでは「配置エラー」という謎のエラーで動作検証ができないため、都度都度アプリを作成して、Nox（私が今回検証に使用したandroidのエミュレーターでお勧めです）で動作検証するというサイクルを繰り返していました。このため、動作検証が結構面倒で、端折っていた（1～20の１サンプルでしか評価していなかった）ために、入力値の制約に気づかなかったという問題がありました。
デバッグが上手く動作しない原因は調べて分かればまたまとめたいと思います。
作成したアプリは以下のように、標準偏差を求めるようにしています。（一応エクセルで計算の精度は検証しておきました）なお、知人に渡すだけの目的だったので、メールで渡すだけでストアにはアップしていません。メールで渡す方法については、[こちらのサイト](http://phpjavascriptroom.com/?t=mobile&p=android_apk_install)を参考にさせていただきました。

![App1.PNG](https://qiita-image-store.s3.amazonaws.com/0/119667/cb41ad6e-a063-7244-7a0e-dedb3f966b4c.png)

色々苦戦はしたものの、基本的にはC#の知識でアプリ開発ができる（しかも無料で）というのは素晴らしいですね。
Ubuntu16.04でGoogleDriveのクライアントを色々試してみた

プロジェクトや環境をいちいちセッティングするのが面倒臭いのでファイル共有をしている。
これまでWindowsでGoogleDriveを利用してきたが、Ubuntuマシンでも同じことをしようとして難儀したメモ。
一応その他のクラウドストレージ（OneDrive, DropBox, ownCloud）も調べたり試したりした感想を書いています。
他に試されたものがある方はぜひ情報共有ください。

# ユースケース
- 50GBある中の15GB分を選択同期したい
- 内容は何でもありで.gitとかもあるしアプリケーションもある
- 規約等はあまり気にしない（仕事では使わない）

# 結論
GoogleDriveは野良クライアントのgrive2がそこそこ使えそうだが不満は色々ある。
OneDriveは野良クライアントもダメっぽい。
本格的なクラウドストレージならやっぱり純正クライアントがあるDropBoxかownCloudにするしかないか。

# GoogleDrive
数年前に規約の危険性が話題になったGoogleDrive。
公式クライアントはありません（[社内には存在するという噂はあり](https://www.reddit.com/r/linux/comments/3z0yft/why_does_google_refuse_to_provide_google_drive/)）。
ディレクトリの相互参照/同名ファイル/版など内部仕様が煩雑できちんとしたクライアントの野良実装は困難ぽいです。

## [GNOME Online Account](http://ottan.xyz/ubuntu-16-04-google-drive-filer-4725/)
Ubuntu16.04から利用できるようになった。結論から言うと私のユースケースでは使い物にならなかった。
ローカルの容量は消費しないが、アクセスにものすごく時間がかかる。
Nautilusではちゃんと見れるが、Bashでアクセスするとファイル名がIDっぽい謎の文字列になっていて使えない。

## [Grive](https://github.com/Grive/grive)
全体的に古く情報も分散しており、色々試したが同期にまで至れなかった。
grive-toolsとかいうサブプロジェクトもあるっぽいがそこら辺も不明。

## [overGrive](https://www.thefanclub.co.za/overgrive)
Griveの進化版で有料、GUIツール。
高機能ぽいので試用してみたが初期同期が途中で止まり最終的に21時間で8GB同期したところで金は払えないと思って辞めた。

## [Grive2](https://github.com/vitalif/grive2)
Griveの進化版で無料、CUIツール。
これも15GBの初期同期に一晩時間がかかったが途中で止まることはなかった。その後は15GBで25分ぐらいかかる。
サーバー/クライアントの全構成のdiffを出してから同期する仕組み。自動では同期しないので自分はcronを打った。
個別ファイル更新を察知して即アップ/ダウンロードみたいなことはしないっぽい（手作業でコマンドを打てばできる？）。
ごく稀に__ファイルが消失している__（GoogleDriveのWEBクライアントから更新履歴を確認すると分かる）。
GoogleDriveでパス/ファイル名の重複できるのが原因っぽく、稀だし手作業で戻せるが、いちいち履歴をチェックのは面倒。
ローカルでは.trashファイルに移動するのでバグっても完全に消失することはないと唄ってはいる。

## [google-drive-ocamlfuse](https://github.com/astrada/google-drive-ocamlfuse)
fuseを利用してgoogleDriveのAPIにアクセスするようで容量は食わない（GNOMEに近いっぽい。）。
ファイルアクセスに毎回少し待たされるのでこの上でのソフトウェア開発には向かない。
__上書きの挙動が怪しい（同名の新ファイルができてしまった）__。
手軽にファイルの中身を確認チェックする分には便利そう。

# その他
## OneDrive
Linuxの公式クライアントはない。
[onedrive-d](https://xbu.me/onedrived/)という野良クライアントがあったらしいが蒸発しており、その後の潮流はしらないが、とりあえず誰かが後継として[onedrive-e](https://github.com/tobecontinued/onedrive-e)を置いたのは見つけた。
とりあえずGoogleDriveで懲りて[onedrive-dの評判を調べた](http://techblog.show-ya.blue/?s=onedrive)が、私のユースケースには向かなさそうである。
> ……結果ですが、残念な事にファイル同期の速度が遅すぎて使いものにならない事がわかりました。
> まる2日同期に時間をかけて120GB中まだ50GBちょっと。無料の15GBで使っているならまだいいかもしれませんが課金して1TBにしている私から見ると話にならない速度です。
> これならリムーバブルメディアや外付けHDDでファイルを同期した方がよっぽど早い。

## DropBox
さすがはクラウドストレージの専門企業ということで、公式クライアントがあります。
2013年頃にUbuntu12.04で多分8GBぐらい同期していましたが、Ubuntu12.04で利用していて不満を持った記憶はないのです。

## ownCloud
容量のあるサーバーがあって、設置と管理を自力できる人であれば候補にあがる選択肢です。選択同期・即時同期も可能で自由度が高いです。
さくらのクラウドのクーポンがあったのでCentOS上に自力で構築して軽く触ってみましたが、Webサーバーをちゃんと組んだ経験があれば設定は難しくありません。軽く使っただけなので、速度とかは試せていません。
VirtualBoxで作成したイメージをESXiにインポートする方法

#VirtualBoxで作成したイメージをESXiにインポートする方法
VirtualBoxで作成したイメージはそのままESXiに持っていってもロードできない。はじめは出来ると思ってたんだけど。。

下記に一番簡単だと思う変換方法を記しておく。

- VBoxの管理画面上で「仮想アプライアンスのエクスポート」を選択
- 対象の仮想マシンを選択
- OVF1.0、またovaでなくovf形式で出力する　※重要
- 出来上がったファイルをVMware Workstation Player（昔のVMwarePlayer）で
「開く」→先ほど出力したovfを選択して読みこませる。エラーが出る場合もあるがチェックレベルを落として読み込みをし、継続。起動はしないこと。
- VMware vCenter Converter Standalone Clientを実行する。sourceに「vmware workstation or other vmware virtual machine」を選択し、先ほど取り込んだ際にできたvmxファイルを選択する。
- Destinationでtypeに「VMware Infrastructure virtual machine」を選択。ServerにESXiのIPまたは名前解決できるなら名前、username,passwordにESXiにログイン出来るものを入力してNextを押下する。
- 後のオプションなどは任意で。

以上でVMware vCenter Converter Standalone ClientがESXiにマシンを作成してくれる。
ベトナムに出張

GYAOのtsです。
我々のチームは、オールパブリッククラウドで、[Microservice Architecture](http://microservices.io/patterns/microservices.html)を採用した次期バックエンドを設計中です。

設計関連は[こちら](http://qiita.com/tstakano-yj/items/7e2ca3d5ad33aefa33aa)で随時記載

# たまには
技術以外のことも書こうかと2016/9にベトナム出張に行ってきたのでそのシェアです。

# Cafe
私が出張に行ったときは、開発拠点で作業しようとしたらwifiの認証がトラブルで繋がらず、
それではホテルで作業しようと、ホテルに戻るとwifiの接続が相当不安定。
更には40年に1度と言われる記録的な豪雨に見舞われたり、暑くて体調が悪くなったりとかなりの珍道中でした。
ベトナムにはかなりの数のCafeがあり、wifiのアクセスポイントを求めて彷徨い主にcafeで作業をしていました。

かなり落ち着きます。

# Photos
![2928228464115138306-account_id=4.jpg](https://qiita-image-store.s3.amazonaws.com/0/114329/43fbd77a-771c-1c13-4a89-caf4ff8a8e00.jpeg)
記録的豪雨にも見舞われました。


![1715169505493656497-account_id=4.jpg](https://qiita-image-store.s3.amazonaws.com/0/114329/9479e3b2-f894-18bb-5dfd-66ad34e10d96.jpeg)


![53150482745679465-account_id=4.jpg](https://qiita-image-store.s3.amazonaws.com/0/114329/628b2d3e-f857-aef7-4a00-03fc17099988.jpeg)
↑ここは一番のお気に入り！
id Cafe@District 1
34D Thu Khoa Huan Street, District 1, Bến Thành, District 1, Ho Chi Minh


![2589398697589297247-account_id=4.jpg](https://qiita-image-store.s3.amazonaws.com/0/114329/1c63a969-41ea-dd76-e2e5-05a17840b012.jpeg)
【css】レスポンシブ対応に便利な「calc()」

「calc()」はおそらく紹介する中では最もよく使われていますが、ここで取り上げる価値があります。もしあなたが一度も「calc()」を使ったことがないなら、例えばある要素の幅を指定したピクセル分だけ減らすことが簡単にできます。


```:.css
.box {
  width: calc( 100% - 20px );
}
```

一見、Sassのプリプロセッサのように見えるかもしれませんが、これはネイティブなCSSで、ブラウザはこの計算を行って要素のサイズをレンダリングします。

.boxの要素のサイズは、100%から20pxをマイナスされた幅で表示されます。このスタイルシートは、可変幅の要素と一緒に固定幅の要素を置くなど、多目的に使用することができます。

【備考】
・[W3C -calc()](https://www.w3.org/TR/css3-values/#calc-notation)
・[calc() のサポートブラウザ](http://caniuse.com/#feat=calc)
【CSS】アニメーションの実行後を設定「animation-fill-mode」

要素をアニメーションさせる時に、終了時にその要素を最初の状態に戻したい時があります。
「animation-fill-mode」を使用することで、アニメーションの実行前や実行後にどのようなスタイルを適用するかを設定できます。

```:.css
@keyframes slideIn {
0% { transform: translateX(-100%); }
100% { transform: translateX(0); }
}

.slideIn {
animation-name: slideIn;
animation-duration: .25s;
animation-fill-mode: forwards;
} 
```

【備考】
・[W3C -animation-fill-mode](https://www.w3.org/TR/css3-animations/#animation-fill-mode-property)
・[CSSアニメーションのサポートブラウザ](http://caniuse.com/#feat=css-animation)

![2016102602.png](https://qiita-image-store.s3.amazonaws.com/0/146680/aeeac5c4-854e-0252-c8dd-96aa69ae0407.png)
[9 Underutilized Features in CSS](https://medium.com/@iamjordanlittle/9-underutilized-features-in-css-90ced6ddbfe7#.fi8wo9dzt)
python2系/3系、文字コードとprint文/コマンドライン

#python2系
## 宣言
```
>>> text = 'テキスト'
>>> btext = b'テキスト'
>>> utext = u'テキスト'
```

##出力
```
>>> text
'\xe3\x83\x86\xe3\x82\xad\xe3\x82\xb9\xe3\x83\x88'

>>> print text
テキスト

>>> btext
'\xe3\x83\x86\xe3\x82\xad\xe3\x82\xb9\xe3\x83\x88'

>>> btext.decode('utf-8')
u'\u30c6\u30ad\u30b9\u30c8'

>>> print btext.decode('utf-8')
テキスト

>>> print btext
テキスト

>>> utext
u'\u30c6\u30ad\u30b9\u30c8'

>>> print utext
テキスト
```

#python3系
## 宣言
```
>>> text = 'テキスト'
>>> btext = b'テキスト'
  File "<stdin>", line 1
SyntaxError: bytes can only contain ASCII literal characters.

>>> utext = u'テキスト'
```

##出力
```
>>> text
'テキスト'

>>> print(text)
テキスト

>>> utext
'テキスト'

>>> print(utext)
テキスト
```
Javaでstaticな関数をMockitoする

覚書として記録。

```Java:Test.java
@RunWith(PowerMockRunner.class)
@PrepareForTest({Mocktarget.class})
class testClass{
		@test
		public void testmethod (){
		        PowerMockito.mockStatic(Mocktarget.class);
		        when(Mocktarget.targetStaticMethod(any(), any())).thenReturn(Value);
		}
}
```


ここで注意しないといけないのが、
PowerMockのMatcherがちょっと怪しいこと。
「any()」でMethodひっかけてくれなにときもあるので
適切な型に設定する必要がある。

`any(Argument.class)`
とか
`anyString()`
とか。
iOS・Androidのスクショを検知・無効化する方法

snapchat的な

# iOS

検知

```ViewController.swift
import UIKit

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        NotificationCenter.default.addObserver(self, selector: #selector(didScreenshot), name: .UIApplicationUserDidTakeScreenshot, object: nil)
    }
    
    func didScreenshot(notification: Notification) {
        print("didScreenshot")
    }
}
```
https://developer.apple.com/reference/uikit/uiapplicationuserdidtakescreenshotnotification

# Android

無効化

```MainActivity.java
Window window = getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_SECURE);
```

https://developer.android.com/reference/android/view/WindowManager.LayoutParams.html
LINE Messaging APIを使ったオウム返しBot (Perl)

# 概要
LINE Messaging API を使って、Perlでオウム返しBotを作成してみます。
アカウントは、[LINE Business Center](https://business.line.me/ja/services/bot) から取得可能です。

# 動作イメージ
![13E8592F-57FA-4C02-8FF1-2B514F8B38E5.jpg](https://qiita-image-store.s3.amazonaws.com/0/144905/039767a9-d1a3-2c03-9105-fb64dca46895.jpeg)

# 動かし方
[Replay message](https://devdocs.line.me/ja/#reply-message) と呼ばれるAPIを使用します。
Botが反応するまでの大まかな流れは以下の通りです。（**太字**が今回作成する処理）

1. BotのいるLINE部屋で喋る
2. 事前設定したURLにLINEサーバからPOSTが届く
3. **POST内容からメッセージ本文と返信用トークンを取得する**
4. **返信用トークンを使用して、LINEサーバにメッセージを送信**
5. Botがメッセージを喋ってくれる


# ソースコード
```pl:line_echo_bot.pl
#!/usr/bin/perl
use CGI;
use JSON;
use LWP::UserAgent;
my $cgi  = new CGI();
my $json = new JSON();
my $ua   = new LWP::UserAgent();

# API認証情報
my $API_URI               = "https://api.line.me/v2/bot/message/reply";
my $CHANNEL_ACCCESS_TOKEN = "xxxxx"; # LINE developersから取得したtokenを指定

# LINEからPOST受信
my $source = $cgi->param('POSTDATA');
my $items  = $json->decode($source);
my $event  = $items->{events}[0];

# replyToken、投稿内容取得
my $reply_token = $event->{replyToken};
my $reply_text  = $event->{message}->{text};

# LINEに200を返す
print "Status: 200 OK\n";
print "Content-Type: text/html\n\n";

# 返信メッセージ作成、JSONエンコード
my $data = {
	"replyToken" => $reply_token,
	"messages"   => [
		{"type"  => "text", "text" => "復唱するよ。"},
		{"type"  => "text", "text" => $reply_text}
	]
};
my $content = $json->utf8(0)->encode($data);

# POSTリクエスト生成
my $req = HTTP::Request->new("POST", $API_URI);
$req->header("Content-Type"  => "application/json");
$req->header("Authorization" => "Bearer $CHANNEL_ACCCESS_TOKEN");
$req->content($content);

# POST送信
$ua->request($req);

```

以下の箇所を修正することで、一度につき5件までメッセージ送信が可能です。

```pl
	"messages"   => [
		{"type"  => "text", "text" => "復唱するよ。"},
		{"type"  => "text", "text" => $reply_text}
	]
```

上記のサンプルコードは、GitHubより取得可能です。
https://github.com/yuu26jp/line-echo-bot


# 参考資料
[API Reference - Messaging API](https://devdocs.line.me/ja/#messaging-api)
[API Reference - Webhook Event Object](https://devdocs.line.me/ja/#webhook-event-object)
[API Reference - Reply Message](https://devdocs.line.me/ja/#reply-message)


# 活用例
グループ部屋にもBotを参加させることは可能なので、いろいろ遊んでみてください。
私はスプラトゥーンでよく遊ぶので、こんなBotを作ってみました。

![1F950689-54BE-4A0F-B4F6-2AEA725482FB.jpg](https://qiita-image-store.s3.amazonaws.com/0/144905/bd541d89-730e-d89c-bfc4-226e79666d7e.jpeg)
MonosnapでSlackでのスクショ共有を爆速化する

#問題
Slackでスクショをメンバーに共有する時、どのように行っていますか？
例えばブラウザのスクショ保存用エクステンション(Chromeなら[LightShot](http://app.prntscr.com/en/index.html)等）を使用して、スクショをアップロードした後URLを共有する方法があります。

でもちょっと待って、その方法を取っている方は**どこ**にアップロードされるかを一度確認してください。
もしかしてURLを知っていれば誰でもアクセス出来たりはしませんか？
だとすればセキュリティとしてアウトです❎
Webサービスでまだリリースしてないデザインを下手にアップロードしてしまい、それが真似られたら目も当てられません。
(ちなみにLightShotもURLを知っていれば誰でもアクセス可能です)

ただわざわざスクショをローカルに保存して、Slackにアップロードすんのも面倒くさい・・
スクショをローカルに保存せず、簡単に共有できるようにしたい。。

ありますよ、その方法:sunglasses:

#解決
僕がおすすめするのは[Monosnap](https://monosnap.com/welcome)というスクショの保存・加工に特化したアプリを使用する方法です。
(ご存知の方は華麗にスルーしてください汗)
![image](https://qiita-image-store.s3.amazonaws.com/0/71113/1d17af3c-901b-f003-b5cb-0d27a8e02664.png)
MonosnapはMac/Windowsどちらにも対応しています。

まずは[こちら](https://monosnap.com/welcome)からアプリをダウンロードしてください。

アプリを起動したら画面は表示されないので一瞬「あれっ？」となるかもしれません。
でもMacの場合メニューバーを見るとMonosnapのアイコンが表示されています。
![image](https://qiita-image-store.s3.amazonaws.com/0/71113/5b56f522-57af-75d5-de13-554e9e9a59a3.png)

アイコンをクリックしたらメニューが表示されます。
部分的にスクショを取る場合赤枠の「Capture Area」を選択します。
![image](https://qiita-image-store.s3.amazonaws.com/0/71113/48d42e31-d143-cb80-de43-f02805bbf1ab.png)

するとカーソルが↓のように変化します。これでスクショを取る為の準備が出来ました。
![image](https://qiita-image-store.s3.amazonaws.com/0/71113/80b3d6a1-bc64-6183-f9db-ada37435f5a0.png)

次に好きな部分をドラッグ&ドロップの要領で選択します。
選択し終わると以下のように選択した部分がMonosnapのウインドウで表示されます
![image](https://qiita-image-store.s3.amazonaws.com/0/71113/7150297c-4be5-e546-20c4-4aafc4de8ecf.png)

これをローカルに保存することも出来ますが、今回の目的はあくまでスクショ共有をスピーディーに行うこと。
なのでこのウインドウで「⌘C」でコピーを行います。選択しなくてもコピーが出来るから便利〜

そして！そのままSlackに「⌘V」でペッと貼り付け
するとアップロードのポップアップが表示され先ほどのスクショが表示されます。
![image](https://qiita-image-store.s3.amazonaws.com/0/71113/ff7fbffe-b094-ff6c-16a4-95e10cec170b.png)

あとはアップロードして共有するだけ。楽ちんです。
部分キャプチャは「⌥⌘5」のショートカットキーでも可能なので是非使いましょう。

ショートカットキーに慣れれば10秒も掛からずにスクショをSlackで共有することが出来ます。
SlackだけでなくQiitaなどのアップロードにも有効です。


#応用編
スクショをそのまま共有するのも良いですが、スクショの中でも一部分を強調したり文字を
入れたい時がありますよね。
Monosnapは手軽に加工も出来ます。

例として先ほどのGoogleロゴのスクショを加工してみましょう。
Monosnapのフッターには加工のメニューが用意されています。
![スクリーンショット 2016-10-28 23.33.48.png](https://qiita-image-store.s3.amazonaws.com/0/71113/db15a482-0caf-ce73-8cdf-3417765130bc.png)

##枠で囲む
フッターメニューの四角枠アイコンをクリックして強調したい部分を選択します
![スクリーンショット 2016-10-29 0.00.28.png](https://qiita-image-store.s3.amazonaws.com/0/71113/886c5d85-c035-651e-ec41-c8e583e778cc.png)

##文字を入れる
同じくフッターメニューの文字アイコンをクリックした後、お好みの開始位置をクリックして入力します。
![スクリーンショット 2016-10-29 0.01.00.png](https://qiita-image-store.s3.amazonaws.com/0/71113/94312462-5923-96d6-0129-dc813058f75b.png)

その他矢印や直線、○などの図形も挿入出来、色も自由に変えられます



スクショの共有に手間なんて掛けたくないという方はゼヒこの方法を試してみてください:smiley:
[Android]gradlew実行でbash\r: No such file or directory

### Androidアプリのapk作成時に、gradlew実行で以下のエラーが発生した。
Mac OS X のターミナルで実行

```
>./gradlew clean build
 /usr/bin/env: bash\r: No such file or directory
```

原因:gradlewファイルの改行コードがunix format でないため。windows環境でソースをgit clone するとそうなる。
対処法:gradlewファイルをvimで開き、コマンドモードで以下コマンドを実行して保存する。その後、再びgradlew実行する。

```
set fileformat=unix
```

ファイルを開くところから書くとこう

```
>vim gradlew
:set fileformat=unix
:wq
>./gradlew clean build
```

buildが完了するまで待ってOK

参考リンク
[stackoverflow](http://stackoverflow.com/questions/22301956/error-with-gradlew-usr-bin-env-bash-no-such-file-or-directory)
Android xml arrayでdrawableの画像を設定する

忘備録がてら書いたので、ソースコードは省略しています。

## array.xml

itemタグの中にdrawableの画像が設定できる


```xml:array.xml
<array name="array_hoge_1">
        <item>@drawable/hoge_1</item>
        <item>@drawable/hoge_2</item>
        <item>@drawable/hoge_3</item>
        <item>@drawable/hoge_4</item>
</array>
```


## hoge.java

array.xmlのresource idをdrawableIds[]に格納している
TypedArray #recycle()は必須

```java:hoge.java
TypedArray typedArray 
    = context.getResources().obtainTypedArray(R.array.array);
int[] drawableIds = new int[typedArray.length()];
for (int i = 0; i < typedArray.length(); i++){
    // drawableのresource idを取得
    drawableIds[i] = typedArray.getResourceId(i, 0);
}
 typedArray.recycle();
```


ImageViewにセットする

```java:hoge.java
imageView.setImageResource(drawableIds[i]);
```
Goで文字列の先頭から特定の文字数だけ切り取りたい

Goで文字列の先頭から特定の文字数だけを出力するのが、意外と悩んだのでちょっとメモします。

Goでは文字列はbyteのsliceのような扱いになります。なのでASCIIコードはいいのですが、UTF-8の文字列を適当に扱うと、UTF-8の文字列として不正なバイト列になることがあります（UTF-8は変なところで切ると__必ず__不正なバイト列になる）。

今回は『こんにちは』という文字列の先頭2文字だけを表示することを考えます。

```go
package main

import (
	"fmt"
	"unicode/utf8"
)

func main() {
	str := "こんにちは"

	fmt.Println(len(str))
	fmt.Println(utf8.RuneCountInString(str))
	fmt.Println(str[:3])
	fmt.Println(string([]rune(str)[:2]))
}
```

出力：

```
15
5
こ
こん
```

文字列で`len`を使うとバイト列としての長さが出るので、ひらがなだと文字数の3倍になるはずです。UTF-8の文字列としての長さを知りたい場合は`utf8.RuneCountInString`を使う必要があります。

そしてruneというのがUTF-8の1文字を表すので、文字列をruneのsliceにキャストします。そうすれば先頭2文字を切り出す事はできるので、それをstringにキャストすればいいです。

もっと簡単にできる方法があれば、教えてくれるとうれしいです。
新規でGCMのPush通知をやろうとしたらできなくなっていた顛末メモ

2016年10月現在、GCM2系の実装に関して検証をしているときに陥ったことのメモです。

## 事象

[GoogleAPIConsole](https://console.developers.google.com/?hl=JA)で新しくプロジェクトを作成し
Andoridアプリ側で `gcm.register({プロジェクト番号});` でRegistrationIDを振り出した後
GCM経由でメッセージを送ろうとcurlをするも認証エラーになってしまう。

```bash:curlの結果
$ curl --header "Authorization: key={新しく作ったプロジェクトのAPIKey}" --header Content-Type:"application/json" https://android.googleapis.com/gcm/send -d "{\"registration_ids\":[\"{振り出したRegistrationID}\"],\"data\":{\"id\":\"1\",\"message\":\"Test\"}}"
<HTML>
<HEAD>
<TITLE>Unauthorized</TITLE>
</HEAD>
<BODY BGCOLOR="#FFFFFF" TEXT="#000000">
<H1>Unauthorized</H1>
<H2>Error 401</H2>
</BODY>
</HTML>
```

従来401エラーはAPIKeyの誤りなので、コピーミスやcurlの方法をチェックするが
それでも直らず :cry: 

## 原因

2016年の9月以降はFirebase経由で振り出したAPIKey以外は使えないようにしたみたいです。

>Starting from Sept. 2016 new server key can only be created in the Firebase Console using the Cloud Messaging tab of the Settings panel. Existing projects that need to create a new server key can be imported in the Firebase console without affecting their existing configuration.
[HTTP Connection Server Reference  \|  Cloud Messaging  \|  Google Developers](https://developers.google.com/cloud-messaging/http-server-ref#error-codes)

## 解決法

既存のプロジェクトをFirebaseのプロジェクト作成でインポートできるので
そちらでインポートした後
「プロジェクトの設定」→「クラウドメッセージング」→「サーバーキー」の文字列を
APIKeyとして指定し、Registration IDを送信先として指定すれば
`https://android.googleapis.com/gcm/send` 、 `https://fcm.googleapis.com/fcm/send`
どちらのAPIでも送信することができます。
※おそらくGoogleのことなのでUIが変わる懸念があります、見当たらなければそれっぽいものを探して下さい:bow: 


## 参考URL

* [\[改訂版\]Google Cloud Messaging \(GCM\) でプッシュ配信する\[Android\] ｜ Developers\.IO](http://dev.classmethod.jp/smartphone/android/gcm/)
* [AndroidのGCMの実装をcurlで確認する \- Qiita](http://qiita.com/konifar/items/05b867bf56f2b24626cf)
* [GCM Unauthorized UnauthorizedError 401 \-でじうぃき](http://onlineconsultant.jp/pukiwiki/?GCM%20Unauthorized%20UnauthorizedError%20401)
* [android \- API key for GCM is suddenly invalid? Unauthorized \(401\) error \- Stack Overflow](http://stackoverflow.com/questions/37789264/api-key-for-gcm-is-suddenly-invalid-unauthorized-401-error/37801206)
numpy.arrayをいい感じにprintするノート

#親切なnumpy array
リストの中身によって表示を変えてくれる神仕様。

```py:test.py
import numpy as np
x = np.random.random(10)

[ 0.27995734  0.05977967  0.59401233  0.45374778  0.69411132  0.3680196
  0.57969357  0.52534503  0.9995786   0.33110147]
[  2.41417094e-06   4.15437686e-06   8.80283329e-07   9.19866647e-06
   2.07120169e-07   9.81829578e-06   9.98575051e-06   1.63425382e-06
   6.44888900e-07   5.88317420e-06]
[4 8 7 6 2 4 0 4 0 2]
```

#ちょっと困ります。。。
`np.set_printoptions()`で表示のフォーマットを指定できる。
上から順に強い制約を加えていく。


```py:test.py
np.set_printoptions(precision=3) #有効桁３桁で丸める
[ 0.014  0.68   0.576  0.57   0.576  0.511  0.943  0.51   0.681  0.869]

np.set_printoptions(precision=3, suppress=True) #指数表示の禁止
[ 0.004  0.006  0.006  0.00   0.001  0.005  0.004  0.006  0.005  0.01 ]

np.set_printoptions(formatter={'float': '{: 0.3f}'.format}) #桁を揃える
[ 0.885  0.194  0.296  0.005  0.379  0.934  0.477  0.385  0.686  0.348]
[ 9.000  4.000  6.000  1.000  6.000  0.000  1.000  7.000  6.000  9.000]

```


#参考URL
https://docs.scipy.org/doc/numpy/reference/generated/numpy.set_printoptions.html
http://stackoverflow.com/questions/2891790/pretty-printing-of-numpy-array
Bash on Ubuntu on Windowsが起動しなくなったら

## この記事はBeta時代の古い情報です。
windowsストアの情報に従ってください。

https://aka.ms/wslstore

---

## Bash on Ubuntu on Windowsが起動しなくなった

![bash.jpg](https://qiita-image-store.s3.amazonaws.com/0/42709/c409a8d3-719a-ea0b-198a-3b34a501e4dd.jpeg)

起動しても真っ黒。
この後2~3分したら勝手に窓を閉じる…。

**コマンドプロンプトから起動を試みる。**

```
C:\Users\koooge>bash
エラー: 0x80080005
```

や

```
C:\Users\koooge>bash
エラー: 0x80070002
```


エラーが出て起動しない。アカン。

---

## 諦めて再install

1. PCを再起動する
2. コマンドプロンプトを開く
3. `lxrun /uninstall /full` を実行。# Linux subsystemのuninstall。
  - もしここで0x8008005となる場合は、一度[Windowの機能の有効化または無効化]から[Windows Subsystem for Linux (Beta)]を無効にし、再起動して再度有効にしてから試してください。
4. `rmdir /S %LOCALAPPDATA%\lxss` を実行。# Linux subsystemのデータを消す
5. `lxrun /install /y` を実行。# Linux subsystemのinstall

---

## お好みでユーザー作成
上記までだとBash起動時にroot権限となっているので、お好みでユーザーを作成します。
ユーザー名は適宜読み代えてください。

### ユーザー作成
Bashで下記を実行

```
#root@koooge_PC:~# adduser koooge
ユーザー `koooge' を追加しています...
新しいグループ `koooge' (1000) を追加しています...
新しいユーザー `koooge' (1000) をグループ `koooge' に追加しています...
新しい UNIX パスワードを入力してください:
新しい UNIX パスワードを再入力してください:
passwd: password updated successfully
Changing the user information for koooge
Enter the new value, or press ENTER for the default
        Full Name []: koooge
        Room Number []:
        Work Phone []:
        Home Phone []:
        Other []:
以上で正しいですか? [Y/n] y
```

### sudoに追加する

```
root@koooge_PC:~# gpasswd -a koooge sudo
Adding user koooge to group sudo
```


### コマンドプロンプトでdefault userの切り替え

```
C:\Users\koooge>lxrun /setdefaultuser koooge
UNIX ユーザーが見つかりました: koooge
既定の UNIX ユーザーが次に設定されました: koooge
```

---

## お好みでホスト追加
Bash on Ubuntu on Windowsを起動し、
sudoコマンド実行時に下記のワーニングが表示されるようになるので対策します。

**sudo: ホスト {hostname} の名前解決ができません**

Bash on Ubuntu on Windowsを起動して下記を実行

```
sudo bash -c "echo \"127.0.0.1 $NAME\" >> /etc/hosts"
```

なおこれもsudoなので一度のみワーニングが表示されます。

以上で完了です。
【10倍返しだ！！】迷惑メールに仕返しするスクリプトをphpでつくった

# なぜかある日から私用gmailに迷惑メールが来るようになりました。
LINEとかに誘導してくるやつ。
いくら迷惑メール判定しても向こう側は向こう側で量産したアカウントで来ているので、ちょっと反撃して反応をみることにしました。

## 手っ取り早くphpでつくりました。

```php
<?php
$address = array();
$address = array('prprjsjj1737@gmail.com',
    'lvnmrmjnn@gmail.com',
    'zzqvztopq@gmail.com',
    'mizuki_staregg@g.pretty-cat.jp');

$title ="We detect your mail is spam.";
$message = "WE DETECT YOUR MAIL IS SPAM.WE CAN ARREST YOU.";
mb_language("Japanese");
mb_internal_encoding("UTF-8");

echo "======start=======".time()."\n";
foreach($address as $val) {
    if (mb_send_mail($val, $title, $message, "From: sho20tcu@gmail.com")) {
        echo "メールが送信されました。\n";
    } else {
        echo "メールの送信に失敗しました。\n";
    }
}
echo "======end=======\n";
```

ポイントはmb_send_mail関数です。

- 第1引数に送りたいメールアドレス（To）
- 第2引数はメールタイトル
- 第3引数はメール本文
- 第4引数は送り元。たぶん適当に書いても動くしその通りおくられる。
あとは言語設定しておくと文字化けしないです。文字化けさせても面白いと思うんですけど。

```
$ crontab -e
```
```
* * * * * php $HOME/dev/php/mail.php >> $HOME/mail_error.log
```
1分おきにさっき作ったスクリプトを実行します。

今のところちゃんと1分おきに送られているみたいです。
```
======start=======1477662661
メールが送信されました。
メールが送信されました。
メールが送信されました。
メールが送信されました。
======end=======
======start=======1477662721
メールが送信されました。
メールが送信されました。
メールが送信されました。
メールが送信されました。
======end=======
```

なんかどっかから怒られたらやめます

ready!! fight!!

とりあえず朝までみます。

なんかうまく行ったら他の言語でちゃんと書いてgithubに公開しよう。
JSONを整形して見やすくするワンライナー

# 概要
JSONを整形して見やすくするワンライナーです。
pythonがインストールされているMacならターミナルからすぐに使えます。

# コマンド
```
curl -s "<url>"|python -m json.tool
```

# 整形前
```
$ curl -s "https://auctions.yahooapis.jp/AuctionWebService/V2/json/search?appid=dj0zaiZpPU1aMWppaDVwUFFSTSZzPWNvbnN1bWVyc2VjcmV0Jng9MTc-&results=20&query=ipad"
loaded({"ResultSet":{"@attributes":{"totalResultsAvailable":"32269","totalResultsReturned":"20","firstResultPosition":"1"},"Result":{"UnitsWord":["iPad air2","iPad MINI","iPad Pro","iPad mini4","iPad AIR"],"Item":[{"AuctionID":"f181174186","Title":"\u25cf\u65b0\u54c1\u540c\u69d8\u25cfiPad mini Retina Wi-Fi 32GB \u30b7\u30eb\u30d0\u30fc\u25cf","CategoryId":"2084259337","Seller":{"Id":"mtm_store333","ItemListUrl":"http:\/\/auctions.yahooapis.jp\/AuctionWebService\/V2\/sellingList?sellerID=mtm_store333","RatingUrl":"http:\/\/auctions.yahooapis.jp\/AuctionWebService\/V1\/ShowRating?id=mtm_store333"},"ItemUrl":"http:\/\/auctions.yahooapis.jp\/AuctionWebService\/V2\/auctionItem?auctionID=f181174186","AuctionItemUrl":"http:\/\/page6.auctions.yahoo.co.jp\/jp\/auction\/f181174186","Image":"http:\/\/auctions.c.yimg.jp\/images.auctions.yahoo.co.jp\/image\/dr147\/auc0206\/users\/2\/9\/0\/8\/mtm_store333-thumb-1
  :
```

# 整形後
```
$ curl -s "https://auctions.yahooapis.jp/AuctionWebService/V2/json/search?appid=dj0zaiZpPU1aMWppaDVwUFFSTSZzPWNvbnN1bWVyc2VjcmV0Jng9MTc-&results=20&query=ipad"|sed -e "s/^loaded(//" -e "s/)$//"|python -m json.tool
{
    "ResultSet": {
        "@attributes": {
            "firstResultPosition": "1",
            "totalResultsAvailable": "32269",
            "totalResultsReturned": "20"
        },
        "Result": {
            "Item": [
                {
                    "AuctionID": "f181174186",
                    "AuctionItemUrl": "http://page6.auctions.yahoo.co.jp/jp/auction/f181174186",
                    "BidOrBuy": "24800.00",
                    "Bids": "0",
                    "CategoryId": "2084259337",
                    "CharityOption": {
                        "Proportion": "0"
                    },
  :
```
Macでよく使う便利ショートカット(強制終了など)



#Macでのアプリケーション強制終了

１. Apple メニューから「強制終了」を選択するか、「command + option + esc」キーを押します。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/134919/966971c3-56ee-4409-2264-cef970440160.png)


２. 「強制終了」ウインドウで、反応しなくなった App を選択して「強制終了」をクリックします。


#スクリーンショット
「command + shift + 3」で、スクリーン全体のスクショ

「command + shift + 4」で、自分で決めた範囲のスクショが取れる。


また、これに「control」キーも追加して同時に押すと、
そのスクショをコピーした状態になるので、添付したい場所で
「command + v」でペーストするとスクショをすぐに貼り付けられる。
Swiftで開発をする上で(備忘録)

#開発においての一つの方法

・Storyboardは画面遷移を定義するためだけに使う

・各コントローラーのUI構成は、xibで作る

・画面の遷移処理はperformSegueWithIDでやる


・delegate callback notificationの使い分け




#リリース時でのログの排除
デバック時のみログを出力し、リリース時にはログを出さないようにするには、

```
// リリースビルドでprint, debugPrintを無効化

func print(object: Any) {
    #if DEBUG
        Swift.print(object, terminator: "")
    #endif
}
    
func debugPrint(object: Any) {
    #if DEBUG
        Swift.debugPrint(object, terminator: "")
    #endif
}
    
// リリースビルドでNSLog無効化
func NSLog(message:String){
    #if DEBUG
        Foundation.NSLog(message)
    #endif
}
func NSLog(format:String, _ args:CVarArgType...){
    #if DEBUG
        Foundation.NSLog(String(format: format, arguments: args))
    #endif
}
```
サイバー攻撃についてまとめ

#脆弱性
コンピュータのOSやソフトウェアの情報セキュリティ上の欠陥のこと。
プログラムの不具合や設計ミスにより発生する。
また、セキュリティホールは脆弱性についての俗表現である。

#SQLインジェクション
アプリケーションが想定しないSQL文を実行させることにより、DBを不正に操作すること。
例えば下記のようなselect文
```
SELECT * FROM user WHERE uid='ueno' AND pwd='' OR 'A'='A'
```
ORの後は常にtrueになるので、パスワードが異なっていても認証されてしまう

**対策**
- SQLを埋め込むところで特殊文字をエスケープ

#XSS（クロスサイトスクリプティング）
フォームに悪意のあるスクリプトを埋め込むこと。
例えば、クッキー情報を抜き取るスクリプトを埋め込むことでセッションIDを抜き取ることをセッションハイジャックという。

**対策**
- 特殊文字をエスケープする
    - PHPならhtmlspecialcharsを使用
    - <>“&の文字をエスケープすると<は&lt;に、>は&gt;に、&は&amp;に、”は&quote;に、’は&#39;に変換される

#CSRF（クロスサイトリクエストフォージュリ）
リクエスト強要とも呼ばれる。
意図しないリクエストをwebサーバーへ送信させ、処理を実行させること。
例えば別サイトに用意した罠のリンクを踏ませることによって、決済や大会などの処理を呼び出すように誘導させる。

**対策**
- 重要な処理を行うページでは、トークンを利用して正しいリクエストかチェックする

#Dos攻撃（ドス攻撃）
サービス停止攻撃などとも呼ばれる。
サーバーなどに対して過剰なパケットを送りつけることで負荷をかけ、サービスの正常な動作を侵害する攻撃のこと。

pingコマンドで使われるパケットの送信元を偽装し、相手のコンピュータに大量の偽パケットを送りつけるsmurf攻撃や
ターゲットのメールアドレスに大量のメールを送信しメールサーバを機能不全にするメールボムなどの攻撃手法が存在する。

**対策**
- 監視システムを導入しDoS攻撃を仕掛けてくるIPアドレスを特定、遮断
    - 国内向けのサービスであれば、海外からのアクセスを遮断
- 同一IPからのリクエスト（アクセス）回数を制限する

#DDos攻撃（ディードス攻撃）
分散型サービス妨害攻撃などとも呼ばれる。
複数のIPアドレスから放たれるDos攻撃のこと。
複数のコンピュータを攻撃側に巻き込んで、一斉攻撃している。

**対策**
- Dos攻撃と同じ


#総当たり攻撃
ブルートフォースアタックとも呼ばれる。
１つのIDに対する暗証番号を解読するため、全ての暗証番号のパターンを入力して解読しようとする攻撃のこと。

**対策**
- ログインの試行回数を制限する
    - 5回間違えたらロックをかけるなど
- 一定速度以上の入力を制限する
    - 何秒間に1回しか入力を許容しないなど
- 単純なパスワードを許容しない
    - 半角英数字で大文字小文字を含めた8文字以上のパスワードなど
    - LIGさんの記事によると、8文字の大小英数字を含むパスワードをすべて解析するには、高性能パーソナルコンピューターで253日間かかるそう

#逆総当たり攻撃
リバースブルートフォースとも呼ばれる。
総当たり攻撃の逆で、一つの暗証番号に対して、IDを複数試す攻撃のこと。

**対策**
- 総当たり攻撃と同じ
eclipseからサーバーに接続し、サーバー内のファイルを編集する方法(ssh)

1.「File」→「New」→「other」を選択します。
￼
<img width="495" alt="スクリーンショット 2016-10-25 17.49.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/134919/664efe31-c0ec-de3e-edaa-25305d49602f.png">
 


2.ウィザードを選択で「RemoteSystemExplorer」→「Connection」を選択し、「Next」ボタンをクリックします。

<img width="528" alt="スクリーンショット 2016-10-25 17.48.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/134919/82911a66-207e-ac86-6e7c-1d21fe6683db.png">
￼


３.新規サーバーの定義で「SSH Only」を選択し、「Next」ボタンをクリックします。
￼
<img width="526" alt="スクリーンショット 2016-10-25 17.50.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/134919/412563bd-2156-1bd1-3b67-93af604aa7d3.png">



４.「Host name」に繋ぎたいサーバーを設定し、「Finish」ボタンをクリックします。
￼
<img width="531" alt="スクリーンショット 2016-10-25 17.51.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/134919/6d638321-25e7-a576-253e-f55317ff4798.png">



５.これでサーバの設定は終了です。
Eclipseから、設定したサーバの起動・シャットダウンなどが行えるようになります。



あとは、htmlファイルなど作成してガンガン開発していくのみ。


eclipseから
自分の書いたhtmlファイルなどがブラウザ上ではどのように見えているかを確認したい場合は、
そのファイルを右クリックして「Open With」から「Web Browser」を選択するだけ！
AWS API Gatewayで httpsしか使えないのとパスが固定なのをCloudFrontでカバーする

API Gateway便利ですよね。EC2立てるほどの無いような簡単な用途があって使ってみて便利なのですが、以下二点困りました。

- httpsでしか使えない
- パスに固定で[stage]/[resource]が付いて、消せない(http://host/ みたいなルートパスで使えない)

両方、ホントにAPIとして使う分には特に問題無いんですが、S3の静的ページホスティングではできないちょっとした事をhttpのページとしてやらせようとしてたので困りました。
結果としてCloudFrontを通す事で解決できました。

以下の設定するのみです。普通です。

ポイントは以下。これで http://host/ で動きます。

- `Origin Path` に消したいパスを設定
- `Origin Protocol Policy`を `HTTPS Only` に設定
- `Viewer Protocol Policy`を `HTTP and HTTPS`に設定

![image](https://qiita-image-store.s3.amazonaws.com/0/8198/32c2bcc6-676a-db0e-d837-75ca0274a784.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/8198/27411f3c-cd4e-f65f-680e-9718ec4fc1d9.png)

- キャッシュについて
    - 私の用途だとキャッシュ有りで問題無かったのでそのままですが、キャッシュせずにプロキシのように使う事も可能なはずです。検証してないのでリンク貼りませんがググればすぐ出てきました。
- コストについて
    - キャッシュしてあればAPI Gatewayの呼び出しが減る分で相殺されそう。キャッシュしなかった場合CloudFront分増えますがAPI Gatewayのデータ転送量は課金されないはずです。
  


以上です。
iTerm起動時のエラー


### エラー

MacOS Xをupdateすると、こんなエラーが出た

```
Last login: Fri Oct 28 17:53:35 on ttys004


Agreeing to the Xcode/iOS license requires admin privileges, please re-run as root via sudo.




Agreeing to the Xcode/iOS license requires admin privileges, please re-run as root via sudo.
```
### 解決法

Xcodeを起動し、Agreeする

これでOK
vim: 選択した範囲のみをコメントアウトする

#コメントアウト

![vim_edit3.gif](https://qiita-image-store.s3.amazonaws.com/0/87666/74017c82-c271-f953-154a-9c38af0c302d.gif)


1. `ESC`
2. `CTRL + V` (visual block mode)
3. ↓と↑でライン選択
4. `SHIFT + i`
5. `#`
6. `ESC`

![vim_edit4.gif](https://qiita-image-store.s3.amazonaws.com/0/87666/764eb3ce-0d0c-88e5-7227-5b4bb5f09043.gif)


#コメント解除

1. `ESC`
2. `CTRL + V`
3. ↓と↑でライン選択 or ←と→(w/ SHIFT)を使ってより広範囲に。
4. `d` or `x`
5. `ESC`
windowsのNTemacs + cygwinでtrampを使う設定

windowsの[ntemacs](https://github.com/chuntaro/NTEmacs64)でtrampを使おうとすると、

```el:emacs
C-x C-f
Find File: /sshx:foo@bar:baz.txt
ssh_askpass: exec(/usr/sbin/ssh-askpass): No such file or directory
```
となって、動かない。
cygwinのminttyなどの端末でssh-agent, ssh-addを実行してsshのパスフレーズを入力し、その端末からntemacsを起動すれば、ntemacs上でパスワードやパスフレーズを入力する必要がないので、trampが期待通りに動く。

```shell-session:cygwin-shell
% eval `ssh-agent`
Agent pid 12748
% ssh-add
Enter passphrase for /home/USER/.ssh/id_rsa: 
Identity added: /home/USER/.ssh/id_rsa (/home/USER/.ssh/id_rsa)
% /cygdrive/c/emacs-25.1/bin/emacs
```
しかしtrampの使用頻度は少ないので、常に端末からemacsを起動しておくのは面倒であり、普段は端末からではなく[ショートカットをクリックするだけでntemacsを起動](http://qiita.com/styzo/items/e876598afb80c0a2ffbb)したい。そしてtrampを使いたいときには、ntemacsを再起動せずにそのまますぐに使いたい。

cygwinの端末でssh-agent, ssh-addを実行すると``SSH_AUTH_SOCK``と``SSH_AGENT_PID``の二つの環境変数が設定されるので、trampを使いたいときには同じ値をemacs上で設定すればよい。

```el:emacs
M-x eval-expression
Eval: (setenv "SSH_AGENT_SOCK" "/tmp/ssh-xxxxx")
M-x eval-expression
Eval: (setenv "SSH_AGENT_PID" "12345")
```

コピー&ペーストは面倒なので、emacsclientを使って簡単に設定できるようにした。

```sh:.zshrc
alias trampsetup='emacsclient -n -e "(progn (setenv ¥"SSH_AUTH_SOCK¥" ¥"$SSH_AUTH_SOCK¥") (setenv ¥"SSH_AGENT_PID¥" ¥"$SSH_AGENT_PID¥"))"'
```

```el:init.el
(server-start)
```

ショートカットをクリックしてemacsを起動し、trampを使いたくなったら、cygwinの端末を起動して以下を実行する。

```shell-session:cygwin-shell
% eval `ssh-agent`
Agent pid 12748
% ssh-add
Enter passphrase for /home/USER/.ssh/id_rsa: 
Identity added: /home/USER/.ssh/id_rsa (/home/USER/.ssh/id_rsa)
% trampsetup
"12748"
```
```el:emacs
C-x C-f
Find File: /sshx:foo@bar:baz.txt
Tramp: Waiting for prompts from remote shell...done
Tramp: Found remote shell prompt on ‘bar’
Tramp: Opening connection for edge using sshx...done
Tramp: Inserting ‘/sshx:bar:/home/foo/baz.txt’...
```
Windows版 PHP 7.1 で日本語パス(パス文字列のエンコーディング)が対応されることによる影響

## 現象

[#1854 Fixed the UTF-8 and long path support in the streams on Windows.](https://github.com/php/php-src/pull/1854) が PHP 7.1.0 Alpha 2 に [マージ](https://github.com/php/php-src/commit/3d3f11ede4cc7c83d64cc5edaae7c29ce9c6986f) されました。

1.  最大パス長が2048バイトになりました。
2.  今まで、 `get_file_contents` の引数などのパス文字列のエンコーディングは、日本語版Windowsの場合、 `CP932` でしたが、これが、INIディレクティブ(internal_encoding, default_charset, zend.multibyte) に依存するようになりました。([RFC](https://wiki.php.net/rfc/default_encoding))
3.  コンソールのコードページがやんわり対応されました。

(※ [PHP 7.1 UPGRADE NOTES の 12. Windows Support](https://github.com/php/php-src/blob/PHP-7.1.0/UPGRADING) も参照)

**この対応により、間接的に日本語パス(0x5c問題)が解決されますが、既存のPHPソースコードにて、パス文字列のエンコーディングを操作していたり、0x5cをエスケープしていた場合は、 個別に修正が必要です。**

## 対策(及び確認項目)

### 対策方針候補

1.  設定もアプリケーションも全て `UTF-8` にする(推奨)
2.  php.ini の [default_charset](http://php.net/manual/ja/ini.core.php#ini.default-charset) を `CP932` にする。(影響範囲に注意)
3.  個別に `ini_set('default_charset', 'CP932');` (コンソール出力が乱れる可能性あり)
4.  個別に `mb_convert_encoding('日本語.txt', 'UTF-8', 'CP932')` (緊急応急処置として)

※ 基本的に `1.` で対応(したい)。大量のPHPソースコードを Shift_JIS(CP932) にしていた場合など、 他も検討。

### 影響のありそうなケース(既存のPHPソースコードのチェック対象)

※ `Case 2` 以降の例では、``file_get_contents`` の引数のみですが、 ``fopen``, ``file`` などパス文字列に関連する全ての処理がチェック対象です。

### Case 1: コンソール出力時に文字コードを変換している場合

```php
<?php
if (PHP_OS === 'WIN32' || PHP_OS === 'WINNT') {
    ob_start(function($buffer) {
      return mb_convert_encoding($buffer, 'CP932', 'UTF-8');
    });
}
echo '日本語';
/* vim:set fenc=utf8 ff=unix: */
```

ソースコードがUTF-8の場合、 `ob_start` ごと不要。PHP5も対応しときたい場合は以下

```php
<?php
if (((PHP_OS === 'WIN32') || (PHP_OS === 'WINNT'))
 && (version_compare(PHP_VERSION, '7.1.0') < 0)
) {
    ob_start(function($buffer) {
      return mb_convert_encoding($buffer, 'CP932', 'UTF-8');
    });
}
echo '日本語';
/* vim:set fenc=utf8 ff=unix: */
```

### Case 2: パスの文字列のエンコーディングを変更していた場合。

```php
<?php
echo file_get_contents(mb_convert_encoding('日本語.txt', 'CP932', 'UTF-8'));
/* vim:set fenc=utf8 ff=unix: */
```

以下のようにエンコーディング変更ロジックを削除。

```php
<?php
echo file_get_contents('日本語.txt');
/* vim:set fenc=utf8 ff=unix: */
```

### Case 3: パスの文字列の 0x5c をエスケープしていた場合。

```php
<?php
echo file_get_contents(mb_convert_encoding('表\.txt', 'CP932', 'UTF-8'));
echo file_get_contents(addcslashes(mb_convert_encoding('表.txt', 'CP932', 'UTF-8'), '\\'));
/* vim:set fenc=utf8 ff=unix: */
```

このエスケープ処理も削除。

```php
<?php
echo file_get_contents('表.txt');
echo file_get_contents('表.txt');
/* vim:set fenc=utf8 ff=unix: */
```

## 関連

*   [Windows版 PHP(7.1前) での日本語パスの対応状況と暫定回避策](http://qiita.com/algo13/items/479a44aac713c01ee454)
*   [PHPのdirname関数でWindows環境のShift_JISパス文字列のディレクトリ名の末尾に特定のコードが入るとディレクトリが欠落する現象](http://qiita.com/TaMaMhyu/items/63386f610a839b9511eb)