OmniAICreator/Qiita-1.07M huggingface dataset:
Xcodeが複数バージョンある環境でのCarthageのビルドエラー対応

## TL;DR

Carthage内部のコマンドで参照される`xcodebuild`のバージョンを、対象プロジェクトが対応しているXcodeのバージョンに切り替えるとエラーがなくなりました。

```
$ sudo xcode-select -switch /Applications/Xcode_7.3.1.app/Contents/Developer
```

実行後は切り替わっているか確認する。

```
$ xcode-select -p
/Applications/Xcode_7.3.1.app/Contents/Developer
```

設定が残り続けるので用が済んだら戻しておくと安心そうです。

```
sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer
```

## エラーの詳細

今回は、Xcode8をインストールした状態でXcode7のプロジェクトをCarthageを使って依存解決しようとしてエラーが出ました。

```
$ carthage update --platform iOS

*** xcodebuild output can be found in /var/folders/pc/k0zgdyzj7vq_c9vcdngw4pr00000gn/T/carthage-xcodebuild.9dVuv2.log
*** Building scheme "Alamofire iOS" in Alamofire.xcworkspace
2016-10-23 22:30:58.726 xcodebuild[55081:11358256] WARNING: Failed to load plugin at path: "/Users/hoge/Library/Application Support/Developer/Shared/Xcode/Plug-ins/BBUDebuggerTuckAway.xcplugin", skipping. Error: Error Domain=NSCocoaErrorDomain Code=3587 "dlopen_preflight(/Users/hoge/Library/Application Support/Developer/Shared/Xcode/Plug-ins/BBUDebuggerTuckAway.xcplugin/Contents/MacOS/BBUDebuggerTuckAway): no suitable image found.  Did find:
	/Users/hoge/Library/Application Support/Developer/Shared/Xcode/Plug-ins/BBUDebuggerTuckAway.xcplugin/Contents/MacOS/BBUDebuggerTuckAway: mmap() error 1 at address=0x11CFC7000, size=0x0000D000 segment=__TEXT in Segment::map() mapping /Users/hoge/Library/Application Support/Developer/Shared/Xcode/Plug-ins/BBUDebuggerTuckAway.xcplugin/Contents/MacOS/BBUDebuggerTuckAway" UserInfo={NSLocalizedFailureReason=The bundle is damaged or missing necessary resources., NSLocalizedRecoverySuggestion=Try reinstalling the bundle., NSFilePath=/Users/hoge/Library/Application Support/Developer/Shared/Xcode/Plug-ins/BBUDebuggerTuckAway.xcplugin/Contents/MacOS/BBUDebuggerTuckAway, NSDebugDescription=dlopen_preflight(/Users/hoge/Library/Application Support/Developer/Shared/Xcode/Plug-ins/BBUDebuggerTuckAway.xcplugin/Contents/MacOS/BBUDebuggerTuckAway): no suitable image found.  Did find:
	/Users/hoge/Library/Application Support/Developer/Shared/Xcode/Plug-ins/BBUDebuggerTuckAway.xcplugin/Contents/MacOS/BBUDebuggerTuckAway: mmap() error 1 at address=0x11CFC7000, size=0x0000D000 segment=__TEXT in Segment::map() mapping /Users/hoge/Library/Application Support/Developer/Shared/Xcode/Plug-ins/BBUDebuggerTuckAway.xcplugin/Contents/MacOS/BBUDebuggerTuckAway, NSBundlePath=/Users/hoge/Library/Application Support/Developer/Shared/Xcode/Plug-ins/BBUDebuggerTuckAway.xcplugin, NSLocalizedDescription=The bundle “BBUDebuggerTuckAway” couldn’t be loaded because it is damaged or missing necessary resources.}

...  

** CLEAN FAILED **


The following build commands failed:
	Check dependencies
(1 failure)
** BUILD FAILED **

...
```

上記のログ上部にある`/var/folders/pc/****`というログにアクセスすると、以下のコマンドがCarthage内部で実行されていることが分かります。

```
/usr/bin/xcrun xcodebuild
```

使用される`xcrun`自体のパスを切り替える変数はCarthageにないようなので、記事冒頭に書いた`xcode-select`で`xcrun`が呼び出す`xcodebuild`のパスを切り替えるのが良さそうです。

## 参考リンク

- [Xcode6とXcode7が共存する環境でCarthageのビルドがエラーになる](http://qiita.com/y_some/items/34336c987cfa65772da3)
dockerでセキュアなUbuntuイメージを作成する

# はじめに
これはおそらくDockerの思想からはかなり外れた運用です。また、間違ってるところやバッドノウハウもあるかもしれません。

## 動機
自宅サーバの運用で、可搬性等の観点からDockerの「Infrastructure as Code」の概念に惹かれてLXCをDockerに移植し始めました。
しかし、途中で「このubuntu:xenialイメージは思考停止でpullしてるけれども安全なのか？」と言った点が気になり調べてみたところ、同じような問題提起をしている方がいらっしゃいました。
[Dockerの諸問題とRocket登場の経緯](http://deeeet.com/writing/2015/02/17/docker-bad-points/)

そこで、セキュアな環境を作成するために、一切のDockerHubとの通信を遮断した環境でもビルドできるイメージを目指し、一から（ubuntu.comからのみ取得できるイメージから）Ubuntuイメージを作成しました。以下はその作業メモです。

## 突っ込みどころ
- なぜUbuntu
    - 慣れてるからです。
- イメージファイルのサイズが大きい
    - 仕様です。先述した通りLXCからの移行かつDockerHubは用いないため、LXCのイメージと比較して同等ならば良いのです。

# やりかた
以下のスクリプトによりubuntu-xenialというイメージでUbuntu 16.04のイメージが出来ます。

```bash:makeimage-ubuntu-xenial.sh
cd /tmp
mkdir -p baseimage
cd baseimage
wget https://cloud-images.ubuntu.com/xenial/current/xenial-server-cloudimg-amd64-root.tar.gz
wget https://cloud-images.ubuntu.com/xenial/current/MD5SUMS
if [ -z "`cat MD5SUMS | grep xenial-server-cloudimg-amd64-root.tar.gz | grep \`md5sum xenial-server-cloudimg-amd64-root.tar.gz | awk '{ print $1 }'\``" ]; then
        echo "checksum error"
        return 1
fi
cat xenial-server-cloudimg-amd64-root.tar.gz | docker import - ubuntu-xenial
cd ../
rm -r baseimage
```

# 備考
DockerHubを完全に信頼しない場合、 `/etc/hosts` に以下を記述することで通信を暫定的に（結果的に）遮断できます。

```bash:/etc/hosts
127.0.0.1       registry-1.docker.io
127.0.0.1       registry-2.docker.io
127.0.0.1       registry-3.docker.io
127.0.0.1       registry-4.docker.io
127.0.0.1       registry-5.docker.io
```

# 最後に
DockerHubを完全に信頼しないわけではないですが、参考文献にも述べられていますがヒューマンエラー、例えばtypoにより意図しないイメージがローカルに展開されるリスクは十分考えられます。また、プライベートなイメージを間違えてpushしてしまう可能性も皆無とはいい切れません。

そういった細かい点を気にせず思う存分Dockerを使うために、個人的にやっておくべきかなと思った点が以上のようなことになります。

# 参考文献
[Dockerの諸問題とRocket登場の経緯](http://deeeet.com/writing/2015/02/17/docker-bad-points/)
【メモ】NeoBundleからdein.vimでtoml読もうとしたら嵌った【備忘録】

先日 vimのプラグインをvimrc書き込みのNeoBundleからdein.vimへ移行しました
プラグインを整理するためにtomlへ乗り換えました

さまざまなサイトのvimrcを参考にしつつvimrcを書き上げました！
さあdeinの時代の幕開けだ！と思い起動したのですがdeinを読み込みtomlを読もうとした瞬間にエラー

しかも```[[plugins]]```の時点でエラー吐きました

記述が間違っているのかと見直しましたが問題ない
エンコード・・・utf-8になっている・・・
と確認しながら延々やっていたわけですが
bomb切ったら直りました

bombまでは気がつきませんでした

結論
utf-8でもbombつきではdein.vimはtoml読んでくれない

toml書いたけどdeinが読んでくれない人は一度bombの設定確認してみることをお勧めします
芝の色分けを細分化

開発でgithubの芝みたいなのをさらに値ごとに細分化して表示するっていうのをやりました。
# react-calendar-heatmapを使いました

ソースコードはこちらです。
[https://github.com/patientslikeme/react-calendar-heatmap](https://github.com/patientslikeme/react-calendar-heatmap)

```js
<CalendarHeatmap
  values={[
    { date: '2016-01-01', count: 1 },
    { date: '2016-01-03', count: 4 },
    { date: '2016-01-06', count: 2 },
    // ...and so on
  ]}
  classForValue={(value) => {
    if (!value) {
      return 'color-empty';
    }
    return `color-scale-${value.count}`;
  }}
/>
```

```css
.react-calendar-heatmap .color-scale-1 { fill: #d6e685; }
.react-calendar-heatmap .color-scale-2 { fill: #8cc665; }
.react-calendar-heatmap .color-scale-3 { fill: #44a340; }
.react-calendar-heatmap .color-scale-4 { fill: #1e6823; }
```

ここまでだとgithubこんな感じ
<img width="603" alt="スクリーンショット 2016-10-25 0.47.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/129548/e738b62a-2903-e11b-51eb-2966ac8a4e29.png">
引用元：[http://patientslikeme.github.io/react-calendar-heatmap/](http://patientslikeme.github.io/react-calendar-heatmap/)

これをさらに変数を二つにして、
二段階に色分けを細分化します。

```fruits-color.js
<CalendarHeatmap
  values={[
    { date: '2016-10-01', fruit: "apple", color: "red" },
    { date: '2016-10-03', fruit: "apple", color: "blue" },
    { date: '2016-10-06', fruit: "apple", color: "orange" },
    { date: '2016-10-10', fruit: "grape", color: "perple" },
    { date: '2016-10-09', fruit:"grape", color: "green" },
    { date: '2016-10-07', fruit: "apple", color:"red" },
    { date: '2016-09-15', fruit: "apple", color: "blue" },
    // ...and so on
  ]}
  classForValue={(value) => {
    if (!value) {
      return 'color-empty';
    }
    return `color-${value.fruit}-${value.color}`;
  }}
/>
```
```fruits-color.css
.react-calendar-heatmap .color-apple-red{
  fill: #FD151B;
}
.react-calendar-heatmap .color-apple-blue{
  fill: #1B2CC1;
}
.react-calendar-heatmap .color-apple-orange{
  fill: #FE7F2D;
}

.react-calendar-heatmap .color-grape-perple{
  fill: #8661C1;
}
.react-calendar-heatmap .color-grape-green{
  fill: #98CE00;
}
```
こんな感じです。
<img width="1187" alt="スクリーンショット 2016-10-25 0.56.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/129548/82367372-66df-4483-162d-59c46b45188d.png">

実際の開発では、基本的な色とその濃淡で色分けしました。

<hr>

本当はこれの２列分で隙間なくきれいに１日分で表示するのをやりたいのですが、模索中です。
Java8のStreamの出力をGroovyで覗いてみる

# TL;DR
Java8のStreamの遅延評価を直接覗いてみる。それだけ。

# thanks for
<a href="http://d-cube.connpass.com/event/42933/">ラムダ使えますか？ゆるふわJava8入門</a>
(Java8のStreamをよく使うインタフェースとメソッドに絞って解説してもらった)

<a href="http://qiita.com/saba1024/items/2c2bf9fd11271ce7e563">[Groovy]GroovyからJava8のstreamを利用する。</a>
(GroovyでStream使う方法はこちらから)

# 必要物
* Groovy
* groovyshの対話環境が動く何か

# Stream化
## GroovyでのList表現

```groovy
(1..10)
//===> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
```

## ListをStream化する
※StreamはListにJavaのメソッドを作用させるための下準備。

```groovy
(1..10).stream()
//===> java.util.stream.ReferencePipeline$Head@43b9fd5
```
なにやらオブジェクト化された。

## ListのStream化を解除する
collect()メソッドを使う。

```groovy
(1..10).stream().collect()
//===> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
```

これで中身が見れる。lamdaの世界では終端処理と言うらしい。
collect()を噛ませて初めて式が評価されるので、遅延評価になっている。

# Filter
## Filterを掛ける

```groovy
(1..10).stream().filter{ it % 2 == 0 }
//===> java.util.stream.ReferencePipeline$2@1b84f475

(1..10).stream().filter{ it % 2 == 0 }.collect()
//===> [2, 4, 6, 8, 10]
```

2でmodとって0になる物だけfilterできた。

# Map
## 各々に写像(map)を噛ませる

```groovy
(1..10).stream().map{ it -> it + 1 }
//===> java.util.stream.ReferencePipeline$3@53de625d

(1..10).stream().map{ it -> it + 1 }.collect()
//===> [2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
```

# 関数の連鎖
## Filter & Map

```groovy
(1..10).stream().filter{ it % 2 == 0 }.map{ it -> it + 1 }
//===> java.util.stream.ReferencePipeline$3@289710d9

(1..10).stream().filter{ it % 2 == 0 }.map{ it -> it + 1 }.collect()
//===> [3, 5, 7, 9, 11]
```

collect()で終端処理をして初めて値が評価される。
就職活動までにやっておいた方がいいこと（Web系）

# 就職活動まで何すればいい
就職活動がもうすぐ始まるということで、今まで色々自分がやってきて、これはやってよかったなとか、これやっておいたら良かったなどを1年前の自分は結構知りたかったということもあり、書き残してみました。
※私が思いっきりWeb系の人間なので、志望業界が違うと参考になりません。

[就職活動を早くやってよかったこと（Web系）](https://qiita.com/pei0804/items/19ffb8aefeadb37a8bd1#_reference-84f2bee84b332dd1ccb4)
そもそも、就職活動っていつごろからしたらいいのっていうのは、上の記事に書いてます。

## 私のステータス
まず、こんな人がこういう風に準備してたというのが分かるように、私の自己紹介を軽くしたいと思います。

- 専門学校HAL　4年制3年生（18卒）
- 学校入るまで全くのプログラム未経験
- 数学が苦手科目
- 地方学生
- エンジニア志望

以上のような感じです。一言で言えば普通の人です。

## 理解しておきたいこと

### HTTP
どんな言語をやるにしても、HTTPの理解は非常に重要です。また、今後複数の言語をやるつもりがあるなら、HTTPを先に理解した方がいいレベルです。私の場合はこの技術の理解のおかげで様々な言語をすんなり理解が出来ました。

### 型
言語によりますが、PHPなどではこれをあまり理解しなくてもなんとなくで出来てしまうので、理解をした上で文字列を扱う。数値を扱うにするだけで、バグは相当減ります。

### 値型、参照型
変数への代入や参照が一体どうなってるのかなどを考えるだけでも面白いですし、絶対必要な知識なので、しっかり押さえておきたい知識のひとつです。

### データベースの正規化、SQL
色々なインターンに参加して思ったのが、意外と正規化が出来ない人が多いです。どれだけプログラムが上手に組めたとしても、データがどうやって扱われるのかを理解していないと、サービスを作ることが満足に出来ません。慣れれば出来るので是非マスターしておきたい。

### クラス
様々な言語である考えです。完璧に理解をしてそれをコードにするのは正直難しいので、どういう考えでどうやって書くのかくらいは理解しておくと、業務に入る機会があっても、何も出来ないということはないと思います。

### フレームワークとピュアな状態の両方
最近では、あれこれ脳みそを働かせなくても、簡単にそれっぽいアプリケーションを作れます。実務ではフレームワークがほとんどなので、扱えることはもちろん大事ですが、ピュアな状態で同じような動きをするにはどうすればいいのか？はやはり理解しておくべきだと思います。

### セキュリティ
私もすごく出来るというわけではありませんが、XSS、CSRF、SQLインジェクション、他にもたくさんありますが、挙げた攻撃は最低限理解をしておいた方が安易なミスで攻撃を受けるリスクはグッと下がります。

### Git
やろう。

## やっておくと幸せになれる活動

### インターンシップ
絶対に参加することをおすすめします。自分はこの経験で大きく変わりました。ちなみに私が行ったインターンシップは以下のような感じです。今回は簡単に印象に残っていることを書きます。
詳しい体験記については、参加しているインターン全てが終わったら書こうかなと考えています。

### VOYAGE GROUP 1Dayインターン GO + Github
全く何もできなかった。GitもGoも初体験で死にかけたのだけ覚えてます。

#### [Fringe81　Fringeneer 武者修行](http://www.fringe81.com/recruit/summer2016/engineer_intern.html)
なんとなくの理解のまま放置をしてはいけない。
モノづくりにおいてのコミュニケーションとスケジューリングの重要性。

#### [VOYAGE GROUP Treasure](https://voyagegroup.com/internship/treasure/)
チーム制作、サービスの開発の難しさと面白さ。
考えて考え抜いた先にある答えに辿りついた時の達成感。

#### [サイバーエージェント REAL X WORK](https://www.cyberagent.co.jp/recruit/fresh/real/event/contents_type=751)
本格的な業務経験。現場の空気感など。
他のインターンとは違い。その時々に合わせた仕事が与えられるので、すごくリアルです。

以上のような感じですね。とにかく、どれも自分にとって大きな影響を与えてくれました。インターンシップ前の自分と今の自分は相当違うと実感出来るくらい圧倒的に変われますし、モチベーションも上がります。

### 面談イベント
Web系の就職活動は非常に早いです。
3年生の5月くらいからインターンシップの選考を含めた面談イベントが活発になります。
インターンシップに参加出来るかどうかは置いといて、まずは面談イベント行きましょう。
自分が使っていたサービスを以下にまとめておきます。
※地方学生の交通費問題を解消してくれるので、絶対使うべきです。

- [サポーターズ](https://supporterz.jp/)
- [逆求人](https://www.studenthunting.com/)
- [キャリアセレクト](https://careerselect.jp/)

### なんでもいいのでリリースする
本当に何でもいいので、リリースして世に発信する経験はしておくことをおすすめします。
私はポートフォリオをWordpressでカスタムテーマを作成して、それをRaspberryPiで動かし、DDNSを使ってドメインと関連付けさせて公開をしたりしました。今もiOSアプリのリリースに向けて開発中です。
なんでやった方がいいかというと、リリースするには色々な障壁があって、強制的に様々な分野の勉強しないといけない環境ができあがるからです。

### 基本情報技術者
取得すると給料が上がるなどの制度も一部あるらしいですが、そんなことよりも、自分の知識の穴埋めが出来るので、やって損はないと思います。

### おまじないを減らす
インターンに行ってから、これを癖付けるようになったのですが、今まで書いていたおまじない的なコードってあると思います。これを少しずつでいいので、減らしていくと結構知識レベル上がるので、早めからやっておくと良いと思います。

## まとめ
人には人の正解の準備方法があると思いますので、これが就職活動を控えている人の何人かに役に立てばと幸いです。
ウィキデータの紹介#8

# クエリ・サービス
ウィキデータの左サイドメニューにある「Query Service」を選ぶと、SQL感覚でウィキデータ内のデータを操作し、様々な形式で出力することができます。
![query_service.png](https://qiita-image-store.s3.amazonaws.com/0/35320/e8d105ae-189e-9a92-32aa-73c59deaa002.png)

クエリ・サービスの画面です。上半分でクエリを書いて「実行」すると、下半分に結果が表示されます。
![Wikidata Query Service.png](https://qiita-image-store.s3.amazonaws.com/0/35320/7791f148-a3f2-1e5e-840e-a7e93caaa1d5.png)

サンプルのクエリをいくつか試してみましょう。画面上部左寄りの「例」をクリックすると豊富なサンプルが用意されています。

![Wikidata Query Service_sample.png](https://qiita-image-store.s3.amazonaws.com/0/35320/7b4e66a2-9dde-3ea8-8f84-1419edac7047.png)

まずはひとつ目の「Cats」を選んでみましょう。

![Wikidata QueryService_1.png](https://qiita-image-store.s3.amazonaws.com/0/35320/6e3fc1df-dbe4-1d58-3e86-90b219975868.png)

上半分にクエリがセットされ、右側には項目やプロパティの名前を使っておおよそどのようなクエリか分かるようになっています。「分類」プロパティに「ネコ」がセットされている項目を抽出する、というクエリだと思います。たぶん :) とりあえず「実行」ボタンを押してみましょう。

![Wikidata Query Service2.png](https://qiita-image-store.s3.amazonaws.com/0/35320/c3f1a2fa-05c7-84d2-0a7c-b6269eea2afe.png)

そうすると左側の列に項目の識別子が、右側の列にそのラベル（ネコの名前）が表形式で表示されました。これらはおそらく著名なネコなんでしょうね。

![download.png](https://qiita-image-store.s3.amazonaws.com/0/35320/23907199-ea76-a6d4-3b14-299d839e388e.png)

右上の「ダウンロード」ボタンで、この結果を様々な形式でダウンロードすることができます。

英語だとわかりづらいのでなんとなく雰囲気でクエリの記述を"en"から"ja"に変えてみます。
![Wikidata Query Service3.png](https://qiita-image-store.s3.amazonaws.com/0/35320/b9412712-cff7-7bec-08c4-61930c51fbf8.png)

すると日本語名があるものは日本語で表示されたようです。

![Wikidata Query Service4.png](https://qiita-image-store.s3.amazonaws.com/0/35320/2b551316-53df-f167-0c4b-3c0992434547.png)

クエリの書き方や使い方の詳細は画面上部の「ヘルプ」ボタンにありますので参照してください（とこのへんで逃げる）。

![help.png](https://qiita-image-store.s3.amazonaws.com/0/35320/fcb96fcd-b6e7-35e9-dc8b-20712d9072cf.png)

次に別のサンプル・クエリ「女性市長がいる最大の都市」を選んでみます。

![Wikidata Query Service5.png](https://qiita-image-store.s3.amazonaws.com/0/35320/fa3ab700-856a-7855-b911-ea8ceae3326d.png)

クエリの右側を見ると、項目のプロパティをキーに検索しつつ、値を表示させていることが分かります。

![Wikidata Query Service6.png](https://qiita-image-store.s3.amazonaws.com/0/35320/90a23d4f-6f2e-3955-b98a-7e9ad92e2bac.png)

ここで「表示」ボタンを押すと、出力されたデータの内容に応じて、表示可能な形式が選べるようになっています。
![search7.png](https://qiita-image-store.s3.amazonaws.com/0/35320/c9d2b2b5-0b09-65f3-f3fa-de30c3a320b1.png)

「Tree Map」を選んでみます。

![Wikidata Query Service7.png](https://qiita-image-store.s3.amazonaws.com/0/35320/7a54a03d-347d-2756-16bb-b5a643237dcc.png)

きれいだけど何だかよく分かりませんね。データに適した視覚化表現を選ぶことが重要ですね :) 次に「Graph」を選んでみます。

![Wikidata Query Service8.png](https://qiita-image-store.s3.amazonaws.com/0/35320/b82958a7-3f6f-a016-ee37-15913dcb338f.png)

何かふわふわしたものが出てきました。左端では横浜市から林市長に矢印が伸びています。

最後に地図上に表現されるサンプルを試してみましょう。「ベルリンから100キロ以内の空港」を選んでみます。

![Wikidata Query Service9.png](https://qiita-image-store.s3.amazonaws.com/0/35320/1df62bd3-760b-74ae-ef54-41dd768ea2b8.png)

そうするとベルリン付近の地図上に該当する項目がプロットされました。
![Wikidata Query Service10.png](https://qiita-image-store.s3.amazonaws.com/0/35320/3e5b2553-43a7-fadf-f981-451d5dffe8de.png)

サンプルは多数ありますのでぜひいろいろ試してみて下さい。既にお気づきかと思いますが、このクエリ・サービスはウィキデータ内のデータを視覚化するというだけでなく、データの内容をチェックするために使うこともできます。

いかがでしたか。データ（インプット）とその表現（アウトプット）を自由にコントロールできるこの万能感、わくわくしませんか。

[ウィキデータの紹介#7](http://qiita.com/higa4/items/5ab1ab351041e5703e43)
【let's encrypt】./letsencrypt-auto実行時に発生するpipのエラー回避

./letsencrypt-auto実行時に発生したエラーにかなり躓いたのでその回避方法を記述します.
また, letsencryptクライアントを使用していますがcertbotクライアントでも発生する模様です.

#環境
- OS:CentOS release 6.8 
- python 2.6.6 ,python 2.7.5(SCL)
- pip 8.1.2

#エラー内容
```
--略--
Failed building wheel for cffi
Command "/root/.local/share/letsencrypt/bin/python2.7 -u -c "import setuptools, tokenize;__file__='/tmp/pip-build-33ozQM/cffi/setup.py';exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --record /tmp/pip-9u4Uv6-record/install-record.txt --single-version-externally-managed --compile --install-headers /root/.local/share/letsencrypt/include/site/python2.7/cffi" failed with error code 1 in /tmp/pip-build-33ozQM/cffi
You are using pip version 8.0.3, however version 8.1.2 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
```

#原因
エラーに表示されないので非常にわかりにくいですが, どうやらpipモジュールのインストール時にメモリが不足していることが起因しているらしいです.
また, 今回はcffiモジュールで発生していますが, cryptography等でも発生するようです.

#解決方法
今回はスワップ領域を作成してメモリが使える領域を広げます.
最初にfreeコマンドでメモリを確認します.
メモリ1Gをほぼ使い切っている状態かつスワップ領域が０だとこのようになります.

```
$ free -m
             total       used       free     shared    buffers     cached
Mem:           992        975         16          0         12         55
-/+ buffers/cache:        908         84 
Swap:            0          0          0 
```

次にスワップファイルを作成し,有効にします.
今回はサーバのメモリが1Gなので2Gのスワップ領域を作成します.

```
$ dd if=/dev/zero of=/swapfile bs=1M count=2048
$ mkswap /swapfile
$ swapon /swapfile
```

この状態で確認すると下記のようにswap領域が作成されていることがわかります.

```
$ free -m
             total       used       free     shared    buffers     cached
Mem:           992        975         16          0         13         58
-/+ buffers/cache:        904         87 
Swap:         2047        135       1912 
```

さらにswap領域が自動でマウントできるように/etc/fstabに下記を追記します

```
/swapfile               swap                   swap    defaults        0 0
```

この状態で./letsencrypt-autoもしくは./certbot-autoを実行すればメモリによるエラーは回避できます.



##参考
[CentOS python-tools conflict #2921](https://github.com/certbot/certbot/issues/1151)
[InsecurePlatformWarning & Failed building wheel for cryptography | cffi](https://community.letsencrypt.org/t/insecureplatformwarning-failed-building-wheel-for-cryptography-cffi/5657)
[CentOSサーバ構築術 文具堂 スワップファイル(swap)を作成して有効にする](http://centos.bungu-do.jp/archives/65)
anacondaでfoliumを使ってみる

foliumはpythonで使えるopen street mapです。
pipでinstallして使う方法が既に投稿されてますが、anacondaをつかった方法もこちらに記載させていただきます。
といってもほとんど同じ使い方なのですが、、、、。
Qiitaはじめての投稿なので大目にみてやってください。

# anacondaにfoliumを入れる
foliuｍはcondaコマンドで[インストール](https://anaconda.org/ioos/folium)することができます。
```
conda install -c ioos folium=0.2.1
```
入れ終わったらconda listで一覧を表示させて見ましょう。

# jupytenotebookでfoliumを使ってみる。
## 地図を表示する。
表示するだけでしたら下記の通り簡単にできます。
フォウ共益の緯度・経度をもとに表示しています。
```
import folium
map = folium.Map(location=[35.681298, 139.766247], zoom_start=5)
map
```
![screencapture-localhost-8888-notebooks-Untitled21-ipynb-1477292981465.png](https://qiita-image-store.s3.amazonaws.com/0/145608/614825fc-591d-e726-6a39-4f32237dec44.png)


## 地図にピンを刺す。
地図にピンを刺すにはmarkerを使い地図に追加します。
今回は東京駅を指定しているので東京駅にピンをさします。
pop-upもだしてみました。
```
folium.Marker([35.681298, 139.766247], popup='Tokyo Station').add_to(map)
```
![map.png](https://qiita-image-store.s3.amazonaws.com/0/145608/983a6da4-4a47-43c6-6ae1-034199886e52.png)

## 地図にをhtmlに書き出す。
表示した地図をhtmlで書き出すにはcreate_mapで行うことができます。
```
map.create_map(path='map.html')
```

## 終わりに
この記事が誰かの役に立つのかは謎ですが、、、、、。
今日はここまでにします。
適宜使い方は追記したいと思います。
タイムゾーンがUTCのec2でcrontabのタイムゾーンだけをJSTに変更する

# 背景
サーバーのタイムゾーンはUTCで運用しているけど、crontabはJSTで運用したい。という場合の設定です。

# 設定するcrontabにCRON_TZを設定する

```:/etc/crontab
CRON_TZ=Asia/Tokyo

# 日本時間のAM2:15に実行される
15 02 * * *  something
```

# crontabのrestart
```
sudo /etc/crontab restart
```

こうするとサーバーのタイムゾーンはUTCですが、crontabはJSTで設定できます。
以上です。
[PHP]環境依存文字のUTF-8への変換

# 結論

Windows環境で使われる文字コードは通常のShift-JIS(SJIS)ではなくWindows独自バージョンであり、PHPではSJIS-winと表記する。

#Shift_JISではない

ITリテラシーの低い会社などでは、Windows内のフォルダ名やファイル名に特殊文字を使っていることが多々見受けられます。

```PHP:example
㈱, ①, ②, ③, Ⅰ, Ⅱ, Ⅲ, etc...
```

こういった文字をコマンド経由などで取り込んで文字コードをUTF-8にしたいときに、通常以下のようにすると思いますが、この例では特殊文字が文字化けしてしまい、しばらくはまりました。

```PHP:function
mb_convert_encoding($str, 'utf8', 'SJIS');
```

Windowsでは文字コードSJISを使用していると思われがちですが、よく調べてみると、SJIS-win(cp932)というものらしいです。
ですので、以下のようにすると特殊文字の文字コード変換が可能です。

```PHP:function
mb_convert_encoding($str, 'utf8', 'SJIS-win');
```

また、$from_encodingに'auto'を指定するとPHPはSJISと解釈するようなので、文字コード変換に失敗します。

# 実は...

簡単に言うとShift-JISは一般的な文字のみで、それにいくつか便利に使える拡張文字を追加したものがWindowsで使われているSJIS-win(cp932)という文字コードです。
しかし、便利と思われた拡張文字は他の文字コードではほとんど採用されず、結果特定の環境でしか使えない環境依存文字となってしまいました。
このような過去がありますが、UTF-8にはこうした特殊文字も用意されているため、変換できるというわけです。
Swift3で配列のシャッフルをLazyに行って計算量を減らす

## 全てシャッフルする場合
Swift3で配列のシャッフルを行うコードを検索したところ[swift3 - Shuffle array swift 3 - Stack Overflow](http://stackoverflow.com/questions/37843647/shuffle-array-swift-3/37843901#37843901)がヒットしました。

このコードを使ってシャッフルしたのち最初の2個の値を取得するコードは以下のようになります。同時に実行速度を測ってみます。

```Swift
extension MutableCollection where Index == Int {
    /// Shuffle the elements of `self` in-place.
    mutating func shuffle() {
        // empty and single-element collections don't shuffle
        if count < 2 { return }
        
        for i in startIndex ..< endIndex - 1 {
            let j = Int(arc4random_uniform(UInt32(endIndex - i))) + i
            if i != j {
                swap(&self[i], &self[j])
            }
        }
    }
}

extension Collection {
    /// Return a copy of `self` with its elements shuffled
    func shuffled() -> [Iterator.Element] {
        var list = Array(self)
        list.shuffle()
        return list
    }
}

let array = Array(0...1000000)

printTimeElapsedWhenRunningCode(title: "Shuffle all") {
    _ = array.shuffled()[0...1]
}
```

結果は`Time elapsed for Shuffle all: 79.2173529863358 s`と出ました。かなり時間がかかっています。

## Lazyにシャッフルする場合
これをLazyに行って計算量を減らします。まずShuffledIteratorを作成します。次にLazySequenceProtocolに適合するLazyShuffledSequenceを作成します。

```Swift
struct ShuffledIterator<T>: IteratorProtocol {
    
    typealias Element = T
    
    private var elements: [T]
    
    init(elements: [T]) {
        self.elements = elements
    }
    
    mutating func next() -> T? {
        guard elements.count > 0 else { return nil }
        let index = arc4random_uniform(UInt32(elements.count))
        return elements.remove(at: Int(index))
    }
    
}

struct LazyShuffledSequence<T>: LazySequenceProtocol {
    
    func makeIterator() -> ShuffledIterator<T> {
        return ShuffledIterator(elements: _elements)
    }
    
    private let _elements: [T]
    
    init(elements: [T]) {
        self._elements = elements
    }
    
}

let array = Array(0...1000000)

printTimeElapsedWhenRunningCode(title: "Shuffle lazy") {
    _ = Array(LazyShuffledSequence(elements: array).prefix(2))
}
```

結果は`Time elapsed for Shuffle lazy: 3.75410097837448 s`と出ました。全てシャッフルする場合と比べて75秒程度速くなっています。

最初の偶数2個を取得するコードではどうでしょうか。

```Swift
printTimeElapsedWhenRunningCode(title: "Shuffle lazy") {
    _ = Array(LazyShuffledSequence(elements: array).lazy.filter { $0 % 2 == 0 }.prefix(2))
}
```

`Time elapsed for Shuffle lazy: 4.1856529712677 s`という結果になりました。これも高速に取得できています。

注)
実行速度計速関数

```Swift
func printTimeElapsedWhenRunningCode(title:String, operation:()->()) {
    let startTime = CFAbsoluteTimeGetCurrent()
    operation()
    let timeElapsed = CFAbsoluteTimeGetCurrent() - startTime
    print("Time elapsed for \(title): \(timeElapsed) s")
}
```
vimでatomのfile-iconsのような感じにする

![image](https://qiita-image-store.s3.amazonaws.com/0/31015/d03c789e-31b3-8637-f46b-be8ca8662052.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/31015/183f275e-29fa-ef94-e5d3-67ed07dc011e.png)


## fontのインストール
[こちらを参考にしました。](http://qiita.com/nechinechi/items/27f541849db04123ea15)
fontforgeは自分の環境では↓でインストールできた
`brew install fontforge --with-python`

`ryanoasis/nerd-fonts`は結構容量があるっぽいので注意
前に`Ricty`を入れていたので、-wオプションなしで参考記事の通りにインストールしました。
macだとSpotlight検索でfontと検索すると、`Font Book`ていうアプリが立ち上がってきて、
fontfileのファイルパスとかがわかります。

出来たfontfileを`~/Library/Fonts/`に移動すればインストール完了。


## vim設定

```vim:.vimrc

"↓ plugin管理は適宜置き換えて下さい
NeoBundle 'ryanoasis/vim-devicons'　" <= 追加 利用できるpluginの前に追加する必要あり
NeoBundle 'scrooloose/nerdtree'
NeoBundle 'tiagofumo/vim-nerdtree-syntax-highlight' " <= 追加

~
~

let g:NERDTreeDirArrows = 1
let NERDTreeWinSize=22
" let NERDTreeShowHidden = 1

"vim-nerdtree-syntax-highlight
let s:rspec_red = 'FE405F'
let s:git_orange = 'F54D27'
let g:NERDTreeExactMatchHighlightColor = {} " this line is needed to avoid error
let g:NERDTreeExactMatchHighlightColor['.gitignore'] = s:git_orange " sets the color for .gitignore files
let g:NERDTreePatternMatchHighlightColor = {} " this line is needed to avoid error
let g:NERDTreePatternMatchHighlightColor['.*_spec\.rb$'] = s:rspec_red " sets the color for files ending with _spec.rb

" vim-devicons
let g:webdevicons_conceal_nerdtree_brackets = 1
let g:WebDevIconsNerdTreeAfterGlyphPadding = ' '

" dir-icons
let g:WebDevIconsUnicodeDecorateFolderNodes = 1
let g:DevIconsEnableFoldersOpenClose = 1
let g:WebDevIconsUnicodeDecorateFolderNodesDefaultSymbol = ''
let g:DevIconsDefaultFolderOpenSymbol = ''
" file-icons
let g:WebDevIconsUnicodeDecorateFileNodesExtensionSymbols = {}
let g:WebDevIconsUnicodeDecorateFileNodesExtensionSymbols['html'] = ''
let g:WebDevIconsUnicodeDecorateFileNodesExtensionSymbols['css'] = ''
let g:WebDevIconsUnicodeDecorateFileNodesExtensionSymbols['md'] = ''
let g:WebDevIconsUnicodeDecorateFileNodesExtensionSymbols['txt'] = ''

~
~

" ↓インストールしたfont
set guifont=RictyDiscordForPowerline\ Nerd\ Font:h14

```

![image](https://qiita-image-store.s3.amazonaws.com/0/31015/9e11ecc9-f3f0-6f99-2f2d-6e3f252fb071.png)
JavaからMicrosoft Cognitive ServicesのEmotion APIを呼び出して顔画像の感情分析を行ってみる

「福岡市防災減災アプリコンテスト by Mashup Awards 2016」に参加したので、ネタとして投稿してみる。
イベントのまとめはコチラ。

- [togetter: 福岡市防災減災アプリコンテスト by Mashup Awards 2016](http://togetter.com/li/1040042)。

昨日(2016/10/23)の投稿「[JavaからIBM BlueMixのPersonality Insightsを呼び出して日本語テキストから性格分析を行ってみる](http://qiita.com/r-hirakawa/items/664a65846bef9f80fb70)」の続き。

# JavaからMicrosoft Cognitive ServicesのEmotion APIを呼び出して顔画像の感情分析を行ってみる
- サンプルコードは[GitHub](https://github.com/r-hirakawa/cognitive-services-example)に投稿しています。

## [事前準備] Microsoft Cognitive Servicesの利用登録

- ligerboltさんの[記事](http://qiita.com/ligerbolt/items/516b59d64e6059586ec6)を参照
- この手順の中で、後述するAPI利用に必要なサブスクリプションキーの払い出しを行います！

## 1. pom.xmlにCommons HttpComponentsを定義

~~~
<dependency>
  <groupId>org.apache.httpcomponents</groupId>
  <artifactId>httpclient</artifactId>
  <version>4.5.2</version>
</dependency>
~~~

* API自身が簡単に利用できるインタフェースなので、特にJava向けのSDKは無いようです(本当に？)。今回はREST APIを呼び出すためのHTTPクライアントとして、Commons HttpComponentsを利用しました。

## 2. HTTPクライアント初期化

~~~
// 1. HTTPクライアントを生成
try (CloseableHttpClient client = HttpClients.createDefault()) {
    …
} catch (IOException e) {
    e.printStackTrace();
}
~~~

## 3. POST要求を生成

~~~
private static final String EMOTION_API_URL = "https://api.projectoxford.ai/emotion/v1.0/recognize";
private static final String SUBSCRIPTION = "dummy";  // FIXME: correct subscription

…中略…

// 分析対象の画像のURLを指定するJSON文字列
String req = "{ \"url\": \"https://portalstoragewuprod.azureedge.net/media/Default/Media/EmotionAPI/Emotion.jpg\" }";
// POSTメソッドを生成
HttpPost post = new HttpPost(EMOTION_API_URL);
post.setHeader(HttpHeaders.CONTENT_TYPE, "application/json");
post.setHeader("Ocp-Apim-Subscription-Key", SUBSCRIPTION);
post.setEntity(new StringEntity(req));
~~~

- HTTP要求ヘッダに以下の設定が必要です
    - Content-Type = application/json
    - Ocp-Apim-Subscription-Key = \<APIのサブスクリプションキー\>

## 4. APIの呼び出し / 例外処理

~~~
// APIを呼び出し応答データを取得
try (CloseableHttpResponse response = client.execute(post)) {
    String resp = EntityUtils.toString(response.getEntity());
    System.out.println(resp);
}
~~~

# 最後に

- クライアントをJavaで実装したとしても、たったこれだけで画像の感情分析ができるなんて楽すぎでしょ！これまで、アカウント登録や、使ってみるにあたって調べるのも大変だろう。。。と思っていた自分がバカみたいですね。
- 欲を言えば、JSON文字列とオブジェクトのO/Rマッパーがあると、要求データの生成と応答データの中身の取り出しが、もっと楽にかと思うのですが、それ位、Jacksonとか使って自前で作れって感じですかね。

# 参考

- [Cognitive Services: Emotion API](https://www.microsoft.com/cognitive-services/en-us/emotion-api)
    - 作らずに試すだけなら、上記のページにあるAPI Referenceの中に、デモ実行用のページもあるので、そちらを使ってみてはいかがでしょうか。
ActiveSupport::JSON::Encoding escape patch

http://stackoverflow.com/search?q=string.encode%28%3A%3AEncoding%3A%3AUTF_8%2C+%3Aundef+%3D%3E+%3Areplace%29.force_encoding%28%3A%3AEncoding%3A%3ABINARY%29

http://stackoverflow.com/questions/5123993/json-encoding-wrongly-escaped-rails-3-ruby-1-9-2/5124452#5124452

```rb
module ActiveSupport::JSON::Encoding
  class << self
    def escape(string)
      if string.respond_to?(:force_encoding)
        string = string.encode(::Encoding::UTF_8, :undef => :replace).force_encoding(::Encoding::BINARY)
      end
      json = string.gsub(escape_regex) { |s| ESCAPED_CHARS[s] }
      json = %("#{json}")
      json.force_encoding(::Encoding::UTF_8) if json.respond_to?(:force_encoding)
      json
    end
  end
end
```
ctrlpの起動を爆速化させる

## 問題と背景
自分はRailsアプリケーションを触ることが多いのだが、Gemが`vendor/bundle`に大量に取り込まれてしまうせいか、ctrlpでファイル検索をしようとすると立ち上がるのに3秒くらいかかっていた。

![14b6bee1b16e6de13b025a0d2c2813e1.gif](https://qiita-image-store.s3.amazonaws.com/0/2813/ea7048e1-a249-6ec1-7020-521e2362cdbd.gif)
※ ややわかりづらいが、`Ctrl + p`を押して操作可能になるまで3秒くらいかかっている

## 解決策
以下の1行を`.vimrc`に追加すると`.gitignore`に書き込まれたファイルを無視するようになるので、ctrlpの起動が高速になる。体感では100ミリ秒くらいになっている気がする。

```vim
let g:ctrlp_user_command = ['.git', 'cd %s && git ls-files -co --exclude-standard']
```

![7b3aa1b34a27cede8f357fe7f3f4bd9c.gif](https://qiita-image-store.s3.amazonaws.com/0/2813/2188112c-4bfa-b6a1-d730-5cf92e29b6be.gif)

ちょっとしたtipsだが、開発に集中している時に約3秒待たされるのはなかなかストレスを感じるので個人的には大きな改善だった。

※ ちなみにこれ、ctrlp公式の[readme.md](https://github.com/ctrlpvim/ctrlp.vim/blob/master/readme.md)にちゃんと書かれている。
Surface pro 4でvirtualboxを起動するとブルースクリーンで落ちる

Surface pro 4でvirtualboxを起動するとブルースクリーンエラーが表示されます。どうもこれはHyper-Vという標準搭載の機能が有効になっていると起こるらしく、これを無効化しておく必要があります。
#Hyper-Vを無効化する
```bcdedit /set hypervisorlaunchtype off```
プロンプトを管理者権限で開き上記のように入力します。
#上記方法で出来ない場合
何故かわかりませんが、わたしの場合上記の方法では無効化できなかったため以下の方法を取りました。
コントロールパネル → プログラムと機能 → Windowsの機能の有効化または無効化 → Hyper-Vのチェックを外す
ChainerでHeNormalによる初期化を行う場合はWeight Initializerを使うのがよい

# HeNormalとは

重み係数の初期化手法の1つで、別名"MSRA"とも呼ばれます。[Kaiming Heらの論文](#参考文献)で使われており、論文著者とMicrosoft Researchが名前の由来になっていると思われます。

HeNormalでは重み係数$W$を標準偏差$\sqrt{2/N}$の正規分布に従う乱数で初期化します。ここで$N$は入力の大きさで、`links.Linear`の場合は入力ベクトルのサイズ、`links.Convolution2D`の場合はチャンネル数×カーネル高さ×カーネル幅になります。

# wscale指定ではだめなのか？

HeNormalで初期化する方法として、linkのインスタンス生成時に`wscale`に`math.sqrt(2)`が指定されることがあります。
例えば`chainer.links.Linear(100, 100, wscale=math.sqrt(2))`のような指定を行います。
[ChainerのImageNetサンプルにあるNetwork-in-Networkモデル](https://github.com/pfnet/chainer/blob/master/examples/imagenet/nin.py)でもこの方法が使われています。
しかしながら`wscale`の動作がv1.9.0から意図せず変わっていることがわかりました。
すでにissue登録もしています。
[wscale doesn't have backward compatibility](https://github.com/pfnet/chainer/issues/1806)
明示的にHeNormalを使いたい場合にはこの問題が解決されるまで`wscale`による指定は避けたほうがよいでしょう。

例えばChainer実装を使った結果を公開する際に「HeNormalで初期化した」と述べたり、他のチームの研究でHeNormalを使っていてその再現をするために初期化方法を揃えたいといった場合には、以下に述べるようにWeight Initializerを使うのがよいと思います。

# Weight Initializerの使い方

ChainerではWeight Initializerを使うことで重み係数の初期化方法を指定できます。
Initializerを使って初期化するにはlinkの`initialW`にinitializerのインスタンスを指定すればよいです。
例:

```py
class MLP(chainer.Chain):

    def __init__(self, n_in, n_units, n_out):
        initializer = chainer.initializers.HeNormal()
        super(MLP, self).__init__(
            l1=L.Linear(None, n_units, initialW=initializer),  # n_in -> n_units
            l2=L.Linear(None, n_units, initialW=initializer),  # n_units -> n_units
            l3=L.Linear(None, n_out, initialW=initializer),  # n_units -> n_out
        )

    ...
```

# 参考文献

0. Kaiming He el al. [Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification](https://arxiv.org/abs/1502.01852), (2015)
Alfredと一緒に使いたいショートカット

周りがAlfredでアプリケーションの起動とかファイル検索やってたんで導入してみた．
マウスなしで起動するならマウスなしで終了させたいと思って，このショートカット組み合わせれば便利だよなと思ったものをいくつかまとめる．

#環境
OS：mac OS Sierra バージョン10.12
ブラウザ：Google Chrome バージョン 53.0.2785.143 (64-bit)

#導入したアプリケーション
Alflred(無料版)

- ランチャーアプリ．下記からダウンロード
- https://www.alfredapp.com/
- 有料版の購入はとりあえず保留
- デフォルトは `option + space` で起動

#組み合わせたいショートカット
###ファイル・アプリを開く機能
Alfredに`space + ファイル名`を入力すると，指定したファイルをデフォルトのアプリで開いてくれる．
Alfredに`アプリ名`を入力すると，指定したアプリ（のウィンドウ）を開いてくれる．
候補のファイル上で`shift`を押すとQuick Lookで表示してくれる．
####組み合わせたいOSのショートカット
- 同一アプリケーションのウィンドウの切り替え
    - `command + F1`
- ウィンドウを閉じる
    - `command + w`
- アプリケーションの終了
    - `command + q`
- アプリケーションの切り替え
    - `command + tab + (← or →)` 


###フォルダを開く機能
Alfredに`space + フォルダ名`を入力すると指定したフォルダをFinderで表示してくれる．

####組み合わせたいFinderのショートカット
- Quick Look
    - `space`
- ファイルを開く
    - `command + o or ↓`
- ファイルを消す
    - `command + delete`
- ファイルの名前を変える
    - `Enter`
- 上下階層のディレクトリへ
    - `command + ↑ or ↓`

###Web検索機能
Alfredに`検索ワード`を入力するとデフォルトのブラウザで検索してくれる．
Custom Searchを設定することで，様々な検索ができる．
http://qiita.com/satoshi1335/items/19b9b6109d7fe297bfd2

####組み合わせたいChromeのショートカット
- 表示するページ選択
    - `↑ or ↓ +  Enter`
- 前の画面に戻る & 進む
    - `command + ← or →`
- ページスクロール
    - `space` or  `fn + ↑ or ↓`
- タブを消す
    - `command + w`
- タブの移動
    - `command + option + ← or → `

#おわりに
ShiftItを入れるとさらにマウスつかわないでよくなった．
`ctrl + 方向キー`で複数デスクトップやフルスクリーンの切り替えができるので，これも覚えたら便利．

#参考文献
http://qiita.com/fantm21/items/369ffb34c5ba9bbe9710
https://support.apple.com/ja-jp/HT201236
https://support.google.com/chrome/answer/157179?hl=ja
Sparkトラブルシューティング「org.apache.spark.sql.AnalysisException: Reference 'Hoge' is ambiguous」

 下記のようなエラーが出力され少しハマったので原因と対処ほうについて。

```
org.apache.spark.sql.AnalysisException: Reference 'Hoge' is ambiguous, could be: Hoge#5, Hoge#96.
```

## 原因

読み込みデータに大文字と小文字の違いだけで同じスペルのカラムが存在していたことが原因でした。
hogeとHogeみたいな。
Sparkの内部のスキーマはデフォルトでは大文字と小文字を区別しないようです。jsonなどでは大文字と小文字で別々のカラム(キー)で値を持てるのでこういったエラーが出ることがあります。

## 対処

### データを修正
大文字と小文字で同じスペルになるカラムがなくなるようにデータを修正する。

### オプションを使ってSparkが大文字と小文字を区別するようにする

`spark.sql.caseSensitiv`という設定項目があるので、これをtrueにすると大文字と小文字を区別するようになります。

コード中で設定するには下記のようにします。

```
sqlContext.sql("set spark.sql.caseSensitive=false")
```
機械学習勉強メモ1: 決定木

- 決定木を描いてみる。

お客さん情報によりもの買うか買わないかを予測します。
![01决策树说明.png](https://qiita-image-store.s3.amazonaws.com/0/138880/b551c49f-53f4-6cc9-7cb1-6db770a06557.png)

- 分析データ
分析データcsvファイルです。
項目はRID,age(年齢),income(収入),student(学生),credit_rating(信用度),Class_buys_computer(買う結果)
![image](https://qiita-image-store.s3.amazonaws.com/0/138880/3e7960ab-e06a-e9dd-690a-dd24860abe04.png)
sklearnに分析ために転換が必要です。

- 計算方式
葉（端点）と根(root)の選択は重要でそれぞれの計算方法があります。
例: c4.5 cart id3
本例計算方式はid3です。参考:https://ja.wikipedia.org/wiki/ID3

- 利用したツール
python3 sklearn(機械学習計算用)
Graphviz (分析結果dotからpdf図に転換する)

作成されたPDF
![image](https://qiita-image-store.s3.amazonaws.com/0/138880/93f838b8-610b-97b5-93be-5aae5899036f.png)

ソースコード

```
from sklearn.feature_extraction import DictVectorizer
import csv
from sklearn import preprocessing
from sklearn import tree
from sklearn.externals.six import StringIO
with open('test_data.csv') as f:
f_csv = csv.reader(f)
headers = next(f_csv)
# csvデータを分析データに転換用
labelList = [] # 結果データ
featureList = [] # 属性データ

for row in f_csv:
    labelList.append(row[len(row) - 1])
    rowDict = {}
    for i in range(1, len(row) - 1):
        rowDict[headers[i]] = row[i]
    featureList.append(rowDict)

print(labelList)
print(featureList)

# sklearnの分析データに転換する
vec = DictVectorizer()
dummyX = vec.fit_transform(featureList).toarray()

print("dummyX:" + str(dummyX))
print(vec.get_feature_names())

print("labellist: " + str(labelList))

# sklearnの結果データに転換する
lb = preprocessing.LabelBinarizer()
dummyY = lb.fit_transform(labelList)
print("dummyY: " + str(dummyY))

# 計算方法を決まり、treeを構築する
clf = tree.DecisionTreeClassifier(criterion='entropy')
clf = clf.fit(dummyX, dummyY)
print("clf:" + str(clf))

with open("test.dot", 'w') as f2:
    # 結果データを出力する
    f2 = tree.export_graphviz(clf, feature_names=vec.get_feature_names(), out_file = f2)
    # dot ファイルからpdfに転換 コマンド: dot -T pdf test.dot -o output.pdf

# 仮に予想データを作成する
oneRowX = dummyX[0, :]
print("oneRowX:" + str(oneRowX))

newRowX = oneRowX
newRowX[0] = 1
newRowX[2] = 0 
print("newRowX:" + str(newRowX))

#予想データの結果
predictedY = clf.predict(newRowX)
print("predictedY:" + str(predictedY))
```
【Laravel】DBから取得した値を$castsで型変換する【Attribute Casting】

Laravelの`$query->first()`でDBの値を取得すると、DBのカラムの型がIntegerで定義していたとしても、返り値はすべてStringになります。

自分は今回、取得した値をさらに他の計算に使いたかったため、自動的にIntegerに変換してくれる処理を調べていました。
すると、LaravelのEloquentには、このために使用されるAttribute Casting（属性キャスト）という機能が備わっているそうです。

モデルの`$casts`プロパティにカラム名と変換したい型を指定すると、データアクセス時に型変換をしてくれます。

```php
class Article extends Model
{
    protected $casts = [
        'pv' => 'integer'
    ];

// $article = Article::first();
// $article->pv がStringではなくIntegerに！
```

`$casts`で指定できる属性は、下記のLaravelのソースコードを見ると、`[int, integer, real, float, double, string, bool, boolean, object, array, json, collection, date, datetime]`に対応してるみたいです。

https://github.com/laravel/framework/blob/5.1/src/Illuminate/Database/Eloquent/Model.php#L2776

```php
        switch ($this->getCastType($key)) {
            case 'int':
            case 'integer':
                return (int) $value;
            case 'real':
            case 'float':
            case 'double':
                return (float) $value;
            case 'string':
                return (string) $value;
            case 'bool':
            case 'boolean':
                return (bool) $value;
            case 'object':
                return $this->fromJson($value, true);
            case 'array':
            case 'json':
                return $this->fromJson($value);
            case 'collection':
                return new BaseCollection($this->fromJson($value));
            case 'date':
            case 'datetime':
                return $this->asDateTime($value);
            default:
                return $value;
```


参考記事
https://laravel.com/docs/5.3/eloquent-mutators#attribute-casting
http://nextat.co.jp/staff/archives/140
MariaDB/MySQLで最低限チェックしておきたい設定１０選

## システム変数

- thread_cache_size

スレッドをキャッシュしておく数。デフォルトは128。もし0にしているとクライアントのアクセスのたびにスレッドが生成されるため効率が悪い。


- thread_handling = pool-of-threads
- thread_pool_size = 8

MariaDBは標準でスレッドプールをサポートしている。これを設定することでクライアントごとにスレッド（キャッシュ含む）を割り当てるのではなく、スレッドプール単位になるためスレッド生成やスイッチ切り替えのオーバーヘッドを減らせる。

## 通信系

- max_connections
- max_user_connections

サーバに同時に接続できるクライアントの最大数を指定。max_connectionsのデフォルトは150。


- max_allowed_packet

１パケットの最大サイズ。少なくともBLOB型を使っているのであればサイズに注意。デフォルトでは16MB。


- skip_name_resolve

ホスト名のIPアドレス解決をするか否か。デフォルトは「解決する」になっているため、/etc/hostsに記載がないホスト名であれば、DNS検索が走るので遅くなる。ホスト名ではなくIPアドレス記載にして、この設定は「解決しない」にしておくといい。

## クエリ系

- query_cache_limit
- query_cache_size

クエリ結果のキャッシュする上限とそのために確保するメモリサイズ。


## InnoDB系

- innodb_buffer_pool_size

データベースサーバの性能に直結する。可能な限り大きな領域を指定する。デフォルトは128MB


- innodb_sync_array_size

スレッドの制御するための内部構造を分割する。
高負荷で多くのスレッドが待ちになる場合この値を増やす。デフォルトは１。


- innodb_file_per_table
テーブルごとにデータファイルを保持するかどうか。デフォルトで有効。


- innodb_file_format
ファイルフォーマット。デフォルトだとAntelope,圧縮に対応した大容量向きなのは、Barracuda。意外に重要なので、テーブル定義段階で確認しておくこと。

| 内容                       | 説明                                                         | デフォ |
| -------------------------- | ------------------------------------------------------------ | ------ |
| max_connections            | MYSQLが受け入れ可能な最大接続数                              | 151    |
| max_allowed_packet         | クライアントとの送受信のパケット最大サイズ。                 | 4M     |
| character_set_server       | サーバが利用するデフォの文字コード                           | latin  |
| lower_case_table_names     | テーブル名をケースセンシティブ（大文字小文字区別）するか     | 無効   |
| innodb_buffer_pool_size    | 通常はメモリの７割程度                                       | 128M   |
| innodb_log_file_size       | 増やすことでページのフラッシュを遅らせるので更新処理が早くなる | 50M    |
| innodb_io_capacity         | バックグラウンドスレッドが実行可能なIOPSの上限。ストレージと合わせておく | 200    |
| innodb_print_all_deadlocks | デッドロック時に詳細のログを出す                             | 無効   |



終わり。
line-notify を使った rails アプリ

# 参考資料

* http://developers.linecorp.com/blog/ja/?p=3784
* http://qiita.com/ichikawa_0829/items/9330fb73648bae91bea7#_reference-661a0e66d584a9a22878

# github

* https://github.com/bamchoh/line-notify

# Dockerfile

```Dockerfile
FROM ubuntu:16.04
WORKDIR /root
RUN apt-get update
RUN apt-get upgrade -y
RUN apt-get install -y git build-essential libssl-dev libreadline-dev
RUN git clone https://github.com/rbenv/rbenv.git /root/.rbenv
RUN cd /root/.rbenv && src/configure && make -C src
RUN echo 'export PATH="/root/.rbenv/bin:$PATH"' >> /root/.bashrc
RUN echo 'eval "$(rbenv init -)"' >> /root/.bashrc
SHELL ["/bin/bash", "--rcfile", "~/.bashrc", "-ci"]
ENV RUBY_VERSION 2.5.0
RUN mkdir -p "$(rbenv root)"/plugins \
&& git clone https://github.com/rbenv/ruby-build.git "$(rbenv root)"/plugins/ruby-build \
&& apt-get install -y curl \
&& curl -fsSL https://github.com/rbenv/rbenv-installer/raw/master/bin/rbenv-doctor | bash \
&& CONFIGURE_OPTS="--disable-install-rdoc" rbenv install -v $RUBY_VERSION \
&& rbenv rehash \
&& rbenv global $RUBY_VERSION \
&& ruby -v
RUN gem update --system
RUN gem install bundler --no-document --force
RUN gem install oauth2
RUN gem install rails
RUN apt-get install -y sqlite3 libsqlite3-dev tzdata
RUN git clone https://github.com/bamchoh/line-notify
WORKDIR /root/line-notify
RUN bundle install
ADD settings.yml /root/line-notify/config/
EXPOSE 8080
CMD ["/bin/bash", "--rcfile", "~/.bashrc", "-ci", "rails s -b 0.0.0.0 -p 8080"]
```

# docker build

`docker build -t line-notify .`

# settings.yml

```settings.yaml
development:
  client_id: "xxxxx"
  client_secret: "yyyyy"
  callback: "http://192.168.0.100"

test:
  client_id: "xxxxx"
  client_secret: "yyyyy"
  callback: "http://192.168.0.100"

production:
  client_id: "xxxxx"
  client_secret: "yyyyy"
  callback: "http://192.168.0.100"
```

`client_id`, `client_secret`はline-notifyにサービスと登録したときに出てくる文字列を指定。`callback`にはoauth認証をした後に帰ってきてほしいURLを指定。サービスを登録したときのcallbackとちゃんと合わさないとエラーになるので注意。

# docker run

`docker run -p 80:8080 -t line-notify`

# ブラウザからアクセス

`{docker runしたコンテナのIP}/oauth/index`にアクセスするとこんな感じの画面が出てきます。

![image](https://qiita-image-store.s3.amazonaws.com/0/12550/a93ad54a-ac1a-56b3-b5c7-d17108685690.png)

認証押すとline-notifyのログイン画面に遷移するので、ログインして、適当に部屋決めて認証すると、以下のような画面に戻ってきます。

![image](https://qiita-image-store.s3.amazonaws.com/0/12550/461adb4e-5af6-6a26-b101-220654050711.png)

テキストボックスに何か文字を入力して`送信`ボタンを押すとLINEにメッセージが送信されます。簡単ですね。
kobo電子書籍リーダーをファクトリーリセットしても最新版の状態で使用開始する方法

# 概要
kobo電子書籍リーダーをファクトリーリセットすると，工場出荷状態に戻すことができます．

この工場出荷状態は，ファームウエアのバージョンが非常に古いです．これまでの状態で使用を再開するにはファームウエアのバージョンを更新する必要があり，手間になります．

しかしファクトリーリセット時に使用されるファイルに細工を施すことで，任意のファームウエアバージョンで直ちに使用可能にできます．

これを実現するには，やや専門的な知識が必要になります．microSD改装経験者であることと，UnixライクOSのコマンドを理解して扱えるレベルであることが目安になります．

そうでない方々にはおすすめできません．

# 大雑把な手順
kobo本体のmicroSDにはファクトリーリセット時に用いられる，ファイルシステムを tar + gz でまとめられたアーカイブファイルが格納されています．

一方で，ファームウエアが更新されるたびに，差分内容が tar + gz でまとめられたアーカイブファイルがkobo社から公開されています．

この2つのアーカイブファイルをくっつけて新たな1つのアーカイブファイルを作成し，kobo本体のものと差し替えます．

こうすることで，ファクトリーリセット時にアーカイブファイル2つ分の内容が順番にファイルシステムに展開され，1回の操作で任意のバージョンが再現できます．

# ちょっと細かい手順
いちどザーッと読んでいただき「ああ，なるほど」と思う方だけ，実際にやってください．そうでない方は，もとに戻せるよう前準備してからやるか，危険なのでやめるかしましょう．

kobo本体内の以下の場所から，ファクトリーリセット時に用いられるファイルシステムのアーカイブを取得します．

- kobo上のデバイスファイル名 `/dev/mmcblk0p2`
- フルパスのファイル名 `/upgrade/fs.tgz`

さらに以下のペイジを参考に，リセット後直ちに使用開始したいバージョンのアップデートファイル(`kobo-update-X.X.X.zip`)を入手します．このとき使用中のkobo本体の世代を確認し，それに合ったものを入手するよう留意します．zipファイル内に含まれている`KoboRoot.tgz`を取り出しておいてください．

- [Direct Links to Kobo Firmware](http://www.mobileread.com/forums/showpost.php?p=2159069&postcount=1)

2つのアーカイブファイル`fs.tgz`と`KoboRoot.tgz`を一旦gzip伸長し，tarファイルにします．

    % gunzip fs.tgz KoboRoot.tgz
これで非圧縮のtarアーカイブができます．

次に`fs.tar`に`KoboRoot.tar`をくっつけます．tarにはGNU tarを使ってください．

    % tar --concatenate --file=fs.tar KoboRoot.tar
これでもともとあった`fs.tar`の末尾に`KoboRoot.tar`の内容が追加されます．

出来上がった`fs.tar`をgzip圧縮します．

    % gzip --best fs.tar
    % mv fs.tar.gz fs.tgz
これで任意のバージョンを再現できる`fs.tgz`ができます．

あとは，この`fs.tgz`をkobo本体内の元あった場所に書き戻して完成です．

# おわりに
基本的には殻割りしてmicroSDを取り出し，ext4が読み書きできる母艦で作業することをおすすめします．わたしはこの方法でしか作業したことがりません．

恐らくtelnetdやsshd，ftpdを有効にしたkobo本体だけでも`/mnt/onboard`にマウントされるFAT32領域をワークにすれば作業は可能だと思います．

また，わたしは遭遇したことがないですが，`fs.tgz`のサイズが大きくなりすぎて`/dev/mmcblk0p2`に入らなくなることが考えられます．その時はgzip圧縮ではなくbzip2圧縮やxz圧縮を用いれば良いでしょう．

ただしこの場合は`/dev/mmcblk0p2`の`/etc/init.d/rcS`を書き換える必要があります．遭遇したことがないので変更内容は割愛しますが，要望があれば追記します．

# 参考文献
- [Direct Links to Kobo Firmware](http://www.mobileread.com/forums/showpost.php?p=2159069&postcount=1)
- [GNU tar - Combining Archives with `--concatenate'](http://www.gnu.org/software/tar/manual/html_node/concatenate.html)
GoogleMapAPI 使い方まとめ（メソッド中心）

# はじめに 
仕事で使う機会があったので備忘録

公式HP [Google Maps JavaScript API](https://developers.google.com/maps/documentation/javascript/?hl=ja)  

思った以上に自由に設定ができて、さすがgoogleといった感じ。

仕事で使ったものに少し手を加えて[デモページ](http://www.sottar.net/demo-googlemap-api/)も作りました。
コードが見たい方は[こちら](https://github.com/sottar/googlemap_api_demo)（github）

# インスタンス作成

## map作成
```
let map = new google.maps.Map(document.getElementById('googlemap'));
```

## mapの表示範囲の設定
```
//地図の南西を指定
var sw = new google.maps.LatLng(maxLat,minLng);
//地図の北東を指定
var ne = new google.maps.LatLng(minLat,maxLng);
// 南西, 北東から表示範囲を指定する
var bounds = new google.maps.LatLngBounds(sw, ne);
map.fitBounds(bounds);
```

## markerを作成
```
markerObj = new google.maps.Marker({
  position: new google.maps.LatLng({lat: mapPin[i]['latitude'], lng: mapPin[i]['longitude']}), // markerの場所を指定
  map: map, // markerを表示する対象のmapを指定
  zIndex: 1, // zIndexを指定(option)
  icon:{ // 表示するiconを指定(option)
    url: './img/marker_default.png', // 表示する画像
    scaledSize: new google.maps.Size(20,20), // 表示する画像のサイズを指定
  },
});
```

## infoWindowを作成
```
infoWindow = new google.maps.InfoWindow({
  content: <div>text</div>,
});
```

# メソッド一覧

## mapの中心を右にx, 上にyピクセル移動させる
```
map.panBy(x, y);
```

## mapの中心地を指定した値にする
```
var latlng = new google.maps.LatLng(latitude, longitude); // 緯度経度インスタンスを作成  
map.panTo(latlng); // mapの中心を指定した緯度経度に設定
```

## infoWindowを閉じた時の挙動を設定
```
google.maps.event.addListener(infoWindow[i] , 'closeclick' , () => {
  // 処理
});
```

## markerクリック時の処理
```
markerObj[i].addListener('click', () => {
  // 処理
});
```

## markerのsettingを変更
```
markerObj.setOptions({
  zIndex: 2,
  icon: {
    url: './img/marker_active.png',
  },
});
```

# デモページ作りました。
再度になりますがデモページを作りました。参考にしてください  

![スクリーンショット.png](https://qiita-image-store.s3.amazonaws.com/0/63056/8849606e-2ff1-c7d2-09a4-4b949e32f782.png)

[DEMO page](http://www.sottar.net/demo-googlemap-api/)
[github](https://github.com/sottar/googlemap_api_demo)
いまさら ascii

 
いまさら cygwin[^1]
 
[^1]: Bash on Ubuntu の方使えばいいじゃん。ってセルフ突っ込み
 
## ascii
 
cygwin に `man 7 ascii` がない。
 
冗談で以下のコマンド打ったら、なんぞや入った。
 
```
$ cyg-fast install ascii
```
 
`ESR` さんのプログラムすか。
 
普通に使わさせていただこう。
 
```
$ ascii -t A
4/1   65   0x41   0o101   01000001
0/10   10   0x0A   0o12   00001010
```

##  man 7 ascii

ついでだから、`ascii.7` も入れとこ

```
$ cd /usr/share/man/man7
$ wget -q https://linuxjm.osdn.jp/manual/LDP_man-pages/release/man7/ascii.7 | gzip > ascii.7.gz
$ man 7 ascii
```
IEEE Projects Chennai-1croreprojects.com

1 Crore Projects Provides best ieee projects Center in chennai for final year students and also provides best ieee bulk projects with java ieee projects ,dotnet ieee projects , ns2 ieee projects in chennai ,latest 2016-2017 ieee projects in chennai at low cost ieee projects in chennai ![mca projects in chennai.jpg](https://qiita-image-store.s3.amazonaws.com/0/145863/25a471ac-b251-ab57-801e-3abe72442ad7.jpeg
AWS Command Line Interface (aws-cli) でプロファイルを切り替える

いつも切り替えのための環境変数名を忘れてしまうので記録しておきます。

# 手順

## プロファイルを作成する

`aws configure`実行時に`--profile`オプションにプロファイル名を付与して渡します。

```bash
$ aws configure --profile sample-profile
```

`~/.aws/credentials`と`~/.aws/config`にプロファイルが追加されます。

### プロファイルの切り替え方

`configure`実行時と同様に、`aws`コマンドへ`--profile`オプションを渡します。

```bash
$ aws ec2 describe-instances --profile sample-profile
```

また、オプションだけでなく`AWS_DEFAULT_PROFILE`環境変数でプロファイルを切り替えることも可能です。

```bash
$ export AWS_DEFAULT_PROFILE=sample-profile
$ aws ec2 describe-instances
```

ただし、`AWS_ACCESS_KEY_ID`や`AWS_SECRET_ACCESS_KEY`が設定されていると、そちらを優先しますので注意してください。

# 参考

- [Configuring the AWS Command Line Interface \- AWS Command Line Interface](http://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-getting-started.html)