OmniAICreator/Qiita-1.07M huggingface dataset:
開発ツールのメモ［総合編］


スタートアップを支えるWEBサービス/技術
----
* http://blog.smarteducation.co.jp/14-webservice_and_technology_on_smarteducation


エディタ
----
### Todo
* IDEで構文チェック・静的動作検証したい。何がいいだろう？
    * JetBrainsのIDEがこれに強いと聞いた
* さっきまで編集していた場所を忘れてしまうのは何とかならないか？
    * 1つのファイルは120行以内にするとか？

### Visual Studio
* gitの競合の解決がグラフィカルでわかりやすい
* 萌えエディタ化可能←ここ重要
* PHPはプラグイン導入で利用可能

### [SublimeText](http://www.sublimetext.com/)
* ショートカットやシンタックスハイライトが豊富
* IDEみたいな機能は期待するならIDE使ったほうがいいと思う

### [Atom](https://atom.io/)
* gitやgithubとの親和性が高い
* 萌えエディタ化可能←ここ重要
* 動作が重い

### [CuteMarkEd](http://cloose.github.io/CuteMarkEd/)
* Windows向けMarkdownエディタ。Markdown部はレベル別に色分けされてわかりやすい（解析が若干遅い；ここはMac向けの[Mou](http://25.io/mou/)に似てる）
* TOC（Table of Contents；見出し一覧）を表示できるので見出しを工夫するとAbstructになってとても良い、すごくいい


メモの習慣は大事！
----
* 最近はメモをQiitaなどで公開することが盛んに行われている
* 自分で役立ってるメモ内容は、他の人も知りたがっていることかもしれない

### twitter
* 一言レベルの何かをどっかに記録しておきたいときはここがよい
* 筆者は自分のツイートを容易に見れるようにTweetDeckでカラムを組んでいる

### [はてなブックマーク](http://b.hatena.ne.jp/guide)
* 使えそうな情報（サイト）をブックマークするならブラウザよりもコチラの方が検索性が良い
* 拡張機能によりブラウザの検索バーからはてなブックマーク内を検索できる
* __本文検索が可能__←ポイント

### [Simplenote](http://simplenote.com/) + [Respohnotes](http://resoph.com/ResophNotes/Welcome.html) (or [Kobito](http://kobito.qiita.com/ja))
* Simplenoteはテキスト（text/plain）のメモを書き溜められるWebサービス。MacOSにはクライアントアプリがあるが、Windowsにはない。
* Respohnotesはそのサードパーティソフト
* メモをMarkdownでとると後で加工して（シンタックスハイライトしたり）見栄え良くもできる。コピペで文書の（構造）情報が落ちない。
	* Evernoteはメモを書くにはイマイチ。コピペで使いやすいエディタに移すこともできない
	* Markdownなら一旦使いやすいもので書いて、バックアップでSimplenoteに突っ込むということもできる
* MacOSだけで使うならSimplenote + RespohnotesよりもKobitoがメモアプリとして優秀


### Evernote / OneNote
OneNoteのライセンスを持っているならOneNoteが良いようにみえる。OneNoteは課金しなくてもオフラインでノートが見れる。


git
---
### GitHub
* 有名。OSSの公開がよくされている。
* 学生は有料プランの安い方のプランをクーポン(discount)により利用できる（https://education.github.com/)

### [codebreak](http://codebreak.com/ja/)
* 無料会員でもプライベートリポジトリを持てる。


バグ報告
----
### [LICEcap](http://www.cockos.com/licecap/)
* 画面を動画でキャプチャし、gifアニメーション出力可能
* Windows / MacOS 両対応
* http://theclip.jp/news/164/


自動化ツール
----
### Selenium （[Google検索](https://www.google.co.jp/search?q=Selenium)）
* ブラウザ上でのテスト自動化
* テストコードはRuby / Java / JavaScript(Node.js) / C#

#### Selenium IDE
* Firefox Plugin
* GUIでテストを作成できる！

### [grunt](http://gruntjs.com/)
* 自動タスクランナー。なんでも自動化できる。
* JSの構文チェックやminimize、SASS/SCSSのコンパイルも可能。

### [gulp](http://gulpjs.com/)
* gruntにとって変わりそうな後発の自動タスクランナー

### [YEOMAN](http://yeoman.io/)
* ひげの人のロゴ
* テンプレートジェネレータ
* フレームワークや型にはまった開発で威力を発揮する
* gruntを内包


CI
----
（メモ主はこの辺のテクノロジーはノータッチです）

### 概要
* テスト管理・デプロイ支援？
* 「CIはContinuous Integrationの略で複数の開発者で開発をする際継続的に統合テストを行いバグを早期発見するのに役立てるシステム」(by @YVT)

### 候補
* [Circle CI](https://circleci.com/)
* [SideCI](https://www.sideci.com/)
* [Travis CI](https://travis-ci.org/)
	* GitHubでよく見かける
* [Jenkins](http://jenkins-ci.org/)
	* 執事のロゴ


未分類
----
### stubcell（[Google検索](https://www.google.co.jp/search?q=stubcell)）
* サーバーのレスポンスを事前定義できる？開発ツール
Appium環境をOSXに構築する

# 環境

| ソフトウェア | バージョン |
|:-----------|:------------|
| OS X Mavericks | 10.9.4 |
| Appium | 1.3.0 |
| Homebrew | 0.9.5 |
| node.js | 0.10.32 |


# Appiumをインストールする前に

## Homebrewをインストール

```:インストール
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
$ brew -v
# Homebrew 0.9.5
```

```:パッケージツリーを更新
$ brew update
```

## node.jsをインストール

### 既存のnode.jsをアンインストール

以下のコマンドに反応した場合は既にインストール済みなので、アンインストールしておく

```:インストール済みチェック
$ node -v
# v0.10.29
```

```:アンインストール
$ brew uninstall node
```

あわせて関連ファイルも削除
参考: _https://gist.github.com/nicerobot/2697848_

```:関連ファイルの削除
$ curl -ks https://gist.github.com/nicerobot/2697848/raw/uninstall-node.sh | bash
```

上記コマンドで削除できなかった場合は、直接ファイルを指定して削除する

```:関連ファイルの削除（手動）
$ rm -rf /usr/local/lib/node \
/usr/local/lib/node_modules \
/var/db/receipts/org.nodejs.*
```

### インストール
インストールは以下のコマンドを実行


```:インストール
$ brew install node
$ node -v
# v0.10.32
```

# Appiumの環境を構築する

## Appiumをインストール

すでにインストール済みの場合はアンインストールしておく

```:アンインストール
$ appium -v
# 1.2.4
$ npm uninstall -g appium
```

インストールは以下のコマンドを実行

```:インストール
$ npm install -g appium
$ appium -v
# 1.3.0
```

## Appiumの実行環境をチェック

`appium-doctor`を使用して、Appiumの実行環境をチェックする

```
$ appium-doctor
```

出力されるメッセージに合わせて環境を整える
最終的に以下のログが表示されればAppiumの環境構築はすべて完了

```
Running iOS Checks
✔ Xcode is installed at /Applications/Xcode.app/Contents/Developer
✔ Xcode Command Line Tools are installed.
✔ DevToolsSecurity is enabled.
✔ The Authorization DB is set up properly.
✔ Node binary found at /usr/local/bin/node
✔ iOS Checks were successful.

Running Android Checks
✔ ANDROID_HOME is set to "/Applications/android-sdk-macosx"
✔ JAVA_HOME is set to "/Library/Java/JavaVirtualMachines/jdk1.7.0_60.jdk/Contents/Home."
✔ ADB exists at /Applications/android-sdk-macosx/platform-tools/adb
✔ Android exists at /Applications/android-sdk-macosx/tools/android
✔ Emulator exists at /Applications/android-sdk-macosx/tools/emulator
✔ Android Checks were successful.

✔ All Checks were successful
```
時刻同期

参考: [CentOSにntpサーバを入れて、日本標準時刻に自動的に合わせるためのメモ - Qiita](http://qiita.com/tsu_nera/items/9be676b04b190e45b281)

```bash:/etc/ntp.conf追記
server -4 ntp.nict.jp
server -4 ntp1.jst.mfeed.ad.jp
server -4 ntp2.jst.mfeed.ad.jp
server -4 ntp3.jst.mfeed.ad.jp
```

```bash:
service ntp restart
```

```bash:
# ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*ntp-b3.nict.go. .NICT.           1 u   14   64   37    5.197    0.670   0.291
 ntp1.jst.mfeed. 172.29.2.50      2 u   10   64   37    3.725    0.907   0.267
 ntp2.jst.mfeed. 172.29.1.100     2 u    4   64   37    3.652    0.314   0.365
 ntp3.jst.mfeed. 172.29.3.60      2 u    9   64   37    3.625    0.284   0.410
```

> 各サーバの前に*とか+がつくと同期完了。

## archlinuxの場合

```bash:
pacman -Sy ntp
systemctl enable ntpdate
systemctl start ntpdate
```
queueに溜まったmailを確認、保存、削除

* sudoできること
* $HOME/queue/ ディレクトリがあること。

```bash:使い方
sh bin/postsuper.sh 75DC83858245
```

## 処理の流れ

1. queueの存在チェック
2. queueの中身確認
3. queueの削除確認
4. 削除前に$HOME/queue/にメールを退避
5. queueの削除

## 処理

```bash:$HOME/bin/postsuper.sh
#!/bin/sh
set -eu

if [ $# -eq 0 ];then
    echo "QUEUEIDを指定してください。"
    mailq
    exit 1
fi

QUEUEID=${1}
QUEUEID_LEN=`echo -n ${1} | wc -c`
if [ $QUEUEID_LEN -ne 12 ];then
    echo "QUEUEID_LENが正しくありません。"
    exit 1
fi

if [ ! -d "$HOME/queue" ];then
    echo "$HOME/queue ディレクトリがありません。"
    exit 1
fi

mailq | awk '/^[0-9]/{print $1}' | grep ${1}
if [ $? -eq 0 ];then
    echo "/usr/sbin/postcat -q ${1} | w3m"
    sudo /usr/sbin/postcat -q ${1} | w3m
    echo sudo /usr/sbin/postsuper -d ${1}
    echo -n "実行しますか？ [Y/n]"
    read _yn
    if [ "$_yn" = "y" -o "$_yn" = "Y" ];then
        sudo /usr/sbin/postcat -q ${1} > $HOME/queue/$QUEUEID
        sudo /usr/sbin/postsuper -d ${1}
    else
        echo "quit."
    fi
else
    echo "not found."
fi
```
AWSでVPC内のプライベートSubnet内にSMTPサーバーを構成する


## 前提条件

1. [AWSで最低限セキュアな構成を組む（以下、記事1と記述）](http://qiita.com/ausuited/items/09b626fa5264f0c650fd)の内容を参考に構成が組まれている事。但し以下の手順は行わなくて良い。

  1. 「4. Auto Scaling Groupのための前準備」の手順のうち、「パブリックSubnetにEC2インスタンス（踏み台サーバーとして）」以外の手順
  1. 「5. Elastic Load Balancerの構築」
  1. 「6. Auto Scaling Groupの構築」
  1. 「7. アクセスして確認」
1. [お名前.comで取得したドメインのネームサーバーをRoute53に変更しELB配下のWebページをドメインで引けるようにする](http://qiita.com/ausuited/items/94beec5f588dbdebb7fc)等の内容を参考に自ドメインのネームサーバーがRoute 53で運用されている事

## 構築手順

1. プライベートSubnetにEC2インスタンスを作成（SMTPサーバーとして）
1. 踏み台サーバーからSMTPサーバーにログインしてpostfixをインストール
1. Elastic Load Balancerの構築
1. Route 53の設定
1. メールを送信し、到達を確認する

## プライベートSubnetにEC2インスタンスを作成（SMTPサーバーとして）

1. 記事1のNATインスタンスを作成した要領で、プライベートSubnetにEC2インスタンスを作成する。Security Groupは新規に作成して、10.0.0.0/16からのSSHとSMTPのみを許可するように設定すればとりあえず良い。

## postfixをインストール

[postfixのインストールと設定](http://qiita.com/ausuited/items/2712e270053170260cec)の内容を参考にする。

## Elastic Load Balancerの構築

1. EC2 Dashboard左メニューから「Load Balancers」を選択
1. 「Create Load Balancer」ボタンを押下
1. Load Balancer nameは適当に（elb-servicename-stgとか）
1. Create LB Insideは作成したVPCを指定
1. Create an internal load balancerはチェックoff
1. Listener Configurationについて
  1. Load Balancer ProtocolはTCP
  1. Load Balancer Portは25（SMTPのポート）
  1. Instance ProtocolはTCP
  1. Instance Portは25
1. 「Continue」ボタンを押下
1. Configure Health Checkは、Ping ProtocolがTCP、Ping Portが25になっている事を確認
1. Healthy Thresholdは、実運用時は適切に設定するものの、構築を試行している時は最小の2がお勧め
1. 「Continue」ボタンを押下
1. Available Subnetsの中からパブリックSubnetのプラスマークを押下（ELBが属するSubnetを指定する事）
1. 「Continue」ボタンを押下
1. Security groupはポート25だけを許可した新しいものをここでは作成した
1. 「Continue」ボタンを押下
1. Add Instances to Load Balancerの画面で、先程プライベートSubnetに作成した、SMTPサーバーのEC2インスタンスを指定
1. 「Continue」ボタンを押下
1. Key, Valueはとりあえず指定せず「Continue」ボタンを押下
1. 「Create」ボタンを押下
1. 今作成したELBのDescriptionタブ内のStatusが「1 of 1 instances in service」になるのを待つ

## Route 53の設定

1. Servicesから"Route 53"を選択
1. 左メニューから"Hosted Zones"を選択
1. 対象のドメインの左端のチェックボックスをチェックし[Go to Record Sets]ボタンを押下
1. [Create Record Set]ボタンを押下
  1. NameにはSMTPサーバーの名前を入れる（mail等）
  1. Typeに"A - IPv4 address"を指定
  1. Aliasは"Yes"を選択し、Alias Targetに先程作成したELBを指定
  1. [Create]ボタンを押下
1. [Create Record Set]ボタンを押下
  1. Typeに"MX - Mail exchange"を指定
  1. Aliasは"No"のままで、Valueに"10 先程作成したAレコードのFQDN"を指定（mail.my.domainのように）
  1. [Create]ボタンを押下

##   1. [Create]ボタンを押下

1. 自分のMUAからpostfixtest@my.domain宛てにメールを送信する
1. 踏み台サーバーからメールサーバーにログインし、/home/postfixtest/Maildir/newに、今送信したメールが到達している事を確認する
postfix（Maildir運用）のインストールと設定


## postfixのインストール（main.cf編集前まで）

```bash:shellでの操作
# sendmailの停止
sudo service sendmail stop
# postfixの停止
sudo yum install postfix
# OSのMTAをpostfixに変更
sudo alternatives --config mta # postfixの番号を選択してEnterを押下する
# sendmailの自動起動を抑止
sudo chkconfig sendmail off
# postfixの自動起動を設定
sudo chkconfig postfix on
# ユーザー作成時にMaildir形式のメールボックスが作成される設定
sudo mkdir -p /etc/skel/Maildir/{new,cur,tmp}
sudo chmod -R 700 /etc/skel/Maildir/
# ユーザーを作成（確認用のため、作成は任意）
sudo useradd postfixtest
sudo ls -al /home/postfixtest/Maildir # メールボックスの確認
sudo passwd postfixtest
```

## main.cfの編集

``` bash:shellでの操作
cd /etc/postfix
sudo cp main.cf main.cf.20141030
sudo vi main.cf
```

### main.cfの編集内容

1. myhostnameをアンコメントし、値にFQDNを指定
1. mydomainをアンコメントし、値に自ドメインを指定
1. myoriginをアンコメントし、値に $mydomain を指定
1. mydestinationの値に $myhostname, localhost.$mydomain, localhost, $mydomain を指定
1. home_mailboxをアンコメントし、値を Maildir/ と指定
1. smtpd_bannerをアンコメントし、値を $myhostname ESMTP unknown と指定
1. inet_interfacesの値に all を指定
1. inet_protocolsの値に ipv4 を指定

### 編集内容のチェック

``` bash:shellでの操作
sudo /etc/rc.d/init.d/postfix check # OKと出力されれば良い
```

## postfixの起動

``` bash:shellでの操作
sudo service postfix start
```
[wordpress]固定ページが複数あるサイト構築~設定編~

とある固定ページが複数あるサイトの構築を依頼された。
せっかくなので、これを機に自分のサイトも作ろうと思う。
その際に使うために、依頼案件の際の手順をメモしておく。

ローカル開発環境
Mac10.10(Yosemite)
vagrant(centos6.5)
ローカル開発環境をvagrantで構築しているので、そこで作業を行っていく。


認証用ユニークキーの設定
1. wordpressディレクトリ内のwp-config-sample.phpをコピーして、wp-config.phpファイルを作成。
2. wp-config.phpファイル内の、[ {@link https://api.wordpress.org/secret-key/1.1/salt/ WordPress.org の秘密鍵サービス} で自動生成することもできます。 ]という行の、リンク先へいく。
3. リンク先で生成されたテキストを全てコピーして、

`````wp-config.php

define('AUTH_KEY',         'put your unique phrase here');
define('SECURE_AUTH_KEY',  'put your unique phrase here');
define('LOGGED_IN_KEY',    'put your unique phrase here');
define('NONCE_KEY',        'put your unique phrase here');
define('AUTH_SALT',        'put your unique phrase here');
define('SECURE_AUTH_SALT', 'put your unique phrase here');
define('LOGGED_IN_SALT',   'put your unique phrase here');
define('NONCE_SALT',       'put your unique phrase here');

`````
この記述を削除し、同じ位置にコピーしてきたものをそのまま貼り付ける。

データベースの設定
1. mysqlでデータベースを一つ作成する。
2. wp-config.phpファイルのデータベース設定記述欄に記述して保存
php-fpm

これで、wordpressが表示されるので、サイトへ行く。
サイトを開くと、サイト名、ユーザー名、パスワードの設定画面が表示されるので、あとはそこに書いてある指示にしたがって書いていけばインストール成功です。

次回からは、オリジナルのテーマを作成していきます。
ScalaでMacのシェルを叩く

## 目的
Scalaはスクリプト言語のように少ないコード量でお手軽にやりたい事を書くことが出来ます。それを確かめるために今回はScalaのREPLからMacに標準搭載されたbashのコマンドを叩いてみます。

## sayコマンド
今回はMacに搭載されたsayコマンドを試してみます。
sayコマンドとは渡した文字列を音声で読み上げてくれるコマンドです。
bashで実行すると以下のとおり。

```bash:bash
$ say -v Bells I want to get a sleep right now anyway
```

## 実行
Scalaならばsayコマンドを下記のように簡単に実行することが出来ます！このお手軽さにはジェニファーもびっくり。

```scala:REPL
scala > import scala.sys.process._
scala > "say -v Bells I want to get a sleep right now anyway" !
```


## パイプで連続実行
もちろん、Scalaならば複数のコマンドをパイプで繋げることも容易に可能……！

```scala:REPL
scala > import scala.sys.process._
scala > "curl -s www.yahoo.com" #| """grep -iom1 <title[^>]*>[^<]*</title>""" #| "cut -c8-12" #| "sed -e s/$/oooooooooo/" #| "say -v Kyoko" !
```

## 終わり
今回はScalaでシェルを叩く方法を書いてみました。

Fin……

LLとの比較は………おやすみなさい
[Ruby] Read JSON from url and parse JSON

We can use the `open-uri` to get the content from the url. And use the `JSON` to parse the JSON string to hash or array. 

```rb
require 'open-uri'
require 'JSON'

url = "https://api.com/result.json"
json = open(url).read
objs = JSON.parse(json) 
objs.each do |obj|
  title = obj["title"]
end
```

If the result is not a array. The result will be a dictionary. Just use like this:

```rb
obj = JSON.parse(json) 
title = obj["title"]
```
cocos2dxのversion2と3の違い

教えてください。特に、下記の観点。

1. ドキュメント量の差(体感で良いです)
2. 初見の人がflappy birdをリリースするまでの速度の差
3. 国内における実績の数
4. その他クリティカルな差

>pythonにおける2系と3系の差みたいな残念なことになっていないかということを気にしています。
ReactiveX と MVVM と DataBinding の関係について図にしてみた


* [ReactiveCocoa Tokyo #rac_tokyo - connpass](http://connpass.com/event/8680/)
* [RxJava Night #rxjnight - connpass](http://connpass.com/event/9061/)
* [#10 node.js sideshow | mozaic.fm](http://mozaic.fm/post/100741841543/10-node-js-sideshow)

などなどをいろいろ眺めておりまして（東京うらやましい）、Reactive Extensions とか MVVM とかいろいろ熱い！楽しい！と思っているわけですが、いろいろなライブラリがあって、それらのカバーする範囲がいまいち明確になってない気がしたので、自分なりに整理してみました。

![](http://blog.amay077.net/assets/images/posts/reactive_mvvm_databindings_relations_01.png)

MVVM っていうと、Messenger とか DIコンテナ的なものとかもあるわけですが、主に DataBinding と Rx の違いにフィーチャーしたかったので除外しました。

　DataBinding は、[DependencyProperty](http://www.atmarkit.co.jp/ait/articles/1008/03/news097_3.html) や [BindableProperty](http://blog.falafel.com/learning-xamarin-custom-renderers-in-xamarin-forms/) みたいなものがあるかどうかという感じで考えていて、「XAMLとかのマークアップでバインディング指定できなければならない」という考えではないです。

　View, DataBinding, ViewModel, ReactiveX の各ブロックは基本的にはどの組み合わせでもよくて（特に ReactiveX は他とは別の世界のものなので）、しかし中には ReactiveProperty のように ReactiveX に依存しつつ ViewModel の機能を提供するものがあったり、ReactiveCocoa のように「全部入り」のものがあったりします。また、View と ViewModel を繋ぐためにはなんらかの DataBinding が必要です。

という理解なんですが、あってますかね？

　私は Xamarin 推しの人なので、 **Xamarin.Forms + ReactiveProperty が、MVVM+Rx のパワーをフル活用できて、しかも iOS/Android で大部分のコードが共有できるという最強の組み合わせなんですよ！** というのを言いたいわけです。

## Links

* Xamarin.Forms - [Build a Native Android UI & iOS UI with Xamarin.Forms - Xamarin](http://xamarin.com/forms)
* Prism - [patterns & practices: Prism - Download: Prism 5.0 for .NET 4.5](http://compositewpf.codeplex.com/releases/view/117297)
* MVVM Light Toolkit - [MVVM Light Toolkit - Home](https://mvvmlight.codeplex.com/)
* Reactive Extensions - [Rx (Reactive Extensions) - Home](https://rx.codeplex.com/)
* ReactiveProperty - [ReactiveProperty - MVVM Extensions for Rx - Home](https://reactiveproperty.codeplex.com/)
* ReactiveUI - [reactiveui/ReactiveUI](https://github.com/reactiveui/reactiveui)
* MvvmCross - [MvvmCross/MvvmCross](https://github.com/MvvmCross/MvvmCross)
* RxJava - [ReactiveX/RxJava](https://github.com/ReactiveX/RxJava)
* RxAndroid - [ReactiveX/RxAndroid](https://github.com/ReactiveX/RxAndroid)
* android-binding - [gueei/AndroidBinding](https://github.com/gueei/AndroidBinding)
* ReactiveCocoa - [ReactiveCocoa/ReactiveCocoa](https://github.com/ReactiveCocoa/ReactiveCocoa)
クラスタリング手法

mahoutとか使ってなんか分析してみたいけど、そもそもの分析手法を知らないので学習してみる。（とりあえず自分なりに学習過程を書き残す。）
基本的にはインターネット上の情報で学習する。

# K平均法（Kへいきんほう、k-means clustering）
基本的なクラスタリング手法。
非階層的な手法の代表例である。
kはクラスタの数を表す。
大量のデータを処理する場合に階層的なクラスタリングより適した手法。

## 簡単に言うと？
最初にクラスタの中心（重心）を仮定する（適当に）。
計算して徐々に重心をずらして行き、重心が動かなくなったところで終了させる。

↓わかりやすい！(๑╹ڡ╹๑)
http://tech.nitoyon.com/ja/blog/2013/11/07/k-means/
http://www.antecanis.com/texts/group_04/

# 何に使えるか、何に使われているか
（教えて下さい）

## 参考
http://msdn.microsoft.com/ja-jp/magazine/jj891054.aspx
http://www.cs.osakafu-u.ac.jp/hi/honda/k-means.htm
http://www-01.ibm.com/support/knowledgecenter/SSLVMB_22.0.0/com.ibm.spss.statistics.help/spss/base/idh_quic.htm?lang=ja
http://image.onishi-lab.jp/004.html

# まだまだ
全然ワカランチンなので何かオススメの本があれば教えて下さい。
Rails4でプロジェクトの最初にSlimとBootstrapを導入する


Railsでプロジェクトを開始する際にBootstrap+Slimを導入してみたのでとりあえずメモしときます。

# Slim

まずSlimってのは

* Rubyのテンプレートエンジンです。
* 高速, 軽量です。
* コード量が減る。見やすい。美しい。

>Slim is a template language whose goal is reduce the syntax to the >essential parts without becoming cryptic.
>
>スリムは可読性を確保しつつ、基本的パーツのコード量を減らすことを目的に作られたテンプレート言語である。

[本家](http://slim-lang.com/)より。

## RailsにSlimをいれる

```Gemfile
gem 'slim-rails'
```
でbundle installします。

```config/application.rb
class Application < Rails::Application
  config.generators do |g|
    g.template_engine :slim
  end
end
```
これで準備OKです。rails generateとかするとslimで生成されます。

# Bootstrap

Bootstrapはまあ皆様ご存知だと思います。私みたいにデザインセンス無い方はよくお世話になっていると思います。

## 準備

まあ、例によってGemfileに

```
# Bootstrap
gem 'less-rails'
gem 'therubyracer'
gem 'twitter-bootstrap-rails', '~> 2.2.8'
gem 'font-awesome-rails'
gem 'bootstrap-sass', '2.3.2.0'
```

bootstrap3の場合は

```
gem 'twitter-bootstrap-rails', :git => 'git://github.com/seyhunak/twitter-bootstrap-rails.git', :branch => "bootstrap3"
```

みたいです。

```
bundle install
```

## bootstrapのファイル郡作成

```
bundle exec rails g bootstrap:install less
```

## テンプレート作成

```
bundle exec rails g bootstrap:layout application fluid
```
(fluid・・・レスポンシブ対応)

これでviews/layouts/にapplication.html.slimができるかなと思います。

# 参考にさせていただきましたサイト様

[速習テンプレートSlim(HTML作成編) - Qiita](http://qiita.com/yterajima/items/53fd0387279510ff082a)
[Rails - Rubyのテンプレートエンジンをerbからslimに変更する際に変えた事 - Qiita]
(http://qiita.com/moriyaman/items/c0d60406422677bcb398)
[Slim - A Fast, Lightweight Template Engine for Ruby](http://slim-lang.com/)
[slim/README.jp.md at master · slim-template/slim · GitHub](https://github.com/slim-template/slim/blob/master/README.jp.md)
[RailsでTwitter Bootstrapを使う - Qiita](http://qiita.com/mm36/items/564fe34f57d9f9e3acf5)
[seyhunak/twitter-bootstrap-rails · GitHub](https://github.com/seyhunak/twitter-bootstrap-rails)
Ruboty | チャットを空メッセージ or 任意のメッセージで埋める ruboty-ume を作成しました #ruboty

# Ruboty | チャットを空メッセージ or 任意のメッセージで埋める ruboty-ume を作成しました #ruboty
## 概要
チャットを空メッセージ or 任意のメッセージで埋める ruboty-ume を作成しました。

## 用途
ruboty google_image で妙な画像を引き当ててしまった。
そんなときに限って、偉い人が近づいてくる。
急いでチャット画面から画像を追い出すんだ。

内緒のメッセージのやりとり。
そんなときに限って、内緒のやりとりがばれるとまずい相手が近づいてくる。
急いでチャット画面から画像を追い出すんだ。

そんな時に空行を大量に追加してメッセージを画面外に追い出します。
## 仕様
### ume
|key|value|
|:--|:--|
|pattern|/ume (?&lt;count&gt;.*?)\z/|
|description|output empty message N lines (&lt;count&gt; times). default count = 15.|
|name|ume|

### umec
|key|value|
|:--|:--|
|pattern|/umec (?&lt;text&gt;.+?) (?&lt;count&gt;.*?)\z/|
|description|output &lt;text&gt; message N lines (&lt;count&gt; times). default count = 15.|
|name|umec|

## 利用法

* Gemfile

~~~ruby
source 'https://rubygems.org'

gem 'ruboty-ume'
~~~

* 実行

~~~
$ bundle install
$ bundle exec ruboty
> ruboty help
ruboty /ume (?<count>.*?)\z/               - output empty message N lines (<count> times)
ruboty /umec (?<text>.+?) (?<count>.*?)\z/ - output <text> message N lines (<count> times)
ruboty /help( me)?\z/i                     - Show this help message
ruboty /ping\z/i                           - Return PONG to PING
ruboty /who am i\?/i                       - Answer who you are
> ruboty ume 3




> ruboty ume 5






> ruboty umec hoge 3
hoge
hoge
hoge

> ruboty umec hoge 5
hoge
hoge
hoge
hoge
hoge
~~~

## 補足
* 実装時に Ruboty のテンプレートジェネレータ [ruboty-gen](https://github.com/blockgiven/ruboty-gen) を利用しています。
* テストコードのひな形生成に [rspec_piccolo](https://github.com/tbpgr/rspec_piccolo) を利用しています。

## 参照
[ruboty-ume GitHub](https://github.com/tbpgr/ruboty-ume)
[ruboty-ume RubyGems](http://rubygems.org/gems/ruboty-ume)
[ume GitHub](https://github.com/tbpgr/ume)
[ume RubyGems](http://rubygems.org/gems/ume)
[rspec_piccolo GitHub](https://github.com/tbpgr/rspec_piccolo)
[rspec_piccolo RubyGems](http://rubygems.org/gems/rspec_piccolo)
[Ruboty GitHub](https://github.com/r7kamura/ruboty)
[Ruboty RubyGems](https://github.com/r7kamura/ruboty)
[ruboty-gen GitHub](https://github.com/blockgiven/ruboty-gen)
[ruboty-gen RubyGems](http://rubygems.org/gems/ruboty-gen)
[Ruboty | 自作 Handler gem の作成](http://qiita.com/tbpgr/items/a7ac8aaec55ee1bf79f0)
Cheerioのchildren()とcontents()の違い

Cheerioで次のような構造のDOMを扱いたいとします。

![hn.png](https://qiita-image-store.s3.amazonaws.com/0/15414/5971e982-751e-edcc-0671-6ef9669d0fdd.png)


### children()

```js
$('td.subtext').children();
```

3つのノードが取得されます。

```html
<span> 略 </span>
<a href> 略 </a>
<a href> 略 </a>
```


### contents()

```js
$('td.subtext').contents();
```

5つのノードが全て取得されます。

```html
<span> 略 </span>
" by "
<a href> 略 </a>
" 3 hours ago  | "
<a href> 略 </a>
```

以上です。
[Nightwatch.js]configファイルを設定する

# configファイルを設定する
＜課題＞
下記のような課題に対して有効です
* テスト実行する上でテキストフォームに設定する値などリクエストする値を運用上のことも考えて一元管理したい
* テストコード開発中にあちこちで同じ値を使いまわすのを避けたい

＜手順＞
1. nightwatch.jsonに設定ファイルのパスを指定
2. 設定ファイルをjsonで作成
3. アクセス

## 1.nightwatch.jsonに設定ファイルのパスを指定
* globals_pathに設定ファイルのパスを書く ※今回はsetting.jsonというファイルにする

```json:nightwatch.json
{
  "src_folders" : ["./examples/tests"],
  "output_folder" : "./examples/reports",
  "custom_commands_path" : "./examples/custom-commands",
  "custom_assertions_path" : "",
  "globals_path" : "./setting.json",
  "live_output" : false,
```

## 2.設定ファイルをjsonで作成
```json:setting.json
{
	"hoge" : "fuga"
}
```

## 3.アクセス
* hogeにアクセスする

```js:testsample.js
module.exports = {
  'Demo test Google' : function (client) {
    // hogeにアクセス&testにfugaがセット
    var test = client.globals.hoge

    client
      .url('http://www.google.com')
      .windowMaximize()

      // fuga　がフォームにセットされる
      .setValue('input[type=text]', test)
      .waitForElementVisible('button[name=btnG]', 1000)
      .click('button[name=btnG]')
      .pause(1000)
      .end();
  }
};
```
Gitでcommitした時にブランチ名をcommitメッセージに自動でいれる


`.git/hook`ディレクトリ以下にgitでcommitをした時などに呼ばれるスクリプトがあります。

今回はcommitメッセージを変更するhookファイルにスクリプトを書きます。

```
$ vi .git/hook/prepare-commit-msg
```

```prepare-commit-msg
#!/usr/bin/env ruby

#今いるブランチ名を取得
current_branch = `git branch | grep '*'`.chomp.sub('* ', '')

commit_msgs = File.readlines(ARGV[0])
open(ARGV[0], 'w') {|file|
	file.print "#{current_branch}:"
    file.puts commit_msgs
}
```


これで自動で
<ブランチ名>:<コミットメッセージ>

となります。
redis(predis)でパイプライニング(pipelining)を使って高速にコマンドを実行する

redisにパイプライニングといって複数のコマンドを一括実行する機能があります。
これを使うことでひとつひとつコマンドを実行するよりも圧倒的に高速な実行が可能です。
僕の環境ではhset(),expire()を１万回繰り返して確認したところ約5倍の性能差がありました。

クライアントライブラリによってはmulti/execのオプションなどでパイプラインを実行するものもあるため、自分が使う
クライアントライブラリにおけるパイプライン処理の実装方法をしっかり確認しておく必要があります。
predisというクライアントライブラリではpipeline()メソッドというパイプラインのためのメソッドが用意されており
これによって取得できるPipelineクラスのインスタンスを使ってコマンドを指定します。

以下はpredisで1万回のhset/expireをパイプラインで処理するコード例です。

```php
$redis->pipeline(function($pipe){
  for ( $i = 0; $i < 10000; $i++ ) {
    $pipe->hset('hogehoge'.$i, 'hoge', $i);
    $pipe->expire('hogehoge'.$i, 30);
  }
});
```

便利なパイプライニングですが、メモリ使用量には注意が必要です。
上記のループを5万件にして実行後にmemory_get_peak_usage()すると84MBのメモリ消費でした。
10万件ではデフォルトのメモリ使用量制限(128MB)にひっかかり途中で止まってしまいました。
Elixir Functions Pattern Matching

# Elixir Functions Pattern Matching

## 概要
Elixir の Functions の Pattern Matching について。

## Single Pattern Matching
~~~
sum2 = fn (a, b) -> a + b end
IO.inspect sum2.(1, 2)
IO.inspect sum2.(3, 4)

sum_tuple2 = fn { a, b, c } -> a + b + c end
IO.inspect sum_tuple2.({1, 2, 3})
IO.inspect sum_tuple2.({3, 4, 5})
~~~

* 出力

~~~
3
7
6
12
~~~

## Multi Pattern Matching
~~~
sum2 = fn
  (0, b) -> 0
  (a, 0) -> 99
  (a, b) -> a + b
end

IO.inspect sum2.(1, 2)
IO.inspect sum2.(0, 5)
IO.inspect sum2.(5, 0)
~~~

* 出力

~~~
3
0
99
~~~
ターミナル上でgnuplotの出力をターミナルに直接描画する

#概要
最近[この記事](http://qiita.com/kefir_/items/78e64c545a70a0ebea8a)(Qiita:Vimで画像を見る(DRCSのSIXEL拡張の話))を読んだ。

どうやら世の中のUnixターミナルエミュレータはある特定の実機を元に実装してる場合が多く、その古の実機の中に[Sixel](http://en.wikipedia.org/wiki/Sixel)という形式でグラッフィック描画をサポートしていた物があったらしい。

最近になって、この機能が話題になり、vim上での画像表示や、ターミナルエミューレータ側でのSixelサポートや、その他アプリケーションでのSixel形式サポートが進んでいる。

gnuplotもSixelをサポートした。

#使ってみる

私は普段はubuntuを手元では使っている。
ubuntu標準のgnome-terminalはSixelをサポートしていないが、xtermはサポートしている。
また、ubuntuのapt-getでxtermをビルドしていれば、Sixelサポートはenableになっている。

そこでubuntu上でxtermを起動する
`xterm -ti 340 -xrm "XTerm*sixelScrolling: True"`

sshで普段使っているクラスタにアクセスしgnuplotを起動する。
そして・・・

`set terminal sixel`
`plot sin(x)`

・・・グラフがターミナル上に表示されている。
あまりにもあっけなくできてしまって驚いた。

背景色が黒のターミナルエミューレタを使っている場合、軸や判例等がうまく表示されないだろうが、それは色が重なっているためだ。
例えば
`set border linecolor rgbcolor "yellow"`
`set key textcolor rgbcolor "yellow"`
とすれば良い。

素晴らしい。
この方法ならば、リモート側のシステムにまったく依存する事なく使う事ができる。x11転送を拒絶されている状況でもだ。
リモートの自分のローカルディレクトリに新しいgnuplotを忍ばせてSixelに対応したターミナルエミューレータでssh越しに叩けばよい。
OS X YosemiteにアップデートしたらHomebrewでインストールして自動起動設定にしていたnginxのサイトにアクセスできなくなった


[こういう設定で](http://katahirado.hatenablog.com/entry/20140410/1397141355)家庭内で食材検索のWebアプリを動かしていたが、動作させていたMac miniをYosemiteにアップデートしたらアプリのサイトにアクセスできなくなってしまった。

で、調べようとする過程でbrew doctorしようとしたらbrewコマンドも使えなくなってた。

```bash
$ brew doctor
/usr/local/bin/brew: /usr/local/Library/brew.rb: /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby: bad interpreter: No such file or directory
/usr/local/bin/brew: line 26: /usr/local/Library/brew.rb: Undefined error: 0
```

ので、まずこちらを解決する。

Yosemiteの/System/Library/Frameworks/Ruby.framework/Versionsの下はCurrent と 2.0になっていて、Currentは2.0のシンボリックリンクになっている。 　

brew.rbを編集。

```bash
$ vi /usr/local/Library/brew.rb
#!/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby -W0　<- これを
#!/System/Library/Frameworks/Ruby.framework/Versions/Current/usr/bin/ruby -W0　<-こう変える
```

これでbrew updateとかdoctorとかしようとすると当然怒られるので以下のように。

```bash
$ cd /user/local
$ git commit -a -m "ruby version 2.0" 
$ brew update
```
OK.

本題のnginxとunicornの確認。
まず、unicornのポート5000番にブラウザからアクセスしてみると、こちらはアクセス出来ている。

nginxがダメなようだ。

plistをunloadしてnginxを手動で起動して確認してみる。

```bash
$ launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.nginx.plist
$ nginx
nginx: [warn] the "user" directive makes sense only if the master process runs with super-user privileges, ignored in /usr/local/etc/nginx/nginx.conf:2
nginx: [emerg] mkdir() "/usr/local/var/run/nginx/client_body_temp" failed (2: No such file or directory)
```
ディレクトリ作成に失敗というメッセージが出たので、手動で作ってみた

```bash
$ mkdir -p /usr/local/var/run/nginx/client_body_temp
$ launchctl load ~/Library/LaunchAgents/homebrew.mxcl.nginx.plist
```

OK.ブラウザから8080番にアクセスしたところ無事アクセス出来た。

###参考

* http://jcvangent.com/fixing-homebrew-os-x-10-10-yosemite/
gulp-webserver の livereload が 2 回走る

livereload というのは HTML/CSS/JavaScript を変更するとブラウザを自動でリロードしてくれる便利なやつです。

その livereload が少し時間を置いて 2 回走るという現象が起きました。私は CoffeeScript を使っているのですが CoffeeScript を変更したときに livereload が走り、その CoffeeScript が JavaScript にコンパイルされたときにも livereload が走っていたのが原因でした。

livereload が走るファイルの種類をフィルターすることで解決しました。

```js
var gulp = require('gulp');
var webserver = require('gulp-webserver');

gulp.task('webserver', function() {
    gulp.src('app')
        .pipe(webserver({
            livereload: {
                enable: true,
                filter: function(filename) {
                    return !filename.match(/\.(slim|stylus|coffee)$/);
                }
            }
        }));
});
```

参考
https://github.com/schickling/gulp-webserver/issues/11
Ansible で（たぶん）正しいファイルの存在確認方法（ファイル比較もあるよ）

※Ansible を始めて日が浅いので最新のバージョン（1.7.2）でしかチェックしていません。
※CentOSでしか確認していません。誰か他のOSでチェックしたらコメントに残してくれるとみんな助かっていいと思う。

ぐぐって出てくる方法だと shell: や command: モジュールを使って（-f とかちょっと。。。）チェックした値を register: していて、なんだかなぁと思っていたのだけど、正しい判断の仕方が見つけられた（と思う）のでメモしてみる。（実はQiita投稿は初めてｗ）

よく見ると本家ドキュメントにも書いてあって、コアモジュールの stat を使うだけ。

http://docs.ansible.com/stat_module.html

<pre>
# task
- stat: path=/hoge/fuga
  register: is_file

- name: skip if file is found.
  fail: msg='file not found'
  when: is_file.stat.md5 is not defined
</pre>

stat モジュールでファイルの stat を取得して、（statモジュールがデフォルトでmd5を取得するので） md5 をチェックすればOK
ディレクトリにはmd5が付かないみたい？なので、ファイルの存在確認として使える。

fail モジュールは強制終了させてくれる。（name を付けることで正常時のメッセージが見やすい）

when を工夫すればディレクトリ許可もできる。それは記事数を稼ぐために別に書く。かもしれないｗ


おまけのファイル比較の正しい方法。git もそうだけど、md5でチェックするのが正しいよね。

<pre>
- stat: path=/hoge/fuga
  register: is_file1

- stat: path=/hoge/hoga
  register: is_file2

- debug: msg="compare"
  when: (is_file1.stat.md5 == is_file2.stat.md5)
</pre>

register した値の中にstatがあるので、その中のmd5同士を比較してあげれば、ファイル名が違っていても同じ内容かどうか判断できる。というお話しでした。
jThreeでランダムウォーク


インタラクティブ・プログラミング勉強会 第1回 乱数 | fladdict
http://fladdict.net/blog/2014/10/visual-coding-1.html
こちらの記事を読んで、自分も何か作ってみたくなったので最近覚えた
jThreeでちょっと作ってみた。

http://editor.jthree.jp/?id=scJLyw

ぬるぬる動いておもしろい。
環境のセットアップとか一切なしでそのまま書き始めれるのは楽で良い。

![スクリーンショット 2014-10-29 21.41.45.png](https://qiita-image-store.s3.amazonaws.com/0/2288/dd5cef26-9bae-d231-fc45-6823b42fe298.png "スクリーンショット 2014-10-29 21.41.45.png")
アプリで書いた swift 群をフレームワーク化して Playground で import する


# 参考

Alamofire
https://github.com/Alamofire/Alamofire

Alamofire スキーマを選んでシミュレータの iphone5s あたり用にビルドすると、ワークスペース内にある Alamofire.playground 内で `import Alamofire` して Alamofire.swift 内の **publicな** メソッド等が使えるようになります。

# 他のプロジェクトでやってみる

## 環境

* Mac OS X 10.10
* Xcode 6.1

## 対象

Swiftris
https://www.bloc.io/swiftris-build-your-first-ios-game-with-swift

## 方法

1. Swiftris ワークスペースを新たに作成して既存の Swiftris アプリプロジェクトを中にいれる
2. 新規の `Cocoa Touch Framework` プロジェクト(名前はとりあえず SwiftrisFramework)を作成して **Swiftris ワークスペースに入れる**
3. フレームワークに分離できる swift ファイルを SwiftrisFramework の方に移動する(AppDelegate.swift と GameViewController.swift **以外**をとりあえず移動)
4. 2 で作成した SwiftrisFramework.xcodeproj を Swiftris ワークスペース内の Swiftris の中に入れる(それ以外のフォルダとかは不要)
5. Swiftris の `Build Phases` の `Target Dependencies` に SwiftrisFramework を追加する
6. Swiftris アプリを ビルドしようとするとたくさんエラーが出るはずで、 **これは SwiftrisFramework の方で public になっていないクラスや変数が見えないために出る** 。エラーが出るまで変数/クラス/フィールド/メソッド等に `public` を追加、 SwiftrisFramework をビルド、Swiftris アプリをビルド、を繰り返す
7. Playground の中で使いたいクラス等にも `public` を追加し、SwiftrisFramework をビルドする。
8. ワークスペースに Playground ファイルを追加し、以下を書いたらあとは `public` にしたクラス他を Playground 内で使えるようになっているので遊ぶ

```swift
import SwiftrisFramework
```

## 構造

#### Swiftris ワークスペース
##### 　Playgroundファイル
##### 　SwiftrisFramework(フレームワーク)
##### 　Swiftris(iOSアプリ)
###### 　　SwiftrisFramework.xcodeproj(上のフレームワークのプロジェクトファイルのみ、設定で SwiftrisFramework を参照するために必要)

# まとめ
- 分かんなかったら Alamofire を参考にすればいいと思います(適当)
- 単にプロジェクト内の swift のクラスとかを Playground で使いたいだけなんですけどもっといい方法ないんでしょうか…?
perlでhtmlのbodyタグの前にgoogle analyticsタグを一括設置する[複数行置換]

仕事で必要になったので
複数行置換のサンプルとしても記録

## google analytics コードの整形

まずgoogle analyticsのコードをperlに置換文字列として渡すために
改行が入っていると困るので改行を\nに置換する

ga_code.txtにはgoogle analyticsのコードが書いてある

```perl
$ perl -pi.bak -e 's/\n/\\n/g' ga_code.txt
```

その後テキストエディタなどでスラッシュをバックスラッシュでエスケープする

## perlでの置換

```perl
$ perl -pi -e "s/置換したい文字列/置換後の文字列/g" example.html
```

なのでindex.htmlに対しての
実際の置換コマンドが以下

```perl
$ perl -pi -e "s/<\/body>/<script>\n  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){\n  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),\n  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)\n  })(window,document,'script','\/\/www.google-analytics.com\/analytics.js','ga');\n\n  ga('create', 'UA-0000000-0', 'auto');\n  ga('send', 'pageview');\n\n<\/script>\n<\/body>/g" index.html
```

current directory以下の複数ファイルをやる時などは
findを組み合わせて

```bash
$ find . -name '*.html' -exec perl -pi -e "s/<\/body>/<script>\n  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){\n  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),\n  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)\n  })(window,document,'script','\/\/www.google-analytics.com\/analytics.js','ga');\n\n  ga('create', 'UA-0000000-0', 'auto');\n  ga('send', 'pageview');\n\n<\/script>\n<\/body>/g" {} \;
```

実行する前にはなにかしら戻せるようにしておくのがよいでしょう
pecoでgitのルートに移動する その２

前の記事（ http://qiita.com/tetsutan/items/1bd13f79fdaf0b17cceb ）のスクリプトにキャッシュ生成をさせるように変更しました

https://github.com/tetsutan/cdgitroot

ghq listで良いのではと思われるかもしれませんが、mruのリストが欲しかったのです。


``` sh
[ -f $ZSH_CUSTOM/lazy/cdgitroot.zsh ] && source $ZSH_CUSTOM/lazy/cdgitroot.zsh

function chpwd() {
  _reg_pwd_gitroot
}
```
これで `~/.cdgitroot` ファイルにgit/hgのトップディレクトリが保存されるようになります。
ほぼ同じような操作になるので、cddを参考にさせていただきました。
chpwdのところは、`add-zsh-hook chpwd hoge` のほうがいいのかな？

あとはpecoに素直にかませるだけです。

``` sh
function peco-cdgitroot() {
    local selected_dir=$(_echo_gitroot | peco )
    if [ -n "$selected_dir" ]; then
        BUFFER="cd ${selected_dir}"
        zle accept-line
    fi
    zle clear-screen
}

zle -N peco-cdgitroot

bindkey '^@' peco-cdgitroot
```
array_rand関数の結果を日付ごとに一意に固定する

# 毎日 `00:00` のタイミングで更新する

**[array_rand](http://php.net/manual/ja/function.array-rand.php)** 関数は **[srand](http://php.net/manual/ja/function.srand.php)** 関数で設定されるシードをそのまま利用しているので、ここに当該日の00:00ごとに更新される固有な値を与えれば、日付ごとに結果を固定して取得することが出来ます。また、それ以降の処理に影響を及ぼさないように、再度シードをランダムに初期化しています。

```php:関数定義(日付形式文字列を整数変換したものを利用する場合)
function daily_array_rand(array $array, $num = 1) {
    $datetime = new DateTime('now', new DateTimeZone('Asia/Tokyo'));
    srand($datetime->format('Ymd'));
    $retval = array_rand($array, $num);
    srand();
    return $retval;
}
```

```php:関数定義(タイムスタンプを利用する場合)
function daily_array_rand(array $array, $num = 1) {
    $datetime = new DateTime('today', new DateTimeZone('Asia/Tokyo'));
    srand($datetime->getTimestamp());
    $retval = array_rand($array, $num);
    srand();
    return $retval;
}
```

ここでは `0.png` `1.png` ... `9.png` からランダムに1つ選択してみます。同日中であれば何度リロードしても同じ結果が得られるはずです。

```php:使い方
$range = range(0, 9);
printf('<img src="%1$d.png" alt="%1$d番の画像">', $range[daily_array_rand($range)]);
```

# 更新されるタイミングを `00:00` 以外の時刻に指定する

もし `00:00` 以外のタイミングで更新したい場合は、以下のように関数を拡張しましょう。

```php:関数定義(日付形式文字列を整数変換したものを利用する場合)
function daily_array_rand(array $array, $num = 1, $at = '00:00') {
    $timezone = new DateTimeZone('Asia/Tokyo');
    $interval = new DateInterval((new DateTime($at, $timezone))->format('\P\TH\Hi\Ms\S'));
    $datetime = new DateTime('now', $timezone);
    srand($datetime->sub($interval)->format('Ymd'));
    $retval = array_rand($array, $num);
    srand();
    return $retval;
}
```

最初に示した例を朝7時のタイミングで更新するように変更してみます。

```php:使い方
$range = range(0, 9);
printf('<img src="%1$d.png" alt="%1$d番の画像">', $range[daily_array_rand($range, 1, '07:00')]);
```
Canvasで五芒星を書く

Canvasで五芒星を書くスクリプトを書いた。

どうやって5つの座標を割り出すのか頭をひねってたけど、円を五分割すれば座標が出ると描いてあってなるほどと膝をうった。数学関連の引き出しがあまりにも少ないのでこういうことが起きる。数学も勉強し直してみたいな。

```js:createStar.js
createStar("test",150,100,50,"yellow");

function createStar(selector,x,y,r,color){
    //五芒星の時の角度
    var c1 = createCordinate(r,-90);
    var c2 = createCordinate(r,-234);
    var c3 = createCordinate(r,-18);
    var c4 = createCordinate(r,-162);
    var c5 = createCordinate(r,-306);
    
    var canvas = document.getElementById(selector);
    
    if(canvas == null){
        canvas = document.getElementsByClassName(selector)
    }
    
    var context = canvas.getContext('2d');
    context.fillStyle = color;
    context.lineWidth = 0;
        
    context.beginPath();
    context.moveTo(x,y-r);
    context.lineTo(c1.x + x, c1.y + y);
    context.lineTo(c2.x + x, c2.y + y);
    context.lineTo(c3.x + x, c3.y + y);
    context.lineTo(c4.x + x, c4.y + y);
    context.lineTo(c5.x + x, c5.y + y);
    context.closePath();
        
    context.fill();
    //context.stroke();
    
    function createCordinate(r,angle){
        var x = r * Math.cos(angle / 180 * Math.PI);
        var y = r * Math.sin(angle / 180 * Math.PI);
        
        return {
            "x" : x,
            "y" : y
        };
    }
}
```

こんなのが簡単に描けます。

![vitnam.png](https://qiita-image-store.s3.amazonaws.com/0/11510/2878c23c-fe08-71dd-4f7b-a6ede244be96.png)

赤い背景に黄色い星を描くだけでヴェトナムの国旗のできあがり。

jsdoitに置いてあります。
http://jsdo.it/tomato360/rfgJ
RiotGames/rbenv-cookbookでgem install railsした時にハマったこと

Chefのサードパーティレシピ管理Berkshelfで使われている[RiotGames/rbenv-cookbook](https://github.com/RiotGames/rbenv-cookbook)を使ってRails入れようとしたらハマった。

##ハマったとこ
rbenv, ruby共に入れられたけど

```site-cookbook/my_cookbook/recipes/default.rb
rbenv_gem "rails" do
  ruby_version "x.x.x"
  version "x.x.x"
end
```
のところでエラー。


##結論
```site-cookbook/my_cookbook/recipes/default.rb
include_recipe "rbenv::rbenv_vars"

```
と

```site-cookbook/my_cookbook/recipes/default.rb
execute "resolv.option" do
  command "echo 'options single-request-reopen' >> /etc/resolv.conf"
  not_if "cat /etc/resolv.conf | grep 'options single-request-reopen'"
  action :run
end
```
を追記すればおｋ。

##rbenv-varsとは?
Rubyのプロセスを生成する前に、グローバルおよびプロジェクト固有の環境変数を設定することができる、rbenvためのプラグイン。
>sstephenson/rbenv-vars · GitHub : https://github.com/sstephenson/rbenv-vars


どうやらPATHが通ってなかったんだなー(´・ω・｀)

##single-request-reopenとは?
>RHEL6/CentOS6では、single-request-reopen を必須にしたい… : http://www.kunitake.org/chalow/2012-11-02-1.html

CentOS6はIPv6が有効になっているとなるらしい(；・∀・)

##書いたところ
```
# Berksfile
source "https://supermarket.getchef.com"

cookbook "rbenv"
```

```site-cookbook/my_cookbook/metadata.rb
# 追加
depends 'rbenv'
```


```site-cookbook/my_cookbook/recipes/default.rb
include_recipe "rbenv::default"
include_recipe "rbenv::ruby_build"

# Rails インストール時に最強に時間が掛かるのでとりあえず resolvにsingle-request-reopen設定。
# Vagrant + Chef Solo + Berkshelf で rbenv + Rails + Passenger をインストールした話 - ichidou のブログ : http://ichidou.hatenablog.com/entry/2014/02/27/021659
execute "resolv.option" do
  command "echo 'options single-request-reopen' >> /etc/resolv.conf"
  not_if "cat /etc/resolv.conf | grep 'options single-request-reopen'"
  action :run
end

rbenv_ruby "2.1.3" do
  global "true"
end

rbenv_gem "rails" do
  ruby_version "2.1.3"
  version "4.1.6"
end

```

##エラー内容(一部)
```
Running handlers:
[2014-10-29T03:12:07+00:00] ERROR: Running exception handlers
Running handlers complete
[2014-10-29T03:12:07+00:00] ERROR: Exception handlers complete
[2014-10-29T03:12:07+00:00] FATAL: Stacktrace dumped to /var/chef/cache/chef-stacktrace.out
Chef Client failed. 20 resources updated in 1263.996965772 seconds
[2014-10-29T03:12:07+00:00] ERROR: rbenv_gem[rails] (rails_install::default line 25) had an error: Mixlib::ShellOut::CommandTimeout: Command timed out after 600s:
Command execeded allowed execution time, process terminated
---- Begin output of /opt/rbenv/versions/2.1.3/bin/gem install rails -q --no-rdoc --no-ri  -v "4.1.6"  ----
```

環境
ローカル: Mac
リモート: Vagrant(CentOS6.5)
cortex.js: 監視可能なネストできるオブジェクト

[mquan/cortex](https://github.com/mquan/cortex "mquan/cortex")

副作用が加えられるとコールバックを発火するオブジェクトを作れる。ネストしたオブジェクトもとれる。

Vue.jsの$dataを知っている人は、getter/setterが専用に置き換えられたそれだと思えばよい。逆に言えばそれだけしかしないのだが。

## 何に使うの

JSのMVW用のミドルウェア。README見る限り、Reactと一緒に使うのを想定しているが、APIを見る限り、別にそれに限ったものでもない。役割はモデル層だけに限定される。

とはいえ、ViewModel的に使うのが一番適していると思われる。

## 使い方

```js
var Cotex = require('cortexjs');
var c = new Cortex({a:1, b: [1], c: {d: 2}});
c.on('update', function(c){
  console.log('updated', c.val());
});

c.a.val() //=> 1
c.b.push(2); //=> modified and fire
c.c.d.set(3);//=> modified and fire

```
【SublimeText】フォルダ内一括検索/置換

## フォルダ内検索
1. メニューから Find > Find in Files...を選択 (Mac：⌘＋Shift＋F)<br>
2. 画面の下に、以下赤枠のようなフォームが表示されます。<br>
![cap1.png](https://qiita-image-store.s3.amazonaws.com/0/49675/86aee5cc-06fc-a897-a69c-e37808379088.png)

3. ①に検索したいワードを入力<br>
4. ②の1番右 ... > Add Folder から、検索対象とするフォルダを選択<br>
5. エンターを押すと"Find Results"というタブが開き、検索ワードが含まれるファイルが一覧で表示されます。<br>
![cap2.png](https://qiita-image-store.s3.amazonaws.com/0/49675/6fd5f2e8-5f09-0080-6412-32225aad32e2.png)<br><br>
(このとき、フォーカスされたワードをダブルクリックすると、対象ファイルが別タブで開き、更に検索ワードの行まで飛んでくれます。便利...)

## フォルダ内置換
1. 1, 2までは検索と同様の手順です。
![cap3.png](https://qiita-image-store.s3.amazonaws.com/0/49675/37938f72-3510-e938-83a7-3e8ba18c7c4e.png)

3. ①に置換前のワードを入力
4. ②の1番右 ... > Add Folder から、置換対象とするフォルダを選択
5. ③に置換後のワードを入力
6. ③の1番右 Replaceをクリックすると、以下のような確認アラートが出ます。右側の「Replace」を押すと置換処理が実行されます。
![replace.png](https://qiita-image-store.s3.amazonaws.com/0/49675/c3b1659c-386e-748c-8033-3f2ab9d0ed3d.png)
7. 置換された状態のファイルが別タブで開きます。置換を確認してOKだったら保存して完了です。
R の foreach で並列処理するとき、クラスタを implicit にする #rstatsj

R の foreach パッケージで並列処理するとき、通常は次のように書きます。

```r:R
library(doParallel) # foreach も読みこまれる

cl <- makeCluster(detectCores())
registerDoParallel(cl)
foreach(i = 1:3) %dopar% {
  rnorm(i)
}
stopCluster(cl)
```

しかし、`doParallel` を使う場合、もっと簡潔に書く方法が用意されています。
並列計算用のクラスタオブジェクト `cl` を用意せず、非明示的に処理する方法です。

```r:R
registerDoParallel(detectCores())
foreach(i = 1:3) %dopar% {
  rnorm(i)
}
stopImplicitCluster()
```

`registerDoParallel()` の引数に直接クラスタ数を書き込みます。
クラスタの終了処理は `stopImplicitCluster()` で行います。

ただし、現状の `stopImplicitCluster()` にはバグがあり、このままでは動きません。
詳しくは次の記事を参照してください。

- [doParallel関数に直接ワーカープロセス数を指定するとゾンビプロセスが残る件](http://d.hatena.ne.jp/sfchaos/20140923/p1)

したがって、次のような関数 `stopImplicitCluster2()` を自分で書く必要があります。

```r:R
stopImplicitCluster2 <- function() {
  options <- doParallel:::.options
  if (exists(".revoDoParCluster", where = options) &&
        !is.null(get(".revoDoParCluster", envir = options))) {
    stopCluster(get(".revoDoParCluster", envir = options))
    remove(".revoDoParCluster", envir = options)
  }
}
```

これを使えば、次のように並列処理を簡潔に書くことができます。

```r:R
registerDoParallel(detectCores())
foreach(i = 1:3) %dopar% {
  rnorm(i)
}
stopImplicitCluster2()
```

[以前の記事](http://qiita.com/hoxo_m/items/f08b015bc9897d98775d)で紹介した `on.exit()` 関数を使うと、次のようになります。

```r:R
ExecuteParallelProcess <- function() {
  registerDoParallel(detectCores())
  on.exit(stopImplicitCluster2()) 
  foreach(i = 1:3) %dopar% {
    rnorm(i)
  }
}

ExecuteParallelProcess()
```

以上です。

### 関連記事

- [foreach の registerDoSEQ() について](http://qiita.com/hoxo_m/items/aacdf912559412b2b61b)
- [R の foreach で並列処理するとき on.exit() が便利](http://qiita.com/hoxo_m/items/f08b015bc9897d98775d)
- [R の foreach で並列処理するときに乱数を固定する](http://qiita.com/hoxo_m/items/6dfd7def6574fd485a6c)
- [R の foreach を自分用にカスタマイズする](http://qiita.com/hoxo_m/items/f3a3a27a9aa2fa9f7813)
- [foreach の .multicombine 引数について](http://qiita.com/hoxo_m/items/b2bdb25d60f1e806010d)
プロンプト(ターミナル)からエクスプローラー(nautilus)を開く方法まとめ

# どういうときに使える？
プロンプトでゴニョゴニョ移動していて（たとえばファイル探していたり）、
そのファイルをマウスでなんかしたい（たとえば、wikiに添付したい）
ときとかに一々エクスプローラーを開いてパスを貼っつけて、、なんてやっている人向け。

# HowTo
「.」の部分は開きたいパスを指定。以下の例「.」はカレントdirを開く
## windows
```
start .
```

## linux(gnome)
```
xdg-open .
```

## cygwin
```
cygstart.exe .
```
## Mac OS X
```
open .
```

# まとめ
プラットホームによってまちまちになるので、aliasを作っておくとイイかもですね。
Windows の Wireshark から Linux のホストをリモートキャプチャー

plink 経由でリモートホストで tcpdump を実行し、`-w` の出力先を標準出力(`-`) にして Wireshark にパイプします。

```
plink ore@192.168.0.123 sudo tcpdump -nn -U -i eth0 -s 0 -w - not port 22 | "C:\Program Files\Wireshark\Wireshark.exe" -k -i -
```

**参考**

 - [Remote capture via ssh and pipe - Wireshark Q&amp;A](https://ask.wireshark.org/questions/23609/remote-capture-via-ssh-and-pipe "Remote capture via ssh and pipe - Wireshark Q&amp;A")
Install latest Docker on Ubuntu 14.04

Too simple that nothing else to write.All commands are listed below.

```shell-session

$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=14.04
DISTRIB_CODENAME=trusty
DISTRIB_DESCRIPTION="Ubuntu 14.04.1 LTS"

$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9

$ sudo sh -c "echo deb https://get.docker.com/ubuntu docker main\
> /etc/apt/sources.list.d/docker.list"

$ sudo apt-get update

$ sudo apt-get install lxc-docker
```
次世代GUIコーディングツールのMACAW


![Screen Shot 2014-10-29 at 18.31.49.png](https://qiita-image-store.s3.amazonaws.com/0/49526/d4e8e14e-f30a-3159-a7d9-28b43826200c.png "Screen Shot 2014-10-29 at 18.31.49.png")

前々から話題になっていた、[MACAW](http://macaw.co/)で遊んでみました。

Webコーディングを根本的から変える製品のようですが、
実態は、いつも僕らがやっているサイトコーディングをGUIで出来るようにしたものです。

MACAWできちんとしたサイトを作るためには、
やはり、HTMLとCSSの知識が無いときちんと出来ないし、
最終的には、コードを打って調整しないといけないから、
コードの知識は絶対に必要だと思います。

あと、簡単なペラ一だったら爆速で作れますが、
高度に制御されたWebアプリを作るのはかなり難しくなってくると思います。

## MACAWの特徴
おおきな特徴はこの３つだと思います。

1. ネイティブアプリだということ。
1. シンプルな機能群
1. Component化してくれる

### ネイティブアプリだということ。

最初全然起動しなくて殺してやろうかと思った。
やっと起動して色々いじいじしてみたら、結構使いやすいいいじゃん。

ストレスフルな点は今後慣れやアップデートで良くなるだろうと思って、大人な対応をしてみた。

Photoshopより体感で1.5倍ほど重い。
ネイティブでこの重さって、おそらく中身はWebkitエンジンじゃないかと思われる。

でもファイルの管理とかPhotoshopで書きだしたやつの反映とか、Webアプリよりスムーズな点が多くてよいところだと思う。

作ったものは、FTPツールで自分のサーバにアップ。

### シンプルな機能群

いじれるCSSが絞られていて、基本的にシンプルなイメージです。(display:inline-block)が出来なかったりムカつく点はありますが、基本的に良いです。

というか、シンプルというより、バグが取れなくて表示してない機能が多い可能性が多分にあるんじゃないかな。

![Screen Shot 2014-10-29 at 18.37.51.png](https://qiita-image-store.s3.amazonaws.com/0/49526/5a06a784-6e1c-9068-464d-0e5522c9b721.png "Screen Shot 2014-10-29 at 18.37.51.png")
めんどくさいDropShadow系も簡単にしてくれる

基本的に、HTMLとCSSをGUIで出来ますよっていうツールなので、
それ以外の機能はあんまりつけて欲しくないのが正直な所。

といううか、簡単にCSSが出来ればいいやって感覚なので、正直HTMLは手打ちでもOKなんですよ。
それが出来ないのは結構渋いですね。
まぁ、MACAWに限った話では無いのですが。

### Component化してくれる。

![Screen Shot 2014-10-29 at 18.34.44.png](https://qiita-image-store.s3.amazonaws.com/0/49526/772bcbe8-ff6c-55b1-6dc2-57500a0714ae.png "Screen Shot 2014-10-29 at 18.34.44.png")


コレ多分便利ですね。
基本Webってコンポーネントの塊なんで、ほかのプロジェクトで使いまわせるのはよいよい。

## MACAWのいいところ

### ネイティブアプリだから安心して業務でも使える。
Webアプリとか怖すぎて業務で使えない。

### 書きだされるデータ達が超シンプル

headタグはこれだけ

```
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="initial-scale=1.0">
  <title>index</title>
  <link href="http://fonts.googleapis.com/css?family=Fauna+One:400,400|News+Cycle:300|Open+Sans Condensed:|Muli:300" rel="stylesheet" type="text/css">
  <link rel="stylesheet" href="css/standardize.css">
  <link rel="stylesheet" href="css/index-grid.css">
  <link rel="stylesheet" href="css/index.css">
</head>
```

footer以下もこれだけ

```
  <script src="js/jquery-min.js"></script>
  <script src="js/index.js"></script>
  <script src="js/rimages.js"></script>
</body>
</html>
```

もちろんカスタマイズも可能。

Bodyのところも、ちょっと余計なクラスがつくくらいで、後からいじりやすい。


### デザイナーがコーディング勉強するのにちょうどいいんじゃないかな。
これで修行してもらえば、よりよい関係を築ける気がしている。

## MACAWのクソなところ

- 重い（⌘+zくらいはまともに作ってよ・・・）
- 世界観が独特 慣れればいいけど・・・
- これだけでデザインするのは無理。せいぜいフォトショで来たデザインを爆速でカタチに出来るやーつ
- 生コード手打ち編集が出来ない。

まぁ、今後に期待ですかね。
UbuntuでAndroid Studioでビルドができない時の対処法メモ

## Android SDKのプログラムに実行権限がついていない

つけてください。

## Adb not respondingとか言われる

[ここ](http://stackoverflow.com/questions/16701113/adb-not-responding-with-android-studio-on-ubuntu)を参考に。
どうやらOSが64bitなのがいけないらしい。

```bash
sudo apt-get install ia32-libs
```

## libzがどーのこーの言われる

[ここ](http://askubuntu.com/questions/396473/error-with-libz-so-1-on-android-studio)を参考に。
よくわかんないけど入れたら直った。

```bash
sudo apt-get install lib32z1
```
tcpdump少しだけ使ってみた

## 参考

* [Network - 超絶初心者むけtcpdumpの使い方 - Qiita](http://qiita.com/tossh0095/items/4cd33693965ef231bd2a)
* [ngrepでパケットキャプチャ - Qiita](http://qiita.com/tukiyo3/items/76a554050c6fd0867acf)

## とりあえず取得してみる

```bash:
tcpdump
```

## 取得内容をASCII表示

```bash:
tcpdump -A
```

## 

## br0を通過するパケットのみ取得

```bash:
tcpdump -i br0
```

## 特定のポートに絞って取得

```bash:
tcpdump src port 3000
tcpdump src port 3000 and host 192.168.100.67

tcpdump dst port 3000
```

## wiresharkで解析用に、ファイルに書き出す

```bash:
tcpdump -w test.pcap
```

## 16進数で出力

マニアックすぎる。開発者向けか。

```bash:
tcpdump -X
tcpdump -Xn
```
xcodeのいろいろなエラー


Swiftで開発した際に出会った、いろいろなエラーについてのメモ。
（Xcode6.1を使用）

## not conform to protocol
[http://note862.blogspot.jp/2014/08/swift-type-viewcontroller-does-not.html]

* protocolを指定して、protocolで宣言したメソッドが定義されていない場合に発生。

##  has no initializers
[http://bribser.co.jp/blog/swift-optional-value/]

* 変数を宣言したら、末尾に「?」か「!」を必ずつけること。

## Could not insert new action connection
Interface BuilderでボタンをCtrl+ドラッグした際に発生。

* Product > Clean でクリーンしたら解消。
コマンドや技術用語の読み方、発音がわからない時に参考にするサイト

* [新版 UNIX 由来/読み方辞書](http://x68000.q-e-d.net/~68user/unix/unix-term-dic.html)
* [読み方｜YOMIKATA](http://yomikata.org/)
* [What is How do you pronounce IT?? - Definition from WhatIs.com](http://searchservervirtualization.techtarget.com/definition/How-do-you-pronounce-IT)
CentOS7の開発ツール同梱イメージ作ったら便利だった (897.9 MB)

[tukiyo3/centos7-devel](https://registry.hub.docker.com/u/tukiyo3/centos7-devel/)(897.9 MB)

```bash:
docker run -it -d --name centos7 tukiyo3/centos7-devel
docker exec -it centos7 bash
```

[CentOS7にfluentdをgemでインストール - Qiita](http://qiita.com/tukiyo3/items/d8b6d6adfcd93597186e)
のようにgem等のビルドに使うと、環境ごとにどのパッケージを追加しないとビルドできなかったっけ・・・？
ということが少なくなって良い。
Cocos Studio v2でpublish先のディレクトリを変更する方法

# はじめに
とりあえずMac版のみです。（たぶん、Windows版も同じかな？）

デフォルトだとHogehoge.ccs（Cocos Studioプロジェクトファイル）と同じディレクトリにある`res`ディレクトリ下にpublishしてしまいます。

CocosStudioでpublishして即Cocos2d-x側に反映したいので`Resources`ディレクトリに変更したいという感じです。

このパスの変更が、現在のバージョンでは**CocosStudio上では行えない**ようなので、コンフィグファイルを直接いじります。

![スクリーンショット 2014-10-29 17.34.19.png](https://qiita-image-store.s3.amazonaws.com/0/40887/d99fa085-588a-6645-5613-d3a5d4179fc2.png)

# 変更手順
1. **CocosStudioを一旦閉じます**（終了時にコンフィグファイルを保存している挙動をしているので上書きされます）

2. `ccs`ファイルとセットで作成される、`cfg`ファイルを開いて`PublishDirectory`に好きなディレクトリを指定します（`res`を`Resources`に変更して保存）

3. CocosStudioを開いてもcfgが変更されないことを確認する

```:Hogehoge.cfg（変更前）
<Properties publishHasCocos2dxCode="False" publishIsUseCocosSourceCode="False" PublishDirectory="res" SolutionSize="640 * 960" />
```

```:Hogehoge.cfg（変更後）
<Properties publishHasCocos2dxCode="False" publishIsUseCocosSourceCode="False" PublishDirectory="Resources" SolutionSize="640 * 960" />
```

これで、いちいちpublish後にコピーする必要がなくなってとても楽です。

# おわり
たぶん、次のバージョンとか？いずれCocosStudio上で変更できるように修正されるとは思いますが一応こんな感じでディレクトリ変更できます。