OmniAICreator/Qiita-1.07M huggingface dataset:
Forms.Contextが使えなくなった

Xamarin.Forms,Xamarin.Androidのサンプルコードで見かけるForms.Contextが存在しないと言われググって解決方法を見つけました。

#古
無効になったコード

```csharp
var context = Forms.Context;
```

#新１ 
Xamarin.Forms.Platform.Android.dllを参照している場合に有効なコード

```csharp
var context = Xamarin.Forms.Forms.Context;
```

#新２
Mono.Android.dllを参照している場合に有効なコード

```csharp
var context = Android.App.Application.Context;
```


#参考
https://forums.xamarin.com/discussion/comment/55515#Comment_55515
Prism for Xamarin.Forms入門　よりみち：DependencyService - nuits.jp blog http://www.nuits.jp/entry/2016/09/11/230541
Xamarin.Formsからプラットフォーム固有の機能を利用するには？（DependencyService利用） - Build Insider http://www.buildinsider.net/mobile/xamarintips/0008
DockerでPHP + Nginx + MySQLの環境を構築する

[CakePHP3もくもく勉強会](https://connpass.com/event/63761/)に参加してきたので諸々メモです。

## レベル感
・業務でPHP触ってたけど触ってただけで何も分からん
・Docker入れてるけど入れてるだけで使っとらん
・XAMPPしか使ったこと無いけどMacでPHPの環境構築どうすんの
・Laravelってオシャレでイケてそうだよね、使ったこと無いけど
・ガチもくもくしてると進捗ゼロで終わると思う

## やったこと
・localにワークスペース用ディレクトリ用意した
・Docker for Macインストールした
・docker-compose.ymlを書いた
・docker-compose up -dした
・立ち上がったの確認した

## やってないこと
・CakePHP導入してない
・dockerfile書いてない
・何も分からなくて常に質問してたのでもくもくしてない

## PHP + Nginx + MySQLの環境構築
#### ・ローカルにテキトーにプロジェクトフォルダ作る
php-projectでもproject1でもhogeでもpiyoでもなんでも

#### ・Docker for Macのインストール
元から導入してたので割愛。テキトーに調べてよしなに。

#### ・環境構築するためのdocker-compose.ymlを書く
```docker-compose.yml
version: '2'
services:
  # DB
  mysql:
    container_name: "mysql"
    image: mysql:5.6
    ports:
      - '3306:3306' #デバッグ用
    environment:
      MYSQL_ROOT_PASSWORD: root
  # nginx
  nginx:
    container_name: "nginx"
    image: nginx:1.11
    links:
      - mysql
      - php
  # php
  php:
    container_name: "php"
    image: php:7.1-apache
    ports:
      - '80:80'
    volumes:
      - ./html:/var/www/html
    links:
      - mysql
```
portsあけてあげないとコンテナにアクセスできない（mysqlの方はデバッグ用に空けてるけど本番に上げるような時は消す）。
imageは全部DockerHub参照。今回のは公式のもの。
linksでそれぞれ紐付けてあげる。
volumes設定しておかないとPHPの実行ファイル置けない。

#### ・立ち上げから動作確認まで
作業ディレクトリに移動

```
$ cd php-project/
```

起動

```
$ docker-compose up -d
```
こんな感じ

```
$ docker-compose up -d
Creating mysql ...
Creating mysql ... done
Creating php ...
Creating php ... done
Creating nginx ...
Creating nginx ... done
```
立ち上がったか確認

```
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                    NAMES
7189eeac3c46        nginx:1.11          "nginx -g 'daemon ..."   About a minute ago   Up About a minute   80/tcp, 443/tcp          nginx
743cb3712ddd        php:7.1-apache      "docker-php-entryp..."   About a minute ago   Up About a minute   0.0.0.0:80->80/tcp       php
211bbb776158        mysql:5.6           "docker-entrypoint..."   About a minute ago   Up About a minute   0.0.0.0:3306->3306/tcp   mysql
```

この時点でphp-project/htmlディレクトリが出来てるので、その配下にindex.php置く

```php:index.php
<?php
phpinfo();

```

http://localhost にアクセス。
phpinfoが見えるのを確認する。

停止

```
$ docker-compose stop
```
削除

```
$ docker-compose rm
```

削除前にちゃんと停止してね。

## 次にやりたいこと
CakePHP3の導入。

## 感想
すごいけどよくわからないことだらけなのでもっと勉強します。
その他、XAMPPとDockerって何が違ってどういう点でメリットがあるのとか聞いた。
教えてくれた @suin さんも記事書いてました↓

CakePHP3もくもく勉強会#2レポート「DockerでPHPの開発環境を構築しよう」
http://qiita.com/suin/items/6d70f9c960056533ebb2
夏休み到来! ChaiScript で新しい C++ スクリプティング体験を極めよう!

夏休み到来! :sunflower: 

漢なら C++ で自由研究ですね! :watermelon:

C++ をゴリゴリ書いてもいいけど, 毎回コンパイルが大変... JSON-RPC で受け取ったメッセージのデータチェックとか, ユニットテスト用のスカッフォードコードとか, そーゆーのはスクリプトで処理とかしたいですね. 

そこで, 夏休みの到来とともに, 新しいやり方にチャレンジしてみよう! 今年のおすすめは **ChaiScript** だよ. :tea:

http://chaiscript.com/

Intel の作っているレイトレーシングベースの可視化フレームワーク OSPRay でつかわれていたりするよ.

https://github.com/ospray/ospray
https://github.com/ospray/ospray/tree/master/apps/common/script

## ChaiScript の特徴

* ECMAScript っぽい文法
* ヘッダオンリーで使える!
* C++ との親和性高い! 
  * **C++14 対応コンパイラ必要!**(ちょっと前までは C++11 で済んだのでかなしい... :sob:)
  * 例外サポートや, STL 型対応とか. 
  * マルチスレッド対応
* JSON ユーティリティあり! (`to_json`, `from_json`) :muscle:

残念ながらドキュメントはチートシート https://github.com/ChaiScript/ChaiScript/blob/develop/cheatsheet.md 以外は貧弱なんで, 詳細知りたかったらソースコード眺めてね!

### できないこと

* math 関数とかは組み込み型としては無い. 基本的に自分でバインドを書くことで対応

## まとめ

* Reference が単に Doxygen ドキュメントで内容がほとんど無いに等しくて悲しい. :sob: 
* **優秀な C++ 若人が, ChaiScript を極めることにより優秀な C++ スクリプティング若人へと人類史上最速で昇華し, 夏の自由研究を滞りなく 8 月 31 日に完成することができるような人材へと育成するスキームを確立する旅に出たい.** :rocket:
Slimに日本語を書く

SlimというHTMLに変換する言語があります。Hamlみたいな感じだと思えば良いのですが、日本語（や、韓国語や中国語）を書くときには、Slimを使った方が良い感じになります。

* Slim - http://slim-lang.com
* HAML - http://haml.info

ソースコードに文章を書いていて改行したときに、変な空白がHTMLに入らないようにする話です。

# 英語みたいなのを書く

特に考えずに適当に書いて、単語の切れ目で改行して大丈夫です。

```
p Hello World

p Hello
  World

p
  | Hello
    World
```

HTMLには改行がそのまま出力されるので、改行した位置に空白が一個入って表示されることになります。これは、英文みたいのの場合には都合が良い。

```html
<p>Hello World</p>

<p>Hello
World</p>

<p>Hello
World</p>
```

文毎に改行するなどすると、極端に一行が長くなることがなくて、良いと思います。

# 日本語を書く

しかし、これは、日本語だと困ったことになります。

```
p こんにちは
  世界
```

が

```html
<p>こんにちは
世界</p>
```

になってしまうので、ブラウザに表示したときには「こんにちは」と「世界」の間に空白が入ります。英文と同じように文毎に改行すると文と文の間に空白が入ることになりますので、これはまーぎりぎり許容範囲内かもしれませんが、やっぱりかっこ悪い。

これを防ぐには、`|`を繰り返します。

```
p
  | こんにちは
  | 世界
```

これだと

```html
<p>こんにちは世界<p>
```

になります。

# まとめ

* Slimで地の文を書くときには文毎くらいに改行を入れたいのです。長すぎると読むのが辛いので。
* 英文を書くときにはそのまま改行します。毎行頭に`|`を入れると、単語間が詰まってしまって残念なことになります。（この場合は、あからさまに意味が変わってくるので、ぱっと見で気づくでしょうけど。）
* 日本語を書くときには、逆に全ての行頭に`|`を入れましょう。これで、Slimで改行をしてもHTMLにはその効果はあらわれません。（こちらの場合は、ぱっと見で気づかないことがあるかもしれないので、特に注意しましょう。）

## HAMLだと？

これを制御する方法はありません。

日本語を書きたいときには、

* 改行せずにだらっと書いてしまう
* 改行を潰すフィルタを書く

などの対処法があります。

# その他

`'`とか`>`とか、微妙にいろいろと記法があるので、覚えておくとたまに便利です。
ESP8266でTONE()のあとプチプチクラックノイズが出てしまう問題対策

noTone(pin);
で音を止めると発生しなくなりました！

  tone(pin,NOTE_G6,BEAT);
  delay(BEAT);
↓
  tone(pin,NOTE_G6,BEAT);
  delay(BEAT);
  noTone(pin);
デザインパターンを勉強してみる --第1回 導入編--

# はじめに
SEになってこのかた、デザインパターンというものを勉強したことがなかったので
この度やってみようと思います。
投稿では自分の頭の中を整理するために、勉強の結果をまとめていこうかと。
また、僕みたいにデザインパターンを学んだことがない人とか、あと、開発経験がそんなになくて
少しでも開発のノウハウが欲しい人向けに書こうかと思います。
(何回かに分けて書きます。)

## デザインパターンとは
デザインパターンとは、簡単に言うと「設計のカタログ」です。
JavaやRubyなど、オブジェクト指向の言語で過去のエンジニアが解決してきた方法（設計）が、
デザインパターンとしてまとめられているのです。

デザインパターンと言ってもいろいろとあるらしいですが、良く聞くのはGoF（Gnag of Four）です。
「生成」や「構造」、「振る舞い」の3つに分類された、23のパターンがあります。

>※GoF
"Gang of Four"の略称。『オブジェクト指向における再利用のためのデザインパターン』を書いた
Erich Gamma、Richard Helm、Ralph Johnson、John Vlissidesの四人（ないし彼らの提唱するデザインパターン体系）をさす。"GoF"の呼称は文化大革命の「四人組」に由来。
参照：http://d.hatena.ne.jp/keyword/GoF

## デザインパターンの目的
デザインパターンに取り組むべき主な目的は、以下の3つです。
####ペストプラクティスを体得する。
・エンジニアが試行錯誤して生み出したプログラム設計のベストプラクティスを
　少ない時間で体得する（利用する）ことができる
　⇒プログラミングの効率化もでき、先人のアイデアを学ぶこともできる。
#### 再利用性の高いコードを書く
・コードの見通しも良くなり、メンテナンス性も高まる
#### エンジニア同士の共通言語にする
・エンジニアの中には、デザインパターンに親しんだ人も数多くおり、
　デザインパターンが考慮されたコードは、他のエンジニアにとっても読みやすいコードになる
## デザインパターンの種類
GoFデザインパターンという定番パターンは全部で23種類あります。
それぞれ3つに分類されています。
#### オブジェクトの生成に関するパターン
|Abstract Factory|Prototype|
|:-:|:-:|
|**Builder**|**Singleton**|
|**Factory Method**||
#### プログラムの構造に関するパターン
|Adapter|Decorator|Proxy|
|:-:|:-:|:-:|
|**Bridge**|**[Facade](http://qiita.com/ysakura24/private/f8e136307dd12903554f "Facade")**||
|**[Composite](http://qiita.com/ysakura24/items/aae5e59a649bf8009bd9 "Composite")**|**Flyweight**||
#### オブジェクトの振る舞いに関するパターン
|Chain of Responsibility|Mediator|Strategy|
|:-:|:-:|:-:|:-:|
|**Command**|**Memento**|**Template Method**|
|**Interpreter**|**[Observer](http://qiita.com/ysakura24/items/428fa79b722517782627 "Observer")**|**Visitor**|
|**Iterator**|**State**||
# 次回
今回は導入編ということで触りだけだったので、物足りない感があるかもです。
次回から、本題の各パターンの勉強に入ります。
といっても23パターン全てについて学ぶ気はなく、特に仕事の現場で使えそうなパターンに
焦点をあてて勉強しようかと思います。
次回はFacade(ファサード)パターンについて勉強しようと思います！

最後になりますが、不備やご意見などがあればコメントを頂けると嬉しいです。
Mac版 IPMsg Log Converter


- [Mac版のIPMsg](http://ishwt.net/software/ipmsg/)のログは標準だとエディタでみるだけです。
- そこでsqlite3.db形式に整形するスクリプトをつくりました。
- 各種sqliteビューアで見ることができます。

## リポジトリ(GitHub)

- https://github.com/qoAopx/ipmsg_logconv

## 必要な環境(mac os)

- 下記環境で作成しました。
    1. nkf (2.1.4 brewでインストールできます)
    1. python3 (pyenvなどで)
    1. sqlite3 (3.20.0 brewでインストールできます)
    1. [DB Browser](http://sqlitebrowser.org/)などのsqlite3ビューア

## 使い方

- ダウンロード or git clone してプロジェクトをダウンロード
- convert_ipmsg_log.commandをダブルクリック
    - ipmsgのテキストログファイルをsqlite3.db形式に整形します。
    - 整形したsqlite3.dbファイルを開きます。（デフォルトアプリが起動します。）

- convert_ipmsg_log.commandのエイリアスを作るのがおすすめです。

## 活用法

- sqlite3.db形式なので、DB BrowserのBrowse Dataでふつーにみれますし、フィルタやソートもSQLなしで可能です。

- さらにSQL使えば一日前のメッセージを抽出なんてこともできますね。

```sql
SELECT 
	*
FROM
	ipmsg_log
WHERE
	datetime >  datetime( current_timestamp , "-1 days") 
ORDER BY
	datetime desc
	
```
[クイズ]javascriptと仲良くなるための一歩　第２５話「関数で不変オブジェクト 注意２」

#問題

```js
function MyClass() {}
MyClass.prototype.x = 1;
var obj = new MyClass();

obj.x                //=> 1
obj.x = 10;
obj.x;               //=> 10
Object.freeze(obj);
obj.x = 100
obj.x                //=> ?

var obj2 = new MyClass();
obj2.x               //=> 1
obj2.x = 10;
obj2.x               //=> ?
```


:mouse:
:cow:
:tiger:
:rabbit:
:dragon_face:
:snake:
:horse:
:sheep:
:monkey_face:
:bird:
:dog:
:boar:
:mouse:
:cow:
:tiger:
:rabbit:
:dragon_face:
:snake:
:horse:
:sheep:
:monkey_face:
:bird:
:dog:
:boar:

#答え

- プロトタイプ継承元も不変にしたければ、継承元に対して明示的に行う必要がある

```js
function MyClass() {}
MyClass.prototype.x = 1;
var obj = new MyClass();

obj.x                //=> 1
obj.x = 10;
obj.x;               //=> 10
Object.freeze(obj);
obj.x = 100
obj.x                //=> 10

var obj2 = new MyClass();
obj2.x               //=> 1
obj2.x = 10;
obj2.x               //=> 10
```
Windows 10 SがMSDNで公開されたのでインストールしてDelphi/C++BuilderでビルドしたUWPアプリを実行してみる

2017年6月に [Delphi/C++Builderで作成したUWPなアプリをWindows 10 S相当の制限モードで実行できるかどうか試してみる](http://qiita.com/kazinoue/items/5358b82cd5b04c2fa6da) という記事を書きましたが、この時点では Windows 10 S が MSDN で公開されていませんでした。ですのでマイクロソフト様が公開しているポリシーファイルを用いて同等の権限縛りとなるようにしてみたわけです。

しかし2017年7月末にMSDNでWindows 10 Sのインストール用ISOファイルが公開されましたので、これを用いてネイティブな Windows 10 S 上で動作確認してみました。

>2018/07/12 追記
Windows 10 Sと同等の制限モード はWindows 10 1803 からは設定変更により利用できるようです。この手順については下記の
URLを参照してください。
https://docs.microsoft.com/en-us/windows-hardware/manufacture/desktop/windows-10-s-enable-s-mode

# Windows 10 S インストール時の注意事項

インストール自体は普通の Windows 10 と大きく違う点は無いと感じましたので、インストール手順の詳細は省略します。

ただし Windows 10 S を仮想マシンにインストールする場合は、仮想マシン向けの各種補助ツールが導入できないことに注意してください。考えてみれば当たり前の話なのですが、**Windows 10 S ではストアアプリ以外の実行が制限されているのですから、各種補助ツールの実行よりも前段階の話として、そもそもインストーラ自体が実行できないわけです。**


このことにより仮想マシン向けのドライバインストールも制限されます。最近の仮想マシン環境では補助ツールとドライバがインストーラで一括導入されますが、そのような作業も行えません。ただしVMwareのように、インストーラに含まれるドライバを抽出できるなら手作業での導入は可能です。ドライバの抽出手順は VMware の KB に説明されています。

https://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=2097834

しかしそれを行うにしても、当然ながら Windows 10 S 以外の環境で抽出せねばなりません。また抽出されたドライバを仮想マシンに受け渡す操作をホストーゲスト間のコピー＆ペーストで行うことはできず、おそらくはUSBメモリやUSBハードディスク、あるいはCD-RやDVD-R経由で受け渡すのがもっとも簡単な方法かもしれません。

なお、他の仮想化ソフトウェアで同様の作業が行えるかどうかは調べておりません。

# 動作確認

このスクリーンショットには、下記4つを表示しています。

- 設定アプリでの Windows エディションの表示
- デバイスマネージャーでのディスプレイアダプタがVMwareであることの確認
- diskpart.exe を実行した状態
- Delphi/C++Builder でビルドしたUWPなアプリの例として「かんたんスライドパズル」の実行時の画面

![image.png](https://qiita-image-store.s3.amazonaws.com/0/149350/826ac64a-e9f8-9135-4c69-7869f764a3f7.png)

ここで実行している「かんたんスライドパズル」は以下のURLで入手できます。

https://www.microsoft.com/store/apps/9nblggh40lbr

なお、このアプリを Windows Store で公開するまでの顛末は @kazaiso さんの記事 [Desktop Bridgeアプリ を Windowsストアへ申請・登録して公開する手順](http://qiita.com/kazaiso/items/df012c9777585f1e880a) で詳しく説明されていますので、興味のある方はこちらもお読みください。

スクリーンショットの話に戻すと、diskpart.exe はコマンドプロンプト同様の黒い画面なので大変紛らわしいのですが、これはコマンドプロンプトではありません。そして UWP ではなく exe ですけど実行できています。従って Windows 10 S は実行できるアプリが絶対に UWP だけ、というわけでもなさそうです。ただしこれはあくまで OS に付属のアプリに関する例外事項なのでしょう。

なお、前回の記事で書いたことと重複しますが、この実験の結果は「Delphi/C++Builder で作成したアプリや、その他のツールで開発したアプリを Desktop Bridge でUWPに変換すれば Windows 10 Sですべて動く」ということを意味してはいません。開発したアプリが Windows 10 S で動作するかどうかは、どのような開発ツールを使うにせよ、個別の検証は当然必要です。
絶対にやってはいけない「Apple IDをテストで13歳未満にすること・・」

# 概要
- AppleIDの生年月日を13歳未満にすると、
- そのアカウントが成長!？して13歳になるまで修正できないというお話（；；）

# Apple IDとは 
-> iPhoneとかMacとか使うというに使うアレ

公式サイト説明：https://support.apple.com/ja-jp/apple-id
> **Apple ID とは？**
> Apple ID とは、App Store、Apple Music、iCloud、iMessage、FaceTime などの Apple のサービスを利用する時に使うアカウントのことです。たった一つの Apple ID とパスワードで Apple のすべてのサービスにサインインできます。


# 詳細
## :point_up:今回やりたかったこと:point_up:
→ファミリー共有のテストをしたい（未成年のアカウントで）
 
 ```
IAPを導入したくて、いろいろテストをしていたところ、
ファミリー共有という機能があることが判明。
```

> :shamrock:子供のアカウントでアプリで課金したりするときは、親のアカウントに承認リクエストが飛びます。
→https://www.apple.com/jp/icloud/family-sharing/


> ![image.png](https://qiita-image-store.s3.amazonaws.com/0/187252/f8954ece-952c-6f7a-eb5a-a7233e523b85.png)

## :eye:犯してしまった罪:eye:
→テキトーに自分のAppleIDの生年月日を2010年生まれにしてみた
→ファミリー共有に追加した（７歳)

<img src="https://qiita-image-store.s3.amazonaws.com/0/187252/ed58c84a-8870-7aa6-c7f8-6115a90c92f2.png" width=30%>

- そのままファミリー共有テスト進めた
    - 子供のアカウントで購入テストをすると、親の端末に承認依頼がいき、無事に処理されテストが終了した。

## :skull:問題発生:skull:
→テストが終わったので、誕生日を戻した・・い・・・！！！！　

- すると、誕生日の編集画面がグレーアウトされていて・・
- →誕生日が戻せない・・！！！！！
- （Appleサポートにご連絡ください　みたいな文言が出てたけどスクショ撮り忘れました」

## こんな記述を発見した
[ヘルプ：Apple ID に関連付けられている生年月日を変更する](https://support.apple.com/ja-jp/HT204164)
> ![image.png](https://qiita-image-store.s3.amazonaws.com/0/187252/039afb04-a4c5-13cd-0149-4fefcfe52a76.png)
> 公開日： 2017/06/29

→なん・・だと・・・・・・・

「編集できないのか。Appleに問い合わせすれば戻してもらえるのね」

## :frowning2:Appleに問い合わせ:frowning2:
- 電話してみた

1.事情を説明

```
私「ファミリー共有のテストがしたくて、子供用のアカウントの誕生日を2010年にしたら編集できなくなりました、どうすれば戻せますか？」
Appleさん「お調べしますので少々お待ちください」
↓
 数分待つ
↓
Appleさん「一度ファミリーに戻していただくと親のほうに承認がいって編集ができるようになります」
↓
私「了解です。ありがとうございます！」電話きる
```

2.ファミリー共有を再度設定する
`「いや、待てよ、、そもそも！！ファミリー共有外せないから・・・ずっとファミリーのままだった・・・」`

> ヘルプ：[ファミリー共有とお子様用の Apple ID](https://support.apple.com/ja-jp/HT201084)

>> お子様は、13 歳* になるまではファミリー共有グループにとどまる必要があります。ただし、必要ならお子様を別のファミリー共有グループに移すことができます。

> **→１３歳未満の子供はファミリー共有外せない！！！！**


3.再度電話

```
私「あの・・そもそも、、ファミリー共有外せないので、、ファミリーのままでした。なのに編集できません！！」（１３歳未満ってことが伝わってなかったのかな・・・？）
Appleさん「お調べしますので少々お待ちください」
↓
結果、、修正できる方法がなさそう。
↓
妥協案
→Appleさん「ご本人の確認ができれば直接編集できるようにします」

とのことで、秘密の質問を電話で答えさせられるという恥ずかしい思いをしたら、
編集できそうな状態にはなりました。

生年月日がグレーアウトされていたけど、入力はできるようになりました。
```

> ![image.png](https://qiita-image-store.s3.amazonaws.com/0/187252/47a6d64e-7b2c-7e29-a901-4c5f23fa6956.png)

```
しかし、保存はできない・・オワタ
```

4.問い合わせひたすら待つ

```
「わたくしのほうでは対応できないので、
テクニカルななんとかさんに・・」

それでもだめで

「スペシャリストのなんとかさんに・・」

それでもだめで

↓ 最初の電話から2時間くらい試行錯誤した結果

Appleさん「13未満のお子様のアカウントの場合、誕生日は修正することができません。」
Appleさん「いま７歳なので、あと６年ほど成長？といいますか、時間がたつのをお待ちください・・」
```

せ、せ、成長・・・。６年・・・
あああああああああああ！！！！
マジカ！！！！！！！

```
私「データいじってもらうとかできないんですかね・・」
Appleさん「それもできな・・・６年お待ちいただくしか・・」
```

以上です。後半雑
20行で「すべて」理解するredux-thunk

何かと議論の対象になるredux-thunkですが、本体はたった15行のライブラリです。

```javascript:redux-thunk/src/index.js
function createThunkMiddleware(extraArgument) {
  return ({ dispatch, getState }) => next => action => {
    if (typeof action === 'function') {
      return action(dispatch, getState, extraArgument);
    }

    return next(action);
  };
}

const thunk = createThunkMiddleware();
thunk.withExtraArgument = createThunkMiddleware;

export default thunk;
```
ミドルウェアのnextを隠匿して、「function型のactionが来たらそれを実行する」だけ。
素晴らしいコードは短いといういい例ですね。
今日のmeteor-fanの勉強会で教えてもらい衝撃だったのでメモ。
本家のreadmeが232行あって、コードの15倍くらいあるのが笑いどころでした。
Amazon SESの雰囲気を試す小さなメモ（サンドボックス）

たまによく分からなくなるので基本をメモ

# 概要
- サンドボックスの状態でSESを試してみる
    - 送信元/送信先は検証済みのメアドしか無理
    - 同じメアドを使うなら送信元/送信先は一緒
- AWS APIとSMTP両方でメール送信を試すまで
- SMTPクライアントはOutlook 2013
- リージョンはオレゴン

# 手順
## 1. サンドボックス確認

マネコンにアクセスすると以下みたいにメッセージが出ているはず


```
Your Amazon SES account has "sandbox" access in region 
```

![1.png](https://qiita-image-store.s3.amazonaws.com/0/50690/23fb85bb-940e-9d6d-7764-2d4a80db4f5b.png)


## 2. メールアドレスのVerify
検証に使うメアドをVerifyする

![2.png](https://qiita-image-store.s3.amazonaws.com/0/50690/ecfd9c97-8298-5773-4560-bc798fe19cd6.png)

![3.png](https://qiita-image-store.s3.amazonaws.com/0/50690/389956cb-6725-21ea-f76e-6dc62ba12074.png)

![4.png](https://qiita-image-store.s3.amazonaws.com/0/50690/dd8dd74e-40b8-7650-d301-877c6f8f4d5b.png)

以下みたいなメールが届くのでぽちる

![5.png](https://qiita-image-store.s3.amazonaws.com/0/50690/172d5933-1254-0808-3c8d-2808b002c254.png)

![6.png](https://qiita-image-store.s3.amazonaws.com/0/50690/b9697c86-ddc4-a185-7009-b6f3dd995608.png)

※この段階でAPIによる送信を試す場合は、3は飛ばしてOK

## 3. ユーザ作成

以下でSMTPユーザ作る
![7.png](https://qiita-image-store.s3.amazonaws.com/0/50690/0385c0bc-57af-9a94-5e20-671d3f927403.png)


## 4. メール送信（API）
AWS CLIを利用

```
aws --region [リージョン] ses send-email --to [送信先メアド] --from [送信元メアド] --subject subject --text "text"
```

## 5. メールクライアント(SMTP)

以下参照（力尽きた）
Amazon SES を介して送信するために、E メールクライアントを設定する - Amazon Simple Email Service http://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/configure-email-client.html
【Objective-C】XCTestで非公開クラスの非公開メソッドをリフレクションを使ってテストする

この記事では、XCTestで非公開クラスの非公開メソッドをユニットテストする方法を紹介します。

クラス自体が非公開の場合、公開クラスをテストする時のように、テスト対象クラスのヘッダファイルをimportするやり方では記述できないので、代わりにリフレクションを使うことでメソッドのテストができます。

※そもそも設計が悪いのではないかとか、publicで提供するべきではないかといった議論はまた別の機会に。

## テスト対象クラスの例

PublicClass.h/.mというファイルがあり、PublicClass.mにPrivateClassという今回のテスト対象クラスが実装されているものとします。

```objc:PublicClass.h

#import <Foundation/Foundation.h>

@interface PublicClass : NSObject

// Something

@end

```

```objc:PublicClass.m

#import "PublicClass.h"

#pragma mark - PrivateClass

@interface PrivateClass : NSObject

@end

@implementation PrivateClass

#pragma mark - private method

- (NSInteger)privateMethodWithValue1:(NSInteger)value1 value2:(NSInteger)value2 {
    return value1 + value2;
}

#pragma mark - private class method

+ (NSInteger)privateClassMethodWithValue1:(NSInteger)value1 value2:(NSInteger)value2 {
    return value1 * value2;
}

@end

#pragma mark - PublicClass

@implementation PublicClass

// Something

@end

```

PrivateClassには、`privateMethodWithValue1:value2:`というprivateなインスタンスメソッドと`privateClassMethodWithValue1:value2:`というprivateなクラスメソッドが実装されています。メソッドの内容は単純なので説明するまでもないでしょう。
この2つのメソッドが今回のテスト対象です。

## XCTestでテストする

テストプログラムは以下の通りです。メソッドが返す計算結果が期待する値になっているかをテストしています。
リフレクションのやり方ですが、言葉で説明するより実際にソースコードを見てもらった方が早いでしょう。

```objc

#import <XCTest/XCTest.h>

typedef NSInteger (*PrivateInstanceMethod)(id, SEL, NSInteger, NSInteger);
typedef NSInteger (*PrivateClassMethod)(id, SEL, NSInteger, NSInteger);

@interface XCTestSampleTests : XCTestCase

@end

@implementation XCTestSampleTests

- (void)setUp {
    [super setUp];
    
}

- (void)tearDown {
    
    [super tearDown];
}

// インスタンスメソッドのテスト
- (void)testPrivateMethod {
    Class cls = NSClassFromString(@"PrivateClass");
    SEL sel = NSSelectorFromString(@"privateMethodWithValue1:value2:");
    IMP method = [cls instanceMethodForSelector:sel];
    PrivateInstanceMethod func = (void *) method;
    id obj = [cls new];
    
    NSInteger res = func(obj, sel, 2, 3);
    
    XCTAssertEqual(res, 5);
}

// クラスメソッドのテスト
- (void)testPrivateClassMethod {
    Class cls = NSClassFromString(@"PrivateClass");
    SEL sel = NSSelectorFromString(@"privateClassMethodWithValue1:value2:");
    IMP method = [cls methodForSelector:sel];
    PrivateClassMethod func = (void *) method;
    
    NSInteger res = func(cls, sel, 2, 3);
    
    XCTAssertEqual(res, 6);
}

@end

```

**ポイント解説**

`NSClassFromString`関数に非公開クラスのクラス名を指定してClassを作ります。
`NSSelectorFromString`関数には非公開のメソッド名を指定してセレクタを作ります。(引数がある時は`:`が必要ですので忘れずに)

次にセレクタから`IMP`を作りますが、インスタンスメソッドの場合は`instanceMethodForSelector`メソッドを使い、クラスメソッドの場合は`methodForSelector`メソッドを使います。

typedefでテストするメソッドのカタチを定義していますが、第1引数のidと第2引数のSELは固定で、第3引数以降は実際のテストするメソッドの引数の型を列挙していきます。(引数の無いメソッドの場合は第2引数のSELまで)

`func`には、インスタンスメソッドの場合は`[cls new]`でインスタンスを生成して第1引数に、クラスメソッドの場合は`cls`をそのまま第1引数に渡します。第2引数にはセレクタを指定します。第3引数以降は実際のテストするメソッドに渡す値を指定します。

---
以上で非公開クラスの非公開メソッドをテストすることができました。
非公開なモノにアクセスするのはけっこう面倒なので、まずは実装の見直しや本当にテストする必要があるのか、といったことから検討すると良いかもしれません。
Raspberry PiでDNSサーバーを立てる

## DNSサーバーの構築

```
$ sudo apt-get install nsd
```

nsd.confを編集する

```
$ sudo nano /etc/nsd/nsd.conf
```

```bash:nsd.conf
# NSD configuration file for Debian.
#
# See the nsd.conf(5) man page.
#
# See /usr/share/doc/nsd/examples/nsd.conf for a commented
# reference config file.
#
# The following line includes additional configuration files from the
# /etc/nsd/nsd.conf.d directory.

# WARNING: The glob style doesn't work yet...
# include: "/etc/nsd/nsd.conf.d/*.conf"

server:
    ip-address: 10.0.0.100 # my-ipaddress
    database: "/var/db/nsd/nsd.db"
    username: nsd

zone:
    name: msrks.co.jp # my-fqdn 
    zonefile: /etc/nsd/msrsk.co.jp.zone # my-zonefile
```

zonefileを編集する

```
$ sudo nano /etc/nsd/msrks.co.jp.zone
```

```bash:msrks.co.jp.zone
$TTL 3600

@ IN SOA ns.example.com. root.msrks.co.jp.(
	20170101;
	3600;
	900;
	3600000;
	3600;
)
IN NS ns.msrks.co.jp.
IN A 10.0.0.100

python.com IN A 10.0.0.201
ruby.com IN A 10.0.0.202
```

サービスの再起動

```
$ sudo systemctl restart nsd
$ sudo systemctl enable nsd
```
EC2 UbuntuでGoogle Chromeをヘッドレス実行してスクリーンショットを採取する手順


# 概要
- Google Chromeをヘッドレス実行してスクリーンショットを採取する
- AWS EC2のUbuntuを利用する
- Python + Selenium + ChromeDriver

# 手順
コマンドのみを記述していますが、結果も確認する場合は `$ command`のようにプロンプト付きで記述します

## 仮想マシンを起動

- EC2 より、`Ubuntu Server 18.04 LTS (HVM) 64-bit`　を起動します
- sshログインして確認

```
$ cat /etc/issue
Ubuntu 18.04.4 LTS \n \l
```

## 作業用ディレクトリ
- home直下に `src` とします（適当）
- 基本的にこのディレクトリをカレントとして作業します

```
mkdir src
cd src
```

## Google Chromeをインストール

debパッケージをダウンロードしてインストール

```
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
sudo dpkg -i google-chrome-stable_current_amd64.deb
```

依存モジュールをaptでインストール

```
sudo apt update
sudo apt -f install -y
```

インストール確認

```
$ which google-chrome
/usr/bin/google-chrome
```

## Seleniumをインストール

aptでインストール

```
sudo apt install python3-selenium
```

ChromeDriverも合わせてインストールされるようです

```
$ which chromedriver
/usr/bin/chromedriver
```

## 日本語フォントをインストール(IPA)

その前に unzip をインストール

```
sudo apt install unzip
```



ダウンロードして展開（ファイル名指定する）

```
wget https://moji.or.jp/wp-content/ipafont/IPAexfont/IPAexfont00401.zip
unzip IPAexfont00401.zip -d ~/.fonts/
```

フォントキャッシュクリア

```
fc-cache -fv
```

fc-cacheコマンドの結果を確認(ユーザホーム部分)

```
(snip)
/home/ubuntu/.fonts/IPAexfont00401: caching, new cache contents: 2 fonts, 0 dirs
(snip)
fc-cache: succeeded
```


## サンプルソース記述


```py3:getss.py
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.binary_location = '/usr/bin/google-chrome'
options.add_argument('--headless')
options.add_argument('--window-size=1280,1024')

driver = webdriver.Chrome('chromedriver', chrome_options=options)

driver.get('https://ja.wikipedia.org/wiki/Google_Chrome')
driver.save_screenshot('./screenshot.png')
driver.quit()
```

実行

```
python3 getss.py
```

# 結果：取得したスクリーンショット画像

日本語も正しく表示されることを確認できます(アラビア文字？などは表示できていない）

![screenshot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53115/e40861d6-9ffa-18a2-7e83-2931e97d24ad.png)
スマホで撮影した画像をTrelloのカードにする

#困っていたこと
職場で[Trello](https://trello.com/)を利用していますが、ミーティングでホワイトボード等に書いた内容の写真をスマホで取ってTrelloにUPするのが面倒で困っていました。

#考えたこと
スマホで撮影するだけでUPさせようと考えました。

#実現方法
- [ifttt](https://ifttt.com/)を使って実現する

実際に撮影するとこのようなTrelloカードになります↓
![up.PNG](https://qiita-image-store.s3.amazonaws.com/0/146154/308bdf4d-26e2-3b81-4c31-bb889ffca791.png)



#動作条件
- インターネットに接続している
- Trelloとiftttのアカウントを持っている
- スマホにiftttアプリをインストールしている


#ハードウエア
- Androidのスマホ

#iftttの設定方法

１．スマホのiftttアプリを起動してログイン状態にする↓
![icon.PNG](https://qiita-image-store.s3.amazonaws.com/0/146154/3da76221-9ce0-eef9-fc4e-2b6da5ec4f28.png)


２．画面下部の「My Applets」を選択する
![0.png](https://qiita-image-store.s3.amazonaws.com/0/146154/c113e9c8-1181-c4cf-e8f0-d79f7941a625.png)

３．画面上部の「＋」を選択する
![0-5.png](https://qiita-image-store.s3.amazonaws.com/0/146154/38753852-2d49-3671-abf6-26908368f655.png)

４．「＋this」を選択する↓
![1.png](https://qiita-image-store.s3.amazonaws.com/0/146154/f99a6e95-3279-ab5d-6548-b4448e91ee15.png)

５．「Android Photos」を選択する↓
![2.png](https://qiita-image-store.s3.amazonaws.com/0/146154/7acfa7fa-7f4e-3d9d-9ff0-63fe1cc867d0.png)

６．選択後の画面を確認する↓
![3.png](https://qiita-image-store.s3.amazonaws.com/0/146154/b63be07d-2aca-c457-7088-5d59537ae291.png)

７．「＋that」を選択する↓
![4.png](https://qiita-image-store.s3.amazonaws.com/0/146154/d2ac860a-d035-8caf-8c0a-39c9a4ad4527.png)

８．「trello」と入力して検索して、選択する↓
![5.png](https://qiita-image-store.s3.amazonaws.com/0/146154/da21251b-b00f-b882-f29a-d7047b5769a9.png)

９．選択後の画面を確認する↓
![6.png](https://qiita-image-store.s3.amazonaws.com/0/146154/fd11b03b-47c2-d4fe-b9c0-e71b68e1a15d.png)

１０．スクロールしてボード名とリスト名を指定する↓
![7.png](https://qiita-image-store.s3.amazonaws.com/0/146154/4902da6a-3680-d625-9d27-fddef2bc84b6.png)

１１．最下部までスクロールして「Finish」を選択する↓
![8.png](https://qiita-image-store.s3.amazonaws.com/0/146154/4f4315bc-93a0-2a7a-5b45-cb236b473448.png)

１２．「On」にすれば完了↓
![9.png](https://qiita-image-store.s3.amazonaws.com/0/146154/7fba79dc-f3f6-ad30-67a9-9acace66390a.png)


#注意事項
「On」にしていると撮影したものは全てTrelloのカードになってしまうので使い終わったら「Off」にすることを忘れないようにする。
bundle identifier has not been set up correctly

Android向けにbuildしたら、
`bundle identifier has not been set up correctly`
とエラーが出た。

しかし、*File->build settings->PlayerSettings*を開いたけど、*Inspector->OtherSetting->Identification*の下に*bundle identifier*の項目がない。
その代わりに*Package Name*がある。

*bundle identifier*と同じように記入して解決。

エラーメッセージが変わってないだけなのかな。
Docker for MacでPHPの開発環境を起動する

こんにちは、れおりんです。

[[第2回]CakePHP3もくもく勉強会](https://connpass.com/event/63761/) で説明した内
容を掲載します。

シンプルなPHPのプログラムをApacheとPostgreSQLで起動します。

[Install Docker for Mac](https://docs.docker.com/docker-for-mac/install/) を
Stable(安定版)を最初にインストールしてください。

## html/index.php

```php
<?php

phpinfo();
```

## docker/Dockerfile

```dockerfile
FROM php:7-apache

RUN set -x && \
  apt-get -y update && \
  apt-get install -y libicu-dev postgresql-server-dev-9.4 && \
  NPROC=$(grep -c ^processor /proc/cpuinfo 2>/dev/null || 1) && \
  docker-php-ext-install -j${NPROC} intl && \
  docker-php-ext-install -j${NPROC} pdo_pgsql && \
  docker-php-ext-install -j${NPROC} pdo_mysql && \
  rm -rf /tmp/pear
```

## docker-compose.yml

```yaml
version: '3.1'
services:
  web:
    build:
      context: ./docker
    volumes:
      - ./html:/var/www/html
    ports:
      - "80:80"
    depends_on:
      - db
    tty: true
    stdin_open: true

  db:
    image: postgres:9.6.1
    ports:
      - "5432:5432"
    environment:
      POSTGRES_PASSWORD: dbpass
      POSTGRES_DB: docker_test
```


## 起動方法

```bash
docker-compose up
```

## 止める方法

```bash
docker-compose stop
```

## 環境を削除する方法

```
docker-compose rm
```
dockerでsearchまたはpullした時に名前解決が出来ないエラー

Windows7 にdocker toolboxをインストールしてdocker search pythonしたらエラーが出た。


```
$ docker pull python
Using default tag: latest
Error response from daemon: Get https://registry-1.docker.io/v2/: dial tcp: lookup registry-1.docker.io on10.0.2.3:53 server misbehaving
```

名前解決が出来てないのでsshでdocker本体にログインしてDNSサーバーを変える。

```
$ docker-machine ssh default
#ここでクジラ君が表示される
```

ログイン出来た後はviなり何なり使って

```/etc/resolv.conf
search localdomain
nameserver 10.0.2.3
```

を

```/etc/resolv.conf
search localdomain
nameserver 8.8.8.8
```

や他のDNSサーバに変えてやるとsearchやpullが通る。
イマイチググっても解決策が見当たらなかったのでネットワーク環境の問題っぽい。
Raspberry PiでNTPサーバーを立てる

## 1. NTPサーバーの構築

ntp.confを編集する

```
$ sudo nano /etc/ntp.conf
```

poolとrestrictの行を追加

```diff:ntp.conf
# /etc/ntp.conf, configuration for ntpd; see ntp.conf(5) for help

driftfile /var/lib/ntp/ntp.drift


# Enable this if you want statistics to be logged.
#statsdir /var/log/ntpstats/

statistics loopstats peerstats clockstats
filegen loopstats file loopstats type day enable
filegen peerstats file peerstats type day enable
filegen clockstats file clockstats type day enable


# You do need to talk to an NTP server or two (or three).
#server ntp.your-provider.example

# pool.ntp.org maps to about 1000 low-stratum NTP servers.  Your server will
# pick a different set every time it starts up.  Please consider joining the
# pool: <http://www.pool.ntp.org/join.html>
-server 0.debian.pool.ntp.org iburst
-server 1.debian.pool.ntp.org iburst
-server 2.debian.pool.ntp.org iburst
-server 3.debian.pool.ntp.org iburst
+#server 0.debian.pool.ntp.org iburst
+#server 1.debian.pool.ntp.org iburst
+#server 2.debian.pool.ntp.org iburst
+#server 3.debian.pool.ntp.org iburst
+pool ntp.nict.jp iburst

# Access control configuration; see /usr/share/doc/ntp-doc/html/accopt.html for
# details.  The web page <http://support.ntp.org/bin/view/Support/AccessRestrictions>
# might also be helpful.
#
# Note that "restrict" applies to both servers and clients, so a configuration
# that might be intended to block requests from certain clients could also end
# up blocking replies from your own upstream servers.

# By default, exchange time with everybody, but don't allow configuration.
restrict -4 default kod notrap nomodify nopeer noquery
restrict -6 default kod notrap nomodify nopeer noquery

# Local users may interrogate the ntp server more closely.
restrict 127.0.0.1
restrict ::1

# Clients from this (example!) subnet have unlimited access, but only if
# cryptographically authenticated.
#restrict 192.168.123.0 mask 255.255.255.0 notrust
+restrict 8.8.1.0 mask 255.255.255.0
+restrict 8.8.2.0 mask 255.255.255.0
+restrict 192.168.11.0 mask 255.255.255.0

# If you want to provide time to your local subnet, change the next line.
# (Again, the address is an example only.)
#broadcast 192.168.123.255

# If you want to listen to time broadcasts on your local subnet, de-comment the
# next lines.  Please do this only if you trust everybody on the network!
#disable auth
#broadcastclient
```
ntpデーモンを再起動する

```
$ sudo systemctl restart ntp
$ sudo systemctl enable ntp
```

## [option] 2. NTPサーバーの動作確認

別raspiで、NTPサーバーから時刻取得を試みる

```bash:別raspi
# ntpdateのインストール（ntpサーバーに時刻を問合せるunixコマンド）
$ sudo apt-get install ntpdate

$ sudo service stop ntp
$ sudo ntpdate <ntp-server-address>
9 Aug 10:53:12 ntpdate[1628]: adjust time server <ntp-server-address> offset 0.004484 se
```
Dockerで、1つのHostに2つのcontanierを立てて接続する


This is how we setup docker
[dockerのセットアップは、こちらを見て下さい](http://qiita.com/joji/items/39f5488308fc166964d8 "dockerのセットアップは、こちらを見て下さい") 

![スクリーンショット 2017-08-09 19.21.39.png](https://qiita-image-store.s3.amazonaws.com/0/39073/e0c66849-403b-3ea1-0146-98a14f14c0e8.png "スクリーンショット 2017-08-09 19.21.39.png")

This is in Vagrant

```:bash
sudo docker pull centos
```

```:bash
sudo docker pull mysql
```

```:bash
sudo docker run -d --name dbserver -e MYSQL_ROOT_PASSWORD='Password1_' mysql
```

```:bash
sudo docker run -it --name appserver --link dbserver:db centos /bin/bash
```

You can check ENV in container.
DB is alias name which you named above command "dbserver:db" 

```:bash
set | grep DB
```

```shell-session
DB_ENV_GOSU_VERSION=1.7
DB_ENV_MYSQL_MAJOR=5.7
DB_ENV_MYSQL_ROOT_PASSWORD=Password1_
DB_ENV_MYSQL_VERSION=5.7.19-1debian8
DB_NAME=/appserver/db
DB_PORT=tcp://172.17.0.2:3306
DB_PORT_3306_TCP=tcp://172.17.0.2:3306
DB_PORT_3306_TCP_ADDR=172.17.0.2
DB_PORT_3306_TCP_PORT=3306
DB_PORT_3306_TCP_PROTO=tcp
```

install mysql client

```:bash
yum install -y mysql
```

You can login

```:bash
mysql -uroot -pPassword1_ -h $DB_PORT_3306_TCP_ADDR
```
Docker上で動くre:dashのメールの送信設定

Dockerを使うことが避けて通れない事がある。
AWSなどで用意されている環境を除けばre:dashもその一つ。
しかしコンテナを使うと、従来通りのサーバのpostfixの設定ではメールを飛ばす事ができない。

コンテナ上でイチから作るシステムであれば、メールを飛ばす環境を整えるのも結構面倒。
re:dashもその心づもりで居たが、実はcomposeのymlに記載するだけでメールを送れる。

設定変更

```
vi docker-compose.production.yml

      REDASH_MAIL_SERVER: "MAIL SERVER IP"
      REDASH_MAIL_PORT: 25
      REDASH_MAIL_DEFAULT_SENDER: "redash@testtest.jp"
```
      
再起動

```
docker stop $(docker ps -a -q)
docker-compose -f docker-compose.production.yml up -d
```

あとはログイン画面にあるパスワードの再作成などのボタンを押して送信試験をすれば完了。
非常にシンプル。
[Unity]Android実機中にスクリプトデバッグする方法(備忘録)

今回も備忘録
Android実機でデバッグした時にスクリプトデバッグ出来たら便利だなと思って調べてみました。
参考サイト↓
[Android実機でスクリプトデバッグする方法](http://tsubakit1.hateblo.jp/entry/20140107/1389104300)

#やってみる
Android実機でデバッグなので
File->Build SettingsからAndroidにSwitch Platformしておく。
その後、Development BuildとScript Debuggingにチェックを入れてBuild&Run
この時、PCとAndroid端末は同じネットワークに接続されていないといけない。

無事に実機でアプリが起動されたらMonoDevelopを開いて
Run->Attach to Processを選択、開かれた画面に現在ビルドしている端末名があるので一覧から探してアタッチ。

これでスクリプトデバッグできるようになる
確認したいところにブレークポイントを置いて実際に処理を実行する。

#まとめ
調べてみると案外簡単に出来た。
ただ、あまり情報が載っていなかった(周知事項なのでわざわざ書くことではない！？)ので今回備忘録で残しておこうかなと
エクセルで日付から曜日を表示させる

セルの書式設定を以下のとおり

![_ 2017-08-09 19.16.50.jpg](https://qiita-image-store.s3.amazonaws.com/0/6121/c8ad1067-fa60-44ea-1c0c-81bb01f8c36c.jpeg)

ユーザ定義-種類で「aaa」
【iOS】Storyboard上に配置したオブジェクトのInspectorからSent Eventsが消える現象の解決

# 現象
Storyboardに配置したUIButtonのInspectorからSent Eventsが消え、ボタンアクションを設定出来なくなった。

本来↓
<img width="385" alt="スクリーンショット 2017-08-09 19.02.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/110630/c18fa223-cc9c-3c26-4932-7ff5cce9be4a.png">
現象発生時↓
<img width="361" alt="スクリーンショット 2017-08-09 19.02.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/110630/a23a9aca-1cf0-f37c-cdad-bf228b9806a9.png">


# 原因
UIButtonのextensionでProtocolを継承させたことによるものだった。
[TargetedExtension](http://tech.vasily.jp/entry/swift_modern_extensions)を利用してUIButtonを拡張しようとしたことにより発生した。

```Swift
public protocol ExampleCompatible {
    associatedtype CompatibleType
    
    var ex: CompatibleType { get }
}

public final class Example<Base> {
    let base: Base
    public init(_ base: Base) {
        self.base = base
    }
}

public extension ExampleCompatible {
    public var ex: Example<Self> {
        return Example(self)
    }
}

extension UIButton: ExampleCompatible { }

extension Example where Base == UIButton {
    func hoge() {
        
    }
}
```

「そりゃたしかにそうなるわ」という感じでした。

# 解決
**UIButtonを拡張しない**
UIButtonを継承したカスタムクラスを作っても良いし、角丸や枠線等であればCALayerに対して拡張すれば良い。

考え無しにextension生やした結果でした・・orz
Swift 3 で16進数文字列と整数の相互変換

# 整数 → 16進数文字列

```swift
String(42, radix: 16) // => "2a"
```

# 16進数文字列 → 整数

```swift
Int("2a", radix: 16)! // => 42
```

- [init(_:radix:) - Int | Apple Developer Documentation](https://developer.apple.com/documentation/swift/int/2924481-init)

入力が数値にパースできない文字列の場合は `nil` になる。

`Int` はプラットフォームのネイティヴなビット幅と同じ幅を持つ（64ビットプラットフォームなら `Int64` と同じ）。他のビット数や符号なしなどの型にしたいなら `UInt8` などと指定すればOK。
fiddlerでiPhoneの通信を見るためにやったことメモ

[fiddler](http://www.telerik.com/fiddler)でiPhoneの通信を見るための手順が結構たくさんあったので備忘録としてメモを残す。

##手順

1. fiddlerをインストール。
    https://www.telerik.com/download/fiddler

1. addonsのページから**CertMaker for iOS and Android**をインストール。
    http://www.telerik.com/fiddler/add-ons

1. fiddlerを起動して*Tools>Options>HTTPS*から*Capture HTTPS CONNECTs*を有効にする。

1. *Protocols*を選択して*;tls1.1;tls1.2*を追加する。

1. *Tools>Options>Connections*の*Allow remote computers to connect*を有効にする。

1. *Inspectors*とかがあるパネルの*FiddlerScript*タブを開いて、`static function OnBeforeRequest`関数に以下の処理を追加する。

    ```csharp
        if (oSession.HTTPMethodIs("CONNECT"))
        {
            oSession["https-DropSNIAlerts"] = "yup";
            FiddlerApplication.Log.LogString("Legacy compat applied for request");
        }
    ```

1. fiddlerを再起動して*Tools>Options>HTTPS>Actions*から*Reset All Certificates*を実行し、
    その後*Trust Root Certificate*を実行して証明書を設定しなおす。

1. iPhoneをwifiに接続しプロキシを設定する。

1. iPhoneのsafariを開いて*http://ipv4.fiddler:8888*にアクセスし、*FiddlerRoot certificate*のリンクから証明書をインストールする。

1. *設定>一般>情報>証明書信頼設定*からインストールした証明書を有効にする。

1. 通信を確認したいアプリを起動し、fiddlerにログが表示されることを確認する。

----

##所感

2.のCertMaker for iOS and Androidをインストールしたつもりでインストールしていなかったり、インストール後に証明書を再度作成しないといけなかったり、
4.のProtocolsや6.のスクリプトの追加について言及している記事が少なかったり、
10.の証明書を有効にする手順がiOSが新しくなったことによって追加されていたり……

前はもうちょっと簡単に通信ログを確認できるところまでできた気がするような。:thinking:
[Python] pandasを使ってcsvファイルの読み込み

## Pandasについて
PandasはPythonのデータ分析用ライブラリです。
インストールは  ```pip install pandas```

## csvファイルの読み込み

```sample.py
import pandas as pd
xxx = pd.read_csv('sample.csv') #xxxは適当な変数

print (xxx) #　全カラムの出力
```

##サンプル
![スクリーンショット 2017-08-09 16.36.54.png](https://qiita-image-store.s3.amazonaws.com/0/172123/09d447c5-3a7b-08dd-24e4-3fcd3e05cdc7.png)
**sample.csv**

sample.csv内で一番高い点数をとった学生番号を出力したい場合

```sample2.py
import pandas as pd
filename = pd.read_csv('sample.csv',encoding="SHIFT-JIS")#もしくはUTF-8

listA = []
listB = []

listA =  filename['学生番号']
listB =  filename['点数']
max=0
leng = len(listA)

for n in range(leng):
	if listB[n]>max:
		max=listB[n]
		num = n
print ('最高得点をとった学生番号は'+str(listA[num]))
```
##まとめ
Pandasを使うと簡単にcsvなどのエクセルファイルを読み込めるので便利です。これからpythonを使ってデータ分析をしてみたいという方は使ってみてはいかがでしょうか。
AWSにNew Relicを導入する


### はじめに

AWS上で動かしているサービスのパフォーマンス監視にNew Relicを導入した際の手順。
New Relicを導入するとプロセスだったり、ネットワーク、ディスクなんかの稼働率を見たり出来るっぽい。


### 手順

---

#### 1. New Relicのアカウントを作成

まずは[New Relic](https://newrelic.com/partner/aws-monitoring)こちらからSign Up

登録を済ませ右上のメニューから`Account settings`を選択し、ライセンスキーを見ておく。

#### 2. AWSに接続

AWSにsshで接続を行い、色々やる。
毎度sshめんどくさいので、`.ssh/config`とかにまとめておくと楽です。


```
//ssh
$ ssh -i hoge.pem ec2-user@hostname

// サーバーのビット数の確認
$ uname -a

// New Relicのリポジトリ追加 32 or 64どちらか
// 32bit
$ sudo rpm -Uvh http://download.newrelic.com/pub/newrelic/el5/i386/newrelic-repo-5-3.noarch.rpm

// 64bit
$ sudo rpm -Uvh https://yum.newrelic.com/pub/newrelic/el5/x86_64/newrelic-repo-5-3.noarch.rpm


sudo yum -y install newrelic-sysmond

// ライセンスキー設定
$ sudo nrsysmond-config --set license_key=New Relicのライセンスキー

// デーモン開始
$ sudo service newrelic-sysmond start

// 自動起動
$ sudo chkconfig --list newrelic-sysmond
```

### 3. パフォーマンスを見てみる

New Relicのマイページにアクセスして、左上のプルダウンメニューより`SERVERS`をクリックしてサーバーのパフォーマンスを確認出来る。
New Relicすごい！！簡単！！
【未解決】特定条件行の特定文字をすべて置換する正規表現


マルチラインの文字列から
`見る:`で始まる行の、`まきがみ`をすべて`マキガミ`に置換したい。

`まきがみ`の検出は任意文字の最短一致で挟んだものの繰り返しにすればとれるかと思ったが、そうでもない。

ちょっと時間がかかりそう&時間が空きそうなのでメモっとく。
正規表現は本当にググるの下手…

```php
$subject = <<< EOT
見ない:あかまきがみあおまきがみきまきがみ
見る:あかまきがみあおまきがみきまきがみ
無関係なテキスト
EOT;

$pattern = '/^見る:(.*?まきがみ.*?)*/mi';

preg_match_all($pattern, $subject, $matches);
var_dump($matches);

$r = preg_replace($pattern, 'マキガミ', $subject);
var_dump($r);


$array = explode(PHP_EOL, $subject);
foreach($array as $key => $value) {
    if(strpos($value, '見る:') !== 0) {
        continue;
    }
    $array[$key] = str_replace('まきがみ', 'マキガミ', $value);
}
var_dump(implode(PHP_EOL, $array));
```





```shell-session:出力
array(2) {
  [0]=>
  array(1) {
    [0]=>
    string(58) "見る:あかまきがみあおまきがみきまきがみ"
  }
  [1]=>
  array(1) { # ←ここが複数じゃない？
    [0]=>
    string(15) "きまきがみ" 
  }
}

string(99) "見ない:あかまきがみあおまきがみきまきがみ
マキガミ
無関係なテキスト"

string(145) "見ない:あかまきがみあおまきがみきまきがみ
見る:あかマキガミあおマキガミきマキガミ
無関係なテキスト"
```

`strpos`は敗北を感じる…
Cloud Functions for Firebase で Babel


Firebase Functionsを使うのにFlowつかいたいけど、コメントスタイルも嫌だったので、Babelした。Flowの設定もはいったままになってます。

# 要点

`firebase deploy`したときfunctionsディレクトリを見にいくのを変えて、カレントディレクトリする。package.jsonをコピーしたくなかったから。

```firebase.json
{
  "functions": {
    "source": "."
  }
}
```

Babel後のファイルは`dist/index.js`にするので、その位置を指定するために、`"main":dist/index.js`にしてる。
デプロイ用のスクリプトは`babel src --out-dir dist && firebase deploy --only functions`

```package.json
{
{
  "name": "firebase functions babel",
  "version": "1.0.0",
  "author": "Tomohiko Himura <eiel.hal@gmail.com>",
  "license": "MIT",
  "main": "dist/index.js",
  "scripts": {
    "deploy": "babel src --out-dir dist && firebase deploy --only functions"
  },
  "devDependencies": {
    "babel-cli": "^6.24.1",
    "babel-preset-env": "^1.6.0",
    "babel-preset-flow": "^6.23.0",
    "flow-bin": "^0.52.0"
  }
}
```

> Cloud Functions runs Node v.6.11.1, so we recommend that you develop locally with this version.

ってかいてあったので、`.babelrc`で指定

```.babelrc
{
  "presets": [
    [
      "env", {
        "targets": { "node": "v6.11.1" }
      }
    ],
    "flow"
  ]
}
```

サンプルコード。

```src/index.js
// @flow
import * as functions from "firebase-functions"

export const https_test = functions.https.onRequest((request, response) => {
  response.send('ok');
});
```

# 参考
* [Google Cloud Functionsでバベる(Babel)](http://qiita.com/gaishimo/items/bb358950910f82da69b8)
* [ES6 in Cloud Functions for Firebase](https://codeburst.io/es6-in-cloud-functions-for-firebase-959b35e31cb0)
* [HTTP Triggers](https://firebase.google.com/docs/functions/http-events)
* [
Get Started: Write and Deploy Your First Functions](https://firebase.google.com/docs/functions/get-started)
Spring4 mybatis連携  property-placeholderが動作しない

## 環境
windows10
tomcat8
java8
spring4.1.6
mybatis3.3.0
mybatis-spring1.2.3

## 現象

aplicationContext.xmlを以下のように記述して、tomcat起動しDB接続を行った。


```aplicationContext.xml
<context:property-placeholder location="classpath:xxx.properties" />
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"destroy-method="close">
  <property name="driverClassName" value="${db.driver}" />
	<property name="url" value="${db.url}" />
	<property name="username" value="${db.username}" />
	<property name="password" value="${db.password}" />
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
	<property name="dataSource" ref="dataSource" />
	<property name="configLocation" value="classpath:mybatis-config.xml" />
</bean>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
	<property name="dataSource" ref="dataSource" />
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
	<property name="basePackage" value="jp.co.ricoh.rj.embs.mapper" />
	<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
</bean>
```

結果、DB接続部でエラー
ドライバ 「${db.driver}」が見つからない旨のログが出ているので、placeholderが正常に動作せず
文字が置換されてないと思われる。placeholderに指定したファイルが読み込めているのは確認済み。
javaのconfigで@Valueで値は取得できた。


いろいろ試しても解決できないのでMapperScannerConfigureの記述を変更した


```aplicationContext.xml
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
	<property name="basePackage" value="jp.co.ricoh.rj.embs.mapper" />
	<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
</bean>

↓

<mybatis:scan base-package="jp.co.ricoh.rj.embs.mapper" />
```

解決、、、

別の解決方法についてこちらにヒントがあった
https://stackoverflow.com/questions/17512596/contextproperty-placeholder-doesnt-resolve-references

default-autowire="byName"を外すとMapperScannerConfigurerで問題なく動く
BroadcastReceiverのUnitTest時にonReceiveが走らない問題(解決したが根本原因分からず)

# Unit Test時にBroadcastReceiverのonReceiveが走らない
BroadcastReceiverのUnit Testをしようと以下のようなコードを書いたが、テスト対象のonReceiveが走らないという問題が発生した。

```java:Test.java
    @Test
    public void onReceiveTest() throws Exception {
        Intent intent = new Intent();
        intent.setAction("com.example.subaru44k.ORIGINAL_INTENT");
        mContext.sendBroadcast(intent);

        Thread.sleep(50000);
    }
```

```xml:AndroidManifest.xml
        <receiver
            android:name=".SampleReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="com.example.subaru44k.ORIGINAL_INTENT" />
            </intent-filter>
        </receiver>
```
```java:SampleReceiver.java
public class SampleReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "sample broadcast received", Toast.LENGTH_SHORT).show();
    }
}
```

# うまくいく方法
以下のような形で、テスト対象にActivityを作成して、ActivityTestRuleにて起動してやれば受信できるようになる。

```java:Test.java
    @Rule
    public ActivityTestRule<MainActivity> mActivityTestRule = new ActivityTestRule<MainActivity>(MainActivity.class);

    @Test
    public void onReceiveTest() throws Exception {
        Intent intent = new Intent();
        intent.setAction("com.example.subaru44k.ORIGINAL_INTENT");
        mContext.sendBroadcast(intent);

        Thread.sleep(50000);
    }
```

# 原因の考察(間違っていた)
これはおそらく、テスト実行直後は対象のアプリがストップ状態になっていて、Intentが受けられないのだと思う。
しかし、一度アプリを立ち上げておけばストップ状態は解除されるはずだし、
その状態からテスト書いたならばターゲットアプリの更新だから、ストップ状態にならないはずだが、なぜだろうと思ったら・・・

Android Studioにおける更新は以下のコマンドではなく、

```shell-session
$ adb install -r TARGET_APP
```

以下のコマンドのようで、

```shell-session
$ adb shell am force-stop com.example.subaru44k
$ adb push TARGET_APP /data/local/tmp/com.example.subaru44k.test
$ adb shell pm install -r "/data/local/tmp/com.example.subaru44k.test"
```

`am force-stop`には、アプリの強制停止&ストップ状態に遷移という効果があり、その影響でストップ状態に戻されていたようだ。
だからActivityTestRuleで明示的にアプリを起動してやれば受けられるようになる。

Serviceの場合はServiceTestRuleを使えばよいだろう。

# 違った
以下を見る限り上記認識は間違っている。

https://developer.android.com/about/versions/android-3.1.html

>The platform defines two new intent flags that let a sender specify whether the Intent should be allowed to activate components in stopped application.
>
>FLAG_INCLUDE_STOPPED_PACKAGES — Include intent filters of stopped applications in the list of potential targets to resolve against.
FLAG_EXCLUDE_STOPPED_PACKAGES — Exclude intent filters of stopped applications from the list of potential targets.
> When neither or both of these flags is defined in an intent, the default behavior is to include filters of stopped applications in the list of potential targets.
Note that the system adds FLAG_EXCLUDE_STOPPED_PACKAGES to all broadcast intents.

SystemアプリはFLAG_EXCLUDE_STOPPED_PACKAGESをつけてintentを送るが、デフォルトではFLAG_INCLUDE_STOPPED_PACKAGESがついているので、stop状態でも受けることができる。
実際に上記テストアプリにて

```java
intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
```
をしてsendBroadcast(intent)してもターゲットアプリはIntent受けられてないので、原因は別のようだ。

根本原因分からないが、なんかまた混乱しそうなのでひとまず調査内容を投稿しておく。
Dockerで簡単にマルチドメインかつSSL証明（自動更新）  nginx-proxyとLetsEncrypt

### はじめに
Dockerの説明は割愛します。
はてなよりもQiitaにあげたほうがいい気がするのでこちらで共有させていただきます。

同一サーバー上に二つのDockerコンテナー 
dockerA dockerB　にそれぞれ　a.com　/ b.com というドメインを割り当てることを前提として話を進めます。


#　使うもの
・Docker　- 当たり前
・nginx-proxy コンテナーをプロキシしてくれる神    
・letsencrypt-nginx-proxy-companion SSL証明（自動更新）してくれる神 

#やり方
適当なディレクトリで docker-compose.yml　を作成
docker-compose.yml　：基本的にはコピペでおk

nginx-proxy:
image: jwilder/nginx-proxy
container_name: nginx-proxy
privileged: true
ports:
- 80:80
- 443:443
volumes:
- ./docker-compose.d/certs:/etc/nginx/certs:ro
- ./docker-compose.d/htpasswd:/etc/nginx/htpasswd
- /etc/nginx/vhost.d
- /usr/share/nginx/html
- /var/run/docker.sock:/tmp/docker.sock:ro
restart: always

letsencrypt-nginx:
image: jrcs/letsencrypt-nginx-proxy-companion
container_name: letsencrypt-nginx
privileged: true
volumes:
- ./docker-compose.d/certs:/etc/nginx/certs:rw
- /var/run/docker.sock:/var/run/docker.sock:ro
volumes_from:
- nginx-proxy
restart: always

はい。同じディレクトリ上で
$docker-compose up -d

これで nginx-proxy　と nginx-proxy-companion　をrunできました。

あとは dockerAとdockerBをrunするときに下記の3つの環境変数を設定してあげることで勝手にproxyかつSSLしてくれます。
・VIRTUAL_HOST　　　　nginx-proxyのために必要。割り当てるドメイン名を設定する
・LETSENCRYPT_HOST letsencrypt-nginx-proxy-companionに必要。SSL証明書取得のためのドメイン名を設定する
・LETSENCRYPT_EMAIL letsencrypt-nginx-proxy-companionに必要。SSL証明書取得のためのメールアドレスを設定する


#実際にコンテナーをrunしてみる
dockerAコンテナをrun
$ docker run -e VIRTUAL_HOST=a.com -e LETSENCRYPT_HOST=a.com  -e LETSENCRYPT_EMAIL=アドレス [dockerAのimageID] 

dockerBコンテナをrun
以下省略


#簡単にマルチドメインかつSSL証明できたよ^ ^！！

なおSSL証明書は　docker-composeしたディレクトリ/docker-compose.d/certs　にあります
複数のコミットを強制的に取り消す

メンターに教わったのでメモです。

デプロイがうまく行かなくて悩んでいます。
悩んでるうちにmasterがコミットだらけになってしまったので、
昨日からの変更を一旦すべて削除することにしました。

こんな感じですね。
<img width="387" alt="スクリーンショット 2017-08-09 17.03.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/187119/0da62682-03bb-a0fa-9a91-a64fcf057c48.png">


以下をappのディレクトリ上で実行します。

```
#terminal
git reset --hard head^
```

上記コマンドによって、実行する度にコミット１回分戻って行きます。

ちなみに`^`をつけない場合には、
最後にコミットをした状態に戻ることができます。
(`git checkout -f`に同じ)

必要なところまで戻ったら以下を実行。

```
#terminal
git push -f origin master
```

強制的にローカルでの変更を反映し、リモートリポジトリ上にあるコミットが消えます。

追記：
コメントいただきました。
`^`を複数つけることで、複数分を戻ることができるそうです。

`git reset --hard (戻したいところのコミットID)`
という書き方でも同じみたいです。
知らぬ間にLet's Encryptの導入が超絶簡単になっていた件

## Webサイトを常時SSL化するお
Let's Encryptの普及や、セキュリティ意識の高まりから、
最近では、WebサイトのSSL化は開発のメニューの一つに組み込まれることが多いです。

[certbot](https://certbot.eff.org/)により、これまでも導入は以前に比べてかなりしやすくなっていました。

## え、そんなことしなくてええんやで。
git cloneして、certbot-autoでcertifacate作って、sites-availableを変更して。。
と思っていると、

「それは古いですよ。今はコマンドがあります。」
と言われました。
なんと。ドキュメント確認したら世界が違いました。(最初から読めよ)

## この少ないコマンドで済んじゃう世界
以下は、[nginxのUbuntuの場合](https://certbot.eff.org/#ubuntuxenial-nginx)ですが、グローバルにコマンドをインストールしてくれて、すぐに動かすことができます。

![FireShot Capture 16 - Certbot - https___certbot.eff.org_#ubuntuxenial-nginx.png](https://qiita-image-store.s3.amazonaws.com/0/56423/c28d7cd7-9ea4-89e8-7de5-f583dfb330a4.png)

1. Install コマンドを叩く
2. `sudo certbot --nginx` # configを上書きしてくれる

をすると、それだけでhttps化が完了してしまいます。
(ポート80のredirectはマニュアルでやりました。)

うーん。すごい。昔は(そんな昔じゃない)、CSR作って~、証明書発行して~、サーバーにあげて~、設定して~ のような手順が嘘のようです。
より、https化が捗りますね。何かの助けになれば幸いです。現場からは以上です。

※1 `/directory/certbot-auto renew`はなくなり、どこからでも`certbot renew`が叩けるようになりました。
※2 `sudo certbot --nginx` 最低限のことしかしないので、opensslを使って〜などはマニュアルになります。
※3 https化は簡単ですが、アプリケーションの検証をした後の導入が大切です。(例えばwordpressのブログのパスなど)
CaffeのモデルをTensorFlowで使う

Chainerには、`caffe.CaffeFunction('bvlc_googlenet.caffemodel')`のようにcaffemodelを読み込む関数が備わっています。

参考： http://qiita.com/tabe2314/items/6c0c1b769e12ab1e2614

普段TensorFlowしか使ってないので、そういう便利系のやつがTensorFlowにもないかと調べていたらありました。

[ethereon/caffe-tensorflow: Caffe models in TensorFlow - GitHub](https://github.com/ethereon/caffe-tensorflow)

この中の`convert.py`を使えば、`.prototxt`や`.caffemodel`を、TensorFlowで使われる`.py`と`.npy`に変換できます。

※`.prototxt`と`.py`はモデルの構造、`.caffemodel`と`.npy`は重みデータです。

# 使い方

[examples/mnist](https://github.com/ethereon/caffe-tensorflow/tree/master/examples/mnist)が変換に関する説明になっています。

## NN構造データの変換（`.prototxt` → `.py`）

```bash
$ ./convert.py examples/mnist/lenet.prototxt --code-output-path=mynet.py
```

## 重みデータの変換（`.caffemodel` → `.npy`）

```bash
$ ./convert.py examples/mnist/lenet.prototxt --caffemodel examples/mnist/lenet_iter_10000.caffemodel --data-output-path=mynet.npy
```