OmniAICreator/Qiita-1.07M huggingface dataset:
mbed(nRF51822) develop on Clion


をやりたいけど，まだ対応できてないっぽい．

cmakeでクロスコンパイラをしてするときには，cmakeのコマンド引数で渡すとかする．
http://www.vtk.org/Wiki/CMake_Cross_Compiling


だけど，

>1. CMake
>    c. Parameters
>        * Pass environment variable to CMake command in CLion
>        * Pass parameters to CMake command in CLion

https://confluence.jetbrains.com/display/CLION/Roadmap+for+CLion+1.0

ということらしい．


直接コンパイラを指定することもできるから
> Q: What compilers can I use? How do I change the compiler?
> A: At present CLion supports GCC and Clang compilers and is guided by these two to get the libraries and headers paths. In the next releases we are planning to extend the list of compilers available in CLion.
To change the compiler, go to the Cache tab in CMake tool window and set the compiler’s path to the CMAKE_CXX_COMPILER variable. Then press Enter and click the Apply Changes and Reload button:
cmakecache
Search our issue tracker for feature requests about supporting other compilers to follow or vote on them, or add a new one if it’s missing.

http://blog.jetbrains.com/clion/2014/09/clion-answers-frequently-asked-questions/



当面はそういう方法でもいいかと思ったけど，うまく行かなかった．

> Error:Configuration MinSizeRel
The C compiler "/Users/ryoma/embed/bin/arm-none-eabi-gcc" is not able to compile a simple test program.
It fails with the following output:
 Change Dir: /Users/ryoma/Library/Caches/clion10/cmake/generated/b50ec49/b50ec49/MinSizeRel/CMakeFiles/CMakeTmp
Run Build Command:/usr/bin/make "cmTryCompileExec2028663385/fast"
/Applications/Xcode.app/Contents/Developer/usr/bin/make -f CMakeFiles/cmTryCompileExec2028663385.dir/build.make CMakeFiles/cmTryCompileExec2028663385.dir/build
"/Applications/CLion EAP.app/Contents/bin/cmake/bin/cmake" -E cmake_progress_report /Users/ryoma/Library/Caches/clion10/cmake/generated/b50ec49/b50ec49/MinSizeRel/CMakeFiles/CMakeTmp/CMakeFiles 1
Building C object CMakeFiles/cmTryCompileExec2028663385.dir/testCCompiler.c.o
/Users/ryoma/embed/bin/arm-none-eabi-gcc -o CMakeFiles/cmTryCompileExec2028663385.dir/testCCompiler.c.o -c /Users/ryoma/Library/Caches/clion10/cmake/generated/b50ec49/b50ec49/MinSizeRel/CMakeFiles/CMakeTmp/testCCompiler.c
Linking C executable cmTryCompileExec2028663385
"/Applications/CLion EAP.app/Contents/bin/cmake/bin/cmake" -E cmake_link_script CMakeFiles/cmTryCompileExec2028663385.dir/link.txt --verbose=1
/Users/ryoma/embed/bin/arm-none-eabi-gcc -Wl,-search_paths_first -Wl,-headerpad_max_install_names CMakeFiles/cmTryCompileExec2028663385.dir/testCCompiler.c.o -o cmTryCompileExec2028663385
/Users/ryoma/embed/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/bin/ld: warning: cannot find entry symbol arch_paths_first; defaulting to 0000000000008018
/Users/ryoma/embed/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/libc.a(lib_a-exit.o): In function `exit':
exit.c:(.text.exit+0x2c): undefined reference to `_exit'
collect2: error: ld returned 1 exit status
make[1]: *** [cmTryCompileExec2028663385] Error 1
make: *** [cmTryCompileExec2028663385/fast] Error 2
CMake will not be able to correctly generate this project.
HP SmartStart CDROMのダウンロード

HP製サーバにwindowsをインストールする際のおなじみSmartStart CDROMですが、ダウンロード出来ることに気がついた。


## HP公式

* [Drivers & Software for Foundation Pack SmartStart - HP Support Center.](https://h20566.www2.hp.com/hpsc/swd/public/readIndex?sp4ts.oid=344317)

* [SATAドライバー](https://downloadcenter.intel.com/Detail_Desc.aspx?agr=Y&ProductID=2101&DwnldID=15449&strOSs=All&OSFullName=All%20Operating%20Systems&lang=eng)

* [HP(ヒューレット・パッカード)パソコン ドライバーダウンロードサポート](http://download-drv.com/hp/html/hp_proliant.htm)
  * [Drivers & Software - HP Support Center.](http://h20565.www2.hp.com/hpsc/swd/public/detail?swItemId=MTX-9553913a25fe499aa09e22cfe2&sp4ts.oid=3201207)

## その他

* [nlite](http://www.nliteos.com/download.html)
* [virtualbox.org • View topic - How to install Windows 2000/XP/2003 guests with SATA support](https://forums.virtualbox.org/viewtopic.php?t=9575)

* [超ドライバリンク集 自作パソコン・周辺機器の総合デバイスドライバーリンク集 【driver.himaism.com】](http://driver.himaism.com/)


## Linux

* [HP/ProLiant - Debian Wiki](https://wiki.debian.org/HP/ProLiant)
* [HP ProLiant Gen8サーバー： HP Dynamic SmartアレイB120i/B320iコントローラー - HP Dynamic Smartアレイコントローラードライバー (hpvsa) バージョン1.2.4-3および1.2.4-4がLinux環境で高ロードアベレージおよびCPU高使用率の原因となる場合がある](https://h20628.www2.hp.com/km-ext/content-webapp/document?docId=emr_na-c03659382)
haxe+createjsを触ってみました。

こんにちは。二回目の投稿になります。前回はHaxe+openflについて書きましたが、今回はHaxe+CreateJSを触ってみてハマったことや躓いたことを、おもに自身の備忘録として、ここにしたためておきます。

1.作業環境　
-----------
Linux(Arch Linux)上でvim+vaxeで作業をしています。
Win７上ではFlashDevelopを使って作業をしています。
Win Linux ともに64bitです。

2.バージョン
-------------
[Haxe](http://haxe.org/)のバーションは[3.1.3]
[createjs](http://createjs.com)のバージョンは[createjs-2014.12.12.min.js]
[CreateJS-Haxe](https://github.com/nickalie/CreateJS-Haxe)のバージョンは[1.5.7]
vimのバージョンは[7.4.537]
FlashDevelopのバージョンは[4.6.4.1]
です。

3.注意点・留意点・お願い
-----------------
筆者はブログラム経験が浅く、特にJavaScriptに関する知識がほとんどありません。なので、色々と見当違いなことをここに書き残す場合もあります。その点にはご留意ください。間違い等ありましたら、ご指摘願います。できる限り速やかに対応させていただきます。

４.準備
-----------------
HaxeではjavaScriptの外部ライブラリを使用するにあたって、extern class というものを用意する必要があります。今回の場合はcreatejsを使用するので、createjsをHaxeから利用するためのextern class が必要になるわけですが、createjsの場合は、すでにhaxelibに用意されているので、ターミナルで```haxelib install createjs```とするだけで、サクっとHaxeからcreatejsを利用する準備が整います。
参考URL
http://old.haxe.org/doc/js/extern_libraries?version=15978

５.ハマったところ
----------------
さて、サクっと上記のextern classを導入したのはいいのですが、これが今回のハマリポイントとなりました。
下記のコードをHaxeで書き、jsターゲットでコンパイル。問題なくコンパイルは通るのですが、firebugで確認すると何やら下記のエラーがでてきます。

コード

```
package;

import createjs.easeljs.DisplayObject;
import createjs.easeljs.Stage;
import createjs.easeljs.Event;
import js.Browser;

class Main extends DisplayObject{

	private var stage:Stage;
	public static function main() {
		new Main();
	}
	private function init(e:Event):Void {
		stage = new Stage(Browser.document.createCanvasElement());

	}
	public function new() {
		super();
		Browser.window.addEventListener("load",init);
       	}	       
}	
```
エラー
```TypeError: setting a property that has only a getter
this.stage = new createjs.Stage((function($this) {
-------------↑```

うーん。getterしかもっていないプロパティーに値を設定しているのでダメです、代入はできないです。とのこと。
ちょっとまってよ、stageってのは当方が用意したメンバであって、getterもsetterも関係ないじゃない。っておもったわけです。ここでしばし迷走。しかし、ちょっと冷静になって瞑想にふけること１０分間。そういえば、親クラスのDisplayObjectにはstageってメンバ変数あったなぁと思い当たりました。嗚呼、なるほど、知らず知らずstageってメンバをサブクラスにおいてオーバーライドしてしまっていたわけね。というわけで、stageというメンバ名をmyStage等に変えることで一件落着....ってちょっとまってよ。知らず知らずにオーバーライドってどういうことだよ〜ってなりました。なんのためにHaxeとextern classをつかっているのかと。なぜにコンパイルが通るのかと。なので、ためしに、DisplayObjectクラスが持つメンバを上記のクラスにあえて追加してみました。
```
（省略）
private var stage:Stage;
private var alpha:Float;//これを追加
（省略）
```
すると・・・

```Redefinition of variable alpha in subclass is not allowd```

ちゃんとコンパイル時にエラーを出してくれました。
というわけで、結論からいうと、**「extern classからstageの定義が抜けていた。」**ということなんですね。これって結構やっかいだなぁ〜とおもいつつも、そもそも人が作ったものを利用してあやふやにコードを書くからからこうなるんですよね。extern classの中身ぐらいは自分でしっかりと確認しないとですね。JSライブラリのソースも読まないといけいないですよね。色々と勉強になりました。嗚呼、JavaScript。少なくとも読めるようにならないと。。。。

おまけ
-----
FlashDevelop（バージョン4.6.4.1)では、mongooseというwebサーバをつかってhtml5ターゲットやjsターゲットでビルドされたコンテンツをブラウザに表示してくれるのですが、このmongoose周りに不具合があるのか、うまく動作しませんでした。下記URLの内容をもとにして、設定を変えようとしましたが、設定項目自体が見つかりません。なので、いまのところ、根本的な解決策が見つかっていません。とりあえず、ビルドで作成されたhtmlを直接ブラウザで開くという方法で対処していますが、時期バージョンで改善されていると嬉しいです。

話し変わって、前回、vaxeとsyntsticのhaxeでの使い心地をレビューすると書きましたが、もう少し使い込んでから書きたいとおもいます。本日は以上です。

参考URL
http://www.flashdevelop.org/community/viewtopic.php?f=6&t=11910
http://www.flashdevelop.org/community/viewtopic.php?f=13&t=11978
「スマートフォンでの脱出ゲームの作り方」というスライドを作りました

##はじめに
これは ドリコムAdvent Calendar 21日目の記事です。
20日目は shioriharaさんの [エンジニアとしてのおもてなし](http://qiita.com/shiorihara/items/905abce112ee863c54b5) です。

##誰？
ドリコム新卒2年目のtakao.uchikawaです。
社内では<b>テントさん</b>とよばれております。
1年目はソーシャルゲームの運用・開発をしていて、
2年目途中の人事異動の3日前に、
<b>「君、子会社に出向ね」</b>
と言われ、引き継ぎを1日で終わらせて出向し、
今はカジュアルゲームを作っております。

##スライドは？

どうぞ。
[![title2.png](https://qiita-image-store.s3.amazonaws.com/0/60274/5408b011-715a-4285-963f-b6deac624732.png)](http://www.slideshare.net/tak158/escape-42905334)

<iframe src="//www.slideshare.net/slideshow/embed_code/42905334" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <div style="margin-bottom:5px"> <strong> <a href="//www.slideshare.net/tak158/escape-42905334" title="脱出ゲームの作り方" target="_blank">脱出ゲームの作り方</a> </strong> from <strong><a href="//www.slideshare.net/tak158" target="_blank">Takao Uchikawa</a></strong> </div>

##おわりに
テキストで説明するのにやや限界があった内容なので、
スライドで書くことにしました。

もしよかったら見てくださいね。

明日は22日の[ryouichi.horii](http://www.adventar.org/users/5029,"シモーネさん")さんです。
お楽しみに！
AndroidStudioでjarファイルを出力する


※Android Studio 1.0.1 で確認


参考: [【Android】AndroidStudioでjarを出力する](http://tech.admax.ninja/2014/09/10/export-jar-by-android-studio/)


# gradle.properties の編集

以下の行を追加し出力するjarファイルの名前を設定しておく

```
JAR_NAME=hoge.jar
```



# build.gradle の編集

以下を追加

```
task clearJar(type: Delete) {
    delete 'build/libs/' + JAR_NAME
}
task makeJar(type: Copy) {
    from('build/intermediates/bundles/release/')
    into('release/')
    include('classes.jar')
    rename('classes.jar', JAR_NAME)
}
makeJar.dependsOn(clearJar, build)
```


# 実行

Gradle tasks の中に makeJar が出来てるので、ダブルクリックで実行。

![kobito.1419140474.180549.png](https://qiita-image-store.s3.amazonaws.com/0/8219/278d7e70-f727-881e-077a-da2ca02e97b8.png "kobito.1419140474.180549.png")

正常に完了すると、プロジェクトの release フォルダの中にjarファイルが出来ているはず。
認めよう

（偉そうに書いていますが、基本的に「自分が見失いがちなこと」を自戒の為に書いています）

#認めよう

##バグの無いソフトウェアは無い ※

ユーザーとしてはもちろん技術者としてもなかなか認めたくないことではありますが、昔から言われていることでもあり、様々な調査研究で証明されていることであり、もしあなたが熟練の技術者なら経験上からも残念ながらそれが真実だとわかることでしょう。

※ わかっているとは思いますが、開き直ってバグを放置して良いという意味ではありません。

###しかし

希望を失ってはいけません。バグを減らすことは出来ます。またバグを見つけてデバッグすることも出来ます。

もしあなたがバグを作り込んだ当人である場合、その失敗を訂正するか、次はもう少しマシに失敗するよう心がければ良いのです。

もしあなたが使っている API にバグがあり、それが自分の責任でないとして、いくつかの道があります。

* API を使わないか、回避する使い方をする。
* API の中身を除いてバグを修正する。
* 作者にバグを報告する。※

※ もしその作者が外国人の場合チャンスです。連絡と同時に外国語の勉強をすることが出来ます。「それでも腹が立つなら」の項を参照してください。

##掲載コードにミスの無い技術書は無い

バグの無いソフトウェアがないのと同じように、誤りの無い書籍もありません。しかし同様に、誤りを正すこともできます。

もしあなたが読者なら、そのことに腹を立て、Amazon の読者レビューに愚痴るのは止めましょう。筆者をかばっているのではなく、単に時間の無駄です。あなたが筆者のミスに気付くまでに無駄にした時間それ以上に無駄にする必要はありません。

###しかし

あなたが読者なら、そのミスを出版元に連絡することが出来ます。出版社の Web サイトに掲載される正誤表に新たな項目が加わるか、もっと運が良ければ増刷の際に修正され、他の人を助けることが出来るでしょう。

##日本語に違和感の無い翻訳本は無い

これも同様に、完璧な翻訳など無いことを認めましょう。

もしあなたが読者なら、そのことに腹を立て、Amazon の読者レビューに愚痴るのは止めましょう。筆者をかばっているのではなく、単に時間の無駄です。翻訳は外国語に通じていると同時に、日本語にもより通じている必要があります。技術本の翻訳はそれに加えて、その技術に通じていることも必要です。そんなことが重なる奇跡を期待している時間に、新しい技術が生まれ、内容はどんどん陳腐化していきます。その時間をもっと別のことに使うべきです。

###しかし

あなたが読者なら、そのミスを出版元に連絡することが出来ます。出版社の Web サイトに掲載される正誤表に新たな項目が加わるか、もっと運が良ければ増刷の際に修正され、他の人を助けることが出来るでしょう。もし筆者にそのことが伝われば、次の翻訳本の精度が上がる可能性があり、それも多くの人の助けになることでしょう。

あるいは「原典を参照する機会」「外国語を学ぶ機会」と捉えましょう。技術者の修行に終わりはありません。強制的に勉強するチャンスが来たと思いましょう。「それでも腹が立つなら」の項を参照してください。

##それでも腹が立つなら

###その怒りは、あなたがレベルアップしたことの何よりの証明です

ただ自分を誇らしく思いましょう。

###その怒りはあなたがレベルアップするチャンスです

バグではないですが、私はかつて「こんなもの絶対に使いこなせるようになるはずが無い」と、正規表現に対して思っていました。記号だらけで、覚えるのを拒絶されているかのようで、便利さよりもこのような記法が存在することをむしろ腹立たしく思ったものです。そうして避けてばかりいたそれも、やがて実務上の都合から使うはめになりました。使ったはみたものの気に入らないので「もう二度と使うものか」という決意をするのです。しかしやっぱり実務上の必要から同じことを繰り返すことになります。そのうちに、結局使いこなすことが出来るようになってしまいました。いまはもちろん、とても便利に使わせてもらっていますし、この技術にとても感謝しています。

またある時私は、繰り返すバージョンアップの中でなかなか解消しないバグについてフォーラムに英語で投稿しました。しかし私がバグだと思っていたそれは、ある時点でひっそりと追加された新機能だったのです。私は恥をかいただけだと思うかもしれません。しかし一方で、その新機能についての知識を得、且つ英語の勉強をする良い機会にもなりました。

###その怒りはあなたのスキルを支える礎です

> 怒りを胸に沈めてはならぬ
> 怒りは両足に込めて
> 己を支える礎とせよ
> （覚悟のススメ）

エンジニアに祝福を！
Swiftで強制キャストを行う



あるクラスとそれに適合したプロトコルを操作したい場合、Objective-Cでは以下のように宣言出来ました。

```objc

@protocol SomeProtocol <NSObject>
- (void)huga;
@end

///////

UIViewController<SomeProtocol> *hoge = ...

// クラスが持つメソッド
hoge.view

// プロトコルで宣言したメソッドも候補に現れる
[hoge huga];

```


swiftで単純に`as`演算子を用いてキャストしようとしても以下のようなエラーがでてしまい、ビルド出来ません。

```
'xxx' is not convertible to 'yyy'
```



swiftでは下記のように`xxx as AnyObject as yyy`として、一旦`AnyObject`を経由することで任意のクラスにキャストすることが出来ます。



```swift

@objc
protocol SomeProtocol {
}

func hoge(hoge: SomeProtocol) {

	//1. hogeがそのクラスでない場合、エラーが起きてもいいパターン
	let vc = hoge as AnyObject as UIViewController
	
	//2. hogeがそのクラスにキャスト出来るかチェックを行うパターン
	//   ただし、SomeProtocolに@objcを付ける必要がある
	//   キャスト出来ない場合、nilになる
	let vc = hoge as AnyObject as? UIViewController
	
}

```
mutt で使用するパスワードを暗号化する

ちょっと mutt を使ってみたいなあと思って、Xubuntu で mutt で Gmail を使えるようにしてみたけど、ググって出てきた情報のままやると、~/.muttrc にパスワードが平文で残りそうだったので調べたけど、また設定するときに思い出せる気がしないのでメモ。

まず、Google のアカウントの 2 factor authentication (2段階認証) を有効化しているので、mutt 用に [アプリパスワード](https://security.google.com/settings/security/apppasswords) を取得する。

取得したアプリパスワードを一時的にファイルに書く。
内容は下記のような感じで、場所は、どこでも良さそうだけど、とりあえず `~/.mutt/passwords` に書いた。

``` ~/.mutt/passwords
set imap_pass="password"
set smtp_pass="password"
```

鍵が必要らしいので、 `gpg --gen-key` して作る。 
いくつか質問されるので、それに答える。

`Not enough random bytes available.  Please do some other work to give
the OS a chance to collect more entropy!` みたいなメッセージが出て止まったけど、なにか OS に処理をさせろということらしい、 [ココ](http://stackoverflow.com/questions/11708334/pgp-asymmetric-not-enough-random-bytes-available-please-do-some-other-work-to) を見ると、 `rngd -f -r /dev/urandom` すると早いとのことだったので、 `sudo apt-get install rng-tool` してから、 `sudo rngd -f -r /dev/urandom` した。

あとは、パスワードを暗号化して、平文でパスワードを書いてたファイルを削除して、  `~/.muttrc` に生成されたファイルを読み込むように `source "gpg -d ~/.mutt/passwords.gpg |"` と追記して終わり。

``` sh
gpg -r foobar@Gmail.com -e ~/.mutt/passwords
shred ~/.mutt/passwords
rm ~/.mutt/passwords
```

 `~/.muttrc` は、とりあえずこんな感じになった。
追記するかもしれないけど、ひとまずは最小限の設定で試してみる。

``` ~/.muttrc
set from             = "foobar@Gmail.com"
set realname         = "cd01"
set imap_user        = "foobar@Gmail.com"
set smtp_url         = "smtp://foobar@smtp.gmail.com:587/"
set folder           = "imaps://imap.gmail.com:993"
set spoolfile        = "+INBOX"
set postponed        = "+[Gmail]/Drafts"
set header_cache     = ~/.mutt/cache/headers
set message_cachedir = ~/.mutt/cache/bodies
set certificate_file = ~/.mutt/certificates
set move             = no

source "gpg -d ~/.mutt/passwords.gpg |"

```

# 参考

* [Mutt - ArchWiki](https://wiki.archlinux.org/index.php/mutt#Passwords_management)
* [Aaron Toponce : Encrypted Mutt IMAP/SMTP Passwords](https://pthree.org/2012/01/07/encrypted-mutt-imap-smtp-passwords/)
* [gpg - PGP Asymmetric - Not enough random bytes available. Please do some other work to give the OS a chance to collect more entropy - Stack Overflow](http://stackoverflow.com/questions/11708334/pgp-asymmetric-not-enough-random-bytes-available-please-do-some-other-work-to)
Xojoで文字↔符号位置

# 文字→符号位置（スカラー値）

**注意**
String.Left(1)で先頭１文字を取得していますが、結合文字列・IVS・SVSの場合、基底文字だけが取得されます。

```vbnet

Function CharacterToCodepoint(s as String) As String

  ' 空ならやめる（空文字を返す）
  if s.LenB=0 then Return ""
  
  ' 先頭１文字を取得する
  s = s.Left(1)
  
  ' コードポイントに変換
  dim codepoint as string
  codepoint = Hex(Asc( s ))
  
  ' 整形する
  codepoint = "0000" + codepoint
  codepoint = codepoint.Right(5)
  if codepoint.Left(1)="0" then
    codepoint = codepoint.Right(4)
  end if
  
  Return codepoint
  
End Function
```


# 符号位置（スカラー値）→文字

```vbnet

Function CodepointToCharacter(Codepoint as string) As String
    
  dim character as string
    
  character = Encodings.UTF8.Chr( val("&h"+Codepoint) )
  
  return character

End Function
```
ErlangのGen_Fsm Behaviourを使った電卓


Erlangの練習に、Gen_Fsm Behaviourを使って電卓を作ってみました。
Fsmは有限ステートマシンです。

数字ボタンと＋ボタン、＝ボタンがある電卓をイメージしています。number, plus, equalというイベントを定義し、numberイベントには数字データが付属します。
状態は、waitとwait2を定義しています。waitは一つ目のデータを入力中で、wait2は二つ目のデータを入力中であるという状態です。

gen_fsmでは、まずinitコールバックで初期状態を返します。フォーマットは{ok, 状態名, 状態データ}です。

```
init(Memory1) ->
    {ok, wait, {Memory1, []}}.
```

そして状態名を名前とする関数を作ります。イベントが送られた際に、現在状態と同じ名前の関数が呼ばれます。

```
wait({イベント, パラメータ}, 状態データ) ->
    ..いろいろな処理
```

このいろいろな処理の中で、次に遷移する状態を返します。

    {next_state, 次の状態名, 状態データ}


イベントの送信にはsend_eventという関数があります。第１引数でfsmの名前を指定し、第２引数では{イベント名、パラメータ}を指定します。

    gen_fsm:send_event(名前, {イベント, パラメータ}).



ソース

```erlang
-module(cal).
-behaviour(gen_fsm).

-export([start_link/0, push_number/1, push_plus/0, push_equal/0]).
-export([init/1]).
-export([wait/2, wait2/2]).

start_link() ->
    gen_fsm:start_link({local, cal}, cal, [], []).

push_number(Digit) ->
    gen_fsm:send_event(cal, {number, Digit}).

push_plus() ->
    gen_fsm:send_event(cal, {plus, []}).

push_equal() ->
    gen_fsm:send_event(cal, {equal, []}).

init(Memory1) ->
    {ok, wait, {Memory1, []}}.

wait({Event, Digit}, {Memory1, Memory2}) ->
    case Event of
	number ->
		NewMemory = [Digit | Memory1],
	    io:format("~p~n", [lists:reverse(NewMemory)]),
	    {next_state, wait, {NewMemory, []}};
	plus ->
	    {next_state, wait2, {Memory1, Memory2}};
	equal ->
	    io:format("miss~n"),
	    {next_state, wait, {[], []}}
    end.

wait2({Event, Digit}, {Memory1, Memory2}) ->
    case Event of
	number ->
		NewMemory = [Digit | Memory2],
	    io:format("~p+~p~n", [lists:reverse(Memory1), lists:reverse(NewMemory)]),
	    {next_state, wait2, {Memory1, NewMemory}};
	plus ->
	    {next_state, wait2, {Memory1, Memory2}};
	equal ->
	    io:format("=~p~n",[ mem_to_num(Memory1) + mem_to_num(Memory2) ]),
	    {next_state, wait, {[], []}}
    end.

mem_to_num(M) ->
	{I, S} = lists:foldl(fun(X, {I, Sum}) -> {I * 10, X*I + Sum} end, {1, 0}, M),
	S.

```

実行結果

```
1> c(cal).
{ok,cal}
2> cal:start_link().
{ok,<0.39.0>}
3> cal:push_number(3).
[3]
ok
4> cal:push_number(8).
[3,8]
ok
5> cal:push_plus().   
ok
6> cal:push_number(2).
[3,8]+[2]
ok
7> cal:push_number(1).
[3,8]+[2,1]
ok
8> cal:push_equal().  
=59
ok
9> 
```
Bashスクリプトを便利にする

最近書いている [imosh](https://github.com/imos/imosh) の紹介です．

Bashはほとんどの環境でインストールされているので，プログラムを配布するときのインストーラー等の簡単なスクリプトとして使うのに非常に便利で，多くの場面で使われています．しかしながら，Bashは単体では不便な言語です．そこで [imosh](https://github.com/imos/imosh) を開発しています．

# 導入
[imosh本体](https://github.com/imos/imosh/blob/master/imosh)を開発中のスクリプトと同じディレクトリに配置します．以下が imosh を用いた最小のスクリプトです．

```sh
#!/bin/bash
source "$(dirname "${BASH_SOURCE}")"/imosh || exit 1
eval "${IMOSH_INIT}"
```

この時点でスクリプトを安全に書くのに便利な機能（未定義変数に対する参照の検出する機能，コマンドが異常終了した時にスタックトレースを表示し終了する機能）が追加されます．

# フラグの追加
imosh はスクリプトをフラグで制御可能にします．以下が例です．

```sh
#!/bin/bash
source "$(dirname "${BASH_SOURCE}")"/imosh || exit 1
DEFINE_bool bool_flag false 'Boolean flag.'
DEFINE_int int_flag 0 'Integer flag.'
DEFINE_string string_flag '' 'String flag.'
eval "${IMOSH_INIT}"

if (( FLAGS_bool_flag )); then
  echo 'bool_flag is true!'
fi

echo "int_flag is ${FLAGS_int_flag}!"
echo "string_flag is ${FLAGS_string_flag}!"
```

このようなプログラムはコマンドラインでは以下のように使えます．

```shell-session
$ myscript.sh --bool_flag --int_flag=12345 --string_flag=foo
```

# より詳しくは
imosh を使った [stelnet](https://github.com/imos/bin/blob/master/stelnet) 等のスクリプトが [bin](https://github.com/imos/bin) にあるので参考に．
ボーンのソケットを使ったプロップの接続と、物理演算を使用したニコニコ立体さんの髪の揺らし方

Unreal Engine 4 (UE4) Advent Calendar 2014の14日の記事です。

youtubeの動画リストはこちらになります。
https://www.youtube.com/watch?v=wEAnGyHIwtM&list=PL42VZspg9uttL8JCu4yOlZ_ZlavFfLxJn

各動画はこちら
【UE4】ボーンのソケットを使ったプロップの接続
http://www.youtube.com/watch?v=wEAnGyHIwtM
ボーンにソケットを作成して、プロップ（今回はヘッドセット）を接続する手順を動画にしています。


【UE4】ニコニコ立体さんの髪を物理で揺らすまで 
http://www.youtube.com/watch?v=pcGkL7swQn4
ニコニコ立体さんの髪を物理で揺らすまでを動画にしています。
申し訳ありませんが。
作成に時間があまりなく、誤字等あります。そして、無駄に長いです。

もう少し、詳細な解説は今度は短めに25日の記事で説明します。

明日15日は、inokさんの「UE4で展示コンテンツを作ったことについて」です。
たのしみですね。
Fiddlerでリクエストパラメータを改ざんする方法

#Fiddlerとは
HTTP(s)通信をキャプチャするプロキシ型ツール
IE,FireFox,Chromeで使える
プロキシポート8888を使う
Fiddlerを起動すると自動的にプロキシ設定してしまう

#Fiddlerのインストール
http://www.telerik.com/download/fiddler

#Fiddlerのメモ

**・クエリの書き換え**
リクエストを選択 > Inspectors > Row
Rules　>　Automatic Breakpoints　>　Before Requests
![1.png](https://qiita-image-store.s3.amazonaws.com/0/50308/bfd21236-8918-62fd-0066-29d8d6671174.png)
ブレークしたら、ブレークしたURLを選択して、クエリを書き換える（Rowタブ)
Run to Completionをクリック　または、　Goをクリック

**・リクエストパラメータの書き換え**
リクエストを選択 > Inspectors > WebForms
ブレークしたら、同様に書き換えてGo

**クエリの再実行**
同じリクエストをもう一度送る場合に使う
クエリを選択 > Reply > Reissue Request

**・その他**
ほかにもいろいろ機能があるので、以下を参考に
http://blog.loadlimits.info/2009/09/実はfiddlerがすごすぎたので、機能まとめ紹介/
http://blogs.msdn.com/b/osamum/archive/2013/07/01/fiddler-1-2.aspx
つながっていないサイトの通信をキャッシュに保存しておき、レスポンスを返す方法もある
http://troushoo.blog.fc2.com/blog-entry-201.html
Mac OS X Mavericksでrailsのbundle install時にnokogiriインストールエラー

## 環境
OS Version: OS X 10.9.5 Mavericks
Ruby Version: ruby 2.1.5p273
Rails Version: Rails 4.2.0

## どういう時にエラーになったか
    rails new hoge
    cd hoge
    bundle install --path vendor/bundle

すると下記のようなエラーが出た（抜粋）
    
    Fetching gem metadata from https://rubygems.org/.........
    Using json 1.8.1
    Installing i18n 0.7.0
    
    (中略)
    
    Installing activerecord 4.2.0
    Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    /Users/kytiken/.rbenv/versions/2.1.5/bin/ruby extconf.rb
    checking if the C compiler accepts ... yes
    checking if the C compiler accepts -Wno-error=unused-command-line-argument-hard-error-in-future... no
    Building nokogiri using packaged libraries.
    checking for iconv... no
    -----
    libiconv is missing.  Please locate mkmf.log to investigate how it is failing.
    -----
    *** extconf.rb failed ***
    Could not create Makefile due to some reason, probably lack of necessary
    libraries and/or headers.  Check the mkmf.log file for more details.  You may
    need configuration options.

    Provided configuration options:
    	--with-opt-dir
    	--without-opt-dir
    	--with-opt-include
    	--without-opt-include=${opt-dir}/include
    	--with-opt-lib
    	--without-opt-lib=${opt-dir}/lib
    	--with-make-prog
    	--without-make-prog
    	--srcdir=.
    	--curdir
    	--ruby=/Users/kytiken/.rbenv/versions/2.1.5/bin/ruby
    	--help
    	--clean
    	--use-system-libraries
    	--enable-static
    	--disable-static
    	--with-zlib-dir
    	--without-zlib-dir
    	--with-zlib-include
    	--without-zlib-include=${zlib-dir}/include
    	--with-zlib-lib
    	--without-zlib-lib=${zlib-dir}/lib
    	--enable-cross-build
     	--disable-cross-build

    extconf failed, exit code 1

    Gem files will remain installed in /Users/kytiken/hoge/vendor/bundle/ruby/2.1.0/gems/nokogiri-1.6.5 for inspection.
    Results logged to /Users/kytiken/hoge/vendor/bundle/ruby/2.1.0/extensions/x86_64-darwin-13/2.1.0-static/nokogiri-1.6.5/gem_make.out
    An error occurred while installing nokogiri (1.6.5), and Bundler cannot
    continue.
    Make sure that `gem install nokogiri -v '1.6.5'` succeeds before bundling.

## 対処法
1.libxml2 libxslt libiconvをインストール&リンク

    brew tap homebrew/dupes
    brew install libxml2 libxslt libiconv
    brew link --force libxml2 libxslt libiconv

2.bundle installするときのオプションを指定

    bundle config build.nokogiri --use-system-libraries --with-iconv-dir="$(brew --prefix libiconv)"

3.bundle install

    bundle install --path vendor/bundle

4.成功

    Installing nokogiri 1.6.5
    Installing rails-dom-testing 1.0.5
    Installing loofah 2.0.1
    Installing rails-html-sanitizer 1.0.1
    Installing actionview 4.2.0
    Installing actionpack 4.2.0
    Installing sprockets-rails 2.2.2
    Installing actionmailer 4.2.0
    Installing railties 4.2.0
    Installing sass-rails 5.0.0
    Installing coffee-rails 4.1.0
    Installing jquery-rails 4.0.2
    Installing turbolinks 2.5.3
    Installing rails 4.2.0
    Installing web-console 2.0.0
    Your bundle is complete!
    It was installed into ./vendor/bundle
以上
Chocolatey v0.9.8.28になってからエラーが出るぜ！

## Chocolatey v0.9.8.28
古いバージョンのChocolateyから新しいバージョンのChocolateyにアップデートすると以下のようなメッセージが表示されるのでその対応方法です。

> [https://chocolatey.org/](https://chocolatey.org/)

```
The default install location has been changed to 'C:\ProgramData\chocolatey'.
  This install will be updated to that location in the next version. It
  is strongly suggested you move this installation to the new location
  as soon as possible to limit write access from all users. Do not forget
  to update PATH & ChocolateyInstall environment variables.
```

いままで ```C:\chocolatey``` で管理されていたけど新しいバージョンでは ```C:\ProgramData\chocolatey``` になったからっていうメッセージなんだけどねｗ

## 対応方法
管理者権限でdos窓を開き下記のコマンドを実行します。

```
cd c:\
md ProgramData\chocolatey
xcopy /s /e c:\chocolatey\*.* ProgramData\chocolatey\.
rd chocolatey /s /q
```

## 環境変数の設定
すでに登録されているChocolateyの環境変数を修正（追加）します。
[コントロール パネル - システムとセキュリティ - システム - システムの詳細設定]を開きます。

![choco.png](https://qiita-image-store.s3.amazonaws.com/0/44540/d4ef1183-f931-1a37-c149-451c40fbe9dd.png)

変更点
　・ChocolateyInstall に、```C:\ProgramData\chocolatey```
　・Path に、```C:\ProgramData\chocolatey\bin```

設定変更後にdos窓を開きなおすか、ＰＣを再起動します。

## パッケージインストールしたソフトが動作しないんだけど
パッケージを再インストールすれば問題が解決します。```C:\ProgramData\chocolatey\lib``` したにある対象のプログラムディレクトリを削除して、再度 ```choco update hogehoge``` などすれば問題ありません（場合によっては、```choco install hogehoge```）

## 参考サイト
ってそのままだけどｗ

> [Migrate Old Chocolatey Directory to ProgramData](https://github.com/chocolatey/chocolatey/wiki/Migrate-Old-Chocolatey-Directory-to-ProgramData)
XojoでTextAreaのスマート引用符機能を無効にする

XojoでOSX用のデスクトップアプリをビルドすると、TextAreaクラスはNSTextViewになります。

NSTextViewには自動置換機能があり、その内訳はコンテクストメニューで確認できます。
![NSTextView_Substitusions.png](https://qiita-image-store.s3.amazonaws.com/0/27806/0a90d73a-a2c7-424e-bd42-529fa37cf502.png)

アプリによっては、この機能で勝手に文字を変えられると困る場合があります。とくに「スマート引用符」は、ASCII引用符を手入力すると、起こしと受けを区別したものへ自動的に変えられます。
![2014-12-21-1.png](https://qiita-image-store.s3.amazonaws.com/0/27806/6761bc5f-6376-f8f4-a94a-b9ff4b118f98.png)
これらを厳密に区別してTextAreaに入力するなら、この機能を最初からOFFにしておきたいところです。ユーザ側のシステム環境設定で設定は可能ですが、やはりアプリ側でデフォルトをOFFにしておきたい。

XojoのTextAreaクラスには、このプロパティがないので、Objective-CのコードをDeclareで実装することになります。

```vbnet:
' TextAreaのOpenイベントに直接書いた場合
Declare Function documentView Lib "Cocoa" selector "documentView" (objRef as Integer) as Ptr
Declare Sub setAutomaticQuoteSubstitutionEnabled Lib "Cocoa" selector "setAutomaticQuoteSubstitutionEnabled:" (objRef as Ptr, value as Boolean)

Dim TextViewRef as Ptr = documentView( me.Handle )

setAutomaticQuoteSubstitutionEnabled( TextViewRef, False )
```

他の自動置換やお節介機能も上記と同様にすれば無効にできます。

* setAutomaticDashSubstitutionEnabled
* setAutomaticSpellingCorrectionEnabled
* setAutomaticTextReplacementEnabled
* setContinuousSpellCheckingEnabled
* setSmartInsertDeleteEnabled
Railsで非同期処理を行える「Sidekiq」

## Sidekiqとは？

Sidekiqは、resqueやdelayed_jobなどのような非同期処理を行いたい時に使うライブラリです。複数のジョブを同時に実行することにより、メモリを節約すること可能です。

## 公式リポジトリ

![side.png](https://qiita-image-store.s3.amazonaws.com/0/36485/ae55e215-c388-a32c-faf5-da2453c291c1.png)

[sidekiq](https://github.com/mperham/sidekiq)

## redisをインストール

Sidekiq には、Redisがバックグラウンド（ジョブ管理）に必要なのでインストールしておきます。

```
# Homebrewを利用してインストール（Mac）
$ brew install redis 
# yumでインストール（CentOS）
$ yum install redis 
```
redisのインストールはこの辺り記事を参考にしてみてください。

→ [redisサーバー構築メモ](http://konboi.hatenablog.com/entry/2013/03/05/155107)
→ [MacにRedisをインストールする](http://qiita.com/checkpoint/items/58b9b0193c0c46400eeb)


## Sidekiq をインストール

```ruby:Gemfile
gem 'sidekiq'
gem 'sinatra', require: false # ダッシュボードを利用するため
```
```
$ bundle install --path vendor/bundle
```

で gem をインストールします。

起動時の設定

```ruby:config/initializers/sidekiq.rb

Sidekiq.configure_server do |config|
    config.redis = { url: 'redis://localhost:6379', namespace: 'test_sidekiq' }
end

Sidekiq.configure_client do |config|
    config.redis = { url: 'redis://localhost:6379', namespace: 'test_sidekiq' }
end

```
サーバー側とクライアント側の2種類の設定を追記します。


## セットアップ

```ruby:config/sidekiq.yml
:verbose: false
:pidfile: ./tmp/pids/sidekiq.pid
:logfile: ./log/sidekiq.log
:concurrency: 10
:queues:
  - default
  - test
```

## Worker を実装

```ruby:app/workers/test_worker.rb
class TestWorker < ApplicationController
  include Sidekiq::Worker
  sidekiq_options queue: :test, retry: 5

  def perform(title)
    p 'work: title=' + title
  end

end

```

sidekiq_options の queue に default 以外に名前をつけることもできて、今回は test という名前を付与しました。何も書かないと default が名前になります。

リトライさせたくない場合は、retry: false と記述します。非同期処理のクラスは Sidekiq::Worker を include して作成。 perform の中に非同期で行いたい処理を書きました。

## 呼び出す

```ruby:app/controllers/home_controller.rb
def show
  TestWorker.perform_async('美味礼賛')
end
```

コントローラ側に記述しました。

## 起動コマンド

config 以下に書いた、設定ファイルを読み込んで起動させます。

```
$ bundle exec sidekiq -C config/sidekiq.yml
```

バックグラウンドで動かす際はこちら。

```
$ bundle exec sidekiq -C config/sidekiq.yml -d
```

Sidekiq 起動して、バックグラウンドで動かします。5回連続でアクセスしてみる...

![bimi.png](https://qiita-image-store.s3.amazonaws.com/0/36485/4fe71a7d-fffd-d156-a01d-266438031bce.png)

動いてますね。

##  管理画面

```ruby:config/routes.rb
   require 'sidekiq/web'
   mount Sidekiq::Web, at: "/sidekiq"
```

管理画面を作成するためにmountします。http://localhost:3000/sidekiq にアクセスすると...

![sidekiq_mount.png](https://qiita-image-store.s3.amazonaws.com/0/36485/2a1d3ea5-a0d7-a78f-08cd-7db15eb96f38.png)

## デプロイ

capistranoを使用している場合は、デプロイ時に Sidekiq がロードしているコードが更新されないため、下記の設定を追記して、デプロイと同時に再起動されるように設定します。

```ruby:config/Capfile
require 'capistrano/sidekiq'
```

```ruby:config/deploy.rb
set :sidekiq_role, :web
```

細かい設定は [Sidekiq wiki](https://github.com/mperham/sidekiq/wiki) をご覧下さい。
ナップサック問題 #Ruby

## ナップサック問題

重さと価値がそれぞれwi,viであるようなn個の品物があります。
これらの品物から、重さの総和がWを超えないように選んだ時の価値の総和の
最大値を求めなさい。

```rb

#再帰呼び出し

N = 4
ARRAY = [ [2, 3], [1, 2], [3, 4], [2, 2] ]
ARRAY_W = [ 2, 1, 3, 2 ]
ARRAY_V = [ 3, 2, 4, 2 ]
W = 5

def rec(i, j)
  res = 0
  if i == N
    # もう品物は残っていない
    res = 0
  elsif j < ARRAY_W[i]
    #この品物は入らない
    res = rec(i + 1, j)
  else
    #入れない場合と入れる場合の両方を試す
    res = [ rec(i + 1, j), rec(i + 1, j - ARRAY_W[i]) + ARRAY_V[i] ].max
  end
  res
end

puts "#{rec(0, W)}"

```


```rb

#再帰呼び出し(メモ化)


def rec_memo(i, j, memo_arr)
  if memo_arr[i][j] >= 0
    memo_arr[i][j]
  end

  if i == N
    res = 0
  elsif j < ARRAY_W[i]
    res = rec_memo(i + 1, j, memo_arr)
  else # ARRAY_W[i] < j
    res = [ rec_memo(i + 1, j, memo_arr), rec_memo(i + 1, j - ARRAY_W[i], memo_arr) + ARRAY_V[i] ].max
  end
  memo_arr[i][j] = res
end

memo_arr = Array.new(W + 1, Array.new(W + 1, -1))

p "#{rec_memo(0, W, memo_arr)}"

```

```rb
#動的計画法

N = gets.to_i
W = gets.to_i

arr_w = []
arr_v = []

N.times do |i|
  key, value = gets.split(" ").map(&:to_i)
  arr_w << key
  arr_v << value
end

max_cost = 0
dp = Hash.new
dp[0] = 0

N.times do |ind|
  dp_tmp = dp.clone

  dp.each do |key, value|
    total_key = key + arr_w[ind]
    total_value = value + arr_v[ind]

    unless dp_tmp.has_key?(total_key)
      dp_tmp[total_key] = total_value
    end

    if W >= total_key && total_value > max_cost
      max_cost = total_value
    end
  end

  dp = dp_tmp
end

p max_cost

```
Android Wear側のアプリが動いていない状態でデータ同期


http://developer.android.com/samples/DataLayer/index.html

DataLayerのイベントを受け取るには、イベントのリスナを実装したActivityか、WearableListenerServiceを継承したServiceを作ればOK。

リスナを実装したActivityだとActivityが死んだらデータ同期が出来ないので、Handheld側で設定した値をWear側に送るとかがいい感じに出来ない。

WearableListenerServiceを継承したServiceを使うとうまくいく。
rippleのコールドウォレット用のアドレスを作る

# はじめに

コールドウォレットは普段はネットワークから切り離すことで攻撃者から物理的にアクセスできなくしリスクを出来るだけ下げる事を言う
一般的に秘密鍵だけの存在にしておき、その情報を知るコンピュータはネットワークに接続しないことでセキュリティを担保する
秘密鍵の入ったコンピュータはオペレーションが必要なときにだけネットワークに接続する

rippleの公式ページから作ったアカウントはrippleのホームページを通して作られるためIDとPASSWORDが存在する
そのため二段階認証などが存在しネットワークに繋がった状態に近い

rippleの公式ページを介さないでプログラムから生成する方法がある

## REST-APIを経由して作る

REST-APIを経由して作成するには以下のエンドポイントを使う

```
https://api.ripple.com/v1/wallet/new
```

このAPIをHTTPS経由で叩くとwallet addressとsecret keyが生成される
HTTPSを利用しているがネットワークを通して生成なので安全度は下がる


## ripple-libを使って生成する

ripple-libで生成する場合はネットワークに接続せずにウォレットを作ることができる

```
var rippleLib = require('ripple-lib');
var wallet = rippleLib.Wallet;
var w = wallet.generate();
console.log(w)
```

リザルト

```
{ 
    address: 'r3sBHwjwAb6eFpHbCEbJmhC8scmDeqXZyZ',
    secret: 'snovmDoPbb5Y14JVA5wxtBtPgHNaP' 
}
```

※2015/01/07追記
ネットワークに接続してrippledから乱数生成に使うエントロピーを受け取ったほうが良いと公式に書いてありました
https://github.com/ripple/ripple-lib/blob/develop/docs/GUIDES.md#generating-a-new-ripple-wallet

## ダウンロード版クライアントで生成する

以下のURLからクライアントをダウンロードする

https://download.ripple.com/

起動後、新規アカウント作成→空のアカウントから作成を選択する

ダウンロード版クライアントからの生成は内部でripple-libを使用しているのでネットワークへの接続はなく安全である。

※ダウンロード版クライアントの注意点としては執筆時点現在、手数料設定が出来ないのでコールドウォレットからの送金がエラーとなります。直るまで資金が動かせないので気をつけてください。
資金を動かす必要がある場合、rippletrade.comに秘密鍵をインポートしてアカウントを開く必要があります。

※2015/01/13追記
Settings->AdvancedからNetwork SettingsにてFeeの設定ができるようになりました
問題なく資金の移動ができるようになってます

## rippletrade.comのホットウォレットをコールドウォレットにする

ログイン後、設定からDelete Ripple Trade accountでアカウントを削除する
その時点でネットワーク上からアクセスできなくなりコールドウォレットとなります。
秘密鍵自体は必ず削除前にメモしておかないと永久にアクセスできなくなります。

一度ネットワークにさらされているので安全度は少し下がります。

## コールドウォレット共通点

アドレスは生成時点では計算上生成されただけなので、まだレジャーに登録されていない。
他から有効なアカウントとして認識されるためには準備金として20xrp以上送金し、アクティベートしておく。
アクティベートされれば各種ツールやAPIにてアカウントの存在を確認することができる

このアカウントで送金したりIOUを発行する場合はAPIやripple-lib、またはダウンロード版クライアントを通したアクセスになる

## コールドウォレットから送金する

現状、ダウンロード版ウォレットの不具合でコールドウォレットにすると送金する手段がないので緊急の場合は拙作のコマンドツールから送金できます

https://github.com/you21979/node-ripple-trade-helper/tree/master/tool/cmdtrade

withdraw.jsにて送金可能

※2015/01/13追記
Settings->AdvancedからNetwork SettingsにてFeeの設定ができるようになりました
問題なく資金の移動ができるようになってます
vvvvをBootCampさせてMacで使おう！！

#はじめに
vvvvは、Windowsでしか起動できないのですが、
Macユーザーで使いたい方も多いと思います。

僕もMacでvvvvを触ってるので、
参考になればと思います。

#必要なもの
・USBメモリ(8GB以上、USB3.0がオススメ)
・Windowsインストールディスク
・DVDドライブ(MBA,MBPに付いていない場合)

#手順
1.isoファイルの作成
2.BootCampアシスタントにて、パーテーションの作成
3.Windowsのインストール、オーソライズ


#1.isoファイルの作成
①WindowsのOSのディスクをいれる
②アプリケーショ>__ディスクユーティリティー__を起動
③ディスクユーティリティーにて、WindowsのOSディスクを選択し、
　メニューバーの新規イメージの作成
![スクリーンショット 2014-12-21 8.56.44.png](https://qiita-image-store.s3.amazonaws.com/0/37495/3c5fec68-4052-83a4-a43a-c96ca6ce1ebb.png)


　イメージフォーマットを__「DVD/CDマスター」__に変更し、保存。
![スクリーンショット 2014-12-21 8.58.32.png](https://qiita-image-store.s3.amazonaws.com/0/37495/fe51c76f-2bab-ad8e-650b-da5f56e37d70.png)

　名前は何でも良いですが「Windows8_64bit」とかにしてみました
![スクリーンショット 2014-12-21 8.59.26.png](https://qiita-image-store.s3.amazonaws.com/0/37495/6f656a4f-ddce-8cf7-acff-1e1fe4faec85.png)



④出来上がったファイルの拡張子が、__「.cdr」なので「.iso」__に変更

![スクリーンショット 2014-12-21 9.01.53.png](https://qiita-image-store.s3.amazonaws.com/0/37495/27b9173a-672f-11d1-e844-351e67cadc9d.png)


⑤準備してあるUSBファイルにうつします


#2.BootCampアシスタント
①アプリケーション>__BootCampアシスタント__
②最新のソフトウェア…、Windows7以降の…の２項目にチェックを入れる
　（一番上の項目は既にISOデータを作ったので満たしてます）

![スクリーンショット 2014-12-21 9.06.31.png](https://qiita-image-store.s3.amazonaws.com/0/37495/2de4ac3d-1abf-7182-f730-b4f31165c641.png)



③上記インストールなどが完了したら、__パーテーションの作成__
　「インストール」ボタンをクリック
④終了後__再起動__されます

#3.Windowsのインストール、オーソライズ
①再起動後の起動時にキーボードの__「alt」__キーをずっと押しててください
　MacintoshHD,Windowsと選択できる画面に移行するので、Windowsを選択
②あとは、入力項目、シリアルを流れにそって入れていってくださいｗ
③そのまま進むとフォーマットの部分でつまづくので、
　BOOTCAMPというパーテーション部分をフォーマットと選択し、先に進みましょう
④何度か再起動され、設定が完了します。

#4.マウスとキーボードの調整
最後にマウスとキーボードの設定をします。
この辺のツールを使って、色々微調整します。
__・トラックパッド__
__・マウスのスクロール__
__・キーボード__（かな英数変換の設定、必要な人はファンクションキー）
以下のURLとかに色々書いてます。ググってもいくらでもでます。
http://matome.naver.jp/odai/2135640304586126001
このくらいやれば良いでしょう。


#初回BOOT時の振り返り
__・ISOデータがうまく作成できなかった__
→完全にミスですが、ディスクを選択せずにずっと作成してましたｗ

__・32bitか64bitか迷いに迷った__
→実際どちらでも良いのですが、vvvvのことだけ考えると64bit上でも32bitのvvvvを動かせるのでどっちでもいいという結論に落ち着きました。あとは、最近少ないみたいですが32bit上でしか動かないソフトウェアなどもあるので、よくつかうソフトなどがあればチェックした方が良いかもしれません

__・パーテーションの割合について__
→初回はとりあえず半々にしました。2台目BOOTさせるときは限界までWindowsによせちゃいました。もはやWindowsを買えというｗ

__・仮想OSについて__
→仮想OSでも問題なく動くようですが、ものによっては動かない事も…動くかどうかは、公式のフォーラムやTwitterで聞いてみてもよいかもしれません。




困った事とかあったら、Twitterでも連絡くださいー！
Twitter:Junky_Inc
shinyapps.io のアプリを収集する #rstatsj

※Shiny アプリを収集してツイートする Twitter Bot 作りました 
https://twitter.com/ShinyappsRecent

shinyapps.io で公開されている Shiny アプリを収集しようと思って、rvest で Google の検索結果をクローリングしようとしたら、403 Forbidden が出てしまいます。
仕方がないので Custom Search API を使って収集してみました。
ただし、API 制限が強いので 100 件しか集められなった。

```r:R
library(dplyr)
library(jsonlite)
library(stringr)

start_seq <- seq(1, 100, by = 10)

cx <- "012116360379294605888:vh3a8gftaj4"
key <- {YOUR_API_KEY}

result <- data.frame()
for(start in start_seq) {
  cat(start, "/ 100\n")
  url <- sprintf("https://www.googleapis.com/customsearch/v1?q=shiny&start=%d&cx=%s&key=%s", start, cx, key)
  
  json <- fromJSON(url)
  Sys.sleep(1)
  
  result <- rbind(result, data.frame(title=json$items$title, link=json$items$link))
}

result <- result %>% mutate(user=result$link %>% str_split("(\\/|\\.)") %>% Map(function(x) x[3], .) %>% unlist)

write.csv(result, "shinyapps_sites.csv", row.names=FALSE)
```

結果のファイルは[こちら](https://dl.dropboxusercontent.com/u/432512/20141221_shinyapps_sites/shinyapps_sites.csv)です。

### 追記

`url` に `sort=date` を付けて新しい順で検索した結果を追加

結果のファイルは[こちら](https://dl.dropboxusercontent.com/u/432512/20141221_shinyapps_sites/shinyapps_sites_all.csv)です。
AndroidStudioに環境変数を渡す

Retrolambdaの設定とかで環境変数から参照する例が沢山あるけど、具体的なやりかたについてです。Macでの話。

## 問題となる設定

build.gradleのこんなやつです。

```groovy
retrolambda {
    jdk System.getenv("JAVA8_HOME")
    oldJdk System.getenv("JAVA7_HOME")
    javaVersion JavaVersion.VERSION_1_7
}
```
[android-best-practice](https://github.com/futurice/android-best-practices)にも載ってますね。
環境変数のJAVA7_HOMEとJAVA8_HOMEを参照しています。
しかしこのまま貼り付けてAndroid Studioを起動しビルドしようとすると

```
Error:Execution failed for task ':lib:patchAndroidJar'.
> Retrolambda: null/jre/lib/rt.jar does not exist, make sure that the environment variable JAVA_HOME or JAVA8_HOME, or the gradle property retrolambda.jdk points to a valid version of java8.
```

というエラーに遭遇します。
JAVA8_HOMEなどの環境変数が読めずにnullと解釈し、結果期待するpathが取得できてないために起こるエラーっぽいですね。
定義を見るとJAVA7_HOMEも必要そうです。

retrolambda.jdkにpathを直接指定しても行けそうですが、環境依存になるのもんなんだかなあ、ということで環境変数を参照する解決方法を探しました。

## ターミナルから起動

JAVA7_HOMEとJAVA8_HOMEが環境変数として定義された状態で、

```bash
open -a Android\ Studio
```

でとりあえずは渡せますが、Alfred等を普段から使っているとこれもだるい。
ということで他の方法を検討します。


## lanunchctlを使う

Android Studioに限らずMacのアプリケーションは環境変数を指定できます。

### 定義

僕の場合はjenvを使っているのでこんな感じです。

```bash
launchctl setenv JAVA_HOME /Users/tmiyamon/.jenv/versions/1.7
launchctl setenv JAVA7_HOME /Users/tmiyamon/.jenv/versions/1.7
launchctl setenv JAVA8_HOME /Users/tmiyamon/.jenv/versions/1.8
```

### 確認

```
launchctl getenv JAVA_HOME
launchctl getenv JAVA7_HOME
launchctl getenv JAVA8_HOME
```

これでAlfredから起動した時もちゃんと参照してくれます。
tmuxを使っているときは一度tmuxからexitしてから定義してやる必要があります。

### 削除

削除したいときは

```
launchctl unsetenv JAVA_HOME
launchctl unsetenv JAVA7_HOME
launchctl unsetenv JAVA8_HOME
```

## まとめ

```bash
launchctl setenv JAVA7_HOME path
launchctl setenv JAVA8_HOME path
```
ChromebookでNCSA Mosaicを動かすのに必要だったこと

# はじめに

ChromebookのC720/2を買いました。
Chrome OSを予習していないので、あれこれいじってます。
今回は、歴史的なブラウザーをChromebookで動かそうという試みです。

# 必要なもの

## ハード編

- Chromebook
- Dockerを動かせるPC
 
## ソフト編

### NCSA Mosaicが入ったコンテナ

Dockerを動かせるPCで以下を実施

```
git clone https://github.com/kjunichi/docker-mosaic.git
cd docker-mosaic
docker build -t kjunichi/mosaic .
docker run -p 6080:6080 -d kjunichi/mosaic /startup.sh
```

### boot2dockerを外からアクセス可能にする

```
VBoxManage controlvm boot2docker-vm natpf1 "vnc,tcp,0.0.0.0,6080,,6080"
```

# MosaicをChromebookで動かす

Chromebookで以下のURLにアクセス。

```
http://Dockerを動かしているPCのIPアドレス:6080/vnc.html
```

パスワードは1234

# NAT設定を消すには

```
VBoxManage modifyvm -boot2docker-vm natpf1 delete vnc
```

# あとがき

はじめは6080ではなく、80番ポートをNATしようとしていたが、
多分VirtualBoxは非ルート権限で動いているので、ダメなのだという理解。

- http://www.w3.org/MarkUp/html-spec/

ならば、Mosaicでも表示できることを確認済み。

# Link

- https://www.youtube.com/watch?v=WHS7BZf3Pc8
- [VirtualBoxでポートフォワーディングの設定をコマンドラインから追加、削除、表示 - Qiita](http://qiita.com/hnakamur/items/3640825cf2c5d2d4a52a)
CakePHP のソースコードのレビュー結果を共有してみる

[CakePHP Advent Calendar 2014](http://qiita.com/advent-calendar/2014/cakephp) の21日目として書いています。

昨日は [論理削除機能の変遷とYasd Plugin for CakePHP](http://qiita.com/k1LoW/items/3b0a34353961e5040fbd) でソフトデリートを簡単に実現できるプラグインのお話でしたね。

今日は、最近、CakePHP初心者が書いたソースコードをレビューする機会があったのですが、その結果をいくつか共有してみようと思います。

# 1. `Hash::combine()` で連想配列作る方が簡単

```php:修正前
//[ id => name ] のマップを作成する
$map = [];
$data = $this->User->find('all');
foreach ($data as $d) {
    $map[$d['User']['id']] = $d['User']['name'];
}
```

```php:修正後
$map = Hash::combine($dataList, '{n}.User.id', '{n}.User.name');
```

参考: [CakePHPマニュアル Hash](http://book.cakephp.org/2.0/ja/core-utility-libraries/hash.html)



# 2. `inputDefaults` で Form のデフォルト指定

```php:修正前
<?= $this->Form->create('User') ?>
<?= $this->Form->input('name', [
    'type'    => 'text',
    'div'     => false,
    'label'   => false
]) ?>
```

```php:修正後
<?= $this->Form->create('User', [
    'inputDefaults' => [
        'div' => false,
        'label' => false,
    ]
]) ?>
<?= $this->Form->input('name', [
    'type' => 'text',
]) ?>
```

`$this->Form->text()` 等を使ってしまうと `inputDefaults` は適用されないので注意してください。

参考: [CakePHPマニュアル FormHelper](http://book.cakephp.org/2.0/ja/core-libraries/helpers/form.html)


# 3. 複雑な Update なら `updateAll()` で

```php:修正前
$data = $this->User->find('first', ['conditions' => ['id' => $id, 'status' => '1']]);
// 存在している場合はステータスを更新する
if (!empty($data)) {
    // 主キーセット
    $this->User->set([
        'id'     => $id,
        'status' => '9',
    ]);
    // 更新処理
    $this->User->save();
} // 存在しなければなにもしない
```

単純なモデルの更新でないので、`save()` を使ってますが、却って複雑になっています。

```php:修正後
/** @var DboSource $db */
$db = $this->User->getDataSource();
$this->User->updateAll([
    $this->User->escapeField('status') => $db->value(9), //配信待ち
], [
    'id'     => $id,
    'status' => '1',
]);
```

このほうが可読性が高いです。
値が自動でエスケープされないことに気をつけてください。
自動でエスケープされないので下記のようにすればSQL独自の関数を指定することもできます。 

```php:SQL独自の関数を使ってみる
$this->User->escapeField('status') => "now()",
```

# 4. `$this->request->data` でデータを復帰させる

```php:修正前
<?= $this->Form->text('name', [
  'value' => (isset($data['Hoge']['name']) ? $data['Hoge']['name'] : ''),
]) ?>
```

```php:修正後
//Controller で
$this->request->data['Hoge'] = ['name' => 'あああ'];
//View で
<?= $this->Form->text('Hoge.name') ?>
```

`$this->request->data` に値をセットしておくことで、POST だったかどうかにかかわらず、値を復帰させることができます。
自前で復帰させるロジックを書くよりも、CakePHPに任せた方が確実ですし、CakePHPに任せれば、ラジオボタンやチェックボックスなどの場合にも簡単に値を復帰させられます。


# 5. `$this->Form->error()` でエラーを違う場所に

```php:修正前
//Controller で
if (isset($this->Hoge->validationErrors['name'])) {
    $this->set('name_error', $this->Hoge->validationErrors['name']['0']);
}
//view　で
<? if (isset($name_error)) { ?>
  <div class="error"><?= h($name_error) ?></div>
<? } ?>
<?= $this->Form->input('name', ['type' => 'text', 'error' => false]) ?>
```

```php:修正後
//Controller での set は不要
//View で
<?= $this->Form->error('name', null, ['class' => 'error']) ?>
<?= $this->Form->input('name', ['type' => 'text', 'error' => false]) ?>
```


今日は、この辺で。

明日は、hamaco さんが12月らしいネタをということですが、どんなネタなんでしょうね。楽しみです。
Facebook認証でログインできるサービス開発の流れ

Railsのアプリケーションから、FacebookやTwitterなどの別サービスでユーザ認証を行えるようにまでの概要と流れをまとめておきます。

実際の開発では、こちらがとてもわかりやすくまとまっています。
http://qiita.com/ytkt/items/d78841f7dea5e29f38ee
http://qiita.com/mosa_siru/items/9f1faa509f4d3653a1b2
http://qiita.com/kami30k/items/94aec2d94a2b4e9a1d0b

#必要となるGem
Railsアプリからサードパーティを使ったログイン認証を行うには、基本的に以下２つのGemが必要になるようです。

##Devise
Railsで最も人気なユーザ登録、ログインなどのなどの認証管理機能を提供しているGem。

##OmniAuth
Facebook、Twitterなどの別サービスが行っているログイン認証を自分のRailsのアプリケーションに統合できるようになるGem。

#作業の流れ

①Deviseの準備
②OmniAuthの準備
③Facebookでアプリケーションの作成
④FacebookのAPI KEY,App ID,App Secretを取得
⑤上記の設定

最終的には、
・ランディングページなどからリンクをクリックすると、OAuthを利用してログインできるようになる。
・ログインしなければ見れないページがある。

といったところを実現したいと思います。
始めてSlimを触ってみた

Slimを始めて触ってみたので、少し所感を纏めておきたいと思います。
Slimは、Railsのテンプレートでサポートされているマークアップ言語です。

拡張子は、.slimです。通常では、.erb拡張子のものが、slimで書くと、.slimになります。
似たものに、Hamlがありますが、それよりもシンプルに短く書くことが出来るようです。

ですが、インデントやスペース一つで、Syntaxエラーに繋がるので書き方には、多少の慣れ必要そうです。SublimeTextなどのエディタでは、予測変換やSyntaxハイライトはできないので、Middlemanなどの開発支援ツールを入れると開発が楽になりそうですね。

また、SlimをHtmlに変換してくれるhtml2slimというGemも公開されています。まれに変換エラーが出てしまうようです。

Slimを書くならば、
・構文の基礎は理解する
・MiddlemanなどのRailsの開発支援ツールを利用する

などが有効かなという所感です。
ちなみに、Slim内に部分的にhtml要素で書いたのですが、現在、デザイン崩れなく動いているようですので共存性があるようです。

何かSlimを書く際におすすめのツールがあればぜひ教えてください。
Spring Data MongoDBの設定でnew Mongo()が非推奨と怒られる

# 概要
Spring Data MongoDBのJavaConfigをサンプル通りに記述すると、`new Mongo()`が非推奨と警告が表示される問題を解決する。


# 解決方法
## サンプルの記述
サンプルの記述では以下の通りとなっている

```SampleJavaConfig
@Configuration
class SampleMongoConfiguration extends AbstractMongoConfiguration {

  @Override
  protected String getDatabaseName() {
    return "database";
  }

  @Override
  public Mongo mongo() throws Exception {
    return new Mongo(); // deprecated!!
  }
}
```

## 解決
deprecateを解決したJavaConfig

```FixedJavaConfig
@Configuration
class SampleMongoConfiguration extends AbstractMongoConfiguration {

  @Override
  protected String getDatabaseName() {
    return "database";
  }

  @Override
  public MongoClient mongo() throws Exception {
    return new MongoClient(); // fixed
  }
}
```

## まとめ
MongoをMongoClientに変更すると非推奨である状態を解決でき、動作も問題ない。

だがAbstractMongoConfigurationは型がMongoとなっているし、この修正方法も正しいものであると担保できるドキュメントを見つけていないので書いておきながら、これをアテにしていいかは微妙なところ…
（以下のドキュメントを見てJavaも同じように変更が加えられているんだろうなぁと思いやってみたら解決しただけ…）

[FuelPHP 1.7でMongo_Db::__construct()の挙動が変わった](http://qiita.com/jun_ya/items/6714752287d5aa845f08 "FuelPHP 1.7でMongo_Db::__construct()の挙動が変わった")
5374.jpのCSVファイルローカライズについて

※本投稿、12月20日には間に合いませんでした（日本時間では）。滑り込みで投稿します。

#はじめに

Code for Kanazawaの5374.jpを、他の地域にローカライズする際のCSVファイルの関係について少しまとめてみます。
私自身、始めたばかりの初心者なので、そういった目線で書いています。

実は半分自分が忘れた時のメモです。
今後5374.jpをローカライズする他の方がデータ作成の感触を最初につかむのにお役に立てればと思います。
（間違えている点などがあれば、詳しい方に指摘やアドバイスを頂けると助かります。）

文章は苦手なので、ここから先はざっくり図でいきます。

#画面と各種ファイルの関連

ファイルの説明は「LOCALIZE.md」に書かれていますが、「area_days.csv」、「description.csv」、「target.csv」の３つのファイルをどう編集すると、どのように画面に反映されるのかまとめてみます。
※図が小さくて字が読めなかったらすいません。

##「area_days.csv」と「description.csv」

こんな感じかと思います。
![20141220-01.png](https://qiita-image-store.s3.amazonaws.com/0/58826/f05afd3b-2bfd-6bd0-77e6-b3726c9d82db.png)

**area_days.csv**
３カラム目以降をゴミの種類の数だけ並べていきます。
サンプルは３種類だった場合です。（オリジナルは４種類です）
町名や町内会などの収集エリア毎に１行ずつ記述していきます。CSVやEXCEL形式等で元データがない場合は、PDFなどから手入力でコツコツ作成です。

**descriptiuon.csv**
ごみの種類ごとの画面の背景色や表示文字の定義です。
表示文字（画面では"ゴミ種類１"等）を変更する場合は、
SVGファイルを用意して、そのファイル名を指定
　または
**js/setting.js**を編集して「var SVGLabel = false;」とすると「description.csv」の１列目の値が使用されるみたいです。

##「target.csv」

こんな感じかと思います。
![20141220-02.png](https://qiita-image-store.s3.amazonaws.com/0/58826/c67f4347-25c2-cbc9-dc34-633c04d9c5cf.png)

こちらは具体的なゴミの品目と補足説明になります。元データがない場合はコツコツ入力です。

##「remarks.csv」と「center.csv」
こちらはまだ手が回っていないので、書けることがありません。


#さいごに
かなり中途半端な内容ですが、以上です。

いきなり全てのデータを作らずに「area_days.csv」、「description.csv」、「target.csv」の３ファイルに、つじつまが合うようなサンプルデータを2,3件入れて、どんな感じで表示されるか体感すると良いかなと思いました。

最後になりますが、2014年12月の5374.jpハッカソンで色々私に教えて頂いたメンターの皆様、どうもありがとうございました。
cocos2d::Vector の初期化時に要素の追加もしちゃう、ちょっとした魔改造

注意 : **Visual Studio 2012 を使うプロジェクトでは使えません。2013 以降をお使いください。**

`cocos2d::Vector` って `pushBack` したりすると勝手に `retain` や `release` を呼んでくれて便利ですよね。
(そもそも `retain` や `release` をさせるメモリ管理が鬱陶しいというのは置いておいて。)
そんな `cocos2d::Vector` の生成をちょっと便利にしちゃう魔改造をご紹介します。

材料はいたってシンプル。
`cocos2d/cocos/base/CCVector.h` だけを調理します。

まずは最初に必要な物を読み込んじゃいましょう。

```cpp:CCVector.h
// ...

#include <functional>
#include <algorithm> // for std::find

// 追加する行
#include <initializer_list>

NS_CC_BEGIN
// ...
```

必要な材料が準備できたらあとはコンストラクタを用意するだけです。
こんな感じに。

```cpp:CCVector.h
// ...
    /** Constructor with initializer_list */
    Vector<T>(std::initializer_list<T> list)
    : _data(list)
    {
        static_assert(std::is_convertible<T, Ref*>::value, "Invalid Type for cocos2d::Vector<T>!");
        addRefForAllObjects();
    }
// ...
```

これで準備は整いました。早速使ってみましょう。
例えば、配列っぽく `SpriteFrame` を保持しておきたいならこんな風にできます。

```cpp
auto *cache = cocos2d::SpriteFrameCache::getInstance();

cocos2d::Vector<cocos2d::SpriteFrame*> frame{
    cache->getSpriteFrameByName("foo"),
    cache->getSpriteFrameByName("bar"),
    cache->getSpriteFrameByName("buz"),
    // ...
};

mySprite->setSpriteFrame(frame.at(0));
```

まるで配列の初期化をするように `cocos2d::Vector` の初期値を設定できましたね。
魔改造に抵抗がある方、これを機に少し cocos2d-x に手を加えて
あなただけの cocos2d-x を作ってみるのもまた面白いと思いますよ。

それでは良い魔改造ライフを。



P.S. MSVC2012 が initializer_list に対応していなくて PR 弾かれちゃったので、Qiita初投稿ネタに使った記事でした。
Firmataを使ってArduinoをPCのGPIOにしちゃう

#PCにもGPIOがほしい

Arduinoなんかを使えば入出力することは出来るけど、たとえばネットワークから取得したデータをアレするとか、センサーから取得したデータをDBにアレするとか言う場合、Arduinoではちょっと非力だ。モジュールを追加すればネットワークとかに接続できるけどお金が余計にかかるし、面倒臭さはどんどこ増えていく。
RaspberryPiとかBeagleBoneはそれらの問題に対しての完璧な回答なのだけど、PCと接続したままでも問題なくて、今現在Arduinoしか持ってないとかいうならFirmataを使うとPCから好きなように入出力ができるようになる。RaspberryPiとかと違ってOS入れたり環境構築したりする必要もない。

#Firmataってなに？　どうやって使うの？

FirmataはArduinoを接続しているPCなどから制御するためのプロトコル。使うためにはArduinoにFirmataのソフトウェアを書き込み、PC側にもFirmataが利用できるライブラリなどを導入する必要がある。

## Arduino側の準備

![firmata01.png](https://qiita-image-store.s3.amazonaws.com/0/27289/26d1a7ec-62f1-6896-8540-e35624d7eb08.png)

スケッチの例＞Firmata＞StandardFirmataを選択してArduinoに書き込むだけ。

## PC側の準備

Firmata用のライブラリは多言語で複数あるのでググると良いが、ここではNode.jsの[johnny-five](https://github.com/rwaldron/johnny-five)というライブラリを使った。Node.jsではFirmataのライブラリは複数あり、Arduinoの命令と同じ名前にしてあるやつなどもあったが、開発の活発さとか、いろいろなモジュールに合わせた命令があって楽しいとか、readme.mdの頭にある絵が気に入った（重要なことである）とかでこのライブラリにした。

![firmata02.png](https://qiita-image-store.s3.amazonaws.com/0/27289/841d84c3-3874-e71e-f28c-84e5e8142bd7.png)

使い方は普通のNode.jsのモジュールと変わらないので特に説明することもない。

```js

/**
 * フェードLチカ
 */
var five = require("johnny-five");
var board = new five.Board();   

function fadeBlink(time,led){
    led.fadeIn(time,function(){
        led.fadeOut(time,function(){
            fadeBlink(time,led);
        });
    });    
}

board.on("ready",function(){
    var led = new five.Led(5);
    fadeBlink(3000,led);
});

```