OmniAICreator/Qiita-1.07M huggingface dataset:
RailsでsubmitボタンにFontAwesomeを使いたい

みなさまこんにちは。営業からエンジニアになって早5ヶ月。**アイドルが大好き**なnori_saiです。
Livesenseアドベントカレンダーその２の最終日を担当いたします。よろしくお願いいたします。

何を書くか迷いましたが、ちょうど今`Rails`と`INSPINIA`というadminツールを使って開発をしているので
そこでの出来事を書きたいと思います。

# INSPINIAってなに

ご存知ですか？　[INSPINIA](https://wrapbootstrap.com/theme/inspinia-responsive-admin-theme-WB0R5L90S)
インスピニアって読みます。2000円くらいで多機能で色んな画面用のテンプレが揃ってる優秀なやつです。
僕は今、とある営業支援ツールを作っていまして、INSPINIAを導入し開発しています。
なんでこれ使っているかと言うと

* 営業上がりの初心者エンジニア2人がメイン担当で、デザインとか何もわからない…笑
* から、何かに頼りたい
* **Bootstrap・FontAwesomeとかあらかじめ入っている**から、細かい設定とか不要
* デザイン面とかもすでに出来上がっているし、**かっこいい**
* **社内で導入実績ある**から、いざという時頼れる（頼りたいばっか）

こんな感じで初心者エンジニアの僕にもスピーディーに社内ツールが開発できるって感じの条件が揃っていました∩(ﾟ∀ﾟ∩)
思った通りで、INSPINIAの便利さもあり順調に開発していったわけですが…

せっかくFontAwesomeを気軽に使える環境にあるというのに
**f.submit でFontawesomeが表示されない**という問題にぶつかりました。

そこでの解決方法が、本題になります。（前置き長い）


# f.submit でFontawesomeのアイコンが表示できない

submitボタンに虫眼鏡とかのアイコンつけてイケてる感じにしたかったのです。（文字だけだと微妙ですし）
が、Fontawesomeのコードをclassに書いてもアイコンが出てこない！

**なんでやねんっ**て調べたら
最初に書いてたこのコードには適応できないみたいです。

```index.html.slim
= f.submit class: 'btn btn-primary' do
  i.fa-lg.fa-fw.fa-search
  |検索
```

**どうしたらええねんっ**て調べたら

```index.html.slim
= button_tag type: 'submit', class: 'btn btn-primary' do
  i.fa-lg.fa-fw.fa-search
  |検索
```

みたいな感じで
`f.submit`ではなく
`button_tag`で`type: 'submit'`でやればええねんで。ってことでした。
`link_to`でも同じ書き方でいけました。

無事にアイコンついて良い感じになった〜！とおもったら
`f.submit`で使えてたjQueryが使えなくなってしまいました…

頑張って直そう…（記事は以上です）

# メリークリスマス

```
　　／￣￣ヽ
　 ○(二二二)
　　 (´･ω･) ))
　(( ( つ　ヽ　 ♪
♪　　>とノ )))
　　 (_ノ(＿)
```
[ue4]加算キーによるアニメーション沼

#【前提】
__・ue4のバージョンはue4.14.1を前提にしています。__
__・うそを書くつもりはありませんが。経験や独学で学習した知識に基づいて記述しているため、間違いが多分にある可能性があります。__
__・裏 Unreal Engine 4 (UE4) Advent Calendar 2016　12月25日の記事の一つになります。__
他の記事
__[ue4]ゲームと構図のアンニュイな関係__
http://qiita.com/housakusleeping/items/c1c8a2673315bb25a32f
__[ue4]チャイルドアクターシンドローム__
http://qiita.com/housakusleeping/items/2eadab9e6a7b985ff2f3


#【目的】
ue4だけでアニメーションモーションを作成する沼へのお誘いです。


#【新規アニメーション】

ue4でモデルの新規のアニメーション（モーション）を作成する方法は以下です。

１）どのポーズから始めるか決める
アニメーションのエディタで新規アセット作成から「アニメーション作成」を選び最初のポーズを選びます
![3-1.jpg](https://qiita-image-store.s3.amazonaws.com/0/59114/55566696-11d2-5683-4c8e-55a6e06cdd09.jpeg)

２）アニメーションの名前をつける
![3-2.jpg](https://qiita-image-store.s3.amazonaws.com/0/59114/02ad18d2-dab3-98e8-afeb-298e19d5a604.jpeg)

３）スタンスポーズ（リファレンス）から始める
![3-3.jpg](https://qiita-image-store.s3.amazonaws.com/0/59114/982a8a0e-aa7c-898b-64e1-3b3a98184d27.jpeg)

４）アニメーションの総フレーム数を決める
画面下のフレーム番号「０」が表示されている部分で右クリックし、赤線の総フレーム数を設定する画面を開きます
アペンドなのでフレームが追加されますので何度もやると総フレーム数が増えます。
![3-5.jpg](https://qiita-image-store.s3.amazonaws.com/0/59114/6862f623-ccd5-47e0-633e-659d385ad42a.jpeg)

５）フレーム数を入力
とりあえず３０フレーム（１秒）にしてみましょう。
![3-6.jpg](https://qiita-image-store.s3.amazonaws.com/0/59114/bc44ebf0-e0d8-9995-ddf1-893d4e100f5d.jpeg)

６）確認
こんな画面になると思います。
![3-7.jpg](https://qiita-image-store.s3.amazonaws.com/0/59114/77551062-433a-6877-6df5-2498771aff05.jpeg)

これで準備が整いました。

#【加算キーを打つ】

フレームを６フレームに設定して（下の赤枠です）
ボーンを選択し回転させてポーズを作って
＋ボタンのようなキーを打つボタンをおしてキーを打ちましょう。

![3-8.jpg](https://qiita-image-store.s3.amazonaws.com/0/59114/32a1039b-adbc-2d0b-ccca-b32a4503c912.jpeg)

キーが打たれると加算キーのグラフエディタが表示されます。

![3-9.jpg](https://qiita-image-store.s3.amazonaws.com/0/59114/58823c76-f9b2-7713-09ac-cc5080b70595.jpeg)

#【FK、IK】

通常アニメーションのモーションの作成にはFK（フォワードキネマティクス）とIK（インバースキネマティクス）で作成することになります。
もう少し進化した環境であれば、FBIK(フルボディIK）などがあります。

今のところ、この加算キーによるモーション作成（アニメーション作成）は残念ながらFKのみにしか対応していないようです。

FKだけでアニメーションを作成することは、相当な高度な技術と経験、時間が必要になります。
ですので、多分、ue4でこの機能を使用して１からアニメーションを作ろうとする方は少ないと思われます。
故に沼なのです、、、、

ただし、既存のモーションを修正などには使えなくもないので、この機能を使ってみるのもありかもしれません

#【アニメーションの修正】

１）既存のアニメーション選択

修正対象の既存のアニメーションを開きます。
![3-10.jpg](https://qiita-image-store.s3.amazonaws.com/0/59114/1153fb5c-8b8d-1d14-418e-b1a12c114610.jpeg)

２）フレームにキーを打つ
修正フレームを選択し、ボーンを選択後、ボーンを回転させ、キーを打ちます
![3-11.jpg](https://qiita-image-store.s3.amazonaws.com/0/59114/73c41332-fbeb-7813-35a9-14d9067f89fd.jpeg)

３）加算トラックが表示される
新規アニメーションと同じように加算キーのトラックのグラフエディタが表示されます
![3-12.jpg](https://qiita-image-store.s3.amazonaws.com/0/59114/ee5c6afe-926d-208b-d8f1-12088ecc2c01.jpeg)


このようにちょっとしたアニメーションの修正には使える機能かもしれません。

#【Allright Rig】

このようなFK沼を解消するためか、IKを手軽に使用することができる「Allright Rig」というアセットが
開発中です。
現在、β２ですが公開されていますのでダウンロードすることが可能です。

![3-13.jpg](https://qiita-image-store.s3.amazonaws.com/0/59114/0351d2c4-6b96-1320-e746-f00bd5d3334a.jpeg)

http://alexallright.com/allrightrig/
↑サイトです。

FKとIKが使えればFKだけでアニメーションを作成するよりは格段に生産性が上がるものと思われます。
こういったアセットがue4の標準になってくれると嬉しいのですが、、、

#【最後に】

最後まで読んでいただいてありがとうございました。

ue4だけでアニメーションを作るという荒業を紹介してみました。
通常はこの辺りはDCCツールの担当部分です。
ですが、簡単なアニメーションの修正レベルならこの加算キーだけでも可能です。


最後の最後に、「裏 Unreal Engine 4 (UE4) Advent Calendar 2016」はこれにて終了になります。
アドベントカレンダーを執筆されたみなさん、読者のみなさん、今年一年、お疲れ様でした。
良いお年を。
超簡単！InnoSetupを使ったソフトウェアのインストーラーの作り方

様々なソフトウェアのインストーラー作成に便利な[InnoSetup](http://inno-setup.sidefeed.com/)の使い方の説明です。
同人ゲームなどそこまで複雑なファイル構成などの時におすすめ。超簡単、高速に作れちゃいます。

#InnoSetupとは？
こんな感じのインストーラーを簡単に作れます。
しかも殆どがGUIなのでプログラムとか何それ美味しいの？の人も大丈夫。
![hogeInstaller.png](https://qiita-image-store.s3.amazonaws.com/0/80100/b8f2a9b3-4883-16f5-64be-08173bbed8f5.png)

しかも市販のソフトウェアのインストーラーみたいな機能がたくさん実装出来ちゃいます。

- 保存ディレクトリの指定
- アイコンやインストーラーの横などに表示させる画像の設定
- アンインストーラーの作成
- 言語設定
- インストール完了後の自動起動

などなど。

#どうやって使う？
インストールしましょう。公式サイトから入手できます。
Windows8.1で動作確認していますがその他は未検証。多くのPCゲームはWindowsで動くという事で。

[Inno Setup Downloads](http://www.jrsoftware.org/isdl.php)

一番上にあるStable Releaseが無難でしょう。DL元はRandomで問題ありません。

セットアップウィザードを使ってインストール。インストール先は実際に作成しているソフトウェアの作業ディレクトリあたりがお勧め。

##インストーラーの作成
インストーラーの作成はスクリプトファイルからビルドして生成するのですが、InnoSetupはそのスクリプトも粗方書いてくれるウィザードが用意されているので楽チン。

早速起動してみましょう。殆どGUIなので本当に簡単に作れます。
初めて使う場合はNew fileを選ぶと思うのですが選択肢が。「Create a new script file using the Script Wizard」を選択。

「Create a new empty script file」は真っ新なスクリプトファイルを作ってすべて手書きで書くことになるのでチェックを入れず次へ。
ここから次々とソフトウェア、インストーラに関する入力欄があります。

##入力項目
「Next」を押していくと順に出てくる入力欄について簡単な解説をしていきます。

|項目名|内容|
|---|---|
|Applecation Name|ソフトウェア名|
|Applecation Version|バージョン|
|Application Publisher|製作グループ|
|Application Website|ホームページ|
|Application destination base folder|ソフトウェアのデフォルトで表示させるのインストール先を指定します。基本的に「Program Files folder」でよいかと。<br />すぐ下の「Allow user to change the application folder」をチェック入れましょう。|
|executable file|インストールさせるソフトウェアの実行ファイルです。<br />インストール完了時に自動起動させる場合にここに書いたファイルが実行されます。|
|Other Application files|他にファイルを追加させる場合はここで追加。|
|Allow user to change the Start Menu folder name|このあたりは基本的にすべてチェックを入れてもいいかと。インストーラーにはユーザーが選択できるようにチェックボックスになっています。|
|Applecation Documentation|ライセンス情報やインストール前、後に表示させるものがあればここで。|
|Setup Languages|言語設定。EnglishはデフォルトでオンになってるのでJapaneseをオンに。その他はお好きなように。|
|Compiler Settings|完成したインストーラの出力場所やインストーラ名、インストーラのアイコン指定など。|
|Yes, use #define compiler directives|オンにすると後での編集が楽になる（？）ですがオフにしてもそう問題ありません。|

##ウィザードが終了すると
これでウィザードが終了します。ウィザードが閉じられるとあら不思議。
ソースコードがすでに入力されているではありませんか。

「Would you like to compile the new script now?」はすぐにコンパイル、つまりインストーラを作成するか聞くものです。
実はさらに細かい設定ができるのでこれでいいや！という人は「はい」を、もうちょっと追加する！という人は「いいえ」で。

コンパイルにはそこそこファイル容量があると時間がかかります。コーヒーでも。
ハードウェア評価の自動化を試みる

#<i class="fa fa-hand-o-right" style="font-size:1em;"></i> はじめに
　Fujitsu Advent Calendar 2016の24日目の記事です。
不明点、問題点ありましたら遠慮なくご意見いただければとおもいます。

#<i class="fa fa-hand-o-right" style="font-size:1em;"></i> 目次
１．ハードウェアの評価とその現状
２．本当に人が張り付いていないといけない？
３．画面異常検出の自動化を試みる
４．今後

##１．ハードウェアの評価とその現状
　パソコンの品質保証部隊にて評価項目を検討し、実行しているときに直面する課題には様々ありますが、その一つに問題の検出方法があります。
私の部隊のフェーズでは、開発中の試作機のレベルを確認するとき、設計部隊による機能確認とは観点を分けてより使用環境側で起きる問題を想定して検出することに重きをおいています。

###１−１．検出できる問題
　対象がパソコンであるため、OSから取得できるログやドライバ、メモリのダンプなどで情報を取得でき、解析できる問題については現象発生時に何らかのプログラムで引っ掛けることが可能です。
　例えば、スリープ復帰後に無線が急に使えなくなったとして、デバイスマネージャ上で適切なドライバが当たっていない（割り当てられているように見えない、もしくは、！マークがついている等）のであれば、それは無線LANデバイスがOSに認識されていないためで、スクリプトを組むことで検出ができます。

###１−２．検出できない問題
　一方で検出が難しいものもあります。画面が砂嵐上などの表示異常になる場合です。OS上でソフト的に検出できないとなると、誰かが出るところを見ている必要があります。手動確認が必要になり、大きな手間がかかることになります。表示異常に関する多くの問題の原因は、CPUやGPUからの出力がそもそも異常であるというよりは（チップの信頼性から見て滅多にありません）、実際はケーブルの物理的な断線や電源ノイズ、静電気などOSのログでは見えないものであることが多いです。

##２．本当に人が張り付かないといけない？
　評価者が目視で検出を行うというのは重要です。何が起きているのか、そのものの現象を確認しその場で検証することは問題の発見と解決に一番の近道であるといっても過言ではありません。ただ、非常に時間がかかる、かつ問題の認識・情報共有が難しいという大きな課題もあります。

　例えば、手動でスリープに入れて電源ボタン押下でシステムの復帰（レジューム）を繰り返しながら表示がおかしくなる（表示しないなど含め）か確認をするとなると、１００回を行うのに一時間以上張り付く必要があります。一週間１人が専任し取り組んだ場合、
8h x 5d x 100回 = 4000回
の検証しかできません。業務に使うパソコンを一日10回スリープに入れると想定した場合、1年少なく積もって300営業日でも3000回、保証5年分の想定だと最低でも15000回の検証が必要です。（わかりやすさを重視して数字はざっくりなので参考程度にしてください）

　一方、スクリプトを組んだ自動ランニングであれば、一日２４時間放置できるため、一週間でほぼ人の手を借りずに数万回の検証が可能なだけでなく、異常検出をログで残せれば即座に関係者と同じレベルで認識することが可能です。これは大勢が関わるパソコン開発部隊にとってコミュニケーションコストを節約できる大きなアドバンテージになります。

　では、OSの吐き出すログやメモリダンプで要因を引っ掛けられないからといって、本当に多大な人件費と労力を使ってスリープ復帰の単純作業をし続けていていいのでしょうか。昨今の厳しいビジネス環境のなか、自動化のメリットは最大限享受すべきで継続して考えていかないといけない課題だと思っています。

##３．画面異常の自動化を試みる
　知ってる方も多いかもしれませんが、OpenCVと呼ばれる、インテルが開発しているライブラリがあります。カメラでディスプレイ表示を画像取得すれば、上記に上げた表示異常の検出が可能になります。そこでエンドユーザが、パソコンを普段使いする中で表示以上に出くわすという状況を再現させ、加速試験する方法を手持ちの道具で考えてみました。

以下は想定の状況です。

 A. 電源ボタンを押してスリープさせる

 B. 電源ボタンを押して復帰させ、スワイプしてロック画面を解除する

もしくは、
 A'. タスクバー左端のwindowsボタン押下し、電源アイコンからスリープを選択する

 B’. 任意のキーを押して復帰させ、スワイプしてロック画面を解除する
　　

★組み立ててみた（左下の箱がラズパイ、右上のアームにタッチペンをつけて手動操作を演出）
![IMG_20161222_171745.jpg](https://qiita-image-store.s3.amazonaws.com/0/70359/08573ec9-bd17-c40a-d8db-d90d3cbe0164.jpeg)
　　
　　

★USBカメラを取り付けて画像検出
![IMG_20161222_171814.jpg](https://qiita-image-store.s3.amazonaws.com/0/70359/37d91c04-bd63-2486-d510-978311fcfc3b.jpeg)


　　
　　
 画像をみてもらうと理解が早まると思いますが、

 1. ロボットアームをwindowsアプリで動かしてAB、A’B’の動きを実現させ、

 1. その様子をUSBカメラで画像として取得して、

 1. ラズベリーパイ上のOpenCVで処理させます。

 1. 画面状況に絵的な変化があれば、そのときの時間と変化時の画像か動画を取得する、という一連の流れを実現させようとしています。
　※OpenCVを利用するための言語はRubyを使用しようかと考えています。
   Gemで使えるものがありました。

##４．今後
　完成形までお見せ出来ればいいのですが、検討段階であるため、ここまでです。
尻つぼみではありますが、記事にしてみました。この記事を読む方のどれ位がハード開発を経験されているかわかりませんが、もしご存じない方であれば、ハードの開発と評価にはこんな問題があってこんなことを考えているということが共有できればと思い、取り急ぎ載せてみました。

　今後、これを更に形にして実際の工数をガリガリ削っていきたいと思います。まずはopenCVのソースコードを共有できればと思います。

　作業の自動化はなにも工場だけが考えることではありません、開発現場でも無駄はたくさんあります。手動確認でボタンポチポチしながら昼飯を何食べるか考えている時間があったら、自動化した結果、浮いた時間でより検証を網羅するにはどうすべきか評価プロセスを考えるか、営業に頼らず客先に出向いて現場で起きていることを見聞きしたほうが有益なのは明らかです。

　ちなみに、外注で上記の方法を見積もると７００万かかると言われていますが、プログラムは自習し、土台を自作し、パソコンにはrasberryPiを利用し、ロボットアームは買いますが、２０万切ります。いやあさっさとやるべきですね笑

以上
クリスマスイブなのでVisual Studio Code用カラーテーマを作ってみた

## 概要

なぜか時間があったので、前からやろうと思っていたVisual Studio Code用のカラーテーマを作ってみました。
[日本の伝統色を使ったカラースキーム: Japanesque](http://this.aereal.org/entry/2016/03/22/120000)という記事を参考に、和風のテーマにしてみました。
（元記事とはいくつか色を変更したりしているので、配色がおかしなところがあったなら私のせいです。）



[GitHub](https://github.com/JunSuzukiJapan/theme-japanesque)にあげていますのでご自由にお使いください。



![screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/20722/a702661e-bc34-24de-03c0-a9bf4cde1a8c.png "screenshot.png")


## インストール

```
$ ext install theme-japanesque
```

あとは、「Codeメニュー」 -> 「基本設定」 -> 「配色テーマ」から

![スクリーンショット 2016-12-24 23.41.07.png](https://qiita-image-store.s3.amazonaws.com/0/20722/1fc4e6cd-9f53-1ec4-6d51-0b1f4ddae4d2.png "スクリーンショット 2016-12-24 23.41.07.png")

「Japanesque Dark」を選んでください。

![スクリーンショット 2016-12-24 23.42.28.png](https://qiita-image-store.s3.amazonaws.com/0/20722/09e51a92-f999-8900-6579-ae462087370e.png "スクリーンショット 2016-12-24 23.42.28.png")


## 参考

カラーテーマの作成には、以下のサイトを使用しました。
[TmTheme Editor](http://tmtheme-editor.herokuapp.com/#!/editor/theme/Monokai)
弱肉強食のマスコット界隈

IT系のマスコットは有象無象に存在する。
各マスコットはそれぞれ生き残りを賭けて活動している。

それらの中でも~~むかつく~~かわいい系マスコットとして有名なD言語くんは
2015年、2016年と増殖をメインに活動していたようだ。

- [D言語くんの養殖ゲーム](http://gobori.ehoh.net/test/dmanfarm/dman.html)
- [D言語くんライフゲーム](http://qiita.com/Ark/items/6bfe2b4f8734aa658aa4)
- [D言語くんの宇宙進出に関する計画](http://qiita.com/fifth_tea/items/f8cbe7876d3ab71b2804)

増殖、拡大を続けてその先に何があるのか。
人類の歴史を見れば明らかであろう。

さて、D言語くんと同じくマスコットとして一大勢力のGopher。
~~むかつく~~かわいい系マスコットとしてキャラがかぶっていることでも有名。

![go.png](https://qiita-image-store.s3.amazonaws.com/0/11172/988ba986-e044-1386-8de3-72ae42b75d69.png)

Gopherもネット、リアル問わずあらゆるところで増殖を続けているらしい。

そして、これら二大勢力が接触してしまったとの報を受け我々は現場に急行した。

![ss.png](https://qiita-image-store.s3.amazonaws.com/0/11172/e856e514-4bf1-e887-bcf4-3e833d0b5061.png)

# ゲームの説明
The GoD Game
http://nsplus.dojin.com/ueshita/dman/game/full.html

- 縦横斜めでGopherをD言語くんで挟むと、そのGopherをD言語くんにすることができます
- 挟めないところにD言語くんは配置できません
- Gopherも同じことをしてきます。
- 双方マスコットが配置できなくなったらゲーム終了です。
- マスコットが多いほうが勝ちです。

いわゆるリバーシです。GoとDなのでGoD Game(神ゲー)ということにしました。
（´・ω・`）.;:…（´・ω...:.;::..（´・;::: .:.;: ｻﾗｻﾗ..

## これは何？
D言語でブラウザゲームを作ることができる実験的な環境を使って作った実験的なゲームです。

詳細は以下参照。

D言語でEmscriptenしたい話
http://qiita.com/ueshita/items/7ebf9331685d345200f8

## Github
https://github.com/ueshita/GoD-Game
Android Wearのプロジェクトをプロジェクトを作成するとError:Execution failed for task ':mobile:transformClassesWithDexForDebug'.になる

Android StudioでWearアプリのためのプロジェクトを作成したらエラーになるのでメモしておく。

# 起こったこと
普通にビルドしようとした際に下記エラーとなる。

```Terminal
Error:Execution failed for task ':mobile:transformClassesWithDexForDebug'.
> com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536
```

起こってる人は結構多いみたい
[Error:Execution failed for task ':app:transformClassesWithDexForDebug'](http://stackoverflow.com/questions/33717886/errorexecution-failed-for-task-apptransformclasseswithdexfordebug)

## 原因
[ビルド時に Unable to execute dex: method ID not in [0, 0xffff]: 65536 が出た場合の対処](http://qiita.com/furu8ma/items/6cb4b08c423da6a74299)
に記載されていることと同様かと思いますが、メソッド数の上限を超過している…らしい？
今ひとつわかりませんでした…

# やったこと
## 最初にやったこと
そもそも、Android Wearのアプリ用のプロジェクトを作成しました。
Android Studioで　File ＞　New　＞ New Project…　で新しいプロジェクトを作成する。
プロジェクトはwearもありきで作成する。
これだけで、本事象は発生します。

## 対処としてやったこと
1. build.gradle(mobile)にMultidexを有効にする旨を記載
2. AndroidManifest.xmlにMultiDexApplicationであることを記載

```lang:build.gradle(mobile)
    defaultConfig {
   　 ..
        multiDexEnabled true
    }
dependencies {
   　 ..
    compile 'com.android.support:multidex:1.0.0'
}
```

```xml:AndroidManifest.xml
    <application
   　 ..
        android:name="android.support.multidex.MultiDexApplication">
   　 ..
    </application>
```

以上。もっとちゃんと原因とか内容まで理解したい…
goroutineでmath/randを利用する時のマルチコアにおける注意点

この記事ではAWS ec2上のCentOS7にインストールしたGo1.7を使っています。

とあるgoroutineを使ったGo言語のプログラムを作成して、マルチコア環境で実行してみたところ、シングルコアよりも性能が落ちてしまう、という不思議な現象に遭遇しました。

いろいろ切り分けてみると、math/randライブラリで、グローバルrandを使っていると、この現象に陥ることがわかりました。ローカルrandに書き換えると、マルチコアで順当に性能が出ます。マルチスレッドでグローバル関数を利用したために競合が起きているように思います。
シングルコアの時にgoroutineでスレッドを増やしてもこの現象は発生せず、マルチコアになると発生します。

そのものズバリを解説している記事を見つけてしまいました。
[Goroutine と math/rand とベンチマークの罠](http://qiita.com/asm/items/6a25f4c63f565a5acf44)

二番煎じですが、役に立つ情報かもしれませんので、ベンチマークのコードと結果を示します。

```go:rand_test.go
package main

import (
  "testing"
  "math/rand"
)

func BenchmarkGlobal(b *testing.B) {
  c := make(chan bool, 10000)
  for i := 0; i < b.N; i++ {
    c <- true
    go func() {
      defer func() { <-c }()
      for j := 0; j < 100; j++ {
        _ = rand.Intn(100)  // use global rand
      }
    }()
  }
}

func BenchmarkLocal(b *testing.B) {
  c := make(chan bool, 10000)
  for i := 0; i < b.N; i++ {
    c <- true
    go func() {
      defer func() { <-c }()
      r := rand.New(rand.NewSource(1)) // create local rand
      for j := 0; j < 100; j++ {
        _ = r.Intn(100)   // use local rand
      }
    }()
  }
}
```

` go test -bench . -benchmem`でベンチマークを実行します。

以下に結果を表にまとめます。
AWS ec2のインスタンスタイプを変えて、ベンチマーク結果の変化を比較しています。

BenchmarkGlobal

|インスタンスタイプ|コア数|ns/op|B/op|allocs/op|
|:--|--:|--:|--:|--:|
|t2.nano|1|6082|4|0|
|t2.small|1|6365|4|0|
|t2.medium|2|24269|28|0|
|t2.xlarge|4|30654|56|0|
|t2.2xlarge|8|22361|6|0|

BenchmarkLocal

|インスタンスタイプ|コア数|ns/op|B/op|allocs/op|
|:--|--:|--:|--:|--:|
|t2.nano|1|20738|5387|1|
|t2.small|1|21593|5399|1|
|t2.medium|2|11624|5359|1|
|t2.xlarge|4|6038|5410|1|
|t2.2xlarge|8|3112|5405|1|

BenchmarkGlobalだとコア数が増えてもむしろ性能悪化してしまいます。一方、BenchmarkLocalはコア数に対してほぼリニアに性能向上しています。

参考リンク:
[Goroutineの最大数を制御する方法](http://qiita.com/ruiu/items/d4ef16981b870a1b85af)
[go言語でベンチマーク](http://qiita.com/Mulyu/items/ed585f2777496f29a725)
[Go言語でランダムな文字列を生成する方法の比較](http://qiita.com/srtkkou/items/ccbddc881d6f3549baf1)
私の今年1年のPerl 6ボランティア活動を振り返って

こんにちは、Perl 6 Advent Calendar 2016の25日目の投稿になります。
勝手ながら、今日は私の今年1年のPerl 6ボランティア活動を振り返りたいと思います。

# 振り返り

## [@perl6](https://github.com/perl6)での活動

### 活動履歴

+ コミット

| リポジトリ | 数 | パーセンテージ |
|:-:|:-:|:-:|
| doc | 32 | 76.2 % |
| roast | 5 | 11.9 % |
| DBIish | 5 | 11.9 % |
| **合計** | 42 | 100 % |

+ 立てたISSUE

| ステータス | 数 | パーセンテージ |
|:-:|:-:|:-:|
| closed | 38 | 76 % |
| open | 12 | 24 % |
| **合計** | 50 | 100 % |

### 考察など

+ docはインデックスを張ったりコード例を直したりするのがメインでした
+ なんとなくroastはもうちょっとコミットする余地がありそうです

## [RT](https://rt.perl.org)

### 活動履歴

| ステータス | 数 | パーセンテージ |
|:-:|:-:|:-:|
| 解決 | 6 | 21.4 % |
| 拒否 | 8 | 28.6 % |
| 非オープン (i.e. 新規) | 14 | 50 % |
| **合計** | 28 | 100% |

### 考察など

+ 「バグっぽい！」と思ったらRTにレポートを飛ばすということを繰り返したので拒否率が比較的高くなってしまいました。
  + 出して数分経ってから己の過ちに気づき、すぐに自らステータスを拒否に変更することもありました
+ 実は今日もまた拒否率を増加させてしまいましたが、2017年はぜひ確度を高めていきたいです

## その他

### ecosystem登録モジュール数 15

#### 活動履歴

+ 「ecosystem20本登録」を目標に1月から走り出しました
+ 今年前半は得意分野(?)のAlgorithm::空間を攻めていきました。個人的にはかなり無茶をして、週に1回新モジュールをリリースする(週の半分は論文読み、のこりは実装)というのを10回ぐらい繰り返しました。
+ 途中でAlgorithm::空間ってそこまで需要あるかな？みたいな気持ちになってきて、[p6-Terminal-Readsecret](https://github.com/titsuki/p6-Terminal-Readsecret)みたいな全然違う分野にも挑戦してみました。

#### 2016年に失敗してしまったこと。2017年に再挑戦したいこと

+ モジュール20本作れませんでした
+ 主要機械学習系のモジュールをすべて自分でつくるぐらいの気持ちで何度か挑戦したものの、ほとんど開発失敗してしまいました
+ C言語の`void*`をPerl 6のバインダで扱うためのベストプラクティスを作り出せませんでした

### [公式のAdvent Calendarに寄稿](https://perl6advent.wordpress.com/2016/12/10/)

+ 日本人というか非英語圏なアジア系がほとんど参加者にいなさそうでした。他の参加者より圧倒的に英語が稚拙だったらどうしようと考えてしまい不安でした。
+ また、[2日目のバイオインフォマティクスの記事がredditで炎上していた](https://www.reddit.com/r/bioinformatics/comments/5g2jxi/bioinformatics_with_perl_6/)というのも不安要素でした。
+ パブリッシュして何日か経ちましたがredditに批判コメントが集まることはありませんでした。せっかくの機会に挑戦してみてよかったと思います。

# 最後に

Perl 6 Advent Calendar 2016に協力してくださった@magnolia_k_さん、@B73W56H84さん。
また、こんな日本のカレンダーをわざわざ紹介してくださった
[Weekly changes in and around Perl 6](https://p6weekly.wordpress.com/2016/12/12/2016-50-highlighting-profilesql/)さん。
そして読者の皆様ありがとうございました。
Seleniumとの格闘の記憶

#最初に
この記事は[Selenium/Appium Advent Calendar 2016](http://qiita.com/advent-calendar/2016/selenium_and_appium)の25日の記事になります。遠慮の塊の大トリいただきました。

#出会い
Seleniumと出会ったのはまだ私が2社目にいた時です。
業務用パッケージソフトウェアベンダーでエンジニアとして働いていました。
携わっている製品を旧バージョン[^1]から新バージョン[^2]に刷新するにあたり、品質をどう保つかというところが問題になって、自動テストの話になりました。
当時確か色々なWeb画面自動テストのツール[^3]があって、比較の結果、Seleniumを使うことになりました。

#Selenium2
今はもうSelenium3が出ていますが、当時はSelenium2が出たばかりでした。
今と違いChromeだけ専用のexeを使って動作していたため、IEなんてエラー出て止まるは、動いたとしてももっさりだわで、マルチブラウザのテストを目的としていた私としては、本当に悩みのタネでした。
感覚的にですが、Seleniumを使った各ブラウザの動作安定感は
　　Chrome>>>>>>>>>>>>>>>FireFox>>>>{超えられない壁}>>>>>>>IE
という感じでした。
途中からIEDriverが出て一気にIEの動作が安定し、心から救われたのを覚えています。
今はFireFox用のexeも開発され、いい時代になったとしみじみ思います。

#様々な問題と解決方法
自動でブラウザを動作させるのなんて簡単です。難いことはSelenium大先生が全てやってくれます。
問題は運用なんです。単体テストと違い、Web画面の自動テストのコストはとても大きいので、それを減らすために色々工夫しました。
具体的には

- テストケース記述コスト
- マルチブラウザ対応コスト
- パラメータ変更によるコスト
- 環境を用意するコスト

をSeleniumをラッピングした自作ツールとテスト環境提供サービスを利用して解決しました。
具体的な内容については[PyConJP2015でプレゼンしました](https://www.youtube.com/watch?v=p4EElYZwZw4)ので、興味があればどうぞ。
ちなみにこの時点では４社目に所属していた時のものになります。ちなみに今は5社目です。

#これからやりたいこと
今所属している会社でもこの経験生かしてWeb画面の自動テストを日次で回すように持って行きたいです。
やはりコストとの兼ね合いが問題になるので、まずはChromeのみで全自動起動チェックとかから始めればいいかなと今は思っています。
一緒にやってくれる方いましたら、また、弊社に興味がありましたら、[Qiitaの弊社技術者ブログトップページの下の方](http://qiita.com/organizations/techbureau)から連絡いただけましたら嬉しいです。お待ちしています！

[^1]: 実行環境はWindows限定、Delphiで実装、サーバーサイドはJava
[^2]: 実行環境のOS問わず、Webアプリケーションに生まれ変わりJavaScriptへ、サーバーサイドはJavaのまま
[^3]: 確か[CasperJS](http://casperjs.org/)とか比較対象だったように記憶しています
Cloud9でPerl

この記事は<a href="http://qiita.com/advent-calendar/2016/perl-entrance"> Perl入学式アドベントカレンダー</a>の24日目です。
こんにちは、in東京1,2,3回に受講生として参加した<a href="https://twitter.com/na3ksg">@na3ksg</a>です。  
普段Perlを使うときはPer入学式第1回で構築した環境(VirtualBoxでUbuntu)で使っていたのですが、「気軽にブラウザでPerlを使いたい！」ということでCloud9を触ってみました。
## Cloud9とは
<a href="https://c9.io/?redirect=0">Cloud9</a>

- ブラウザで使える『統合開発環境』
- 対応プログラミング言語40種類以上
- 基本無料で使えるがクレジットカードの登録が必要  

Cloud9に似たサービスでNirous.ioがあったのですが2016年11月に終了してしまいました。Cloud9はAmazon Web Servicesに買収されているので多分、大丈夫。。
## Perlの開発環境をつくる  
![1482586286342959.jpg](https://qiita-image-store.s3.amazonaws.com/0/100141/171c463d-d904-472b-f1ed-55c7144a9918.jpeg)
Workspaceを作成します。Workspaceの名前などを適当に決めたらChoose a template`Blank`を選択しCreate Workspace。
しばらくすると、Workspaceが出来上がります。画面下がコマンドラインなので、そこにUnixコマンドを打ち込んでいきます。
<https://github.com/perl-entrance-org>
GitHubで公開されているPerl入学式の講義資料を参考にやっていきます。
### plenvの導入
```
$ git clone https://github.com/tokuhirom/plenv.git ~/.plenv
$ echo 'export PATH="$HOME/.plenv/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(plenv init -)"' >> ~/.bashrc
$ git clone https://github.com/tokuhirom/Perl-Build.git ~/.plenv/plugins/perl-build/
```
終わったらコマンドラインを再起動し、`plenv`と打ってヘルプが出たら成功です。
`$ plenv install 5.24.0`
2016年11月時点での最新の安定版`perl-5.24.0`を導入します。
`$ plenv global 5.24.0`
使用するバージョンの変更する。
### cpanmの導入
`$ plenv install-cpanm`
### Cartonの導入
`$ cpanm Carton`
### WAFの導入
```
$ cpanm Mojolicious
$ cpanm Amon2
```
## まとめ
環境作るたびに同じコマンドを打つのは面倒なのでGistなどにまとめて置いておくと便利です。
明日は<a href="http://qiita.com/advent-calendar/2016/perl-entrance"> Perl入学式アドベントカレンダー</a>最終日、校長<a href="https://twitter.com/__papix__">__@papix__</a>さんの担当です。楽しみですね！
勉強会の運営準備とかETC

# 12/24(日)クリスマスイブに勉強会やりました
この記事は[さいたまげーむす Advent Calendar 2016](http://qiita.com/advent-calendar/2016/saitamagames) 24日目の記事です。
個人的にこの1年を振り返ります。

## [UnityでVR 3Dシューティングゲームを作ってみよう in Yahoo LODGE](https://atnd.org/events/83393)

[Yahoo Lodge](https://lodge.yahoo.co.jp/)で開催しました.

![15682196_10154821435454727_1473859980_o.jpg](https://qiita-image-store.s3.amazonaws.com/0/102634/46eacacc-4af5-f53e-83c2-9fc3b7e88878.jpeg)

![15696876_10154821435729727_324399203_o.jpg](https://qiita-image-store.s3.amazonaws.com/0/102634/79554d5e-23f0-59b6-80ca-53677010c3f2.jpeg)


# 運営レポ書きます
## 事前会議
12:30 運営の企画会議は開催された.

企画者の流れは、ざっくりこんな感じ

12:30- 打ち合わせ
13:00- 会場準備
14:00- 受付開始
15:00- 勉強会開始
17:00- 勉強会終了
17:30- 懇親会
19:00- 撤収

と言ったタイムテーブルでした。

事前準備の風景
![15726030_10154821435554727_170045090_o.jpg](https://qiita-image-store.s3.amazonaws.com/0/102634/5586d062-90cc-889f-4058-b8ca1f7f52ca.jpeg)


## 勉強会受付
ま～僕は、受付という大役を任されて居ましたｗ

ま…雑用です…

少し、勉強会のサポーターにも回りました。

## 勉強会本番
[資料はこちら](http://saitamagame.com/study/vrShooting/VR_Shooting.zip)

![IMG_20161224_145941.jpg](https://qiita-image-store.s3.amazonaws.com/0/102634/9477256c-d67b-fe93-9556-5162c2b150a2.jpeg)

勉強会の詳しい内容は、明日、さいたまげーむすの中の人が書いてくれるはず！！！

## 交流会
割と好評でした。

く…クリスマスなので…、に…肉が欲しい。

あと...

女性が...

こんな日に勉強会に来るなんて...

## 所感
大型の勉強会って難しい…

あと、Lodgeさんありがとうございましたｗ

来年も開きます～ｗ
苦しんで覚えるObjective-C (①クルオシイ... ブロックリテラル)

- 思い付きのネタ(ほぼ、自分の勉強用)。


#苦しくて、狂おしくて。

高校時代の三年弱を夜な夜なＣでゲーム書いていた。
大学１年生で業務系のネットワークプリンターのパーサーを夜な夜な書いた後に
Cアレルギーになったのがはるか昔のこと。
書店で目にした書籍『苦しんで覚えるＣ言語』には、さらにいろいろと苦しい何物かが
詰め込まれているものと想像していた。

これからのクロスプラットフォーム開発環境として、《ほぼＣ言語》ながら、２１世紀前半を代表するクライアント向けＯＳとなろうMac OS XとiOSを生み出す礎となったObjective-Cに改めて注目してみようと考えた自分も、Objective-Cに改めて苦しんでみようと思いたったもので、作者サイトの方にアクセスしてみた。

なんと、『[苦しんで覚えるＣ言語](http://9cguide.appspot.com/)』サイトは、ゆとり世代(死語？)にも安心してお勧めできそうな、まったく怖くない解説サイトではないか。

なるほど、そんな時代なのね。
ということで、苦しんで覚えるＣ言語、略してクルシイ(苦Ｃ)というらしい本サイトをリスペクトして、苦しんで覚えるObjective-C (略称、クルオシイ苦O-C?）のメモ書きを残しておこうとちょっと思った次第。

Ｃ言語の文法はすべてクルシイ側に任せ、
そこにはないbetter-C(or 変態Ｃ)なところだけを記していく予定。

実のところ、 C99に準拠したC言語のすべてのコードはObjective-Cのコンパイル(Clang)を通るので、Objective-Cの実行環境(X-code、visual studio等 ）をC言語以外の学習教材として使う手はありだとおもう。
...以下はあくまでそうしたことを考え始めた自分向けメモ。いずれ、新人さん向けにリライトするかもしれない。

逆に、C++11/14/17は、
C++をガリガリ書くことになる研究室か企業に入るややレアな人にのみお勧めしたい。
※　C++はC言語の完全互換ではないため。

対象読者は、主にはマイマシンがMacな人。あとは、RAM 8GB以上を搭載しているwindows/linuxユーザーの人。docker環境等を用意した後には対象が広まるのだろう。

#第一問　ブロックリテラル (あるいはクロージャ)

ということで、クリスマスイブにお送りする第一回は、Objective-Cのブロックリテラルのお題。

以下のファイル、
拡張子はobjective-c形式の.mである。

```XY.m
#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    
    int (^blockXY)(int x, int y) = ^(int x,int y){   return x+y;    };
    
    int a= 1;
    int b= 4;
    
    printf("%d + %d = %d by extended C...\n",a,b,blockXY(a,b));
    
    return 0;
}

```
以下の問いに答えよ。

◇このコードで標準Ｃ言語と異なるところはどこか？
◇このコードの実行結果は？(Xcodeでの実行を推奨)

回答は次回に(たぶん年末年始)。

#誰得？
ブロックリテラルというのは、言い換えると他言語のクロージャに概ね相当する。
javaを使っている方はじめ、実務でクロージャを扱わない方は多々いるものと考えられる... 日本国内の技術者/SIerの過半数がクロージャを日常的に使っていないのではないかと思われる。

こうした方々にとって、拡張Ｃ言語であるobjective-Cを学習言語として軽くかじっておくのありなのでは、と思っている。

その他思うところはおいおいと。
NIJIBOXのエンジニアの見たいもの

# 前書き

去年に引き続き、今年も無事にNIJIBOXのアドベントカレンダーが今日まで進行していてホッとしている中の人です。やっぱりアドベントカレンダーは当日に投稿できた方がいいですね。[^1]

２年連続でカレンダー進行中なのではありますが、今回

- 技術書、もしくはそれに類するものであること
- 紙の本（Not電子書籍）であること
- 当日中に記事を掲載すること
- 予算上限を超えないこと

を条件に、**希望の本を一冊支給する**という取り組みをしてみました。

そこでここでは技術的な記事ではなく、応募してもらった本を分類しつつ、
**今、NIJIBOXのエンジニアが何を知りたいと思っているか**について、私の主観での感想とともにお送りしたいと思います。

# 本題を前に

所感部分は、どちらかといえば「NIJIBOXの中の人」というより「サーバサイド系エンジニア」として書いているため、若干偏っています。[^2]

#　主観に基づいた分類と所感

## サーバサイド系

SQLアンチパターンだけは２人から希望が来てました。
Re:dashやAmazon Athenaなど、SQLを触りやすい環境なども出てくるので、確かに需要などはありますね。

* [PythonによるWebスクレイピング](https://www.amazon.co.jp/dp/4873117615)
* [SQLアンチパターン](https://www.amazon.co.jp/dp/4873115892)
* [OREILLY Hack & HHVM](https://www.amazon.co.jp/dp/1491920874)

## インフラ系

Docker系が２冊あったのが特徴です。
キャンペーンサイトなどを作っていくことも多く、上記と合わせてマイクロサービスなどとの親和性などもありそうな印象ではあります。

* [プログラマのためのDocker教科書 インフラの基礎知識&コードによる環境構築の自動化](https://www.amazon.co.jp/Docker/dp/479814102X)
* [Docker](https://www.amazon.co.jp/dp/4873117763)
* [マスタリングNginx](https://www.amazon.co.jp/dp/4873116457)
* [Amazon Web Services クラウドデザインパターン設計ガイド　改訂版](https://www.amazon.co.jp/dp/4822277372)
* [マイクロサービスアーキテクチャ](https://www.amazon.co.jp/dp/4873117607)

## フロントエンド系

自社は既存環境下などの理由で言語などがある程度固まっていない場所以外については、比較的自由に言語/FWを選んでも問題ない風潮です。
そのため、フロントエンドのライブラリも、jQuery,AngularJs,React,Vue.jsなどが乱立している状況になっています。
書籍にもその辺が反映されていますね。


* [入門 React ―コンポーネントベースのWebフロントエンド開発](https://www.amazon.co.jp/dp/4873117194)
* [AngularJS　アプリケーションプログラミング](https://www.amazon.co.jp/dp/4774175684)


## ネイティブアプリ系

ソーシャルゲームの開発運用もやっている自社は、ゲーム系やネイティブアプリ系に興味を持つメンバーもそこそこいます。
その辺りが見て取れるラインナップですね。

* [SpriteKitではじめる2Dゲームプログラミング Swift対応 (Smart Game Developer) ](https://www.amazon.co.jp/dp/4798139513)
* [3Dゲームをおもしろくする技術 実例から解き明かすゲームメカニクス・レベルデザイン・カメラのノウハウ](https://www.amazon.co.jp/dp/4797357363)

## 設計・分析系

改めて設計系や分析系を書籍ベースで学びにいく勢。
セキュリティなどは重要な要素なので、社的にも強化されていくといいですね。

* [データ分析によるネットワークセキュリティ](https://www.amazon.co.jp/dp/4873117003)
* [システム設計のセオリー --ユーザー要求を正しく実装へつなぐ](https://www.amazon.co.jp/dp/4865940057)

## 機械学習系

ブームになっている機械学習系ですが、社内も一部では火がついてきていてきっちり学習しにいく風潮が出始めてはいます。
（これでPythonウェーブが来ると個人的にはちょっと嬉しい）

* [ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装](https://www.amazon.co.jp/dp/4873117585/)
* [実践 機械学習システム](https://www.amazon.co.jp/dp/4873116988)

## その他

他にも、こんなものが選ばれています。
（個人的に分類しにくかったので、まとめて紹介）

* [新装版　達人プログラマー](https://www.amazon.co.jp/dp/427421933X)
* [プログラマが知るべき97のこと](https://www.amazon.co.jp/dp/4873114799)
* [確率思考の戦略論 USJでも実証された数学マーケティングの力](https://www.amazon.co.jp/dp/4041041422)
* [その数式、プログラムできますか？](https://www.amazon.co.jp/dp/4798141100/)


# まとめ

NIJIBOXはリクルート内で「新規事業開発をする会社」という位置付けだからなのか（?)、エンジニアの嗜好面でのバラエティが豊かだったりして、本のカテゴリーがなかなかにバラバラなのが印象的でした。



[^1]: なお、自分が個人枠で参加した方は、時間の都合で翌日に掲載が遅れました
[^2]: 予防線です
クリスマスツリーのアスキーアートを生成するRubyスクリプトを書いた


__一人暮らしのワンルームアパートでYouTubeを見ながら、コンビニ弁当をつつく__という、日本でもっとも文化的なクリスマスイブの過ごし方をしているのですが、残念ながら足りないものがありました。クリスマスツリーです。一人暮らしの独身男性が住むワンルームアパートにクリスマスツリーがあるほうが珍しいとは思いますが、しかしクリスマスツリーがないと、わたしのハイソサエティなクリスマスイブライフのクオリティが下がってしまうのも事実。そこでここはプログラマらしく、クリスマスツリーをアスキーアートとして出力するスクリプトを書いてみることにしました。

簡単な要件としては以下の通りです:

- クリスマスツリーは葉と幹そして飾りの3部分からなる
    - 葉の形状は二等辺三角形。
    - 幹は長方形で、高さは葉の半分。幅は葉の3分の1程度とする。
    - 飾りは葉の部分に装飾される。量としては葉の6分の1程度にすると見栄えがよさそう。
        -なお 飾りはランダムに生成する。
- 「アスキーアート」ということで、アスキー文字のみで作成する。
    - 葉は`*`、幹は`#`、飾りはそれ以外のアスキー文字記号をいくつか選ぶ。

というわけで実際に作成してみました。

```rb

# クリスマスツリーを生成する。
# @param leaf_height 葉の高さ
# @return クリスマスツリー[String]
def create_tree(leaf_height)
  # 葉部分の高さが小さい場合は例外を投げる。
  raise ArgumentError.new("しょぼくなるのでだめです") if leaf_height < 5

  # 葉部分の最大の長さ、幹部分の高さと幅をそれぞれ求めておく。
  leaf_width = leaf_height * 2 - 1
  stem_width = (leaf_width / 3).odd? ? leaf_width / 3 : leaf_width / 3 - 1
  stem_height = leaf_height / 2

  # ツリー全体を二次元配列により表現する。
  tree = Array.new(leaf_height + stem_height){Array.new(leaf_width, "\s")}

  # 葉の座標を配列に格納する: 
  leaf_coordinates = (0...leaf_height).flat_map do |i|
    start = leaf_height - i - 1
    length = (i + 1) * 2 - 1
    (start...(start + length)).map{|j| [i, j]}
  end

  # 飾りの座標を格納する: 葉部分にランダムで飾り付ける。飾りの割合は葉全体の1/6程度にする。
  decoration_coordinates = leaf_coordinates.sample(leaf_coordinates.size / 6)

  # 幹の座標を配列に格納する: 幹の高さは葉の1/2、幅は葉の1/3程度とする。
  blank_length = (leaf_width - stem_width) / 2
  stem_coordinates = [*0...stem_height].product([*0...stem_width])
                                       .map{|i, j| [i + leaf_height, j + blank_length]}
  
  # 葉、飾り、幹のそれぞれを二次元配列treeにマッピングする。
  leaf_coordinates.each{|x, y| tree[x][y] = "*"}
  decoration_coordinates.each{|x, y| tree[x][y] = %w(? $ @ &).sample}
  stem_coordinates.each{|x, y| tree[x][y] = "#"}

  # 二次元配列を人の目にわかりやすい文字列に変換する。
  tree.map(&:join).join("\n")
end

puts create_tree(10)

#          *
#         ***
#        *****
#       *****?*
#      **&******
#     ******@****
#    *$***********
#   *******$**@****
#  ****@*****@******
# &**?*@****$**@&$**@
#        #####
#        #####
#        #####
#        #####
#        #####

puts create_tree(15)

#               *
#              ***
#             *****
#            *******
#           *@**?***$
#          *?***$*****
#         *****$****&*@
#        &*$***&**$*****
#       **?****?*********
#      ********&*&****@***
#     **$*****$*&**********
#    ************?*&@****?**
#   ********$****?????*?***&*
#  ********?****&*******@*****
# ***@******************?******
#           #########
#           #########
#           #########
#           #########
#           #########
#           #########
#           #########

begin 
  puts create_tree(3)
rescue => e
  puts e.message #=> しょぼくなるのでだめです
end
```

なかなか見栄えの良いクリスマスツリーができたのではないでしょうか。ちょっと張り切りすぎて、コメントをたくさん書きすぎたのは反省ですね。

それはさておき、クリスマスツリーができたということで、クリスマスイブ生活のクオリティも一層上がったように思います。__なおクリスマス当日(日曜日)は休日出勤。サービス残業ならぬサービス出勤で、手当なんぞは夢のまた夢。__クリスマスイブ以上に楽しいクリスマスがやってきそうですね。がってむ(´・ω・`)
Spacemacsとやらをインストールしてみる

# はじめに

EmacsのAdvent Calendarが空いていたので、(そして私のクリスマスイブの予定も空いていたので)若輩者で大変恐縮ですが、最近気になっていたSpacemacsの導入記事を書きました。

SpacemacsはEmacsから派生したエディタなのかと思っていたのですが、Emacsのディストリビューションのようです。

[公式サイト](http://spacemacs.org/)では次のように謳っています。

>The best editor is neither Emacs nor Vim, It's Emacs+Vim

もしかするとVim vs Emacsのエディタ戦争に終止符を打つ最終兵器となるのでしょうか。

# 環境

* macOS Sierra version 10.12.2
* Homebrew 1.1.2

# Emacsインストール

SpacemacsはEmacsがなければ使えないため、homebrewでEmacsをインストールします。24.4以上が必要です。

```{bash}
$ brew tap d12frosted/emacs-plus
$ brew install emacs-plus

$ emacs --version
```

# Spacemacsのインストール

Spacemacsは`.emacs.d`にcloneするので既存の設定ファイルをリネームしておきます。
`.emacs`ファイルがある人は少ないと思いますが、これがある場合は忘れずにリネームしておかないとSpacemacsは動かないそうです。

```{bash}
$ cd ~
$ mv .emacs.d .emacs.d.bak
$ mv .emacs .emacs.bak
```

`git clone`でインストールします。

```{bash}
$ git clone https://github.com/syl20bnr/spacemacs ~/.emacs.d
```

# 初回起動

`emacs -nw`で起動すると、初回起動時に３つの質問をされます。

一つ目はEmacsとvimどちらのキーバインドをメインで使うかです。
私はもちろんEmacsを選択しました。

```
What is your preferred editing style?
{Among the stars aboard the Evil flagship (vim) | On the planet Emacs in the Holy control tower (emacs)}
```

Spacemacsを標準構成と最小構成のどちらでインストールするかです。初めてなのでとりあえず標準を選択します。

```
What distribution of spacemacs would you like to start with?
{The standard distribution, recommended (spacemacs) | A minimalist distribution that you can build on (spacemacs-base)}
```

補完フレームワークに何を使うかという選択です。

```
What type of completion framework do you want?
{A heavy one but full-featured (helm) | A lighter one but still very powerful (ivy) | None (not recommended)}
```

これまではAnythingを使っていたのですが、helmかivyの２択で迷ってしまったので次の記事を参考にしてivyにしました。

[君は誰とEmacsる？ (補完インターフェイス紹介篇)](http://qiita.com/tadsan/items/33ebb8db2271897a462b)

もしかしたらNoneを選択してAnythingにする方法もあるのかもしれないのですが、その辺ものちのち調べたいと思います。

# 最低限のカスタマイズ

`~/.emacs.d/init.el`にあたるのが`~/.spacemacs`だそうです。`C-m f e d`でこの設定ファイルを開くことができます。
`dotspacemacs/user-config()`に`init.el`に書いていた設定を書きます。

`C-h`がbackspaceとして動作するように設定を書いてみました。

```{emacs-lisp:.spacemacs}
(defun dotspacemacs/user-config()
  (define-key global-map "\C-h" 'delete-backward-char)
  )
```

`.spacemacs`は`.spacemacs.d/init.el`に記述しても良いそうなのですが、まだ試していません。
spacemacsにはlayerという概念があり、自分用のprivate layerもあるので、その辺の設定をし始めるとディレクトリを作成した方がgit管理しやすそうです。

# おわりに

標準では行番号が表示されていないなど、やはり若干のカスタマイズは必要であり、layer等を理解して設定しなければならなそうです。
しかし、最初から補完フレームワークが使えるようになっていたりと、初めてemacsを使う人にとっては労せずにemacsの利便性を引き出せると感じました。

カスタマイズについて調べていましたが、まだ日本語の記事が少ないですね。もっと多くの人が使って日本語で記事を書いていただけたら嬉しいです。

# 参考

* [Spacemacs - github](https://github.com/syl20bnr/spacemacs#macos)
    * Spacemacsインストール方法
* [君は誰とEmacsる？ (補完インターフェイス紹介篇)](http://qiita.com/tadsan/items/33ebb8db2271897a462b)
    * Emacsで使える補完ツールの解説
Azure CLI をインストールしてみた

Azure CLI をインストールし、既に作成しておいたMicrosoft Azure 仮想マシンの
一覧表示までしてみた。

#環境
Amazon Linux 

#nvm のインストール

nvm は Node.js のバージョン管理マネージャで
node.jsのバージョン変更を簡単に切り替えできるツール

インストールにgitを使用

```
$ git clone https://github.com/creationix/nvm.git ~/.nvm && cd ~/.nvm && git checkout `git describe --abbrev=0 --tags`
```

パスを通し、バージョン確認
```
$ . ~/.nvm/nvm.sh
$ nvm --version
0.32.1
```

 ~/.bash_profileにも下記を追記し、ターミナル起動時にnvmコマンドが使えるようにする

```
if [[ -s /Users/ホームディレクトリ/.nvm/nvm.sh ]] ; then source /Users/ホームディレクトリ/.nvm/nvm.sh ; fi
```

#Node.js のインストール

Node.js をインストールするその前に
インストールバージョン確認

```
$ nvm ls-remote
         v0.1.14
...
         v7.2.0
         v7.2.1
         v7.3.0

```

Node.js をインストール

```
$ nvm install v7.3.0
######################################################################## 100.0%
Computing checksum with sha256sum
Checksums matched!
Now using node v7.3.0 (npm v3.10.10)
Creating default alias: default -> v7.3.0
```

バージョン確認

```
$ node -v
v7.3.0
```

#Azure CLIのインストール

Azure CLIをインストール

```
$ npm install -g azure-cli
npm WARN deprecated node-uuid@1.4.7: use uuid module instead
/root/.nvm/versions/node/v7.3.0/bin/azure -> /root/.nvm/versions/node/v7.3.0/lib/node_modules/azure-cli/bin/azure

> fibers@1.0.15 install /root/.nvm/versions/node/v7.3.0/lib/node_modules/azure-cli/node_modules/fibers
> node build.js || nodejs build.js
```

インストールされている事を確認

```
$ azure
info:             _    _____   _ ___ ___
info:            /_\  |_  / | | | _ \ __|
info:      _ ___/ _ \__/ /| |_| |   / _|___ _ _
info:    (___  /_/ \_\/___|\___/|_|_\___| _____)
info:       (_______ _ _)         _ ______ _)_ _
info:              (______________ _ )   (___ _ _)
info:
info:    Microsoft Azure: Microsoft's Cloud Platform
info:
info:    Tool version 0.10.8
...
...
...

```

#Azure サブスクリプションに Azure CLI を接続するための Azure アカウント資格情報を登録


「azure login」を入力

```
$ azure login
info:    Executing command login
- Authenticating...info:    To sign in, use a web browser to open the page https://aka.ms/devicelogin and enter the code ********* to authenticate.
\
```

上記にて表示されたURLに自端末のブラウザ等から接続し
*********で表示されたcodeを記入、その後に自身のアカウントを選択


![201612242231_000.JPG](https://qiita-image-store.s3.amazonaws.com/0/126270/e3c66366-845a-8f64-d200-cc5745e01126.jpeg)


次のような内容が表示され設定が完了した事を確認

```

|info:    Added subscription 無料試用版
info:    Setting subscription "無料試用版" as default
+
info:    login command OK
```

試しにvm listコマンドで既に作成していた仮想マシンの情報が表示される事を確認


```
$ azure vm list
info:    Executing command vm list
+ Getting virtual machines
data:    ResourceGroupName  Name   ProvisioningState  PowerState  Location  Size
data:    -----------------  -----  -----------------  ----------  --------  ---------------
data:    TEST               test1  Succeeded          VM running  eastus    Standard_DS1_v2
info:    vm list command OK
```
いろんな確認ダイアログを引数で実装できるDialogFragment

こちらを使っていただければいけるかと思います。
https://github.com/kojimamasahiro/MyDialogFragment/blob/master/app/src/main/java/sample/kojimamasahiro/mydialogfragment/MyDialogFragment.java

# 使い方

factoryメソッドの引数で、ダイアログを指定します。

```
MyDialogFragment myDialogFragment = MyDialogFragment.newInstance("HELLO", "", "hello dialog");
myDialogFragment.show(getFragmentManager(), "dialog");
```
![device-2016-12-24-223458.png](https://qiita-image-store.s3.amazonaws.com/0/61014/ed3b53a0-daec-ef91-c89b-061267d20496.png)

引数(★は省略可）はこんな感じ

```
/**
 * Tag（clickイベントの判別に使います）
 * Title（""にすることで省略可）
 * Message（""にすることで省略可）
 * ★Positive
 * ★Negative
 * ★Neutral
 */
```

クリックイベント

```
public class MainActivity extends BaseActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        MyDialogFragment myDialogFragment = MyDialogFragment.newInstance("request", "Please Review", "Could you review?", "Yes", "No Thanks", "Later");
        myDialogFragment.show(getFragmentManager(), "dialog");
    }

    @Override
    public void onPositive(String tag) {
        if ("request".equals(tag)) {
            // Storeヘ
        }
    }

    @Override
    public void onNegative(String tag) {
        if ("request".equals(tag)) {
            // 無視
        }
    }

    @Override
    public void onNeutral(String tag) {
        if ("request".equals(tag)) {
            // 次回
        }
    }
}
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/61014/18c73096-e98e-4d55-ae1a-d9a9bbd52e5f.png)


# おわりに

よかったら使ってみてください。

あと、画像のサイズ変更の仕方が知りたい。。。
無料のSEO検索順位チェッカー「serposcope」をAWS（Amazon Linux）にインストールしてみた

# serposcopeとは
Windows、MacOS、linuxで動作するSEO順位チェッカー。
javaベースで動作する。（元々PHPで動作するソフトだったけれど、javaに移行された）
SEO検索順位チェッカーの老舗である「GRC」とは違い、無料で使えるのが特徴。
GRCも優秀なツールだが、以下の通り有料のツールなので、個人で試すにはつらいところです。

|ライセンス体系|URL数|検索語数|上位100追跡|利用期限|料金|
|:---|:---|:---|:---|:---|:---|:---|
|無料版|3URLまで|20個まで|2個まで|永久|無料|
|パーソナルライセンス|3URLまで|300個まで|3個まで|永久|4,930円|
ビジネスライセンス|無制限|無制限|無制限|１年間|9,860円/年|

それに対してserposcopeは登録キーワード件数、サイト数無制限かつ無料で使える上に、Linux上でも動作するWebベースのアプリケーションなので、場所を問わず順位確認が出来るのがありがたいです。
Windows、MacOSにインストールすることも出来ますが、パソコンが起動していないと自動順位チェックが出来ないので、AWS等のクラウドサーバ上にインストールして動作させると便利です。

# AWS（Amazon Linux）にインストール
今回Amazon Linuxにインストールしてみます。
EC2インスタンスは動作している前提です。

# jarファイルをダウンロード
serposcopeはjavaベースで動作するので、jarファイルをダウンロードします。
適当なディレクトリで以下のコマンドを実行してください。実行ユーザーはrootで実行しました。
（以下は/var/www/serposcopeディレクトリにダウンロード＆インストールする例です）

```
sudo su - 
cd /var/www
mkdir serposcope
wget https://serposcope.serphacker.com/download/2.6.0/serposcope-2.6.0.jar
```

# 実行
早速実行します。ダウンロードしたjarファイルをjavaコマンドで実行するだけです。

```
java -jar /var/www/serposcope/serposcope-2.6.0.jar
```

コマンドラインから叩くのも不便なので、service登録＆chkconfigに登録しておくと便利です。

# 7134ポートの解放
serposcopeは7134ポートを使用したWebアプリケーションです。
EC2に紐付いているセキュリティグループのインバウンドルールの設定で、外部からの7134ポートを解放しておきましょう。

![インバウンドルール.png](https://qiita-image-store.s3.amazonaws.com/0/117041/5e8036c1-586b-ba58-c43d-a37d66b3d472.png)

上記設定はすべてのネットワークからの接続を許可しています。必要に応じて送信元を絞ってください。

# 動作確認
早速ブラウザから動作確認してみましょう。
以下のURLにアクセスします。

```
http://[IPアドレス もしくは ドメイン名]:7134
```

serposcopeのTOP画面が表示されればインストール成功です。

![serposcope１.png](https://qiita-image-store.s3.amazonaws.com/0/117041/3bda71e5-0d02-d44e-c851-007b7e3e2b28.png)
SketchUp Make v17 > メジャーツール > 印をつける方法

```txt:動作環境
SketchUp Make v17.1.173
MacOS X El Capitan
```

SketchUpを使っているうちに、操作間違いで見つけた事項。

1. 例として、W100, D100, H900mmの立方体を作る
2. メジャーツールを選択
3. 1のオブジェクトの最下端を選択
4. H方向にマウス移動をする
  - メジャーが伸び始める
5. 値を入力する (例: 400)

こうすると、下から400mmの部分に小さい点が作成される(下図参照)。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/699daae3-afe3-7097-1b6b-ca8df9c76935.png)

この小さい点から「線ツール」で各方向に線を足すことで、任意の長さで輪切りにできる。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/7304481b-78ea-edf3-4aab-138b0abd91c8.png)

回転しながら線を引くのが面倒なので、印の位置を取得して線を４本引くRubyスクリプトを実装できれば、作業が楽になりそう。
但し、１つの印の処理だけの場合は、手動操作の方が早い。
3個以上の処理になるとRubyスクリプトの分があるだろう。
（個人メモ）Rails5で関連を定義した時はbelongs_toに気をつける

# 概要
Rails5で、1からアプリを作り始めたときに躓いた。
Rail5からbelong_toのデフォルト値が下記記事の通り変わったらしい。

[Rails5からbelongs_to関連はデフォルトでrequired: trueになる](http://qiita.com/iguchi1124/items/218e35a145f372062ea4)


# 具体的な例

EventモデルとItemモデルがあり、Eventは複数のItemを保有するとしたとする。
モデルの記述は以下の通り

```db/schema.rb
create_table "events", force: :cascade do |t|
	t.string   "name"
	t.datetime "created_at", null: false
	t.datetime "updated_at", null: false
end

create_table "items", force: :cascade do |t|
    t.integer  "event_id"
    t.string   "name"
	t.datetime "created_at", null: false
	t.datetime "updated_at", null: false
end
```


```app/models/event.rb
class Event < ApplicationRecord
 	has_many :items
end

```


```app/models/item.rb
class Item < ApplicationRecord
	belongs_to :event 	
end

```


このとき、以下の文はエラーになる。

```
$ rails c
> item = Item.new(name: 'test name')
=> #<Item id: nil, event_id: nil, name: "test name", created_at: nil, updated_at: nil>
> item.save
   (0.2ms)  BEGIN
   (0.4ms)  ROLLBACK
ActiveRecord::RecordInvalid: Validation failed: Event must exist

```



# 対応策
Rail5からbelongs_toのデフォルトが関連先の値を検査するようになった。Rails4と同様に関連先を検査しないようにするには、belongs_toにoptional: trueを付与すれば良い。

```app/models/item.rb
class Item < ApplicationRecord
	belongs_to :event, optional: true
end

```


```
> item.save
   (0.3ms)  BEGIN
  SQL (0.5ms)  INSERT INTO "items" ("name", "created_at", "updated_at") VALUES ($1, $2, $3) RETURNING "id"  [["name", "test name"], ["created_at", 2016-12-24 13:31:36 UTC], ["updated_at", 2016-12-24 13:31:36 UTC]]
   (1.7ms)  COMMIT
=> true

```

以上
2016/12時点 Twitterのプロフィール画像のフォーマットについて

ツイッターコンソール https://apigee.com/console/twitter

- プロフィール画像のフォーマットは少なくともpng、gif、jpg、bmpの4種類ある。しかし後述の通り拡張子は信用出来ないので実際のデータ形式の判断に使うべきではない。
- apiから取得するプロフィール画像のURLには_normalが付いている
- _normalを削除するとオリジナルのファイルが得られる
- 今はアニメーションgifの設定は出来ないが、昔設定した人のオリジナルファイルは今もそのままになっている。_normalは静止画になっている。
- 最近のプロフィール画像のURLはランダムな英数8文字_normal.jpgだが、任意の文字列＋_normalのユーザーも存在する。
- ここは今確認出来ないけど、昔はアップロードする時のファイル名がほぼそのまま使われていた。マルチバイト文字は_ に置換されていたはず。だから_normalを単純に置換すると危ないかもしれない。「プロフィールimage.jpg」をアップすると「_____image_normal.jpg」になるという意味。_の数は適当。
- 拡張子はjpegとjpgの両方がある。加えてGIFとJPGの場合もある。
- さらに拡張子が無い場合もある。この場合ファイル名は「xxxxx_normal」だけとなる。
- 何も考えずpbs.twimg.comから画像を落としまくると、数分？程度で接続切られる。

sampleストリームを数分回して見つけたレアなURL
https://pbs.twimg.com/profile_images/1943255919/____11111_normal.jpg
https://pbs.twimg.com/profile_images/2178208013/1aU8XLEG_normal
https://pbs.twimg.com/profile_images/1279050067/__iso-2022-jp_B_GyRCJVUlISUkJWsbKEIwMDIyLmpwZw_____normal
https://pbs.twimg.com/profile_images/258987095/chessnerd2_normal.bmp


まとめ
- URLの拡張子は信じるな。実際にダウンロードしないとどうしようもない。
- _normalを置換する時は正規表現でちゃんと書くべし


# profile_background_image_url_https

- カラ(null)になる事もある。空文字は無いかな
- キーは必ずあるっぽい

# profile_banner_url

- キー自体が無い場合がある
- urlは https://pbs.twimg.com/profile_banners/12345678901234567890/1234567890 こんな感じ
Stylez Advent Calendar の締め

Stylez Advent Calendar 2016 - Qiita
http://qiita.com/advent-calendar/2016/stylez
の24日目です。

# 1. Stylez Advent Calendar を始めようと思った経緯

一番最初にひょんな事から以下のブログを読ませていただきました。

富士通がAdvent Calendarに参加することになった理由 - blog
http://tnaoto.hatenablog.com/entry/2016/12/02/114611

この記事の中に
小野和俊のブログ:SlackをSIerに導入した話。そしてSIerの未来
http://blog.livedoor.jp/lalha/archives/50528045.html
というリンクが有りました。

「SIオワコン」じゃなくて、「未来の話をしよう」と。
書いてありました。

株式会社スタイルズでは、QiitaでOrganizationアカウントを作成し、記事を投稿することを推奨しています。
http://qiita.com/organizations/stylez

で、果たしてスタイルズの「内圧」はどうなんだろうか。
素朴に疑問に思ったのが最初です。

そこで、無謀にも2016/12/15にAdventカレンダーを立ち上げました(無茶すぎる。。)

# 2. どうだったか？

~~投稿数：12(この記事含む)/25
投稿者数：5/100(全社員数:2016/12/24現在)
　つまり、全社員の5%が記事を書いてくれた、ということになります。~~

~~修正：2016年12月25日現在
投稿数：13(この記事含む)/25
投稿者数：6/100(全社員数:2016/12/24現在)
　つまり、全社員の6%が記事を書いてくれた、ということになります。~~

修正：2017年1月2日現在
投稿数：18(この記事含む)/25
投稿者数：7/100(全社員数:2016/12/24現在)
　つまり、全社員の7%が記事を書いてくれた、ということになります。

# 3. これはどういうことを意味するのか？

上記の富士通のAdventカレンダー は、2つあり、
http://qiita.com/advent-calendar/2016/fujitsu
http://qiita.com/advent-calendar/2016/fujitsu_ext
です。全て埋まっています。

50名の人が書いたと言うことになります。
＃本当はもっと書きたい人が居たかもしれませんが。

富士通の社員は現在何名でしょうか。
http://www.fujitsu.com/jp/about/corporate/info/
によると15.6万人だそうです。

とすると、スタイルズ社でQiitaを書いてくれた人の割合は結構高いのではないでしょうか。

# 4. 他社さんはどうだったか？

2016年企業・学校・団体カテゴリーのカレンダー - Qiita
http://qiita.com/advent-calendar/2016/categories/company
で他社さんのAdventカレンダーの埋まり具合を見ることができます。

埋まってない会社さんも結構ありますね。
埋まっている会社さんも少人数で頑張っていらっしゃる会社さんもあります。

# 5. 結論

来年(2017年)は、全部埋まるように頑張ります！
Windowsスポットライトで表示される画像をデスクトップ背景にする

Windowsスポットライトは、Windows起動時にきれいな写真を表示する機能。
この写真を取得し起動時にデスクトップの壁紙として貼り付けるプログラムを作ろう。

スポットライトの画像は「C:\Users(ユーザ名)\AppData\Local\Packages\Microsoft.Windows.ContentDeliveryManager_cw5n1h2txyewy\LocalState\Assets」に拡張子が消えた状態で置かれる。この中にどういう決まりで画像が追加されているのかは調査中なので、今回は一番サイズの大きい画像を取り出して使う。

VisualStudio2015でC#で作る。C#のWindowsFormApplicationのプロジェクトを作る。

program.csに書き込むコードは以下。

```C#:Program.cs
using System;
using System.Text;

namespace WindowsFormsApplication2
{
    static class Program
    {
        [System.Runtime.InteropServices.DllImport("user32.dll")]
        private static extern bool SystemParametersInfo(uint uiAction, uint uiParam, StringBuilder pvParam, uint fWinIni);
        const uint SPI_SETDESKWALLPAPER = 20;
        const uint SPIF_UPDATEINIFILE = 1;
        const uint SPIF_SENDWININICHANGE = 2;
        const string WIN_LIVEPHOTOPATH = @"C:\Users\(ユーザ名)\AppData\Local\Packages\Microsoft.Windows.ContentDeliveryManager_cw5n1h2txyewy\LocalState\Assets";

        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            string[] subFolders = System.IO.Directory.GetFiles(WIN_LIVEPHOTOPATH, "*");
            long max = 0;
            string fileName = "";
            foreach (string value in subFolders) {
                System.IO.FileInfo fi = new System.IO.FileInfo(value);
                if (max < fi.Length) {
                    max = fi.Length;
                    fileName = value;
                }
            }
            StringBuilder sb = new StringBuilder(fileName);
            SystemParametersInfo(SPI_SETDESKWALLPAPER, (uint)sb.Length, sb, SPIF_UPDATEINIFILE | SPIF_SENDWININICHANGE);
        }
    }
}
```
SystemParamertersInfoがミソ。StringBuilderで指定したパスの画像をデスクトップの背景にする。

ビルドすると，VisualStudioのプロジェクトの「/Debug/bin」内にexeファイルができる。
これを「C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp」に置く。
これでWindows起動時に実行される。
Passengerで起動したRailsの時のみ環境変数を削除する

# 状況

- `/etc/profile.d/proxy.sh`で`export HTTP_PROXY=http://proxy.example.com:8080`している
- PassengerでRailsアプリを動かしている
- そのRailsアプリでelasticsearch-railsを使っていて、localhost:9200にあがっているElasticSearchに接続したいが何故かproxy経由になってしまってうまく動かない
- CentOS 7 + Apache + Passenger 5


# 結論

アプリを起動しているユーザーの`.bashrc`に以下の内容を追加する。

```
trace_parents() {
  local pid=$$ cmd
  while true; do
    cmd=$(cat /proc/$pid/cmdline | tr '\0' ' ')
    echo $cmd
    [ $pid -eq 1 ] && break
    pid=$(awk '/^PPid:/{print $2}' /proc/$pid/status)
  done
}

trace_parents | grep "^Passenger core$" && {
  unset HTTP_PROXY
  unset http_proxy
  unset HTTPS_PROXY
  unset https_proxy
  unset NO_PROXY
  unset no_proxy
}
```

上記の例ではproxy関連の環境変数を`unset`しているが、消したい環境変数なんでも好きなものを列挙すればよい。

`trace_parents()`は以下のサイトを参考にした。

http://h2plus.biz/hiromitsu/entry/838


# 何が問題か

elasticsearch-railsは内部でfaradayを使っているが、こいつが環境変数no_proxyを無視する。というか正しくは未だ対応していない。

https://github.com/lostisland/faraday/pull/361

つまり環境変数http_proxyがセットされている場合、localhostや127.0.0.1含め、どこだろうが全てそのproxy経由接続になってしまい、それを回避する方法がない。

そもそもsystemdで起動しているhttpd(apache)から起動されるpassengerで、なんで`/etc/profile.d/`以下に書いてある環境変数が読み込まれているのか謎だったが、調べてみるとPassengerのドキュメントにちゃんと書いてあった。

https://www.phusionpassenger.com/library/indepth/environment_variables.html#passenger-served-apps

> Through your bashrc. Starting from version 4.0, Passenger 4.0 spawns applications through bash and inherit all bash environment variables. Passenger Standalone tends to be started from the shell and thus inherits all environment variables set by the shell.

先程の`trace_parents`の結果を見てみると、たしかにPassengerからアプリ起動時に`bash -lc`が実行されている。で、CentOSの場合、デフォルトの`/etc/bashrc`ではインタラクティブシェルじゃない場合にも`/etc/profile.d/*.sh`を読み込む記述になっていて、これでPassengerがRailsアプリをロードする時に環境変数が読み込まれていた、ということだった。

自分が直面したケースでは、Passengerから呼び出される時のみproxy関連の環境変数を削除することで対応可能だったので、`.bashrc`内で呼び出し元をトレースしてPassengerだった場合のみunsetするようにして対処した。


# 学び、他

- `/proc/$pid/environ`を見ると、そのプロセスの環境変数が見れる。これは知らなかった。
    - cronで環境変数絡みのdebugするのどうするかいつも悩んでいたが、`sleep 60`的なことをしてここを確認すれば捗るような気がした。
- そもそもfaradayで`no_proxy`対応してくれないと困る
    - 同じアプリ内で自分たちで書いている部分はtyphoeusを使っていて、こっちはlibcurlを使っているのでno_proxyに対応している。ちぐはぐ。