OmniAICreator/Qiita-1.07M huggingface dataset:
MySQLでInnoDB破損したときの復旧方法

何かの拍子にInnoDBが破損してMySQL起動できなくなったときの対処方法です。

```
160804 11:47:28  InnoDB: Database was not shut down normally!
InnoDB: Starting crash recovery.
InnoDB: Reading tablespace information from the .ibd files...
InnoDB: Restoring possible half-written data pages from the doublewrite
InnoDB: buffer...
InnoDB: Doing recovery: scanned up to log sequence number 110757537189
160804 11:47:29 [ERROR] mysqld got signal 11 ;
This could be because you hit a bug. It is also possible that this binary
or one of the libraries it was linked against is corrupt, improperly built,
or misconfigured. This error can also be caused by malfunctioning hardware.

To report this bug, see http://kb.askmonty.org/en/reporting-bugs

We will try our best to scrape up some info that will hopefully help
diagnose the problem, but since we have already crashed, 
something is definitely wrong and this may fail.
```

# 修復手順
## 強制起動
- MySQLが起動している場合はサービスを停止する
- datadirに使っている/var/lib/mysqlを一応バックアップ
- /etc/my.cnfの`[mysqld]`に`innodb_force_recovery`を追記して、InnoDBを強制リカバリモードで起動
 - **警告**：innodb_force_recovery は、緊急時にのみ0より大きい値に設定してください。また、値を4以上にするとデータファイルが恒久的に破損する可能性があります。詳しくは[公式マニュアル](http://dev.mysql.com/doc/refman/5.7/en/forcing-innodb-recovery.html)を参照してください

```text:/etc/my.cnf
[mysqld]
innodb_force_recovery = 3
```

- `innodb_force_recovery`のみで起動しない場合`innodb_purge_threads`を追加

```text:/etc/my.cnf
[mysqld]
innodb_purge_threads=0
```

## ダンプ・リストア
- 全データベースをダンプ

```
# mysqldump -u root -p -x --all-databases > alldatabase.dump
```

- MySQLをシャットダウン
 - mysqldがシャットダウンできないときは強制kill

```
# ps xa | grep mysql
# kill -9 safe_mysqldのpid
# kill -9 mysqldのpid
```

- `mysql`フォルダを除くすべてのMySQLデータストレージファイルを削除、もしくはどこかに退避

```text:例
# rm -rf `ls -d /var/lib/mysql/* | grep -v "/var/lib/mysql/mysql"`
```

- /etc/my.cnfの`innodb_force_recovery`を削除
- MySQLを再起動
- ダンプファイルをリストアする

```
# mysql -u root -p < alldatabase.dump
```

# 教訓
mysqldumpとかで定期的なバックアップを必ず取っておく。

# 参考
- [ネットワーク/MySQL、InnoDBのリカバリができず起動できない - アークウェブシステム開発SandBox](http://www.ark-web.jp/sandbox/wiki/228.html)
- [KB Plesk: ﻿[手順] MySQL データベースでの InnoDB 破損を修復するには](https://kb.plesk.com/jp/6586#data-storage-files)
- [MySQL :: MySQL 5.7 Reference Manual :: 15.21.2 Forcing InnoDB Recovery](http://dev.mysql.com/doc/refman/5.7/en/forcing-innodb-recovery.html)
- [MySQL – Corrupted InnoDB tables recovery – Step by step guide](http://blackbird.si/mysql-corrupted-innodb-tables-recovery-step-by-step-guide/)
- [MySQLのデータベースをmysqldumpでバックアップ/復元する方法 | WEB ARCH LABO](http://weblabo.oscasierra.net/mysql-mysqldump-01/)
- [圧縮しながらmysqldump＆圧縮したファイルをmysqlに戻す - 怪しい物を開発するブログ](https://blog.supersonico.info/?p=45)
- [個人的によく利用するMySQLのコマンド一覧 · GitHub](https://goo.gl/Cce2Yk)
MSC-MOD20 > I2C > SD initialization command (I command) > no reply for 1st command after power on boot

This is for communication with GHI Electronics on ALFAT SoC.
( https://www.ghielectronics.com/community/forum/topic?id=23533 )

```txt:Environment
MSC-MOD20 (ALFAT SoC) SD card module
ALFAT SoC version 2.0.0
I2C Connection used
```

Related: http://qiita.com/7of9/items/e649fc649855daa0fcb4

## Investigation

After investigations using UART, it seem that the I command would receive response withing 200msec or so with SD mounted.
http://qiita.com/7of9/items/c018b2fa3e3a62f8c556


I have captured the I2C waveforms using Analog Discovery 2.

I repeated the I2C reading after sending I command with the time range:

- start time: 13:02:40.240
- end time: 13:02:40.964

I did not receive `!00` or other error numbers within the 720 msec.

This behavior (no reply) is hold only for the combination of the following.

- using I2C
- first I command after the power on boot

For other condition, there is no problem.

Waiting for 8 seconds before I command did not change the behavior.

It seems that retry with 200msec wait can avoid this problem as I wrote in other article.
http://qiita.com/7of9/items/e649fc649855daa0fcb4
Python3で非線形回帰

# はじめに
円形アーチの計測結果から，円の中心および半径を逆算する必要性が生じたのですが，これには Scipy の非線形回帰が使えそうなので，早速やってみることにしました．

回帰したい円の方程式は

$$
x^2+(y-y_0)^2=r^2
$$

の形であり，未知数は，円中心の $y$ 座標$y_0$ と 半径 $r$ です．


## 実行用スクリプト
非線形回帰用のPythonプログラムは **py_arch.py** とし，入力ファイル名は **inp\_0.csv** とします．データ数は少ないので，スクリプト内で入力データファイルを作成しています．1列目が計測値 $x$，２列目が計測値 $y$ であり，データをExcelでくれ〜という人が出てくるだろうから csv 形式にしておきます．(これはプログラムのテスト用データで，実際のデータはもっと多いです)


```
cat << EOT > inp_0.csv
-4, 0.00
-3, 1.63
-2, 2.22
-1, 2.53
 0, 2.65
 1, 2.56
 2, 2.22
 3, 1.61
 4, 0.00
EOT

python3 py_arch.py
```

## Pythonのプログラム
**scipy.optimize.leastsq** を用いて，円中心のy座標および半径を求めます．
非線形回帰計算の主要部分は以下の部分です．

```
def func(param,x,y):
    y0 = param[0]
    rr=  param[1]
    return x**2+(y-y0)**2-rr**2
```

```
param0 = [-1.0, 1.0]
result = optimize.leastsq(func,param0,args=(x,y))
y0,rr=result[0][:]
```

**def func** は評価される関数であり，イコールゼロ ($=0$) となるべき関数（数式）を書き込みます．ここでは $x^2+(y-y_0)^2-r^2$ です．

**param0** には求めるべき未知数の初期値ベクトルを入力します．
ここでは，$(y_0)\_{initial}=-1.0$ および $(r)\_{initial}=1.0$ としています．

**args**には，求めるべき未知数ベクトル以外の引数名を与えます．ここでは計測値である，$x$ と $y$ で，**args=(x,y)** としています．


以下に実際に用いたPythonプログラムを示します．ついでに matplotlib による作図も行っています．

```Python3:py_arch.py
import numpy as np
import matplotlib.pyplot as plt
from scipy import optimize

#Function for Least squares method with scipy.optimize
def func(param,x,y):
    y0 = param[0]
    rr=  param[1]
    return x**2+(y-y0)**2-rr**2


#Main routine
fnameR='inp_0.csv'
fnameF='fig_0.png'

data = np.loadtxt(fnameR, delimiter=',')
x = data[:,0]
y = data[:,1]

param0 = [-1.0, 1.0]
result = optimize.leastsq(func,param0,args=(x,y))
y0,rr=result[0][:]
print(y0,rr,rr+y0)

#Data for Plotting
xx=np.arange(-4, 4.1, 0.1)
yy=y0+np.sqrt(rr**2-xx**2)
str0='$x^2+(y-y_0)^2=r^2$'
str1='$y_0='+'{0:.3f}'.format(y0)+'$'
str2='$r='+'{0:.3f}'.format(rr)+'$'

#PLotting
plt.plot(x,y,'bx', label='Data')
plt.plot(xx,yy,'k-', label='fitted curve', linewidth=5, alpha=0.3)
plt.text(0,1.5, str0, ha = 'center', va = 'center', fontsize=16) 
plt.text(0,1.0, str1, ha = 'center', va = 'center', fontsize=16) 
plt.text(0,0.5, str2, ha = 'center', va = 'center', fontsize=16) 
plt.xlim(-5,5)
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.legend(loc='best',fancybox=True, shadow=True, numpoints=1)
plt.grid(True)
plt.axes().set_aspect('equal','datalim')
plt.savefig(fnameF)
plt.show()
```

# 出力結果
![fig_0.png](https://qiita-image-store.s3.amazonaws.com/0/129300/71c2a1d8-45cf-62ee-397a-e36fe4dc0596.png)


以上
nginxについて


###nginxの用途

・静的コンテンツ配信
・アプリサーバへのリバースプロキシとして

###アーキテクチャ

・イベント駆動
・イベントに応じて定められた手順を実行
・接続要求、読み込み、書き込みイベント
・Apache→クライアントの接続要求から始まる一連の処理を書くプロセスで1接続づつ処理
・I/O Multiplexing 複数のファイルディスクリプタを監視。入出力可能になるまで待機させる
・ノンブロッキングI/O
　すぐに処理できないディスクリプタとの入出力処理は中断、別の入出力処理に移ることで並行性を高めてる
・非同期I/O
　nginxはマスタプロセス、ワーカプロセスのマルチプロセス構成。
　マスタプロセスは１つ。ワーカプロセスは設定で複数起動可能。
　複数のクライアントとの入出力を並行して行うことができる
　ワーカプロセスは複数起動可能→容易なスケール。
　マスタプロセスはワーカプロセスのPIDを保持。マスタにシグナルを送ればnginx全体のプロセスを制御可。
　
###インストール
```
#CentOSの場合
#/etc/yum.repos.d/nginx.repo を作成

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/centos/7/$basearch/
gpgcheck=0
enabled=1
```

```
$ sudo yum install nginx
```

###設定をデバッグ
ログに流れてくる変数などを出力することで確認できる。


```
#nginx.conf デバッグ用のLogFormatを追加

log_format for_debug "[DEBUG] $debug_val";
```


```
#sites-available内の各サイト設定に

#デバッグ用フォーマット指定
access_log /var/log/nginx/xxx.com/access.log for_debug;

location ~ \.php${
		#デバッグ用変数に確認したいデータを指定
		set $debug_val $fastcgi_script_name;
		
		fastcgi_pass    127.0.0.1:9000;
		fastcgi_index   index.php;
		fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
		include         fastcgi_params; 
} 

```
　
###まとめ
nginx@nginx.org ユーザ向けメーリングリスト
nginx-announce@nginx.org セキュリテイ等アナウンス
nginx plus Nginx, Inc.提供の商用版。
AD2 > I2C > Source切替機能 > 時系列データのページ切替

```txt:動作確認
ESP8266 (気圧計で使用したユニバーサル基板: I2Cを4.7kでプルアップ)
SDモジュール: MSC-MOD20 ( http://www.microtechnica-shop.jp/shopdetail/000000000026/ )
Analog Discovery 2 (以下AD2)
```

http://qiita.com/7of9/items/c7552f193432723a6755
にてSD初期化処理のI2C通信がどうもおかしい。

UARTでの確認をしたが、I2Cの場合とは少し違うようにも思う。

## Source

AD2で使うWaveForms 2015にはSourceという項目がある。Runボタンの右側に位置している。
波形取込みをした時に1ページに収まりきらない場合、Sourceの値がカウントアップしていき、時系列データをページ単位で保持していく機能があるようだ。

I2c読込処理を増やしてみて波形取込みしてみた。

500msec程度の範囲が取り込みできている。

### Source:89 (12:41:21.940)

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/abb8c7a4-cf20-48fe-6567-d771aa6c85c1.png)

### Source:100 (12:41:22.409)

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/02772925-6cbb-0f09-add0-315528ffaa16.png)
インストールしたユーザ関数を調べる（MySQL）

こんにちは。
MySQL に自らインストールしたユーザ関数、プラグインの存在を調べるスクリプトを書いてみました。例では、```myfunc%```、```myplugin%```で始まる名前のものを表示するようにしています。

```console
$ ./load_data.sh
+-------------------------------------------+
| /usr/local/Cellar/mysql/5.7.14/lib/plugin |
+-------------------------------------------+
$ cat load_data.sh
#!/bin/sh
USER="root"
PASSWORD=""
DATABASE=""
FUNCTION_USER="myfunc%"
PLUGIN_USER="myplugin%"
[ -z `pidof mysqld` ] && {echo "Please start mysqld: mysql.server start"; exit 1; }

mysql -u${USER} -p${PASSWORD} -D ${DATABASE} -t 2>/dev/null << EOS
  show variables like 'plugin_dir';
  select * from mysql.func where name like '$FUNCTION_USER';
  select plugin_name from information_schema.plugins where plugin_name like '$PLUGIN_USER';
EOS
exit $?
```

それらが存在している状態のままで MySQL をアップグレードしたら（```brew upgrade mysql```）、管理不整合状態(?)になり、回復に手間取り、関数は下記のようにして削除しました。

```mysql
mysql> delete from mysql.func where name = 'myfunc';
```
Railsでformの要素を動的に追加・削除可能な入力フォームの実装手順　※自分用メモ

参考サイト
http://www.virment.com/add_and_remove_rails_nested_form_dynamically/

http://blog.scimpr.com/2014/01/20/rails4%E3%81%A7%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E8%A6%81%E7%B4%A0%E3%82%92%E5%8B%95%E7%9A%84%E3%81%AB%E8%BF%BD%E5%8A%A0%E3%81%97%E3%81%9F%E3%82%8A%E5%89%8A%E9%99%A4%E3%81%97%E3%81%9F%E3%82%8A/

https://teratail.com/questions/3135
http://mae.chab.in/archives/2146
cakephp 1.2

CakePHPで高速Webアプリ開発
http://gihyo.jp/dev/serial/01/cakephp

マニュアル
http://book.cakephp.org/1.2/ja/The-Manual/Developing-with-CakePHP/Models.html

・2016/08/07
コントローラには、通常、actions（アクション）と呼ばれるメソッドをいくつでも書き込むことができます。アクションは、ビューを表示するために使用されるコントローラのメソッドです。アクションは、コントローラの中のひとつのメソッドのことです。
Xamarin StudioでNuGetパッケージを追加する

Xamarin StudioでNuGetパッケージを追加する方法です。

1. プロジェクト内のパッケージ > Add Packages...をクリック
![スクリーンショット 2016-08-06 11.07.57.png](https://qiita-image-store.s3.amazonaws.com/0/94706/ad915ae9-6d5c-73cc-4161-1a88a9ea736b.png)

2. 右上サーチボックスから検索して、必要なパッケージにチェックを入れて、Add Packageをクリック
![スクリーンショット 2016-08-06 11.23.01.png](https://qiita-image-store.s3.amazonaws.com/0/94706/7041da7d-e9ce-99f4-f2e0-891299860fe0.png)

3. パッケージコンソールにsuccessfully added.と表示されることを確認
![スクリーンショット 2016-08-06 11.23.20.png](https://qiita-image-store.s3.amazonaws.com/0/94706/d0ae2c40-d71b-61ff-8b61-1afd0baa7dc7.png)
下記のように、「requires NuGet client version '2.12' or above, but the current NuGet version is '2.8.7.0'」とNuGetクライアントのバージョンが古いと怒られて、パッケージを追加できない場合があります。
その際は、Xamarin Studioそのものをアップデートする必要があります。
![スクリーンショット 2016-08-06 11.03.15.png](https://qiita-image-store.s3.amazonaws.com/0/94706/464bb465-1e7f-6f06-fb76-2afdf4c46ce1.png)

4. usingで名前空間の参照を追加して、使用する
![スクリーンショット 2016-08-06 11.40.57.png](https://qiita-image-store.s3.amazonaws.com/0/94706/9d8dcc08-c640-7753-e4b6-779dd88dd8a4.png)
Webページを一部自動更新にする

作成したWebページの一部だけを更新したい。
jQueryのAjaxとそれを定期的に動作させるために jquery.periodicalupdater.js を利用する。

jquery.periodicalupdater.js は[こちら](https://github.com/RobertFischer/JQuery-PeriodicalUpdater)から取得

# 更新部分を実装する
1秒間隔で "ajax.txt" を読み込んで、文字列を書き換える。
…ように実装したつもりだが一回しか更新されない。
"ajax.txt" を更新するたびに文字列が変わるような想定だったが、
何がいけないのかいまいちわからない。。

追記：解決しました。コード内コメント部参照

```
<!DOCTYPE html>
<html>
  <head>
    <title>test</title>
    <script type="text/javascript" src="js/jquery-3.1.0.min.js"></script>
    <script type="text/javascript" src="js/jquery.periodicalupdater.js"></script>
    <script type="text/javascript">
      $(function(){
        $.PeriodicalUpdater('./ajax.txt',{
          method: 'get',
          minTimeout: 1000,
          type: 'html'
        },

        function(data){
          <!-- 元々の実装、PeriodicalUpdaterで読み込んでいるためloadは不要、textの更新だけ行う
          $("#ajax_txt").load("./ajax.txt");
          -->
          $("#ajax_txt").text(data);
        });
      });
    </script>
  </head>
  <body>
    <div id="ajax_txt">aaa</div>
  </body>
</html>
```

# オプション設定を見直す
なぜか時間が経つと更新されなくなるので、
オプション設定を再度確認したところ、
multiplier と maxTimeout の組み合わせが原因になっていた。

処理実行毎に minTimeout の設定値に対して multiplier の設定値を掛けて次のインターバルとして使い、
そのインターバルの最大値が maxTimeout の設定値になっていた。

デフォルト設定では下記設定になっているため、
自分で設定しないとインターバルがどんどん長くなっていっていたみたい。

```
        maxTimeout:64000, // maximum length of time between requests
        multiplier: 2,    // if set to 2, timerInterval will double each time the response hasn't changed (up to maxTimeout)
```

改めて実装しなおしたのが下記のコード

```
        $.PeriodicalUpdater('./ajax.txt',{
          method: 'get',
          minTimeout: 1000,
          type: 'html',
          multiplier:1,
          maxCalls: 0
        },
```

# 参考にしたWebページ
「jQuery日本語リファレンス」
http://semooh.jp/jquery/

「Think deeply, Do less, More effective」
http://kwski.net/jquery/1022/
電子工作 > スイッチ、FTDIアダプタやめるってよ

以下はUSBシリアル変換用FTDIアダプタ。
http://www.akafugu.jp/ja/posts/products/ftdi-adapter/

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/eb8d4d39-d8ce-1eaf-69d0-f1af198f9616.png)

上記の写真は修正後。赤枠のスイッチがポロリと取れてしまった。

何度目かの使用後の片づけの際にスイッチ部分に負荷がかかり、スイッチがまがっている状態だった。その状態で使用してきたが、本日スイッチが取れてしまった。

FTDIアダプタは2つ体制にしているので、1つの故障は許容内だが、修理できるなら直したい。ヒートクリップがあったので、以下のようにバイスにセットしてはんだづけしたら治った。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/37deb3ce-3b4f-5d22-c3b6-2ad832a2ff6b.png)

はんだがこんもりしているが、とりあえず動作はしたのでこれで様子を見てみる。

このスイッチは3.3Vと5V切替用だが、今まで3.3Vでしか使っていない。スイッチなので、外側にでっぱりだし、それが何かのきっかけでひっかけて故障してしまう。
スイッチの扱いは慎重に。

3点の接点のうちどれがGNDなのか。一番右側のようにも思えるが、へたな細工はケガのもとなので、やめている。
特定の文字列を含まない行を削除したいっ！

# 背景
主に何かのログファイルを確認するときですね
注目したい行だけ残したい事ってあるでしょう？

# 方法

```text
^(?!.*～).*$\n
```

を検索して空文字に置換するだけ
（～の所に、注目するキーワードを指定する、と）

ただのメモ代わりにアップしときました
オブジェクト指向で作るFizzBuzz

[FizzBuzz](https://ja.wikipedia.org/wiki/Fizz_Buzz)はみなご存知の通り、初心者向けのアルゴリズムの課題である。
そのFizzBuzzをオブジェクト指向で作ってみようと思ってやってみた。


# 普通のFizzBuzzのソース
誰が作ってもだいたいこんなソースになると思う。

```java:リスト1
public class Game {
	public static void main(String[] args) {
		for (int i = 1; i < 50; i++) {
			if (i % 3 == 0 && i % 5 == 0) {
				System.out.println("FizzBuzz");
			} else if (i % 5 == 0) {
				System.out.println("Buzz");
			} else if (i % 3 == 0) {
				System.out.println("Fizz");
			} else {
				System.out.println(i);
			}
		}
	}
}
```

# オブジェクト指向のFizzBuzzのソース
作ってみたらこうなった。
GameクラスではFacadeパターンを使用し、FizzBuzzGameをnewしてplayFizzBuzzを実行するだけ。
FizzBuzzGameクラスでは1〜50までループし、Strategyインターフェースのcallを実行するだけ

```java:リスト2
public class Game {
	public static void main(String[] args) {
		new FizzBuzzGame().playFizzBuzz();
	}
}


public class FizzBuzzGame {
	public void playFizzBuzz() {
		for (int i = 1; i < 50; i++) {
			Strategy st = StrategyFactory.getStrategy(i);
			st.call();
		}
	}
}
```

ファクトリークラスでは、
「Fizz」「Buzz」「FizzBuzz」「数字」を出力するStrategyクラスのインスタンスを作成して返す。

```java:リスト3
public interface Strategy {
	public void call();
}

public class Fizz implements Strategy {
	@Override
	public void call() {
		System.out.println("Fizz");
	}
}

public class Buzz implements Strategy {
	@Override
	public void call() {
		System.out.println("Buzz");
	}
}

public class FizzBuzz implements Strategy {
	@Override
	public void call() {
		System.out.println("FizzBuzz");
	}
}

public class NotFizzBuzz implements Strategy {
	int i;
	public NotFizzBuzz(int i) {
		this.i = i;
	}
	@Override
	public void call() {
		System.out.println(i);
	}
}

public class StrategyFactory {
	public static Strategy getStrategy(int i) {
		Strategy st = null;
		if (i % 3 == 0 && i % 5 == 0) {
			st = new FizzBuzz();
		} else if (i % 5 == 0) {
			st = new Buzz();
		} else if (i % 3 == 0) {
			st = new Fizz();
		} else {
			st = new NotFizzBuzz(i);
		}
		return st;
	}
}

```
実行すると期待通りの結果に。

```text:
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz
Fizz
22
23
Fizz
Buzz
26
Fizz
28
29
FizzBuzz
31
32
Fizz
34
Buzz
Fizz
37
38
Fizz
Buzz
41
Fizz
43
44
FizzBuzz
46
47
Fizz
49

```

# まとめ
Javaの基礎を一通り学んだ初心者の卒業課題にちょうどいいんじゃないかと思った。
ソースコードは[Github](https://github.com/gitWMoon/design-pattern)で公開中。
All in one SEO Pack(2.3.7以降)を編集者(editor)等の管理者権限以外のユーザーでも使えるようにする。

WordPressのSEO対策プラグイン「All in one SEO Pack」は非常に有名で利用しているユーザーも多いプラグインです。

管理者権限以外のユーザーではこのプラグインを使って詳細の設定を行うことが出来なかったので、編集者（editor）権限でも使えるようになった手順をまとめます。

以前は、User Role Editorを使って「manage_options」にチェックを入れて適用するだけで良かったのですが、
→[参考] https://wordpress.org/support/topic/capability-to-editor

All in one SEO packでセキュリティの脆弱性が発見されてからユーザー権限まわりの仕様を改善したらしく、この方法では管理者権限以外のユーザーでは使うことができなくなっていました。
>脆弱性はAll in One SEO Packの2.3.6.1までのバージョンで確認され、研究者はコンセプト実証コードも公開した。7月8日にリリースされたバージョン2.3.7で問題は修正されたとしている。
>引用元：http://www.itmedia.co.jp/enterprise/articles/1607/12/news061.html

# 概要
ユーザー権限をカスタマイズできるプラグイン「User Role Editor」を使って、
適用したいユーザーの権限に「All in one SEO Pack」を使用するためのcapabilityを付与します。

# 検証時の環境

|| バージョン | 
|:-----------|------------:|
| WordPress | ver4.5.3 | 
| All in one SEO Pack | ver2.3.8 | 
| User Role Edito| ver4.26.3| 


# 手順
1. プラグイン「User Role Editor」をインストールし有効化。
2. ユーザー＞User Role Editor の「Select Role and change its capabilities:」の右のセレクトボックスから権限を付与したいユーザー権限を選択。ここでは編集者（editor）を選択。
3. 右側にある「Add Capability」で「aiosp_manage_seo」を入力し適用する。
4. チェックボックスの一覧に追加されたaiosp_manage_seoにチェックを入れUpdateする。
5. 権限を付与したユーザーIDでログインし直し、左メニューに「All in one SEO pack」が追加されているのを確認する。

※上記の流れでは、従来の方法でチェックを入れていたmanage_optionsには何もしていません。
【Visual Studio Tools for Apache Cordova】ネットワーク上のMacを利用してiOS版アプリをビルド

# はじめに
VisualStudio2015 + Visual Studio Tools for Apache Cordovaからネットワーク上のMacを利用してiOS版アプリをビルドする環境を構築したときの覚え書きです。

参考にした手順：
[クラウドで iOS をビルドし、シミュレートする](https://msdn.microsoft.com/ja-jp/library/dn858446.aspx)

# 環境
下記の環境で作業を行いました。

Mac:

- OS X El Captain(10.11.4)
- Xcode v7.3.1

PC:

- Windows10 Pro
- Visual Studio 2015 
- Visual Studio Tools for Apache Cordova

# 作業手順
Mac側:
1. node.jsをインストールする

```bash
brew install node.js
```
※homebrewが入っていない人は[こちら](http://brew.sh/index_ja.html)からインストール。
2. remotebuildのインストール

```bash
sudo npm install -g remotebuild
sudo npm install –g ios-sim@3.1.1
```
　
3. remotebuildを起動する。

以下のコマンドを実行する
```bash
remotebuild
```


```bash
Successfully installed homebrew packages.

Use the following information in Visual Studio under Tools, Options, Tools for Apache Cordova, Remote Agent Configuration to use this agent:

Enable remote iOS processing: True
Host: xxxx
Port: 3000
Secure mode: True
Security PIN: 370361
```
　
4. リモートエージェントの設定を行う

VisualStudioの「ツール」>「オプション」でオプションダイアログを開く。
ダイアログの「Tool for Apache Cordova」>「リモートエージェント構成」タブを開く。
セキュリティPIN, ポート, ホストに上記3のHost, Port, Security PINの値を設定する。

これで設定完了。
VisualStudioの「ビルド」>「ソリューションのビルド」メニュー等でビルドが実行されることを確認する。

#周辺知識

[Visual Studio Tools for Apache Cordova のインストール(iOSツールのインストール)](https://msdn.microsoft.com/library/dn757054.aspx#ios)
[Remote Build](http://taco.tools/docs/remote-build.html)
[HomeBrewの仕組みについてまとめておく](http://takuya-1st.hatenablog.jp/entry/20111224/1324750111)
[npm とか bower とか一体何なんだよ！Javascript 界隈の文脈を理解しよう](http://qiita.com/megane42/items/2ab6ffd866c3f2fda066)
Eclipse WTPでTomcat 8上のWebアプリケーションをデバッグするチュートリアル

前提
----
* EclipseにWTP(Eclipse Web Tools Platform)が入っている  
(Eclipse IDE for Java EE Developersなら入っている)

EclipseプロジェクトのFacetsを確認する
-----------------

Eclipse projectの[Properties]-[Project Facets]で
* Dynamic Web Module
* Java
* JAX-RS (JAX-RSの場合)
が選択されていることを確認する

![image](https://qiita-image-store.s3.amazonaws.com/0/15725/e52a1611-6d7a-e852-4f10-1b96657ca12b.png)

Degub on Serverを実行する (Alt+Shift+D, R)
-----------------
![image](https://qiita-image-store.s3.amazonaws.com/0/15725/6804c893-65d8-6200-57be-10820d84ac58.png)

サーバーを定義する (未実施の場合)
-------------------------------
1回もサーバーを定義したことがないと、[Choose an existing server]が選べないので
[Manually define a new server]を選択し、
* [Select the server type]:[Apache]-[Tomcat v8.0]
* (常にこのサーバを使うなら) [Always use this server when running this project]にチェック

![image](https://qiita-image-store.s3.amazonaws.com/0/15725/6cb94397-4d4f-912e-8f2a-142b943f1e34.png)

Tomcat Serverの設定ページでTomcatのインストール先を設定する。
(8.5系は認識できないので、8.0系の最新を使う。無理やり8.5系を使うには:
http://stackoverflow.com/questions/37024876/how-to-use-tomcat-8-5-x-and-tomee-7-x-with-eclipse
を参照)


![image](https://qiita-image-store.s3.amazonaws.com/0/15725/d0ac39a0-537c-cca2-258a-566fa8550669.png)

デプロイ先
---------
run configurationsのVM arguments、[catalina.base], [wtp.deploy]で指定された場所にデプロイされる。　

![image](https://qiita-image-store.s3.amazonaws.com/0/15725/2a0f897e-171e-f14d-4b86-04167a2bb3a5.png)

動作がおかしい場合
-----------------
前にデプロイしたWebアプリケーションの影響だったりすることもあるので、とりあえず
[Servers]ビューから[Clean Tomcat Work Directory...]してみる。

![image](https://qiita-image-store.s3.amazonaws.com/0/15725/421cd116-bcea-3177-74fc-537a39cd16f7.png)
MSC-MOD20 > timing (UART) > T command > T S / T B

```txt:Environment 
microSD module: MSC-MOD20 ( http://www.microtechnica-shop.jp/shopdetail/000000000026/ )
  - ALFAT SoC
microSD: 2GB SD (not SDHC) 
```

##  ALFAT SoC

- version 2.0.0
- connection: UART > RX, TX, GND

## Tool

rs232cTerminal v0.5
http://qiita.com/7of9/items/80e93ec08fe06c5b24a1

## Result for T S > share mode

- first after the power on boot
  - TX: 10:59:40.010
  - RX: 10:59:40.026
  - about 16 msec
- 2nd
  - TX: 10:59:40:710
  - RX: 10:59:40.728
  - about 18 msec
- 3rd
  - TX: 10:59:41.310
  - RX: 10:59.41.310
  - about 0 msec?

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/1deef58c-4f59-33c9-9587-f3df5f891921.png)

## Result for T B > backup mode

- first after the power on boot
  - TX: 11:02:14.538
  - RX: 11:02.15:439
  - about 900 msec
- 2nd 
  - TX: 11:02:15.338
  - RX: 11:02:15.568
  - about 230 msec
- 3rd
  - TX: 11:02:15.938
  - RX: 11:02:16.079
  - about 140 msec

Not constant on the above three cases.

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/2d705c67-68b4-1f9f-5702-c7a84373d108.png)
MSC-MOD20 > timing (UART) > SD write/read test > E M:>6400000

```txt:Environment
microSD module: MSC-MOD20 ( http://www.microtechnica-shop.jp/shopdetail/000000000026/ )
  - ALFAT SoC
microSD: 2GB SD (not SDHC) 
```

## ALFAT SoC

- version 2.0.0
- connection: UART > RX, TX, GND

## Tool

rs232cTerminal v0.5
http://qiita.com/7of9/items/80e93ec08fe06c5b24a1


## Result for E M:>6400000

- E M:>6400000
  - TX: 10:26:12.794
  - !00: 10:26:12.887
  - WRT: 10:26:41.533
  - RDT: 10:27:05.188
  
where WRT means Write Test, and RDT Read Test.

0x6FDD is 28637 in decimal.
0x5C6D is 23661 in decimal.

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/e0bd94ce-b1f3-fde1-1362-382e4b00129a.png)
MSC-MOD20 > timing (UART) > SD init / open / write / close / SD read

```txt:Environment
microSD module: MSC-MOD20 ( http://www.microtechnica-shop.jp/shopdetail/000000000026/ )
  - ALFAT SoC
microSD: 2GB SD (not SDHC) 
```

## ALFAT SoC

- version 2.0.0
- connection: UART > RX, TX, GND

## Tool

rs232cTerminal v0.5
http://qiita.com/7of9/items/80e93ec08fe06c5b24a1


## Result for SD init/open/write/close

Below is the case where there is no error.

- I M: command
  - TX: 10:02:29.855
  - RX: 10:02:30.009
- O 1W>M:\123.txt
  - TX: 10:02:40.055
  - RX: 10:02:40.068
- W 1>B
  - TX: 10:02:48.656
  - RX: 10:02:48.753
- HELLO WORLD
  - TX: 10:02:54.056
  - RX: 10:02:54.072
- C 1
  - TX: 10:03:03.657
  - RX: 10:03:03.676

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/5fcb773f-21f2-b58b-6684-936a7603c9e9.png)

## SD read

- O 1R>M:\123.txt
  - TX: 10:09:59.928
  - RX: 10:09:59.947
- R 1Z>B
  - TX: 10:10:16.629
  - RX: 10:10:16.661
- C 1
  - TX: 10:10:22.929
  - RX: 10:10:22.948
 


![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/57bed7c8-04b2-bc93-394a-9b2cd0d1f41e.png)
java > String > "AAA" + 0x0A > "AAA<LF>"ではなく、"AAA10"になります / 演算子"+"使用時にはまりそうな点

```txt:動作環境
Processing 3.1.1 on Windows 8.1 pro(64bit)
ControlP5 v2.2.6
```

## 状況

http://qiita.com/7of9/items/1edf5a109eea9b711058
を実装中にはまった点を整理。

以下のjavaプログラムで0x0Aが`<LF>`として扱われなかったために、通信先が`<LF>`を拾えなかった。

```
txt = tx + 0x0A;
myPort.write(txt);
```

## 確認

ideoneで確認した。

http://ideone.com/POJPlE

```java
/* package whatever; // don't place package name! */

import java.util.*;
import java.lang.*;
import java.io.*;

/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
	public static void main (String[] args) throws java.lang.Exception
	{
		String str1 = "AAA" + "\n";
		System.out.print(str1);
		
		String str2 = "BBB" + 0x0A;
		System.out.print(str2);
		
		System.out.println("END");
	}
}
```

```txt:結果
Success	time: 0.1 memory: 320512 signal:0
AAA
BBB10END
```

String方に対して`+ 0x0A`は10という数値を文字列に変換した上でString文字列に足されるようだ。

[文字列連結演算子 +](http://qiita.com/7of9/items/6ac8e3b6e17e127efe99#%E6%96%87%E5%AD%97%E5%88%97%E9%80%A3%E7%B5%90%E6%BC%94%E7%AE%97%E5%AD%90-)が働いているのでふるまいとしては正しいのだろう。

`<LF>`を足したい場合は`+ "\n"`にしないといけない。


## 演算子"+"使用時にはまりそうな点

@shiracamus さんの[コメント](http://qiita.com/7of9/items/c6927e3d52c7c4847331#comment-57e41332ebea5def8108)を参照ください。
MSC-MOD20 > timing (UART) > V command

```txt:Environment
microSD module: MSC-MOD20 ( http://www.microtechnica-shop.jp/shopdetail/000000000026/ )
  - ALFAT SoC
microSD: 2GB SD (not SDHC) 
```

## ALFAT SoC

- version 2.0.0
- connection: UART > RX, TX, GND

## Tool

rs232cTerminal v0.5
http://qiita.com/7of9/items/80e93ec08fe06c5b24a1


## Result for `V` command

boot time: 09:24:58.488

- the first after the power on boot
  - TX: 09:24:58.829
  - RX: 09:24:58.840
  - about 10 msec
- 2nd
  - TX: 09:24:59.430
  - RX: 09:24:59.449
  - about 20 msec
- 3rd
  - TX: 09:25:00.131
  - RX: 09:25:00.137
  - about 6 msec

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/2b6b7b2b-b8d2-bb81-9dbd-f7239b1f1cc2.png)
MSC-MOD20 > timing (UART) > I M: command

```txt:Environment
microSD module: MSC-MOD20 ( http://www.microtechnica-shop.jp/shopdetail/000000000026/ )
  - ALFAT SoC
microSD: 2GB SD (not SDHC) 
```

Related https://www.ghielectronics.com/community/forum/topic?id=23533

## ALFAT SoC

- version 2.0.0
- connection: UART > RX, TX, GND

## Tool

rs232cTerminal v0.5
http://qiita.com/7of9/items/80e93ec08fe06c5b24a1


## Result for `I M:`command

### with SD mounted

boot time: 09:02:08:039

- the first after the power on boot
  - TX: 09:02:08.759
  - RX: 09:02:08.907
  - about 150 msec 
- 2nd 
  - TX: 09:02:10.445
  - RX: 09:02:10.474
  - about 130 msec
- 3rd
  - TX: 09:02:11.445
  - RX: 09:02:11.466
  - about 120 msec


### with SD unmounted

boot time: 09:09:04.451

- the first after the power on boot
  - TX: 09:09:05.016
  - RX: 09:09:08.310
  - about 3.3 sec
- 2nd
  - TX: 09:09:09.517
  - RX: 09:09:12.805
  - about 3.3 sec
- 3rd
  - TX: 09:09:13.618
  - RX: 09:09:16.915
  - about 3.3 sec


![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/f717aeb2-49c4-c2e3-31da-63051ce8ed26.png)
Chrome ローカル環境で localStorageを使う


## 準備
コンテンツの設定 -> Cookie -> 例外設定
`file:///*` を許可

## jsで使えるかチェック
```js
window.onload = function(){
    if (storageCheck('localStorage')) {
        // 使える場合
    } else {
        // 使えない場合
    }
}

function storageCheck(type){
    try {
        var storage = window[type],
        x = '__test__';
        storage.setItem(x,x);
        storage.removeItem(x);
        return true;
    } catch(e) {
        return false;
    }
}

```
Processing / ControlP5 / MSC-MOD20 > rs232cTerminal (v0.5) > tx/rx from/to UART device

```txt:Environment
Processing 3.1.1 on Windows 8.1 pro(64bit)
ControlP5 v2.2.6
microSD module: MSC-MOD20 ( http://www.microtechnica-shop.jp/shopdetail/000000000026/ )
  - ALFAT SoC
```

for https://www.ghielectronics.com/community/forum/topic?id=23533&page=1#msg218836


## code v0.5

[processing_160805_rs232cTerminal > v0.5 @ github](https://github.com/yasokada/processing_160805_rs232cTerminal/releases/tag/v0.5)

Features:

- based on Processing with ControlP5 library, and Serial library
- COM connection
- tx text with LF termination
- rx text with LF termination
- timestamp with milliseconds of tx and rx


## example 

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/abed962a-cbb2-7b4b-ef5e-6f7ec24deade.png)

TXSTRING can be resent only by `[Enter]` on the TXSTRING field.
Docker + Ansible で Hello World!

[Ansible 動作チェック用の Docker イメージ](http://qiita.com/mdew150/items/b0ba9715245f47606366) を使って、Ansible で Hello World! してみる。

## 用意するコンテナ

### Control Machine（構成管理をする側)

```
$ docker run -it --name control_machine ubuntu_ansible
```

### Managed Node（構成管理をされる側)

```
$ docker run -it --name managed_node ubuntu_ansible
# service ssh start
# ifconfig eth0
=> IP アドレスを取得（例:173.17.0.3)
```

## 用意するファイル

control_machine の適当なディレクトリに以下の2つのファイルを用意。

```file:hosts
[managed_node]
172.17.0.3
```

```file:setup.yml
---
- name: Hello Ansible
  hosts: managed_node
  user: root

  tasks:
    - name: Hello server
      shell: date >> now.txt
```

## Ansible 実行

control_machine で

```
$ ls
hosts setup.yml
$ ansible-playbook ./setup.yml -v -vvvv -u root -i ./hosts
=> (実行結果が表示される）
```

## 結果確認

managed_node で

```
$ cat /root/now.txt
Thu Aug  4 23:43:41 UTC 2016
```

## 参考
[Ansible "Hello world"](https://atpras.blogspot.jp/2014/02/ansible-hello-world.html?showComment=1470354297400)

[Ansible Documentation](http://docs.ansible.com/ansible/)
Processing / ControlP5 / MSC-MOD20 > rs232cTerminal (v0.4, v0.5) > テキスト送信機能追加

```txt:動作環境
Processing 3.1.1 on Windows 8.1 pro(64bit)
ControlP5 v2.2.6
SDモジュール: MSC-MOD20 ( http://www.microtechnica-shop.jp/shopdetail/000000000026/ )
```

前version http://qiita.com/7of9/items/45a7174929255e85c692

## code v0.5

[v0.5 @ github](https://github.com/yasokada/processing_160805_rs232cTerminal/releases/tag/v0.5)

v0.5までの更新

- v0.4
  - text fieldを追加して、通信先に送信するようにした。`<LF>`終端
- v0.5
  - 送信テキストを表示するようにした

## 実行例

- ポート選択して接続
- TXSTRINGに入力してEnterで送信
  - Enterを再度押すと、同じコマンドを再送信
  - `<LF>`終端

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/abed962a-cbb2-7b4b-ef5e-6f7ec24deade.png)

とりあえず欲しい機能は用意できたかと思われる。
クロージャとスコープ


## クロージャ

一般的なクロージャのサンプル

```javascript
function closure(val) {
  let count = val;
  
  const innerFunc = function(){
    return ++count;
  }
  return innerFunc;
}

const myClosure = closure(100);
console.log(myClosure()); //101
console.log(myClosure()); //102
console.log(myClosure()); //103
```

・普通の関数は一度実行されると領域を解放するが
・ここではinnerFuncそのものがmyClosureに格納されている状態
・スコープチェーンが破棄されないので
・innerFuncのCallオブジェクトのローカル変数countは、myClosureが有効な限り破棄されない

### 使用例

カウンター
http://codepen.io/mo4_9/pen/OXNjgp
カウンターのDOMを100個生成してるが、カウンター1個のときとコードは1行も変わらない。

クロージャとカスタムイベントを使った応用編
http://codepen.io/mo4_9/pen/RREGwO

## スコープ

スコープチェーンの理解。マスキングしないと親関数に同名の変数を探しにいってしまう。

デモ：http://codepen.io/mo4_9/pen/yJObBw

```javascript
var btn = document.querySelectorAll('.btn');

for(var i = 0; i < 10; i++) {
  // パラメータにiを指定　この関数スコープにローカル変数iが定義される（マスキング）
  (function(i, text){ // 即時関数がないとiはすべて、親関数のiを参照し9になる
    btn[i].addEventListener('click', function(){
      alert(text + i);
    }, false);
  })(i, 'ローカル変数i= ');
}
```

とはいえ、ES6で書けばブロックスコープが有効なので
以下のようにシンプルに書ける。

```javascript
const btn = document.querySelectorAll('.btn');

for(let i = 0; i < 10; i++) {
    btn[i].addEventListener('click', () => {
      alert('ローカル変数i= ' + i);
    }, false);
}
```

> 参考
https://developer.mozilla.org/ja/docs/Web/JavaScript/Closures
Ansible 動作チェック用の Docker イメージ

Ansible の動作チェック用の Docker イメージを作った。そのコンテナには、公開鍵の設定をすることなくパスワードなしで root ユーザーとして ssh できる。

## 注意
これは、Ansible 動作チェック専用のイメージであって、実運用を念頭に置いていない。セキュリティ関係の処理が簡略化されていることに注意すること。

## 準備するファイル

```file:Dockerfile
FROM ubuntu:trusty
RUN export DEBIAN_FRONTEND=noninteractive \
  && apt-get update \
  && apt-get install -y python \
  && apt-get install -y software-properties-common \
  && apt-add-repository -y ppa:ansible/ansible \
  && apt-get update \
  && apt-get install -y ansible \
  && apt-get install -y openssh-server \
  && rm -rf /var/lib/apt/lists/*

# empty root password
RUN passwd -d root

# allow root to ssh without password
COPY sshd_config /etc/ssh/sshd_config
```

```file:sshd_config
PermitEmptyPasswords yes
PasswordAuthentication yes
UsePAM no
# need sftp server to run Ansible
Subsystem sftp /usr/lib/openssh/sftp-server
```

### イメージ作成

```
$ ls
Dockerfile sshd_config
$ docker build -t ubuntu_ansible .
```

### コンテナ実行

```
$ docker run -it ubuntu_ansible
# service ssh start
# ifconfig eth0
=> IP アドレスを取得（例:173.17.0.2)
```
Processing > ControlP5 > textfield > テキスト入力機能 / .setAutoClear(false)

```txt:動作環境
Processing 3.1.1 on Windows 8.1 pro(64bit)
Library: ControlP5 v2.2.6
```

### text field

テキストを入力する機能

http://www.sojamo.de/libraries/controlP5/examples/controllers/ControlP5textfield/ControlP5textfield.pde

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/5bd1b36a-f8e2-76ad-9680-9528fd66ec78.png)

### .setAutoClear(false)

3つのtext fieldのうち、一番上のものだけ入力後Enterを押すと入力テキストがクリアされる。
他の２つはEnter押下後もテキストは残る。

違いは `.setAutoClear(false)`を使っているかどうか。

一番上のテキスト

```
  cp5.addTextfield("input")
     .setPosition(20,100)
     .setSize(200,40)
     .setFont(font)
     .setFocus(true)
     .setColor(color(255,0,0))
     ;
```

上から2つ目のテキスト

```
  cp5.addTextfield("textValue")
     .setPosition(20,170)
     .setSize(200,40)
     .setFont(createFont("arial",20))
     .setAutoClear(false)
     ;
```
Processing / ControlP5 > textarea > テキスト表示機能 > スクロールバー付き

```txt:動作環境
Processing 3.1.1 on Windows 8.1 pro(64bit)
Library: ControlP5 v2.2.6
```

rs232cTerminalのテキスト入力部分を探していて、別の良いものを見つけた。

textareaというものがあるようだ。

http://www.sojamo.de/libraries/controlP5/examples/controllers/ControlP5textarea/ControlP5textarea.pde

これを使えば、横幅固定でスクロールバー付きのテキスト表示ができる。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/642c6645-6970-7df6-76e4-742b7aa12b34.png)
技術英語 > use a macro ... [only as a last resort]

@ Code Complete (No. 6491 / 36077)
> but careful programmers generally use a macro as an alternative to a routine <font color=red>only as a last resort</font>.

http://eow.alc.co.jp/search?q=resort&ref=sa
> `2. 〔困ったときの〕頼みの綱、頼りになるもの

only as a last resortとして「最後の頼みの綱としてのみ...」。

<hr>
resortで思い出したのは、2005年にスペイン Bodrumの学会に行った時に到着そうそうregistration feeを支払ったら思いのほか高くて、300円くらいしか手持ちにない状態になってしまった。
その時に学会の取りまとめの人にお願いして車で10分くらいする銀行のATMに行れていっていただいて、カードで現金をおろした。これがまさに<font color=red>「as a last resort」</font>だった。
カードが使えなかったら詰んでた。学会の人が親切な方でなかった場合も詰んでた。

<font color=red>As a last resort in the resort place</font>.
AppCode からでも uncrustify を使いたい


コーディングスタイルを統一するため、uncrustify を利用しています。

uncrustify の設定ファイルもリポジトリにコミットしているので、グループ内である程度コーディングスタイルが共有できます。

Xcode では [BBUncrustifyPlugin\-Xcode](https://github.com/benoitsan/BBUncrustifyPlugin-Xcode) というプラグインを利用しています[^1]。

[^1]: 「[コーディング規約を徹底するXcode \+ Uncrustifyでコード整形](http://qiita.com/makoto_kw/items/261e84683098a4429534)」で詳しく解説されています。

一方、AppCode には JetBrains 製 IDE にもれなく付いてくる強力なコードフォーマッタがあります。

<img src="https://qiita-image-store.s3.amazonaws.com/0/17936/e992f2f2-35cd-041b-8b7d-a6b88d1227e4.png" width="500" />

これを使ってもいいんですが、AppCode を利用しているのはグループ内で私一人だけなので、uncrustify をそのままメインで運用したい。

## uncrustify のインストール

まずは uncrustify を利用できるようにする必要があります[^2]。

[^2]: [BBUncrustifyPlugin\-Xcode](https://github.com/benoitsan/BBUncrustifyPlugin-Xcode) には uncrustify が内蔵されているので、必要ありませんでした。

Homebrew を使って uncrustify をインストールします。

```sh
$ brew install uncrustify
```

とりあえず、準備はこれだけ。

## External Tools の追加

Preferences → Tools → External Tools よりツールを追加します。

<img src="https://qiita-image-store.s3.amazonaws.com/0/17936/8526d35d-e275-14c4-8bfd-713dec95599f.png" width="500" />

ツールでは以下のように設定します。

<img src="https://qiita-image-store.s3.amazonaws.com/0/17936/46b0ddda-0ee8-f137-5cdc-2052baaa85d6.png" width="500" />

|設定|内容|
|----|----|
|Name|Uncrustify|
|Program|`uncrustify`|
|Parameters|`--replace --no-backup -c "$ProjectFileDir$/uncrustify.cfg" "$FilePath$"`|

Working directory 設定は空のまま。

Open console は最初はチェックしておいた方がよいでしょう。うまく動作しない場合などそこにエラーが表示されるので、設定の確認ができます。正しく動作するようになったらチェックを外して運用します。

プロジェクトのルートディレクトリに uncrustify の設定ファイル uncrustify.cfg がある前提です。ない場合は環境に合わせて uncrustify 設定ファイルのパスを記述します。

これで AppCode から uncrustify を利用できるようになります。アクセスは Tools メニュー→ External Tools → Uncrustify です。

<img src="https://qiita-image-store.s3.amazonaws.com/0/17936/d88254ec-ac9f-8bb0-2c10-439bf07309fd.png" width="400" />

実行すると現在フォーカスのあるファイル対して uncrustify を適用します。

## 運用上の注意

uncrustify の設定に `utf8_bom` という項目がありますが、これは必ず `remove` にしておいてください。

Objective-C のコードファイルに BOM あると Xcode / AppCode ともにコード解析が正しく動作しません。
XiaomiのデバイスのBootloader Unlockの申請をしてみた


Global版のMIUI8でも特に不便が無かったのですが、CM13が動き出したようなので..

## MIUI8？
![MIUI8](https://qiita-image-store.s3.amazonaws.com/0/89027/5c1f9838-c4e5-c5a6-98b2-9c7ccedaa0fb.png "スクリーンショット 2016-08-06 5.31.16.png")

MIUI8はXiaomiがやってるAndroid6.0用のカスタムUIのこと

## CM13？

CyanogenModとは、AOSP（Android Open Source Project）をベースとして作られているAndroidのカスタムROMでCM13はAndroid 6.0 Marshmallowベース

## 作業ログ

0. [XiaomiデバイスのUnlock申請のサイト](http://en.miui.com/unlock/)にアクセス  ![XiaomiデバイスのUnlock申請のサイト](https://qiita-image-store.s3.amazonaws.com/0/89027/40a73b7a-bd61-a30e-cace-926ba8a309e7.png "スクリーンショット 2016-08-06 4.43.13.png")

0. [Unlock Now]をクリック
0. 申請フォームを埋めて[Apply Now]をクリック  ![申請フォームを埋める](https://qiita-image-store.s3.amazonaws.com/0/89027/85433951-62f2-4a13-d34a-ceb85cb25d40.png "スクリーンショット 2016-08-06 4.48.30.png")
0. すぐにXiaomiから確認コードのSMSが届く  ![IMG_2719.jpg](https://qiita-image-store.s3.amazonaws.com/0/89027/ffd2d598-4dce-cce5-a601-17b66c6e5aa0.jpeg "IMG_2719.jpg")
0. 送られてきた確認コードを入力して、[Next]をクリック   ![送られてきた確認コード](https://qiita-image-store.s3.amazonaws.com/0/89027/1ce77ef9-50a5-37f0-7130-cb0055b37508.png "スクリーンショット 2016-08-06 4.51.27.png")
0. 10日程(多分)待つ  ![10日程(多分)待つ](https://qiita-image-store.s3.amazonaws.com/0/89027/c7d8f4b6-099c-5a2c-1df5-5dcef6a03621.png "スクリーンショット 2016-08-06 4.51.50.png")

状況が変わったら続きを書きます
Ethnaで$appの中身をConsoleにdumpする

最近プライベートでEthnaを利用しているので、常識かとも思いますが、備忘録代わりにメモを。
setAppでtemplateに渡した値の中身を簡単に確認する方法です。
アクションクラス内では特殊な処理は不要で、tplファイルのhead内に以下のコードを追加します。
ついでに、appNE、formの値も表示しておくと便利です。

```php
    <script type="text/javascript" language="javascript">
        console.dir({$app|@json_encode});
        console.dir({$app_ne|@json_encode});
        console.dir({$form|@json_encode});
    </script>
```

Chromeなら以下のように、開発ツールのConsole内でsetApp、setAppNEから送っている情報が整理されて表示されますね。
![console.png](https://qiita-image-store.s3.amazonaws.com/0/131072/28c38520-a443-e55b-a5f5-15b9fad77015.png)
AssemblyAttributeを取得したいっ！

# 背景
色々便利ツールを作る際にバージョンダイアログを実装したくなる
これは人間の性、といっても過言ではあるまい
そんな時にアテにすべき情報がAssemblyAttributeだ
※ これね↓

![image](https://qiita-image-store.s3.amazonaws.com/0/136132/2c436e69-eb36-5b03-4800-61244102b4d7.png)

# 方針
いや、簡単ですよ、例えば…

```csharp
Attribute.GetCustomAttribute(asm, typeof(AssemblyTitleAttribute))
```

って感じで、`AssemblyTitleAttribute`が取れるって訳

# 問題
と云う訳でもないけど、実際のところ上で取れるのは`Attribute`型のオブジェクト
ここから個別のアトリビュート値を取得しようと思うと、更に`cast`しないといけない

```csharp
((AssemblyTitleAttribute)Attribute.GetCustomAttribute(asm, typeof(AssemblyTitleAttribute))).Title
```

で、やっとタイトルの文字列に辿り着く
２回もクラス名を記述しないといけないのは長いしめんどくせー

# 対策
!!! ジェネリックなメソッド作ればいんじゃね？
って何かが下りてくる

```csharp
AsmAttr<AssemblyTitleAttribute>().Title
```

こんな感じ
おー、いいじゃん
これなら、インテリセンスも効くし

# 結論

```csharp
T AsmAttr<T>() {
	return AsmAttr<T>(Assembly.GetEntryAssembly());
}

T AsmAttr<T>(Assembly asm) {
	return (T)(object)Attribute.GetCustomAttribute(asm, typeof(T)); 
}
```

で落ち着いた
ここで一番のポイントは`(T)` **(object)** `Attribute.GetCustomAttribute(～)`
一旦`object`にダウンキャストしてからでないとT型にキャストできないところ
んー、きっちり把握できている訳じゃないんですが、２階キャストになってるからかなぁ…

でも残念なのは、そんなに出番が無い処
と、どんな型を渡せるのかを事前にわかっている必要がある処
ちゅー訳で付録として型を列挙して備忘録としてみる

# 附録
* AssemblyAlgorithmIdAttribute
* AssemblyCompanyAttribute
* AssemblyConfigurationAttribute
* AssemblyCopyrightAttribute
* AssemblyCultureAttribute
* AssemblyDefaultAliasAttribute
* AssemblyDelaySignAttribute
* AssemblyDescriptionAttribute
* AssemblyFileVersionAttribute
* AssemblyFlagsAttribute
* AssemblyInformationalVersionAttribute
* AssemblyKeyFileAttribute
* AssemblyKeyNameAttribute
* AssemblyMetadataAttribute
* AssemblyProductAttribute
* AssemblySignatureKeyAttribute
* AssemblyTitleAttribute
* AssemblyTrademarkAttribute
* AssemblyVersionAttribute
hubot-slack v4 で, どハマりした話

#hubot-slackでのchannelの指定方法が変わっていた

##エラー
```Unhandled rejection SlackRTMError: invalid channel id```

##今まで (v3)
"#general"のように、いつも通りのchannelの名前を指定するだけでよかった。
##v4
https://api.slack.com/methods/channels.list/test で取得できるchannelのidを指定するようになった。

## 教訓
バージョンアップには敏感になろう
ワンライナーでSSL証明書のCSRを生成する

# ワンライナー
## 秘密鍵とCSRファイルの一括生成
```
cd /etc/pki/tls/private ;
s=www.example.jp ;
head /dev/urandom > /dev/null ;
openssl req -subj "/C=JP/ST=Tokyo/L=Chuo-ku/O=Example K.K./OU=Example Section/CN=$s" -new -newkey rsa:2048 -rand /dev/urandom -nodes -keyout $s.key -out $s.csr ;
openssl req -subject < $s.csr
```
```text:出力例
Generating a 2048 bit RSA private key
.........................................................................................+++
.....................................................+++
writing new private key to 'www.example.jp.key'
-----
subject=/C=JP/ST=Tokyo/L=Chuo-ku/O=Example K.K./OU=Example Section/CN=www.example.jp
-----BEGIN CERTIFICATE REQUEST-----
MIICvjCCAaYCAQAweTELMAkGA1UEBhMCSlAxDjAMBgNVBAgMBVRva3lvMRAwDgYD
VQQHDAdDaHVvLWt1MRUwEwYDVQQKDAxFeGFtcGxlIEsuSy4xGDAWBgNVBAsMD0V4
YW1wbGUgU2VjdGlvbjEXMBUGA1UEAwwOd3d3LmV4YW1wbGUuanAwggEiMA0GCSqG
SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzic281xJRAZGBAhP85vGex7fN/UBA+icW
Y18DyGYBpAUAnL8+kgwRSMiyfz/BprsSuki2bw2ivmMKPslLM9LizPnxaEKujCel
UKbR4++GiFTWAuKupZJvFVFYBOGVAw9DhIF2qi/ihreLSGvHi0VFu+7dEsR4AMpW
axRRPZoF/wnkHzpNSCSUQ371WKFPfZIvFidXX9+nl9tBaG9kYkkF+6glCEWiT5z0
10RXGaoGOYu9CtVE1cClAHTL3Qgkb3XxTngQ1yrnpBpCRMkuHB/gRyuooDuERFWr
rUOhEXEGKOl/dgyDVHmPZj7Q+G94n3QJ0maSGObp1jPJc6In8Ff3AgMBAAGgADAN
BgkqhkiG9w0BAQsFAAOCAQEAJ8/AGbm9JNneOMK1S5/X1f0kqv3rNlL/ZjRBDhj4
DBDNaMXOYvPFDnHPC07DDBAG2PSrcm/Hh/GG4xLAzgpPeholeYx8kUlHa4x1ET1c
t/FHyN3U4tNV4PCP6hT9buv9RqOcVrYNLmmwAYq0A3ggBD8HHSNXdBLygMxPeO9c
PdxHzeUMnSnR6vNvnhTAx51nkcKgm8mUrs+VIhSB2oE7hmz+lpsOOxbdEeHyfmv+
5SmxYVprE3tIAt/MVt6nc9fhxI+v0o0v/h0H8z4APYNFPcSUmvF54v5ZhCYkKjiv
TLoHoLvRTUmI8WBZKGvZbyOQHMLIOLNTF8zxCv/2Z2x7DQ==
-----END CERTIFICATE REQUEST-----
```
ワンライナーと言いつつ見づらいので改行しておく。
`s=www.example.jp` と `/C=JP/ST=Tokyo/L=Chuo-ku/O=Example K.K./OU=Example Section` を条件に合わせて変更する。
`/etc/pki/tls/private/www.example.jp.key` と `/etc/pki/tls/private/www.example.jp.crt` が生成される。
`subject=` の行で内容を確認し、`-----BEGIN CERTIFICATE REQUEST-----` から `-----END CERTIFICATE REQUEST-----` までをコピーしてSSL証明書の申込画面に貼り付ける。

# 旧来のやり方
## 秘密鍵の生成
```bash
cd /etc/pki/tls/private
head /dev/urandom > /dev/null
openssl genrsa -passout pass:P@assw0rd -aes256 -rand /dev/urandom 2048 > www.example.jp.key
```
```text:出力例
2048 semi-random bytes loaded
Generating RSA private key, 2048 bit long modulus
...+++
.....................+++
e is 65537 (0x10001)
```
`openssl genrsa` は RSA 秘密鍵を生成するコマンド。出力ファイルは `-out ファイル名` でも指定できる。
`-aes256` は暗号化アルゴリズム。`-aes128` `-aes192` `-aes256` `-camellia128` `-camellia192` `-camellia256` `-des` `-des3` `-idea` などが指定できる。`-des3` の記述が多いが、強度の観点からは `-aes256` か `-camellia256` が望ましい。
`-rand` オプションでは `rand.dat` をいちいち作成する例が多いが、わざわざゴミファイルを作る必要はない。
暗号化アルゴリズムおよび `-rand` は未指定でも生成されるが、その場合のデフォルト条件は不明。

#### パスワードの解除
```bash
openssl rsa -in www.example.jp.key -out www.example.jp.key -passin pass:P@assw0rd
```
```text:出力例
writing RSA key
```
Apache が再起動した際にパスワードを求められて止まってしまうので、パスワードを解除しておく必要がある。パスワードありの場合、一応 `SSLPassPhraseDialog` ディレクティブで対応できる。

## CSR の生成
```bash
openssl req -new -subj "/C=JP/ST=Tokyo/L=Chuo-ku/O=Example K.K./OU=Example Section/CN=www.example.jp" -key www.example.jp.key > www.example.jp.csr
```
Gitのdevelopでの作業について

#概要
下記を参考にdevelopブランチでやることをまとめた。
masterとかreleaseとかの作業については記していません。
今回話すのは赤い下線の部分について
![git-model@2x.png](https://qiita-image-store.s3.amazonaws.com/0/76724/f54a938f-7d2f-b73a-920d-a99d62422617.png)

- [A successful Git branching model](http://nvie.com/posts/a-successful-git-branching-model "A successful Git branching model")
- [見えないチカラ: A successful Git branching model を翻訳しました](http://keijinsonyaban.blogspot.jp/2010/10/successful-git-branching-model.html "見えないチカラ: A successful Git branching model を翻訳しました")

#ブランチの説明
###featureブランチ
新機能の開発はfeature-hogehogeブランチで行う。feature-hogehogeブランチはリモートブランチにプッシュせず、developブランチにマージしてプッシュする。

###hotfixブランチ
masterで発生したバグの修正はhotfix-hogehogeブランチで行う。hotfix-hogehogeブランチはリモートブランチにプッシュせず、masterブランチにマージしてプッシュしたのちにdevelopブランチにもマージを行いdevelopブランチにプッシュする。


#手順
###新機能の場合
|コマンド|意味|
|:-- | :-- |
|git checkout develop|developブランチに移動|
|git pull origin develop|developブランチを更新|
|git checkout -b feature-[task_name]|developブランチから新しいブランチを生成してそのブランチにチェックアウト|
|[add → commit → add → commit →...]|ブランチ内で新機能開発|
|git checkout develop|developブランチに移動|
|git pull origin develop|developブランチを更新|
|git merge --no-ff feature-[task_name]|作った新機能をマージする。このときに必ずコミットメッセージを残す(--no-ff)|
|git push origin develop|developブランチにプッシュ|

###master側で起きたバグの修正の場合
|コマンド|意味|
|:-- | :-- |
|git checkout master|masterブランチに移動|
|git pull origin master|masterブランチを更新|
|git checkout -b hotfix-[bug_name]|masterブランチから新しいブランチを生成してそのブランチにチェックアウト|
|[add → commit → add → commit →...]|ブランチ内でバグの修正|
|git checkout master|masterブランチに移動|
|git merge --no-ff hotfix-[bug_name]|バグを修正したものをマージし、このときに必ずコミットメッセージを残す(--no-ff)|
|git push origin master|マスターにプッシュする|
|git checkout develop|同上|
|git merge --no-ff hotfix-[bug_name]|同上|
|git push origin develop|同上|

おそらくこれでうまくいくんでなかろうか。
Maven導入するまで

#これは何か
なぜMaven入れたのか忘れてしまう自分のためのメモです。

#きっかけ

[ND4J](http://deeplearning4j.org/ja-quickstart)で遊んでみたかったけれどもMavenが入ってなかったので導入しました。

導入したOSはMac 10.11.5です。

#やること
導入に必要なこと
##01. ダウンロード
[ここ](https://maven.apache.org/download.cgi)にアクセスして、ダウンロードできそうなやつをダウンロードする。
![setup_maven01.png](https://qiita-image-store.s3.amazonaws.com/0/76724/2e76081c-b558-b117-2d28-36bac0802f39.png)

##02. 展開して移動
展開したものをフォルダごと/usr/local/に移動する。

##03. パス通したり
~/.bashrc とかに下記のような感じで追記する。

```:例
export M2_HOME=/usr/local/apache-maven
export M2=$M2_HOME/bin
export PATH=$M2:$PATH
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home
export PATH=$JAVA_HOME/bin:$PATH
```

##04. 最終確認
下記のコマンドを実行する。
```
source ~/.bashrc
```
そしたら、導入が完了する。
```
mvn --version
```
バージョン情報がでてくるよ。

おしまい。
Swiftで楽にJSONを扱いたかった話(2)


[Swiftで楽にJSONを扱いたかった話(1)](http://qiita.com/nmisawa/items/ad42348d7f02762f43c2) の続き。

前回は、手動でインストールしようとして詰んだというところまでを書きました。
さて、その後どうしたか、よし[CocoaPods](https://cocoapods.org)導入するか！（そう、Objective-Cの時でも使ってなかったのです）と一発奮起してみた。

CocoaPods
https://cocoapods.org

を見ると、

`$ sudo gem install cocoapods`

なんだ簡単じゃないかと。
が、またしてもここで甘い罠が。

	ERROR:  Error installing cocoapods:
	activesupport requires Ruby version >= 2.2.2.
	
Rubyのバージョンを2.2.2以上にしろって。Macに入ってるバージョンを見ようと、

	ruby --version
	
と叩いてみると、

	ruby 2.0.0p648 (2015-12-16 revision 53162) [universal.x86_64-darwin15]

涙ですよ。
うーん、あまりシステム系のを入れたくない。（さくっと環境を作りたいのでbrew系のは避けてきた。新Macの時に面倒なんで。）

と言うわけで、CocoaPodsを体験する前に一旦停止。

うーん、なんだか単にJSONを使いたいだけなのに、大掛かりになってきた。
さてさて、このあとどうする？

1. 神が降りてきていろいろ教えてくれる
2. 他に道はないかとググる
3. とりあえず寝る

と言うわけで、今日は、3の寝ることにします。
続きはまた！
友達におすすめのJSある？って聞かれた


友達に自作アプリ用のHP作ろうと思うんだけど
「なんか最近見つけたおもしろいJavascriptある？」
って聞かれたんで書きます。

正直自分のセンス問われるし
ちょっと古いものとか載せたくないんだけど
まあ自分の中にあるものを吐き出そうと思う。
全部見て欲しいのであえて説明書きは雑にしようと思う。



# スクリプト系

[Particleground](http://jnicol.github.io/particleground/)
[particles.js](http://vincentgarreau.com/particles.js/)
[Geometryangle](http://geometryangle.tritoncode.com/#!demo)
この3つは昔結構好きで使ってたやつ。
結局使い道があんまりなくて今はお蔵入りだがお前なら使いこなせるだろう。


ちょっとクオリティ高めで使いづらいけど使いたい感じのやつ
[Raindrops.js](http://daniellaharel.com/raindrops/)
[Midnight.js](http://aerolab.github.io/midnight.js/)
[ScrollMe](http://scrollme.nckprsn.com/)
[JQUERY.PANELSNAP](http://guidobouman.github.io/jquery-panelsnap/)

これは正直新しいすぎてついていけないしいつ使うのかも分からない
[jQuery Scroll Path](http://joelb.me/scrollpath/)


実際この辺が重宝する
[jquery.adaptive-backgrounds.js](http://briangonzalez.github.io/jquery.adaptive-backgrounds.js/)
[Zoom.js](http://fat.github.io/zoom.js/)
[SMINT](http://www.outyear.co.uk/smint/demo/)

こういう細かいことが心をくすぐってる
[Flow Up](http://www.dominikgorecki.com/p/flow-up/demo.html)


# スライドショー
[jQuery Flipster](http://brokensquare.com/Code/jquery-flipster/demo/)
[lory](http://meandmax.github.io/lory/)
[slick](http://kenwheeler.github.io/slick/)
ありがちなスライドショーだが…使い方次第か

自作アニメーションは覚えておくとなんかあった時に使える
[TweenMax](http://un-tech.jp/tweenmax-started/)




#CSS系
テキストリンクのホバー時に使えるし、こういうことできる男に男が惚れる
http://www.nxworld.net/tips/15-text-link-hover-effect-and-design.html

hr要素のデザインに凝るだけであら不思議すっきり（覚える気がないからよく見てる）
http://coliss.com/articles/build-websites/operation/css/css-snippets-for-horizontal-rules.html

ちょっと多いけどこれは全部見たらレベルが上がるふしぎなアメ（なお努力値は使って付ける）
http://photoshopvip.net/84345

GoogleMapでここまで出来るって知ってた？
https://www.genius-web.co.jp/blog/cat-80/googleMap.html


いい感じのツールはこれで拾ったりしてる
[The Freelance Stack](https://www.hellobonsai.com/best-freelance-tools)



# 最後に
心が折れたらこれを見よう
http://corobuzz.com/archives/55333