OmniAICreator/Qiita-1.07M huggingface dataset:
[AWS]SDK "cURL error28"

##**この記事は**
ものすごく短い記事です。

AWSの(自分も含めた)初心者は[🔗開発者ガイド](https://aws.amazon.com/ko/documentation/)に概念から優しく、
詳しく教えていますので、非常に参考しています。

今回は、[🔗開発者ガイド](https://aws.amazon.com/ko/documentation/)で教えている
[🔗AWS SDK for PHP を使用して Amazon SES から E メールを送信する](https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/send-using-sdk-php.html)ように、SDKを使っているガイドに環境変数の設定で例を出しているので、
初心者皆様が、こちで混乱しなくて、すぐ前進したらいいなと思って記事を投稿します。

##**このエラー**
```
The email was not sent. Error message: Error retrieving credentials from the instance profile metadata server. (cURL error 28: Connection timed out after 1001 milliseconds (see http://curl.haxx.se/libcurl/c/libcurl-errors.html))
```
このエラーをご覧した方は、AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEYの設定にミスがある場合です。
まず、以下の手順でチェックしましょう。
①そのIAMのユーザーがちゃんと権限を持っていますか？
②環境変数の設定をちゃんとしましたか？

で、この記事には②の場合をチェックしようと思もいます。
ガイドの通りではなく、以下のように設定をしてみましょう。

```php:ses_sdk_test.php
$client = SesClient::factory(array(
    'version'=> 'latest',
    'region' => REGION,
+  'credentials' => array(
+    'key' => '*******************',
+    'secret'  => '********************************'
+  )
));
```
こうすると、上手く動作すると思います。

ほぼご存知でいらっしゃると思いますが、
`export AWS_ACCESS_KEY_ID=***************`
の`export`を忘れてしまうと、そのCL以外は使えません。
で、bashでShell変数を環境環境化が必要です。
それが`export`を付けることでございます。
`env | grep AWS_SECRET_ACCESS_KEY`で一回確認して見る習慣が必要かもしれません。

ちなみに、キーは重要なものなので、テストが終わったら`unset`環境変数 してすぐ外しましょう。

以上です。
素数の判別

最近、pythonの勉強をしています。
メモを残します。

##素数の判別
```
>>> 
2  is a prime number
3  is a prime number
5  is a prime number
7  is a prime number
11  is a prime number
13  is a prime number
17  is a prime number
19  is a prime number
23  is a prime number
29  is a prime number
31  is a prime number
37  is a prime number
41  is a prime number
43  is a prime number
47  is a prime number
53  is a prime number
59  is a prime number
61  is a prime number
67  is a prime number
71  is a prime number
73  is a prime number
79  is a prime number
83  is a prime number
89  is a prime number
97  is a prime number
```

##code

```素数.py
import math
n = 100 
for num in range(2,n):
    for i in range(2, math.floor(num**0.5)):
        if num % i == 0:
            break
    else:
        print(num, " is a prime number")
```
Theme My Login でテンプレートパスを変更する

## Theme My Login について
有名なWordPressプラグインなので今さら説明するまでも無いかもしれませんが、例えば「WordPressで会員向けサイトを作りたいけど、独自のユーザー管理とかじゃなくて出来るだけWordPressの標準機能を使ったものが良いよ―！でもユーザーがログインする時に/wp-admin/とかwp-login.phpにアクセスして欲しくないよ―！」とかいう場合にまあ効果的なプラグインで、大雑把に言うと、フロントエンドでログイン画面やプロフィール画面、ユーザー登録画面、パスワード変更画面などを呼び出すことが出来るプラグインです。

## 各画面のテンプレート
ログイン画面やユーザー登録画面など各画面のテンプレートは、「/wordpress/wp-content/plugins/theme-my-login/templates」以下に配置されており、これらのテンプレートはTheme My Loginを有効化することで、通常何もしなくても勝手に呼びだされます。

## テンプレートの内容を変更したい
ではテンプレートの内容を変更したい場合はどうすればよいでしょうか？
[プラグインの公式サイト](https://www.jfarthing.com/development/theme-my-login/templates/)では以下のように記載されています。
>All of the templates located within /wp-content/plugins/theme-my-login/templates are easily customizable. Just simply pick any template you wish to edit, copy it to your current theme’s directory and edit it as you wish. Theme My Login will always look for templates in your current theme’s directory first, before loading it’s own templates.

つまり、Theme My Loginは最初に現在利用中のテーマのディレクトリを確認した後にプラグイン本体のtemplatesを読みに行くので、なんか変更したいのであれば、変更したいテンプレートファイルを利用中のテーマディレクトリにコピーし、勝手に編集しちゃいなよと言うことです。

例えばログイン画面を編集したい場合は、「/plugins/theme-my-login/templates/login-form.php」をコピーして、利用中のテーマディレクトリの直下にコピーすることで、テーマディレクトリのlogin-form.phpが優先して読み込まれるようになります。

## テーマディレクトリの「直下」に置かないとダメなの？？？
ここからようやく本題ですが、何もしない状態だとテーマディレクトリの直下に置かないと認識されません。
しかし、ただでさえ汚いテーマディレクトリの中身がこれ以上汚くなるのは精神衛生上耐えられない。Theme My Login関連のテンプレートは「tml-templates」などのディレクトリにまとめたいというのが人情というものです。

## フィルターフックを使おう
危うく憤死寸前でしたが、普通に考えてテンプレートパスを任意に変更できないようにしているわけがありません。**「tml_template_paths」**というフィルターがちゃんと用意されていました！

もうテキスト入力するのが面倒くさくなってきたので、以下のコードをテーマのfunctions.phpに突っ込んで好きなパスに書き換えちゃて下さい。
後は指定先のディレクトリに「login-form.php」「register-form.php」「resetpass-form.php」などを入れれば優先的に呼び出されるようになります。
以下のコード例ではテーマディレクトリ以下に「tml-templates」というディレクトリを作成し、その中に各テンプレートファイルを配置する事を想定しています。

```php:functions.php
/*
 *
 * theme my login の テンプレートパスを変更（テーマファイルのtml-templatesディレクトリに変更）
 *
 */
function tml_tpl_path_overwrite($args){
  $args[0] = get_stylesheet_directory() . '/tml-templates';
  return $args;
}
add_filter( 'tml_template_paths', 'tml_tpl_path_overwrite');
```
PHP5.6へのGDインストール時にJPEG Supportを有効にする方法

##概要
php5.6のコンパイル時に`--with-gd`をつけてGDをコンパイルしたが
そのままではJPEG Supportが有効になっていなかったので対応した。

PNGやGIFはデフォで有効になっていた。

条件

- CentOS6.8
- php5.6をソースからインストールした

##JPEGライブラリインストール
http://www.ijg.org/ からダウンロードURLをコピーする

```bash
## 移動
$ cd /usr/local/src
## tar.gzをダウンロード
$ sudo wget http://www.ijg.org/files/jpegsrc.v9b.tar.gz
## 解凍
$ sudo tar -zxvf jpegsrc.v9b.tar.gz
## 移動
$ cd jpeg-9b/
##コンパイル
$ ./configure --enable-shared
$ sudo make
$ sudo make install
$ cd ..
```
`/usr/local/lib/libjpeg.so`が存在することを確認

## phpを再コンパイル

```bash
## 移動
cd /usr/local/src/php-5.6.24
## 必要なパッケージと--with-gd --with-jpeg-dir=/usr/local/lib/を追記してコンパイル
$ sudo ./configure --enable-mbstring --enable-pdo --with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d --with-pear --with-gmp --with-iconv --with-pdo-pgsql --enable-opcache=no --with-apxs2=/usr/local/apache2/bin/apxs --with-mcrypt=/usr/local/lib --enable-zip --with-zlib --with-curl --with-openssl --with-gd --with-jpeg-dir=/usr/local/lib/
$ sudo make
$ sudo make install
## apache再起動
$ sudo service httpd restart
```

JPEGが有効になった
![2016-09-07 17_35_38-phpinfo().png](https://qiita-image-store.s3.amazonaws.com/0/76278/c312eafe-0364-e7ac-dd19-5e2bbac71856.png)

##参考
[PHPでgdを有効にしてるのにjpg supportが有効にならない](http://snowland.net/nucleus/item/1384)
[libjpegライブラリのインストール](http://phpspot.net/php/pglibjpeg%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB.html)
iOS10からプライバシーアクセス周りの使用目的の記載が必須になる？


### 背景
iOS10+Xcode8のベータ版で動作確認していたところフォトライブラリにアクセスできない問題に遭遇しました。
アクセスしようとすると、以下のログがでてアプリがクラッシュしました。

```
[access] This app has crashed because it attempted to access privacy-sensitive data without a usage description.  The app's Info.plist must contain an NSPhotoLibraryUsageDescription key with a string value explaining to the user how the app uses this data.
```

### 対応
iOS10からカメラ等のプライバシーアクセス周りのUsage Descriptionの定義が必須なようです。
以下Cocoa KeysのXcode Nameが“Privacy - ○○ Usage Description”のキーが該当します。
[Cocoa Keys](https://developer.apple.com/library/prerelease/content/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html#//apple_ref/doc/uid/TP40009251-SW1)

アプリ内で利用する機能はinfo.plistにキーを追加し、使用目的を記述する必要があるようです。
今回場合、“Privacy - Photo Library Usage Description”を追加することで回避できました。

Valueは空でも動きましたが、Appleに審査出すときはちゃんと書く必要がありそうです。
getVisibility() より isShown() が良さそうやな！つこたろ！

# 前置き
Viewの表示状態を見て処理を振り分けたいケースがあると思います。
以前はこうしてました↓

```java:java
if(view.getVisibility() == View.VISIBLE){
  // 見えとるやんけ！
}
```

# 修正してみた
でもほら、isShown()ってそれっぽい関数があるじゃないですか。
で、そっち使うように修正するじゃないですか。

```java:java
if(view.isShown()){
  // 見えとるのに、ここ通らねぇｗ　ワロリッシュｗ
}
```

# 動かねぇ
ふーむ。isShown()って関数名はそれっぽいんだけど。
ソースコードはこんな感じで動いてくれても良さそうなんだけどなぁ。
parentで先祖遡ってるうちに、どっかでfalse返してるのかな？

```java:java
    /**
     * Returns the visibility of this view and all of its ancestors
     *
     * @return True if this view and all of its ancestors are {@link #VISIBLE}
     */
    public boolean isShown() {
        View current = this;
        //noinspection ConstantConditions
        do {
            if ((current.mViewFlags & VISIBILITY_MASK) != VISIBLE) {
                return false;
            }
            ViewParent parent = current.mParent;
            if (parent == null) {
                return false; // We are not attached to the view root
            }
            if (!(parent instanceof View)) {
                return true;
            }
            current = (View) parent;
        } while (current != null);

        return false;
    }
```

# 結局
onResume() のタイミングで isShown() するとfalse返すみたいなのよね。
ダメ、絶対。

# どうしてもonResume()で判断したい場合は？
getVisivility()でがんばろう

# 参考
http://stackoverflow.com/questions/28068263/rootview-is-displayed-but-isshown-method-returns-false
Railsのアセット関連のログを出さないようにしたい

Rails 4ではGemfileに下記を追加:

```rb:Gemfile
gem 'quiet_assets', group: :development
```

Rails 5では設定を1行追加する:

```rb:config/environments/development.rb
  config.assets.quiet = true
```

参考: [Railsの開発環境:1行でassetsのログを除外にする方法](https://suin.io/550)
AWS ECS クラスターが削除できない時にやること


お試しでクラスターを作って、GUIからさあ削除しようと思ったら以下のメッセージ。

> "The service cannot be stopped while the primary deployment is scaled above 0."


----------
**追記**
*GUIからも可能とのコメント頂きました。*
*詳しくはコメント参照で。*

----------


ぐぐったらcuiでの操作が必要らしい。


```sh

# まずservice名を調べる
aws ecs list-services

#desired-countを0にする
aws ecs update-service --service [サービス名] --desired-count 0
```

その後、GUIからクラスターを削除したらできた。


**参考**
Amazon EC2 Container Service(ECS)をGUIから試してAWS側で用意したサンプルWebアプリを動かしたときのメモ。
http://qiita.com/toshihirock/items/dfd42314158aff073e9d
Lambdaで数字を文字列に変換してDBに保存する

DynamoDBにIDを数字型で入れる際にハマったのでメモ。
数字型の場合でもDynamoDBには文字列に変換して保存する必要があるそうです。

```ex.js
exports.handler = function(event, context) {
 
  var ID = event["ID"];

// ID が Number型で来ているのでStringに変換
  ID += '';
}
```
特定のViewControllerでナビゲーションバーを隠したい


もっと良いやり方があれば教えて下さい :pray:

# やったこと

```swift:ViewController.swift

    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
        // ナビゲーションバーは表示しない
        self.navigationController?.setNavigationBarHidden(true, animated: true)
    }
    
    override func viewWillDisappear(animated: Bool) {
        super.viewWillDisappear(animated)
        // ナビゲーションを表示する
        self.navigationController?.setNavigationBarHidden(false, animated: true)
    }

```


また、Storyboardでナビゲーションバーが表示される場合は、Simulated MetricsのTopBarを`none`にしました。

![Kobito.cqIyPV.png](https://qiita-image-store.s3.amazonaws.com/0/1691/b6682386-842c-0274-6ace-b08570da4a9c.png "Kobito.cqIyPV.png")



# 参考

- [iphone - Hide navigation bar in storyboard - Stack Overflow](http://stackoverflow.com/questions/10620471/hide-navigation-bar-in-storyboard)
コーディング規約のBEMを現場で使いやすく改良する

## BEMの目的と改良の目的

- 標準規約でコーディングすることにより納品物のクオリティを上げる
- ルール統一によりチーム間連携しやすくする
- コーディング時にルールで悩まないようにする
- 標準のBEMは冗長に感じるのでミスが少なく時間のかからない手法に改良する

## 標準的なBEMのルール

### Block（ブロック）

```css
.form {}
.header-nav {}
```

### Element（エレメント）

```css
.form__btn {}
.header-nav__item {}
.header-nav__item_link {}
```

### Modifier（モディファイア）

```css
.form__btn--state_hover {}
```

### CSSセレクタにタグ名を書かない

#### NG

```html
<style>
	.user-list {}
	.user-list > li {}
</style>
<ul class="user-list">
	<li>name1</li>
	<li>name2</li>
</ul>
```

#### OK

```html
<style>
	.user-list {}
	.user-list__item {}
</style>
<ul class="user-list">
	<li class="user-list__item">name1</li>
	<li class="user-list__item">name2</li>
</ul>
```

## 標準的なBEMの問題点

1. _を2重に書く必要があり、二つ書いたつもりという表記ミスを起こす可能性がある
2. エレメントは_を2重、モデファイアは-を2重に書くため表記が長くなり、コーディングにも時間がかかる
3. CSSセレクタにタグ名を書いてはいけないのでコーディングに時間がかかる

## 使いやすく改良したBEM

> 一貫した規則と機械可読性さえあれば各区切り文字は変えたり消したりしても良いことになっている

とあるので、ルールに出来る限り沿って現場で使いやすく改良を試みる。

### 【改良】Block（ブロック）

```css
.form {}
.headerNav {}
```

### 【改良】Element（エレメント）※改良後

```css
.form_btn {}
.headerNav_item {}
.headerNav_itemLink {}
```

### 【改良】Modifier（モディファイア）※改良後

```css
.form_btn-stateHover {}
```

### 【改良】CSSセレクタにタグ名を書いて良いことにする

ulの子セレクタはliに決まっているし、さらに中にブロック、エレメントが入らないと分かっている場合はタグ名を入れて良いルールに変更  
ただ、このルールは規約違反なので、しっかりとチーム内で共有する必要がある。

```html
<style>
	.userList {}
	.userList > li {}
</style>
<ul class="userList">
	<li>name1</li>
	<li>name2</li>
</ul>
```

### 【改良】IDも同様のルール

```html
<style>
	#searchForm {}
	#searchForm .serchForm_btn {}
</style>
<form id="searchForm">
	<input type="submit" class="serchForm_btn">
</form>
```

### 【改良】classのセレクタは一つに留める

#### NG

```html
<style>
  .headerNav {}
  .headerNav .headerNav_item {}
</style>
```

#### OK

```html
<style>
  .headerNav {}
  .headerNav_item {}
</style>
```

### 【改良】ファイル名も規約と統一する

- ブロック名とエレメント名のみ書けばOK
- ブロック名とエレメント名の後は_をいくつ挟んでもOK

```text
「class="ブロック名_エレメント名"」 → 「ブロック名_エレメント名_画像名.gif」
「class="serchForm_btn"」 → 「serchform_btn_submit.gif」
「class="serchForm_btn"」 → 「serchform_btn_submit_off.gif」
```

- 画像名を書く必要のない場合は省略も可

```text
「class="ブロック名_エレメント名"」 → 「ブロック名_エレメント名.gif」
「class="serchForm_btn"」 → 「serchform_btn.gif」
```

## 参考

- [こんなHTMLとCSSのコーディング規約で書きたい](http://qiita.com/pugiemonn/items/964203782e1fcb3d02c3)
- [実践 めんどうくさくない BEM](http://tsmd.hateblo.jp/entry/2013/12/12/004059)
- [BEMを参考にしたCSS設計](http://qiita.com/mrd-takahashi/items/07dc3b4bad027daa2884)
Google Chrome Developer Toolsを使ってcssを書き換える


## 背景

こんにちは。ChromeのDeveloperToolはWeb開発に必須といわれていますが、いかんせん使用経験がありません＼(^o^)／

いろいろなことができるようですが、まずはwebのcssを書き換えてみます。

## 環境

* GoogleChrome バージョン 53.0.2785.89 (64-bit)

## 手順
Developer Toolを開いて、簡単に編集できます。

### cssを弄りたいページにアクセスする。

例：https://www.google.co.jp

### Developer Toolを開く

右クリック -> 検証　で開きます。
また、macではcommand + alt + i でも開くことができます。

### webページの要素とHTMLを紐付ける

下記のアイコンです。昔は虫眼鏡だったようです。

![スクリーンショット_2016-09-07_16_48_44.png](https://qiita-image-store.s3.amazonaws.com/0/37873/6dc3fa82-ba66-a596-ed7a-0241dcc465e2.png "スクリーンショット_2016-09-07_16_48_44.png")

### 背景部分のマークアップに適用されているcssを書き換えてみる

背景画像の部分は、下記でマークアップされているようです。

```html:html本体
...
<div class="ctr-p" id="viewport">
...
```

右側のペインの[Styles]タブに、選択した領域のcssがあります。
実際には、bodyに色を設定していたようなので、この部分を変更してみます。（色は適当です）。


要素をダブルクリックすれば、カーソルが有効になるので適当な値に変更しています。

```css:変更したcss
body {
    background: rgba(255,0,255,0.2);
    color: #222;
}
```

### before / after

@before

![スクリーンショット 2016-09-07 17.00.22.png](https://qiita-image-store.s3.amazonaws.com/0/37873/534d2e75-c3a1-9912-6550-b4b03bd6e325.png "スクリーンショット 2016-09-07 17.00.22.png")


@after

![スクリーンショット 2016-09-07 16.59.30.png](https://qiita-image-store.s3.amazonaws.com/0/37873/d17494c8-a422-1456-1138-c6d68f2d3758.png "スクリーンショット 2016-09-07 16.59.30.png")

簡単に変更できます。
実際には、作ったwebページにcssがあたっているか、パラメータを変えたら見た目がどう変わるかなど、確認しつつ作業していくのに使っていきます。


## 参考資料

[Chrome DevTools Overview - Google Chrome](https://developer.chrome.com/devtools)
FAQ: 数値の比較を is ですると一貫性がないのはなぜ？


```py
>>> x = 100
>>> y = 100
>>> x == y
True
>>> x is y
True
>>> x = 1000
>>> y = 1000
>>> x == y
True
>>> x is y
False
```

## is は同値ではなくて同一の比較

is 演算子は、左右が同じオブジェクトへの参照になっているかを比較します。次の例を見てください。

```
>>> x = []
>>> y = []
>>> x is y
False
>>> z = x
>>> x is z
True
>>> x.append(42)
>>> y
[]
>>> z
[42]
```

x と y は別々に作られた、別々のリストオブジェクトです。なので、 x is y は False になりますし、 x を変更しても y には影響しません。

一方、 z は x と同一のオブジェクトを参照しています。なので x is z は True になりますし、 x (が参照しているリストオブジェクト)を変更すると当然 z も同じように変化します。


## 整数型は immutable

オブジェクトが示す値が、オブジェクトを生成したときに決まり、その後変化しないようなオブジェクトを immutable といいます。
整数は immutable です。次のサンプルコードを見てください。

```
>>> x = 42
>>> y = x
>>> x is y
True
>>> x += 1
>>> x
43
>>> y
42
>>> x is y
False
```

`y = x` した直後は、 x と y は同じ 42 を表すオブジェクトを示しているので `x is y` は True でした。
`x += 1` すると、 x には 43 を表す別のオブジェクトが代入されます。なので `x is y` が False になります。


## Flyweight パターン

整数型のような immutable なオブジェクトが大量に使われるときに最適化のために使われるのが Flyweight パターンです。
新しい値が必要になったときに、その値のオブジェクトを毎回生成する変わりに、既にあるオブジェクトを共用することで、

* 同じ値が何度も出現するときに1つのオブジェクトを利用することで、メモリ使用量を削減する
* 同じ値のオブジェクトが何度も生成・破棄されることによるメモリ管理のコストを削減する

といったメリットがあります。

(2016/09/07現在) CPython の場合、 -5 から 256 までの整数が flyweight パターンで管理されていて、常に同じオブジェクトが使われるようになっています。なので、この範囲の値であれば、別々に作ったはずのオブジェクトでも `x is y` が True になったりします。
Android StudioでEventLogに、原因不明のエラーが表示される時の対処法

[EventLogの例]　※この他にも、多々あるようです。
Throwable: Assertion failed: unable to get stub builder for com.android.tools.idea.lang.aidl.AidlFileType@～

[発生タイミング]
layoutファイルを開いた時。(まれに発生)
※他の現象の場合は、別のタイミングで発生するかもしれません。

[対処法]
File> Invalidate Caches/Restart...
を試してみる。

[検索に使ったキーワード]
Android studio  Throwable: Assertion failed: layouts

[蛇足：答えが見つからない検索キーワード]　※別のIssueなどに当たる。
Throwable: Assertion failed: unable to get stub builder

[参考]
http://stackoverflow.com/questions/20351726/android-studio-0-3-6-rendering-problems-when-spinner-with-androidentries-arra
(対処法の元ネタ)

http://qiita.com/KeithYokoma/items/8e5533bb88d141f1c2fd
AndroidStudio 0.5.0 にアップデートしたらやるべきこと
(他の現象　その1)
OpenLayers 3で表示中の地図の端の緯度経度を取得する

```
// 表示している地図の端の座標を取得する

var extent = map.getView().calculateExtent(map.getSize());
var bottomLeft = ol.proj.transform(ol.extent.getBottomLeft(extent),
    'EPSG:3857', 'EPSG:4326');
var topRight = ol.proj.transform(ol.extent.getTopRight(extent),
    'EPSG:3857', 'EPSG:4326');
var endof_left   = wrapLon(bottomLeft[0]);
var endof_bottom = bottomLeft[1];
var endof_right  = wrapLon(topRight[0]);
var endof_top    = topRight[1];

console.log(endof_left);
console.log(endof_bottom);

console.log(endof_right);
console.log(endof_top);

function wrapLon(value) {
	var worlds = Math.floor((value + 180) / 360);
	return value - (worlds * 360);
}
```

(参考)
http://openlayers.org/en/latest/examples/moveend.html
iOS標準カレンダアプリにイベントを登録する

##はじめに
カレンダーアプリのスケジュールなどプライベート情報はiOSで管理されていて、アプリからのアクセスは制限されています。

そーいう場合のコーディングについて、自分的ベストプラクティスを書いてみます。
コードはSwiftで書いてます。

##やりたいUX
1. 初回起動時に、カレンダにアクセスするための許諾UIを表示することはしたくない。（少なくとも私は、これをやられると使う気が少し失せるｗ）
2. カレンダに書き込みする操作を **はじめて**したとき、許諾を得るUIを表示する。　（ユーザが行ったアクションに対してカレンダアクセスの許諾表示がでるので、自然に感じるはず！っと思っています。）
3. 項番２のところで、許諾をもらえたら、すぐにイベントを書き込む。
4. 許諾をもらえなかったときは(二度目以降も)、OS標準の設定アプリでの設定が必要なことを伝える。
5. 二度目以降は、すぐに項番３, ４の処理を行う（イベントを書き込みなど）

##コーディング
- UXの項番2は、`EKEventStore.authorizationStatusForEntityType()`と`eventStore.requestAccessToEntityType()`で実現します。
- UXの項番3をするために、許可してもらえたら 再度`registEvent()`を呼びなおして処理しています。（UXの項番5と同様）
- UXの項番4をするために、UIAlertControllerを表示しています。
- 上記２つのUI表示は、main_queueで実行しなくてはならないので、`dispatch_async()`を使っています。
- Eventの開始時刻と終了時刻は、必ず 終了時刻＞開始時刻でないとダメなので必要に応じて入替てます。
- イベントをエディットできる標準UIがあるので、`EKEventEditViewController()`で表示します。

``` ViewController.swift
let eventStore = EKEventStore()

@IBAction func registEvent() {
  if EKEventStore.authorizationStatusForEntityType(.Event) != .Authorized { 
    eventStore.requestAccessToEntityType(.Event, completion: { granted,_ in
      dispatch_async(dispatch_get_main_queue(), { _ in
        if granted {
          self.registEvent()
        }
        else {
          let alert = UIAlertController(title: "Alert", message: "Please set Settings app > Privacy > Calendars", preferredStyle: .Alert )
          alert.addAction( UIAlertAction(title: "OK", style: .Cancel, handler: nil) )
          self.presentViewController(alert, animated: true, completion: nil)
        }
      })
      return
    })
    return
  }

  let event = EKEvent(eventStore: eventStore)
        
  if let st = date[0] { // date[0],[1]にDateが二つ入っています。
    event.startDate = st
    if let ed = date[1] {
      event.endDate = ed
      if ed.compare(st) == .OrderedAscending { // st > ed
        event.startDate = ed
        event.endDate   = st
      }
    }
    else {
      event.endDate = st
    }
  }
  let ec = EKEventEditViewController()
  ec.eventStore = eventStore
  ec.event = event
  ec.editViewDelegate = self
  self.presentViewController(ec, animated: true, completion: nil)
}
    
func eventEditViewController( controller: EKEventEditViewController, didCompleteWithAction action: EKEventEditViewAction) {
  switch action {
  case .Saved :
    do {
      try eventStore.saveEvent(controller.event!, span: .ThisEvent)
    } catch let error {
      print(error)
    }
  default:
    break
  }
  controller.dismissViewControllerAnimated(true, completion: nil)        
}
    
```


読んでいただき、ありがとうございました。
git push heroku master に失敗したら exit non-zero するためのラッパーコマンド書いた

ステージング環境にデプロイしたはずなのに変更が反映されない...
と思ったら実はデプロイに失敗していた、ということがありました。
どうも Heroku への `git push` は失敗しても exit 0 してしまうようです。

手でコマンド実行していれば気付くと思いますが、Circle CI とかで自動実行していた場合、失敗に気づかないこともあるでしょう。

というわけで正しく exit non-zero させるために [`heroku-deploy-wrap`](https://github.com/yuya-takeyama/heroku-deploy-wrap) というラッパーコマンドを作りました。

## 使い方

通常の `git push` コマンドの前に `heroku-deploy-wrap --` を追加するだけです。

```
$ heroku-deploy-wrap -- git push heroku master
```

リモートの名前が違うとかブランチの名前が違うという場合は `git push` 以降を適宜変えてください。

## インストール

Go で作ったので `go get` でインストールできます。

```
$ go get github.com/yuya-takeyama/heroku-deploy-wrap
```

ビルド済みのバイナリも用意しています。
https://github.com/yuya-takeyama/heroku-deploy-wrap/releases

まだそんなに使っておらず、不具合等残ってるかもしれないのでそのおつもりで。
(いくつか直した不具合については後述)

## 仕組み

以下をチェックします。

* `git push` コマンドの実行結果に以下のいずれかが含まれるか
  * remote: Verifying deploy... done.
  * Everything up-to-date
* `git push` コマンドが exit 0 したか
  * `git push` が exit non-zero した場合は `heroku-deploy-wrap` も同じ exit status を返します

## 修正済みの不具合

### Verifying deploy の後に続く . (ドット) は 3 つとは限らない

もともとは `remote: Verifying deploy... done.` で完全一致検索していたんですが、たまに `remote: Verifying deploy.... done.` という文字列が現れることがわかりました。
とりあえずドットの数は 1 ~ 10 として正規表現でマッチするようにしました。

### Everything up-to-date がエラー扱いだった

git push 時に変更がなければ `Everything up-to-date` となりますが、失敗扱いになっていたので、これもチェックするようにしました。

ただ、これは仕様として悩ましいところです。
Everything up-to-date の場合デプロイの処理は実行されないので、むしろ exit non-zero するのが正しいかもしれません。
デフォルトを変えるとともに、`--allow-everything-up-to-date` か `--fail-everything-up-to-date` といったオプションを追加するかもしれません
Xamarin iOSでHockeyAppを使ってクラッシュレポートを送る

以前はクラッシュレポートにXamarin Insightsという製品が使われていたようだが、現在ではXamarin InsightsはHockeyAppに統合された。

## HockeyAppのアカウントを取得する

こちらの「GET STARTED FOR FREE」から。
https://hockeyapp.net/


## ダッシュボードにAppを登録する

ダッシュボードから「New App」をクリック。
ipaをアップロードして登録することもできるが、今はまだipaを作っていないので「Create the app manually instead.」を選択。

プラットフォーム：iOS
Release Type：beta
Title: お好みのアプリケーション名
Bundle Identifier：Info.plistに書かれているCFBundleIdentifier

作成すると`App ID`という文字列が生成されるので、メモしておく。


## プロジェクトにHockeyApp for iOSコンポーネントを追加する

自分はXamarin Studio（Mac）でPCLでプロジェクトを作っているので、

`HockeyTest.iOS`→`Components`を右クリック→`Get More Components`→ `HockeyApp for iOS` を検索してインストール。

![image](https://qiita-image-store.s3.amazonaws.com/0/79394/b38ed321-e7b6-78ef-06f5-e29d50c9089d.png)


## コードにBITHockeyManagerの呼び出しを追加する

```AppDelegate.cs

using HockeyApp.iOS; // 追加


public override bool FinishedLaunching(UIApplication app, NSDictionary options)
{
	global::Xamarin.Forms.Forms.Init();

	// この3行を追加
	var manager = BITHockeyManager.SharedHockeyManager;
	manager.Configure("********************************");   // 先ほどメモしておいたApp ID
	manager.StartManager();

	LoadApplication(new App());

	return base.FinishedLaunching(app, options);
}
```

## 実行して意図的に例外を発生させてみる

例外発生でクラッシュさせ、アプリを再起動するとReportを送るか聞いてくる。
送るとすぐにダッシュボードにクラッシュが表示される。

![image](https://qiita-image-store.s3.amazonaws.com/0/79394/993a0251-cebb-efaa-5575-563dbfa48067.png)
docker swarm on aws gatcha

### tl;dr
- AWSでdocker swarmするときにはtcp:2377,7946 udp:7846,4789への同じsecurity groupのノードからのアクセスを相互に許可しよう。

### awsで本格的にdocker swarmするときのハマリどころ
1. swarm serviceのポートの問題
  - swarmサービスは2377に別サーバーとして立ち上がるのだが、docker-machine 0.8.0が自動的に作るsecurity groupは2377を勝手には開けてくれない
  - 一旦docker-machineにsecurity groupを作ってもらって、そこに2377をカスタムで自分のsecurity groupからのみ許可する、という風にするのが一番いいような気がする
2. overlay networkのポートの問題(結局security groupの設定の問題)
  - https://docs.docker.com/engine/userguide/networking/ で必要とされている、overlay networkのためのtcp/udpのポートもdocker-machineはデフォルトで開けない
  - 1.で行ったように、udp:4789とtcp/udp:7946を開けてあげる必要がある
  - docker-machineがインスタンスを作成した後に設定を足しても、うまくいかなかったことがあったので注意。

### 最終的なsecurty groupの設定
proto port allow_from
TCP 22 0.0.0.0/0
TCP 2376 0.0.0.0/0
TCP 2377 same security group
UDP 7946 same security group
TCP 7946 same security group
UDP 4789 same security group

### 所感
- 多分、docker-machine createに--for-swarmみたいなオプションを足して、その場合swarmに十分な設定を追加で行ってくれるようにすべきなのだろうと思う。

- EDIT: docker-machine 0.8.1が出ているようなので、何か対応されているかもしれない
Cognito、Javascript SDKのエラー処理

サンプルコードではエラー処理の仕方がわからなかった。
signUpに失敗する理由はいくつかあるが、理由に応じてエラーメッセージを表示する場合はどうすればよいか？

結論からいうと、userPool.signUpを呼ぶ際に指定するコールバック関数のerrオブジェクトのcode属性を見ればよい：

```login.js
        userPool.signUp($("#email").val(), $("#password").val(), attributeList, null, function(err, result) {
          if(err){
             if(err.code == "UsernameExistsException"){ // err.codeの値を見て判断すればよい
               alert("登録済みだよ");
             }
             if(err.code == "InvalidParameterException"){
               alert("IDもしくはパスワードが間違っているよ");
             }
             return;
          }
          cognitoUser = result.user;
          alert('user name is ' + cognitoUser.getUsername());
        });
```
iOSアプリでFacebook認証を作るときに注意すること

## 前提

公式のSDKを使用する
導入の仕方は割愛

| SDK | URL | 備考 |
|:-----------|:-----------|:-----------|
| Facebook SDK      | https://developers.facebook.com/docs/ios       | swift用のSDKもあるhttps://developers.facebook.com/docs/swift|

## 認証の仕方

ログインメソッドのプロパティで、
認証の振る舞いを選択できるので事前に決めておきましょう

```
FBSDKLoginManager().loginBehavior = .SystemAccount
```

**Facebook SDK**

| 振る舞い | 内容 |
|:-----------|:-----------|:-----------|
| Native      | Facebookアプリに遷移して認証 |
| Browser     | safari or SFSafariViewController(iOS9~)で認証     |
| SystemAccount     | 設定アプリのアカウントで認証 |
| Web     | UIWebViewでログイン    |

**iOS9~は、なんとNative(Facebookアプリ経由のログイン認証)が利用できなくなっている。**
Instagramも利用できなくなっているので、おそらく間違いない。
↓ソース
http://stackoverflow.com/questions/32620002/facebook-login-ios-9-without-safari?answertab=votes#tab-top

そのため、SystemAccountを使ったログインなど別の振る舞いを使ってログインする必要があります。

## SystemAccountを利用した場合の挙動

![login.jpg](https://qiita-image-store.s3.amazonaws.com/0/30423/0b44bf8b-54cf-1310-3f25-5ede2db6ab18.jpeg)

* ログインメソッドを呼んだタイミングでアラートを表示するUIになる
* 設定アプリで、Facebookログインしていない場合、SafariViewControllerが表示される
* Facebookアプリでログインしても、設定アプリがログイン状態になるわけではないので、上記のケースは十分起こりえる


## 実装するときに注意すること

### 投稿の許可と、ユーザーデータ取得の許可でログインメソッドが違う

**<対処法>**
各パーミッションごとにログイン処理を実装する必要があります。

* 投稿用：logInWithPublishPermissions
* データ取得用：logInWithReadPermissions



### アプリに対してのアクセス可否ごとにエラー処理する必要がある
Facebookアプリのアプリ管理画面で、アクセスの可否をコントロールできるため、
各パーミッションへのアクセス可否を判定してエラーハンドリングする必要があります。

![fbauth.png](https://qiita-image-store.s3.amazonaws.com/0/30423/3108c1fc-9649-74b9-45a5-ebfb6ea951aa.png "fbauth.png")

> Facebookでアプリに提供するパーミッションを変更できる

**<対処法>**

**token確認時**
```FBSDKAccessToken.hasGranted``` メソッドでBool値が返ってくるので、アクセス許可しているか確認可能。
友達リストへのアクセスを許可しているか確認する場合は、こんな感じ```token.hasGranted("user_friends")```

**login時**
login用メソッドのレスポンスで、アクセス拒否している権限を取得できる

```
FBSDKLoginManagerLoginResult.declinedPermissions
```


### 設定アプリでアクセス拒否している場合がある

**対処法**
login用メソッドのレスポンスで、Error Code=306が返ってくるので、アプリ側でアラートを出すなど適切に処理する

## テスト

Facebookのアプリ管理画面
(https://developers.facebook.com/apps/<アプリID>/dashboard/)で、
テストユーザーの作成が、できるので、そのアカウントを使用する。
間違っても自分のアカウントは使わない。

### テストフロー
ダッシュボートのこのボタンからテストユーザーの登録へ、

![スクリーンショット 2016-08-31 18.32.32.png](https://qiita-image-store.s3.amazonaws.com/0/30423/9ebf99ba-18a3-48b1-07a1-59d3490b7f4d.png "スクリーンショット 2016-08-31 18.32.32.png")

作成後。

* ユーザーID, パスワードが変更
* テストアカウント同士で、友達の登録
* tokenの取得

などができる


![fb-testUser.png](https://qiita-image-store.s3.amazonaws.com/0/30423/02f89b91-0cfc-4fe4-176a-2ba6f1f2e50e.png "fb-testUser.png")


[Graph APIエクスプローラ](https://developers.facebook.com/tools/explorer/)
で、先ほど取得したtokenを使って、テストユーザーのtokenの情報をコントロールできる
例えば、ユーザーが友達リスト取得のアクセスだけ拒否したケースなど細かい認証周りのテストを、簡単にすることができる。

![graphExploler.png](https://qiita-image-store.s3.amazonaws.com/0/30423/e4576b4f-2d88-175f-9388-f9dddf5a8276.png)

> me/permissions/user_friendsのエンドポイントにDELETリクエストしているとこ

## まとめ
Facebookログインの機能をアプリに実装する前に、

* ログインの振る舞い
* 各権限ごとにアクセス拒否された場合の振る舞い

を決めておきましょう

Facebookが提供してくれているテスト環境を有効活用しましょう

## 参考URL
Facebookの公式ドキュメント 
https://developers.facebook.com/docs/ios

導入方法が写真付きで分かりやすく載ってます
http://xoyip.hatenablog.com/entry/2014/05/26/200000
Socket.IOを利用してHTML,Javascript,CSSだけでわりと簡単にLINE風チャットアプリを作る

# はじめに
[Firebaseを利用してHTML,Javascript,CSSだけで超簡単にLINE風チャットアプリを作る](http://qiita.com/cacarrot/items/c69dd3a82ce81e4e0e61)
をやってみて、Firebaseを使えば超簡単に作れることはわかった。

でもFirebase依存の作り方だと応用効かないのでスクラッチでの作成方法を
ということで、今度は Node.js のライブラリ「Socket.IO」を利用して作ってみる。

# 事前インストール
事前にNode.jsをインストールしておく。

```bash:Node.jsインストール（Nodebrew経由の場合）
# Nodebrewをインストール
brew install nodebrew
mkdir -p ~/.nodebrew/src

# 利用可能なバージョン番号確認する場合は
# nodebrew ls-remote
# を実行

# Node.jsインストール
nodebrew install-binary v6.5.0
nodebrew use v6.5.0
```

# プロジェクトセットアップ


```bash
npm init -y
npm install --save socket.io
```

# プログラム作成
ローカルでHTML、JS、CSSを作る。
<http://socket.io/docs/> を参考に。

今回のディレクトリ構成は以下。

```text
<プロジェクトルート>
├── css
│   ├── common.css ・・・ クライアント画面CSS
│   └── index.css
├── index.html     ・・・ クライアント画面HTML
├── js
│   └── client.js  ・・・ クライアント画面用JS
├── node_modules
├── package.json
└── server.js      ・・・ サーバ側でNode.jsで実行するJS
```

[ソースはGitHubで公開](https://github.com/cacarrot/webchat-socket-io)しているので割愛。

# 起動

以下のコマンドでサーバ側プログラムを起動後、
<http://localhost:8080/index.html> で画面を起動。

```bash
node server.js
```

今回作成したのはこんなイメージ。

|　　　　　　　　　　|ユーザ1|ユーザ2|
|:--:|:--:|:--:|
|ログイン画面|![1.png](https://qiita-image-store.s3.amazonaws.com/0/111365/8b250da6-ddba-cff1-c541-254dd616be7a.png)|![1.png](https://qiita-image-store.s3.amazonaws.com/0/111365/8b250da6-ddba-cff1-c541-254dd616be7a.png)|
|ユーザ1ログイン|![2.png](https://qiita-image-store.s3.amazonaws.com/0/111365/9c8ad5f5-6d26-a71d-7a01-fa2157550ca6.png)|![2-2.png](https://qiita-image-store.s3.amazonaws.com/0/111365/25e402c8-7df3-3bd6-5c6c-ee2e41387ef2.png)|
|ユーザ2ログイン|![3.png](https://qiita-image-store.s3.amazonaws.com/0/111365/4dfba4c5-0dbf-d117-c2b1-6147f8776bbc.png)|![2.png](https://qiita-image-store.s3.amazonaws.com/0/111365/9c8ad5f5-6d26-a71d-7a01-fa2157550ca6.png)|
|メッセージやりとり|![4-1.png](https://qiita-image-store.s3.amazonaws.com/0/111365/6a00b81c-5f8f-7e56-779d-615bbfb9584e.png)|![4-2.png](https://qiita-image-store.s3.amazonaws.com/0/111365/bc047735-c28d-d707-0b90-cefefa5e6475.png)|









# さいごに
Socket.IOを利用した場合もわりと簡単に作れる。

でもやっぱり[Firebaseを使って作る](http://qiita.com/cacarrot/items/c69dd3a82ce81e4e0e61)ほうがだいぶコードサイズは減るなぁ。

Firebaseのサーバ側みたいな機能を持ったフレームワークとかライブラリないかなぁ。

# 参考
- http://www.atmarkit.co.jp/ait/series/3113/index.html
EclipseからAndroid Studioに移行する時のめも。 (res-auto関連)

Eclipseの場合：
`xmlns:app="http://schemas.android.com/apk/(パッケージ名)"`
も使える。

Android Studioの場合(Gradleの場合)：
`xmlns:app="http://schemas.android.com/apk/res-auto"`
に変更する。

layoutのファイルなどを「開いた時」に、エラーが表示されるので、
変更し忘れても気づきにくい。

－－－
追記：toolsの部分の記述は、気のせい！


お約束の。
無駄、無駄、無駄、無駄ぁぁぁ～～っ（あれ？）
sphinx single html で 表の途中の改ページを抑制する

index.rst に以下の追記をします

```rst
.. raw:: html
 
  <style type="text/css">
  <!--
  table{page-break-inside:avoid;}
  -->
  </style>
```

sphinx でつくったドキュメントをまるっと印刷したいとき、make singlehtml してブラウザで開いて印刷したりします。しかしそれだと表の途中で改ページが発生して見難くなります。

上記の記述をすると、表の途中で改ページされなくなります。

conf.py とかテーマのオプションでこの設定あってもいいのでは? と思いますが、探した限りなかったです。
input type="file" multiple　で文字化け(php・HTML5)

こんにちは

今回はHTMLでファイルの送受信の際につまづいたことを共有させていただきたいと思います。
同じ箇所でつまづいている方に少しでも参考にしていただければ幸いです。
※解決法をさくっと知りたい！という方は「●解決法」をご覧下さい。

●その時の状況
　・input type="file" multipleを用いてファイルアップロード機能を作成していた
　　際に文字化けをしていた
　　※HTML5とPHPで実装
　・文字コードがSJISになっていた
　・テスト環境と本番環境で設定が違っていた
　・他のツールが動いているサーバだったのでphp.iniを気軽に変更できない

●試したこと
　・mb_detect_encodingを用いて文字コードを調査
　　⇒UTF-8になっていた
　・phpのモデルの最初に文字コード設定
　　⇒解決せず
　・mb_convert_encodingを用いてエンコード設定
　　⇒解決せず
　・metaタグにUTF-8を設定
　　⇒解決せず

●原因
　テスト環境と本番環境の設定の差が原因
　　⇒本番ではUTF-8だが、テスト環境ではautoになっていた

●解決法
　ドキュメントルートの下にディレクトリを新たに作成し、そこから参照するようにする。

　◆具体的には
　　①/var/www/html/documentroot/[新しいディレクトリ]　を作成
　　②上記のディレクトリに設定ファイルを作成
　　③jsやcssを利用している際は、上記のディレクトリにシンボリックリンクを作成

　◆例
　　①/var/www/html/documentroot/encode[新しいディレクトリ]　を作成
　　②/var/www/html/documentroot/encodeにconf.php(設定ファイル)を作成
　　③/var/www/html/documentroot/encodeに移動しlnでもともとのjsとcssの
　　　シンボリックリンクを作成

以上です！！
わりとさくっとできるはずです！


ご意見・ご感想・ご指摘等ございましたら、お気軽にお願いいたします。
[Xcode]StoryboardでLabelのフォントを変更する

#はじめに
Xcode側で用意してくれているフォントはこちら http://iosfonts.com/ で確認することができます。
今回はこのカスタムフォントに変更する方法を紹介します。

#Step.1
まずStoryboardでLabelを選択します。
そして、右側のバーのFontという項目の T というアイコンを選択します。
![スクリーンショット 2016-09-07 14.41.37.png](https://qiita-image-store.s3.amazonaws.com/0/133776/1dfba075-5027-c2bb-17f1-f861eb1bb5cc.png)

#Step.2
Fontの右の青い上下矢印を選択すると、このように表示されるので
一番上のCustomを選択します。
![スクリーンショット 2016-09-07 14.49.07.png](https://qiita-image-store.s3.amazonaws.com/0/133776/bee9c5c1-ace0-2fb8-4c0a-fd5bac4aaeb3.png)

#Step.3
すると、さっきまで選択できなかったFamilyという項目が選択できるようになります。
この中から使いたいフォントを選択しましょう。
![スクリーンショット 2016-09-07 14.56.13.png](https://qiita-image-store.s3.amazonaws.com/0/133776/b77ea267-c06f-4004-ad9e-0fd118e004db.png)

FamilyがHelveticaやArialなどの大項目、StyleがRegularやBoldなどの小項目です。
NetBeans に Ruby on Rails5を対応させる

NetBeansはプロジェクトではなくウィンドウからファイルを選択してファイルで開いて作業していきます｡
作成したRailsのアプリからプロジェクトを作成すると、NetBeansでdatabase.ymlが勝手に書き換えられてしまうので､
以下のようにdatabase.ymlを書き直します｡


```ruby:database.yml

# SQLite version 3.x
#   gem install sqlite3
#
#   Ensure the SQLite 3 gem is defined in your Gemfile
#   gem 'sqlite3'
#
default: &default
  adapter: sqlite3
  pool: 5
  timeout: 5000

development:
  <<: *default
  database: db/development.sqlite3

test:
  <<: *default
  database: db/test.sqlite3

production:
  <<: *default
  database: db/production.sqlite3
```

そのあとで､
```$ rails s
```
でサーバーに接続したり
```$ bundle exec rails db:migrate
```
でマイグレーションして
```$ bundle exec rails dbconsole
```
するとsqliteに接続できました
Scala で enum っぽいことを実現する

* Scala には `enum` は無い。（予約語としては）
* [Enumeration](http://www.scala-lang.org/api/current/index.html#scala.Enumeration) が準備されているが使い勝手が悪い。（多分一般には使われていない）
* その代わりに Scala では `case class` と `case object` を使う。
* `C` や `C#` の様に `=` で判別するのではなく、パターンマッチを使い `match` で分岐する。


# `case object` を使う

* 基底（`enum` の型）になるクラスを `sealed abstract class` で作る。
* `enum` のメンバーとして、それを継承する `final case object` を作る。

```scala
sealed abstract class Color

final case object Black extends Color
final case object White extends Color
```

* 利用時には `match` を使う。

```scala
color match {
    case Black => ...
    case White => ...
}
```


# `case class` を使う

* `case object` の他にも、`case class` を使うことも出来る。
* `case class` は `case object` と違い、パターンマッチに使える値を持つことが出来る。

```scala
sealed abstract class Color

final case class Rgb(r: Int, g: Int, b: Int) extends Color
final case class Hsl(h: Int, s: Int, l: Int) extends Color

color match {
    case Rgb(r, g, b) => ...
    case Hsl(h, s, l) => ...
}
```


# `case object` と `case class` を混ぜる

* `enum` のメンバーは、`case object` と `case class` を混ぜることができる。
* `enum` の中に更にパラメータがある場合は `case class`、無い場合は `case object` を使う。

```scala
sealed abstract class Color


final case object Black extends Color
final case object White extends Color

final case class Rgb(r: Int, g: Int, b: Int) extends Color
final case class Hsl(h: Int, s: Int, l: Int) extends Color


color match {
    case Black => ...
    case White => ...
    case Rgb(r, g, b) => ...
    case Hsl(h, s, l) => ...
}
```


# 参考資料

* [ScalaのEnumerationは使うな  - Scalaで列挙型を定義するには | Scala Cookbook](http://xerial.org/scala-cookbook/recipes/2012/06/29/enumeration/)
* [Scalaで列挙型(enum)を作る - Qiita](http://qiita.com/suin/items/5e514e8edef7aba4a0fa)
* [【Scala】列挙型を使おう ｜ Developers.IO](http://dev.classmethod.jp/server-side/scala-algebra-data-type/)
* [Tcp - akka.io.Tcp](http://doc.akka.io/api/akka/2.4/index.html#akka.io.Tcp$)
PostgreSQL が起動したかどうか簡単に確認する (ping)

PostgreSQL は、プロセスを起動してから SQL クエリ・外部入力を受け付けるようになるまで若干のタイムラグが有ります。特に Docker コンテナで起動した場合、自分の環境では5秒程度待つことになります。

```
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.

The database cluster will be initialized with locale "en_US.utf8".
The default database encoding has accordingly been set to "UTF8".
The default text search configuration will be set to "english".

...

LOG:  autovacuum launcher shutting down
LOG:  shutting down
LOG:  database system is shut down
 done
server stopped

PostgreSQL init process complete; ready for start up.

LOG:  database system was shut down at 2016-09-07 05:34:30 UTC
LOG:  MultiXact member wraparound protections are now enabled
LOG:  autovacuum launcher started
LOG:  database system is ready to accept connections # ここでようやく SQL クエリを受け付けるようになる
```

`ready to accept connections` が出る前に SQL クエリを流し込もうとすると、「サーバが見つからないぞ」と怒られることになります。
自分は Docker Compose で PostgreSQL コンテナとアプリケーションコンテナを同時に立たせて何かすることが多いです。が、Docker Compose は起動タイムラグなぞ考慮しないので、続けざまにアプリケーションコンテナを起動すると接続失敗でコンテナが死ぬことが多々ありました。

```bash
$ docker-compose up -d db
Creating pq2gorm_db_1

$ docker-compose exec db psql -U postgres -d test 'select * from users;'
psql: warning: extra command-line argument "select * from users;" ignored
psql: could not connect to server: No such file or directory
        Is the server running locally and accepting
        connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?
```

これでは困るので、ping っぽいことをして外部から PostgreSQL サーバが通信受付状態になっているかどうか確認するすべがないか探しました。しかし、標準機能としては備わっていなかったので若干泥臭い方法をとることにしました。

## ping っぽいことをする

`psql` コマンドでダミークエリを投げて、終了ステータスをチェックすれば良いです。以上です。

```bash
$ psql -c 'select 1;'  2>&1 > /dev/null
$ echo $?
#
# 0:    PostgreSQL サーバが起動している
# 0以外: PostgreSQL サーバが起動していない、または起動しきっていない
#
```

## リトライ機構を入れて実用的にする

実際には PostgreSQL につながらなかったら即終了というのも不便なので、リトライ機構を入れるのが普通だと思います。以下は、「5秒待って接続確認する」を最大5回まで繰り返すスクリプトです。5回試してつながらなかったら失敗とみなします。

```bash
for i in `seq 1 5`; do
  echo "Wait for 5 seconds..."
  sleep 5

  psql -c 'select 1;' 2>&1 > /dev/null

  if [[ $? -eq 0 ]]; then
    echo "Connection established."
    exit 0
  fi
done

echo "Failed to connect to database."
exit 1
```

このスクリプトを、SQL クエリを流し込む前段階に仕込んでおけば安心です。

## REF
- [Re: need a method to ping a running database](https://www.postgresql.org/message-id/3EE8B86F.3080505@openratings.com)
    - ここに書いてあったクエリを参考にしました
Xcodeでリモートリポジトリを取り込む方法

#はじめに
```
$ git clone https://github.com/~~~~~~.git
```

普通にターミナルからやる場合はこんな風にやってくと思いますが、これをXcodeからGUIだけでやる方法を紹介します。

#まず、Welcome to Xcode　の Check out an existing project を選択します。
![スクリーンショット 2016-09-07 14.00.06.png](https://qiita-image-store.s3.amazonaws.com/0/133776/36cb6525-5756-8a5b-8ca7-c4784140a162.png)

#次のCheck Outという画面でリモートリポジトリのURLを入力し、Nextを押します。
![スクリーンショット 2016-09-07 14.16.02.png](https://qiita-image-store.s3.amazonaws.com/0/133776/de63502f-a107-be30-0ea1-cad71a08c94f.png)

#名前と保存する場所を選択し、Downloadを選択します。
![スクリーンショット 2016-09-07 14.19.55.png](https://qiita-image-store.s3.amazonaws.com/0/133776/78341c2c-b74e-a79a-65e1-7ae80d1daa86.png)
Atomでplistを開くと真っ赤（シンタックスエラー）になる問題について


# 前提
- mac
- ATOM 1.10.0

# 参考
http://koze.hatenablog.jp/entry/2016/05/30/093000

# 現象

Atomでplistを開くと以下のような感じになっちゃう

![スクリーンショット 2016-09-07 14.14.53.png](https://qiita-image-store.s3.amazonaws.com/0/132627/657cfbcb-fc91-b3a9-c9f7-f0a4b914b234.png "スクリーンショット 2016-09-07 14.14.53.png")

# 解決策

config.csonを開く
File->Config...

以下を追記

```
  core:
    customFileTypes:
      "text.xml.plist": [
        "plist"
      ]
```

修正後

![スクリーンショット 2016-09-07 14.18.56.png](https://qiita-image-store.s3.amazonaws.com/0/132627/403a829f-01fe-d3d6-c86f-0d7e67231206.png "スクリーンショット 2016-09-07 14.18.56.png")
PHPからPYTHONに配列を渡してnumpy処理して結果を得る

参考
http://stackoverflow.com/questions/25845600/passing-php-array-to-python-doesnt-work

```php:
   $numbers = [1, 2, 3, 4, 5];
   $pythonScript = "./test.py";
   $cmd = array("python", $pythonScript, escapeshellarg(json_encode($numbers)));
   $cmdText = implode(' ', $cmd);
   
   echo "Running command: " . $cmdText . "\n";
   $result = shell_exec($cmdText);
  var_dump(json_decode($result, true));
```

```py:
   # -*- coding: utf-8 -*-                                                                                                                                                                                                                                                     
import numpy as np
import sys, json

try:
    data = np.array(json.loads(sys.argv[1]))
    std = np.std(data)
    avg = np.mean(data)
    min = np.min(data)
    max = np.max(data)
    result = {'std':std, 'avg':avg, 'min':min, 'max':max}

    print json.dumps(result)
except Exception as e:
    print str(e)
       
```
Macが起動しないときのモリサワパスポートのライセンス（PC）変更の覚書

※追記
よく考えたら結果的にMac起動してるからタイトル詐欺でした。すんませんm(__)m

---

モリサワパスポートを使用した Mac mini（10.11） が起動しなくなりました。

症状としては、下記のように画面の表示がおかしくなったり、カネールパニックが発生し、動作しないという感じです。

+ [画面がずれるor真っ青&#8594;起動しなくなる |
公式 Apple サポートコミュニティ](https://discussionsjapan.apple.com/thread/10135527?start=0&tstart=0)

[ここ](http://www.danshihack.com/2015/02/02/junp/mac-boot-maintenance.html)にある起動方法を全て試したが改善せず、[ここ](http://www.mayoinu.com/entry/2016/02/13/200000)を参考にHDDを取り外し、別のMacにSATA・IDE-USB変換ケーブルを使って接続し、[起動ディスク](https://support.apple.com/ja-jp/HT204417)として使用しています。

原因はHDD以外の機器（おそらくマザーボードかグラフィックボードあたり）の不具合だったので、起動ディスクとして問題なく使用できました。

本件とは関係ないですが、以前にセキュリティソフトが[原因](http://eset-support.canon-its.jp/faq/show/1689?site_domain=private)でカーネルパニックが発生することがありましたが、ハードが原因のカーネルパニックは初めてでした。

今回は、上述した環境でモリサワパスポートのライセンス解除（使用PC変更）を試しました。

最新の[インストーラー](http://www.morisawa.co.jp/support/download/497)を使って「Mフォントスターター」のショートカットを作成します（※既にMフォントスターターがある場合は、この手順は不要です。）

おそらく、「Mフォントスターター」をはじめて使う場合は、モリサワのCDが必要になると思います。（※試してないけど、ライセンスキーのようなものがわかればCDはなくても大丈夫かも・・・）

通常は「Mフォントスターター」を起動し、「アンインストール」を選択すると、インストールされているフォントが削除され、別のPCにインストールが可能になります。

ただ、私の環境では「アンインストールが完了したので、再起動します」という案内が表示され、再起動してもフォントは削除されておらず、ライセンスもそのままです。

**<ins>ライブラリにある fonts フォルダのアクセス権がなかった</ins>**ため、削除されなかったので、フォルダのプロパティを開き、everyoneのアクセス権を「読み／書き」に変更してアンインストールしたら、フォントは削除されました。

ただ、モリサワのコンパネから確認すると、使用PCにパソコン名があり、ライセンスが解除されておりません。

サポートに問い合わせたら、**<ins>フォントを使用していたPC（同一のMACアドレス）からアンインストールしてライセンス解除する必要がある</ins>**とのことでした。

今回、外付けの状態で起動し、別のMACアドレスになっていたため、ライセンスの解除ができませんでした。

モリサワのWebサイト上にある[PC変更申請書](http://www.morisawa.co.jp/support/download/555)を記入し、サポートに送付（メール or FAX）しました。

送付した旨を伝えるとすぐに確認してライセンス解除をしてもらいました。

同一のMACアドレスからライセンス解除できない場合は、変更申請してください。
React.js コンポーネント入門（props/state）

## コンポーネントの特徴

* 親子関係
* 状態を持つ

---

## 親子関係

コンポーネントは、親子関係になっている。

例） Page => Header => LoginButton

```Header.js
class Header extends Component {
  render() {
    return (
      <div>
        <LoginButton></LoginButton>
      </div>
    );
  }
}
```

---

## 状態を持つ

コンポーネントは、自身の状態でDOMを書き換える

```LoginButton.js
class LoginButton extends Component {
  render() {
    const msg = this.state.loggeIn ? "ログアウト" : "ログイン";

    return (
      <div>{ msg }</div>
    );
  }
}
```

---

## React.jsでは

* **props**：親から渡される情報
* **state**：自Componentの状態

親から初期状態として**props**を渡し、**state**で自身の状態を管理する。

---

## Case1

親から渡された**props**で、振る舞いを変える。

例） 共通の振る舞いをするボタンで、表示するテキストを変えたい

```Button.js
class Button extends Component {
  render() {
    return (
      <div>{ this.props.text }</div>
    );
  }
}
```

```parent.js
class Page extends Component {
  render() {
    return (
      <LoginButton text="try Login" />
    );
  }
}
```

---

## Case2

イベントを受け、自身の**state**を変更する。

例） ボタンがクリックされたら、表示を変える

```Count.js
class Button extends Component {
  add() {
    this.setState({ count: this.state.count + 1 } );
  }

  render() {
    return (
      <div>
        { this.state.count }
        <button onClick={ () => this.add() } />
      </div>
    );
  }
}
```

---

## Case3

親から受け取った**props**を**state**の初期値とする。

```CountButton.js
class CountButton extends Component {
  constructor(props) {
    this.state = { count: props.defaultCount };
  }

  render() {
    return (
      <div>
        { this.state.count }
        <button onClick={ () => this.add() } />
      </div>
    );
  }
}
```

```parent.js
class Parent extends Component {
  render() {
    return <CountButton defaultCount={5} />
  );
}
```

---

# 「コンポーネントを作る」とは

---

## 1. そのページの中で、どこをコンポーネントにするか決める

「サイドバー」があって、その中に「カード」があって、...

---

## 2. コンポーネントへのInput（props）を決める

* どこが共通化できるのか（コンポーネントのJSXにベタ書き）
* どこが汎化できるのか（親からpropsを渡す）

---

## 3. そのコンポーネントの状態（state）を考える

そのコンポーネントが、どういう状態を持つかを考える

例） フォローボタン

* フォロー済み/未フォロー
bootstrapでdata-toggle="modal"でモーダルが開かない時に確認すべきこと

## 症状

以下の様なボタンでモーダルウインドウが開かない。

~~~html
<button type="button" class="btn btn-default" data-toggle="modal" data-target="#myModal">open modal</button>
~~~

ただし、jsからは開く

~~~javascript
$('#myModal').modal()
~~~

## 対処法

~~~html
<script type='text/javascript' src='js/bootstrap.js'></script>
~~~

となっていたら、

~~~html
 <script src='js/bootstrap.js'></script>
~~~

とする。

wordpress利用時に `wp_enqueue_script()` でbootstrap.jsをロードしていると `type=`付きで呼び出ししてしまうのでこの問題に陥ります。

## 参考

- [Bootstrap - behaviour added via data-toggle not working](https://www.codeschool.com/discuss/t/bootstrap-behaviour-added-via-data-toggle-not-working/11339)
Rails×MySqlでAutoIncrement列をリセットできなくて困った困った


Railsで初期データ入れるのに[seed-fu](https://github.com/mbleigh/seed-fu)使っている訳ですがAutoIncrement列の値をリセットしようとしたら一筋縄じゃいかなかったっていういかにもRails初心者ってバレそうな話をするよ。

## とりあえずAUTO_INCREMENT=1してみる
単純にMySqlのコマンドでAutoIncrementをリセットしてみた

```
ALTER TABLE テーブル名 AUTO_INCREMENT = 1;
```

ダメだった。

厳密には`seed-fu`流し直す際にAUTO_INCREMENTに値をセットしているっぽい。なのでダメだった。
試しにリセット後に直接INSERT文流すとID:1のデータがちゃんと入る。

```
mysql> ALTER TABLE テーブル名 AUTO_INCREMENT = 1;
mysql> INSERT INTO テーブル名 (NAME) values ('shiitake');
mysql> SELECT ID FROM テーブル名;
+----+
| id |
+----+
|  1 |
+----+
```

## 解決したよ。
ActiveRecordでリセットすればいい。

```ruby
ActiveRecord::Base.connection.execute('ALTER TABLE テーブル名 AUTO_INCREMENT = 1')
```

どこかしらで前回の採番値を管理しているっぽいけど調べてもすぐ出てこなかったのでまたの機会にちゃんと調べよう。
Terraformでiterationを利用して冗長な記述をなくす ver. 0.7 ~

- variables.tf

```
variable "roles" {
    type    = "list"
    default = ["foo", "bar"]
}
```

- elb.tf

```
resource "aws_elb" "roles-elb" {
    count = "${length(var.roles)}"
    name  = "${var.roles[count.index]}-elb"
   ... 
}
```

のように`count`をlistのlengthで渡して利用時に`foo[count.index]`で利用する。
これで冗長な設定を記述しなくてすむので便利。
Riot.jsでstyle属性を動的に変更しつつshowを利用した際に、showの設定が正しく反映されない

riotのshowはifと同様にtrueの場合は表示、falseの場合は非表示となります。
ifと違うのは、ifでfalseが返ればそのタグ自体を削ってしまいますが、showでfalseが返った場合は、タグ生成しつつもdisplay:none;にするところ。
表示はさせたくないけど内部的に後から値を変える必要がある場合はifでは要素そのものが消えちゃうのでshowを使ってました。
hideってのもありますが、trueの時に非表示になるってのが直感的にわかりづらいので試してません。

このshowとstyle属性を書き換えていたら挙動がおかしくなったのでメモ。
style属性の中身を動的に出しつつ、表示・非表示をshow属性を利用した場合、style属性の中身をupdateした際にshow属性の設定がうまく反映されなかった。

```test.html
<text></text>

<script type="riot/tag">
  <text>
	<button onclick={ changeColor }>Change Color</button>
	<button onclick={ changeDisplay }>Change Display</button>
  	<p style="color: { textColor };" show={ display }>Sample text A</p>
  	<p style="color: { textColor }; display: { display ? 'block' : 'none' };">Sample text B</p>

    const self = this;

    self.textColor = "#FF0000";
    self.display = true;

    self.changeColor = ()=> {
    	const newColor = (self.textColor === "#FF0000")? "#0000FF" : "#FF0000";
    	self.update({
            textColor: newColor
        });
    };

    self.changeDisplay = ()=> {
    	const newDisplay = !self.display;
    	self.update({
            display: newDisplay
        });
    };
  </text>
</script>
```

Demo:
[https://jsfiddle.net/Kazooooo/t9rL9hnt/](https://jsfiddle.net/Kazooooo/t9rL9hnt/)

「Change Color」を押すとstyle属性内のcolorの値を切り替え、 
「Change Display」を押すとSample text Aではshowを使って表示非表示切り替え、Sample text Bではshowは使わずstyle属性内でdisplayの値を切り替えています。

Sample text Aにおいて、テキストが非表示状態(display:none;の状態）で、「Change Color」を押した場合、displayの値は何も変更していないにもかかわらず表示状態になってしまいます。
style属性を書き換える際に、showの値を無視してcolorだけupdateしてしまい、もともとstyle属性内に存在していたdisplay:none;が消えてしまいます。

Sample text Bのようにshowを利用せずにcolorもdisplayもstyle属性内で変更してやると期待通りの動作になります。
kakurenbo_putiを使いつつaccepts_nested_attributes_for :hoges, allow_destroy: trueしたい場合

# 論理削除でもallow_destroy: trueしたい

データの持ちかたの関係上、論理削除が必要になったので、gem kakurenbo_putiを使って実装したのですが、そのモデルがfields_forを使って保存・削除するタイプのモデルだったもんで、どうしたものかと小一時間悩みました。

```rb:Hogeモデル
class Hoge < ActiveRecord::Base
  belongs_to :foo
  soft_deletable column: :deleted_at
end
```


```rb:Fooモデル(before)
class Foo < ActiveRecord::Base
  has_many :hoges, dependent: :destroy, inverse_of: :foo
  
  # allow_destroy: true だと物理削除されてしまう件
  accepts_nested_attributes_for :hoges, allow_destroy: true
end
```

# accepts_nested_attributes_forの更新処理をカスタマイズ

調べていたら、[accepts_nested_attributes_forの更新処理をカスタマイズする](http://qiita.com/tkyowa/items/e751dcf8958b8c86b686)という投稿を見つけました。
これを使えばできそうです。

## Fooモデルを改修する

```rb:Fooモデル(after)
class Foo < ActiveRecord::Base
  has_many :hoges, dependent: :destroy, inverse_of: :foo
  
  # allow_destroy: trueを残すと事故で消されかねないので消しておく
  accepts_nested_attributes_for :hoges

  # accepts_nested_attributes_forの更新処理をカスタマイズ
  # @see http://qiita.com/tkyowa/items/e751dcf8958b8c86b686
  def hoges_attributes=(listed_attributes)
    listed_attributes.each do |index, attributes|
      hoge = hoges.detect { |hoge|
        hoge.id == attributes['id'].to_i
      } || hoges.build
      _destroy = attributes.delete("_destroy")
      if _destroy
        attributes["deleted_at"] = Time.zone.now
      end
      hoge.assign_attributes(attributes)
    end
  end
end
```

解説します。
`allow_destroy: true`を設定している場合、`_destroy`という属性が一緒に渡ってきていてそれを反映させると、物理的に削除されるので、`attributes.delete("_destroy")`でその属性を削除しています（値は`_destroy`という変数にとっておく）。

属性がない場合にdeleteメソッドが実行された場合は`_destroy`の値はnilなので何もしませんが、ある場合はkakurenbo_putiの論理削除用に作ったカラム（ここでは`deleted_at`カラム）に現在時刻を設定してアサインしておきました。

これで、ネストされたモデルであっても論理削除が可能となりました。
UI > 違和感 > dropbox paper > 入力した文字列と異なるものが画面に表示される

dropbox paperというサービスが出たので使ってみた。

自分には合わない。

このサービスでは以下の入力と表示となる。

- 入力: マークダウンテキスト
- 表示: マークダウンの解釈結果

つまり、「入力した文字列と異なるものが画面に表示される」。
使用者のmental overloadを上げることになる。

Qiitaの入力では２つのペインで以下となっている。

- 入力(左ペイン): マークダウンテキスト
- 表示(右ペイン): マークダウンの解釈結果

これにより左ペインにおいて「入力した文字列はそのままそのペインに表示される」。

ごく当たり前のことだが、dropbox paperではそうではない。

関連 http://qiita.com/7of9/items/8eb808ad1f0c5ea5d95a

2016年9月時点のdropbox paperのようなインターフェイスにQiitaにはなって欲しくない、という気持ちでこの記事を書いた。
[AWS]ワンライナーでRoute53の情報を取得

自己満です。
管理画面いかなくても、コマンドでRoute53の情報をレコード毎に取れます。
forでzoneid取ってくれば全てのzone情報取得できます。

```
aws --profile ${_title} --region ${_region} route53 list-resource-record-sets --hosted-zone-id $zoneid | jq -c -r '.ResourceRecordSets[]|if .Type == "NS" then .Name else empty end'
```
※上記コードはNSレコードのみ
※profile使ってますが、aws configureでもよいっす

もっと良いやり方があったら教えて下さい。