OmniAICreator/Qiita-1.07M huggingface dataset:
AndroidでApache Commons Codecを使う時の注意点

Android で [Apache Commons Codec](https://commons.apache.org/proper/commons-codec/) を使うと、存在するはずのメソッドを使っているのに、コンパイルエラーや実行時エラーになることがある。

## 確認環境

Android Studio 2.1.3

```groovy:build.gradle
android {
    compileSdkVersion 23
    buildToolsVersion "23.0.3"
    useLibrary 'org.apache.http.legacy'
}
dependencies {
    compile 'commons-codec:commons-codec:1.10'
}
```


## コンパイルエラーの例

```java:コード
byte[] bin = "abc".getBytes();
String hex = Hex.encodeHexString(bin);
```

```sh:コンパイルエラー
エラー: シンボルを見つけられません
シンボル:   メソッド encodeHexString(byte[])
場所: クラス Hex
```
## 実行時エラーの例

```java:コード
byte[] bin = "abc".getBytes();
String hex = DigestUtils.sha256Hex(bin);
```

```sh:実行時の例外
java.lang.NoSuchMethodError: No static method encodeHexString([B)Ljava/lang/String; in class Lorg/apache/commons/codec/binary/Hex; or its super classes (declaration of 'org.apache.commons.codec.binary.Hex' appears in /system/framework/org.apache.http.legacy.boot.jar)
    at org.apache.commons.codec.digest.DigestUtils.sha256Hex(DigestUtils.java:500)
```

## 原因

Android が持つ（Android M では org.apache.http.legacy となった） Apache HTTP Client に古い Commons Codec が内包されており、 `build.gradle` で指定した新しいバージョンのほうが使われず、古いほうが使われるため。

* `Hex.encodeHexString` がコンパイルエラーになるのは、Android側のHexクラス自体にそのメソッドがないため
* `DigestUtils.sha256Hex` がコンパイルエラーにならないのは、Android側にはDigestUtilsクラス自体がなく、アプリ側の新しいバージョンに含まれるDigestUtilsが使われるため（？）
 * しかし、DigestUtils.sha256Hexの中で呼ばれているHexクラスはAndroid側のものが使われるから（？）、実行時に NoSuchMethodError となる

## Android が持つ Commons Codec ってどのくらい古いのか

ソースコードを見ると、1.3 て書いてある。
https://android.googlesource.com/platform/external/apache-http/+/android-7.0.0_r6/src/org/apache/commons/codec/overview.html#20

## 対処

Hexクラスの場合は、v1.3に存在するメソッドのほうを使う

```java
byte[] bin = "abc".getBytes();
//String hex = Hex.encodeHexString(bin); こっちはコンパイルエラーになる
char[] hexChars = Hex.encodeHex(bin);
String hex = new String(hexChars);
```

DigestUtilsなどv1.3に存在しないクラスの場合は、中の実装次第なので、表面上からは判別できない？
とりあえず DigestUtils.sha256Hex は、以下のようにすればok。


```java:
byte[] bin = "abc".getBytes();
//String hex = DigestUtils.sha256Hex(bin); こっちはランタイムエラーになる
byte[] sha256 = DigestUtils.sha256(bin);
char[] hexChars = Hex.encodeHex(sha256);
String hex = new String(hexChars);
```

## おまけ

Apache Commons Codec の公式サイトを見ても古ーーい 1.3 の Javadoc が見当たらなかったので、Androidのソースコードから生成してみた。

```
git clone https://android.googlesource.com/platform/external/apache-http
cd apache-http/
javadoc -locale en_US -public -d doc -sourcepath src -subpackages org.apache.commons.codec
```
https://komitake.github.io/android-apache-commons-codec/
ディレクトリを作るイディオム

書き込み先のディレクトリが存在しなければ、`file_put_contents`は`E_WARNING`を発生させます。そして、ディレクトリを作ってくれません。

``` e_warning.php
<?
error_reporting(E_ALL);
file_put_contents('sandbox/foo.php', '// うまく書き込めない。');
```

そこで、必要に応じてディレクトリを作成するようなスニペットを書きました。

```digg.php
<?
error_reporting(E_ALL);
$filename = 'sandbox/deep/deep/foo.php';
$paths = explode('/', $filename);
$basename = array_pop($paths);
if (count($paths) > 0) {
    $dir = implode('/', $paths);
    is_dir($dir) or mkdir($dir, 0777, true);
}
file_put_contents($filename, "// 無事ファイルに書き込みできる");
```

これで、`E_WARNING`を発生させずに、ディレクトリを作ることができます:star:
Amazon.comの500アイテムとAmazon.co.jpのアイテムの価格を一挙に比較するプログラム（パート３）

パート３です。

整形するためのプログラムです。HTMLを出力します。

でもって、パート１〜パート３までのプログラムをパイプでつなげると動作します。

```./ama.pl | ./comp_us_jp.pl | ./mkhtml.pl > output.html```
もしくは、
```./ama.pl | sort | uniq | ./comp_us_jp.pl | ./mkhtml.pl > output.html```
として実行して下さい。

パート３は、おしまいです。

```Perl:mkhtml.pl
#!/usr/bin/perl -w

$line = "";

print "<!DOCTYPE html>\n";
print "<html>\n";
print "<body>\n";
print "<table>\n";

	print "<tr>\n";
	print "<td>asin</td><td>jrank</td><td>jprice</td><td>rank</td><td>price</td><td>jurl</td><td>url</td><td>weight</td><td>diff</td><td>prime</td><td>sutable</td><td>totalnew</td>\n";
	print "</tr>\n";

while( $line = <STDIN> ){
	print "<tr>\n";
    	chomp( $line );
	@words = split /\t/, $line;

	for( $i = 0 ; $i < @words; $i ++)
	{
		if ( $words[$i] =~ /http:([^ \t\n\r\f\v]*)/ ) 
		{

			print '<td><a href="' . $words[$i] . '">OOO</a></td>';
			print "\n";
		}
		else
		{
			print "<td>" . $words[$i] . "</td>\n";
		}
	}

	print "</tr>\n";
}
print "</table>\n";
print "</body>\n";
print "</html>\n";
```
AndroidのIn-app Billingのテスト時に、「エラー　認証が必要です」が表示される場合

#現象
テスト用アカウントで、AndroidのIn-app Billingのテスト時に、
エラー
　認証が必要です。Googleアカウントにログインしてください。
というダイアログが表示される。

#対処法　アプリ、アイテムを(テスト用に)公開する。
Googleアカウントにログインしていない場合は、(Playストアなどを開いて)ログインする。　というのは、大丈夫として・・

1.アプリを(少なくとも、アルファ版に)公開する。
2.アプリ内アイテムを有効にする。

###補足
一致するskuが無い場合も、同じエラーが表示されるらしい。

#参考
[Stackoverflow - in-app billing android return authentication is required when try to subscribe to product]
http://stackoverflow.com/questions/27926455/in-app-billing-android-return-authentication-is-required-when-try-to-subscribe-t

お約束の。
不正確なエラー表示をなくそう。
Lightweight Linux workground with docker containers

```
#!/bin/bash -x

# run alpine linux in a temporary container, where we can play with any commands
# save as "docker-run-alpine.sh"
docker run -it --rm "$@" alpine:3.4 sh --login -i
```

Example of use:

```
# docker-run-alpine.sh --net=host                     (in host)
+ docker run -it --rm --net=host alpine:3.4 sh --login -i
#                                                     (in a temporary container)
```
nanoKONTROL2にアサインされてるknobの番号一覧チートシート(Unity MidiJack用)



## nanoKONTROL2とは

ちっさいMidiコントローラー。


[nanoシリーズ2 : nanoKONTROL2｜KORG INC.](http://www.korg.co.jp/Product/Controller/nano2/nanoKONTROL.html)



![貼り付けた画像_2016_09_16_18_54.jpg](https://qiita-image-store.s3.amazonaws.com/0/2631/b7a99ac5-fef8-8f00-c85f-e9b25f666e05.jpeg "貼り付けた画像_2016_09_16_18_54.jpg")

↑で、ここにアサインされてるknobの番号です。

```nano.cs
//左側のボタン
// Track < 58,   > 59
// cycle: 46    set: 60, < 61, > 62,
// << 43, >> 44, ■ 42, > 41, ● 45

// フェーダー、ツマミ側
// knob    (0-1)        : 16 17 18 19 20 21 22 23
// fader  (btm:0-top:1) : 0  1  2  3  4  5  6  7
// S      (off:0, on:1) : 32 33 34 35 36 37 38 39
// M      (off:0, on:1) : 48 49 50 51 52 53 54 55
// R      (off:0, on:1) : 64 65 66 67 68 69 70 71
```


## Unityで使うには

keijiro大先生のライブラリを使う
https://github.com/keijiro/MidiJack

``` sample.cs
  // nanoKONTROL2はknobの値だけがくる
  void OnEnable()
  {
    MidiMaster.knobDelegate += Knob;
  }
  
  void Knob(MidiChannel channel, int knobNumber, float knobValue)
  {
    Debug.Log("Knob: " + knobNumber + "," + knobValue);
  }
```



あるいは、nanoKontrol2用にカスタムされたスクリプトを使う

[MIDIコントローラーNanoKONTROL2をUnityアナログ入力デバイスとして利用する | Psychic VRラボの殴り書き](https://goo.gl/79fSoF)
phpcpdのインストール方法

PHPの重複しているソースコードを調べるために、phpcpdを使おうと思ったのですが、
いろいろなサイトに載っているpearを使った方法や、composerを使った方法ではインストールに失敗しました。

で、最終的に
[https://github.com/sebastianbergmann/phpcpd](https://github.com/sebastianbergmann/phpcpd)
に載っていた

`wget https://phar.phpunit.de/phpcpd.phar
chmod +x phpcpd.phar
mv phpcpd.phar /usr/local/bin/phpcpd`

を実行したらインストールできました。
Firefoxで、<table>の<col>に指定したbackground-colorが思わぬところにまで適用されてしまう

# 問題

## Firefox以外のブラウザー
![browser other than Firefox](https://qiita-image-store.s3.amazonaws.com/0/2316/45324fa1-ff0d-b82f-9da0-54187eb9ec3b.png)

## Firefox
![Firefox](https://qiita-image-store.s3.amazonaws.com/0/2316/9cd6269a-44b3-c320-8117-0d2bdf33d16e.png)

* `visibility: collapse;`で詰めて表示されているはずの`<th>`にまで、`<col>`の`background-color: #10c7ff;`が適用される
* `border-radius`で丸まった角の背景にまで、`<col>`の`background-color: red`が適用される

Firefox Nightlyでも同様。

## デモ
https://codepen.io/anon/pen/ZpObKr

# 対処
* `<tbody>`の`<th>`と`<td>`で`background-color`を指定する

## デモ
https://codepen.io/anon/pen/XjKmgy

# 感想
Firefoxなんでや…。
Bugzillaに報告されているか軽く見てみたけど、`<col>`と`background-color`に関するIssueは無いっぽい?
仕様的にどっちの挙動が正しいんだろ…。
Microsoft Word for Mac 2011で、コメントだけを表示させるAppleScript

Windows版のMicrosoft Word 2013の校閲機能には、デフォルトで「**シンプルな変更履歴/コメント**」（英語版ではSimple Markup）という表示モードがあり、「すべての変更履歴とコメント」を表示する代わりに、コメントと最小限の変更履歴を表示するようになっています。

Mac版2011を使っていると、あまりにも多数の挿入・削除・コメント・書式設定の変更が入り乱れて、画面の右側がびっしりと埋まってどうしようもない。手動で表示項目を設定すればよいのだが、Zoteroを使って文献を挿入するとそのたびに『最終版（変更箇所/コメント）』に切り替わり、結構面倒くさい。まったく同じという訳にはいかないが(Windows版「シンプルな変更履歴/コメント」では、書式や削除挿入の編集に対して、左側に赤線だけを表示して何かが変更されたということを示しているが、Mac版では同じことは出来ないのでコメントだけ残すことになる)
、書式設定、削除挿入の履歴を非表示にして、コメントだけ残すのが執筆・改訂作業には一番快適だが、どうすれば手間を最小限にできるか。

非常に小さな自動化ですが一発で画面がスッキリするのでなかなか気持ち良いです。

1. Word for Mac 2011のメニューのスクリプトアイコン<img width="45" alt="Screenshot.png" src="https://qiita-image-store.s3.amazonaws.com/0/109898/d558e17a-3635-f593-8b34-d01450b66694.png">
から「このメニューについて...」を選び、「フォルダーを開く」をクリック
2. `Word Script Menu Items`フォルダが開くので、下記のAppleScriptを ScriptEditorの新規ファイルに貼り付けてそのフォルダに保存する。名前は`Comment Only.scpt`などがよいでしょう。
3. Word文書を編集中に、上記のスクリプトアイコンから、先程保存した`Comment Only.scpt`を選び実行する
4. **書式設定の変更、挿入と削除に関して非表示、コメントは表示される**ようになり、画面がスッキリします。


```AppleScript

tell application "Microsoft Word"
	-- for Microsoft Word for Mac 2011
	-- instead of showing all changes tracked, shows you comments only
	-- mimicking Windows version's "Simple Markup" view
	
	--set revisions view of view of active window to "revisions view final"
	set show revisions and comments of view of active window to true
	
	set show insertions and deletions of view of active window to false
	set show comments of view of active window to true
	set show format changes of view of active window to false
	
end tell

```
PHP $_FILES['userfile']['error']のエラーコード

#$_FILES['userfile']['error']

###エラーメッセージ
**UPLOAD_ERR_OK**
値: 0; エラーはなく、ファイルアップロードは成功しています。

**UPLOAD_ERR_INI_SIZE**
値: 1; アップロードされたファイルは、php.ini の upload_max_filesize ディレクティブの値を超えています。

**UPLOAD_ERR_FORM_SIZE**
値: 2; アップロードされたファイルは、HTML フォームで指定された MAX_FILE_SIZE を超えています。

**UPLOAD_ERR_PARTIAL**
値: 3; アップロードされたファイルは一部のみしかアップロードされていません。

**UPLOAD_ERR_NO_FILE**
値: 4; ファイルはアップロードされませんでした。

**UPLOAD_ERR_NO_TMP_DIR**
値: 6; テンポラリフォルダがありません。PHP 5.0.3 で導入されました。

**UPLOAD_ERR_CANT_WRITE**
値: 7; ディスクへの書き込みに失敗しました。PHP 5.1.0 で導入されました。

**UPLOAD_ERR_EXTENSION**
値: 8; PHP の拡張モジュールがファイルのアップロードを中止しました。 どの拡張モジュールがファイルアップロードを中止させたのかを突き止めることはできません。 読み込まれている拡張モジュールの一覧を phpinfo() で取得すれば参考になるでしょう。 PHP 5.2.0 で導入されました。
Git コマンド　メモ

リモートにプッシュできずはまったのでメモ
(チェックアウトせずにプッシュしてHEADが更新されるだけになった)

Jenkinsのリポジトリ設定ってローカルブランチ作らないんだった
SourceTreeでチェックアウトして使ってるのを完全に忘れてた。
便利に慣れすぎてコマンドになるとなんもできない。

```
# チェックアウトする、-bがついているとそのブランチに切り替えてくれる。
git checkout -b ローカルブランチ名

# チェックアウトする、-Bがついていると
git checkout -B ローカルブランチ名
```

```
#未追跡のものだけを取得
git ls-files --other --exclude-standar
```

```

#変更されたものだけを取得
git ls-files --modified

```

```
# ファイルをステージングへ追加
git add パス名

```

```
# -mでコミットメッセージをつけてコミット
git commit -m コミットメッセージ
```

```
# リモートリポジトリの確認
git remote -v
```

```
# リモートの更新を取得して
git fetch
# 更新をマージする
git merge "origin/"ブランチ名
# リモートにプッシュする
git push origin ブランチ名
```


## ■Gitの設定

こちらを参照
http://qiita.com/misopeso/items/ede49b661cc7ad30528a

```
git config --global push.default simple
```
Macportでphp70をインストール

php7ね。
今更感もあるが、そろそろ慣れておかないと、って気もする。
自分phpは各バージョンをportで管理しているので、いつもどおりやってみた。

```bash
sudo port install php70 php70-apache2handler php70-gd php70-iconv php70-imagick php70-intl php70-mbstring php70-mcrypt php70-mysql php70-openssl php70-pear php70-postgresql php70-sqlite php70-xdebug 
```

ずらずらっと出力される途中に必要な設定が表示されるので順に実施。

```bash
sudo cp /opt/local/etc/php70/php.ini-development /opt/local/etc/php70/php.ini
```

```bash
    cd /opt/local/apache2/modules
    sudo /opt/local/apache2/bin/apxs -a -e -n php7 mod_php70.so
```

上記を実行すると以下のメッセージが出る。

```bash
[activating module `php7' in /opt/local/apache2/conf/httpd.conf]
```

アパッチからphpを使う時はhttpd.confでmod_php70.soと設定すればいいはずである。


mysqlについては以下のような指示が出るが、やってみたら動かなかった。
別に何も指定しなくてよいようである。

```bash
For mysql5, use /opt/local/var/run/mysql5/mysqld.sock
For mysql51, use /opt/local/var/run/mysql51/mysqld.sock
For mysql55, use /opt/local/var/run/mysql55/mysqld.sock
For mysql56, use /opt/local/var/run/mysql56/mysqld.sock
For mariadb, use /opt/local/var/run/mariadb/mysqld.sock
For percona, use /opt/local/var/run/percona/mysqld.sock
```

まあ、しかし、iじゃない方のmysqlが消えてるんだよね。。。
Apacheのmod_sedを使用して画像パスをCloudFrontのURLに自動で切り替える方法

# Apacheの設定 

下記、最短マッチに対応

```
<Directory /var/www/public>

  <IfModule sed_module>
      AddOutputFilter Sed html php
      OutputSed "s/\"\/\([^\"]*png\)\"/\"http\:\/\/test\.cloudfront\.net\/\1\"/g"
      OutputSed "s/\"\/\([^\"]*jpg\)\"/\"http\:\/\/test\.cloudfront\.net\/\1\"/g"
      OutputSed "s/\"\/\([^\"]*jpeg\)\"/\"http\:\/\/test\.cloudfront\.net\/\1\"/g"
      OutputSed "s/\"\/\([^\"]*gif\)\"/\"http\:\/\/test\.cloudfront\.net\/\1\"/g"
  </IfModule>
</Directory>
```
DD-WRTを使って、WHR-G301Nを無線LANコンバータ(ブリッジタイプ)にする


SSIDが[hoge]の無線LANルーター下にネットワークが構築されている時に、離れた場所の(有線ポートしかない)テレビやPCを加入させたい場合に使える。

ネットワーク内のNASやDLNAサーバーへのアクセスも可能。
(ルータータイプのコンバーターにすると、(基本設定では)WHR-G301N配下のネットワークとhoge配下のネットワークが違うセグメントになるので、アクセスするための設定がめんどくさい)

# 既存のネットワークの設定

| 項目 | 値 |
|:--|:--|
| SSID | hoge |
| ルーターのIPアドレス | 192.168.11.1 |
| ルーターのネットマスク | 255.255.255.0 |
| ルーターのDHCP払い出し開始アドレス | 192.168.11.50 |
| 認証 | WPA2 Personl AES |
| 共有キー | hogehoge |

# 追加するWHR-G301Nの設定

| 項目 | 値 |
|:--|:--|
| 割り振るIPアドレス | 192.168.11.2 |


# インストール

1. DD-WRTのr14896ビルドを http://download1.dd-wrt.com/dd-wrtv2/downloads/others/eko/BrainSlayer-V24-preSP2/2010/08-07-10-r14896/buffalo_whr_g300nv2/ からダウンロードする。
1. DD-WRTをインストールする

# DD-WRTの設定

## 基本

### 基本

#### Wireless Setup

 - インターネット接続方法 : 無効
 - Spannig Tree : 無効

#### ネットワーク設定

 LAN側接続

 - IPアドレス : 192.168.11.2
 - サブネットマスク : 255.255.255.0
 - ゲートウェイ : 192.168.11.1
 - LAN側DNS : 192.168.11.1

### 経路

#### 拡張ルーティング設定

  - 動作モード : ルーター
  
#### 動的経路を使用するインターフェース

 - インターフェース : LAN & WLAN
 

## 無線LAN

### 無線LAN 物理インターフェース設定 ath0

- 無線LAN MAC動作モード : Client Bridge
- ネットワーク名(SSID) : hoge
- Regulatory Domain : JAPAN
- 送信出力 : 10dBm

### 無線LANセキュリティー
 - 無線LAN認証 : WPA2 Personal
 - WPAアルゴリズム : AES
 - WPA共有キー : hogehoge
 

## セキュリティー

### Firewall

#### Firewall設定

 - SPI Firewall : 無効


## 管理
### 管理設定
 - Language : Japanese



# Appendix

- 先例 : http://d.hatena.ne.jp/izm_11/20120219/1329649438
- 失敗した時に純正ファームウェアに戻す方法 : http://tyawanmushi.hatenablog.com/entry/DD-WRT-TFTP-Buffalo-Firmware
- r14896を使う理由 : http://dd-wrt.com/wiki/index.php/WHR-G300N_V2#Important_Notes
weinreとngrokを使用したお手軽なAndroid標準ブラウザのデバッグ方法


Android4.4未満ではChromeに繋いでのデバッグができないため、weinreを使用してデバッグします。

前提

- MacOSX
- ngrokがインストールされている
- npmがインストールされている

注意点

- ngrokでweinreサーバを公開するので機密情報があるサイトをデバッグする場合は別の方法(端末を社内ネットワークに接続して直接weinreにアクセスするなど)を検討するべき

## 1. weinreサーバを起動

- 以下のコマンドでweinreサーバを8888ポートで起動します。

```
$ npm install weinre
$ ./node_modules/weinre/weinre --httpPort 8888
```

※ポート指定なしだと8080ポートで起動しますが、Macだと何かと競合するらしくアクセスできませんでした。

## 2. ngrokでweinreサーバを公開

```
$ ngrok http 8888
(ローカルで起動した8888ポートのサーバ(weinre)を*.ngrok.ioドメインで公開)
```

## 3. PCのブラウザでweinreを開き、ブックマークレットを取得

Chromeなどから `http://*.ngrok.io` にアクセスし、Target Bookmarkletのセクションにあるブックマークレット文字列(javascript:から始まる文字列)をコピーしてください。


## 4. Android端末の標準ブラウザにブックマークレットを追加

1. 3で取得したブックマークレットをQRコード経由などでAndroid端末のクリップボードに入れる
1. 標準ブラウザで任意のページをブックマーク追加
1. 追加したブックマークのURLをブックマーク文字列に変更(タイトルもweinreなどに変える)

## 5. デバッグ対象ページを開き、ブックマークレットを実行し、デバッグ

1. PCで `http://*.ngrok.io/client/#anonymous` を開く(Remoteタブ)
1. Android標準ブラウザでデバッグ対象ページを開き、4で登録したブックマークレットを実行
1. 正常に実行できればweinreのTargets欄にURLが追加される。
1. ElementsタブやResourcesタブなどでデバッグする(Chromeのデベロッパーツールと同じような感じ)
Firefox のイベントリスナで drop イベントを受け取るには dragover をpreventDefault する

Chrome, Safari は `el.addEventListener("drop", () => {})` だけで動くが、Firefox は動かなくてハマった。

```html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title></title>
  </head>
  <body>
    <div class="container" style="height: 200px; width: 200px; background-color: red;"></div>
    <script>
      const container = document.querySelector(".container");
      container.addEventListener("dragover", (ev) => {
        ev.preventDefault(); // これがないと drop が発火しない
      });
      container.addEventListener("dragenter", (ev) => {
        ev.preventDefault(); // 一部のブラウザではこれも必要、というのを見かけたが、どのブラウザか不明
      });
      container.addEventListener("drop", (ev) => {
        ev.preventDefault();
        console.log("drop");
      });
    </script>
  </body>
</html>
```

とのこと
angular-cliでwebpack設定にloaderを追加する

# angular-cliでwebpack設定にloaderを追加する
2017/01/23 stylusの設定例に1.0.0-beta.26を追加
2017/01/11 stylusの設定例を追加

## 対象者
自分でwebpack.config.jsとか作れない人
とりあえず動かせればいい人

## 設定方法
angular-cliで作ったプロジェクトにはwebpack.cofig.jsなどの設定ファイルがない。
しかしangular-cli本体のwebpackをいじることで設定を変えられる。
以下手順

1. グローバルではなくローカルのangular-cliを設定する
2. ```.\node_modules\angular-cli\models```フォルダ内の```webpack-build-common.js```（```ng serve, ng build```で呼ばれているwebpackの設定ファイル）に自分の入れたいloaderの設定を追加する

後は普通に```ng serve, ng build```で自分の追加したloaderが適用された状態で起動できるようになる

## stylusを使用する場合
生成されるファイルとwebpackの設定が間違っている。
stylus-loaderの拡張子が```.styl```に対して生成されるファイルの拡張子が```.stylus```のため、
loaderが正しくファイルを読み込めていない。
loaderの設定を```.stylus```に合わせるほうが既存のジェネレータも使えるのでオススメ。
以下修正内容

angular-cli@1.0.0-beta.26

```javascript:webpack-build-styles.js修正前
61:        { test: /\.styl$/, loaders: [("stylus-loader?" + JSON.stringify({
62:                    sourceMap: sourcemap,
63:                    paths: includePaths
64:                }))] }

```

```javascript:webpack-build-styles.js修正後
61:        { test: /\.stylus$/, loaders: [("stylus-loader?" + JSON.stringify({
62:                    sourceMap: sourcemap,
63:                    paths: includePaths
64:                }))] }
```


angular-cli@1.0.0-beta.24

```javascript:webpack-build-common.js修正前
53:    var baseRules = [
54:        { test: /\.css$/, loaders: [] },
55:        { test: /\.scss$|\.sass$/, loaders: ['sass-loader'] },
56:        { test: /\.less$/, loaders: ['less-loader'] },
57:        { test: /\.styl$/, loaders: ['stylus-loader'] }
58:    ];
・
・
・
94:        else if (extraEntry.lazy) {
95:            extraEntry.entry = extraEntry.input.replace(/\.(js|css|scss|sass|less|styl)$/i, '');
96:        }

```

```javascript:webpack-build-common.js修正後
53:    var baseRules = [
54:        { test: /\.css$/, loaders: [] },
55:        { test: /\.scss$|\.sass$/, loaders: ['sass-loader'] },
56:        { test: /\.less$/, loaders: ['less-loader'] },
57:        { test: /\.stylus$/, loaders: ['stylus-loader'] }
58:    ];
・
・
・
94:        else if (extraEntry.lazy) {
95:            extraEntry.entry = extraEntry.input.replace(/\.(js|css|scss|sass|less|stylus)$/i, '');
96:        }

```
sedでほしい文字列を抽出する方法



先日、ログファイルから、データを抽出するバッチを作りました。
いろいろ試し、助けてもらって、ようやくできました。メモしなきゃ！

##やりたいこと
ログファイルから、2016-xx-xxの日付の部分と最後のinsert numberの数字を抽出して、
ファイルに格納します。　

～イメージ～
元のログファイル

```text:log.txt
/home/Logs/log.20160101:2016-01-01 07:32:25 INFO:  insert number [101]
/home/Logs/log.20160102:2016-01-02 07:32:18 INFO:  insert number [202]
/home/Logs/log.20160103:2016-01-03 07:32:20 INFO:  insert number [303]
/home/Logs/log.20160104:2016-01-04 07:32:28 INFO:  insert number [404]
/home/Logs/log.20160105:2016-01-05 07:32:16 INFO:  insert number [505]
```

結果ファイル

```text:result.txt
2016-01-01 101
2016-01-02 202
2016-01-03 303
2016-01-04 404
2016-01-05 505
```

##実行方法

実行スクリプト

```
cat log.txt | sed -e 's/.*\([0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}\).*insert number \[\([0-9]\+\)\]/\1 \2/g' > result.txt
```

参考：[文字列から特定の文字を抽出する](http://program.station.ez-net.jp/special/handbook/sh/variables/sed.asp)


###※ sed 部分の説明
括弧()でデータの範囲は特定できる。
指定の1番と2番目の内容　\1 \2　に置き換える。　(\は、下の画像では円マークで表示)

![detail.PNG](https://qiita-image-store.s3.amazonaws.com/0/26351/daf8dc7b-9949-3f64-f138-01e7fe334e44.png)
Adobe XD - 打ち合わせでデキると思わせてみる

モックアップやワイヤーフレームが爆速で作れるや、
リピートグリッド便利だよねーとか、
様々なメリットがあるAdobe XDですが、
個人的にイチオシの機能は

「打ち合わせでAdobe XDによるライブモックアップ制作するとデキる人間だと思わせられる」

という超ステキ機能。自分がすごいんじゃないところとか超ステキ。
なので打ち合わせでスポットライトあびるための下準備編です。


#リピートグリッド

![repeat01-1.gif](https://qiita-image-store.s3.amazonaws.com/0/138215/b50d7dcf-0425-5a09-eb40-23b0cc46620a.gif)


泣く子も黙るエンターテインメント機能。実際に泣く子が黙るのは恐怖を感じた時だとか。
なまはげ来ても泣いてるってことは、本当は優しいんだねなまはげ。イケメンすぎぃ！
リピートグリッドの説明は語り尽くされていると思うので割愛しますが、
リピートグリッドで作ったものを更にリピートグリッドするという荒業も、
なかなかのデキるポイントになるのでオススメ。
後で編集するときに、わけわからなくなる可能性も高い諸刃の業。


#写真素材

![repeat02.gif](https://qiita-image-store.s3.amazonaws.com/0/138215/0515230c-db3e-2515-7650-c98579cec767.gif)


リピートグリッドで場を賑わした後で、
さらにオーディエンスたちのハートを掴むであろう複数画像の設置機能。
これが意外に準備してないと素材確保にもたついたり、
素材が無かったりとせっかくのXDチャンス（？）を逃すケースがあります。
個人的にオススメは、
facebookのプロフィール画像っぽいものをストックしておくと
かなりの場面で役に立つ印象。特にかわいい子とイケメン。あとなまはげ。
バナー画像なんかもストックしておくと多い日も安心。


#テキスト素材

![repeat03.gif](https://qiita-image-store.s3.amazonaws.com/0/138215/eded83b3-564f-253a-5c90-3dfbab59ca0a.gif)


これもリピートグリッド後で出番になるのですが、
人名リストやニュースっぽいものなんかを用意しておくと、
ベタですがあると便利さん。
あとついつい日付を、全部同じ日付のものにしちゃいがちですが、
これも日付テキストファイル用意しておくと、
同一日付だったものがぱぱっと変更できてXDチャンス。
モックだから同じで良いじゃんなんですが、
大事なのは細かい芸を入れてデキる人間と思わす努力。
このサイトでcsv書き出しするとさくっと用意できるかもしれません。
http://kazina.com/dummy/


#まとめ
結局リピートグリッドの話しかしてないですが、
やはり超強力な機能なので、
ちょっとした下準備でさらに打ち合わせを盛り上げることができます。
機能に便乗してデキる人間と思わせてやりましょうやりましょう。
RailsでDBの内容をCSVファイルにしてダウンロードする

# 目的
タイトル通り、データベースの内容をCSVファイルにしてダウンロードすることです。
ただ、折角なのでテーブルのカラムを変数名のままにするのではなく、わかり易い名前にしてCSVファイルを作成します。

# 参考サイト
[Rails で CSV ファイルを View を使って生成する](http://qiita.com/yutackall/items/24a4487f629a9106a971)
[railsでcsv出力する時はviewで整形したほうがわかりやすくない？](http://qiita.com/ichi_s/items/eddf29d62ac09f6f9133)

# 例
猫を飼っている人に対するアンケートという設定で、そのままCSVファイルをダウンロードすると

```
'cat_type','cat_name','cat_age','name','address','phone_no','email'
'アメリカンショートヘア','あめば','5','織田 信長','岐阜県岐阜市','09012345678','oda@exam.com'
・
・
・

```

と出力されるのを

```
'猫種','猫の名前','猫の年齢','氏名','住所','電話番号','メールアドレス'
'アメリカンショートヘア','あめば','5','織田 信長','岐阜県岐阜市','09012345678','oda@exam.com'
・
・
・

```

にします。
※例なので変換しなくても分かりやすいですが、他の人には分かりにくい変数などの場合は有効だと思います。

# ソース
ルート

```ruby:routes.rb
  get 'form/aibyoka_csv' => 'form#aibyoka_csv'
```

コントローラー

```ruby:form_controller.rb
class FormController < ApplicationController
  def aibyoka_csv
      @form = Aibyoka.all

    respond_to do |format|
      format.html do
        @form = params[:aibyoka]
      end
      format.csv do
# ダウンロードする時のファイル作成と設定（ここでは’aibyoka-ダウンロードする日付.csv’というファイル名になる）
        send_data render_to_string, filename: "aibyoka-#{Time.now.to_date.to_s}.csv", type: :csv
      end
    end
  end

  private
　  def aibyoka_params
      params.require(:aibyoka).permit(:cat_type, :cat_name, :cat_age, :name, :address, :phone_no, :email)
    end
end
```

ビュー（ここでCSVファイルの見た目を変える）
電話番号はそのままだとExcelでCSVを開いた時に数値として認識されてしまい、正常に表示されないので最初と最後に「'」を入れました。
※入力する時とかに何とかすれば、こんなことはしなくてもいいと思います。

```ruby:aibyoka_csv.csv.ruby
require 'csv'
require 'nkf'

csv_str = CSV.generate do |csv|
  cols = {
    '猫種'     => ->(u){ u.cat_type },
    '猫の名前'     => ->(u){ u.cat_name},
    '猫の年齢'     => ->(u){ u.cat_age},
    '氏名'   => ->(u){ u.name},
    '住所'  => ->(u){ u.address },
    '電話番号'  => ->(u){ u.phone_no.to_s.insert(0, "'").insert(-1, "'") },
    'メールアドレス'  => ->(u){ u.email },
    '登録日時' => ->(u){ u.created_at.strftime('%Y年%m月%d日%H時%M分%S秒') }
  }

  # header
  csv << cols.keys

  # body
  @form.each do |user|
    csv << cols.map{|k, col| col.call(user) }
  end
end

NKF::nkf('--sjis -Lw', csv_str)
```

ダウンロードするページでは

```ruby
<%= link_to 'CSVダウンロード', :controller => 'form', :action => 'aibyoka_csv', :format => 'csv' %>
```

や

```ruby
<%= link_to 'CSVダウンロード', form_aibyoka_csv_path(format: :csv) %>
```

を設置するとリンクをクリックすることでダウンロードできます。
WindowsでOSRMを起動する方法

# OSRMとは
![OSRM-Logo.png](https://qiita-image-store.s3.amazonaws.com/0/138471/de90fe62-77ea-0cc4-7e34-6c3c66c8a31f.png)

- オープンソースソフトウェアの経路探索システムである。
    - 条件を設定したりすることで様々な経路探索が可能。
- OSMの地図データを利用したシステムである。
    - http://project-osrm.org/
 
# OSM(OpenStreetMap)とは
- 誰でも編集でき、なおかつ利用することができる地図である。
    - 日本だけでなく世界規模でできる。
- 誰でも編集し利用できるといってもちゃんと著作権は存在している。
    - 通常の地図は著作権の関係上勝手に編集することはできないがOSMでは編集し、利用することができる。
- 道路や建物の情報を追加できるのはもちろんだが3Dの情報として建物などの高さの情報も追加することができる。
    - https://www.openstreetmap.org/




# 事前準備

### システムソースのダウンロード

- Releaseファイル
http://build.project-osrm.org/ から"Release build"をクリックして、osrm_Release.zipダウンロード

- Frontendファイル
https://github.com/Project-OSRM/osrm-frontend から、緑色の"Clone or download"をクリックし"Download ZIP"をクリックしてZIPファイル（osrm-frontend-gh-pages.zip）をダウンロード
- 上記の二つのファイルはデスクトップ上にダウンロードして解凍する。

### 対象データのダウンロード

（今回は八王子駅周辺で進めていく。）

0. Bbbike(http://extract.bbbike.org/) から八王子周辺のPBFファイルをダウンロードする。

    0.  Name of area to extractの右のor searchをクリック
    -  八王子と入力しsearchし八王子をクリック
    -   八王子駅周辺へ移動するので、hereをクリック
    -   オレンジの枠をクリックすると大きさを変更できる
![bbbike.png](https://qiita-image-store.s3.amazonaws.com/0/133780/9b334f76-db70-1f4c-5330-a4012f14d8fc.png)
    - Your email addressにPBFデータを受け取りたいメールアドレスを入力(メールが送られてくるのに少し時間が掛かる)
    -  分かりやすいようにPDFデータの名前を変更　ここではhachioji.osm.pbfとする
    -   hachioji.osm.pbfをosrm_Releaseファイルに入れる


# 構築・実行手順

0. Cドライブ直下にtempフォルダが無い場合にはあらかじめ作成する

0. 自分のPC上で表示させるために、Frontendファイル内にあるbundle.jsを編集する。
”https://router.project-osrm.org” を ”http://localhost:5000” に書き換える。　これは２箇所ある。

-   コマンドプロンプトを起動する(Windowsアイコンを右クリックしし「コマンドプロンプト（C）」)
-   コマンドプロンプトの操作
    0.    ```cd デスクトップ\osrm_Release```　でエンターを押す
    -     ```.\osrm-extract.exe -p foot.lua hachioji.osm.pbf```
（foot.lua　の部分は自分がやりたいプロファイルを選択
    - ```.\osrm-contract.exe hachioji.osrm```
    - ```.\osrm-routed.exe hachioji.osrm```
の順番で入力する
2.	Frontendファイル内にあるindex.htmlを開く
![bbbike3.png](https://qiita-image-store.s3.amazonaws.com/0/133780/3476bbb8-fa03-26a9-5bde-d05a1b973c06.png)





#トラブル対処の方法
- PCの容量が足りない場合は動作が停止するため、Releaseファイル内にある.stxxlの数字の部分を少なくする。
    - 初期の状態では10000MiB（10GB）で設定されている
    - 1000MiB(1GB）に設定することが望ましい

- VCRUNTIME140.dllがないというエラーが表示された場合は下記URLから、Visual Studio 2015 の Visual C++　ランタイムをインストール。
 https://www.microsoft.com/ja-JP/download/details.aspx?id=48145
オブジェクト、配列のコピー

#オブジェクトや配列の複製#

オブジェクトや配列を複製しようとすると参照渡しなので元から変わってしまう。

```javascript:javascript
var originalObj = { a: 1 };
var copyObj = originalObj;
copyObj.a = 100;
console.log(originalObj.a); //100
console.log(copyObj.a); //100
```

##オブジェクトのコピー##

従来

```javascript:javascript
var originalObj = { a: 1 };
var copyObj = {};
for (var key in originalObj) {
  copyObj[key] = originalObj[key];
}
copyObj.a = 100;
console.log(originalObj.a); //1
console.log(copyObj.a); //100
```

**ES6**

```javascript:es6
let originalObj = { a: 1 };
let copyObj = {};
Object.assign(copyObj , originalObj);
copyObj.a = 100;
console.log(originalObj.a); //1
console.log(copyObj.a); //100
```

##配列のコピー##

従来

```javascript:javascript
var originalArr = [1, 2, 3];
var copyArr = [];
for (var i = 0, len = originalArr.length; i < len; i++) {
  copyArr.push(originalArr[i]);
}
copyArr[0] = 100;
console.log(originalArr); //[1, 2, 3]
console.log(copyArr); //[100, 2, 3]
```

**ES6**

```javascript:es6
let originalArr = [1, 2, 3];
let copyArr = [];
Object.assign(copyArr , originalArr);
copyArr[0] = 100;
console.log(originalArr); //[1, 2, 3]
console.log(copyArr); //[100, 2, 3]
```

##注意##

1階層のオブジェクトや配列の複製は簡単になったけど2階層目にオブジェクトや配列がある場合参照になってしまう…

```javascript:es6
let originalObj = {
    a: 1,
    b: [1, 2]
};
let copyObj = {};
Object.assign(copyObj , originalObj);
copyObj.a = 100;
copyObj.b[0] = 100;
console.log(originalObj.a, originalObj.b); //1, [100, 2] 変わる
console.log(copyObj.a, copyObj.b); //100, [100, 2]
```
CakePHP2でモデルをモックするとBehaviorが外れるのでその対処

#<i class="fa fa-comment-o" style="font-size:1em;"></i> よく忘れるので自分の備忘録として残します


```php
// Mock生成
$mockModel = $this->getMockForModel('Hoge', ['save']);

// 保存に失敗するように振る舞いを定義
$mockModel->expects($this->once())->method('save')->will($this->returnValue(false));

// Behaviorsに必要なものをアタッチ(これ忘れる orz)
$mockModel->Behaviors->attach('Containable');

// テスト実行
・・・
```
GKE Kubernetes NameSpace

Kubernetesではnamespaceによる仮想クラスタをサポートしている。namespaceによりリソースの分割などもできる。
※バージョンの違いとかの管理はNameSpaceではなくLabelを使うべき。

- namespaceを確認する。

```
$ kubectl get namespaces
NAME          STATUS    AGE
default       Active    17d
kube-system   Active    17d
```
初期状態では以下の２つのnamespaceが存在している。

```
* default: ネームスペースを持ってないオブジェクト用
* kube-system: K8sシステムによって生成されるオブジェクのためのネームスペース
```

テスト用のネームスペースを作成する

```
$ kubectl create namespace test-namespace
namespace "test-namespace" created

$ kubectl get namespace
NAME             STATUS    AGE
default          Active    17d
kube-system      Active    17d
test-namespace   Active    27s
```

- 一時的にnamespaceをセットしたいときは--namespaceフラグを使用する。

```
$ kubectl get pods
NAME                                     READY     STATUS    RESTARTS   AGE
gcp-cost-3407718879-zrso2                1/1       Running   0          2h
task-processing-time-1436137422-8fwba    1/1       Running   0          1h

$ kubectl --namespace=kube-system get pods
NAME                                                                   READY     STATUS    RESTARTS   AGE
fluentd-cloud-logging-gke-XXX-default-pool-d3a01536-hgn8   1/1       Running   0          17d
fluentd-cloud-logging-gke-XXX-default-pool-d3a01536-vntu   1/1       Running   0          17d
fluentd-cloud-logging-gke-XXX-pool-d3a01536-w0iz   1/1       Running   0          17d
heapster-v1.1.0-2096339923-d5zku                                       2/2       Running   0          17d
kube-dns-v17.1-5acju                                                   3/3       Running   0          17d
kube-dns-v17.1-iwky5                                                   3/3       Running   0          17d
kube-proxy-gke-XXX-default-pool-d3a01536-hgn8              1/1       Running   0          17d
kube-proxy-gke-XXX-default-pool-d3a01536-vntu              1/1       Running   0          17d
kube-proxy-gke-XXX-default-pool-d3a01536-w0iz              1/1       Running   0          17d
kubernetes-dashboard-v1.1.1-i9qbw                                      1/1       Running   0          17d
l7-default-backend-v1.0-nm5cx                                          1/1       Running   0          17d
```

- 永続的にnamespaceの設定する
現在のコンテキストを取得する。

```
$ export CONTEXT=$(kubectl config view | awk '/current-context/ {print $2}')
```

```
$ kubectl config set-context $CONTEXT --namespace=kube-system
context "gke_XXX_us-central1-a_XXX" set.

$ kubectl get pods
※先程と同じ。省略

$ kubectl config view | grep namespace
    namespace: kube-system
```
Twitter で おしゃれな文字を使う方法

#twitterでおしゃれな文字を使おう！

## 結論
答えは`'\342\200\215'`に隠されていた！  

## 発端
twitter でおしゃれな文字(小さいやつ)を見かけたので、
実際にやってみた。(ただし、ブラウザでは見えない。)

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">ほう。行末までかな？<br>‍行頭<br>行末‍<br>改行<br>‍<br>なし。</p>&mdash; はまのや⊿ (@gorogoroyasu) <a href="https://twitter.com/gorogoroyasu/status/776675602614988800">2016年9月16日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

スクショはこんな感じ！

<img width="320" alt="image" src="https://qiita-image-store.s3.amazonaws.com/0/115634/066fe1db-d6f1-d6c9-a25f-5f6e106bfab2.png">

`行頭` がおしゃれな小さい文字になってる！！！

ということで、使い方をば！
行頭に特殊文字をつけるだけ！
かんたんー

特殊文字は、iPhone の Twitter 公式アプリだと、
<img width="320" alt="image" src="https://qiita-image-store.s3.amazonaws.com/0/115634/9728efad-1336-78b6-4624-7a609b2431a9.png">
と表示される。

それをコピペしてきて下さい。
そして、行頭にこの特殊文字を貼って下さい。
そうすると、あなたのtweet がおしゃれ文字で装飾されます！

## 文字コードをば
iPhone のメモ帳だと、
![スクリーンショット 2016-09-16 16.33.27.png](https://qiita-image-store.s3.amazonaws.com/0/115634/35240d13-9d42-0835-e3aa-634e2cafef20.png)
みたいな感じで特殊文字が表示される！
?を□で囲ったやつ！

そして、?を□で囲ったやつが表示されるのは、
mac の メモ帳でも同じ！
なので、iCloud を使ってメモを同期した。

ただ、コピーした特殊文字をブラウザに貼っても何の文字も表示されない。

なので、どうなってるのかな？と思って文字コードを調べてみた。
方法は。。。

mac の terminal に コピペ -> Enter !!

そうすると、`-bash: $'\342\200\215'`と表示された。
ということで、`'\342\200\215'`が文字コードだと分かった(はず)。


面白いですね！

## 参考
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13156507773
unicornのリンクまとめとメモ

※ 誤解をおそれずに大胆に書いてます。参考にする際はご注意を。

# unicornとは?
  - web-rack serverのこと
  - master-slave構成になっていて、空いたslaveからのpullでアクセスを処理するので、 処理中プロセスにアクセスが行くことがなくなる

#### 参考
http://fujiike.hateblo.jp/entry/2015/08/20/170751
http://techracho.bpsinc.jp/piichan1031/2010_07_09/2075
     
# rackとは?
  - routes処理をrubyアプリがうごくようによしなにやってくれるやつ
  - rubyアプリはrackがないとうごかないってことかな

# web rack サーバーとは?
  - rackの機能を持ち合わせたwebサーバー
  - unicornはこれにあたる
  - web rack サーバー + rubyアプリでも動くけど、webサーバーはnginxのほうがいいので、nginx + unicorn + railsみたいな構成になりがち

# リリース時に再起動は必要?
  - 再起動というか、新しいプロセスを起動し直す必要はある
  - unicornの機能でダウンタイムなしでのrubyアプリの更新は可能

# 再起動時に古いプロセス残ったりするのなんで?
  - unicornにのプロセスにUSR2のコマンド送ると新しいコードで新しいマスタを作る
  - 古いマスタはそのまま残るのでプロセスが増えてしまう
    - 正しくは古いマスタを消さなければいけない
  - unicornの設定ファイルで古いプロセスを消すような設定いれるべき

#### 参考
http://kray.jp/blog/troubleshooting-rails-unicorn/

# preload_appとは?
  - trueだと、新しいmasterがworkerを生む前に新しいコードがロードされて、rubyアプリの初期化が実行される
  - つまり、unicorn_configのbefore_forkが実行されるときには準備完了している
 
#### 参考
http://qiita.com/syou007/items/555062cc96dd0b08a610

# unicornプロセスへのコマンドの対応表
  - USR2: 新しいmasterを生成
  - INT(TERM): 即座にプロセスkill
  - QUIT: graceful shutdown

#### 参考
http://qiita.com/Salinger/items/5350b23f8b4e0dcdbe23
使用しているライブラリのSwift2.3, 3対応状況メモ

既存プロジェクトの移行のために、ざっと対応状況を調べたのでメモ
2016/11/11現在

##ライブラリ一覧
||Swift 2.3対応|Swift 3対応|参照|対応|
|:--|---|---|---|---|
| [Alamofire]() |3.5.0|4.0.0||対応済み|
| [BWWalkthrough](https://github.com/ariok/BWWalkthrough)| - | 1.2.0 |[error swift 3 #63](https://github.com/ariok/BWWalkthrough/issues/63)|swift3対応済み|
| [Bond](https://github.com/ReactiveKit/Bond)| v5系に注力しているため、forkしてコンバートしろ | 5.0以降 |[Swift 2.3 and 3.0 updates #269](https://github.com/SwiftBond/Bond/issues/269)|swift3対応済み|
| [CircleProgressView](https://github.com/CardinalNow/iOS-CircleProgressView)| 1.0.11 |  1.0.12 ||対応済み|
| KeychainAccess| 2.4.0 | 3.0.0 ||対応済み|
| Kingfisher |2.6.0|3.0.1||対応済み|
| [MarqueeLabel/Swift](https://github.com/cbpowell/MarqueeLabel)| 2.8.0 |  3.0.0 ||対応済み|
| [NVActivityIndicatorView](https://github.com/ninjaprox/NVActivityIndicatorView)| 不明 | 3.0 ||ｓwift3対応済み|
| ObjectMapper| 1.4.0以降 | 2.0.0 ||対応済み|
| [PagingMenuController](https://github.com/kitasuke/PagingMenuController)| 1.2.0| 1.3.0以降 | |対応済み|
| [Permission](https://github.com/delba/Permission)| ｓwift-2.3ブランチ | v2.0 | |ｓwift3対応済み|
| [Realm](https://github.com/realm/realm-cocoa)| masterブランチから取得するようにしてSWIFT_VERSIONを2.3にする | 同様にSWIFT_VERSIONを3.0にする ||対応済み|
| [SemanticVersioning](https://github.com/AlexanderNey/SemanticVersioning)| 不明 | 不明 |
| [SnapKit](https://github.com/SnapKit/SnapKit)| 0.22.0 | 3.0.0 ||対応済み|
| [SwiftTask](https://github.com/ReactKit/SwiftTask)| 動きなし | swift3ブランチがる |
| [UIScrollView-InfiniteScroll](https://github.com/pronebird/UIScrollView-InfiniteScroll)| 不明 | 不明 |
| [XCGLogger](https://github.com/DaveWoodCom/XCGLogger)| 不明 | 4.0.0||swif3対応済み|


##履歴
###2016/11/11
- Permissionがv2.0でswift3対応
- Bondのv5系のベータがとれたバージョンがリリースされswift3対応

###2016/10/13
- MarqueeLabelがv3.0.0でswift3対応

###2016/10/5
- BWWalkthroughのv1.2.0でSwift3対応
- CircleProgressViewのv1.0.12でSwift3対応
- XCGLoggerのv4.0.0がリリースされSwift3対応

###2016/9/23
- NVActivityIndicatorViewの状況を更新(Swift3.0対応したようです)

###2016/9/22
- BWWalkthroughの状況を更新

###2016/9/21
- PageMenuControllerの状況を更新(2.3, 3両対応した模様)
ES2015 で `hubot-test-helper` を使ったテストを書くとエラーが起きる件について


# 前置き

ES2015 大好きな @monry です。
hubot のテストも ES2015 で書きたいお年頃なので、普通に書いてたら `Cannot find module 'hubot'` と言われてテストを開始できない事案が発生。
どうにか解決出来たので、その知見を備忘録として書き殴る。

# 結論

`gulpfile.js` にて `require('coffee-script/register');` を書きましょう。

(細かいコト言うと、ボクは `gulpfile.js` すら ES2015 で書いてるので、弄ったファイルは `gulpfile.babel.js` なのだが。)

# 経緯

* [`hubot-test-helper` のリポジトリ](https://github.com/mtsmfm/hubot-test-helper) 上に [Closed な Issue](https://github.com/mtsmfm/hubot-test-helper/issues/33) が上がっているのを発見。
* すげーザックリ要約すると「`hubot` は内部的に CoffeeScript なモジュールしかないから、別途コンパイルする必要があるよ！」みたいな感じらしい。
* 最初は `gulp.src(test_scripts_path).pipe(babel()).pipe(mocha({reporter: 'spec', require: 'coffee-script/register'}))` とかやってみたけど、全然だめ。
* ふと、「ん？ `require` ？ってことは、普通に書いてみたらどーなんの？」と思って書いてみる。
* **テスト通った！！！**
	* あ、いや、正確には `1 failing` って言われましたけどねｗ
	* テストは出来るようになりましたとさ。
DynamoDBをどうしても検索したいときTips

[株式会社オズビジョン](http://www.oz-vision.co.jp/)の@terra_yuccoです。

本日業務で、「DynamoDB全件なめてこの条件のデータだけ頂戴」に遭遇しました。
最新のSDK等を利用すれば多分もっと簡単にできるのでしょうが、
色々な制約があった中で頑張ったメモなので、残しておきます。

# Tips
- Data PipelineでS3に取っているバックアップファイルを、Bashのコマンドラインで操作して抽出
- DynamoDBのバックアップファイルは以下のフォーマットで生成されている

```
カラム名 0x03 カラム値 0x02 ...(繰り返し)... 0x0a

例えば以下のデータの場合
id (n) 123
age (n) 16
name (string) "abc"

id<0x03>{"n":"123"}<0x02>age<0x03>{"n":"16"}<0x02>name<0x03>{"s":"abc"}<0x0a>
```

# この方法を採れた理由
- 日次でData Pipelineを利用してDynamoDBのExportを行っていた
- データが今いまの最新である必要はなく、前日のもので良かった
- 取得するデータが固定長だった

# 具体的な手順
- AWS Consoleから、S3へ移動し、backupのファイルを全部ローカルvagrantのsynced_folderに格納
    - 今回は6ファイルありました。仮にファイル名を "file-xxxxx-000001" からの連番とします
- ageが16のデータのidだけを抜く (IDは3桁固定)

```
$ pwd
<synced_folder>
$ grep $'\x61\x67\x65\x03\x7B\x22\x6E\x22\x3A\x22\x31\x36\x22\x7D' <synced_folder>/file-xxxxx-* > result01.txt
$ cat result01.txt | sed -e 's/\x03//g' > result02.txt
$ cat result02.txt | awk -F'age' '{ print $2 }' > result03.txt
$ cut -c9-11 result03.txt > result04.txt
```

age<0x03>{"n":"16"} は、`61 67 65 03 7B 22 6E 22 3A 22 31 36 22 7D`
![image](https://qiita-image-store.s3.amazonaws.com/0/95030/00f712ab-67e3-b723-e66e-10b1cfba1c13.png)

今回はこの手順でresult04.txtを提出しました。

# 改善できたなと思ってるポイント

- 今回無理やりバリナリ文字列でgrepしたものの、先にsedを掛けておけばもう少し視認性の高いgrepができた
- 急いでるときあるある

## 次やるならこうしそう

```
$ pwd
<synced_folder>
$ cat <synced_folder>/file-xxxxx-* | sed -e 's/\x03//g' > result01.txt
$ grep 'age{"n":"16"}' result01.txt > result02.txt
$ cat result02.txt | awk -F'age' '{ print $2 }' > result03.txt
$ cut -c9-11 result03.txt > result04.txt
```

おしまい。
DockerのExitedコンテナを一括削除する方法

## DockerのExitedコンテナを一括削除する方法


```
docker ps -a | grep Exit | cut -d ' ' -f 1 | xargs docker rm
```

`sudo`が必要な環境では，以下のコマンドを実行

```Bash
sudo docker ps -a | grep Exit | cut -d ' ' -f 1 | xargs sudo docker rm
```

## 参考

[filosottile "Docker: remove all Exited containers"](https://coderwall.com/p/zguz_w/docker-remove-all-exited-containers)
Capybara::Webkit::ConnectionError の対応

いつからかCapybaraが実行できなくなり諦めていたのですが、ふと思い立ってやってみた。
時間はかかったけど一応動くようになったのでメモ。

（追記）以下に載ってた...
https://github.com/thoughtbot/capybara-webkit/wiki/Installing-Qt-and-compiling-capybara-webkit



【環境】
Mac OS X 10.11.6
capybara-webkit (1.7.1)
qt5.6

【エラー】
feature test 実行すると以下エラー...

```
Capybara::Webkit::ConnectionError:
       
Rails_root/vendor/bundle/ruby/2.1.0/gems/capybara-webkit-1.7.1/bin/webkit_server failed to start.
```

【対応】
qt5.6をアンインストールし、qt5.5をインストールする。
/usr/local/opt に qt5という名前でqt5.5のシンボリックリンクをつくる

```bash
% brew uninstall qt5
% brew install homebrew/versions/qt55
% cd /usr/local/opt
% ln -s qt55 qt5
```

【原因】
いろいろ調べて辿り着いたこちらの記事を参考にさせていただき(http://qiita.com/amoO_O/items/31d56493887fd0d1edac)
SERVER_PATH が指す webkit_server というのを実行したところ、

```bash
%  Rails_root/vendor/bundle/ruby/2.1.0/gems/capybara-webkit-1.7.1/bin/webkit_server
dyld: Library not loaded: /usr/local/opt/qt5/lib/QtWebKit.framework/Versions/5/QtWebKit
```

たしかに、
/usr/local/opt/qt5/lib/QtWebKit.framework/Versions/5/QtWebKit
はなく、stack overflowによると（http://stackoverflow.com/questions/37876987/cannot-import-qtwebkitwidgets-in-pyqt5）、
qt5.6から削除されたようです。
（きっとcapybara-webkit のバージョン上げれば問題おきないのだろうなと思うと悲しいですがしょうがない...）
WordPress Cli による環境構築


## Setup 

Curl や Composerなど様々なインストール方法があるので下記参照

http://wp-cli.org/docs/installing/

## WordPress本体のインストール

まずはコアのダウンロード。現在のフォルダにWP基本ファイルを展開する。

http://wp-cli.org/commands/core/download/

````
$ wp core download --locale=ja
````

デフォルトは`.`にファイルを展開するのでフォルダを作りたければ、` --path=wordpress`でパスを指定するとよい。

これでWordpressのファイルが引っ張って来れる。


## WordPress設定

次に、wp-config.php ファイルを作成する。

http://wp-cli.org/commands/core/config/

````
$ wp core config --dbname=testing --dbuser=wp --dbpass=securepswd --locale=ro_RO

````

## WordPress のインストール

config ファイルができたらインストールを実行

http://wp-cli.org/commands/core/install/

````
$ wp core install --url=example.com --title=Example --admin_user=supervisor --admin_password=strongpassword --admin_email=info@example.com
````

これでセットアップは完了

## Plugins

pluginsのインストールもCLI経由で可能。`--activate`でデフォルト有効化が可能。

http://wp-cli.org/commands/plugin/

````
$ wp plugin install contact-form-7 --activate
$ wp plugin install query-monitor --activate
$ wp plugin install wordpress-importer --activate
$ wp plugin install all-in-one-seo-pack --activate

````

## theme

テーマ関係のコマンドはこちら。運用によって様々なパターンが取れそう。

http://wp-cli.org/commands/theme/

## import

WP管理画面からインポート出来ない巨大なインポートファイルもCLI経由ならインポート出来る。

`--authors`オプションはユーザのマッピングに関する設定でCSVによるマッピング指定も可能とのこと

````
$ wp import example.wordpress.2016-06-21.xml --authors=create
````


## 運用

wp コマンドはカラントの`wp-cli.yml`を読み込み設定として利用する。

よく使用するコマンドの設定などをymlにまとめておくときれいかも

````
path: wordpress
url: http://localhost:8000
user: admin
color: false

core download:
  locale: ja
  version: 4.5
core config:
    dbuser: root
    dbpass: root
    dbname: wordpress
    dbhost: 127.0.0.1
    extra-php: |
        define( 'WP_DEBUG', true );
        define( 'WP_POST_REVISIONS', 50 );
        define('WP_HOME', 'http://localhost:8000');
        define('WP_SITEURL', 'http://localhost:8000');
        define('WP_LANG', 'ja');
core install:
    admin_user: admin
    url: http://localhost:8000
    admin_password: admin
    admin_email: "t.goto@chatbox-inc.com"
    title: "Wordpress cli test site"
````

あとはMakefileで、installコマンドなどを記述しておけば、WPの本体を共有する事無くWP環境構築を共有できるっぽい

````
install:
	wp core download
	wp core config
	wp core install
	wp plugin install contact-form-7 --activate
	wp plugin install query-monitor --activate
	wp plugin install wordpress-importer --activate
	wp plugin install all-in-one-seo-pack --activate
````

テーマに関してはcomposer installerで上手いことSymlink貼れば良い

環境毎の依存パラメータの変更とかも`wp-cli.yml`で上手いこと出来るらしい
AVAのテスト結果をJUnitのXMLで出力する


AVAのテスト実行結果をJenkinsに流す場合のお話です。

## 結論

下記を実行すれば、result.xmlにXMLが出力される。

```shell-session
$ npm i -g tap-xunit
$ ava -t | tap-xunit > result.xml
```

以下、詳細です。

## JUnitのXML

[JUnitの実行結果のXMLフォーマット ｜ Developers.IO](http://dev.classmethod.jp/testing/unittesting/junit-xml-format/)

上記記事に詳しく書いているが、Jenkinsにテスト結果を入力するには「JUnitのXML」と呼ばれる形式で出力する必要がある。
そのXMLに公式な仕様は無い（Schemaは[これ](https://github.com/windyroad/JUnit-Schema)？)ようだが、CIツールのデファクトスタンダードになっているようで、mochaならば[xunit-file](https://www.npmjs.com/package/xunit-file), [mocha-jenkins-reporter](https://www.npmjs.com/package/mocha-jenkins-reporter), [mocha-junit-reporter](https://www.npmjs.com/package/mocha-junit-reporter)などを使えばOK。

## AVA

[avajs/ava: Futuristic JavaScript test runner](https://github.com/avajs/ava)

AVA（えぃゔぁ）は、JavaScriptのテストフレームワーク。power-assertやBabel、Assertion Planning（参考記事：[おまえは今まで実行したassertの回数を覚えているのか？あるいは新しいアサーションユーティリティのご提案 - teppeis blog](http://teppeis.hatenablog.com/entry/2014/12/esplan-new-testing-utility-counting-assertoins-statically)）にデフォルトで対応していたりと、ナウい。また、テストを並列で実行するので速い。

## ava -t | tap-xunit

`ava -t`または`ava --tap`を実行すると、AVAはテスト結果をTAP形式で出力する。mochaのreporterのように、プラグイン形式でテスト結果の出力を外部パッケージに委譲する仕組みを用意しない代わりに、TAP形式で出力したもの各々加工してくれというスタンスっぽい。（今後実装するのかもしれませんが）

[tap-xunit](https://www.npmjs.com/package/tap-xunit)

tap-xunitはTAPを入力として「JUnitのXML」を出力するパッケージ。なので、`ava -t | tap-xunit`とすれば、AVAのテスト結果を「JUnitのXML」として出力できるというわけなのでした。

## おわり

[Home - Test Anything Protocol](https://testanything.org/)

TAPのページを見ると、他の言語のツールが載っている。また、JavaScript（Node.js）だと、[tapeのREADME](https://github.com/substack/tape#pretty-reporters)に色々なreporterが乗っているので、「JUnitのXML」以外にも出力したい形式があれば参考になるはず。
シェルスで日付を引数に指定_メモ

##やりたいこと
特定月のデータを出力するシェルスクリプトを作成。
特定月の指定方法：
　(1)コマンドの後ろに、年月指定する
　(2)日付指定なしの場合、自動的に先月を指定する

###実行イメージ
(1)年月指定
　`./test.sh 201608`
(2)指定なし、先月になる
　`./test.sh`

##シェルの書き方

test.sh 

```
#!/bin/sh

//引数1つもない場合、1ヶ月前の年月を出す
//今月の年月出力したい場合： DATE=`date "+%Y%m"`

if [ $# -ne 1 ]; then

    DATE=`date -d '1 month ago' "+%Y%m"`


//引数1つあれば、指定の引数のを利用

else

    DATE=$1

fi


//データの中身を確認
echo $DATE

```

参考：[シェルスクリプト-先月の月を取得する](http://shellscript.sunone.me/date.html#先月の月を取得する:26894f48f2b47b2b978e3b6ec280820a)


##今回困ったクォーテーションについて
今回のスクリプトで、シングル／ダブルクォーテーションの効果は一緒ですが、
状況によって、どっちが使えない場合があります。

シングル／ダブルクォーテーションの違いは、特殊文字の扱い方法：
(1)　"" ダブルクォーテーション
　**「$」「`」「\」については、クォートされません。特殊文字として扱われます。**

(2)　'  ' シングルクォーテーション
　**「$」「`」「\」は普通の文字列として扱われます。**

参考例：[シェルスクリプトとクォーテーションについて](http://www.uetyi.com/server-const/command/entry-234.html)
ほぼ初めてのJS  

今までrailsで写経したjsは使ったことあるのですが、昨日初めて自分で０からjs書いたので備忘録。

今回はviewに直書きしました
イメージはフォームに西暦を入れて異なるフォームに移った時に現在の西暦からフォームに書いた西暦の引き算イベントが発生するものです。
例えば、text_fieldに2011と入力してフォームから離れると2016 - 2011が実行され5がviewに表示されるというものです。

```ruby:hoge.html.slim


= form_for @company_setting, :url => { action: :update }, :method => :put do |f|
  h3.title.is-bold = t('.financial_period')


  br
    = f.text_field :closing_first_year, id: 'first_year'   #ここがイベント着火元

    span#calclation       #このidに結果が表示される

javascript:

  # 決算1期目の年を入力して 他のフォームに移動すると今期が何期目なのか自動計算される
  $('#first_year').change(function() {
    var now        = new Date();
    var year       = now.getFullYear();
    var first_year = $('#first_year').val();

    if ($.isNumeric($('#first_year').val())) {
      $('#calclation').text(year - first_year);
    } else {
      $('#calclation').text('取得できません');  #半角数字以外の値を受け取った場合はelseを実行
    }
  });
```



* 未入力状態
![160916-0004.png](https://qiita-image-store.s3.amazonaws.com/0/94552/03989d22-fcec-32dc-5873-b0898ac737d8.png)


* 半角の数字を入力した時
![160916-0005.png](https://qiita-image-store.s3.amazonaws.com/0/94552/70e20d67-71a5-32eb-9e87-2374c3aea805.png)


* 半角数字以外
![160916-0006.png](https://qiita-image-store.s3.amazonaws.com/0/94552/8aea052c-d153-ae64-5e2b-f266497e1c36.png)


ちなみに
```
var first_year = document.getElementById('first_year').value;
```
と
```
var first_year = $('#first_year').val();
```
は同じ意味とのこと！後者の方が簡潔に書けるので良い！

なお今回はviewファイルで直にjsを書いたが、
例えばapp/assets/javascripts/hoge.jsを作ってそこに書いていくと
viewに
```ruby
= javascript_include_tag "hoge"
```
って書けばhoge.jsが使われるので、汎用的な機能は個別にjsファイルとして作って書いていった方がいいとのこと。
[C#]条件でリストを絞り込む方法

条件を指定して、最初の何件かが欲しい、って処理が結構あると思います。
名前に田中を含むとか、10歳～40歳の男とか。
それ自体は難しくないんですが、条件欄が空欄だとその条件では絞りこまないので、
まともに書くと結構面倒なんですよね。

そんな処理をLINQを使ってさくっと書く方法です。

~~~[csharp]
IEnumrable<Person> SearchPerson(Search search)){
	List<Person> person = GetPerson();
	List<Func<Person, bool>> condition = new List<Func<Person, bool>>();
	int count = 30;

	if (search.Name != null) condition.Add(n => 0 <= n.Name.IndexOf(search.Name));
	if (search.MinAge != 0) condition.Add(n => search.MinAge <= n.Age );
	if (search.MaxAge != 0) condition.Add(n => n.Age <= search.MaxAge);
	if (search.Gender != 0) condition.Add(n => n.Gender == search.Gender);

	return person.Where(n => condition.All(m => m(n))).Take(count);
}
~~~

conditionというリストにラムダ式で絞り込みたい条件をぽいぽい突っ込むだけです。
後はこの条件に全て適合するものだけをWhereで抽出、件数はTakeで絞り込む感じですね。
VirtualBoxでコマンドラインからNICのtypeを変更する

# 概要

VirtualBoxでコマンドラインからNICのtypeを変更したい

# 結論

変更したいNICの番号を ```--nic``` の後につけ、
ブリッジに変更するなら bridged を書く

```
VBoxManage modifyvm 仮想マシン名 --nic2 bridged
```

## そのほかのオプション

helpで調べた


```
VBoxManage help modifyvm | grep nic
                            [--nic<1-N> none|null|nat|bridged|intnet|hostonly|
```

# 参考

以下のサイトに解説があった

[VBoxManage modifyvmコマンド](http://vboxmania.net/content/vboxmanage-modifyvm%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89)