OmniAICreator/Qiita-1.07M huggingface dataset:
Vimでバッファ読込時にシンボリックリンクかどうかを判別する

アカウント取っといて使わないのもなんだし書いてみる。

#目的
Agitやfugitiveなどを利用する際、シンボリックリンクとそうでないファイルの違いを意識せずに扱いたい。
元ファイルのパスを取得する方法は以下に書いてあった(パスを再設定するコマンドを定義している)。
[Vimでシンボリックを辿る - たけっぱ横丁](http://takegue.hatenablog.com/entry/2014/12/15/053320)
だがぶっちゃけ面倒なのでバッファを開いた時にcd再設定してくれるautocmdを書いた。

#スクリプト
```lang:.vimrc
au BufEnter * execute findfile(expand('%')) != "" && resolve(expand('%:p')) != getcwd().'/'.expand('%') ? ":FollowSymlink"  : ""

command! FollowSymlink call s:SwitchToActualFile()
function! s:SwitchToActualFile()
  let l:fname = resolve(expand('%:p'))
  let l:pos = getpos('.')
  let l:bufname = bufname('%')
  enew
  exec 'bw '. l:bufname
  exec "e" . fname
  call setpos('.', pos)
endfunction
```

真面目にスクリプトを書いたの初めてなんでおかしな所があるかもしれない。
あとどのバッファを読んでもこのautocmd走るからレスポンスがどうのはあるかもなので気になったらまた改良しようと思う。


#追記(2016/05/25)
auが Command 条件式 実行する式で書ける事を知りませんでした。
```
au BufEnter findfile(expand('%')) != "" && resolve(expand('%:p')) != 
```
条件文の処理でレスポンスがまだアレかも知れないけどこっちの方がマシということで追記。

##更に追記
ガチで色々勘違いしてた。
以下が正しいautocmdのパッティーン。
(`:h autocmd`から引っ張ってきたので流石に間違いも無いだろう)
```
:au[tocmd] [group] {event} {pat} [nested] {cmd}
```

こちらが再修正スクリプト。ただイマイチAgitやfugitiveが遅いので何とかしていきたい。
```
  au BufEnter * if findfile(expand('%')) != "" && resolve(expand('%:p')) != getcwd().'/'.expand('%') | execute ':FollowSymlink' | endif
```
この辺とか参考。
[if statement - autocmd check filename in vim? - Stack Overflow](http://stackoverflow.com/questions/6009698/autocmd-check-filename-in-vim)
Cocos2d-x v3.x プロジェクトにFirebaseのSDKをCocoapodsを使わずに導入する(iOS版)

qiitaの使い方がわかりませんが、書きます。

Firebaseのサービスが一部無償化されましたが、公式ドキュメントでの導入方法としては
Cocoapodsの利用を推奨しています。

しかし、Cocos2d-xのプロジェクトとCocoaPodsの同居がいまいちわからなかったので、
SDKを直接インストールする方法を共有します。


#SDKの取得
firebaseの公式ドキュメント
https://firebase.google.com/docs/ios/setup#prerequisites
こちらのURLの最下部に
<img width="857" alt="スクリーンショット 2016-05-23 21.58.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/81327/19936d01-3bec-65ff-1b08-6e3c3d3e8d7b.png">

CocoaPodsを使わずにSDKをインストールする方法として、SDKのダウンロード先が記載されています。
https://dl.google.com/firebase/sdk/ios/3_2_0/Firebase.zip

現在時点での最新版はこちら。

これをダウンロードします。


#SDKの導入
ダウンロードしたSDKを展開します。
これを
cocosproject/proj.ios_mac/ios フォルダあたりにコピーします。
その後、xcodeプロジェクトを開き、
iosフォルダー下あたりに入れましょう。
<img width="382" alt="スクリーンショット 2016-05-23 22.01.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/81327/e1397fad-d995-7beb-838c-47dd74aae663.png">

一度、すべてのSDKをいれたあとで、使うやつだけを残して、後は Remove References で削除します。

基本機能はAnalyticsとCoreがあればいけると思いますが、AppIndexingとCrash(report)とDynamicLinksとRemoteConfigも無料で使える機能なので残します。
Invitesも無料機能ですが、これだけは謎のエラーで落ちてしまうので、削除しました。
（もしかしたら利用にAuthが必須なのかもしれません。）
Storageなどの機能はまだ利用していないので、ビルドに含んでいないですが、含めば使えるんじゃないかと思います。

次に、必要となるFrameworkですが、これはCocoaPodsから情報を得ます。
なぜかReadmeには書いてません。

OTHER_LDFLAGS = $(inherited) -ObjC -l"c++" -l"sqlite3" -l"z" -framework "AdSupport" -framework "AddressBook" -framework "AssetsLibrary" -framework "CoreGraphics" -framework "CoreLocation" -framework "CoreMotion" -framework "CoreTelephony" -framework "CoreText" -framework "FirebaseAnalytics" -framework "FirebaseAppIndexing" -framework "FirebaseCrash" -framework "FirebaseDynamicLinks" -framework "FirebaseInstanceID" -framework "FirebaseInvites" -framework "FirebaseRemoteConfig" -framework "GoogleAppUtilities" -framework "GoogleAuthUtilities" -framework "GoogleIPhoneUtilities" -framework "GoogleInterchangeUtilities" -framework "GoogleNetworkingUtilities" -framework "GoogleParsingUtilities" -framework "GooglePlusUtilities" -framework "GoogleSignIn" -framework "GoogleSymbolUtilities" -framework "GoogleUtilities" -framework "MessageUI" -framework "QuartzCore" -framework "SafariServices" -framework "Security" -framework "StoreKit" -framework "SystemConfiguration"

<img width="813" alt="スクリーンショット 2016-05-23 22.07.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/81327/e5aa8a91-ef57-0f5a-719a-29b67df24126.png">


上述されてるフレームワークでまだリンクされてないものを Link Binary With Library から追加しましょう。


後はBuildSettingsの中の Ohter Linker Flagsに "-ObjC"をなければ追加します。



#利用方法

Firebaseの管理画面から作成したplistファイルをリンクします。
<img width="279" alt="スクリーンショット 2016-05-23 22.10.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/81327/8e44deaf-e7a4-831f-936a-2a3ebfed1b2c.png">



その後
ios/AppController.mmに

```
#import "Firebase.h"

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  

    .....

    [FIRApp configure];
    [[FIRAppIndexing sharedInstance] registerApp:(number)];

}
```

(number)はInt型でアプリケーションID(iTunes Connectから発行される)をいれます。



AnalyticsとAppIndexingの機能が動くようになってると思います。
取り急ぎ。
CentOS7 に redis-3.2.0 をインストール

環境は以下の通りです。

```
# cat /etc/centos-release
CentOS Linux release 7.2.1511 (Core)
```

インストールに成功したのは以下の手順でした。

```
# yum -y install gcc tcl readline-devel
# cd /usr/local/src
# curl -O http://download.redis.io/releases/redis-3.2.0.tar.gz
# tar xvzf redis-3.2.0.tar.gz
# cd redis-3.2.0
# make
# make test
# make install
```

make する前に前提となるパッケージがインストールされていないとコンパイルエラーになって、
行くも引くもできない状態になり、何度か terminate することになってしまいました。。
javaの小数点メモ①

小数点以下に0が出ないようにして0は削除したい

    public static String format(float d)
    {
        if(d == (int) d)//0削除しなくてはならない場合
            return String.format("%d",(int)d);
        else//循環小数の場合
            return String.format("%.8s",d);
    }

やったぜ
「スタブコード」はなぜ「スタブ（切り株）」と呼ばれるのか


そういえば、スタブって何なんだろう？ テスト用の外部シミュレートコードや、IDE が初期状態でプロジェクト内に作成するカラの関数を指してスタブと呼ぶが。どういう意味なんだろう。

「元々の意味は、切り株のこと」とあるが、なぜこれが「スタブ」と呼ばれるかの説明にはなっていない。 ∥ [スタブ - Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%B9%E3%82%BF%E3%83%96)

英和辞書的にいうと、“stub” には「切り株」「使い残り」「タバコの吸いさし」「チケットの半券」「小切手の控え」などの意味がある。

つまりは、元々は何か「完全なもの」があったのだが、その内「利用できる部分」を使ってしまって残った「残り」のことを “stub” というようだ。

語源的には「切り株」が最初の意味であり、後にそこから連想されて「部分的に消費された結果残った、短かったり突き出たりしているもの」の意味に拡張された、とある。 ∥ [Online Etymology Dictionary](http://www.etymonline.com/index.php?term=stub)

それを踏まえて “Method stub” の項を読んでみると、“A stub may simulate the behavior of existing code (such as a procedure on a remote machine) or be a temporary substitute for yet-to-be-developed code.” ということで、つまり、「（完全体としての実メソッドから）肝心なロジックが削り取られており、振る舞いだけをする残りの部分だけを残したメソッド」のことを「スタブ」と呼ぶんだな。 ∥ [Method stub - Wikipedia, the free encyclopedia](https://en.wikipedia.org/wiki/Method_stub)

ということは、“stub method” における “stub” は、語源的には確かに「切り株」だが、ここでは切り株とは関係なくて、「本質部分の抜けた残り」という語義の方が重要なわけだ。

テスト用の「スタブ」の場合は、実物から本質的なロジックを取り払ってわざわざスタブを作るわけですから、こっちは正しい意味での “stub” です。

一方、テストではなく、開発の初期段階においてテンプレートとして用意される空っぽのメソッドや関数を「スタブ」と呼んだりすることもありますが、こちらの場合、これからその「本質部分」を作りこんで行くわけなので、ちょっと原義からすると分かりづらくなりますね。時系列が逆なんで（消費した後ではなく、これから作るわけなので）。
docker-machineでGoogle Compute EngineのプリエンプティブルVMを利用する


[如法会 1](https://wikinote.net/NyohoKai1)の資料です。

docker-machineでGCEのプリエンプティブルVMを利用するには`create`する際に`--google-preemptible`オプションを指定するだけです。一度createしたものを一度stopし、startした場合もプリエンプティブルVMになります。

n1-standard-1でも、1時間で$0.015です。カスタムしてもちゃんとお安くなるようです。

## 例

```
$ gcloud auth login
$ docker-machine create --driver google --google-project PROJECT_ID --google-preemptible --google-zone asia-east1-c [Dockerマシン名]
```

PROJECT_IDはご自分のPROJECT_IDをご指定ください。
--google-zoneも好みものをご指定ください。

引数は環境変数をつかって指定することもできるので、direnvなどで作業用ディレクトリをつくってあげて作業してます。

```
docker-machine create --driver google --google-project eiel-0224 --google-premptible --google-zone asia-east1-c dev
```

プリエンプティブルVMで動いているかどうかは

## インスタンスの作成はできたけどdocker動かない

途中で失敗してdockerがインストールされないことがあった。

docker machineの名前がdevの場合は以下で再インストール処理ができる。

```
$ docker-machine provision dev
```

## 再起動時によくつながらなくなる

IPが変わるからなのかしらないけど、証明書が無効になってる感じがする。起動するときはだいたい以下の感じ。

```
$ docker-machine start dev
$ docker-machine docker-machine regenerate-certs
$ eval $(docker-machine env dev)
```

## 勝手に停止する

プリエンプティブルインスタンスなので仕方ない。

## なぜプリエンプティブルインスタンスを使うのか

安い。70%OFFらしい。
n1-standard 1時間ぐらいなら 2円ぐらい。

## なぜdocker-machineを--driver googleを利用するのか。

* 比較的安い。課金が分単位(最低10分)
* dockerを試したいがローカルのディスクが残り少ない

一応いろいろ比較してみる。
プリエンプティブルVM安いけど、いろいろ考慮するとDigitalOceanは安いかもしれない。AWSのスポットインスタンスも安いけどなんとも言いがたい。


| インスタンス | 1時間あたりのコスト | 1日８時間 1ヶ月利用(243時間) | vCPU | メモリ |
|-------|------------------|----------------|--------------|------------------------|
| GCE n1-standard プリエンプティブル | $0.015/h | $4.02 | 1 | 3.75GB |
| GCE n1-standard 普通に利用 | $0.050/h | $12 | 1 | 3.75GB |
| Degitial Ocean $0.03/hr | $0.03/h | $7 | 2 | 2G |
| Degitial Ocean $0.06/hr | $0.06/h | $14 | 2 | 4G |
| Azure A1 | $0.055/h | $13 | 1 | 1.75G |
| Azure A2 | $0.11/h | $26 | 2 | 3.5G |
| AWS t2.small | $0.013/h | $6.3 | 1 | 3G |
| AWS t2.medium | $0.052/h | $12.636 | 2 | 4G | 
| AWS m4.large | $0.12/h | $29 |  2 | 8G |
| AWS m4.large | $0.0183/h | $4 | 2 | 8G | 

## 注意点

突然停止されることがある 24時間起動できない
シャットダウンまでの猶予は30秒

# 参考


* https://cloud.google.com/compute/pricing#predefined_machine_types
* https://docs.docker.com/machine/drivers/gce/
* https://azure.microsoft.com/ja-jp/pricing/details/virtual-machines/
* https://www.digitalocean.com/pricing/
* https://aws.amazon.com/jp/ec2/pricing/
NURO光の接続不良トラブル


NURO光にしてからAppleのiTunes やDeveloper 関係のサイトでの接続トラブルに見舞われているとの話がそこここで聞かれます。かくいう私も３月にNURO光になってから、まずiTunes でのアプリアップデートやアプリ購入がうまく行かなくなり、iTunes Connect での接続がエラーになったり、member Center への接続がうまく逝かなくなったりしています。
そこで、本日、NUROのサポートに電話をして問い合わせました。
NUROの回答は、
「以前にもそういう問い合わせがあって回線を調査したが、NUROの回線には問題が無かった。もし端末に問題が無いのであれば、Apple にNUROの回線からの接続になにか制限がないかを問い合わせてみてはどうか」
というものでした。
つまり、「そういって来る人はいるがNUROの問題とは認識していない」という事でした。
とはいえ、未だに接続は不安定ではあるものの、ここ１週間くらい少し状況が改善された感じがあります。以前は、iTUnes で例えば10個のアップデートがあると、2〜3個おきにエラーがでていましたが、最近は一度接続が確立するとすんなり最後まで行く感じです。
とにかく、本件悩んでいる方は、みんなでNUROにしつこく苦情を言いましょう。

さて、本日NUROに連絡したついでにわかったNUROの不具合について。
NUROの場合、ルータがZTE のF660とHuawei のHG8045の2種類がありますが、このうちZTEのF660では、ユーザー管理のパスワードが初期設定状態から変更できません。これはルーターのファームウェアのバグと言うことですが、今のところNUROでは調査中で、対策の予定はたっていないそうです。これはサポートサイトの障害情報などには一切公表されておらず、問い合わせた人にだけ個別対応しています。対応としては希望者にはHG8045に交換すると言うことです。ただしF660がアンテナの指向性が2方向なのに対してZD8045は単方向です。なので、設置場所によっては電界強度が変わる可能性があります。またNUROではHG8045に交換はするが、それで環境が悪くなったからと行ってF660Tに戻すということはできないと言うことです。
F660Tのこのセキュリティの問題が原因で被害が出たらどうするのかと聞いたところ、誠実に対応するとの回答でしたが、障害と発表もしていないことなどから、誠実に対応するとの回答を文書で出すか公表白と要求したところ拒否されました。
NUROにはいろいろ巷で悪い噂もありますが、みんなで行動すればよい方向になるかもしれません。
新人・若手SEがとっておくべき資格　- システム運用管理ver -


資格とは対極（と勝手に思っている）のQiitaに
あえて、取得すべき資格試験をまとめてみます。

今回は、システム運用管理編です。
内容は、ITサービスマネージャを目指す
新人〜若手をターゲットにしています。

オススメ度、難易度はあくまで私の主観です。
実はこれがオススメ！とか、これはあんまり重要じゃないよ。とかあれば、
どんどんコメントいただければと思います。

##ITIL4 Foundation
オススメ度：★★★★★
難易度　　：★☆☆☆☆

言わずと知れた、システム運用管理のマスト資格。
運用の世界では、ITIL用語は共通言語のようなものなので、真っ先に取得しましょう。
3日程度の研修でも取得できるレベルです。
（ITIL4になってからの難易度や研修については未検証です。）


##基本情報技術者試験
オススメ度：★★★★★
難易度　　：★★☆☆☆

国家資格。IT技術者にとって、これも必須資格。
早いうちに取得してしまいましょう。
幅広い知識を習得できます。

##応用情報技術者試験
オススメ度：★★★★★
難易度　　：★★☆☆☆

国家資格。基本情報の上位資格。これもほぼ必須だと思います。
NW、DB、セキュリティなど、選択式で分野を選べます。
難易度は、基本情報より簡単という声も。

##LPIC Lv1
オススメ度：★★★☆☆
難易度　　：★★☆☆☆

Linuxを扱うのであれば、必須だと思います。
結構業務で役立つ内容なので、学習しておいて損はないと思います。
Linuxを使わない場合でも、知っておいたほうが良いと思います。

##CCNA
オススメ度：★★★☆☆
難易度　　：★★★☆☆

NWの資格。ネットワークレイヤの理解には良いと思います。
実際にNW機器をさわることがないと、難しい場合もあります。

##AWS認定 ソリューションアーキテクト - アソシエイト
オススメ度：★★★★☆
難易度　　：★★★☆☆

パブリッククラウドの認定資格の中でも、一番知名度のあるAWSでエントリーレベルの資格。クラウドがコモディティ化してきている現在、業務利用を問わずに取得しておくのが良いでしょう。基本情報やLinux、NWの知識と組み合わせることではじめて威力を発揮するスキル。


##ITサービスマネージャ
オススメ度：★★★★★
難易度　　：★★★★☆

国家資格。応用情報技術者試験の上位資格。
上位資格は複数の分野で分かれていますが、運用系であれば、
この資格が良いでしょう。


##おわりに

資格を取得する目的はさまざまだと思いますが、
主に以下が多いのではないでしょうか。

- 自分をよく知らない人へ向けての客観的な指標
- 業務で使うスキルの体系的な理解

みなさんのキャリアビジョンごとに、取得して価値があるかどうかは異なりますが、
上述した資格は、システム運用の現場でITサービスマネージャを目指すのであれば
取得しておいて損はないと思います。


日々スキルアップを継続して、最高のパフォーマンスを発揮しましょう！
Do your best and high performance delivered!
locomotivecmsのwith_scopeでin句を使う

# 実装例

```index.liquid
{% with_scope tags.in: ['news', 'event'] %}
  {% paginate contents.events by 3 %}
    {% for event in paginate.collection %}
      <dl class="news-events-items">
        <dt>{{event.posted_at | date: '%Y年%m月%d日'}}</dt>
        <dd><a href="/events/{{ event._slug }}">{{ event.title }}</a></dd>
      </dl>
    {% endfor %}
  {% endpaginate %}
{% endwith_scope %}
```

# 注意事項

in句の対象フィールドのtypeは「tags」にする必要がある（多分)

```app/content_types/events.yml
fields:
- tags:
    label: Tags
    type: tags
    hint: Tags
    required: false
    unique: false
    localized: false
```

# 参考

https://github.com/locomotivecms/engine/issues/394#issuecomment-20134566
IntelliJでHaskell


[如法会 1](https://wikinote.net/NyohoKai1)の発表資料です。
IntelliJ IDEAのHaskellの開発環境を試したので、その際の構築手順です。s

最近はstackをインストールするだけでghcが使える。
なので、stackをインストールする。macOSの場合はhomebrewを使ってインストールできます。

```
$ brew install haskell-stack
```

他の環境や別のインストール方法は公式のドキュメントなどをご覧ください。
https://docs.haskellstack.org/en/stable/README/

IntelliJIDEAが利用するhaskellのパッケージをインストールする。

```
$ stack install hlint ghc-mod haskell-docs
```

[IntelliJ IDEA](https://www.jetbrains.com/idea/)をインストールする。
起動後 intelliJ-Haskellプラグインをインストールする。
現状、stackに対応してるプラグインはこれの模様。

# 参考

* https://github.com/rikvdkleij/intellij-haskell
Atom EditorでHaskell


[如法会 1](https://wikinote.net/NyohoKai1)の資料 その１です。
Atom EditorでHaskellの環境を整える記事はいくつかありましたが、ちょっと古げなので書いておきます。

最近はstackをインストールするだけでghcが使える。
なので、まずは、stackをインストールする。OS Xの場合をかいておく。

```
$ brew install haskell-stack
```

エディターが利用するhaskellのパッケージをインストールする。

```
$ stack install stylish-haskell hlint ghc-mod
```

[Atom Editor](https://atom.io/)をインストールする。
AtomをインストールしたらAtomを起動して「install shell Commands」でatomコマンドとapmコマンドをインストールする。

apmでパッケージをインストールする。


```
$ apm install ide-haskell autocomplete-haskell haskell-ghc-mod ide-haskell-repl language-haskell linter-hlint linter
```

インストール後、設定で変更した。

* autocomplete-haskellの「use Backend」を「haskell-ghc-mod」に変更
* ide-haskell-replの「Command Path」を「stack」に変更

大体の説明はide-haskellに書いてある。

`$HOME/.local/bin/`を環境変数PATHに追加している設定例をみたがatomコマンドをつかって起動している限りでは、stackをちゃんとつかえています。

## 気になってること

設定もapmからできるんじゃないかと気になっている。

## 入れたパッケージ

* https://atom.io/packages/ide-haskell
* https://atom.io/packages/autocomplete-haskell
* https://atom.io/packages/haskell-ghc-mod
* https://atom.io/packages/ide-haskell-repl
* https://atom.io/packages/language-haskell
* https://atom.io/packages/linter-hlint
* https://atom.io/packages/linter


# 参考文献

* http://harafuji0613.hatenablog.com/entry/2016/01/10/224641
* http://qiita.com/manji-0/items/463ea051f624a9a4a83a
condaにないパッケージをanaconda.orgにアップロードして管理する

# Introduction

condaでインストールできないパッケージは、通常pipでインストールしますが、condaでパッケージをbuildして管理することも可能(なはず)です。

**このやり方だけでは、必要なパッケージがpipとcondaの両方で入るっぽいのでいまいちです。**
**どなたか詳しいことをご存知な方がいらっしゃいましたらお教えください。**


# 必要パッケージ
condaでbuildするのと、anaconda.orgにアップロードするのに必要なパッケージをcondaでインストールします。

```
conda install conda-build anaconda-client
```
最近まで64bit Winは[バグがあった](https://github.com/conda/conda-build/issues/527)ため、windows使いで既にconda-buildが入っていた人はアップデートしておいた方がいいです。

```
conda update conda-build
```

# conda化&upload
例としてpandas_mlをconda化する場合はこんな感じです。
skeletonでbuildのレシピを作って、ローカルでbuild、必要に応じてanaconda.orgにアップロードします。

```ps1
mkdir work
cd work
conda skeleton pypi pandas_ml --version 0.3.0 
cd pandas_ml
conda build . --python=3.4
# To have conda build upload to anaconda.org automatically, use
# $ conda config --set anaconda_upload yes
conda build . --output
#>>> <anaconda root>\conda-bld\win-64\pandas_ml-0.3.0-py34_0.tar.bz2
```
### anaconda.orgを使わないでローカルでインストールする場合

```bash
onda install --use-local pandas_ml
```

### anaconda.orgにアップロードする場合

anaconda.orgのサインアップをしておきます。privateを使わなければ無料です。

```bash
anaconda login
#>>> Using Anaconda Cloud api site https://api.anaconda.org
#>>> Username: y__sama
#>>> Password:
#>>> login successful
#>>> y__sama's
anaconda upload <anaconda root>\conda-bld\win-64\pandas_ml-0.3.0-py34_0.tar.bz2
```

よくanacondaにアップロードする場合は`conda config --set anaconda_upload yes`を設定しておきます。

anaconda.orgからインストールする場合は、いつもどおりチャネルを指定してインストールでOKです。

```ps1
conda install -c y__sama pandas_ml
```

エラーが出ることがちょくちょくありますが、依存関係のあるパッケージが、condaでインストールできないかレシピ(meta.yaml)に記載されてないかが理由です。エラーが出た場合はメッセージを見ながら依存パッケージを別途conda buildで作っておくかmeta.yamlを編集するかが、必要になります。

http://conda.pydata.org/docs/build_tutorials/pkgs.html#troubleshooting

local内での環境copy

```bash
conda create -n env_copy --clone env
```

他のサーバへ(ファイルを介して)の移行

anaconda.orgにアップロードして使う場合は、channelを追加しておきます。

```bash
conda config --add channels y__sama
```

環境を一旦ファイルにエキスポートして、create時に--fileオプションで指定します。

```bash
conda list -e > env.txt
conda create -n env_file --file env.txt
```

でも、なぜかpipとcondaと両方入ってしまいます。。。

```bash
conda list
#>>> ...略
#>>> jsonschema                2.5.1                    py35_0    defaults
#>>> jupyter-client            4.2.2                     <pip>
#>>> jupyter-cms               0.5.0                     <pip>
#>>> jupyter-core              4.1.0                     <pip>
#>>> jupyter_client            4.2.2                    py35_0    defaults
#>>> jupyter_cms               0.5.0                    py35_0    y__sama
#>>> jupyter_core              4.1.0                    py35_0    defaults
#>>> libsodium                 1.0.3                         0    defaults
#>>> ...略
```

これでpip freezeとconda listを併用することなくconda listのみでパッケージ管理できるはず(なん)です。

詳しい方がいらっしゃいましたら、コメントをいただければ幸いです。

参考

https://gist.github.com/aphlysia/d5fcee79ff81b8272faf
http://conda.pydata.org/docs/build_tutorials/pkgs.html
http://docs.anaconda.org/cli.html
[社内イベント] よちよち.nb 2016年5月23日分 レポート

どうも、開発室所属の @mk2 です。

ニジボックス社内で毎週開催している技術イベント（懇親会？）があります。

それはなんと…

**よちよち.nb**

というイベントです！

よちよち.rbのパクリです！！

さて、よちよち.nbなのですが、下記のようなことをやっております。

- 初心にかえってプログラミングを学ぶ
    - Ruby Warrior
    - Paiza
    - CodingGame
    - CodeIQ
    - コードを書いて遊べるゲーム
    - などをやる（お菓子を食べつつ）
- ペアプロをやる
    - 社内ツール開発のペアプロとか
- 本職のプログラマ以外のひともプログラムを学ぶ
    - ディレクターの方なども参加予定です！

今回は2016年5月23日の開催の様子を写真とともにお送りします。

# 開催中の様子
合計5名のエンジニアが参加しました。お菓子は近くので買ったチョコボール（1080円/100g）をセレクトしました。ナッツ入りのチョコボールおいしー :laughing: 

![IMG_20160523_192258.jpg](https://qiita-image-store.s3.amazonaws.com/0/110347/d82cc961-c743-0e62-5ee3-1afd4d15a53c.jpeg)

# やったこと
CodeIQというプログラミング問題を解くウェブサービスを皆でやりました。取り組んだ問題は下記のような感じです。

- [「はしれ！コード学園」   JSちゃん(JavaScript)さんからの問題](https://codeiq.jp/q/2378)
- [言語不問：素数の数を数えてください](https://codeiq.jp/q/1621)
- [言語不問：「7」の数を数えよう](https://codeiq.jp/q/1630)

JSちゃんの問題はこんなことも知らなかったー！俺たちー！と自分で自分につっこみつつ、素数や７の問題はどうやるんだー！これー！と楽しんでコーディングしました。

~~本当は書いたコードも見せたいのですが、ちょっとまだ公開できる状況が整っていないので、また次回のレポートにご期待ください！~~
すいません、CodIQの回答コードは勝手に公開したらまずい感じでしたね。申し訳ございません。

以上、よちよち.nbレポートでしたー！
github製エディタAtomのおすすめプラグイン

#はじめに
[Atom](https://atom.io/) とはgithubが主な開発元になっているGUIです。
sublime、brackets、coteditorなど様々なエディタを使ってきて、UIと豊富なプラグインでAtomに一目惚れしてからAtomをずっと使っています。
なお以前はsublimeをメインで使っていて、sublimeのカスタマイズも記事にしているので、よろしければどうぞ[sublime text 3 の導入からカスタマイズまで](http://ken-sayama.hateblo.jp/entry/2015/08/21/003948)

ではAtomでおすすめのプラグインをざっと紹介します。 
なおベーシックなプラグインは避け、個人的に使っててこれ便利！ってなったものを随時紹介したいと思います。使い方については、atom.ioを見ていただければと思います。

###1.Git系
・[merge-conflict](https://atom.io/packages/merge-conflicts)
・[git-plus](https://atom.io/packages/git-plus)
・[tree-view-git-branch](https://atom.io/packages/tree-view-git-branch)
・[git-log](https://atom.io/packages/git-log)
・[tree-view-git-status](https://atom.io/packages/tree-view-git-status)

###2.
・[terminal-plus](https://atom.io/packages/terminal-plus)
Rasberry Pi3にRaspbianをインストールしてSSHでつなぐとこまで

備忘録として。

## やろうとしていること

![Screen Shot 2016-05-23 at 12.44.02.png](https://qiita-image-store.s3.amazonaws.com/0/46489/2e1b210f-2a57-96b8-4939-6d3b5efe050c.png "Screen Shot 2016-05-23 at 12.44.02.png")

今後各種センサを繋いで開発を行う[^1]ので、まずは開発しやすい環境を、ということで自宅などで自分のメインマシン(macPC)からSSH接続できるようにしたいと思います。

尚、自宅にHDMIモニタや外付けUSBキーボードが無いので、macPCでSDカードにOSイメージ(raspbian)を焼いて、それをラズパイ3に読ませるという手法をとりました。

## 必要なもの

 - macPC
 - Rasberry Pi3(以下ラズパイ3)
 - MicroSDカード([コレ](http://www.amazon.co.jp/dp/B00BLHWYVO)を使いました)
 - SDカード変換アダプタ(macPCのスロットがSDカード用なので)
 - 電源(5V, 1.2A以上)
 - LANケーブル
 - 無線LANルーター

※ HDMIモニタ、キーボードは使いません

## 手順

## 公式サイトでOSイメージをDL

[公式サイトDLページ](https://www.raspberrypi.org/downloads/raspbian/)

![Screen Shot 2016-05-21 at 14.32.59.png](https://qiita-image-store.s3.amazonaws.com/0/46489/4e6b8857-e0b0-f8bc-b4dc-964d2c9b7a1f.png "Screen Shot 2016-05-21 at 14.32.59.png")

左がDesktop版、右がミニマル。大は小を兼ねるということで左を選択。サイズは約1.4GBでした。

## 1. DLしたOSイメージが正常か確認する(チェックサムのdiffを取る)

1. 上記DLサイトにSHA1キーが記載されています。そちらをコピーして`CS_site.txt`とかいう名前で保存します
2. DLしたzipファイルのチェックサムを別ファイルに保存します: `shasum 2016-05-10-raspbian-jessie.zip > CS_DL.txt`
3. 1と2で作成したファイルの差分をとります: `diff CS_site.txt CS_DL.txt`

特に差分がでなければOK、差分がでたらダウンロードしたデータに異変があるので、再度ダウンロードするなりします。

## 2. OSイメージをmicroSDカードに焼く

1. macのSDカードスロットにmicroSDカード装着済のSDカードアダプタを挿入
2. terminalを開いて以下の要領でマウント

```bash

## SDカードのエンドポイントを探す。僕の場合は `/dev/disk2` でした
diskutil list

## 一度アンマウントします(マウントされた状態だとOSイメージを焼くddコマンドが使えないので)
sudo diskutil unmountDisk /dev/disk2

## OSイメージのzipを解凍します(普通にFinderからダブルクリックで解凍でもOK)
cd ~/Downloads
unzip 2016-05-10-raspbian-jessie.zip

## OSイメージをmicroSDカードに転送します
sudo dd bs=1m if=2016-05-10-raspbian-jessie.img of=/dev/rdisk2

## 転送中、様子を見たいときはctrl+tで進捗状況を確認できます
```

## 3. ラズパイ3にsshで接続する

### 前準備
1. 上の手順でOSイメージを入れたmicroSDカードをラズパイ3のmicroSDスロットに挿します
2. ラズパイ3に電源をいれます。5V 1.2A必要らしいですが、僕は[このモバイルバッテリー](http://www.amazon.co.jp/dp/B00DVEC7J4/ref=twister_B00EYW2IKA?_encoding=UTF8&psc=1)を使いました。

### ラズパイ3のIPアドレスを取得
1. macPCのterminal上から`arp -a > before_ips.txt`を実行してラズパイ接続前のIP一覧を取得します
2. 無線LANルーターにラズパイ3をLAN接続して30秒くらい待ちます
3. macPCのterminal上から`arp -a > after_ips.txt`を実行してラズパイ接続後のIP一覧を取得します
4. `diff before_ips.txt after_ips.txt`として出てきたIPアドレスが恐らくラズパイ3のIPです

上記ででなければ、新しいIPが大抵新しく追加されたIPなので総当りしてみます。

### ssh接続
ラズパイはデフォルトでsshが有効になっているとのことで、上記4の手順で取得したIPを用いて以下のようにssh接続します。

```
## パスワードはデフォルトだと raspberry でxの部分は上記で取得したIP
ssh pi@x.x.x.x
```

無事接続できると以下のようになります。

![Screen Shot 2016-05-23 at 18.42.14.png](https://qiita-image-store.s3.amazonaws.com/0/46489/0083247d-ec18-6571-c50e-ab47759e27ce.png "Screen Shot 2016-05-23 at 18.42.14.png")

## 参考

Raspberry Pi 2 Model BのOSインストールと初期設定
https://www.generation.ne.jp/topics/raspberry01/

Mac OS X で Raspberry PiのOSイメージを焼く
http://ledsun.hatenablog.com/entry/2014/10/26/174712


DDコマンド
http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230741/

[^1]: 経緯は[『普通のハウスを拡張して太陽光型植物工場にしてみたいという話』](http://ag.dotsnest.com/entry/2016/05/06/194528)を参照
いまさらリーダブルコードまとめ（第9章）

#はじめに
チーム内リーダブルコード輪読会の第9章。
第8章は[こちら](http://qiita.com/sora083/items/046118e41ab674160d9c#_reference-1a61886410b0b5fd3c6e "第8章 巨大な式を分割する")

#第9章 変数と読みやすさ
## どんな内容？
**変数は書き込みを1度だけに抑え、使用箇所の直前で定義すべきである。**
反対に何度も書き換わり、何処で使用されているかわからない変数は
コードを難解にし読みづらくさせる。
また、処理分岐の判断として中間結果を保持するために変数を使う事は
コード量の増加に繋がり簡潔で読みやすいコードからかけ離れてしまう。

## 読んだ感想
Javaを学習した事がある人であれば誰もが見聞きした「グローバル変数は使うな！」
と教えられた理由がよくわかった。
また、変数を減らす事で余計な追跡をする必要が無くなり
コードが読みやすくなるという結果になることは新たな気付きだった。
ただ、用途が的確に理解できるような説明変数は、使用することでコードを読みやすくもできるので
変数を減らす事だけに拘り続けるのは注意が必要だと感じた。

## 例を挙げて議論してみよう
### 変数を削除すると読みやすくなる？
fainalや拡張for文を使って変数をなくしてみる。
【変数あり】

```java:9-1
final List<String> sl = getStringList();
for (int i = 0; i < sl.size(); i++) {
    System.out.println(sl.get(i));
}
```

↓
【変数なし】

```java:9-1
for (final String s : getStringList()) {
    System.out.println(s);
}
```

簡略化されコード量は少なくなった。
読みやすさとしては個人差が出るのでは？

### javascript ではスコープを縮める+関数の先頭で変数宣言しよう
以下の2例では結果が同じだが見比べてみよう。
【javascriptの特徴を抑えよう】

```js:9-2
var hogeScope = "GlobalVar";

function getScopeValue() {
    console.log(hogeScope);  // ①
    var hogeScope = "LocalVar";
    return hogeScope;
}

console.log(getScopeValue()); // ②
console.log(hogescope);      // ③
```
①は undefined (変数宣言はホイスティングされるが、代入はされない)
②は "LocalVar" (ローカル変数を参照)
③は "GlobalVar" (グローバル変数を参照)

★javascriptでは変数宣言前でもホイスティングできてしまう。

【関数内の先頭で変数宣言】

```js:9-2
var hogeScope = "GlobalVar";

function getScopeValue() {
    var hogeScope;
    console.log(hogeScope);  // ①
    hogeScope = "LocalVar";
    return hogeScope;
}

console.log(getScopeValue()); // ②
console.log(hogescope);      // ③
```
①は undefined　(変数宣言のみなのでundefined)
②は "LocalVar" (ローカル変数を参照)
③は "GlobalVar" (グローバル変数を参照)

スコープを小さくすることだけを意識すると、必要になった場所で
変数宣言しがちになるが、関数内の先頭に変数宣言をすることで
ブロックスコープがないjavascriptではコードが読みやすくなる。
ElasticBeanstalkのDocker Multi-containerでawslogsを有効にする


ecs-agentの1.9.0以降では、DockerのLogDriverにawslogsを指定できます。

で、ECSを直接使う分には`logConfiguration`で指定すればよいのですが、ElasticBeanstalkから利用できるECS(に限らずですが)環境はいつもちょっと古く、この記事時点の最新でも1.8.2です。

待ってりゃ1.9.0にはなるんでしょうが。。ひとまず強引にやってみました。


## 段取りとebextensions

awslogsを使えるように設定しつつ、ecs-agentを更新する段取り。ひとまずこれでうまく動いたのでよしとします。

- ECS_AVAILABLE_LOGGING_DRIVERS設定を追加し、オプションの値にawslogsを許可する
    - すでにあれば何もしない
- amazon-ecs-agentの`v1.9.0`をpullし、無理やりlatestタグを付与する
    - ※ 別にlatestをそのままpullしても構いません。
- ecs-agentコンテナを削除して、リスタート

以上を踏まえた`ebextensions`がこちら。ecs-agent再起動へのステップで色々やっています、なくてもよい行も多分あるかなあ。

```.ebextensions/01-logdriver.config
files:
  "/root/setup-available-log-dirvers.sh":
    mode: "000755"
    owner: root
    group: root
    content: |
      #!/bin/sh
      set -e
      if ! grep awslogs /etc/ecs/ecs.config &> /dev/null
      then
        echo 'ECS_AVAILABLE_LOGGING_DRIVERS=["json-file","syslog","awslogs"]' >> /etc/ecs/ecs.config
        /usr/bin/docker pull amazon/amazon-ecs-agent:v1.9.0
        /usr/bin/docker tag -f amazon/amazon-ecs-agent:v1.9.0 amazon/amazon-ecs-agent:latest
        /usr/libexec/amazon-ecs-init pre-stop
        /usr/bin/docker rm ecs-agent
        /usr/libexec/amazon-ecs-init pre-start
        /sbin/initctl start -n ecs
      fi

container_commands:
  01-configure-awslogs:
    command: /root/setup-available-log-dirvers.sh
```

これをデプロイした後にenvをクローンしても大丈夫だったので、まあなんとかなってるんでしょう。

このebextensionsの元ネタはこちら。 [http://stackoverflow.com/questions/35789111/how-to-use-fluentd-log-driver-on-elastic-beanstalk-multicontainer-docker](http://stackoverflow.com/questions/35789111/how-to-use-fluentd-log-driver-on-elastic-beanstalk-multicontainer-docker)

## サンプル Dockerrun.aws.json

では実際に使ってみるとして、指定の例を置いときます。`logs-group=eb-awslog-test`、ストリームはコンテナIDでログが投入されました。

```Dockerrun.aws.json
{
  "AWSEBDockerrunVersion": 2,
  "volumes": [
  ],
  "containerDefinitions": [
    {
      "name": "distribution",
      "image": "registry:2",
      "essential": true,
      "cpu": "1",
      "memory": 128,
      "mountPoints": [
      ],
      "portMappings": [
        {
          "hostPort": 80,
          "containerPort": 5000,
          "protocol": "tcp"
        }
      ],
      "logConfiguration" : {
        "logDriver": "awslogs",
        "options": {
          "awslogs-region": "ap-northeast-1",
          "awslogs-group": "eb-awslog-test"
        }
      }
    }
  ]
}
```


## おわりに

もし使ってみようと思っても、真似する前に既にecs-agentのバージョンが1.9.0以降になってないか確認しましょう。

バージョンは`agent --version`で出てきます。

```
# docker exec -it 81f4c4d3e819 /agent --version
2016-05-23T10:23:25Z [INFO] Starting Agent: Amazon ECS Agent - v1.9.0 (0931217)
2016-05-23T10:23:25Z [INFO] Loading configuration
2016-05-23T10:23:25Z [WARN] Invalid value for task cleanup duration, will be overridden to 3h0m0s module="config" parsed value="0" minimum threshold="1m0s"
Amazon ECS Agent:
	Version: 1.9.0
	Commit: 0931217
	DockerVersion: 1.9.1
```
nginxで複数のproxyを経由する場合でもアクセス元IPアドレスを取得する

nginxでアクセス元IPを使って、ログを残したりアクセス制限をしたいときに、手前にELBなどが入っていると、そのままではクライアントのIPアドレスではなく、ELBのアドレスが取得されてしまいます。

ELBだけであれば、以下のページの設定で対応できます。

- [nginx でアクセス元のIPを正しく表示させる方法 - Qiita](http://qiita.com/yakumo3/items/dc38a9b6c19194a88922)

しかし、ELB以外のサーバなども間に入ってくると、これだけでは対応できません。
複数のProxyを通る場合、`X-Forwarded-For`は複数の値が入ります。

```
X-Forwarded-For: client1, proxy1, proxy2, ...
```
この場合でも一番左のアドレスを取得するためには、複数の `set_real_ip_from`を記述し、また、`real_ip_recursive`を有効にします。


例えば次のような感じです。

```
set_real_ip_from XXX.XXX.XXX.XXX/24;
set_real_ip_from YYY.YYY.0.0/16;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
```

これで期待するアクセス元IPアドレスが取得できるようになります。


### 参考

- [reverse proxy - nginx real_ip_header and X-Forwarded-For seems wrong - Server Fault](http://serverfault.com/questions/314574/nginx-real-ip-header-and-x-forwarded-for-seems-wrong)
git 現在作業中のブランチをcommitしないで、他のブランチ作業したい場合

## git 現在作業中のブランチをcommitしないで、他のブランチ作業したい場合


現在の作業保存

```
git stash
```


ブランチ移動後作業を終えた後、元の作業ブランチに戻り、以下作業中の状況に戻れる


```
git stash apply
```


stashのリストを見る

```
git stash list
```

作業中いきなり、ブランチを変えないといけない時に便利ですね。
pip 標準機能だけでパッケージを更新

とりあえずささっと pip の標準機能だけで管理しているパッケージを更新したい方向けです。

#準備
環境は Win7 64bit です。
PyCharm を起動していると更新でアクセスエラーが起きますので終了してください。
コマンドプロンプトを管理者権限で起動してコマンド入力します。

#パッケージ一覧の表示
```pip list -o```
で、パッケージの一覧を取得します。
先頭にパッケージ名が表示され、その後に現在のバージョンと最新のバージョンも表示されます。


>\>pip list -o
Pillow (2.8.1) - Latest: 3.2.0 [wheel]
PySide (1.2.2) - Latest: 1.2.4 [wheel]
setuptools (12.0.5) - Latest: 21.2.1 [wheel]

#パッケージの更新
```pip install -U パッケージ名```
あとは、手動でパッケージを更新します。 -U は --upgrade と同じです。
たとえば Pillow パッケージのアップデートならば次のようになります。
>\>pip install -U Pillow
Collecting Pillow
  Downloading Pillow-3.2.0-cp34-none-win32.whl (1.2MB)
    100% |################################| 1.2MB 793kB/s
Installing collected packages: Pillow
  Found existing installation: Pillow 2.8.1
    Uninstalling Pillow-2.8.1:
      Successfully uninstalled Pillow-2.8.1
Successfully installed Pillow-3.2.0
railsでcarrierwaveを使って画像をアップロード、表示

私的メモ

carriwaveを使ってファイルをアップロード、そして表示させるミニマム手法

##前提

scaffoldで基盤が作られている。
carrierwave用のカラムも`image:string`としてついでに作っておく。

```lang:Gemfile
>rails g scaffold user name:string body:text image:string
.処理
.
.
>rake db:migrate
```

##Gemインストール

```lang:Gemfile
gem 'carrierwave'
```

bundle installを忘れずに

```lang:terminal
>bundle install
```


##おまじない

もし、Gemをインストールしたあとrails consoleを使用して「uninitialized constant Event::EventImageUploader」とエラーがでるならおまじないが必要

module WorkspaceのクラスApplication内に記述

`config.autoload_paths += Dir[Rails.root.join('app', 'uploaders')]`


```lang:application.rb
module Workspace
  class Application < Rails::Application
.省略
.
.
#おまじない開始
    config.autoload_paths += Dir[Rails.root.join('app', 'uploaders')]
#おまじない終わり
  end
end
```

##carriewaveの設定ファイル？の作成

```lang:terminal
>rails g uploader images
```

`app/uploaders/images_uploader.rb`でファイルの中身はclass ImagesUploader生成される

##DBテーブルへ画像保存用のカラムを追加

ファイルパスを保存するカラムを追加する。
**（今回は予めscaffoldで`image:string`を定義していたので下記の作業は飛ばしてOK。）**

```lang:terminal
>rails g migration add_image_to_user image:string
.
.
>rake db:migrate
```

##モデルのとの紐づけ

`mount_uploader :carrierwave用に作ったカラム名, carrierwaveの設定ファイルのクラス名`

上の一行を関連づけるモデルに追加。
今回はscaffoldでuserモデルを作成していたのでuser.rbに記述する

```lang:user.rb
class User < ActiveRecord::Base
    mount_uploader :image, ImagesUploader
end
```

##ファイルのアップロード

たぶんscaffoldで自動で作られた:image用のフォームは`f.text_field :image`になので、`f.file_field`に変更する。

```lang:_form.html.erb
<%= f.label :image %>
<%= f.file_field :image %>
.
.
```

##画像の表示

画像の表示はviewに`image_tag user.image.to_s`で表示させる


```lang:index.html.erb
 <% @users.each do |user| %>
      <tr>
        <td><%= image_tag user.image.to_s %></td>
      </tr>
 <% end %>
```
Watson IoT Platform - Node-RED - センサーからの最新値を取得する

#センサーからの最新値を取得する
- センサーから非同期に送付されてくる値について、最新（最後）に送付された値を定期的に取り出す方法です。
- [Node-REDのフローをコピーする方法](http://qiita.com/egplnt/items/84b244a50d8bdaced324)を参照して、下記のフローをコピペします。

```lang:センサーからの最新値を取得する
[{"id":"950d6b21.50386","type":"inject","z":"b82825b4.1760d","name":"","topic":"","payload":"","payloadType":"str","repeat":"","crontab":"","once":false,"x":190,"y":180,"wires":[["e2d55676.90d288"]]},{"id":"e2d55676.90d288","type":"function","z":"b82825b4.1760d","name":"cacheから取り出し","func":"msg.payload = context.global.lastcache;\nreturn msg;","outputs":1,"noerr":0,"x":370,"y":180,"wires":[["fe2b7eff.5636d"]]},{"id":"fe2b7eff.5636d","type":"debug","z":"b82825b4.1760d","name":"","active":true,"console":"false","complete":"payload","x":570,"y":180,"wires":[]},{"id":"5d5b341b.e1cf4c","type":"function","z":"b82825b4.1760d","name":"cacheに待避","func":"context.global.lastcache = msg.payload;\nreturn msg;","outputs":1,"noerr":0,"x":570,"y":120,"wires":[["3617eb0d.5c68bc"]]},{"id":"11345bf2.842c1c","type":"function","z":"b82825b4.1760d","name":"日付を追加","func":"var date = parseInt(new Date / 1000);\nvar dt = new Date();\nvar year = dt.getFullYear();\nvar month = dt.getMonth()+1;\nvar day = dt.getDate();\nvar hour = dt.getHours()+9;\nvar minute = dt.getMinutes();\nvar second = dt.getSeconds();\n//if (!msg.payload) {\n//    msg.payload = { \"initial\": \"value\" };\n//};\nmsg.payload.date = {\n        \"date\": date,\n        \"year\": year,\n        \"month\": month,\n        \"day\": day,\n        \"hour\": hour,\n        \"minute\": minute,\n        \"second\": second\n}\nreturn msg;","outputs":1,"noerr":0,"x":350,"y":120,"wires":[["5d5b341b.e1cf4c"]]},{"id":"3617eb0d.5c68bc","type":"debug","z":"b82825b4.1760d","name":"","active":false,"console":"false","complete":"payload","x":750,"y":120,"wires":[]},{"id":"9f2518c1.82099","type":"ibmiot in","z":"b82825b4.1760d","authentication":"quickstart","apiKey":"","inputType":"evt","deviceId":"324255ecdf55","applicationId":"","deviceType":"+","eventType":"+","commandType":"","format":"json","name":"IBM IoT","service":"quickstart","allDevices":"","allApplications":"","allDeviceTypes":true,"allEvents":true,"allCommands":"","allFormats":"","x":170,"y":80,"wires":[["11345bf2.842c1c"]]}]

```

![スクリーンショット 2016-05-23 18.37.16.png](https://qiita-image-store.s3.amazonaws.com/0/125842/18dcbf36-b767-7670-7d66-fe526cd04d5c.png)

- センサーからの情報を`context.global.cache`へ待避します。深さ１のスタックのイメージです。
- Injectノードの「Interval」を必要な間隔（例：５分毎、など）に設定し、そのタイミングでキャッシュ（`context.global.cache`）に待避されている情報を取り出すことで、常に最新（最後）のセンサー値を入手することができます。
ヘッダーの"Laravel"と"Home"はどこへ飛ぶのか


記事にするほどでもないですが。
Laravelの認証機能は簡単便利（？）、でもいつもヘッダーのボタンのリンク先を忘れるのでメモを。

##Laravel
ランディングページ（ログイン関係なく最初に着地するページ） 

##Home
ログイン画面のページ

##備考

###参考
Laravelの[公式ページ](https://laravel.com/ "公式ページ")、[Authentication](https://laravel.com/docs/5.2/authentication "Authentication") と [Authorization](https://laravel.com/docs/5.2/authorization "Authorization") のところ。

###認証機能のコマンド

```
$ php artisan make:auth
```

このコマンドを実行するとWelcomeページがランディングページになる。
うまくいかないときはサーバーを立て直してみるといいかも。
Red Hat Enterprise Linux 7.2 KVM環境導入(yumでインストール)


# 概要
Red Hat Enterprise Linux 7.2にKVM環境をyumでインストールする。

# 前提環境

Red Hat Enterprise Linux 7.2  ・・・以下「RHEL7 VM」と表記
- Red Hat Developer Programでライセンス取得
- ESXi6.0上の仮想マシンとして稼働している
- KVM環境は一切未導入
(OSインストール時に「Virtual Host」を選択していない)

```bash
# uname -a
Linux redhat7.kowloonet.local 3.10.0-327.13.1.el7.x86_64 #1 SMP Mon
Feb 29 13:22:02 EST 2016 x86_64 x86_64 x86_64 GNU/Linux
```

# 仮想化対応に構成変更
この時点ではRHEL7 VMは仮想化に未対応の状態

```bash
$ egrep -c '(vmx|svm)' /proc/cpuinfo
0
```

いったんRHEL7 VMをシャットダウンし、.vmxファイルを編集
最下行に以下を追記

```text:ネスト構成での仮想化を有効化
vhv.enable = "TRUE"
```

起動後再確認

```bash:仮想化対応の確認
$ egrep -c '(vmx|svm)' /proc/cpuinfo
4
```

# KVMのインストール

## 対象パッケージ

```
kvm
virt-manager
virt-install
virt-viewer
libvirt
libvirt-python
python-virtinst
```

インストールコマンド

```
# yum install kvm virt-manager libvirt libvirt-python python-virtinst virt-install virt-viewer
```

モジュールのロードを確認

```
# lsmod | grep kvm
kvm_intel             162153  0 
kvm                   525409  1 kvm_intel
```

KVMの自動起動を有効化

```
# systemctl start libvirtd
# systemctl enable libvirtd
```

# 仮想マシンの準備

KVM上で仮想マシンを作成し、Ubuntu16.04をインストールする。

仮想マシン作成後、起動前に設定を編集
表示>詳細

- ディスプレイ
「Spiceサーバー」(デフォルト)から「VNCサーバー」に変更

![rhel7-kvm-install-03.png](https://qiita-image-store.s3.amazonaws.com/0/126068/b679df28-c908-f129-824b-049314d0afc6.png)

【補足】
ディスプレイをSpiceサーバ(デフォルト)のままにしておくと、仮想マシン起動時にエラーとなる

![rhel7-kvm-install-01.png](https://qiita-image-store.s3.amazonaws.com/0/126068/76be96bf-ed4e-074d-83bd-a0d474956da6.png)

対処として、以下サイトを参考にディスプレイをVNCに変更
[CentOS7の仮想マシンマネージャーのコンソールエラー](http://shobon.hatenablog.com/entry/2015/06/02/203600)

- Boot Options
「IDE CDROM 1」にチェックし順序を1番目に移動

![rhel7-kvm-install-04.png](https://qiita-image-store.s3.amazonaws.com/0/126068/fe32325e-dcda-c56a-2a3c-e88b7c1612c3.png)


- IDE CDROM 1
Ubuntu16.04のISOファイルを指定

![rhel7-kvm-install-05.png](https://qiita-image-store.s3.amazonaws.com/0/126068/cd5dc5a3-813d-ea52-749f-eff8baf2676d.png)

# ゲストOSのインストール
KVM上で仮想マシンを起動し、OSインストール実施。

![rhel7-kvm-install-06.png](https://qiita-image-store.s3.amazonaws.com/0/126068/f2a8b247-c751-47ff-b7f2-8765ce4d7a4d.png)

以降、特にエラーも無く完了。
sshでファイル転送の手順

#はじめに
サーバー環境によっては、セキュリティー上FTPソフトでのファイル転送ができないことがあります。
その際、ターミナルなどのCLIを使ってのファイルの転送をするのですが、デザイナーの方などの普段あまりコマンドライン上での作業をすることがない方々の参考になればと思います。
※ Mac OSを前提


## 1.sshでサーバーにログイン
まずはサーバー情報を用意
1.サーバー名：hoge.comやhoge.sakura.ne.jpなど
2.アカウント名：hoge-user
3.サーバーパスワード:レンタルサーバーの場合ランダムで適当な文字列であることが多いです。例：bb45Ri34みたいな

上記を用意したあとターミナルを起動します。
ターミナルは「command+space」を押し、「ターミナル」と打って検索にヒットするはずです。
ターミナル起動後、`$ ssh アカウント名@サーバー名`と入力。
$は打たなくて大丈夫です。上記のサーバ情報だと`ssh hoge-user@hoge.com`と入力することになります。入力後passwordの入力を求められるので、サーバーパスワードを入力、ターミナルにパスワードを打ち込む際に何も表示されてないので分かりづらいですが、ちゃんと入力されているので、入力後Enterを押します。
サーバーにログイン後、ターミナルに`[アカウント名@localhost ]$`のような感じでプロンプトが置きかわるかと思います。そうなっていればログイン完了です。





##2.サーバー内のディレクトリを確認
現在自分がどの階層にいるのかをチェックします。
以下主に使うコマンド

```
$ pwd //現在の階層を確認
$ ls //現在の階層にあるフォルダとファイルを確認
$ cd フォルダ名 //cdコマンドでディレクトリを移動できます
$ cd .. //一つ上のディレクトリ階層に移動
$ cd //cdのみでEnterを押すとルートディレクトリまで移動できます
$ vi ファイル名 //Vimエディタを立ち上げファイルの中を確認
```
基本的に`pwd`コマンドで階層を確認、`ls`コマンドでディレクトリを確認、`cd`コマンドでアップロードを行うディレクトリまで移動というのが作業の流れかと思います。

##3.SCPコマンドでファイルの転送
上記で、アップロードを行うディレクトリを確認したらscpコマンドを使ってファイルの転送を行います。
zip形式の方が早く転送出来そうな気がしたので、アップロードを行いたいフォルダをzipに圧縮しておきました。

```
// ローカル(自分のPC)からリモート(サーバー)へ
// scpコマンドの引数オプションで -rを使うとディレクトリを転送出来ます。
$ scp -r /Repository/hoge.zip hoge-user@hoge.com:/home/hoge/share/hoge-upload-theme
//上記入力後パスワードを聞かれますので、sshの際に入力したパスワードを入力
```
上記を解説します。
1.　`$ scp -r`はscpコマンドの引数オプションをもたせてディレクトリを転送する方法です。自分の場合zipに圧縮したのでつけなくても大丈夫でした。
2.　`/Repository/hoge.zip`はローカル(自分のPC)内にあるどのファイルもしくはディレクトリを転送するか指定しています。Repositoryディレクトリにあるhoge.zipファイルを転送するよということです。
3.　`hoge-user@hoge.com`は上の方でもやったアカウント名@サーバー名になります。
4.　`hoge-user@hoge.com:/home/share/hoge-upload-theme`はsshでログイン後`pwd`コマンドで階層を確認した際の一番上のディレクトリから入力します。たいていの場合homeディレクトリからかと思います。

以上で転送出来たかと思いますが、自分の場合zipで転送してしまったので、再度sshでログインして、zipファイルを解凍する必要があったので、こちらも併せて書いておきます。

## 4.おまけ
`scp`コマンドで転送したzipファイルを解凍する。
再度sshでログイン`$ ssh hoge-user@hoge.com`入力後、パスワードも入力してログイン完了。
`pwd`コマンドで現在の位置確認、`/home/`ディレクトリにいる。
転送したフォルダまで移動、`/home/share/hoge-upload-theme`に転送したので、`cd /share/hoge-upload-theme`移動。
`ls`コマンドで中にhoge.zipがあるか確認。
`$ unzip hoge.zip`で解凍が出来ます。
ついでにzipファイルは要らないので、`rm hoge.zip`として要らないzipファイルを削除しておきました。
Ruby1.9以前でバイナリサーチ

Ruby2.0以降はArray#bsearchが、2.3以降はArray#bsearch_indexが標準でありますが、どうしても1.9を使わなければいけないことがあったので、自前で実装しました。
仕様としては[Ruby2.0のArray#bsearch](http://docs.ruby-lang.org/ja/2.0.0/method/Array/i/bsearch.html)のfind-minimumモードと同じにしてあります。

```ruby:bsearch.rb
class Array
  def bsearch(&block)
    index = bsearch_index(&block)
    index.nil? ? nil : self[index]
  end

  def bsearch_index(&block)
    return nil if length == 0
    bsearch_impl(self, &block)
  end

  def bsearch_impl(ary, &block)
    if ary.length == 1
      return block.call(ary[0]) ? 0 : nil
    end

    index = ary.length / 2

    if block.call(ary[index])
      recursion = bsearch_impl(ary.slice(0..(index - 1)), &block)
      recursion || index
    else
      recursion = bsearch_impl(ary.slice(index..-1), &block)
      recursion ? recursion + index : nil
    end
  end

  private :bsearch_impl
end
```

真ん中の要素でブロックを実行して、trueが返ればそれ以前の部分配列に、falseなら後ろの部分配列に対して再帰的に`bsearch_impl`を適用しています。
再帰を使ってはいますがバイナリサーチなので、スタックが溢れるほど再帰が深くなることはない、はず……

ろくにテストもしてないので、バグがあったらツッコんでやってくださいｗ
AWSでつかわれるCLIについて

##AWS CLI
2013年9月発表
ほとんど全てのサービスを操作できるCLI
文法に規則性があるため使いやすい
昨今これが主に使われる

<pre>
コマンド例
aws ec2 describe-instances
</pre>

##CLI Tools
古いサービス
運用暦の長い環境でみかけることがあるが、基本的にはAWSCLIに移行すべき
サービスごとにCLIのパッケージをインストールする必要がある
例えば、ec2を操作するためには下記cli-toolsをインストールする必要がある
http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/CommandLineReference/command-reference.html

<pre>
コマンド例
ec2-describe-instances
</pre>

##AWS Shell
2015年12月発表
新しく、まだ開発プレビュー
https://github.com/awslabs/aws-shell

aws-shellとコマンドすることで、専用モードに入り、
そこでawscliコマンドを入力すると、コマンドがするする補完される。コマンドだけでなく、インスタンスidとかも補完される。
(メモ)simple_formでhintをキャンセルしたい

# 前提
* rails 4.2.4
* simple_form 3.0.2

# なんで書いたか
ググってもすぐ出てこなかったので


# 困った事

便利なhintだけど場合によっては必要無いときがある。

```haml
= simple_form_for @user
  = f.input :name
```

```html
<p class="help-block">名前を入力してください。</p>
```

消したいと思い、空文字やnilにすると

```haml
= simple_form_for @user
  = f.input :name, hint: ''
```

```html
<p class="help-block"></p>
```
hint-blockだけ出てきてしまってレイアウト上邪魔


# 解決方法

`hint: false`にする事でhint-blockごと消える

```haml
= simple_form_for @user
  = f.input :name, hint: false
```
SwiftでMapアプリを開く

## 地味に見つからなかったのでメモ

```swift
let daddr = NSString(format: "%f,%f", latitude, longitude)
let urlString = "http://maps.apple.com/?daddr=\(daddr)&dirflg=d"
let encodedUrl = urlString.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet())!
let url = NSURL(string: encodedUrl)!
UIApplication.sharedApplication().openURL(url)
```

`daddr`に行きたい位置情報を入れて、`dirflg`で探索方法(`d` or `w` or `r`)を指定してマップを開くと探索してくれる。
`saddr`に`daddr`と同じ形式で緯度経度を入れると、現在地ではなく指定された場所から検索してくれる。

[Map Links](https://developer.apple.com/library/ios/featuredarticles/iPhoneURLScheme_Reference/MapLinks/MapLinks.html)
Firebaseによるプッシュ通知のハマりどころ


Google I/O 2016で新しいFirebaseが発表されましたね。
iOSアプリでのプッシュ通知が実現したかったので、早速Firebase Cloud Messaging(FCM)を中心に使ってみました。
その中で、私がハマったところと解決方法を紹介します。

## そもそも Firebase Notification と FCM は違うもの
- Firebase Notificationとは、FCMの上に実装された軽量でサーバレスのメッセージサービスです。Webコンソールからプッシュ通知を送ることで、アプリのグロースのために簡単にキャンペーンを行うことができます。
- FCMとは、HTTPやXMPPを通して使う多機能なメッセージサービスです。

というわけで、似てるけど使い方が異なるサービスなわけです。
ドキュメントを読み進める上で、この違いは重要です。
以下は、それぞれを比較した表になります。
(FirebaseのFAQ https://firebase.google.com/support/faq/ から引用)
![Screen Shot 2016-05-23 at 16.06.20.png](https://qiita-image-store.s3.amazonaws.com/0/6111/a0f1861d-573e-1eb3-1d3a-ff4cb1fbe837.png "Screen Shot 2016-05-23 at 16.06.20.png")


## 外部のサーバからFCMを使ってプッシュ通知を送る
### HTTP API経由でプッシュ通知
Webコンソールからだけでなく、API経由でプッシュ通知を行いたい場合には、FCMの機能を用います。
以下がcurlでプッシュ通知リクエストを送ってみる例です。

```bash
curl --header "Authorization: key=$api_key" \
     --header Content-Type:"application/json" \
     https://fcm.googleapis.com/fcm/send \
     -d "{\"to\": \"/topics/news\",\"notification\": {\"text\": \"メッセージ\"}}"
```

`$api_key`には、Firebase コンソールからダウンロードした`GoogleService-Info.plist`から、`API_KEY`をコピーしてください。

コマンドを実行する前に、受信したい端末のアプリから`/topics/news`をSubscribeしてください。
サンプルアプリにはその機能が実装されているので、まずはこれからテストするのが良いと思います。 https://github.com/firebase/quickstart-ios/tree/master/messaging

FCMについて、詳しくは https://firebase.google.com/docs/cloud-messaging/server をご覧ください。

### ユーザ全体にプッシュ通知を送るにはどうするの？
アプリ起動時に一つのTopicを登録し、そのTopicに対してプッシュ通知を行うことで実現できます。

### アプリが終了しても通知を行う
FCMでAPIからプッシュ通知を行う場合、実際に通知が到達するまで遅延があります。また、アプリを終了している場合は、プッシュ通知が届きません。
一方で、コンソール(Firebase Notification)からプッシュ通知を行う場合、そのような問題は起こりません。

そこで、FCMのリクエストでPriorityデータを追加します。
指定がなければ`nomal`となるPriorityの設定を、`high`にすることで、遅延が少なく・アプリが終了していてもプッシュ通知を行うことができます。
https://firebase.google.com/docs/cloud-messaging/concept-options#setting-the-priority-of-a-message

以下がPriorityを設定したPOSTデータのサンプルです。

```json
{
  "to": "/topics/news",
  "notification": {
    "text": "プッシュ通知"
  },
  "priority": "high"
}
```

バッテリーの消耗があるため、ユーザのためにも適切な場所に使っていきましょう。


## Firebase Notificationでメッセージを作成するときにTopicがでてこない
iOS Firebase SDKからFCMのTopicに登録しようと、ドキュメントにある通りに `subscribeToTopic `メソッドを実行しても、すぐにはWebコンソールに選択肢として表示されません。
(多分Android, Web SDKの場合も一緒)

これは、Topicの反映に時間がかかっているためです。私の場合は1日ほど待てばコンソールに反映されて、以下のように選択できるようになりました。
ドキュメント通りにやっているのにうまくいかないのでびっくりしましたが、きっとそのうち修正されるでしょう。
![Screen Shot 2016-05-23 at 16.24.41.png](https://qiita-image-store.s3.amazonaws.com/0/6111/95caae07-6014-fcb2-93f2-f684984adae4.png "Screen Shot 2016-05-23 at 16.24.41.png")

## まとめ
すでに多くの場所で紹介されているように、新しくなったFirebaseはAnalyticsなどの機能が非常に有用そうです。
開発を楽をするために積極的に使っていきたいと思います。
GooglePlayMusicのNow PlayingをTweetするだけのBookmarklet

なんとなく初投稿です．

# 動機
特に無いですが，暇つぶし．調べて出てくるブックマークレットが使えなかったので，とりあえず自分で作ってみました．

# コード
Gistは[ここ](https://gist.github.com/atri-konami/74e785f53cbecb8f085cf1b2691e50d5)

```google-music-bookmarklet.js
javascript:(function(){
    var song = document.querySelector("#currently-playing-title").innerHTML;
    var artist = document.querySelector("#player-artist").innerHTML;
    var album = document.querySelector(".player-album").innerHTML;
    var text = encodeURIComponent("Now playing on Google Play Music: " + song + " - " + artist + " in " + album);
    window.open('https://twitter.com/intent/tweet?text=' + text + '&hashtags=NowPlaying', '', 'width=550, height=420');
})();
```
(これ書いててquerySelectorっていうメソッドの存在を初めて知ったんですけど，getElementBy*より汎用性高くて良くないですか？)(最近jQuery使ってたからか)

曲名のidがcurrently-playng-titleだったりするのがポイントでしょうか．ググって出てくる過去の遺産を見てるとplay-songなるidがあるけど，今は見当たらず…

# ちょっとモニョッたこと
Web Intentからだと画像の投稿ができないのがちょっと残念です．認証通ってればmedia/uploadに上げてから埋め込みできるけど，流石にブックマークレットでやるにはちょっとやり過ぎ感ありますね．

# 2016/09/25追記
[続編ができました](http://qiita.com/atri-konami/items/3639d290d4bf4ac8f2e6)
gitlab-ciでCouldn't resolve hostがでるとき

Gitlab-ciのDocker executorを使ってビルドをしようとしたとき、gitlabへのアクセス部分で失敗するときの対処法。

# 環境

- CentOS7
- gitlab-ce 8.8.0
- gitlab-ci 1.2.0


# 出現するエラー

```shell-session

gitlab-ci-multi-runner 1.2.0 (3a4fcd4)
Using Docker executor with image python:3.5.1 ...
Pulling docker image python:3.5.1 ...

Running on runner-9be17f29-project-46-concurrent-0 via 819cfa8c4195...
Cloning repository...
Cloning into '/builds/********/TESTREPO'...
fatal: unable to access 'http://gitlab-ci-token:xxxxxx@gitlabのホスト名/********/TESTREPO.git/': Couldn't resolve host 'gitlabのホスト名'

ERROR: Build failed: exit code 1
```

gitlabのレポジトリのアクセスで名前解決ができていない、と。


# 名前解決できるようにする

[公式サイト](https://github.com/ayufan/gitlab-ci-multi-runner/blob/master/docs/configuration/advanced-configuration.md)を確認する。

| 設定値             |              説明                                                   |
|:------------------|--------------------------------------------------------------------:|
| extra_hosts       | specify hosts that should be defined in container environment       |


変更するファイルは、以下にある。ここのextra_hostsに値を書くことで名前解決ができるようにする。

- /etc/gitlab-runner/config.toml

変更後は保存して終了。再度、registerはする必要なし。

```yaml
Example:

[runners.docker]
  host = ""
  hostname = ""
  tls_cert_path = "/Users/ayufan/.boot2docker/certs"
  image = "ruby:2.1"
  privileged = false
  cap_add = ["NET_ADMIN"]
  cap_drop = ["DAC_OVERRIDE"]
  devices = ["/dev/net/tun"]
  disable_cache = false
  wait_for_services_timeout = 30
  cache_dir = ""
  volumes = ["/data", "/home/project/cache"]
  extra_hosts = ["other-host:127.0.0.1"]
  links = ["mysql_container:mysql"]
  services = ["mysql", "redis:2.8", "postgres:9"]
  allowed_images = ["ruby:*", "python:*", "php:*"]
  allowed_services = ["postgres:9.4", "postgres:latest"]
```

もし、hoge-serverが192.168.0.1で、bar-serverが192.168.0.2あるならば、extra_hostsに次のように設定する。

```yaml

  extra_hosts = ["hoge-server:192.168.0.1", "bar-server192.168.0.2"]
```
How to let ruby speed!


```ruby
puts 'Hello, world'

5.times do |i|
	puts i
end

```

this weekend, let us go climb the Mt.FUJI~

we start from Seijyougakuennmae


![Kobito.belI15.png](https://qiita-image-store.s3.amazonaws.com/0/56713/c4ed8ff4-f7a2-1147-aa2a-c70a5eb9549b.png "Kobito.belI15.png")

after one and half a hours, we arrive outsuki（大月） station!

then start this course:

![Kobito.2XaotD.png](https://qiita-image-store.s3.amazonaws.com/0/56713/1228b4fe-ddee-1e2f-08db-e2c4024bdccf.png "Kobito.2XaotD.png")

detail route: http://latlonglab.yahoo.co.jp/route/watch?id=b965f0ea445d9f695c50c7eec1189d8e

```ruby
距離
56.4km
最大標高差
1948m
平均斜度
全体：3.5%
上り：4.4%
下り：2.8%
獲得標高
上り：1990m
下り：62m
```

first 30KM of this course will be little easier then after, so we can two hours to finish this first part. then, we have 25km, it would be more harder than before. so we plan to use 3 hours to finish this.

in all, we would take 5 hours to finish this when we arrive gogoume(五合目）。so that would be 2PM. we can take lunch at there, take a tour, 3:30 PM go back. keep 20KM speed we can get back to station at 6:30~7:00PM.

then back to our home 8:30~9:00PM!

what's a fucin' DAY!

-Matt