OmniAICreator/Qiita-1.07M huggingface dataset:
pthread_killでセグる

```cpp:a.cpp

pid_t gettid() {
    return static_cast<pid_t>(syscall(SYS_gettid));
}

voud _pthread_kill(std::thread::native_handle_type ptid, int sig, pid_t pid, pid_t tid) {
    // pidとtidを使って、
    // /proc/pid/task/tid
    // というパスをチェックしてから、pthread_killを実行する。
    // pthread_killで存在しないptidを操作しようとすると、
    // CentOS 6だと、もれなくセグる。
    char path[1024];
    sprintf(path, "/proc/%d/task/%d", pid, tid);
    struct stat st;
    int ret = stat(path, &st);
    // statが成功したら、とりあえずOKとし、pthread_killを実行する。
    // statが失敗する場合は、pthread_killをせずに戻る。
    if (ret) {
        return;
    }
    pthread_kill(ptid, sig);
}

```

環境はCentOS release 6.7 (Final)
コンパイラは、gcc 4.8.2

スレッドは、std::threadを使いつつ、
スレッドからスレッドにシグナルを送信する場合は、pthread_killを使う。

この環境だと、pthread_killに渡すpthread_tの内容が、すでに存在しない
スレッドだった場合、、もれなくセグる。
たとえば、pthread_kill(ptid, 0); で生存確認したい、という場合も、
スレッドが存在しないのであれば、問答無用でセグる。（生存確認できない）

なので、そのスレッドの生存確認をするのに、
上記コードのように、/proc/pid/task/tidを確認する方法にした。

この件について、man pageにも書いてある。

以下引用

http://linuxjm.osdn.jp/html/LDP_man-pages/man3/pthread_kill.3.html


>シグナルの配送はプロセス全体で行われる。 シグナルハンドラーが設定されている場合、 そのハンドラーがスレッド thread で起動される>が、 シグナルの配送が "stop", "continue", "terminate" のいずれかの場合、 シグナルに対するアクションはプロセス全体に影響がある。
POSIX.1-2008 では、 スレッドが終了した後にそのスレッド ID が使用されたことを検出した場合に、 pthread_kill() はエラー ESRCH を返すことを推奨されている。 glibc の実装では、無効なスレッド ID を検出できる場合にはこのエラーを返す。 しかし、 POSIX では、 終了したスレッド ID を使おうとした場合の動作は不定であり、 pthread_kill() で無効なスレッド ID を使おうとした場合には、 例えば、 セグメンテーションフォールトになる可能性もある点に注意すること。
[POH7]つい出来心でハゲツインテール

# Paizaさんごめんなさい
早速POH!7始めたのですが、つい邪な気持ちが湧いてきて
[恋愛SLG: プログラミングで彼女をつくる｜paizaオンラインハッカソン7](https://paiza.jp/poh/ando?read=true)

![paiza1.JPG](https://qiita-image-store.s3.amazonaws.com/0/54591/99ef99bf-edbd-0774-8d49-4788d80e3559.jpeg)

## 原因
![paiza2.JPG](https://qiita-image-store.s3.amazonaws.com/0/54591/7863b430-a5b7-ee6d-2837-e76115b3d4f5.jpeg)
Chromeのデベロッパーツール等でclass定義を消してみたらこんなことに。
ほんとごめんなさい
ブランチを変更したときにspringが止まる問題をgit hookで防ぐ

# 発端：rspecがいつまでも動かない

今年の秋から参加したRails 4.2で開発しているプロジェクトで、なぜかrspecを走らせてもいつまでもスタート現象が起きました。だいたいこの手の原因は`spring`と分かっていたので、その都度`kill & spring stop`してやり過ごしていました。

# `git checkout`後が怪しい

何度も上記現象に会う中、原因が分からずに居たのですが、どうやらgitでブランチを切り替えたときに発生することがわかってきました。調べてみると、プロジェクトに[Spring hangs a lot](https://github.com/rails/spring/issues/396)という同様の症状に関するissueが上がっていました。

# 対策：post-checkout hookを使う

原因が分かれば打ち手を考えることができます。今回は簡単で、git hookを使ってcheckout時に毎回springを止めればOKです。ワーキングコピーにある`.git/hooks`の下に`post-checkout`というファイルを作り、以下のように書きます。

```bash
#!/bin/bash
bin/spring stop
```

これでspringを手動で止めなくても良くなりました。
アウトソーシング嫌いのベンチャーが2ヶ月間でオフショア開発でサービスをローンチしてみた~システム編~

# はじめに
某渋谷のベンチャーでCTO(ちょっと、たのしい、おじさん)をしています。
オフショア開発でどうAWSを活用出来るのかというお話をIVS Welcom sessionでお話させていただきました。LTの中でOpsworksを使っている人挙手！って言ったら、意外とOpsworks派は少ない状況でした。自分としては、Opsworksくそ便利でしょって思っている人なので、今後も普及活動していきたいと思っています。

## Opsworks
VPCをちゃんと分けられるし、Chefでカスタムクックブックかけば何でもできるし、デプロイの履歴も残るし、ロールバックも出来るし、スケーリングもできるし、くそ便利やないかーいというサービスです。BtoBtoCで対面はBの人たちでVPC分けることが想定される場合にはVPC対応必須。スケールアウトもある程度予測が出来るものであれば、AutoScallingよりも管理寄りで素敵っす。

## 発表内容
今回はシステム編として
短期間でオフショア開発を行う際にシステム設計における工夫したことをご紹介しております。

ちなみに作ったサービスはこれ
[コンバージョン率自動アップサービス ヒキアゲール](https://info.conversion-up.net/pr/)

[![オフショア開発 ベトナム](https://qiita-image-store.s3.amazonaws.com/0/74153/5c7a7309-7461-c9b5-a78a-21e0ad36636b.png "オフショア開発 ベトナム")](http://www.slideshare.net/nakanonoriyuki1/2-55452636)

12/02公開 [アウトソーシング嫌いのベンチャーが2ヶ月間でオフショア開発でサービスをローンチしてみた~システム編~](http://www.slideshare.net/nakanonoriyuki1/2-55452636)

## その他
その他公開資料としては、開発リーダー編、PJマネジメント編、CTO編と公開しています。

11/30公開 [アウトソーシング嫌いのベンチャーが2ヶ月でオフショア開発でサービスをローンチしてみた ~開発リーダー編~)](http://qiita.com/dirty_hero/items/8df6860da862a886d70b)
CTOに無茶ぶりされた開発リーダーの心境を紹介

12/02公開 [アウトソーシング嫌いのベンチャーが2ヶ月間でオフショア開発でサービスをローンチしてみた(PJマネジメント編)](http://qiita.com/devopsCoordinator/items/045423010da495dc19de)
オフショア開発する際にしたPJマネジメントの取捨選択紹介

12/03公開 [アウトソーシング嫌いのベンチャーが2ヶ月間でオフショア開発でサービスをローンチしてみた(CTO編)](http://qiita.com/devopsCoordinator/items/a656d2e40a95b3796401)
オフショア開発をすると腹を決めた、CTO視点でのストーリーです。
nginxとphp-fpm

# nginxとphp-fpm

## nginxの設定

- nginxのインストール

```bash
$ sudo yum install -y nginx
```

- サービスのスタート

```bash
$ sudo service nginx start
```
- ドキュメントルートの確認

/etc/nginx/conf.d/default.conf

デフォルトではドキュメントルートが/usr/share/nginx/htmlになっている

ドキュメントルートは変更可能
変更後にphpを動かしたいために.phpファイルをドキュメントルートに設定する


## php-fpmの設定

- php-pfmのインストール

```bash
$ sudo yum install -y php-fpm
```

- php用に設定変更

デフォルトではuser/groupはapacheになっている

```bash
$ sudo vim /etc/php-fpm/www.conf

user = nginx
group = nginx

```

```bash
$ vim /etc/nginx/conf.d/default.conf

location ~ \.php$ {
root           /usr/share/nginx/html;
fastcgi_pass   127.0.0.1:9000;
fastcgi_index  index.php;
fastcgi_param  SCRIPT_FILENAME  /usr/share/nginx/html$fastcgi_script_name;
include        fastcgi_params;
}
```

- nginxとphp-fpmの再起動

```bash
$ sudo service nginx restart
$ sudo service php-fpm restart
```

- サービスに登録

```bash
$ sudo chkconfig nginx on
$ sudo chkconfig php-fpm on
```

### 403エラーになるとき

1. ルートディレクトリのパーミッションが755であるか
2. ルートディレクトリ直下のindex.htmlのパーミッションが755
3. locationのallow denyが適切か
4. ルートディレクトリのユーザとグループが指定のものか

※今回の場合、userがnginx、groupがnginxで設定する

```bash
$ sudo chmod -R 755 hoge
$ sudo chown -R nginx:nginx hoge
```

それでもエラーが出る場合はエラーログ

```bash
$ tail -f /var/log/nginx/error.log
```
[docker] コンテナを一括削除

dockerのコンテナをいったんぜんぶ消してはじめからやり直したいとき。
docker rm containerId1 containerId2...とやればいいのですが、めんどくさいので。

`docker ps -a | awk '{print $1}' | tail -n +2 | xargs docker rm`

追記：

・・・とやっていましたが、コメントいただいているとおり、ベターかつベストと思われる方法はこちらです。

`$ docker rm $(docker ps -aq)`

@takayukiodaさんありがとうございました！！
Google Chart Tools

#Google Chartを使ってみよう！

下記のような感じで使えます！
「グラフ作って！」という時には便利かもしれません。
optionsも色々指定できるみたいです♪

![sample.png](https://qiita-image-store.s3.amazonaws.com/0/103502/ef7d8311-dbf8-ec0b-1361-a2e2eb8f8493.png)


```html:sample.html
<html>
 <script type="text/javascript" src="http://www.google.com/jsapi"></script>
 <script type="text/javascript">
   google.load("visualization", "1", {packages:["corechart"]});
   google.setOnLoadCallback(draw);
   function draw() {
     var data = google.visualization.arrayToDataTable([
       ['年月', '身長', '体重'],
       ['2011年', 173, 55],
       ['2012年', 175, 70],
       ['2013年', 180, 68],
       ['2014年', 175, 67],
       ['2015年', 173, 65]
     ]);
 
     var options = {
       title: '年別身長体重サンプル',
       hAxis: {title: '年月'},
       vAxis: {title: 'cm/kg'},
       width: 500,
       height: 250,
       pointSize: 6
     };
 
     var chart = new google.visualization.LineChart(document.getElementById('sample'));
     chart.draw(data, options);
   }
 </script>
<body>
 <div id="sample" style="width: 400px;"></div>
</body>
</html>
```

■参考文献
>http://yohshiy.blog.fc2.com/blog-entry-195.html
RPi > Raspberry Pi Zero > 消費電流 > LEDとHDMIをオフにして80mA

Raspberry Pi Zeroは価格面と性能から気になる。

消費電流については以下の情報がある。
http://www.midwesternmac.com/blogs/jeff-geerling/raspberry-pi-zero-conserve-energy


>1. Raspbian Jessie Lite nothing besides microSD card, and ACT LED on: 100 mA @ idle
2. Same as #1, but disable ACT LED and disable HDMI: 80 mA @ idle
3. Same as #1, but plug in a display, keyboard, trackpad, and WiFi adapter: 310 mA @ idle(!!)

LEDとHDMIをオフにして80mA.
結構消費電流が高い。


こちらにも計測データがある。
http://raspi.tv/2015/raspberry-pi-zero-power-measurements
Herokuで、Gititを起動する

[Gitit](http://gitit.net/)は、Gitで管理できるHaskell製のwikiです。

[Heroku](https://www.heroku.com/)で[Gitit](http://gitit.net/)を起動する際にハマったポイントのメモです。


基本的なやり方は[こちら](http://the.igreque.info/posts/2014-12-20-haskelljp-wiki-on-heroku.html)を参考にしました。


## ハマりポイント１

**wikidataのレポジトリにREAMDEが必要です。**

wikidataのレポジトリにREADMEがないと、以下の様なエラーでデプロイに失敗します。

```
Configure environment
   There was an issue setting up your app environment.
   could not find the source blob
```

## ハマりポイント２

**`https://github.com/mietek/gitit`のデプロイに失敗する**

[https://github.com/mietek/gitit](https://github.com/mietek/gitit)のレポジトリがこの記事を書いている時点で、gititの起動に失敗する状態です。

[pull request](https://github.com/mietek/gitit/pull/5)に出ている通り、configファイルのパスを修正する必要があります。

私の場合は、↑のレポジトリをフォークして、修正しました。

その場合のデプロイは、

1. forkしたレポジトリで、[このとおり](https://github.com/mietek/gitit/pull/5/files)修正＆コミット。
2. `heroku create -b https://github.com/mietek/haskell-on-heroku`
3. アプリの名称変更 `heroku apps:rename hogehoge`
4. [こちら](https://heroku.com/deploy?template=https://github.com/mietek/instant-gitit)に出てくる環境変数をすべて設定。 `heroku config:set BUILDPACK_URL='https://github.com/mietek/haskell-on-heroku` のような感じで。
5. デプロイ！ `git push -q heroku master`

## ハマりポイント３

**`static` `templates` ディレクトリは `wikidata配下`へ移動する**

wikidataを作成するために、`gitit`コマンドを実行すると、`wikidata`と`static`,`temaplates`ディレクトリが横並びで作成されますが、`static`,`templates`ディレクトリもgitレポジトリに入れて、Herokuで読み込んでもらうために移動します。

## ハマりポイント４

**独自ドメインの使用はクレジットカードの登録が必要です**

無料でできることはできますが、カードの登録は必要とのことです。




## 参考

[フォークしたレポジトリ](https://github.com/IMOKURI/gitit)

[wikidataを格納するレポジトリ](https://github.com/IMOKURI/wiki-imokuri123)

[Herokuで起動したwikiページ](http://wiki.imokuri123.com/)
2015-12-08 TeraTerm > バイナリ表示をしたい > DebugモードをONにする > Virtual Storeを回避した

```txt:動作確認
Windows 7 Pro
Tera Term v4.79
```

バイナリ表示をしたくなった。

以下を参考にして、DebugモードをONにした。
http://shuzo-kino.hateblo.jp/entry/20111027/1319682490

Shift + Escを押すたびに表示モードを変更できる。

<hr>
上記のページにあるように、VirtualStoreで確かに設定の変更が反映されなかった。

メニューの[設定]->[設定の読み込み]から編集した C:\Program Files\teraterm\TERATERM.INI ファイルを選択して読込むと、それ以降は使えるようになった。
ノーツ(LotusScipt)で、Excelブックを開いて操作する

IBM ロータスノーツをまだまだ使い続けている企業等があるかと思います（私の会社もそのひとつ）。
Tips のひとつとして、ノーツから任意のエクセルブックを開いてセルの内容を編集するスクリプトを記述してみます。

エクセルブックを開くだけであれば、スクリプトの[Shell](http://www-01.ibm.com/support/knowledgecenter/SSVRGU_9.0.0/com.ibm.designer.domino.main.doc/LSAZ_SHELL_FUNCTION.html)関数で、ブック（ファイル）のパスを引数指定してexcel.exeを起動する方法もあります。

#スクリプト
```vbnet
Dim path As String
path = "C:\Users\....\SAMPLE.XLSX"  'エクセルブック（ファイル）のパス

' Excelアプリケーションオブジェクトを取得する
Dim app As Variant
Set app = CreateObject("Excel.Application")
If app Is Nothing Then
 ' 取得できなかった場合のエラー処理（Exit Sub など）
End If

' ブック（ファイル）を開く
Dim bk As Variant
Set bk = app.Workbooks.Open(path)

' 操作したいシートを得る
Dim st As Variant
Set st = bk.ActiveSheet 'ここでは既定でアクティブ状態になったシート

' 操作
st.Range("A1").Value = "どうかな？"
st.Range("B1").Value = "ここかな？"

' ブックを保存する
bk.SaveAs path
bk.Close

' Excelアプリケーションオブジェクトを破棄する
' これをしないと、excel.exeがゾンビ的に残ってしまう
app.Quit
Set app = nothing
```

##説明
前提として、Excelマクロでブックやシートを操作出来るまでの知識が必要です。

VBA での変数型 [Excel.Application](https://msdn.microsoft.com/ja-jp/library/aa288621.aspx)、[Excel.Workbook](https://msdn.microsoft.com/ja-jp/library/aa288628.aspx)、[Excel.Worksheet](https://msdn.microsoft.com/ja-jp/library/office/ff194464.aspx)、Object型その他は、LotusScript上で [Variant](http://www-01.ibm.com/support/knowledgecenter/SSVRGU_9.0.0/com.ibm.designer.domino.main.doc/LSAZ_VARIANTS.html)型 として定義します（が、Object型とVariant型は、必ずしも機能的にイコールではないので注意）。

[CreateObject](http://www-01.ibm.com/support/knowledgecenter/SSVRGU_9.0.0/com.ibm.designer.domino.main.doc/LSAZ_CREATEOBJECT_FUNCTION.html) 関数で、Excel.Application のOLE/COMオブジェクトを生成しています。
【Android】Proguardの難読化で色々はまる

# AndroidアプリをProguardで難読化
Proguardで難読化してはまりにはまったのでメモ

## リリース時だけProguardを有効にする

```xml:build.gradle
android {
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
        debug {
        }
    }
}
```

## ビルドすると警告が出て難読化できないので除外設定する
コンソールに出た警告から除外対象を設定しました。

```xml:proguard-rules.pro
-dontwarn org.apache.tools.ant.**
-dontwarn okio.**
```

## apkをデコンパイルして、難読化出来ていることを確認する
① 生成したapkの拡張子をzipにして解凍
② dex2jarで.dex → .classへ変換
③ jadでデコンパイルしてソース確認

## apkを実機で動作確認すると、NullPointerExceptionで落ちる
外部ライブラリには難読化すると動かなくなるライブラリがあったりするので除外する
okhttpでモデルクラスを使用していて、そのモデルクラスを難読化すると動かなくなるので除外する。
やり方としては初めにパッケージごと除外してから徐々に狭めて詰めていくやり方が良さそう。

```xml:proguard-rules.pro
-keep class com.google.**  { *; } # gson
-keep interface com.google.**  { *; } # gson
-keep class com.squareup.**  { *; } # okhttp
-keep interface com.squareup.**  { *; } # okhttp
```

## 参考サイト
[Android Studio での Proguard 設定](http://ohwhsmm7.blog28.fc2.com/blog-entry-436.html)
[ProGuard を使用した難読化](http://ohwhsmm7.blog28.fc2.com/blog-entry-312.html)
[開発メモ/Proguardのすすめ](http://mirukerapps.com/program/%E9%96%8B%E7%99%BA%E3%83%A1%E3%83%A2proguard%E3%81%AE%E3%81%99%E3%81%99%E3%82%81.html)
[Proguard shrinking causes Null Pointer Exception](http://stackoverflow.com/questions/29666634/proguard-shrinking-causes-null-pointer-exception)
Bootstrapのグリッドシステムを動的に判定する


row内のcol-に対してなにか処理したい場合、デバイスサイズによってカラム数が変わると上手くいかないことがあります。
例えば高さ揃えの処理の場合、row内の全てのcol-で判定するので思わぬレイアウトの崩れが発生します。

そこで各行ごとに判定できるように改修します。

### 行をどうやって判定する？
今回はここが肝です。

ポイントは4つ

+ 現在のデバイスサイズを判定する
+ col-クラス一式を取得し、何が設定されているか分別する。
+ 妥当なcol-クラスを選択し、カラム数を取得
+ 12カラム構成の判定をする

このまま上から順に処理を作れば実現できます。

### 下準備
下準備としてDeviceオブジェクトを用意します。
これはbootstrapで扱う情報をまとめているようなものです。

```js
// デバイス判定用 Bootstrap "xs" "sm" "md" "lg"
var Device = {};
Device.SP = "xs";
Device.TB = "sm";
Device.PC = "md";
Device.LG = "lg";

Device.SIZE_SP = 768;
Device.SIZE_TB = 992;
Device.SIZE_PC = 1200;
```

### デバイスタイプを調べる
ではこれを利用して、デバイスの種類を判定します。
ちなみに判定結果はbootstrapの"xs"、"sm"、"md"、"lg"です。
処理はこんな感じ

```js
function getDeviceMode() {
    var window_width = $(window).width();
    var device = Device.SP;
    if(window_width > Device.SIZE_SP) device = Device.TB;
    if(window_width > Device.SIZE_TB) device = Device.PC;
    if(window_width > Device.SIZE_PC) device = Device.LG;
    return device;
}
```

これでデバイスサイズが分かりました

### col-クラスを取得する
取得したクラスはハッシュで管理します。
null判定入れておいたほうが、後々便利です。

```js
function getClassDic(scope){
    var classes     = $(scope).attr("class");
    var classDic   = {};

    var xs = classes.match(/col-xs-\d+/);
    var sm = classes.match(/col-sm-\d+/);
    var md = classes.match(/col-md-\d+/);
    var lg = classes.match(/col-lg-\d+/);
    classDic["xs"] = (xs) ? xs.toString() : null;
    classDic["sm"] = (sm) ? sm.toString() : null;
    classDic["md"] = (md) ? md.toString() : null;
    classDic["lg"] = (lg) ? lg.toString() : null;
    return classDic;
}
```

### デバイスサイズから妥当なcol-クラスを見つける

先ほど作ったハッシュデータから引っ張ります。ついでに正規表現で数値データを取得します。

```js
if(classDic[device]){
  return Number(classDic[device].match(/\d+/));
}
```

関数にすると、こんな感じでしょうか。

```js
function getColumnNumber(device, classDic){
    if(classDic[device]){
        return Number(classDic[device].match(/\d+/));
    }
    var n = classDic[Device.SP];
    if(classDic[Device.TB]) n = classDic[Device.TB];
    if(classDic[Device.PC]) n = classDic[Device.PC];
    if(classDic[Device.LG]) n = classDic[Device.LG];
    return Number(n.match(/\d+/));
}
```

### 行を判定する

最後に行を判定します。
カラムナンバーを加算して12で判定をかければできます。

```js

var MAX_COLS = 12; // 12カラム
var currentCols = 0;

$('.row').children().each(function(index, value){
   var classDic   = getClassDic(value);
   currentCols += getColumnNumber(device, classDic);
   
   // 12カラム構造を判定
   if(currentCols == MAX_COLS){
 	  console.log("改行発生");
   }
});
```
jsdo.itの使い方 - JSファイルをアップロードして使用する


- jsdo.it - http://jsdo.it/ のこと

EditページのFilesにはjsもアップロードできて、そのURLをタグで指定すれば、普通に使えるみたい。周辺ファイルのアップロードしたかったので解決できてよかった。

- 検証したコード
http://jsdo.it/nyamogera/Yy2n/

- [html]タブに追加したタグ
``` <script src="http://jsrun.it/assets/i/D/3/H/iD3H0"></script><!--test.js-->
```

ファイルのアップロードリストみたいなのは見つからなかったんだけど、探せないのかなぁ。
Pop sample


```objectivec
        POPSpringAnimation *animation = [POPSpringAnimation animationWithPropertyNamed:kPOPLayerPositionY];
        animation.springBounciness = 20; //just parameters, nothing fancy
        animation.velocity = @400;
        [animation setCompletionBlock:^(POPAnimation *animation, BOOL finished) {
            if (completion) {
                self.tableView.userInteractionEnabled = YES;
                completion(finished);
            }
        }];

        [self.tableView.layer pop_addAnimation:animation forKey:@"animation"];
        
        [animation removedOnCompletion];

```
SwiftでC言語の共用体(union)的な使い方

# SwiftでC言語の`union`的な使い方
先日勉強会でSwiftにはC言語の共用体`union`ってないのでしょうかという質問があったので、Swiftで`union`的な使い方を紹介したいと思います。
## `enum`をC言語の共用体として使う

Swiftの予約後には`union` keywordはありません。Swift のドキュメント<sup>*1</sup> にはバーコードの値を扱う`enum Barcode`の例が出ています。`UPCA`と`QRCode`では扱うデータの型が異なるため同じ型として扱いにくいのは確かですが、Swiftの`enum`を使えば、`union`のように扱う事ができます。

```swift
enum Barcode {
	case UPCA(Int, Int, Int, Int)
	case QRCode(String)

}
```

`UPCA`と`QRCode`では異なるデータの型を扱いたいので、それぞれのキーワードの後に括弧で扱いたい型を指定すれば良いです。これを Associated Value と言います。

```swift
let barcode1 = Barcode.UPCA(8, 85909, 51226, 3)
let barcode2 = Barcode.QRCode("Hello World")
```

こうなれば、UPCAもQRCodeも一つの型として扱いやすいので、`Any`じゃなくても配列として扱える。

```swift
let barcodes: [Barcode] = [barcode1, barcode2]
```

## Associated Value を取り出す
では、`Barcode`の値を引き渡された関数を想定して、その値を`print`してみましょう。`Optional`型がUnwarpしないと値が取り出せないように、`enum`のassociated valueも値を取り出すような一手間が必要になります。`case`節の中の`let`や`var`で値を取り出します。

```swift
func process(barcode: Barcode) {
	switch barcode {
	case .UPCA(let a, let b, let c, let d):
		print("UPCA: \(a),\(b),\(c),\(d)")
	case .QRCode(let string):
		print("QR: \(string)")
	}
}
```

もちろん値を取り出す必要がない場合は括弧全体を省略できます。

```swift
	case .UPCA: print("UPCA")
	case .QRCode: print("QRCode")
```

一つの型のみ注力して値を取り出したい場合は、まぁ`switch`文を使ってもいいのですが、if 文でも書く事が出来ます。`if let`といった書き方とずいぶん雰囲気が変わるので、面食らうかもしれませんが、慣れると簡潔にかけていいかもしれません。

```swift
if case .QRCode(let string) = barcode {
	print("\(string)")
}

```

## ちょっと一工夫でより便利に
こうした associated valueの取り出すコードを何度も繰り返さなければいけない場合が予想される場合は、enumの型自体に、メソッドなどを用意すると便利になる場合があります。

```swift
enum Barcode {
	case UPCA(Int, Int, Int, Int)
	case QRCode(String)

	var UPCA: (Int, Int, Int, Int)? {
		if case .UPCA(let a, let b, let c, let d) = self {
			return (a, b, c, d)
		}
		return nil
	}

	var QRCode: String? {
		if case .QRCode(let string) = self {
			return string
		}
		return nil
	}
}
```

```swift
if let code = barcode.QRCode {
	print("\code")
}
```

## JSONの要素などの表現

このように`enum`を使えば、JSONの要素のように、値の型がはっきりしない要素を扱う事が容易になります。この場合`Null`には associated value は必要ありませんね。

```swift
enum Element {
	case String(Swift.String)
	case Boolean(Bool)
	case Integer(Int)
	case Float(Swift.Float)
	case Dictionary([Swift.String: Element])
	case Array([Element])
	case Null
}
```

`Swift.String` や `Swift.Float` は ネームスペースの問題で `Swift`がついていますが、今回は割愛させていただきます。

---
<sup>*1</sup> The Swift Programming Language (Swift 2 Prerelease)
php を使って apache のログを解析するさらにもう一つの方法


すっかり言い尽くされているとは思いますが php を利用した **apache** のログ解析です

**apache** の **combined** なログから

- アクセス元IPアドレス
- アクセス時間
- アクセスメソッド
- アクセスパス

以上の情報を抜き出すには以下の正規表現と *preg_replace()* を利用する事で簡単に可能です

アクセス時間にはスペースが含まれる可能性があるのでフィールドはスペースではなくカンマで区切っています。

```php
/* IPアドレス,アクセス時間,アクセスメソッド,アクセスパス */
$csv = preg_replace('/^([\S]+)[^\[]+\[([^\]]+)\]\s+"(\S+)\s(\S+).*/', "$1,$2,$3,$4", $line)
```

このデータはみんな大好き！ **CSV** 型式になので表計算ソフトにも簡単に取りこめるでしょう。

そのまま php のプログラム中で利用する場合は配列にするとアクセスが楽なので配列にしちゃいます。
上で作成した **CSV** 型式のデータを *explode()* で配列に分割しています。


```php
/*
 * $info[0]: IPアドレス
 * $info[1]: アクセス時間
 * $info[2]: アクセスメソッド
 * $info[3]: アクセスパス
 */
$info = explode(",", preg_replace('/^([\S]+)[^\[]+\[([^\]]+)\]\s+"(\S+)\s(\S+).*/', "$1,$2,$3,$4,", $line));
```

apache の標準型式の日付時間フォーマット
	*dd* "/" *M* "/" *YY* ":" *HH* ":" *MM* ":" *SS* " " *TZ*
は php の *strtotime()* で変換可能ですので、アクセス時間は以下の方法で unix タイムスタンプに変換でき日付時間による計算も簡単に可能です。

```php
$unixtime = strtotime($info[1]);
```

ログをオープンして特定の時間内ログを加工する場合などは以下のスケルトンになります。

```php
<?php

    /* 30分前から今まで */
    $start = strtotime(date("Y-m-d H:i:00", strtotime("-30 minute")));
    $end = strtotime(date("Y-m-d H:i:00"));

    if(($fp = fopen($logfile, "r"))}{
        while(!feof($fp)){
            $info = explode(",", preg_replace('/^([\S]+)[^\[]+\[([^\]]+)\]\s+"(\S+)\s(\S+).*/', "$1,$2,$3,$4,", fgets($fp)));
            $access = strtotime($info[1]);

        if($access > $start && $access < $end){
            /* 必要な処理 */
        }
        fclose($fp);
    }

?>
```

厳密なログの書式解析は結構面倒なのですが簡易的な方法なら割と簡単に可能です。
パスワード付きPowerPointファイルをマクロで扱う

まずOfficeのバージョンによりこのHotfixが必要
https://support.microsoft.com/en-us/kb/916154
といっても 2003 用なので現在は特に問題ないかも。

そして下記の通り。

>This hotfix provides functionality so that you can append the password to the file name that is passed to the Open method in the macro. The password is delimited from the file name by two colons (::). This delimitation is supported for the Read password and for the Modify password.

>The syntax that is used to append the Read password and the Modify password is as follows:
```vbnet
Open( "filename.ppt::readpassword::modifypassword" )
```

Openメソッドのファイル名の後に :: をつけてパスワードをつければ良い。
この仕様を決定した担当者の苦悩を思うと、なかなかに味わい深い。

>To specify a Read password when the presentation is opened, use the following syntax:
```vbnet
Open( filename.ppt::readpassword)
```

>To specify a Modify password when the presentation is opened, you must provide the Read password as blank and then specify the Read password. To do this, use the following syntax:
```vbnet
Open( filename.ppt::::modifypassword" )
```
>Note Read passwords cannot contain two colons (::) as part of the password.

既に::をパスワードに指定している場合は駄目とのこと。
現実的にはほとんど無いだろうけど、やはり味わい深い。
ノーツ(LotusScipt)で、WindowsやMacintoshのノーツ画面からネットワーク共有フォルダを開く

IBM ロータスノーツをまだまだ使い続けている企業等があるかと思います（私の会社もそのひとつ）。
Tips のひとつとして、ノーツから任意のネットワーク共有フォルダを開くスクリプトを記述してみます。
#スクリプト
```vbnet
Dim ss As New NotesSession
Dim path As String
Dim ret As Integer

' このコード例では、pathをUNC(Windowsで採用)で指定しています
path = "\\fileserver\sharedfolder\"

Select Case ss.Platform
 Case "Windows/32"
  ret = Shell("explorer """ & path & """", 1)		

 Case "Macintosh"
  ' UNCパスをsmbプロトコルのURL表現に変換します
  path = Replace(path, "\\", "smb://")
  path = Replace(path, "\", "/")

  ret = Shell("open """ & path & """")		

 Case Else
  MessageBox "非対応のOSです。直接開いてください" + Chr(13) + Chr(10)

End Select
```
##説明
[NotesSession](http://www-01.ibm.com/support/knowledgecenter/SSVRGU_9.0.0/com.ibm.designer.domino.main.doc/H_NOTESSESSION_CLASS.html) インスタンス（オブジェクト）の [Platform](http://www-01.ibm.com/support/knowledgecenter/SSVRGU_9.0.0/com.ibm.designer.domino.main.doc/H_PLATFORM_PROPERTY.html) プロパティに、クライアント（ノーツ）が動作しているOSの種類が入っているので、この内容をもとにフォルダパスを指定して、フォルダを開くコマンド・アプリケーション（Windowsならexplorerアプリケーション、MacOSならopenコマンド）を [Shell](http://www-01.ibm.com/support/knowledgecenter/SSVRGU_9.0.0/com.ibm.designer.domino.main.doc/LSAZ_SHELL_FUNCTION.html) 関数で呼びだしています。

ちなみにネットワーク共有（SMB共有）フォルダパス表現方法は
Windowsであれば
 `\\<サーバ名>\<フォルダ名>\`
MacOSであれば
 `smb://<サーバ名>/<フォルダ名>/`
となります（LotusScript とは無関係ですが...）

###式言語での実現方法
LotusScriptのShell関数に対応する[式言語](http://www-01.ibm.com/support/knowledgecenter/SSVRGU_9.0.1/com.ibm.designer.domino.main.doc/H_NOTES_FORMULA_LANGUAGE.html) の [@Command([Execute])](http://www-01.ibm.com/support/knowledgecenter/SSVRGU_9.0.1/com.ibm.designer.domino.main.doc/H_EXECUTE.html)での例です。OS の識別は [@Platform](https://www.ibm.com/support/knowledgecenter/ja/SSVRGU_9.0.0/com.ibm.designer.domino.main.doc/H_PLATFORM_FUNCTION.html) が返す値を参照することで可能です。
####Windows 
```
@Command([Execute];"￥￥fileserver￥sharedfolder￥")
@Command([Execute];"￥￥￥￥fileserver￥￥sharedfolder￥￥")
※NotesDesignerからの入力で、エンマークはなぜか2個打ちせねばならない場合と、1個打ちで済む場合とがあります。
```

パスでファイルを指定すれば、画像ファイルなども開くことができます。ShellExecute 的な動きをするのでしょう。

```
@Command([Execute];"￥￥fileserver￥sharedfolder￥picture.png")
```

#####(余談)

```
@Command([Execute];"explorer.exe";"￥￥￥￥fileserver￥￥sharedfolder￥￥")
```
のように指定して、同じことができたときと、うまくいかずに下記画像のような変な呼び出され方をされたときとがありました。
![p3.png](https://qiita-image-store.s3.amazonaws.com/0/100206/046a2694-0ffd-898d-dc78-ac1380057cbe.png)

####Macintosh
うまくいく方法をご存知の方、教えてください！！次のコマンドはうまく動かず...

```
@Command([Execute];"//fileserver/sharedfolder/")
@Command([Execute];"smb://fileserver/sharedfolder/")
@Command([Execute];"open";"//fileserver/sharedfolder/")
@Command([Execute];"open";"smb://fileserver/sharedfolder/")
```

私の環境ではopen自体も動きません。

```
@Command([Execute];"open")
```
Android TabLayoutを使用している時にソフトキーボード表示でタブが隠れるようにする

ソフトキーボードを表示すると、タブがびよんと画面中央に表示。
あきらかに邪魔ですよね〜。


![tab_up.png](https://qiita-image-store.s3.amazonaws.com/0/74328/567cb488-6075-d694-c1ac-c93e8027f011.png)


これを無くすためには、Manifest.xmlの対象アクティビティに

```AndroidManifest.xml
android:windowSoftInputMode="adjustPan|adjustResize"
```

例

```AndroidManifest.xml
<activity
    android:name=".MainActivity"
    android:windowSoftInputMode="adjustPan|adjustResize"
    >
```


参考
http://developer.android.com/intl/ja/guide/topics/manifest/activity-element.html#wsoft

公式ドキュメントによれば、adjustPanがタブを押し上げない役目で、adjustResizeがソフトキーボードが出た時にアクティビティをソフトキーボードの分縮める役目を担っている模様。



![tab_no.png](https://qiita-image-store.s3.amazonaws.com/0/74328/af22e50e-c51a-ec4b-5579-c7d1714a7274.png)



これで画面広々。
c++ builder > CommaTextで失敗する > StrictDelimiter / Delimiter を使うほうがよい

```txt:動作確認
C++ Builder XE4
```

CommaTextを使うことで失敗していた。

CommaTextは空白などがない連続したカンマ区切り文字に対してはきちんと分割することができて重宝するが、途中で空白が入った時に位置ずれを起こす。

最初からCommaTextを使うのでなく、StrictDelimiter をtrueにして、Delimiterを使っておくほうが潜在的な不具合発生を抑止できると思った。

http://qiita.com/7of9/items/1e0de27c97d4994a8d27
WindowsをChefServerに登録

# 構成
chef-server 12.1(CentOS6.7 + Chef-Server12.3) <--> workstation(CentOS6.5 + ChefDK0.10.0) <--> Node(WindowsServer2012R2)

#Node
## WinRMを有効化
```ps1
#PowerShellを有効化
Set-ExecutionPolicy -ExecutionPolicy "RemoteSigned" -Force

#リモートアクセスを有効化
Enable-PSRemoting -Force

#タイムアウト設定
Set-Item -Path "WSMan:\localhost\MaxTimeoutms" 1800000

#暗号化されていないリモートアクセスを有効化
Set-Item -Path "WSMan:\localhost\Service\AllowUnencrypted" "true"

#Basic認証を有効化
Set-Item -Path "WSMan:\localhost\Service\Auth\Basic" "true"

#Firewall許可
Set-NetFireWallRule -Name "WINRM-HTTP-In-TCP-PUBLIC" -RemoteAddress "Any"
```

#WorkStation
## bootstrapで登録
```bash
knife bootstrap windows winrm (IPAddress) --winrm-user administrator --winrm-password (windows-password) --node-ssl-verify-mode none -N (node-name)
私にとっての最初のFlashはparaflaでした

穴があったので埋めておきます。
文章力がないので多分読まなくていいです。

paraflaを知っている人が、paraflaのことを思い出してくれたら満足です

当時中学生の私は、Adobe Flash Professional なぞ高級なものを買えるはずもなく、Jsをちょこちょこ書いておりました。
その頃はJsではjQueryとかなくて（知らなかっただけ？）インタラクティブなJsサイトは作れなかったので
どうしてもうごくページとを作りたいと思って
Paraflaを始めました。
フルスクリーンFlashのウェブサイトを作った記憶です。

Paraflaはおもしろフラッシュぐらいは作れて楽しかった記憶です。
一応AS2（だったかな？）でコーディングもできた気がします。

http://parafla.coaworks.jp/parafla.html
http://www.geocities.jp/para_core/kouza/

2011年後半ぐらいまでは活動されていたようですね
[Android] CentOS 64bit 上でgradlewを使ってコンパイルするために必要だったこと

32bitな実行環境が必要らしい。

```shell-session
# yum install ld-linux.so.2 libz.so.1 libgcc_s.so.1

========================================================================================================
 Package            Arch           Version               Repository   Size
========================================================================================================
Installing:
 glibc              i686       2.12-1.166.el6_7.3        updates       4.3 M
 zlib               i686       1.2.3-29.el6              updates        73 k
 libgcc             i686       4.4.7-16.el6              updates       114 k
Installing for dependencies:
 nss-softokn-freebl i686       3.14.3-23.el6_7           updates       157 k
========================================================================================================
```
AngularJSをこれから始める人へ

[★若葉組のつぶやき★ Advent Calendar 2015](http://qiita.com/advent-calendar/2015/adv_young_leaves) の7日目を担当します！
投稿1日遅れました・・・

AngularJSマスターになるように特命を受けてさっそくAngularJSを始めたので、そのための情報を発信してみようかと思ったのですが・・・

基礎編はかなり充実していたので、リンク集を作ることにしました。
実践編でAngularがイケてるとこ、イケてないとこ、結局自分使っていくのかを共有できたらいいなぁと考えています。

##対象者
・AngularJS が気になっている人
・javascript知っている人
・Ajax知っている人

##さくっとAngularJSがどんなものか触りたい人向け
[AngularJS入門 (全12回)](http://dotinstall.com/lessons/basic_angularjs)
所要時間：1時間（動画再生時間約30分）

・音声なので頭に入ってきやすいです。
・字幕ではなく、音声の内容が文字起こししてあるので、再生せずに勉強できます。
・サンプルソースもあります。

##基礎を一通りさらっと触りたい人向け
[AngularJS使い方メモ](http://qiita.com/opengl-8080/items/2fe0a20c314b1c824cc5)
所要時間：8時間

・次項の本のまとめです。
・本よりも親切なサンプルソースです。
・本よりも解説が読みやすいです。
・最後にたくさん参考があるのでおすすめです。。

##基礎をしっかり理解しながら触りたい人向け
[AngularJSアプリケーション開発ガイド ](http://www.amazon.co.jp/AngularJS%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E9%96%8B%E7%99%BA%E3%82%AC%E3%82%A4%E3%83%89-Brad-Green/dp/4873116678/ref=sr_1_1?ie=UTF8&qid=1398347920&sr=8-1&keywords=angularjs)
所要時間：24時間

・オライリーの本の中では薄くて読みやすいです。
・殺人光線とかいがいにおちゃめサンプルもあります。
・電子書籍だと2,000円です。
・原著は2013年の本なので、いろいろ動かないコードがあります。
　→そんなところもみなさんすでに解決済み
　[『AngularJSアプリケーション開発ガイド』第3章 Yeoman周りが動かない問題について](http://qiita.com/ryo511/items/70a4e0a830b3175c3204)

####★Yeoman周りが動かない問題の補足
　　[その1]　上記[ryo511](http://qiita.com/ryo511)さんのやり方はMacですが、筆者はwindowsでやってる途中です。
　　[その2]　windowsでエラーになったコマンド
　　　　[失敗]　yo angular-gulp myapp
　　　　[成功]　yo gulp-angular myapp　　　※「yo --help」で確認したら、逆でした。

##とりあえず、いろんな手法が見たい人向け
たくさんAdvent Calendarに転がってます。
[Advent Calendar 2015 AngularJS](http://qiita.com/advent-calendar/2015/angularjs)
[Advent Calendar 2014 AngularJS](http://qiita.com/advent-calendar/2014/angularjs)
[Advent Calendar 2013 AngularJS Startup](http://qiita.com/advent-calendar/2013/angularjs-startup)
もう２です。
[Advent Calendar 2015 Angular2](http://qiita.com/advent-calendar/2015/angular2)



##実践編に向けて
・フロント技術はとくに流れが速いので、短時間で有益な情報をあつめて「モノ」するかを意識することは大事です。
・本は黎明期にでることが多くて、はやって使うときには古く感じかちなんですが、それでも、細かいところはやっぱり本がいいなぁと考えているアナログな人間です。
・あと「人」も大事です。いろんなバックグラウンドで使っている人の体験記をいろいろ集めてみようと思っています。
Java8でラムダしてみる。

# Java8でラムダしてみる。

## 概要

 今まで何となく追加されたんだなぁと思いつつ触ってなかったのでこの機会に「ラムダ式」を触ってみます。
 
 ## ラムダ式って？
 ラムダ式(wikiより)…計算模型のひとつで、計算の実行を関数への引数の評価（英語: evaluation）と適用（英語: application）としてモデル化・抽象化した計算体系である。

何のこっちゃ判らん。。。

 しっくり来たサイトから引用**「関数型インタフェース」のメソッドを実装する際に式として使う事が出来る。**との事、最近よく聞く関数型プログラミングというやつらしい
**関数型インタフェース**…抽象メソッドを一つ持つインターフェース
```
こんなの
@FunctionalInterface
interface Hello{
    public void sayHi(String name);
}
```

ざっくりいうと、以下なのかな
  * コーディングをシンプルに記述できる
  * 簡単に並列処理を組める
  * ラムダ式が前提の新機能が多いので、覚えるしかない


## 試してみる（本題）
本当にシンプルに処理が記述できるのか？並列処理を楽に組めるの？どの位早いの？を実際に体験してみようと思い、今まで逃げてきたラムダ式を書いてみました。

### 今回のお題
大量のオブジェクト配列の中から、特定のデータがセットされている件数を数える。

### まずは大量の配列を用意
まずは、staticイニシャライザでPersonクラスのリストを沢山作ります。
Personクラスは、名前、税別、年齢を持っています。
```java

    private static List<Person> list;
	static {
		list = new ArrayList<Person>();

		Random rnd = new Random();

		while(list.size() != 50000000){
			int age = rnd.nextInt(100);

			boolean isMan = false;
			if (age%2 == 0) {
				isMan = true;
			}

			String name = "name_" + age;
			list.add(new Person(name, isMan, age));

		}
	}
```
### Java7（泥臭く）
とりあえず、ループしながら女性だけの数を数えます。

```java
	public long countFor7(){
		long count = 0;
		for (Person person : list) {
			if (person.isMan() == false) {
				count++;
			}

		}
		return count;
	}

```
### Java8(ラムダ)
おお、確かに短い

```java
	public long countFor8(){
		return list.parallelStream().filter(p -> p.isMan() == false).Count();
	}
```
良くあるサンプルですが、他にはsortとかfirstとか色々あります。
これが、提供された便利なAPIってやつですね、、、

本当は自分で関数インタフェース作ろうと思ったんだけど、挫折…
本気でラムダ覚えようと思ったら、もっと色々勉強しないと判らない事が判った。

尚、今回一番苦労したのは、大量データによるOutOfMemoryを回避する為
実行環境を探したり設定変えたりだったりする。

## 動かしてみる
static イニシャライザは別として計測

スペック
* Core i7
* 8G Memory
* SSD 128G


### java7で実行！！
```
count is 9999968!!
135 msec 
```

### java8で実行！！
```
count is 9999968!!
186 msec 
```

さすが並列処理のおかげで遅くな・っ・て・い・る？？
5,6回やって、大体同じような結果

## 考察
どうやら以下の制約があるらしい

少ないデータだったり、データ操作の種類によっては並列化の恩恵は得られない、むしろ、オーバーヘッドが増えて遅くなる。
まあ、そうですよね



次回
もうちょっと調べて、ちゃんと並列処理で早くなるサンプルを作ります。
Apache の suEXEC でドキュメントルートを変更する

# 概要
CGI を任意のユーザー権限で実行したい場合に **suEXEC** を用いるが、ドキュメントルートに `/home` 以下を指定するなど `/var/www` 以外を使うと Apache のエラーログに `End of script output before headers` のエラーが出力されて実行できない場合がある。

# 調査
## End of script output before headers
```:/var/log/httpd/error_log
End of script output before headers: example.cgi
```

このエラーについては文字コードや改行コードなどについて記載されているページが多いが、本件では文字コードや改行コードとは無関係のようだ。
詳細は suEXEC のログが `/var/log/secure` に記録されている。


## command not in docroot
```:/var/log/secure
uid: (0000/example) gid: (0000/example) cmd: example.cgi
command not in docroot (/home/example/html/example.cgi)
```

## docroot (AP_DOC_ROOT) の設定値
`suexec -V` コマンドで設定値を確認できる。yum などでインストールした場合 `AP_DOC_ROOT="/var/www"` となっている。この値は設定ファイルでは変更できず、コンパイル時に指定する以外に方法はない模様。
シンボリックリンクでは参照先を確認するため無理。ハードリンクではディレクトリーを指定できないため同様に無理。

```bash
suexec -V
 -D AP_DOC_ROOT="/var/www"
 -D AP_GID_MIN=100
 -D AP_HTTPD_USER="apache"
 -D AP_LOG_SYSLOG
 -D AP_SAFE_PATH="/usr/local/bin:/usr/bin:/bin"
 -D AP_UID_MIN=500
 -D AP_USERDIR_SUFFIX="public_html"
```

# 対策
## mount --bind によるマウント
```bash
mkdir /var/www/example
mkdir /var/www/example/html
mount --bind /home/example/html/ /var/www/example/html/
chown example:example -R /var/www/example/html
```
## fstab による自動マウント設定
```bash
cat << "_EOD_" >> /etc/fstab
/home/example/html /var/www/example/html      none    bind    0 0
_EOD_
```

## VirtualHost の再設定
```apache:/etc/httpd/conf.d/virtual.conf
<VirtualHost *:80>
	DocumentRoot /var/www/example
	ServerName www.example.jp
	SuexecUserGroup example example
	ErrorLog "logs/example-error.log"
	CustomLog "logs/example-access.log"
	<Directory /var/www/example>
		Options ExecCGI FollowSymLinks
		AllowOverride All
		Require all granted
	</Directory>
</VirtualHost>
```

## リンク
https://httpd.apache.org/docs/2.4/suexec.html

# Apache 関連記事
* [Apacheセキュリティ設定](http://qiita.com/bezeklik/items/1c4145652661cf5b2271)
* [Apache HTTP Server のサポート期限](http://qiita.com/bezeklik/items/7e2c02c3eabd2a416231)
* [Apache のログをコマンドラインで集計する](http://qiita.com/bezeklik/items/f5c292c4360cde140bef)
* [Apache の情報をコマンドラインで取得する](http://qiita.com/bezeklik/items/7bbfcbcfeb05c1d57fec)
* [IPアドレスから国や都市を判別する (GeoIP)](http://qiita.com/bezeklik/items/927e1c52c8c0aefb1f06)
* [Apache の suEXEC でドキュメントルートを変更する](http://qiita.com/bezeklik/items/e6295a54dbdb0df31827)
クリエイティブ制作でConoHaが便利だった話

```lang:ざっくり言うと
・ConoHaでチーム制作が捗った件
・実際の流れ
・デザイナーでも便利にConoHaを使える件
```

こんにちは、渋谷のIT企業で何でも屋をしているinamolyです。

このエントリーは「[ConoHa Advent Calendar 2015](http://qiita.com/advent-calendar/2015/conoha)」の8日目として投稿しています。

いわゆるエンジニアな仕事をされている方のポストが並んでいましたので、箸休めと言いますかデザイナー、ディレクターといった「非エンジニア」でもConoHaは便利だったというお話を紹介しようと思います。

## すぐテストサーバーが立つから、チーム開発に効く

とある日の開発チャットでのやり取りのキャプチャです。
（※もちろん画像加工修正）


![cono01.jpg](https://qiita-image-store.s3.amazonaws.com/0/36187/df75eb94-b7f0-4389-f085-9e93a3a965e3.jpeg)





見ていただきたいのは赤で囲んだ時間で、新規サイト用のテストサーバーを3分で用意している点です。

新規のランディングページ（広告から飛んでくる商品ページ）などを作っている際に「○○のデザイン出来ました！テスト環境ください」と言うのは、特に受託なシーンでは、よく見かけるやり取りだと思います。
いままでなら事前にサーバーを申込など必要でしたが、30秒ほどでVMが立ち上がるので、必要なときに必要な分だけ立てる運用ができるようになりました。
特に短期間しか使わないテストサーバー運用においては、とても助かっています。（1GBのサーバーなら半日で10円ちょい、10日間で300円くらい）


## 作業のざっくり流れ

実際によくやってるパターンは以下の感じ
1. テスト用のサーバーを立てる
2. デザイナーはWinSCPなどでアクセス
3. hosts変更して確認

　

#### 1. テスト用のサーバーを立てる

まずはテスト環境を立てます。

![cono02.jpg](https://qiita-image-store.s3.amazonaws.com/0/36187/537ed477-c8ff-db89-b9db-d158ba07f1eb.jpeg)


ConoHaのコントロールパネルにログイン。
イメージで「アプリケーション」→「LAMP(PHP)」を選択

　

#### 2. デザイナーはWinSCP、FilezillaなどSFTPアクセス
![cono03.jpg](https://qiita-image-store.s3.amazonaws.com/0/36187/1687f1b1-68b0-1b58-fd94-eea57a90b1a0.jpeg)

サーバーを立て、rootのID、PASSをそのまま渡しています。
※必要に応じてIP制限などのhtaccess入れてる



#### 3. hosts変更して確認

テスト環境の確認者にはhostsを書き換えてもらってます
案件毎にテスト環境追加な感じです。

例）
111.111.111.111 test1.hoge.com
111.111.111.112 test2.hoge.com
111.111.111.113 test3.hoge.com


## すぐ作ってすぐ壊す。作りこまない制作。
上記ではLPでの例を上げましたが、いわゆるプロトタイプ制作でもよく利用しています。
最近は特にかんばんをもちいたスクラムやリーンな作り方が多くなっていて、「まずはざっくり動くもの」を作るようにして「本当にそのプロダクトで良いのか？」などを検証しています。

なぜスクラム、リーンが良いのかは、また別の機会に。


まだ早いですが、2015年も皆さん大変お疲れ様でした！！
クリップボードにコピーしてくれるjQueryプラグイン

#github
https://github.com/patricklodder/jquery-zclip

#メモ
- コピー完了後にalertを出したくないなら、`afterCopy`オプションに空の関数を指定
 - `clickAfter`ではない
- コピー対象を動的に生成する場合は使えない感じ。後述の`clipboard.js`を使おう

#追記
##clipboard.js
https://github.com/zenorocha/clipboard.js

flashを使ったりしていないこちらの方がいいかも
RaspberryPi  zeroを動かしてみた

#注文していたRaspberryPi zeroが届いたので早速動かしてみた。
1個600円でフリスクと同じくらいのサイズ、モニタがつなげてLinuxが動くRaspberryPi  zeroが手元に届いたので早速起動してみた。
主に以下のサイトを参考にした。
http://blog.shinkaku.co.jp/archives/47104817.html

![12342842_10153757237603571_3266679717773547670_n.jpg](https://qiita-image-store.s3.amazonaws.com/0/10836/06bb52da-da90-ff22-9b3b-d34214417407.jpeg)
#まずOSイメージのダウンロード
以下のリンクから最新のOSイメージをダウンロード
https://downloads.raspberrypi.org/raspbian_latest
#ツールをダウンロード
SDカードにOSイメージをコピーするだけでは起動せず、専用のツールでSDカードへの書き込みが必要。
WINDOWSの場合は以下のリンク先を開き
https://learn.adafruit.com/introducing-the-raspberry-pi-zero/making-an-sd-card-using-a-windows-vista-slash-7

以下のツールをダウンロードする。
http://adafruit-download.s3.amazonaws.com/fedora-arm-installer-1.1.1-8.x32.zip
ダウンロードしたものを解凍する。
![folder.png](https://qiita-image-store.s3.amazonaws.com/0/10836/e8aa54ef-743f-acab-beed-6c24f374e700.png)
パソコンにはOSイメージを書き込むSDカードを接続しておく。
#ツールを起動
fedora-arm-installer-2.exeを起動する。
![apli.png](https://qiita-image-store.s3.amazonaws.com/0/10836/1e46b271-0c28-8cc0-df04-42a0d94c5fe5.png)

Souceの「Browse」ボタンをクリックしてSDへ書き込むimgファイルを選択。
Destnationの「Device」ボタンをクリックしてSDカードのドライブ名を選択（例 DドライブならD:を選択）
「install」ボタンをクリックする。
#OS起動
書き込んだSDカードをRaspberryPi zeroに差し込んでモニタをつなぎ電源を入れればLinuxが起動する。

![12346562_10153758049383571_4030859131834755540_n.jpg](https://qiita-image-store.s3.amazonaws.com/0/10836/87e84d8c-dee9-3d8a-1765-2bc2b9c48bba.jpeg)
PublicなDNSサーバにPrivateIPを設定するのはアリか?

元ネタ：http://serverfault.com/questions/4458/private-ip-address-in-public-dns

おおざっぱに

> PrivateIPを載せることで内部の構成が暴露されるので攻撃の危険があると言われるが
> ネットワークの構成なんてたいてい推測可能なんだからそれが本質的な問題とは思わない．
> 自分とこのPublicなシステムからアクセス可能になってなきゃ別に良いんじゃないの?
> 可能ならゾーン分けとけば良いかもね．

ってことかな．
EXTNAMEの拡張

V6R1よりEXTNAMEに明示的にライブラリ指定が出来る様になっています。つい最近までV5R4を使用していたので知りませんでした。
これにより、コンパイル時に暗黙の参照設定が不要になり、ビルドツール等で一括コンパイルする時などは、ライブラリの条件を気にしなくて済みそうです。

```RPG:USR405.rpgle
     H****************************************************************
     H*-------------------------------*
     H*----<<日付・著作権    >>-----*
     H*-------------------------------*
     H DATEDIT(*YMD)
     H COPYRIGHT('(C) ushiday - ')
     H*-------------------------------*
     H*----<<コンパイル条件  >>-----*
     H*-------------------------------*
     H DFTACTGRP(*NO) ACTGRP(*NEW)
     D*実ファイルを参照する為に、コンパイル時にＬＩＢＬやＯＶＲＤＢＦで暗黙の参照が必要
     D REC1          E DS                  EXTNAME(ITEM : *INPUT)
     D                                     QUALIFIED
     D*これよりＶ６Ｒ１より指定可能
     D REC2          E DS                  EXTNAME('ITEM' : *INPUT)
     D                                     QUALIFIED
     D*リテラルでライブラリ指定が可能。暗黙の参照は不要
     D REC3          E DS                  EXTNAME('USHIDA/ITEM' : *INPUT)
     D                                     QUALIFIED
     C*-------------------------------*
     C*----<<メインルーチン  >>-----*
     C*-------------------------------*
      /FREE

           EXSR @END  ;

           //終了
           BEGSR   @END   ;
               *INLR = *ON    ;
               RETURN        ;
           ENDSR         ;

      /END-FREE 
```
意図的にメモリリークを起こすためのPHP組み込み関数

小ネタですが、カレンダーの穴埋めということで。

あまり知られていませんが、PHPには次のような組み込み関数が用意されています。

> ### leak
> (PHP >= 5.0.0 ?)
> 
> ```php
> void leak( [int $num_bytes = 3] )
> ```
> 
> $num_bytesのメモリ確保を行う（勝手には解放されないのでメモリリークになる）

> ### leak_variable
> (PHP >= 5.4.0)
> 
> ```php
> void leak_variable(mixed $variable [, bool $leak_data = false] )
> ```
> 
> $variableの参照カウントを増やす（勝手には減らないのでメモリリークになる）


といっても、この関数は大半の人の手元では動かないと思います。これはPHPを`--enable-debug`つきでビルドしたときだけ有効になります。


```
$ php -v
PHP 5.6.15 (cli) (built: Dec  8 2015 08:29:42) (DEBUG)
Copyright (c) 1997-2015 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2015 Zend Technologies
    with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2015, by Zend Technologies
    with Xdebug v2.3.3, Copyright (c) 2002-2015, by Derick Rethans
$ php -r 'leak();'
[Tue Dec  8 08:44:41 2015]  Script:  '-'
/var/tmp/php-build/source/5.6.15-debug/Zend/zend_builtin_functions.c(1443) :  Freeing 0x10319E0A8 (3 bytes), script=-
=== Total 1 memory leaks detected ===
$
```


このように、`leak`関数を呼び出すと`--enable-debug`で有効になるメモリリーク検出機構が働いて、どんなメモリリークが起きたか教えてくれるというわけです。


この関数はメモリマネージャの改造をしたりするときに便利らしいです（moriyoshiさん談）。
Kinesis Client Libraryを実案件でつかってみて

# Kinesis Client Libraryをつかってみて

## Kinesis Client Library(KCL)って？
Amazon Kinesisはストリーム処理を行うことができるサービスで、
Kinesis StreamはMessage Queueのような働きをします。
Kinesis Client Libraryは、Amazon Kinesisを利用する上で気を付けなければいけない部分を薄くラップしてくれる便利なライブラリです。

Checkpointを利用したデータのトランザクション処理、再送処理や、
リシャーディングにあわせた処理の並列化などをサポートしてくれます。

[詳細はこちら ⇒ Kinesis Client Library](https://docs.aws.amazon.com/ja_jp/kinesis/latest/dev/developing-consumers-with-kcl.html)

## 実案件で感じたKinesisを使うメリット


1. データを取得するConsumer側のペースにデータの流入を調整できるため、バックエンドの負荷を調節しやすくなった。 
 もともと、秒間数千アクセスを10台以上で捌いていたが、導入後は、4台でさばけるようになった。

2. 安い小規模なデータストリームだとかなり安いと思います。

## デメリット

サービスなのでもし通信障害になるとどうしようもなくなる。
producer側も何かしらの方法でデータの再送などを検討する必要がある。


## めんどくさいところ

1. シャードの数をコマンドでしか変更できないため、自分でsplitしてあげないといけない。
shardのsplitやmergeが実行あれるとき、Kinesisのデータを取得できなくなる。
この間は、数分かかることもあるのできをつけないといけない。（バッチの時間に間に合わないとかならないように）
[kinesis-scaling-utils](https://github.com/awslabs/amazon-kinesis-scaling-utils)を利用すれば、Shardのsplit, mergeを自動で実行してくれます。
ただし、Shardの数の変更中(UPDATEING)は、KCLのStreamからのデータの取得が
停止しますので、そこを注意する。


2. シャードの数=データのキャパシティ+並列度
1秒間に1MB以上を投入し続けるのは結構な負荷がかかっている状況です。
秒間3000とかならshard数１～２でもやっていけます。
ですが、Shard一つに対してConsumerプロセスが一個あてがわれるため、
このプロセスが秒間に1MB以上捌けないと、データの内容がどんどん遅れていくことになります。1秒間でどれくらいさばけるのかもShardの数を決定する基準になるかも？
（そんな重い処理はしないですかね・・・）

## データの重複について

データの重複は、Kinesisを使っていると簡単に発生します。
１Shardにつき秒間500 ~1000ほどのレコードを捌いていますが、
このデータリストのDBへの書き込みに失敗するとか・・・。
バックエンドのシステムの経路に障害が発生して伝送できないとか・・・。
こういったことが起こると、kinesisから取得したデータのリスト丸々を再送するのか、どうかといったエラーハンドリングが必要になる。
kinesisのshardからは、リストで取得するため、フィルタリングをしっかりしないと、すべてのデータがエラーに巻き込まれていきます。

## 重複データの対策
今回は、kinesisに投入されるデータにユニークなKeyを追加して流し、バックエンドのHive/prestoでgroup byをすることでデータの重複を無理やりなくす方法にしました。
データの再送を許可し、Hadoop/prestoにDISTINCT的な処理をさせることで、重複してしまったデータが存在しても集計が正しくなるようにしました。
重複をしないアーキテクチャを考え、実装するよりもあとから重複をなくすほうがよっぽど楽です。prestoやHiveが数千件のリクエストログがふえたところでなんてことない。
ただし、データの順序が必要だったり、過去データからの累積を行っているようなデータには使えませんが・・・。

## その他
Kinesisには直接関係ないのですが、ELBもやはり裏はEC2だからなのか、突然、
HealthCheckの挙動がおかしくなることがあるようです。
バックエンドがまったく正常なのに１～２分ほどELBが5XXステータスを返し、
データがまったく送信できないときがありました。
ELBも冗長化するべき？

## Kinesis クライアントってEC2とLambdaどっちがいいの？
最近、簡単な集計処理、ストリームデータのS3バケットへ配置処理などはLambdaで行っています。
感覚的に、よっぽどな高速なレスポンスが必要でない限りはLambdaで十分やっていけてます。
EC2の方がtmpファイル的なものを作りやすいことでしょうか。（単位時間データを種類ごとにファイルに書き出しておくとか）

・実装が楽
・冗長化考えなくていい
・でも、出力ファイルがバラバラになりがち


## まとめ
- Kinesisを利用するなら、KCLをおすすめ。
- [kinesis-scaling-utils](https://github.com/awslabs/amazon-kinesis-scaling-utils)　shardのスケーリングするのにおすすめ
- エラーハンドリングがめんどくさい
高画質のためのモダンなjpeg圧縮。フリーなmozjpegフロントエンド(Win/Mac)

# はじめに
複数のjpegをなるべく高画質・少サイズでエンコードするGUIアプリ（フリーソフト）を紹介。
アプリ立ち上げから完了まで１分も掛かりません（6000x4000程度の画像１枚なら）。
可逆圧縮もOK。

# 経緯

ホームページの通信量削減・表示高速化に画像圧縮が有効とは、最早語るまでもない話。
で、既に設置されているページの画像（しかも解像度も圧縮率も全く考慮されてないデブ）を一括変換する良い手段はないものかと考えてた時に出会ったのがjpegライブラリ、その名もmozjpeg。

[mozilla/mozjpeg - GitHub](https://github.com/mozilla/mozjpeg)

[mozilla.jp 新しい JPEG エンコーダ「mozjpeg」プロジェクトを開始します](http://www.mozilla.jp/blog/entry/10384/)

そいやニュースサイトでMozjpegの記事やってたなーと思い出す。

[JPEGをさらに高圧縮する「mozjpeg 2.0」で2GB超の画像ファイルを圧縮](http://gigazine.net/news/20140730-experimenting-mozjpeg-2-0/)

当方では複数のファイルを一括処理をしたかったので、ローカル環境で一括圧縮できるものを探してた。そこでWindowsとMacで利用できるGUIのmozjpegフロントエンドを見つけたのでご紹介。

# Windows - Antelope
[Voralent Antelope](https://boldright.co.jp/products/antelope/)
![test1.png](https://qiita-image-store.s3.amazonaws.com/0/23318/80542090-63f6-858f-2256-ceeff047ab0d.png)
![test2.png](https://qiita-image-store.s3.amazonaws.com/0/23318/2f1eb832-1fb7-44c0-d948-423f76797ecc.png)
## 所感
- UIが独特だけど、そんな使いづらくもない。
- デフォルトでは可逆圧縮。だいたい10%以上は減る。
- 非可逆圧縮の圧縮率目安が従来の1-100ではなく、「最適化レベル」という名称で1-9を選択可能。以下からは画質の目安。
 + Lv9で95
 + Lv6で80
 + Lv3で70
- PNG、GIFも対応（無論別のライブラリ）。


# Mac - ImageOptim
[ImageOptim](https://imageoptim.com/)

![スクリーンショット 2015-12-08 08.07.19.png](https://qiita-image-store.s3.amazonaws.com/0/23318/b1718edb-ad96-dc7d-b4b3-5f0ba51367c2.png)

## 所感
- 超シンプル。御用達感ある。1.6からmozjpegに対応しました。
- 圧縮率は40-100を10ステップで選択できる。
- デフォルトでは可逆圧縮。だいたい10%以上は減る。
- PNGも対応。
- ライブラリ2つあるけどmozjpegだけ使いたい！てーかこれ本当に使ってるの？ とおっしゃる潔癖な御仁は、環境設定からJPEGOptimだけを無効化しよう。

# 共通の所感
- 可逆圧縮は10%ほど減る。デジカメフォルダの容量削減などに便利。夜間に突っ込んで放置しとこう。
- EXIFも削除可能。
- Web用途であれば非可逆圧縮を使おう。自分の目では、従来の圧縮率を20%ほど減らしても画質を保ってる気がする。
- 特に超低圧縮率で顕著。アプリ開発者は試して見ると良い。
- Retina対応を考慮したWeb画像なら、画質60（AntelopeでいえばLv4）程度でも問題ない（気がする）。人類の目はRetinaディスプレイに表示されたjpegノイズを視認できるまでには至らないようだ。
Macbook 12inch にまだLinuxを簡単にインストールできなかった

この記事はLinux Desktop Advent Calendar 2015の1日目です。

## 2017/3/21追記

インストールできるっぽい？

* [LinuxをインストールしたTouch Bar搭載のMacBook Pro Late 2016で利用できる/出来ない機能まとめ。 | AAPL Ch.](http://applech2.com/archives/20170219-state-of-linux-on-the-macbook-pro-2016.html)
    * https://github.com/cb22/macbook12-spi-driver
    * https://github.com/Dunedan/mbp-2016-linux

## 参考

* [Bug 99891 – Macbook8,1 12-inch (Early 2015) keyboard and trackpad don't work](https://bugzilla.kernel.org/show_bug.cgi?id=99891)
* [New MacBook (12 inch) and Linux | sunagæ.net](http://sunagae.net/blog/archives/3112)

## キーボード、トラックパッドが反応しなかった

* [manjaro-xfce 15.12-rc1](http://manjaro.github.io/download/) 
* [archlinux2015.12.01](https://www.archlinux.org/download/)
* [Ubuntu Server 16.04 (Xenial Xerus) Daily Build](http://cdimage.ubuntu.com/ubuntu-server/daily/current/)
* [Ubuntu 16.04 (Xenial Xerus) Daily Build](http://cdimage.ubuntu.com/daily-live/current/)

USB HUBとUSBキーボード、マウスが必要。内蔵無線LANも認識せず。
他の人が何をやっているのか分かるツールを作った話

コミュニケーションアドベントカレンダー８日目の記事です。

[前回の記事](http://qiita.com/numa08/items/2fbcbf91012c7dd49ab5)で、私達のチーム は[toggl](https://www.toggl.com)を利用してタスクの計測を行っていることを紹介しました。

![e436ba2e-fb65-d8e6-5e3d-3039fae58ec1.png](https://qiita-image-store.s3.amazonaws.com/0/6756/b200d18f-abb6-9d2e-eb09-b7915f567ffb.png)

自分のタスクにかかった時間が表示されて便利です。

toggl ではサマリーとして他のチームメンバーも含めて指定した期間中にタスクをどれくらいの時間をかけて行ったのかを出力する機能があります。

しかし、リアルタイムに他のチームメンバーが何をやっているのか表示する機能はありませんでした。

というわけで、作りました。

[numa08/toggl-board](https://github.com/numa08/toggl-board)

## 使い方

[ ![Download](https://api.bintray.com/packages/numa08/generic/toggl-board/images/download.svg) ](https://bintray.com/numa08/generic/toggl-board/_latestVersion)

↑から利用しているOS向けの、最新のバイナリをダウンロードし実行するだけです。 electron 最高。

![](https://raw.githubusercontent.com/numa08/toggl-board/develop/static/cap.gif)

起動したら、 `Add User` をクリックしチームメンバーの API-TOKEN を入力するだけです。簡単。

![ss3.JPG](https://qiita-image-store.s3.amazonaws.com/0/6756/3b9dacd3-8220-81a5-17be-8567dc0694c8.jpeg)


私達のチームでは余っている Mac Book Pro があったので、その中でずっと起動させています。また、`http://<動いているマシンのホスト名,IPアドレス>:9000/ss`にアクセスをすればスクリーンショットを見ることもできるので、確認する必要があるときに自分のマシンから離れる必要がありません。

## どうなったか

他のメンバーが何をやっているのかが一目でわかるのは面白いです。ちょっとトイレとかに立った時に、チラっと確認をすることで例えば[お茶会](http://qiita.com/mironal/items/57bce49a297eeec5b37e)のときに、また普通に相談をするときに「今、これをやってるんだけど」と一言だけで共有ができるので、スムーズです。

## その他の機能

~~現在、全員のタスクを止める・スタートするといった機能が実装中です。~~ [実装されました](https://github.com/numa08/toggl-board/pull/3)

また、他にも便利な機能をどんどん乗せたいので、PRをお待ちしております。

## まとめ

私達のチームで利用している `toggl-board` と、その利用風景を紹介しました。他のメンバーが何を行っているのかを明確にできるので、コミュニケーションコストが下がる効果があると思います。
【Objective-C】sqliteデータベースファイルをXcodeプロジェクトに埋め込む方法

+ sqliteの導入方法は割愛

# 概要

毎回create databaseをやるのは面倒なので、sqliteファイルを初回起動時から既に用意しておく

# 前提

+ DBを使用するケース
+ sqliteファイルを初回起動時アプリ内に内包するため、ソース内からcreate databaseしない

# 手順

+ sqliteファイルを作成する
+ Xcodeのソースツリーにsqliteファイルをドロップし登録する
+ プロジェクト名 → Target → Build Phases → Link Binary With Librariesから該当のsqliteファイルを登録する
+ sqliteファイルオープン処理でdocumentフォルダにsqliteファイルをコピーする処理を記述する

以下記述例

```SqliteManager.h
#import <Foundation/Foundation.h>
#import <sqlite3.h>
#import "FMDatabase.h"

@interface SqliteManager : NSObject

+ (BOOL) createDb;

```

```SqliteManager.m
#import "SqliteManager.h"

@interface SqliteManager()

@end

static NSString* const DB_FILE = @"/app.sqlite";

@implementation SqliteManager

+ (BOOL)createDb {

    // document配下にパスを取得
    NSString *dbPath = nil;
    NSArray *documentsPath = NSSearchPathForDirectoriesInDomains
    (NSDocumentDirectory, NSUserDomainMask, YES);
    // 取得データ数を確認
    if ([documentsPath count] >= 1) {
        dbPath = [documentsPath objectAtIndex:0];
        // DBへのフルパスを生成。
        dbPath = [dbPath stringByAppendingPathComponent:DB_FILE];
        NSLog(@"DBPath : %@", dbPath);
    } else {
        //errorの場合
        NSLog(@"database file open error.");
        return NO;
    }
    
    // DBファイルがDocument配下に存在するか判定
    NSFileManager *fileManager = [NSFileManager defaultManager];
    if (![fileManager fileExistsAtPath:dbPath]) {
        // アプリケーション内に内包したDBファイルをコピー(初回のみ)
        NSBundle *bundle = [NSBundle mainBundle];
        NSString *orgPath = [bundle bundlePath];
        // 初期ファイルのパス
        orgPath = [orgPath stringByAppendingPathComponent:DB_FILE];
        
        // アプリケーション内に内包したDBファイルをDocument配下へコピーする
        if (![fileManager copyItemAtPath:orgPath toPath:dbPath error:nil]) {
            //error
            NSLog(@"db file copy failed. : %@ to %@.", orgPath, dbPath);
            return NO;
        }
    }
    
    return YES;
}
```

# 補足

FMDBライブラリを利用しない場合も同様。
RPi > PLANEXのGW-USNANO2A > 2.4GHで混線している

```txt:動作環境
Raspberry Pi2 + raspbian
```

PLANEXのGW-USNANO2AでWi-Fi接続できるようになったが、SFTP接続するまで時間がかかる。
有線接続に変更するとSFTP接続はすぐにつながる。

Wi-Fi設定時に気になっていたのは、2.4GHzのバンドしか選択できない点。

PLANEXの製品仕様を見ると、確かに2.4GHzのみの製品だった。

過去に2.4GHzで混線する理由から5GHz使用に変更した経緯があり、同様の問題が発生しているようだ。
2.4GHzで混線しない環境では有用だが、別途5GHzで使用可能な省電力WiFiドングルを探す必要がありそうだ。


<hr>
下記に5GHzの製品を使った例がある。カーネルのビルドをしないといけない。

http://neuralassembly.blogspot.jp/2015/09/raspberry-pi-2-kernel-416-5ghzwifigw.html