OmniAICreator/Qiita-1.07M huggingface dataset:
AMIからインスタンスを起動するとSSHのPasswordAuthentication yesがnoになりパスワード認証ができなくなる

# はじめに

小ネタです。

パスワード認証が可能なインスタンスのAMIが必要になりました。パスワード認証を有効にしてAMIを作成後インスタンスを新たに起動するとパスワード認証ができなくなりました。

え？ってなってから気づくまでAMIを３回も作り直すハメになったので記事を残しておきます。
ひょっとしてこれって常識なのかなぁ。

# はじめに試した手順

* /etc/ssh/sshd_configでパスワード認証をyesにします。

```
PasswordAuthentication yes
```

* sshdを再起動します。

```
service sshd restart
```

* 用意したユーザでパスワード認証できました。（ちなみにOSごと再起動してもできました）
* あとはAMIを作って、LaunchしたところPasswordAuthentication noになってしまいました。

# 原因はCloud initでした。

http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/user-data.html

* /etc/cloud/cloud.cfgにssh_pwauth: 0 という項目があるのですがこれがあるとPasswordAuthenticationをnoに変えてくれちゃいます。

# 対応策

* /etc/ssh/sshd_configでパスワード認証をyesにします。

```
PasswordAuthentication yes
```

* /etc/cloud/cloud.cfgでパスワード認証をyesにします。

```
ssh_pwauth: 1
```

* こうすることでAMIからインスタンス起動後もPasswordAUthentication yesは残ったままになります。
WP Survey And Quiz Tool（WPSQT）のクイズ結果画面をカスタマイズする方法

WordPressで「検定」「クイズ」などを作成するときに便利なプラグイン「WP Survey And Quiz Tool」ですが、結果画面のカスタマイズをしたいとなると、少し厄介です。管理画面の「WPSQT」という項目から設定できるように一見すると見えますが、これはできません。
では一体どうやるかというと、プラグインのソースを直接いじってやる必要があります。

# 結果画面のソースの場所
wp-content > plugin > wp-survey-and-quiz-tool > pages > site > quiz > finished.php 

こちらですが、管理画面の「プラグインを編集」からは直接リンクを辿れないところにあります。
管理画面から触りたい場合は、下記のURLを試してみてください。

http://●●●●.com/wp-admin/plugin-editor.php?file=wp-survey-and-quiz-tool%2Fpages%2Fsite%2Fquiz%2Ffinished.php&plugin=wp-survey-and-quiz-tool%2Fwp-survey-and-quiz-tool.php

あとは修正したいであろう「Exam Finished」という文言などを差し替えるだけです。ショートコードの挿入なんかもできます。

# 答え合わせ部分のカスタマイズができるファイルも同階層にあります
wp-content > plugin > wp-survey-and-quiz-tool > pages > site > quiz > review.php

ここをいじれば、カスタマイズ可能です。
matplotlibをインストールして実行するまで

matplotlibをインストールしてグラフの描画を行おうとした際に予想以上に詰まったので、メモ。

# 環境
自機：Yosemite 10.10.3
python: 2.6.6

# error一覧
- install時にfreetypeがbuild出来ない
- ライブラリのImportError
- 実行時のRuntimeError
- グラフが一瞬で閉じてしまう（エラーではない） 

## 1. pipでのインストール時のエラーと対処法
`pip install matplotlib`でインストールを行うと
>
===================================================
The following required packages can not be built:
freetype
Command "python setup.py egg_info" failed with error code 1

というエラーを吐いて停止する。
[検索すると](http://stackoverflow.com/questions/25674612/ubuntu-14-04-pip-cannot-upgrade-matplotllib)、今はfixされているバグらしい。

手っ取り早くインストールするには、エラーメッセージにあるようにfreetypeを`brew install freetype`で入れる。

その後再度`pip install matplotlib`を行うと、問題なくインストールが終了する。

## 2. コード内でimportする際のエラーと対処法
いざmatplotlibをコード中でimportして実行しようとすると
>ImportError:dlopen(~): Library not loaded:
  Reason: image not found

などとエラーを吐いて停止。
どうやらダイナミックリンクライブラリを読み込めていないようで、メッセージを見るとlibpngとfreetypeがダメになっている模様。

そこで、一旦
`pip uninstall matplotlib`
を行った後
`brew reinstall libpng --universal`
`brew reinstall freetype --universal`
でdllを再度インストール。

しかしここでも以下のエラーで停止した。
>
Error: The `brew link` step did not complete successfully
The formula built, but is not symlinked into /usr/local
Could not symlink share/man/man5/png.5
/usr/local/share/man/man5 is not writable.
You can try again using:
  brew link libpng

権限の問題で書き込みが出来ないようなので[こちら](http://tkoyama1988.hatenablog.com/entry/2014/11/11/233943)を参考に
`sudo chown -R $(whoami) /usr/local/lib/pkgconfig`
`sudo chown -R $(whoami) /usr/local/share/man/man5`
で所有者を変更。
再度`brew link libpng`を行って、成功。
`brew reinstall freetype --universal`は問題なく成功。
その後改めて`pip install matplotlib`を行って、インポートエラーは解消。

## 3. 実行時のエラーと対処法
importは出来るようになったものの、実行すると
>
RuntimeError: Python is not installed as a framework. The Mac OS X backend will not be able to function correctly if Python is not installed as a framework. See the Python documentation for more information on installing Python as a framework on Mac OS X. Please either reinstall Python as a framework, or try one of the other backends.

というエラーを吐いて停止。
解決法は[こちらの投稿](http://qiita.com/katryo/items/918667f28301fdec89ba)に詳しく書かれているように
`~/.matplotlib`
に`matplotlibrc`ファイルを作成して
`backend : TkAgg`
のようにmacosx以外のバックエンドを指定すればいい、らしい。

以上で、ようやくグラフの描画を行えた。

## 4. グラフ描画が一瞬で終わってしまう
エラーではないが、知らなくて少しハマった。

`import matplotlib.pyplot as plt`
とimportしたとすると、描画を止めたい部分に
`plt.show()`
と記述すればOK.
PHPMyAdminの導入

phpMyadminを導入する方法を教わったのでメモ

#前提
CentOSを使用

#導入
##ソースをダウンロード
```cd /usr/local/src```
```wget http://files.phpmyadmin.net/phpMyAdmin/4.4.14/phpMyAdmin-4.4.14-all-languages.tar.gz```
ソースを落としてきます
## 展開
```tar zxvf phpMyAdmin-4.4.14-all-languages.tar.gz```
ダウンロードしてきたソースを展開します
## リネーム
```mv /usr/local/src/phpMyAdmin-4.4.14-all-languages /usr/local/src/phpMyAdmin```
名前が長いのでリネームします
## ログ用のフォルダ作成
```mkdir /var/log/httpd/phpmyadmin```
エラーログやアクセスログを吐き出す用にディレクトリを作成
## VirtualHostにて設定

```vhosts.conf
<VirtualHost *:80>
  ServerName 使いたいURL
  DocumentRoot /usr/local/src/phpMyAdmin
  ErrorLog /var/log/httpd/phpmyadmin/error_log
  CustomLog /var/log/httpd/phpmyadmin/access_log combined env=!no_log
  <Directory "/usr/local/src/phpMyAdmin">
    Options Includes ExecCGI FollowSymLinks
    AllowOverride All
    Order allow,deny
    Allow from all
  </Directory>
</VirtualHost>
```


これでApache再起動すればアクセスできるはず！
ドメイン取得後(お名前.com)から公開まで

ドメイン取得してからの設定を学んだのでまとめておきます。

#前提条件
お名前.comでドメインを取得した状態から公開するまでの設定をまとめます

#流れ
- DNSレコード登録
- サーバーのvhost編集(Linux)
- ドメインが浸透しているかチェック

までまとめてます

#DNSレコードの登録
まずは[お名前.com](https://www.onamae.com/)にて、ドメインを取得したアカウントでログインします。

ログイン後、左メニューにある**ネームサーバー設定**の***「DNS関連機能の設定」***を押下
設定を行いたいドメインのラジオボタンを選択して***「次へ進む」***を押下
**DNSレコード設定を利用する**の隣にある***「設定する」***を押下
**入力カテゴリ**にある入力欄へ必要情報を入力　(ホスト名, TYPE, TTL, VALUEと入力する箇所がある部分です)
*今回はTYPEを「A」、VALUEにサーバーのIPアドレスを入力*
入力後、**「追加」ボタン**を押下
ページ下部にある**「確認画面へ」ボタン**を押下して確認してOKなら登録します

これでドメインにIPアドレスを紐付けられました！

#vhost編集
サーバー側でvhostを編集します。
Linuxの場合は
/etc/httpd/conf.d/
配下にvhosts.confって奴があるはず
こいつの中に下記を追記

```vhosts.conf
<VirtualHost *:80>
   ServerName 登録したドメイン
   DocumentRoot ドキュメントルート
   <Directory "ドキュメントルート“>
     Options Includes ExecCGI FollowSymLinks
     AllowOverride All
     Order allow,deny
     Allow from all
   </Directory>
</VirtualHost>
```

入力後、
```apachectl configtest```
でコンフィグファイルにエラーがないかチェックし、
```Syntax OK```と表示されればOK!

```service httpd restart```を入力してApache再起動
何かエラー出る時はroot権限で実行してみたりコンフィグ見直したりしてみてください！

#ドメインの浸透状況をチェック
```nslookup ドメイン名```
で登録したドメインがIPと紐付いた状態になっているかをチェックします
紐付けたIPアドレスが表示されていればOK!!
表示されていない時は浸透していない可能性もあるので
しばらく経ってからまた同様のコマンドを実行してみてください！


これで公開されたはず・・・。
pythonでchangefinderのサンプルを動かすまで

変化点抽出の為にchangefinderをpythonで動かそうとしたら、ライブラリのインストールから詰まったので、サンプルを動かすところまでメモ。

# changefinderライブラリのインストール

[こちら](http://argmax.jp/index.php?changefinder)で公開されているライブラリを`pip install changefinder`でインストールしようとしたが、scipyのインストールが上手く行かない。

>   ImportError: No module named numpy.distutils.core 
  ----------------------------------------
  Failed building wheel for scipy

検索すると、このエラーは結構皆遭遇するものの模様。

scipyのインストールにはgccとgfortranが必要ということなので、既に入れてあったgccに追加してgfortranを[ここ](https://gcc.gnu.org/wiki/GFortranBinaries#MacOS)から、ダウンロード&インストール。
自分の場合はYosemiteのgfortran 5.1。

その後再度`pip install scipy`で、無事インストールが完了。

scipyのインストールで躓かなくなったところで`pip install changefinder`を実行して、こちらも無事インストール完了。

# サンプルの実行
ライブラリのページにあったサンプルを実行するとエラー発生。
>
Traceback (most recent call last):
  File "...", line 5, in <module>
    import changefinder
  File "...", line 12, in <module>
    cf = changefinder.ChangeFinder(r=0.01, order=1, smooth=7)
AttributeError: 'module' object has no attribute 'ChangeFinder'

こちらはchangefinder云々ではなく、単純にpythonの知識不足だった。
サンプルコード名をchangefinder.pyにしていたせいでバッティングしたらしいので、リネームして解決。

無事サンプルコードが動いた。

# 参考
[changefinder](http://argmax.jp/index.php?changefinder)
[MacにSciPyをインストール](http://akiyoko.hatenablog.jp/entry/2013/06/15/140101)
PHP クラスにおけるメンバ変数（プロパティ）内の関数オブジェクトの呼び出し

デザインパターンの勉強をしていたところ、
ストラテジーパターンは今なら無名関数で出来るよね～みたいな話を見かけ、
wikipediaを見ながら実装しようとしたら思いもよらないところでつまったのでメモ。

# wikiに見るPythonのストラテジーパターン実装例

>Python では関数が第一級オブジェクトであり、このパターンを明示的に定義する必要はない。
>下記はコールバック関数を用いる GUI プログラミングで見られる例である。

```py:
class Button:
    """A very basic button widget."""
    def __init__(self, submit_func, label):
        self.on_submit = submit_func   # strategy 関数を直接生成
        self.label = label

# 異なる戦略を持つ二つのインスタンスを作成
button1 = Button(sum, "Add 'em")
button2 = Button(lambda nums: " ".join(map(str, nums)), "Join 'em")

# ボタンをテストする
numbers = range(1, 10) # A list of numbers 1 through 9
print button1.on_submit(numbers) # displays "45"
print button2.on_submit(numbers) # displays "1 2 3 4 5 6 7 8 9"
```

# PHPで同様のものを実装してみる

```php:
class Button
{
    public $submit;

    public function __construct(callable $submit_func)
    {
        $this->submit = $submit_func;
    }
}

$button1 = new Button('array_sum');
$button2 = new Button(function($nums) { return implode(' ', $nums); });

$nums = range(1, 9);

echo $button1->submit($nums);
echo $button2->submit($nums);
```

すると…

```php:
PHP Fatal error:  Call to undefined method Button::submit() in ...
```

そんなメソッドないでしょと怒られる

呼び出し方が違うようなので探したところ[きちんと書いてあるところ](http://site.oukasei.com/?p=984)がありました。
それにそって正しく実装してみます。

# PHPで正しく同様のものを実装してみる

```php:
class Button
{
    public $submit;

    public function __construct(callable $submit_func)
    {
        $this->submit = $submit_func;
    }
}

$button1 = new Button('array_sum');
$button2 = new Button(function($nums) { return implode(' ', $nums); });

$nums = range(1, 9);

echo call_user_func($button1->submit, $nums);
echo call_user_func($button2->submit, $nums);
```

もしくは

```php:
$button1 = (new Button('array_sum'))->submit;
$button2 = (new Button(function($nums) { return implode(' ', $nums); }))->submit;

$nums = range(1, 9);

echo $button1($nums);
echo $button2($nums);
```

# 参考URL
[[PHP] クラスにおけるメンバ変数（プロパティ）内の関数オブジェクトとメソッドの性質：無名関数（クロージャ）について](http://site.oukasei.com/?p=984)
[Strategy パターン](https://ja.wikipedia.org/wiki/Strategy_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3)
Cloud9入門(登録〜環境設定)

[Cloud9](https://c9.io)を使って開発を始めるまでをメモ

# 前提条件
**PHP**での開発を行うための環境作成。
**GitHub**でのログインを行う。
(Gitコマンドの説明は別の記事を作成予定。。)

# 流れ
- GitHubでリポジトリを作成
- 作成したリポジトリをCloud9でクローンしてワークスペースを作成
- ワークスペースのキーバインドを変更
- テストファイル作成して表示
- masterブランチへPush
- できあがり

まで記載しようと思います。

# GitHub
（すでにGitHubアカウントを持ってる人は次項へ進んでください）
## 登録
アドレスやらなんやら入力して登録
## リポジトリ作成
ページ右にある「New repository」ボタンを押下
リポジトリの名前やらなんやらを入力して「Create repository」を押下

リポジトリの作成完了
# Cloud9
## ログイン
[Cloud9](https://c9.io/)にアクセス
ページトップにある**Gitのマーク（猫のシルエット）**を押下
_GitHubでCloud9のアクセスの許可を求められると思いますが、許可してあげてください_

***これでログインは完了***
## ワークスペース作成
ログイン後にマイページっぽいところに遷移してると思うので、
「**Create a new workspace**」と書かれているグレーの部分を押下
**Workspace name**にワークスペースの名前を入力
_ここは一応さっき作成したリポジトリと同じ名前を入力してください_
**Description**にワークスペースの説明を入力（任意）
「**Private（非公開）**」か「**Public（公開）**」かを選択
テンプレートを選択。今回は**PHPを選択**します。
「**Clone from Git or Mercurial URL**」の欄に先ほど作成したリポジトリのクローンURLを貼り付けます
_クローンURLは先ほど作成したリポジトリのページに行くとページの右下にあります_
（```https://github.com/◯◯◯◯/◯◯◯.git```みたいなやつ）
「**Create workspace**」を押下！

これでワークスペースが作成されます。

### 注意
何個かワークスペース作成するとわかると思いますが、
一定数作成すると「お金払ってくれないとこれ以上作らせませんよ！」と
表示されて作成できなくなりますのでご注意を・・・。

## 設定
キーバインドを設定しましょう！
必要ない人は次項へ・・・。

ワークスペースを開きます。
ヘッダメニューの「Edit」メニューにある「Keyboard Mode」から好きなキーバインドを選択して完了

# テストしてみる
## テストファイルの作成
ヘッダメニューの「File」の「New File」を選択
エディタ部分に空のファイルが開かれるので、
```<?php echo "Hello World!!"; ?>```
「index.php」という名前で保存

これでテスト用ファイルを作成できました！

## 実行
ヘッダメニューの「**Run Project**」を押下
押下すると下部にあるコンソール部分にURLが表示されるのでそのURLを押下
するとエディタ部分にブラウザ用タブがひらかれて「Hello World!!」と表示されてるはず

## masterへプッシュ
作成したファイルを作成したリポジトリにプッシュします！

画面下部のコンソール部分に「bash」と書かれたタブがあると思うので
それを押下して表示させてください。
「```~/workspace (master)```」と書かれていればOK
```git status```
で編集されたファイルが表示され
```git add .```
で編集されたファイルをステージにあげ
```git commit -m '{コメント(英語オンリー)}'```
でコミット
```git push -u orign```
でプッシュ！！
この時ID/PWを求められる可能性がありますので
入力してプッシュしてください
（SSHが上手くいかないとそうなるっぽいです・・・調査中・・）

これでリポジトリに変更した内容がプッシュされました！

***Let's develop!!***
Apache MaxRequestsPerChild とは

# MaxRequestsPerChild

ある回数のリクエストを処理した子プロセスを殺す設定。
以下はてきとー。

```filename:httpd.conf
<IfModule prefork.c>
StartServers     30
MinSpareServers  30
MaxSpareServers  30
ServerLimit      30
MaxClients       30
MaxRequestsPerChild  128
</IfModule>
```

## Copy on Write

prefork(子プロセス)を使用する場合、親子間でメモリを共有するCopy on Writeが使用される。
fork直後は親と子が同じ物理メモリを共有しているため実際にメモリが使用されるまでメモリ使用率は上がらない。

時間経過(アクセス)で親と子のメモリ共有率が下がっていく。 
 = メモリ使用率が上がる。

## MaxRequestsPerChild

MaxRequestsPerChild は一定数の接続を受け取った後、子プロセスを殺す。
この時上記のような設定なら128回リクエスト処理を行った子プロセスは殺され、その際子プロセスは必ず30用意されるため、新たに生成される。

killされた際に子が使用していたメモリが開放され、親とメモリ空間を共有したプロセスが生成される。
結果、メモリ使用率を下げる事ができる。

mod_perlやmod_phpが起こしたメモリリークを解消する事もできる。


### 余談
大規模サイトだと小さい値にすると頻繁にプロセスのkillと生成が発生しその処理がサーバ負荷となることもある。
embulk-parser-regex: 正規表現で行をparseするParser Plugin


はじめに
======

[Embulk](http://www.embulk.org/)というのをつい先日まで知らなかったのですが、
簡単にいうと「色々な所のデータを、バッチで、変換→Importするフレームワーク」みたいなものかな、と思います。

色々Pluginを作ることができて[既にたくさんある](http://www.embulk.org/plugins/)のですが、ちょっと変則的なApacheのAccessLogをBigQueryにImportしようとしたときに良いParserが無かった（わからなかった）ので、正規表現で文字列を1行ずつParseするものを作ってみました。

Version
------------

* Embulk 0.7.4

で動作確認しています。

使い方
======

install
-----

```sh
embulk gem install embulk-parser-regex
```

guess
--------

一応 ApacheのAccessLogの common/combined/combinedio は guessで作れます。
とりあえず、それを雛形に独自の項目を追加すると良いと思います。
例えば、

```yml:config.yml
in:
  type: file
  path_prefix: /path/to/data/access_log.
  parser:
    charset: UTF-8
    newline: LF
out:
  type: stdout
```

という `config.yml`に対して以下を実行します。

```sh
embulk guess -g regex config.yml -o guessed.yml
```

すると、 `guessed.yml` が生成されるので、

```sh
embulk preview guessed.yml
```

とすれば、上手く言っていればParseされた内容が表示されていると思います。

設定項目
--------

YAMLの `parser` 配下に設定を書きます。

### type
type は **regex** と指定します

### regex
行をParseするときに使う正規表現です。
`Named Capturing Group`というやつで書く必要があります。
例えば、 `(?<name>\S+)` というような `?<name>` を付けるということです。
で、この `name`ですが、 `[a-zA-Z0-9]`という文字しか使えないので注意してください（ `_`とか使えない)。

### columns
他のPluginと同じように column の定義を書きます。 [参考](http://www.embulk.org/docs/built-in.html#id3)

本Pluginの特別な属性として以下のものがあります。

* **regex_name**: `Named Capturing Group` で使われている名前を指定します（省略時は *name*属性が使われます）。*name*に `_` などがある場合はそのまま正規表現のグループ名に使えないので、ここで指定します。

### skip_if_unmatch

**regex**で指定した正規表現にマッチしなかったときに、

* **true** ならば、 例外をthrowします
* **false** ならば、 その行をSkipします

デフォルトは **false** です。

設定例
-------

```yml:config.yml
in:
  type: any file input plugin type
  parser:
    type: regex
    charset: UTF-8
    newline: LF
    regex: ^(?<remoteHost>[.:0-9]+) (?<identity>\S+) (?<user>\S+) \[(?<datetime>[^\]]*)\] "((?<method>\S+) (?<path>\S+) (?<protocol>HTTP/\d+\.\d+)|-)" (?<status>[0-9]+) (?<size>[0-9]+|-) "(?<referer>[^"]*)" "(?<userAgent>[^"]*)" (?<inByte>[0-9]+) (?<outByte>[0-9]+)$
    columns:
    - {name: remote_host, type: string, regex_name: remoteHost}
    - {name: identity, type: string}
    - {name: user, type: string}
    - {name: datetime, type: timestamp, format: '%d/%b/%Y:%H:%M:%S %z'}
    - {name: method, type: string}
    - {name: path, type: string}
    - {name: protocol, type: string}
    - {name: status, type: long}
    - {name: size, type: long}
    - {name: referer, type: string}
    - {name: user_agent, type: string, regex_name: userAgent}
    - {name: in_byte, type: long, regex_name: inByte}
    - {name: out_byte, type: long, regex_name: outByte}
out:
  type: stdout
```

source
----

* https://github.com/mokemokechicken/embulk-parser-regex

以下のソースコードからかなりコピペしました。。

* https://github.com/hiroyuki-sato/embulk-parser-apache-log
* https://github.com/frsyuki/embulk-parser-msgpack


さいごに
======

[Java で Embulk Output Plugin を書く](http://qiita.com/muga_nishizawa/items/427c933aaa0e5e437063) などを参考にしながらそれほどハマることなく作れました。すごい。

Pluginとか作るときはJavaは便利だなーと思います。
IDEAなどのIDEでIntellisenseをフル活用しながら、なんとなく書けちゃいますからね。
UILabelの高さを計算する

## 前書き
　基本的に、StoryboardでUILabelを設置して高さの制約をつけなければ文章の長さに応じて自動的に高さが調整されます。
　ただ、状況に応じてはUILabelの高さを能動的に算出したくなります。

例えば
　・UITableViewCellやUICollectionViewCellの高さを先に計算したい
　・標準以外のフォント(ヒラギノなど)で「g」や「q」を含む英文を表示する
　```※ 自動の高さ調節に任せると文字の下端が切れてしまうので高さの制約をつけて計算結果を設定する必要があります。```


## 計算方法
いろいろな方法を試しましたが、以下の形が一番シンプルでした。
適当な名前でUILabelのカテゴリを作成して、そこに追加します。

参考 : [CoreText ヒラギノフォント(日本語)で正確に描画サイズを取得する](http://qiita.com/yusuga/items/2be8c55ca561bba44702)

```objc:UILabel+calc
+ (float)cal_getDescentFromUIFont:(UIFont *)font {
    
    CTFontRef fontRef = CTFontCreateWithName((CFStringRef) font.fontName, font.pointSize, NULL);
    float height = ceilf(CTFontGetDescent(fontRef));
    CFRelease(fontRef);
    return height;
}

- (CGRect)cal_rectForLabel {
    if (self.text.length == 0) {
        return CGRectZero;
    }
    CGSize size = [self sizeThatFits:CGSizeMake(self.frame.size.width, CGFLOAT_MAX)];
    CGRect frame = self.frame;
    frame.size.height = size.height + [UILabel cal_getDescentFromUIFont:self.font];
    frame.size.width = size.width;
    return frame;
}
```

## 使い方

例えばタイトルを表示するself.titleLabelと、その高さ制約である
NSLayoutConstraint *titleLabelHeightConstraint がある場合。

```objc
self.titleLabelHeightConstraint.constant = [self.titleLabel cal_rectForLabel].size.height
```


## あとがき
　当初は```boundingRectWithSize:options:attributes:context```を使ってこの関数を作ってはいたんですがParagraphStyleで指定したLineHeightなどがうまく反映されなかったんだったかな？ 何かしら問題が出たので結局こういった形に落ち着きました。

　結局sizeToFitなどの関数を使ったほうが安定しますね。
エラー『Implicit super constructor Class() is undefined. Must explicitly invoke another constructor』回避方法


#1. 発生条件

例えば以下のようにクラスAを定義し、Aの子クラスとしてBを定義する。

```.java

class A {
}

class B extends A{
	public B(int b) {
	}
}

```

このままではエラーは発生しないが、以下のようにクラスAのコンストラクタを明示的に定義したとき、

```.java

class A {
	public A(int a) {
	}
}

class B extends A{
	public B(int b) {
	}
}

```


```.java
Implicit super constructor  A() is undefined. Must explicitly invoke another constructor
```

というようなエラーが発生する。
これは、クラスBのコンストラクタが親クラスAのデフォルトコンストラクタである`public A()`を参照しようとしているが、定義されていないためである。


#2. 回避方法
回避方法としては２通りある。

##2-1. デフォルトコンストラクタを明示的に定義
以下のように、`public A()`を明示的に定義すればエラーを回避できる。

```.java

class A {
	public A() {
	}

	public A(int a) {
	}
}

```

##2-2. `super()`を明示的に呼び出す
以下のように、Aで定義してあるコンストラクタの引数に合わせた`super()`を呼び出せばエラーを回避できる。

```.java
class A {
	public A(int a) {
	}
}

class B extends A{
	public B(int b) {
		super(b);
	}
}

```
myThingsをはじめよう - Part4: 「IDCF」チャンネルを認証する


[前回](http://qiita.com/masato/items/186c9d50eec76ada3d05)は「IDCF」チャンネルを独立したMQTTブローカーとして使う例を書きました。準備ができたので[myThings](http://mythings.yahoo.co.jp/)のチャンネルでIDCFを使う設定に入っていこうと思います。


## 「IDCF」チャンネルの認証情報

myThingsアプリから「IDCF」を認証する場合、以下の2つの情報が必要になります。

* IPアドレス: IDCFクラウドの仮想マシンのパブリックIPアドレス
* 認証token: 「IDCF」チャンネルのownerのtoken

### パブリックIPアドレス

IPアドレスは[IDCFクラウドに「IDCF」チャンネルをセットアップ](http://qiita.com/masato/items/f9be4a15216fe29de7fb)したとき、仮想マシンに割り当てたパブリックのIPアドレスを使います。この例ではインターネットからアクセス可能な`210.140.162.58`です。

![idcfcloud-firewall.png](https://qiita-image-store.s3.amazonaws.com/0/43745/e3a3c720-aa26-6818-2cb2-1d45b2a903ca.png)

### ownerのtoken

認証tokenは「IDCF」チャンネルを仮想マシンにインストールしたあと、最初に実行する`register`コマンドで表示されますが、あとから確認することもできます。インストールしたディレクトリに移動後`owner`コマンドを実行します。以下の場合は画面に出力された`meshblu_auth_token`の`18633a7c`を使います。

```bash
$ docker-compose run --rm iotutil owner

> iotutil@0.0.1 start /app
> node app.js "owner"

┌─────────┬────────────────────┬──────────────────────────────────────┐
│ keyword │ meshblu_auth_token │ meshblu_auth_uuid                    │
├─────────┼────────────────────┼──────────────────────────────────────┤
│ owner   │ 18633a7c           │ 12a95246-f31e-4f0c-9678-2ae755e57b98 │
└─────────┴────────────────────┴──────────────────────────────────────┘
```

## 「IDCF」チャンネルを認証する

### IDCFを選択する

myThingsアプリを開いてチャンネル一覧の一番下にある「開発向け」セクションから「IDCF」を選択します。

![idcf-channel-list.png](https://qiita-image-store.s3.amazonaws.com/0/43745/34b2e4ce-5f1d-6ca6-3ecd-e8d70589298c.png)

「認証する」ボタンをタップするとIPアドレスと認証tokenを入力する画面が表示されます。

![idcf-channel.png](https://qiita-image-store.s3.amazonaws.com/0/43745/f449ffa8-e95b-e5e4-085a-cdd347eac433.png)


### 利用を開始する

確認したIPアドレスと認証tokenをmyThingsアプリに入力して、「利用を開始する」ボタンをタップします。

![idcf-channel-token.png](https://qiita-image-store.s3.amazonaws.com/0/43745/b64eff4b-a8a9-a16e-8847-e1ce771cc34e.png)


### 認証の確認

「IDCFは認証済みです」と表示されると、チャンネルの認証に成功です。

![idcf-channel-activated.png](https://qiita-image-store.s3.amazonaws.com/0/43745/cb89f04e-32da-1ced-5a0c-1c0dbba3397b.png)


チャンネル一覧画面を表示すると、IDCFにチェックマークが入るのでここからも認証済を確認することができます。

![idcf-channel-list-activated.png](https://qiita-image-store.s3.amazonaws.com/0/43745/10ca02fc-3fdf-473b-bc2e-f282a29cc6da.png)
Hamlでidを正しく出力する方法（ {id: "my-id"} のようにベタ書きで出力されてしまう原因）

```rb
%div{id: "my-id"}
```
これはOK。

```rb
%div {id: "my-id"}
```
これはNG。

半角スペースがあると動かない！　なので。

```rb
%div#my-id
```
って書いたほうが良い。



<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
dropbox > ファイルが圧縮される / 差分だけアップロードされる

https://www.dropbox.com/ja/help/8

> ファイルを転送する前に、Dropbox は新しいファイルを前のバージョンと比較し、ファイルの変更部分のみを送信します。これは「バイナリの差分」と呼ばれ、すべてのファイル形式に対応しています。また、Dropbox はファイルを圧縮してから転送します（データ/品質に損失はありません）。

9MBのフォルダ(csvファイルから構成される)を置いたら1.7MB程度の通信量となった。
同じフォルダをzip圧縮した場合、そのサイズは1.45MBであった。

先にzip圧縮しておいた345KBのファイルを置いたら、通信量は469KBであった。

また、過去に置いたファイルを一度消して、再度置いた場合、そのファイルはzip圧縮で300KBだったが、通信量は62KBだった。
削除したファイルについても、過去に保持したファイル情報をどこかに持っていて、その情報から送信量を減らす工夫がされているのだろうか。
SafariでFlashが動かない

Safariで「環境設定」→「詳細」→「電力を節約するためにプラグインを停止」がオンになっている（デフォルト）と、Flashなどのプラグインが動かない場合があるようです。

とはいえ、他の人のMacでは正常に動いてるようで、
僕の環境でも、サウンド再生用のFlashは動いているのにYouTube APIを使った動画だけ読み込まれない、
でも上記のチェックを外すと読み込まれる、という現象なので、
また別の問題があるかもしれません。

僕の環境以外で再現されてないので深追いしませんが、
報告があれば改めて調査します。
capybaraでcurrent_pathが一致しているかどうか調べるのにハマった

[前回](http://qiita.com/aiyu427/items/404638c3c8cfb3203a74)の続き
別ウィンドウを開いて、そのURLが合っているかどうかのテストをやろうとした

```ruby:sample_steps.rb
  step 'テスト画面が別Windowで表示されていること' do
    handle = page.driver.browser.window_handles.last
    page.driver.browser.within_window(handle) do
      current_path.to eq(hoge_path(type: :fuga))
    end  
  end
```

結果、一致してくれなかった・・・

```
       expected: "/hoge?type=fuga"
            got: "/hoge"
```

current_pathではgetパラメーターがくっついてないらしい。
ってことでpathをやめてurlに変更。

```ruby:sample_steps.rb
  step 'テスト画面が別Windowで表示されていること' do
    handle = page.driver.browser.window_handles.last
    page.driver.browser.within_window(handle) do
      current_url.to eq(hoge_url(type: :fuga))
    end  
  end
```

結果、惜しいｗ

```
       expected: "http://www.example.com/hoge?type=automail"
            got: "http://127.0.0.1:38333/hoge?type=automail"
```

最終的にうまくいったのは、こんなん↓

```ruby:sample_steps.rb
  step 'テスト画面が別Windowで表示されていること' do
    handle = page.driver.browser.window_handles.last
    page.driver.browser.within_window(handle) do
      uri = URI.parse(current_url)
      expect("#{uri.path}?#{uri.query}").to eq(hoge_path(type: :fuga))
    end  
  end
```

# 参考
[How to get current path with query string using Capybara](http://stackoverflow.com/questions/5228371/how-to-get-current-path-with-query-string-using-capybara)
DRBD 8.4 の設定、切り替え手順（Primary/Secondaryバージョン）

# 概要
* DRBD8.4の設定、切り替え手順（Primary/Secondaryバージョン）になります
* Master-Slave構成になります。

# 設定内容
* 両方のホストで作業してください

## ①DRBDで使うディスクとパーティションの追加

```bash
$ sudo fdisk -cu /dev/vda
とかでパーティション作る
 
### 今回はvda4ができました。使えるようにします。
$ sudo pvcreate /dev/vda4
$ sudo dd if=/dev/zero of=/dev/vda4 bs=1M count=1
```
 
## ②DRBDのインストール、設定、ファイルシステム作成、マウント用ディレクトリ作成（新しいノードの追加）

```bash
### 8.4.4をwgetで落としてインストールします。最新バージョンだと色々とbug fixされてるので、そちらを使用。 http://git.drbd.org/?p=drbd-8.4.git;a=blob;f=ChangeLog;hb=HEAD
$ cd /tmp
$ sudo wget http://ftp.kddilabs.jp/Linux/RPMS/elrepo/elrepo/el6/x86_64/RPMS/drbd84-utils-8.4.4-2.el6.elrepo.x86_64.rpm
$ sudo wget http://ftp.kddilabs.jp/Linux/RPMS/elrepo/elrepo/el6/x86_64/RPMS/kmod-drbd84-8.4.4-1.el6.elrepo.x86_64.rpm
$ sudo rpm -Uvh *drbd*
 
### DRBDの設定
$ sudo vim /etc/drbd.d/global_common.conf
global {
         usage-count no;
}
common {
         net {
                 protocol C;
         }
         syncer {
                 rate 100M;
         }
}
 
### データを同期する設定。今回はdataという名前で設定します
$ sudo vim /etc/drbd.d/sync.res
resource data {
    volume 0 {
        device /dev/drbd_data minor 0;
        disk /dev/vda4;
        meta-disk internal;
    }
    on host-192-168-1-1 {
        address 192.168.1.1:7789;
    }
    on host-192-168-1-2 {
        address 192.168.1.2:7789;
    }
}
# デバイスにマイナー番号が使用されていない場合は、minor0をつける。名前/dev/drbd_で始まらないとだめ。
# diskは論理ボリュームだとだめ。
#
# /etc/drbd.conf:7: Parse error: 'dialog-refresh | minor-count | disable ip-verification' expected,　but got '・
# ってのは文法エラーだと出たりします。全角スペースがあっても怒られるよ！
# onの部分は$ uname -nの名前に設定します
 
### drbdのデバイスを作成
$ sudo drbdadm create-md data
 
### drbd起動。新しく追加する場合は、追加するサーバだけ実行すればOKです。
$ sudo service drbd start
 
### 状態確認。 新しく追加された際は、syncが走ってるのを確認出来ます
$ drbd-overview
 
### ファイルシステムの作成
$ sudo mkfs.ext4 /dev/drbd_data
  
### マウント用ディレクトリ作成
$ sudo mkdir /data
$ chmod 777 /data
```
 
## ③Masterの新規構築の場合は、初回フル同期が必要（Slaveだけ作るときはいりません）

```bash
[Primary]
### Primary側から初回フル同期
$ drbdadm -- --overwrite-data-of-peer primary data
 
### UpToDateに変わってるか確認
$ drbd-overview
``` 

## ④Primary指定、マウント（Primaryサーバのみ）

```bash
[primaryサーバのみ]
### Primary指定する。
$ sudo drbdadm primary data 
 
### Primary/Secondaryになってるか確認
$ drbd-overview
 
[primaryのみ]
### /dev/drbd_dataを/dataにマウントする。fstabに書くと、マウント出来ないでOS起動しないパターンも出てくるので行わない
$ mount -t ext4 /dev/drbd_data /data
 
### lost+foundとかいうディレクトリが出来てる可能性があるので、消しましょう
$ sudo rm -rf /data/lost+found
```

# 切り替え手順
## ①Masterがrebootした場合
* 再起動後、マウントするだけで正常な状態に戻ります

```bash
[Master]
$ drbd-overview
$ sudo drbdadm primary data
$ drbd-overview
$ mount -t ext4 /dev/drbd_data /data
$ ll/data
```
 
## ②Masterが起動しなくなった場合
* SlaveをMasterに切り替えるため、サービス断発生します。

```bash
[Slave]
### マウントするだけで同期が走り、Masterにすることが可能。
$ drbd-overview
$ sudo drbdadm primary data
$ drbd-overview
$ mount -t ext4 /dev/drbd_data /data
$ ll /data
```
 
## ③Slaveがrebootした場合
* 再起動し、drbdサービスが上がってくるだけで機能します。

## ④新しくSlaveを構築したい場合
* この手順に沿って構築してあげてください
capybaraとpoltergeistで別ウィンドウで開いたページのテストを行う

たとえばリンクをクリックして別ウィンドウで開いたページの内容が正しいかテストする場合

```ruby:sample_steps.rb
  step 'テスト画面が別Windowで表示されていること' do
    # 1
    handle = page.driver.browser.window_handles.last
    # 2
    page.driver.browser.within_window(handle) do
      # 3
      expect(page).to have_content('あいうえお')
    end  
  end
```

たぶんこんな感じ。
１．最後にブラウザで開いたハンドルを取得
２．そのハンドルからブラウザページを取得
３．pageの内容は、開かれたページの内容

# 参考
[CapybaraのPoltergeistを使ったテストでブラウザの別のタブに移動する](http://qiita.com/tyn-iMarket/items/1481d47a556a45b96496)
[CentOS] squidプロキシサーバーはWebsocketプロトコルに対応していない

しばらく悩んでいましたが、ようやく原因がわかった。

[B.7. Squid プロキシ](https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Virtualization/3.3/html/Installation_Guide/sect-Squid_Proxy.html)
下の方 セクション6

[WebSocket の導入: ウェブにソケットを実装する](http://www.html5rocks.com/ja/tutorials/websockets/basics/)
中段 プロキシ サーバー


原因はわかったが、解決方法はまだわからない。
OpenVAS-8 のチェックスクリプト修正

CentOS Linux release 7.1.1503 (Core)　にOpenVAS-8を入れたところ、
openvasmdがIPv6になっており、標準のスクリプトでは未起動の扱いになってしまったので修正。

705,706行目を修正

修正前

```shell-session:/bin/openvas-check-setup
OPENVASMD_HOST=`netstat -A inet -ntlp 2> /dev/null | grep openvasmd | awk -F\  '{print $4}' | awk -F: '{print $1}'`
OPENVASMD_PORT=`netstat -A inet -ntlp 2> /dev/null | grep openvasmd | awk -F\  '{print $4}' | awk -F: '{print $2}'`
```

修正後

```shell-session:/bin/openvas-check-setup
OPENVASMD_HOST=`lsof -i -n -P |grep openvasmd |awk -F\  '{print $9}' | awk -F: '{print $1}'|sed s'/\*/0.0.0.0/'`
OPENVASMD_PORT=`lsof -i -n -P |grep openvasmd |awk -F\  '{print $9}' | awk -F: '{print $2}'`
```
ついにLivaPCにDebian8.1のインストールが可能に

今までLivaPCにはDebianのインストールが成功しなかった。
mmb_blockというカーネルモジュールがインストールCDに含まれていないためだ。

そのため ubuntuやlinuxmint,archlinuxなどをインストールしていた。
CentOS7ではインストールに成功していない。

## ISOダウンロード

* http://cdimage.debian.org/cdimage/unofficial/non-free/cd-including-firmware/current/amd64/iso-cd/

から `firmware-8.1.0-amd64-netinst.iso` をダウンロード
USBメモリに書き込み
F2かF7を連打しUSBから起動

通常通りインストールが完了し、DISKからOS起動することを確認。

## OS起動後の作業

```bash:/etc/network/interfaces
auto eth0
iface eth0 inet static
        address 192.168.9.9
        netmask 255.255.255.0
        gateway 192.168.9.1
        dns-search local
        dns-nameservers 8.8.8.8 8.8.4.4
```

## ansible

```bash:
apt-get update
apt-get install -y ansible
```

```bash:
mkdir -p debian8/packages/tasks/
cd debian8
touch main.yml packages/tasks/main.yml run.sh
```

### playbook

```yaml:main.yml
---
- hosts: localhost
  sudo: yes
  roles:
    - role: packages
```

```yaml:packages/tasks/main.yml
---
- name: install utilities
  apt: pkg={{ item }} state=installed
  sudo: True
  with_items:
    - vim
    - screen
```

```bash:run.sh
COMMAND='ansible-playbook -i "localhost," --ask-sudo-pass'
$COMMAND --diff -vv main.yml
```

### playbook実行

```bash:
sh run.sh
```

```bash:ついでにeditor変更しておく
sudo update-alternatives --config editor
```
RDS(Mysql)のMaxConnection数

# 概要
この記事はRDS(Mysql)のスケールアップでMaxConnection数がどれくらい上がるかを調査した際の備忘録です。
# 詳細
mysqlでのmax_connectionsは以下の計算式の結果が反映される
<pre>
DBInstanceClassMemory / 12582880
</pre>
各クラス毎でのmax_connectionsは以下の表のようになります。

|クラス|メモリ|max_connections(理論値)|max_connections(実測値)|
|:-----:|:-----:|:-----:|:-----:|
|t1.micro|630MB|52|34|
|m1.small|1.7GB|145|125|	
|m1.medium|3.75GB|320|303|
|m1.large|7.5GB|640|-|
|m1.xlarge|15GB|1280|-|
|m2.xlarge|17.1GB|1459|-|
|m2.2xlarge|34GB|2901|-|
|m2.4xlarge|68GB|5802|-|
|cr1.8xlarge|244GB|20821|-|
max_connectionsが理論値とは異なるという情報あり　
※参考資料「Amazon RDS で max_connections が変わらなかった」を参照
# 参考資料
RDS徹底入門
http://www.slideshare.net/j_nakada/rds-10035113
Amazon RDS で max_connections が変わらなかった
http://qiita.com/rch850/items/33fd88fe5e69fa7a1f29
mackerelのAPIを使ってホストを退役させてみる

## About
検証用に登録したホストを退役する際に、画面からぽちぽちするのが疲れたのでまとめておきます。[mkr](https://github.com/mackerelio/mkr)を使った方が簡単にできるかもしれません。

## 退役方法
### 退役したいホストのIDを取得する

* ホスト一覧を取得

```zsh
$ curl -X GET -H "X-Api-Key: XXXXXXX" https://mackerel.io/api/v0/hosts.json | jq .hosts[].id
```

XXXXXXX：APIキー

* 特定のホスト名を取得

```zsh
$ curl -X GET -H "X-Api-Key: XXXXXXX" https://mackerel.io/api/v0/hosts.json?name=test | jq .hosts[].id
```

ホスト名以外にもサービス名・ロール名・ステータスをパラメータに指定できます。

### ホストを退役させる

```zsh
$ curl -X POST -H "X-Api-Key: XXXXXXX" -H "Content-Type: application/json" https://mackerel.io/api/v0/hosts/YYYYYYY/retire
{"success":true}
```

YYYYYYY：ホストid

## 参考
* [API仕様（v0） - Mackerel ヘルプ](http://help-ja.mackerel.io/entry/spec/api/v0#host-retire)
rfc5077-clientをDebian上でビルドしたい

TLSのセッション再開とセッションチケットが正しく動作しているか確認するにはrfc5077-clientが便利だ。

- [サーバ側のSSL Session Cache状況を確認する「rfc5077」というツールが便利](http://oranie.hatenablog.com/entry/20140731/1406798043)

これをDebianでもビルドしたい。

## 依存しているライブラリ

試行錯誤しながら突っ込んだので、実は依存していないかもしれない。

- libnspr4-dev
- libev-dev
- libssl-dev
- libnss3-dev

- make
- gcc

これをapt-getで入れてmakeすれば動いた。
Railsで新規プロジェクトを始めるまで

# Railsで新規プロジェクトを始めるまで
rbenvを使ったrubyのインストールから、railsのプロジェクトをはじめるまでを書いていきます。

## 前提
* gemはプロジェクト以下のvendor/bundleにインストール

## Rubyのインストール
rbenvとruby-buildを使い、rubyをインストールしていきます。

### 準備
以下のパッケージをあらかじめインストールしておきます。
それぞれ環境によって違うかと思うので、そこは読み替えてお願致します。

```
gcc openssl-devel readline-devel libffi-devel git
```

### rbenv
gitを使いrbenvの最新版を落としてきます。

```
~ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
~ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.zshrc
~ echo 'eval "$(rbenv init -)"' >> ~/.zshrc
~ source ~/.zshrc
```

これで以下を実行して、versionが表示されれば成功です。

```
~ rbenv --version
rbenv 0.4.0-129-g7e0e85b
```

### ruby-build
rbenv同様、gitを使い、最新版のruby-buildを落としてきます。

```
~ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
```

### ruby
rbenvの準備が整ったところで、rubyをインストールしていきます。
以下のコマンドでインストール可能なrubyのversionが表示されますので、最新版のstableをインストールしていきます。

```
~ rbenv install -l
```

確認後、最新のrubyを以下のコマンドでインストール。

```
~ rbenv install 2.2.0
~ rbenv rehash
~ rbenv global 2.2.0
```

最後にrubyのversionが切り替わっているかを確認する。

```
~ ruby -v
ruby 2.2.0
```

## Railsプロジェクト作成方法
まずはじめに適当なディレクトリを作成、移動しておいてください。

### Gemfileの作成・編集
以下のコマンドにてGemfileを作成します。

```
~ rbenv exec bundle init
```

続いて、できたGemfileにrailsを記述します。

```
source "https://rubygems.org"

gem "rails", "4.2.3"
```

### railsのインストール
railsをvendor/bundle以下にインストールします。

```
~ rbenv exec bundle install --path vendor/bundle
```

この時にnokogiriでインストールが中止されてしまう場合があるので、
その際は、libxml2-devel libxslt-devel(環境によって違うので名称は調べていただけると)をインストールしたのち、以下のコマンドを実行してください。

```
~ rbenv exec bundle config build.nokogiri --use-system-libraries
```

### プロジェクトの作成
railsをインストールしたところで、続いてプロジェクトを作成していきます。

```
// 以下はMySQLを使用する場合
~ rbenv exec bundle exec rails new project_name_here --skip-bundle -d mysql
```

これでproject_nameというrailsアプリケーションフォルダが作成されているかと思います。

### セットアップ
作成したプロジェクトへ移動し、以下のコマンドでgemをインストールします。

```
~ rbenv exec bundle install --path vendor/bundle
```

vendor/bundle以下をignoreするために以下を実行。

```
~ echo '/vendor/bundle' >> .gitignore
```

これでセットアップは完了です。
以下のコマンドを打ったのち、[http://localhost:3000](http://localhost:3000)へアクセスすると初期画面が表示されるかと思います。

```
~ bundle exec rails s
```


## 参考
* [rbenv インストールから Bundler を使用した Rails のローカルインストールと起動まで](http://qiita.com/egopro/items/aba12261c053eecd6d19)
* [Rails開発環境の構築（rbenvでRuby導入からBundler、Rails導入まで）（Macport編）](http://qiita.com/emadurandal/items/a60886152a4c99ce1017)
iOS AutoLayoutのデバッグテクニック(Xcode 7で導入されたIdentifierなど)


先々週あたり、この2件のAutoLayoutのデバッグテクニック系記事が海外で話題になっていて[Pocket](https://getpocket.com/)で積ん読状態になっていたので、掘り出しつつ試してみました。


- [Using Identifiers to Debug Autolayout - Use Your Loaf](http://useyourloaf.com/blog/using-identifiers-to-debug-autolayout.html)
- [Autolayout breakpoints - NSHint](http://nshint.io/blog/2015/08/17/autolayout-breakpoints/)


# `UIViewAlertForUnsatisfiableConstraints`のシンボリックブレークポイントを設定

このブレークポイントを設定することで、文字通りAutoLayoutの制約矛盾が発生した時にブレークしてくれます。

さらに、`Action`も設定するのが肝で、この場合は次の設定をするとブレーク時に見やすいログが自動出力されるようになります。
関連: [Objective-C - Xcodeでデバッグ実行中にクラッシュした時に捗るブレークポイント設定 - Qiita](http://qiita.com/mono0926/items/bf70c7ef15db046ee163)

- `Objective-C`: `po [[UIWindow keyWindow] _autolayoutTrace]`
- `Swift`: `expr -l objc++ -O -- [[UIWindow keyWindow] _autolayoutTrace]`

![Screen Shot 2015-08-31 at 9.40.18 AM.png](https://qiita-image-store.s3.amazonaws.com/0/19398/647e1fed-4f7d-078f-1590-f3062659a7f9.png "Screen Shot 2015-08-31 at 9.40.18 AM.png")

捗りそうなログ(　´･‿･｀)

![Screen Shot 2015-08-31 at 9.40.50 AM.png](https://qiita-image-store.s3.amazonaws.com/0/19398/277d0200-0871-624d-4f4d-7c2fcf4846fe.png "Screen Shot 2015-08-31 at 9.40.50 AM.png")

ただ、画面遷移後の瞬間に遷移後の画面で制約矛盾が発生した場合、ログに出るレイアウト情報が前の画面で微妙に役立たなかったという問題もありました（´・ω・｀）

あと、元記事には書いてないですが、ブレークした状態で、Xcodeの`View UI Hierarchy`を実行すると、多分良い感じにその画面状態を表示してくれるはずです。

![Screen Shot 2015-08-31 at 9.54.02 AM.png](https://qiita-image-store.s3.amazonaws.com/0/19398/9ef7e1af-901b-3cb7-6115-d9ff393421b1.png "Screen Shot 2015-08-31 at 9.54.02 AM.png")

最近、Xcodeの調子が悪くて、こういう操作するとクラッシュしてしまい、僕はちゃんと見られるのか確認出来てないですが（´・ω・｀）

# 制約に名前を付ける(Xcode 7〜)

WWDCの発表に含まれていたようですがXcode 7ではこんな風に、制約は`Identifier`というプロパティがあり、それを設定することでログに制約名が出るようになるようです。

![Screen Shot 2015-08-31 at 9.59.55 AM.png](https://qiita-image-store.s3.amazonaws.com/0/19398/0919ffd3-6109-c59a-015e-adbf5970fa64.png "Screen Shot 2015-08-31 at 9.59.55 AM.png")


コードの場合は、こうですね。


```swift
constraint.identifier = "$GemeInfoBottom$"
```

確かに、ログに名前が出てきました。分かりやすい(　´･‿･｀)


```
2015-08-31 09:59:13.223 Player[80154:6146881] Unable to simultaneously satisfy constraints.
	Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
(
    "<NSLayoutConstraint:0x7f8a42dd76c0 V:[UIImageView:0x7f8a4517b0c0(44)]>",
    "<NSLayoutConstraint:0x7f8a42d1e110 UITableViewCellContentView:0x7f8a42decfd0.centerY == UIImageView:0x7f8a4517b0c0.centerY>",
    "<NSLayoutConstraint:0x7f8a4514a2b0 '$GemeInfoBottom$' V:[UIImageView:0x7f8a4517b0c0]-(>=8)-|   (Names: '|':UITableViewCellContentView:0x7f8a42decfd0 )>",
    "<NSLayoutConstraint:0x7f8a453047f0 'UIView-Encapsulated-Layout-Height' V:[UITableViewCellContentView:0x7f8a42decfd0(59.5)]>"
)
```


全制約に予め付けておくと捗りそうですが、けっこう手間ではありますね（´・ω・｀）
docker-machine sshではなく普通にsshで接続する

docker-machineにsshで接続するには `docker-machine ssh <name>` でokですが、このサブコマンドはポートフォワーディングのオプションを受け付けなかったり、微妙に低機能です。

なので、普通にsshで接続するには、以下のようにすれば ok

```shell-session
ssh -i ~/.docker/machine/machines/<name>/id_rsa docker@<docker host ip>
```

面倒なので `~/.ssh/config` あたりに

```
Host <name>
  User docker
  HostName <docker host ip>
  IdentityFile ~/.docker/machine/machines/<name>/id_rsa
```

と書いておけば

```
ssh <name>
```

で接続できます。docker hostのipは固定しておきます（[docker-machineの-d vmwarefusionで作成したホストのIPを固定する](http://qiita.com/genki@github/items/c98cd8c5396d7a002e01)参照）
Ansible v2.0 からの "block" ディレクティブを使ってみる

Ansible v2.0 （記事掲載時点ではalpha）から **block** ディレクティブが追加されている。

http://docs.ansible.com/ansible/playbooks_blocks.html

要はある条件下で、その block 内の task が実行されるということ。上記ページの例では`ansible_distribution == 'CentOS'` の時に３つのタスクが root で実行されることになるようだ。

when には 変数のブールも使えるので、例えば

```yaml

vars:
  flag: true

tasks:
  - block:
    - yum: name={{ item }} state=installed
      with_items:
      - httpd
      - memcached
      
    - template: src=templates/src.j2 dest=/etc/foo.conf
    
    - service: name=bar state=started enabled=True
    when: flag
```

flag が true の時はこの block 内のタスクは実行されて false の時（またはwhen: not flagとするか）はスキップされる。

いろいろなシーンで使えそう。
リモート先のPCでスクリーンショットを撮る方法（紆余曲折）

一度に複数のPCで作業する際、他社が作成したソフトを使うのでエラーがあった際に何も出来なくて困ることがあった。
なのでOpenCVを使い、画像処理でエラーをチェックすることにした。
だがいちいち、すべてのPCに自作したデスクトップをキャプチャーして画像にするソフトを立ち上げに行くのはナンセンスだった。

なので1つPCからコマンドでexeを立ち上げにいくのだが、これがまた厄介だった。

psexecを使ったのだが、-i のパラメータを付与して起動をかけたのだが何故か上手くキャプチャーができない。

仕方なくパワーシェルを使い、ps1でスクショを撮るプログラムを組んだのだがハンドルが見つからないというエラーがでる。
(https://teratail.com/questions/15323)で質問をすると、どうやらリモートではセッションと画面が上手く紐づけされてないために起こるらしい。

さんざ迷ったあげく、一度何か間をかませればいいかと思い。UWSCをpsexecの -i で立ち上げて、UWSCからキャプチャーソフトを立ち上げたら上手くいった。

急がば回れとは、このことであった。協力してくださった皆様、感謝いたします。
Yahoo在庫に関連するAPI・アクセストークン取得方法について



Yahoo在庫に関連するAPI・アクセストークン取得方法について

在庫に関連するAPI（プロフェッショナル出店ストア向け）<http://developer.yahoo.co.jp/webapi /shopping/stock/>のアクセストークン取得のため、こちらのリンクを参照しました。
http: //developer.yahoo.co.jp/yconnect/server_app/explicit/token.html

コードを作成しましたが、 http://54.172.103.152/yahoo/YahooConnect/testYconnect.php
と出てしまいます。問題をご指摘頂ければ幸いです。作成したコードは下記の通りです（２つ）。


GetAuthorizationCode($state); //$Code_result = "k5bvfdyc"; // Token endpoint to request $client->RequestAccessToken($redirect_uri ,$Code_result); // Access token, get a refresh token $access_token = $client -> getAccessToken(); $refresh_token = $client -> GetRefreshToken(); } catch ( TokenException $e ) /*and */{ // Please issue the authorization code to log in again } ?>



$_GET ['code'] , 'code' => 'k5bvfdyc' , 'grant_type' =>'authorization_code', 'redirect_uri' => callback_url, ) ; // POST send $options = array ('http'=> array ( 'method'=>'POST', 'content'=> http_build_query ( $params ) , 'header'=>'Authorization: Basic '. base64_encode ( CONSUMER_KEY.':'.CONSUMER_SECRET ) , )) ; $res = file_get_contents ( TOKEN_URL, false , stream_context_create ( $options )) ; // Response get $token = json_decode ( $res , true ) ; if ( isset ( $token ['error'])) { echo'error'; exit ; } $access_token = $token ['access_token'] ; // -------------------------------------- // try to get the user information // -------------------------------------- $options = array ('http'=> array ( 'method'=>'GET', 'header'=>'Authorization: Bearer'. $access_token , )) ; $res = file_get_contents ( INFO_URL, false , stream_context_create ( $options )) ; echo "

 ". print_r ( json_decode ( $res , true ) , true ) ."  ";

?>

よろしくお願いします。
docker-machineの-d vmwarefusionで作成したホストのIPを固定する

現在のところMacOSX環境（El Capitan）でVirtualBoxがうまく動いていないので、docker-machineをローカル環境で用意するのに `-d vmwarefusion` で VMware Fusionを使っています。

この時、再起動のたびにIPアドレスが変わってしまうのが面倒なので、`/Library/Preferences/VMware Fusion/vmnet8/dhcpd.conf`のファイルを `sudo vim`とかで開いて以下の記述を末尾に追記します。

```
host vmnet8-<name> {
  hardware ethernet xx:xx:xx:xx:xx:xx;
  fixed-address yy.yy.yy.yy;
}
```

`<name>`はdocker-machineの名前。`xx:xx:xx:xx:xx:xx`はMACアドレス、`yy.yy.yy.yy`はIPです。`docker-machine ssh <name>`して`ip a`すればどちらもわかります。

これでIPアドレスが固定できるので、あとは`/etc/hosts`などに

```
<name> yy.yy.yy.yy
```

等と書いておけば良いでしょう。
技術英語 > but the details are difficult to remember > 詳細は思い出せない

@ Star Trek Voyager > CATHEXIS

チャコティの負傷の経緯についてTuvokが言った言葉

> but the details are difficult to remember (しかし、詳細については思い出せない)

「be difficult to 動詞」という形はよく出ているが、rememberと結びついたものは新鮮だった。
Alamofireでmultipart/form-dataリクエスト

[Alamofire/Alamofire](https://github.com/Alamofire/Alamofire)での multipart/form-data リクエストのやり方です。
元々もサポートされてませんでしたが、[バージョン1.3.0](https://github.com/Alamofire/Alamofire/releases/tag/1.3.0)から利用可能になりました。

## サンプルコード

これからリクエストするAPIは

- type: "image" or "video" の文字列値を取りうる
- data: 画像 or 動画のバイナリデータ

の２つのパラメータを受け付けるとします。

```swift
Alamofire.upload(.POST,
        URLString: "https://api.golog13.com/v1/upload",
        headers: nil,
        multipartFormData: { multipartFormData in
            // 文字列データはUTF8エンコードでNSData型に
            multipartFormData.appendBodyPart(data: "image".dataUsingEncoding(NSUTF8StringEncoding)!, name: "type")
            // バイナリデータ
            // サーバによってはファイル名や適切なMIMEタイプを指定しないとちゃんと処理してくれないかも
            multipartFormData.appendBodyPart(data: data, name: "data", fileName: "test.png", mimeType: "image/png")
        },
        // リクエストボディ生成のエンコード処理が完了したら呼ばれる
        encodingCompletion: { encodingResult in
            switch encodingResult {
            // エンコード成功時
            case .Success(let upload, _, _):
                // 実際にAPIリクエストする
                upload.response { request, response, data, error in
                    if let error = error {
                        println("error: \(error)")
                    }
                    
                    // ここからレスポンスを受け取って処理をする..
                }
            // エンコード失敗時
            case .Failure(let encodingError):
                println(encodingError)
            }
        }
)
```
NSURLSessionTask のキャンセルを判定するにはエラーコードを利用する

# 前提

NSURLSession を利用して NSURLSessionTask を実行します。セッションとタスクのコールバックはブロックではなくデリゲートで受けるものとします。

```objc
NSURLSession *URLSession = [NSURLSession sessionWithConfiguration:config delegate:delegate delegateQueue:queue];

NSURLSessionDataTask *task = [URLSession dataTaskWithRequest:request];
[task resume];
```

このタスクは頻繁にキャンセルされ得るもので、例によりタスクの「成功」「失敗」「キャンセル」を区別したいところです。

```objc
[task cancel];
```

# NSURLSessionTaskDelegate

次のデリゲートメソッドでタスクが終了したことを知ることができますが、ここで問題になるのが「成功」「失敗」「キャンセル」の区別の仕方です。

```objc:NSURLSessionTaskDelegate
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task
                           didCompleteWithError:(NSError *)error;
```

## NSURLSessionTaskState には頼れない

タスクの状態を判定する方法もありますが、例のデリゲートメソッドに来た時点ではもう `NSURLSessionTaskStateCompleted` になってしまっています。失敗しても completed だということです。これでは使えませんね。

* NSURLSessionTaskStateRunning
* NSURLSessionTaskStateSuspended
* NSURLSessionTaskStateCanceling
* NSURLSessionTaskStateCompleted

# タスクの終了の理由をエラーコードで区別する

いずれにしても例のデリゲートメソッドは実行されてしまうので、タスクの終了の理由はエラーの有無とエラーコードで判定します。キャンセルの場合は次のエラーコードが返却されます。

```objc:NSURLError.h
NSURLErrorCancelled
```

実際にキャンセル時のエラーをダンプしてみると、`-999` で一致していることが確認できました。キャンセル時にはこの共通のエラーコード `NSURLErrorCancelled` が指定されるということですね。

```
NSURLErrorCancelled = -999
```
```:NSError
Error Domain=NSURLErrorDomain Code=-999 "cancelled"
```

# AFNetworking コミュニティの議論

こちらでも NSURLErrorCancelled での判定を推奨しておりました。

Best practice for cancelled errors with AFURLSessionManager
https://github.com/AFNetworking/AFNetworking/issues/1942
PowerShellからIEを操作

# 環境
* Windows7
* IE11

# IE起動
```ps1
#######################
# IE起動と画面表示
#######################
$ie = New-Object -ComObject InternetExplorer.Application  # IE起動
$ie.Navigate("hogehoge.ne.jp")                            # URL指定
$ie.Visible = $true                                       # 表示

```

# 入力
* IEを起動してWindowsセキュリティ認証のダイアログが起動した際にうまい操作方法がわからなかったので直接キー入力でどうにかする

```ps1
[System.Windows.Forms.SendKeys]::SendWait("%({TAB})")     # Ctrl + Tab でIEの認証ダイアログをアクティベート
Start-Sleep -s 1                                          # インターバル
[System.Windows.Forms.SendKeys]::SendWait("userid")        # アカウント入力
[System.Windows.Forms.SendKeys]::SendWait("({TAB})")      # Tab で次項目（パスワード）へ移動
Start-Sleep -s 1                                          # インターバル
[System.Windows.Forms.SendKeys]::SendWait("password")         # パスワード入力
[System.Windows.Forms.SendKeys]::SendWait("{ENTER}")      # Enter 入力
```

# コンテンツロード待ち
```ps1
#######################
# ブラウザ上のコンテンツロード完了待ち
#######################
While($ie.Busy)
{ Start-Sleep -s 1 }                                      #IE画面のロードが完了するまで、１秒待機をループ
```
# 画面操作
* 要素を取得したり値を入力したりクリックしたり

```ps1
# 画面情報取得
$doc = $ie.Document

# 要素取得
$element = [System.__ComObject].InvokeMember(
            "getElementById"                                  # 指定方法にIDを使用
            ,[System.Reflection.BindingFlags]::InvokeMethod     # おまじない
            , $null                                             # 不要パラメータ
            , $doc                                              # ページ情報オブジェクト
            , "srchtxt"                                         # ID名
            )
# 値入力
$element.value = "hogehoge"


# 要素取得
$element = [System.__ComObject].InvokeMember(
            "getElementById"                                  # 指定方法にIDを使用
            ,[System.Reflection.BindingFlags]::InvokeMethod     # おまじない
            , $null                                             # 不要パラメータ
            , $doc                                              # ページ情報オブジェクト
            , "srchbtn"                                         # ID名
            )
# クリック
$element.click()

########################################
# ↑ではIdからの取得だが、
# Tag（ボタンとか）やClassからの取得の場合
########################################
$element = [System.__ComObject].InvokeMember(                   # 要素の取得 (特定のリンクを取得)
             "getElementsByTagName"                             # 指定方法にClassを使用
            ,[System.Reflection.BindingFlags]::InvokeMethod     # おまじない
            , $null                                             # 不要パラメータ
            , $doc                                              # ページ情報オブジェクト
            , "input"                                           # Class名
            )| ? { $_.name -eq "commit" }

$element = $ie.Document.getElementsByTagName('A') |
                where-object {
                    $_.innerText -eq 'いんなーテキスト'
                }

```

# 保存
* IEの通知バーが出た時に保存
* これも、いけてる方法がわからなかったので直接キー入力

```ps1
[System.Windows.Forms.SendKeys]::SendWait("%({S})")     # Alt + S でデフォルトの保存フォルダに保存

```
Tweet-text-javaでツイート文字数をカウントする

# Twitter-textとは
Twitterの仕様上、URLが何文字ものもであっても短縮URLに変換されたりするので単純にツイートしたい文字数をstring.length()した値を確認しただけでは正しく文字数をカウントできない。
正規表現でごりごり文字数を検索することになるわけだけれど、
Twitter社のオープンソースであるTwitter-textで文字数カウントできるんでこれ使ってみようかな。
Twitter-text
https://github.com/twitter/twitter-text
Java
Ruby
Javascript
Objective C
に対応している模様。



# Java版を使う
## 動作環境
OS:Win7
IDE:eclipse4.4
maven:3.3.1
## gitからcloneする
eclipseにgitプラグインが入ってたらeclipseからcloneしてもよい。
## mavenでビルド
コマンドプロンプトを開いて

```cmd
cd ***\twitter-text\java
mvn install
```

BUILD SUCCESSしたら、***\twitter-text\java\dist\lib\twitter-text-1.12.2-SNAPSHOT.jarが作成されます。

## ビルドパスを通す
eclipseプロジェクトを[右クリック]-[プロパティ]-[javaのビルド・パス]-[ライブラリー]-[Jarの追加]または[外部jarの追加]で先ほど作ったjarを追加

## 使い方
まだ全然試してません。
testケースを見る限り、validator.javaでツイート文字数のカウント・ツイートできるか判定はできるっぽい。
残り文字数の算出はどうやったらいいんだろう。
RaspberryPi2にUbuntu Mateを入れてみたメモ。

ラズパイにマテ茶を入れてみた。

## IMAGEを取ってくる

```bash
wget -d http://master.dl.sourceforge.net/project/ubuntu-mate/15.04/armhf/ubuntu-mate-15.04-desktop-armhf-raspberry-pi-2.img.bz2

# 一応確認
md5 ubuntu-mate-15.04-desktop-armhf-raspberry-pi-2.img.bz2 
MD5 (ubuntu-mate-15.04-desktop-armhf-raspberry-pi-2.img.bz2) = ea74db696bb50907a12ffbc2f2eeb4b5
```

## SDカードに書く

```bash
# 解凍
bunzip2 ubuntu-mate-15.04-desktop-armhf-raspberry-pi-2.img.bz2

# SDカードがどこに刺さってるか確認
# 書き込み先間違えると大惨事なので慎重に
diskutil list

# SDカードに書き込む
sudo dd if=ubuntu-mate-15.04-desktop-armhf-raspberry-pi-2.img of=/dev/rdisk2 bs=1m

# おまじない
sudo sync
```

## RaspberryPi2にインストール

SDカード挿して起動。

- 言語「日本語」
- タイムゾーン「Tokyo」
- キーボード「日本語(OADG 109A)」

あと、ユーザ。

まぁ普通に。


## その他

UbuntuMateの本家サイトから取ってきたtorrentで落としたimageはなぜかことごとく起動失敗。
sourceforgeからwgetしてきたヤツとmd5sumは一致しているのだが。。。
不思議。

ThinkPad-USBキーボードのトラックポイントが普通に動いて感激。
よくわからなくなる曖昧なアクセス修飾子

Javaの試験のためのメモをまとめたものなので、実装で役に立つというより、紙の上で考えるときに思い出せるとお得なまとめです。

# アクセス修飾子
クラス、フィールド、メソッド、コンストラクタなどに付与することでアクセスを制限する修飾子

| アクセス修飾子 　　　 | 制限 | 内容 　　　　　|
|:--------------------|:----|:------------|
| private             | 強 　|同一クラスからのアクセス可能|
| 省略(何も書かないこと)| 　 　|同一パッケージ内からのみアクセス可能|
| protected           | 　 　|同一パッケージ、もしくはそのサブクラスからアクセス可能|
| public              | 弱 　|どのクラスからもアクセス可能|

# 曖昧になりがちな使い所とかルールとか
### インターフェースで用いる
* インターフェースのフィールドやメソッドはpublicでなければならない。よって、他のアクセス修飾子がインタフェースのメソッドについている問題があれば、即はねることができます
* ちなみに、インタフェースのメソッドは暗黙的にpublic abstructで修飾される

### privateで修飾できる要素
- 3つのみ
     - クラスのコンストラクタ
     - フィールド
     - 具象メソッド

### オーバーライドするメソッドの修飾子
* スーパークラスと同じかそれより弱くないといけない。よって、上記の表の強弱の順番を覚えることが大事

### staticフィールドの宣言時のアクセス修飾子の位置
- **アクセス修飾子 static 型 変数名;** または
- **static アクセス修飾子 型 変数名;**
     - この場合アクセス修飾子とstaticの順番が変わっても良い 

### スーパークラスのprivateメソッドやフィールド
- スーパークラスを継承したサブクラスであっても、privateな要素を利用することはできない