OmniAICreator/Qiita-1.07M huggingface dataset:
Dashing調査結果


##Dashingとは
かっこいいダッシュボードを簡単に作成できるSinatraベースのダッシュボード用フレームワーク

###特徴
・Widgetのデータをリアルタイムに表示できる
・ドラッグ・アンド・ドロップでWidgetの並びを簡単に変更できる。

##ディレクトリ構成
>assets
画像やCSSなどを配置する

>dashboards
ダッシュボードのレイアウトを決めるためのerbファイルを配置する

>widgets
ダッシュボードで利用する各部品を配置する。この中は更にウィジェットごとにサブディレクトリがある。デフォルトでは、clock、comments、graph、iframe、list、meter、number、text が用意されている。もちろん自分で作成することも可能

>jobs
データ等を自動で定期的に取得し、ウィジェットに対してデータを送信するためのジョブファイルを配置する。デフォルトで配置されている4つのジョブはいずれもダミーのジョブだが、もちろん自分で作成すればOK。このディレクトリの中に配置したジョブは自動で実行される

>lib
共通ライブラリを配置する

>public
公開用の静的ファイル(html)を配置する

>リンク元：Dashingで簡単にダッシュボードを作る方法：
http://www.ryuzee.com/contents/blog/6861

### 作業内容
以下のリンクを参考に動かしてみました。
「かっこいいダッシュボードが簡単に作れるDashingがすごい」：
http://orangain.hatenablog.com/entry/dashing

##おまけ：ダッシュボードの導入例
・Wired：オフィスのトレンドは「クールな情報ダッシュボード」：http://wired.jp/2013/04/12/big-boards/
・データドリブンマーケティングを加速させるダッシュボード6選：http://dmj.underworks.co.jp/2014/06/24/datadriven-dashboard/

##参考資料
1. 公式サイト：http://dashing.io
2. Dashingで簡単にダッシュボードを作る方法：http://www.ryuzee.com/contents/blog/6861
3. かっこいいダッシュボードが簡単に作れるDashingがすごい：http://orangain.hatenablog.com/entry/dashing
4. モダンなダッシュボード用フレームワークDashing入門：http://blog.qnyp.com/2013/05/09/try-dashing/
5. Dashingのカスタムウィジェットを作成する：http://kimh.github.io/blog/jp/dashing/creating-custom-dashing-widget-ja/
6. docker で Dashing を触ってみた：http://inokara.hateblo.jp/entry/2014/04/06/075413
7. オフィスのトレンドは「クールな情報ダッシュボード」：http://wired.jp/2013/04/12/big-boards/
8. データドリブンマーケティングを加速させるダッシュボード6選：http://dmj.underworks.co.jp/2014/06/24/datadriven-dashboard/
PhpStormの使用メモリを増量して高速化させる方法(MacOS X10.9.5)

## PhpStormのメモリ不足時のエラー

![Fatal_Configuration_Problem_と_common_db_php_-_kpi_tool_-____PhpstormProjects_kpi_tool_.png](https://qiita-image-store.s3.amazonaws.com/0/46268/dcf6069d-1840-95e6-5afc-397df9086057.png)

## 解消法

+ idea.vmoptionsファイルをコピー

```
cp /Applications/PhpStorm.app/bin/idea.vmoptions ~/Library/Preferences/WebIde70/idea.vmoptions
```

+ ~/Library/Preferences/WebIde70/idea.vmoptionsを開き、Xms(起動時メモリ割り当て), Xmx(最大メモリ)を変更。

```
-Xms1024m
-Xmx2048m
-XX:MaxPermSize=512m
-XX:ReservedCodeCacheSize=256m
-XX:+UseCompressedOops
```

+ PhpStorm再起動
1ポイントは何mmでしょうか？

## 古き良き時代の答え
1ポイント = **0.35mm** 

1ポイント＝1ドット＝1ピクセルというのが大原則です。
ポイントがほぼ1/72インチであったことから、画面表示も72 dpi (dot per inch)にあわせて設計されました。これにより、画面にみたものと、印刷したものがほぼ同じになるという、WYSIWYGが実現されました。(What you see is What you get)

1インチは25.4mmなので、1ポイントは 1/72 inch = 0.35mmとなります。

## iOS開発をしている場合の答え 

1ポイント = **0.16mm 〜 0.21mm** 

画面サイズの多様化により、72dpiという前提は崩れ去りました。
Retina登場により、１ポイント=1ピクセルという前提は崩れ去りました。
iPhone6/6Plus登場により、1ドット=1ピクセルという前提も崩れ去りました。

What you see is not what you get anymore...

詳しくは下記の表参照

|端末	|画面幅(ポイント)	|画面幅(mm)	|1ポイントあたり(mm) |
|:------:|:------:|:------:|:------:|
|iPhone,3G,3GS|	320|	49.9|	0.16|
|iPhone4,4S|	320|	49.9|	0.16|
|iPhone5,5s,5c|	320|	49.9|	0.16|
|iPhone6|	375|	58.4|	0.16|
|iPhone6|	320|	58.4|	0.18|
|iPhone6 Plus|	414|	68.4|	0.17|
|iPhone6 Plus|	320|	68.4|	0.21|
|iPhone6 Plus|	375|	68.4|	0.18|
|iPad|	768|	147.8|	0.19|
|iPad mini|	768|	119.7|	0.16|

**画面幅の正確な情報を探しています。上記はppiから計算したものです**

ピクセルに関する情報については、[iPhone/iPad解像度早見表](http://qiita.com/tomohisaota/items/f8857d01f328e34fb551)としてまとめています。
ec2でサーバーの時間がずれた時の対応


```
[root@ip- ntp]# date
2014年 10月  7日 火曜日 01:00:31 UTC
```

時間がUTCになっている。yum updateでglibcが更新されるとUTCに戻る。
localetimeを直す

```
[root@ip- zoneinfo]# sudo cp /usr/share/zoneinfo/Japan /etc/localtime
```

ローカルタイムを日本にする。

```
[root@ip- zoneinfo]# date
2014年 10月  7日 火曜日 10:02:28 JST
```

日本時間に戻る。

参考：http://hack.aipo.com/archives/1967/
ViewPagerで3ページ以上使う場合にするべきこと


```java:MyActivity.java
viewPager.setOffscreenPageLimit(adapter.getCount() - 1);
```
デフォルトだと見えてない部分のページ数が1に設定されているらしく、全体として3ページ以上になる時は、  `ViewPager#setOffscreenPageLimit`を自分で設定しないと2ページめくる度にフラグメントがインスタンス化されてしまうみたい。
Recent Appsに残らないActivityを作る

# `excludeFromRecents`属性を使う

アクティビティがRecent Appsに表示されないようにするには、`activity`要素の`excludeFromRecents`属性に`true`を設定します。※デフォルトは`false`です。
そのアクティビティをrootに持つアクティビティスタックはRecent Appsに残らなくなります。

```xml:AndroidManifest.xml
<activity
    android:excludeFromRecents="true"
    ...他の属性....
>
```

# 注意点

## `noHistory`属性とは異なる

`noHistory `属性や`FLAG_ACTIVITY_NO_HISTORY`は、特定のアクティビティをアクティビティスタックに残すかどうかの設定です。
Recent Appsに残すかどうかを指定する`excludeFromRecents`属性とは別です。

- `noHistory `属性: 指定されたアクティビティをアクティビティスタックに残さない。
- `excludeFromRecents`属性: 指定されたアクティビティをrootに持つアクティビティスタックをRecent Appsに残さない。

## アプリがforegroundの時にはRecent Appsに表示される

`excludeFromRecents`属性に`true`を設定していても、そのアクティビティスタックがforegroundにある状態ではRecent Appsに表示されます。

`excludeFromRecents`属性は、どうやら「アクティビティスタックを閉じた後にRecent Appsに残さない」というものだからです。
ただし、Android 4.1以前ではRecent Appsの振る舞いが異なり、foregroundのものは表示されないようになっています。

## 他のアプリを起動する

他のアプリのアクティビティを開いたとしても、同じアクティビティスタックに積まれていたらRecent Appsには残りません。
インテントに`FLAG_ACTIVITY_NEW_TASK`を設定すれば解決できます。

```java:ExampleActivity.java
Intent intent = new Intent(...); // 他のアプリを開くような暗黙のintent
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
```

# その他

`FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS`というのもあるけど、こちらは調べていません。
ドキュメントにも詳細が書かれていないし、`excludeFromRecents`属性の実装のため存在しているだけで、使い所は無いような気がしています。
bash備忘録

## エラーしたら終了
戻り値に0以外が戻ったとき、そこで処理を終了し、以降を実行しない。

    set -e


## 実行シェルのディレクトリに移動する

    cd `dirname $0`

sh ./test.shは`cd .`
sh /home/user/test.shは`cd /home/user`
になる。

## デバッグ
`-x`オプションで実行。
変数の値、評価式などが標準出力される。

    sh -x ./test.sh

## 関数
呼び出し前に関数を書く。
引数は$で参照する。

```sh:
log()
{
  echo [`date`] $1 >> ./test.log
}

log "test start."
```

## 配列と繰り返し
配列はカッコで値を括る。
区切り文字は半角スペース。

```sh:
arr=(1 2 3 4 5)

for val in ${arr[@]}
do
  echo ${val}
done
```

## 現在年月日（yyyymmdd）の取得
バッチでよく使う。

```sh:
ymd=`date +%Y%m%d`
echo ${ymd}
```

## webサービスのヘルスチェック
httpの異常をwgetで検知する。
tomcatが稀に応答しなくなるシステムをcronで監視し、異常時にtomcatを再起動するようにした。
--delete-after：ファイルを作成しない

```sh:
wget --delete-after [検査対象url]
if [ $? = 1 ]; then
  # 異常時の処理
else
  # 正常時の処理
fi
```
最近試しているRailsのプロジェクト構築の手順

# 基本の手順

homebrewやrbenvは何かでインストールしている前提。

rbenvで新しいrubyのバージョンを入れたばかりの仮定。グローバルを汚さずに、なるべくプロジェクト内にgemを保持するポリシーで進める。

```bash
$ rbenv exec gem install bundler # bundlerのみインストール

# 以下新規プロジェクト作成
$ cd path/to/project # railsを作成したいプロジェクトのパスへ移動。無ければ作ること。
$ echo 2.1.3 > .ruby-version # rbenvのrubyバージョン指定
$ cat .ruby-version # 例えば下記のようになる
2.1.3
$ bundle init # Gemfileのひな形作成
$ vi Gemfile # railsの設定だけコメントされているはずなので欲しいバージョンに設定
$ cat Gemfile # 例えば下記のようになる
# A sample Gemfile
source "https://rubygems.org"

gem "rails", "~>4.0.2"
$ bundle install --path vendor/bundle # 自プロジェクト内指定でインストール
$ bundle exec rails new . -T # テストなしでインストール
      exist  
      create  README.rdoc
      create  Rakefile
      create  config.ru
      create  .gitignore
    conflict  Gemfile
Overwrite /path/to/project/Gemfile? (enter "h" for help) [Ynaqdh] # Yで上書き
$ bundle exec rails s # サーバー起動
```

もしも`Bundler could not find compatible versions for gem "sprockets"`が出たらGemfile.lockを削除し、改めてbundle installすると良さそう。
参考：http://qiita.com/fireowl11/items/7fa0a084857121398d44

もしもグローバルなruby環境にgemをインストールしてしまったら下記で綺麗さっぱりらしい。

```bash
$ rbenv exec gem list | awk '{print "rbenv exec gem uninstall " $1}' | sh -xv
```

参考：http://qiita.com/emadurandal/items/a60886152a4c99ce1017


# RSpecの準備

Gemfileに下記を記述して

```rb
group :test do
  gem "rspec"
  gem "rspec-rails"
end
```

```bash
$ bundle install
$ bundle exec rails g rspec:install
```


参考: http://tech.gmo-media.jp/post/45955244694/rails-rspec-model
DNSリクエストの再帰、非再帰問い合わせを iptables で判定して DROPする

IPv4のDNS udpパケットの再帰、非再帰問い合わせのRDフラグは、
31byte目にあるので下記で実現できた。

最初の 20byte は ipヘッダ、
その次の 8byte は udpヘッダ

特定のネットワークからの再起問い合わせをタイムアウトさせたい時に使う。


```/etc/sysconfig/iptables
1.非再帰問い合わせの DROP
-A INPUT -m string --hex-string "|00000001|" --algo bm --from 30 --to 34 -p udp --dport 53 -j DROP

2.再帰問い合わせの DROP
-A INPUT -m string --hex-string "|01000001|" --algo bm --from 30 --to 34 -p udp --dport 53 -j DROP
[Tween] 昔良く見たフェードアウトする感じの敵の消滅エフェクト

![33a969bb14b99957e5df8608abd40308.png](https://qiita-image-store.s3.amazonaws.com/0/12129/945fc4fd-3a3e-daa5-9ee3-660feab913e8.png)

NGUI使ってると入ってる奴
これをフェードアウトしたいオブジェクトにくっつける。

スタート押していきなりフェードアウトして欲しくないからアクティブを切る

再生したい時は

```csharp

var tweenColor = sprite.GetComponent<TweenColor>();
tweenColor.Play (true);
tweenColor.ResetToBeginning ();
```
な感じのコードを書く


再生するとこんな感じになる
http://gyazo.com/ede50a727bdbc365f1544708a2ec9ac5
クラス変数にはどうアクセスすべき?


インスタンスメソッドからクラス変数にアクセスするには、`クラス.変数名`とすればよい。

```python:
In [1]: class A(object):
   ...:     TEST = "test"
   ...:     def test(self):
   ...:         print(A.TEST)
   ...:

In [2]: a = A()

In [3]: a.test()
test
```

実は`self(インスタンスメソッドの第一引数)`経由でもクラス変数にアクセスすることが可能である。

```python:
In [4]: class A(object):
    TEST = "test"
    def test(self):
        # self経由でもアクセスできる。
        print(self.TEST)
   ...:

In [5]: a = A()

In [6]: a.test()
test
```

`self`でアクセスする場合、クラス変数が不変(読み込みのみ)の場合は特に問題ない。(注:PythonはJavaでいうfinalに相当する機能がないため、あくまで書き変えをしないで扱いましょうという紳士協定)
しかしクラス変数を可変にしたい場合、気をつけないと「クラス変数を書き変えたつもりが同名のインスタンス変数を定義した」ということが起こりうる。

```python:
# A.TESTではなくa.TESTに代入してしまった。
In [7]: a.TEST = "instancetest"

# クラス変数(A.TEST)ではなくインスタンス変数(a.TEST)が参照される。
In [8]: a.test()
instancetest
```

確実にクラス変数にアクセスする、という意味では`クラス.変数名`が良い気がするが、クラス名の変更に脆い。
そこはリファクタリングツールに頼る、というのが正解なのだろうか?
Ansible get_url モジュールで、冪等性を考えてみる

Ansibleのモジュールを使っていて、get_urlモジュールの冪等性が気になったので動作を確認した。

# 何が問題か

get_urlモジュールは、wgetやcurlのように、外部からファイルをダウンロードしてくる訳だけど、ダウンロードに失敗してファイルが途中で切れていたりすると、その後のtar展開などで困る。

しかし、get_urlのデフォルト動作では、Playbookを再実行しても、壊れたファイルを見て「あ、もうダウンロード終わってるじゃん」となってしまい、ファイルを再取得してくれない。

おまけをつけると、ダウンロードしたファイルが更新された時だけ、その先のビルド処理を流したい。

# 解決方法

まず、get_url に sha256sum オプションを渡してあげる。

さらに `force=yes` を渡してあげる。

すると、ファイルが既にあったら、最初にsha256sumチェックサムを見てくれて、チェックサムが違っていたら再度ダウンロードしてくれるようだ。

tar.gz をダウンロードして、build ディレクトリに展開するまでの処理はこんな感じでOKだった。{{変数}}は、どこかで定義する方向で。

```yaml
---
- hosts: all
- tasks:
  - name: download some tarball
    get_url: url={{ download_url }} sha256sum={{ csum }}
             dest=~/some.tar.gz force=True
    register: downloaded_tarball

  - name: check the final result already exists
    stat: path={{ my_fruits }}
    register: st

  - name: find out if build is necessary.
    set_fact:
      need_to_build: "{{ st.stat.exists == False or st.stat.size == 0 or
                         downloaded_tarball | changed }}"

  - name: cleanup the build directory
    file: path={{ build_dir }} state=absent
    when: need_to_build

  - name: prepare the build directory
    file: path={{ build_dir }} state=directory
    when: need_to_build

  - name: untar the tarball
    command: tar -xzf ~/some.tar.gz -C {{ build_dir }}
             --strip-components=1
    when: need_to_build
```


## 副次効果

sha256sum を渡すと、「ダウンロード元のファイルがいつの間にか更新されてた」といった場合に、Playbookがそこで失敗するから気づくことができる。

サイトでは、some-latest.tar.gz みたいな形でファイルをダウンロード可能にしていることも多いので、なにげに便利。


## sha256sum?

なんで、md5sumじゃなくてsha256sumなの？という気もするけれど、単に実装されていないだけの模様([一週間前にPRがcloseされた](https://github.com/ansible/ansible/pull/8201))。そのうち、普通に md5sum も利用できるようになりそう。

sha256sum は以下のコマンドで取れる。CentOS7の場合。

```
$ sha256sum /etc/passwd
5d48adec53a47b0a8e7025f21f8a9ad8f6694cfbc139a0f13eb69e4b04a49272  /etc/passwd

$ rpm -qf `which sha256sum`
coreutils-8.22-11.el7.x86_64
```

# 結論

冪等性が大切なときは、とりあえず、get_urlにチェックサムと`force=yes`オプションを渡すのがよさそう。

この手のツールでは「冪等性」という言葉をよく使うのだけれど、やっぱり書き方次第、書き手の気配り次第なんだと思う。
Ansibleでsshユーザを指定する



## sshユーザを指定してansibleを実行する

* インベントリファイルでsshユーザを指定する
* `ansible-playbook` 実行時にオプション `-k -c paramiko` してパスワードを入力する

### 設定ファイル

```:hosts
[web]
192.168.43.52

[db]
192.168.43.53

[all:vars]
ansible_ssh_user=vagrant
```

```:ansible.cfg
[defaults]
hostfile = ./hosts
```

```:playbook.yml
---
- hosts: all
  sudo: yes
  vars:
    password: ****
  tasks:
    - name: add a new user
      user: name=hoge password={{password}} state=present
```

### 実行

```bash
ansible-playbook playbook.yml -k -c paramiko
```


## TIPS

### ssh関連の設定

```:hosts
[webservers]
192.168.43.52

[all:vars]
ansible_ssh_port=22
ansible_ssh_user=ansible
ansible_ssh_pass=p@ssW0rd
ansible_sudo_pass=p@ssW0rd
```

### インベントリファイルでの指定方法

```:hosts
[web]
192.168.43.52 ansible_ssh_user=vagrant

[db]
192.168.43.53

[db:vars]
ansible_ssh_user=vagrant

[all:vars]
ansible_ssh_user=vagrant
```


## 参考

* [AnsibleでのSSH接続ユーザー指定方法](http://qiita.com/NewGyu/items/6a6ba033588514dbca9a)
* [ansibleでSSHのユーザ、パスワードを指定する方法](http://qiita.com/suin/items/ab40779347c910a74d05)
* [ansibleでvps初期設定](http://blog.ieknir.com/blog/beginning-conoha-vps-with-ansible/)
EBCDIC

# EBCDICとは
IBMのあれ
http://ja.wikipedia.org/wiki/EBCDIC

# ソースコード
```clj:ebcdic.clj
(import [java.nio.charset Charset])
(def string "ABJ9 &!a/")
(def bytes (.getBytes string (Charset/forName "cp930")) )
(map #(Integer/toHexString (bit-and % 0xff)) bytes)
```

![スクリーンショット 2014-10-07 0.55.50.png](https://qiita-image-store.s3.amazonaws.com/0/39243/eac343fb-028e-0129-a894-be40e85dd1cf.png)
docker1.3ではdocker stopしてもIPとポートを維持する。

##注意
結局このPullリクエストは後続のバージョンでも反映されることはなかったようです。

##記事
この変更、凶悪かも。
https://github.com/docker/docker/pull/8297

dockerの次バージョンからdocker stopしてもコンテナのIPとpublicなポートを維持するようになるようです。
docker rmしないと解放してくれません。dockerサービスを再起動した場合などもちゃんと状態を復元するみたい。

同じ役割を持つコンテナを立ち上げる場合は古いコンテナをstopだけでなく削除しておかないといけないですね。
aspnet_compilerの怪【正体見たり枯れ尾花】

現在業務で使用しているサーバはwindows server 2008 R2 64bitである。
そのサーバでwebアプリをビルドして社内に公開しているのだが、どうしても納得がいかないことがある。

公開のおおまかな流れは以下のとおり。
1. ビルド先にあるファイル、フォルダの削除
2. ビルド(**%windir%/Microsoft.NET/Framework/aspnet_compiler.exe**使用)
3. 公開用フォルダのファイル、フォルダの削除
4. ビルドしたファイルを公開用フォルダにコピー

各処理をそれぞれbatに記述して、改修後に公開しているのだが。
実はこの各bat、1つ1つマウスで実行している。
おそらく多くの方が、「**別のbatで1から順にCALLで呼べばよい**」と思うだろう。
私もそう思う。だが、どういうわけか、その方法を取ると2のビルド結果がマウスでの実行結果と異なるのだ。具体的に言うと、ビルドで出来上がるファイルが1つ1つ実行した場合より少ない。

まず私は、2のbatに記述したコマンドが間違っているのではないかと思った。そこでbatに記述したコマンドをコマンドラインに打ち込み実行してみた。その結果は・・・・・・期待通りの動作だった。コマンドは正しいようだ。

次に疑ったのが、各batの実行順序だ。現在、CALLでbatを呼んでいる。Google先生によれば、CALLで呼んだ処理が終わるまで、次の処理には入らない、らしい（前処理を待つ必要がなければSTARTを使えばいいらしい）。
そこで、下記のように各batを呼ぶ前にpauseを挟んだ。上から下に処理が走っていれば、3回のキープレスで処理は終わる。

```Batchfile:ALLCALL.bat
CALL 1.bat
pause
CALL 2.bat
pause
CALL 3.bat
pause
CALL 4.bat
```

数回実行してみたところ、どうもこの疑問が正解だったようだ。というのも、1つ目のbat終了後、最初のpauseに入る前に2.batが実行される。
しかしbat実行の順番、あるいは結果が終わる順番のせいだというなら、それを制御するためにCALLを使っているのに制御できていないということになる。あるいはaspnet_compilerだからなのか。今回の現象とは異なるところでbug報告も上がっているようだった。
正直これ以上私には分かりそうにない。もしこの現象についてご存知のかたがいらっしゃればぜひ教えていただきたい。

【2015/02/04 追記】
わかったのでご報告。
原因はマカフィーのオンアクセススキャン。
どうも、このオンアクセススキャンが有効になっていると、aspnet_compiler（というよりかはプリコンパイルだろうか）がNullReferenceExceptionを吐く場合があるらしい。海外サイトにそういった投稿がいくつかあった。
試しに無効にして上記batを走らせると、何度やっても実行結果が変わらない。そしてその結果は期待通り。つまりこいつのせいだった。（数カ月前の私の憶測ははずれもいいところだった。）
可変長引数のログを出力する(C/C++, Android, Objective-C)

# 概要
色々な言語でログを吐こうと・・・。
C++ですらあまり使ったことのないけど・・・。
可変長引数を使った際のメモ。

ここでは#ifdefで切り分けて、
各言語の可変長引数用の出力メソッドを使います。

## ソースコード

### ヘッダーファイル

```
#include <stdarg.h>

class AN_Log {
public:
  AN_Log() {}
  virtual ~AN_Log() {}

  static void print(const char* format, ...);
}
```

### ソースファイル

```
#include "AN_Log.h"

#ifdef _CPP
#include <stdio.h>
#elif _ANDROID
#include <android/log.h>
#elif _IOS
#import <Foundation/Foundation.h>
#endif

void AN_Log::print(const char* format, ...) {
	va_list args;
	va_start(args, format);

#ifdef _CPP
	vfprintf(stderr, format, args);
#elif _ANDROID
	__android_log_vprint(ANDROID_LOG_DEBUG, "Tag", format, args);
#elif _IOS
	NSLogv([NSString stringWithFormat:@"%s", format], args);
#endif

	va_end(args);
}
```

## まとめ

今回、可変長引数のログ出力を調べた理由としては、
iOSアプリ開発にて、C++側で記述しているprintfではOrganizerには出力されなかったのが問題。
(Xcode上のデバッグコンソールにはprintfのログの出力されていたのだがOrganizerには出力されないらしい。)

そこで、
可変長引数をNSLogで出力する必要があったので、ついでにまとめました。

ちなみに動作確認はしてないので、
コピペで動かなかったらゴメンナサイ。

## おまけ

### vfprintf

```
int vfprintf(
	FILE *stream,
	const char *format,
	va_list argptr 
);
```

### \_\_android\_log\_vprint

```
int __android_log_vprint(
	int prio,
	const char *tag,
	const char *format,
	va_list args
);
```

### NSLogv

```
void NSLogv(
	NSString* format,
	va_list args
);
```
Railsのsaveメソッドでtrue/falseでなくオブジェクトを返したい場合

通常の場合ActiveRecordのsaveメソッドの戻り値はtrue/falseですが、そうでなく更新結果のオブジェクトを返したい場合以下のように記述するとできます

```ruby:
user = User.find(1)
user.tap(&:save)
```

これやるとsaveした結果が戻り値として返ってきます。githubのRailsの開発状況を眺めていたら、この話題があったので。。。
以上です。
Vagrant sahara を使ってみる


ゲスト OS をロールバック可能にするプラグイン。

### インストール

```bash
$ vagrant plugin install sahara
```

### コマンド

sandbox モード状態確認。

```bash
$ vagrant sandbox status
```

sandbox モード開始。

```bash
$ vagrant sandbox on
```

変更の取り消し。

```bash
$ vagrant sandbox rollback
```

変更の確定。

```bash
$ vagrant sandbox commit
```

sandbox モード終了。

```bash
$ vagrant sandbox off
```
Cocos2D-X 3.xでGLSLの使い方法

**新しいサンプルのプロジェクト**

```cpp:GameScene.cpp
bool GameLayer::init()
{
    ...
    // sourceSprite
    _sourceSprite = Sprite::create("HelloWorld.png");
    _sourceSprite->setPosition(Vec2(_screenWidth/2, _screenHeight/2));
    this->addChild(_sourceSprite);

    // apply gray effect to sprite
    this->greySprite(_sourceSprite);
}
```
```cpp:GameScene.cpp
void GameLayer::graySprite(Sprite * sprite)
{
    if(sprite)
    {
        GLProgram * p = new GLProgram();
        p->initWithFilenames("gray.vsh", "gray.fsh");
        p->bindAttribLocation(GLProgram::ATTRIBUTE_NAME_POSITION, GLProgram::VERTEX_ATTRIB_POSITION);
        p->bindAttribLocation(GLProgram::ATTRIBUTE_NAME_COLOR, GLProgram::VERTEX_ATTRIB_COLOR);
        p->bindAttribLocation(GLProgram::ATTRIBUTE_NAME_TEX_COORD, GLProgram::VERTEX_ATTRIB_TEX_COORDS);
        p->link();
        p->updateUniforms();
        sprite->setGLProgram(p);
    }
}
```

**Resourcesのファイルに　*gray.vsh*と*gray.fsh*　を入れます**

```glsl:gray.vsh
varying vec4 v_fragmentColor;	
varying vec2 v_texCoord;	
		
void main()			
{
	vec4 v_orColor = v_fragmentColor * texture2D(CC_Texture0, v_texCoord);
	float gray = dot(v_orColor.rgb, vec3(0.299, 0.587, 0.114));
	gl_FragColor = vec4(gray, gray, gray, v_orColor.a);
}				

```

```glsl:gray.fsh
attribute vec4 a_position;
attribute vec2 a_texCoord;
attribute vec4 a_color;
					

varying vec4 v_fragmentColor;
varying vec2 v_texCoord;
								
void main()	
{							
    gl_Position = CC_PMatrix * a_position;  // not CC_MVPMatrix
	v_fragmentColor = a_color;
	v_texCoord = a_texCoord;
}
```
SIerのTwitter事情 ２日目

# ○月×日
今日もExcelとにらめっこだ

つまらない。。。

先日作ったやつで、Twitterを見よう。

・・・見難い、実に醜い

せめて、交互に背景色を変えよう

色はここから選ぼう
http://www.colourlovers.com/palettes

背景色の変え方は簡単だ。

まずは色をつくる
`(XSSFColor. (Color. 203 249 192))`

そしたら
`.setFillForegroundColor`で色を当てる。

そんでもって`(.setFillPattern style (CellStyle/SOLID_FOREGROUND))`で塗りつぶしだ。

交互に背景色を変えるのは適当に2で割った余りが0の行を塗っておけばいいだろう。

# ソースコード（変更・追加箇所）
```clj:core.clj
(defn -main []
  (def timeline (get-timeline))
  (def tweets-size (count timeline))
  (def sheet (.createSheet wb))
  (dotimes [i tweets-size]
    (def tweet (first (drop (- tweets-size (inc i)) timeline)))
    (def row (.createRow sheet i))
    (def style (.createCellStyle wb))
    (.setFillForegroundColor style (XSSFColor. (Color. 203 249 192)))
    (.setFillPattern style (CellStyle/SOLID_FOREGROUND))
    (let [cell (. row createCell 0)]
      (.setCellValue cell (str (:name tweet) "@" (:screenName tweet)))
      (if (= 0 (rem i 2))
        (.setCellStyle cell style)))
    (let [cell (. row createCell 1)]
      (.setCellValue cell (:text tweet))
      (if (= 0 (rem i 2))
        (.setCellStyle cell style))))
  (save wb))

```

# 次の予定
Excel直接書き込みによるリプライ
（予定はあくまで予定です。ぜんぜん違うことやるかも。）

# リポジトリ
https://github.com/FScoward

良ければアドバイスください。

あぁ・・・そうそう
http://01e8c979c4e57f83dd63bf3d4a.doorkeeper.jp/events/14626
というものがあるらしい。（参加します。）
AngularJSからVue.jsに移行するガイド

最近話題のAngularJSですが、学習コストが辛いのが難点です。

チームでのWebアプリ開発に半年ほど利用していましたが、
「難しい」「辛い」「闇」という声が多かったので、
よりシンプルなVue.jsに移行することにしました。

![logo](http://vuejs.org/images/logo.png)

http://vuejs.org/

Vue.jsはAngularのコードを一部利用して作成されており、多くの点で共通した書き方が出来ます。
以下にご紹介します。

（カスタムDirective作るほど使い込んでいなかったので、あくまで初歩的なサンプルとなります。ご容赦ください）

##AngularJSの基本形

基本的に、バインドする変数やメソッドを$scopeに生やす形になります。

```
var Ctrl(function($scope) {

  //バインドする変数宣言
  $scope.message = "Hello, World";

  //メソッド宣言
  $scope.method = function(){/* 処理 */};

  //初期化処理はここにベタ書き
  init();
  hoge();
  huga();
  $scope.method();

});
```

##Vue.jsの基本形

基本的にJSONオブジェクトとして、バインディングする変数やメソッドを渡します。
$scopeに生やしていた変数は、data内に記述します。
また、バインド先の要素をelに指定します（そのためng-controllerやng-app相当のディレクティブがない）。

```
var app = new Vue({
  el: "#main",
  data: {
    message: "Hello, World"
  },
  methods: {
    method: function(){/* 処理 */}
  },
  ready: function(){
    //初期化処理はここに書く
    init();
    hoge();
    huga();
    this.method();
  }
});
```

##Directive

多くの組み込みDirectiveがVueにも用意されており、
基本的に「ng-＊」を「v-＊」に置き換えてヘルプを参照すればいいです。

ng-ifはv-ifに、ng-viewはv-viewに、ng-modelはv-modelに置き換えられます。


###例：ng-clickからv-onに置き換え

注意点として、ng-clickはv-onに置き換えられます。

####Angular版

```
<button ng-click="someMethod()">Hey</button>
```

####Vue版

```
<button v-on="click: someMethod()">Hey</button>
```

###例：ng-repeatからv-repeatに置き換え

ほとんど同じです。ネストも問題なく可能です。

####Angular版

```
<li ng-repeat="user in users">{{user.name}}</li>
```

####Vue版

```
<li v-repeat="user : users">{{user.name}}</li>
```



##$httpや$q

Vue.jsにはありません。jQueryや同等のライブラリで置き換える事になります。

$qは同等のライブラリ、qを使いましょう。
https://github.com/kriskowal/q

$http置き換えはjQueryのpost,getでもいいですが、superagentが薄くてお勧めです。
https://github.com/visionmedia/superagent


##AngularJS Batarangの代替は？

Vue.jsは、dataに指定したオブジェクトにgetter, setterを生やす仕様のため、
インスペクタで変数の内容を見ようとすると、getterとsetterだらけでひどいことになります。

Vue開発者のEvan YouさんがChromeエクステンションを作っていますので、利用しましょう。

https://github.com/vuejs/vue-devtools


##参考資料
[vue.js book](http://koba04.github.io/vuejs-book/)
[Vue.js概要？ - Qiita](http://qiita.com/asip2k25/items/bd4bdccd5201d542953c)
[Vue.js note](https://gist.github.com/koba04/9776792)
MiddlemanとBower一緒に使う


Middleman, 便利だけど
サードパーティ製のコンポーネントはgemじゃなくてBowerで管理したいなって気持ちの時に

## Bowerの設定

Middlemanで新しいプロジェクト作って
プロジェクトディレクトリに移動する

```shell
middleman init [Project Name]
cd [Project Name]
```

Bowerの初期設定をする
色々聞かれると思いますが適当に

```shell
bower init
```

`init`が終わったら`bower.json`というファイルができる

続いて`.bowerrc`というファイルを作って
コンポーネントをどのディレクトリにインストールするか設定する

```shell
touch .bowerrc
```

```json:.bowerrc
{
  "directory": "vendor/assets/components"
}
```

`directory`はそれぞれ好みで設定する
`.bowerrc`で特に指定しない場合、
インストールディレクトリは`bower_components`というところになる

## `config.rb`

MiddlemanでBowerで管理しているコンポーネントディレクトリ以下を
読むようにするための設定を`config.rb`に追記

```ruby:config.rb
after_configuration do
  bowerrc = JSON.parse File.read(File.join "#{root}", '.bowerrc')
  bower_dir = bowerrc['directory']
  sprockets.append_path File.join("#{root}", bower_dir)
end
```

### フォントファイル問題

[Middlemanのドキュメントによると](http://middlemanapp.com/jp/basics/asset-pipeline/#sprockets-%E3%81%AB%E3%83%91%E3%82%B9%E3%82%92%E8%BF%BD%E5%8A%A0)
Bower使う場合は上記のように`sprockets.append_path`してね、ということらしいけれど
この記述だけだと`bootstrap-sass`や`font-awesome`のフォントファイル（`.ttf`や`.woff`など）を
読み込んでくれないみたい

対策としてフォントファイルがある場所を直接`append_path`するといいみたいなので
パターンマッチでコンポーネントディレクトリ以下の
`bower.json`,`component.json`,`.bower.json`を探して
`main`に記述されているファイルのディレクトリを
`append_path`することにした

```ruby:config.rb
after_configuration do
  bowerrc = JSON.parse File.read(File.join "#{root}", '.bowerrc')
  bower_dir = bowerrc['directory']
  sprockets.append_path File.join("#{root}", bower_dir)

  Dir.glob File.join "#{root}", bower_dir, '**/*', '{bower,component,.bower}.json' do |f|
    bower = JSON.parse File.read(f), create_additions: false
    dirname = File.dirname f
    case bower['main']
    when String
      sprockets.append_path File.dirname(File.join(dirname, bower['main']))
    when Array
      bower['main'].each do |name|
        sprockets.append_path File.dirname(File.join(dirname, name))
      end
    end
  end
end
```

この辺りに関してはいろいろやり方があるみたいで
これがベストかどうかわからないけれど
とりあえずこれで`bootstrap-sass`や`font-awesome`のフォントファイルが参照できるようになった

## 参考

http://middlemanapp.com/jp/basics/asset-pipeline/
https://github.com/sstephenson/sprockets/blob/master/lib/sprockets/bower.rb#L43-L54
https://github.com/bower/json/blob/0.4.0/lib/json.js#L7
https://github.com/twbs/bootstrap-sass/issues/592
RDS(MySQL)でsubpartitionを利用している場合に注意すること

今日は台風とBugの日。
朝一で対応したRDS(MySQL5.6.19)が落ちた件。
前提
ストレージエンジン:Innodb
innodb_file_per_table:1
partition:バリバリ(一定期間でPurge)

・Metrics
FreeMemory減少
SWAP上昇

・Error_log

```
2014-10-05 12:25:53 26178 [ERROR] InnoDB: InnoDB: Unable to allocate memory of size 1208.

2014-10-05 12:25:53 2b119160d7002014-10-05 12:25:53 26178 [ERROR] InnoDB: InnoDB: Unable to allocate memory of size 1248.

2014-10-05 12:25:53 2b11913c4700 InnoDB: Assertion failure in thread 17254461035092 in file ha_innodb.cc line 17080
InnoDB: We intentionally generate a memory trap.
InnoDB: Submit a detailed bug report to http://bugs.mysql.com.
InnoDB: If you get repeated assertion failures or crashes, even
InnoDB: immediately after the mysqld startup, there may be
InnoDB: corruption in the InnoDB tablespace. Please refer to
InnoDB: http://dev.mysql.com/doc/refman/5.6/en/forcing-innodb-recovery.html
InnoDB: about forcing recovery.
12:25:53 UTC - mysqld got signal 6 ;
This could be because you hit a bug. It is also possible that this binary
or one of the libraries it was linked against is corrupt, improperly built,
or misconfigured. This error can also be caused by malfunctioning hardware.
We will try our best to scrape up some info that will hopefully help
diagnose the problem, but since we have already crashed, 
something is definitely wrong and this may fail.
```

signal 11 に並ぶお馴染みの signal 6。
いろいろ調べて辿り着いたBug。

[Bug #70641](http://bugs.mysql.com/bug.php?id=70641&thanks=3&notify=195)

あー条件に当てはまるわー(棒読み)。
最近データ量増えて、purge も追いついていなかったなー。
というか、この Bug 上げたの松信さんなのかー。
ということは、これは facebook で既に踏んだ Bug なのかな？
ともあれ、Fix した vsersion 5.6.21 はまだ RDS では提供していない。

現状対策
--

・partition の数を減らす
・多くのメモリを搭載したインスタンスタイプを利用
・purge の間隔短くする
・同時接続数を減らす

--

で様子見る。
dnsmapの恐怖！バレたくなかったらサブドメインは分かりにくいものにしておこう。

DNSのゾーン転送を許可しなければサブドメインがバレることは基本的にないのだけれど総当りされたりするとバレる。
dnsmapというツールはそれをしちゃうツールだ。怖い。恐怖。
もちろんサブドメインバレたらアウトなセキュリティってアレ過ぎてアレなわけだけど、それでも最初の障壁にはなるじゃん？
セキュリティって何段階も張っておくべきじゃん？
という考えのもとに、サブドメインも分かりにくい単語組み合わせとこうぜって話しでした。

以上。
【初心者向け】Jenkinsをとりあえず入れてみたい！(3)～プラグインを入れてみる～

[【初心者向け】Jenkinsをとりあえず入れてみたい！(1)](http://qiita.com/chihiro/items/6d5d076e1dda3ec20926)
[【初心者向け】Jenkinsをとりあえず入れてみたい！(2)～Jobを作ってみる～](http://qiita.com/chihiro/items/af1db90372605c4690c6)
に続きJenkins初心者向け記事第3弾です。
Jenkins初心者の私がやってみたいことをとりあえずやってみることが目的です。

今回はとりあえずプラグインを入れてみます！
Jenkinsはいろいろなプラグインが存在し、プラグインをいれることによってとても便利になります。
プラグインはJenkinsの管理画面からイントールすることもでき、簡単に入れられるものが多いようです。

今回は、[Extra Columns Plugin](https://wiki.jenkins-ci.org/display/JENKINS/Extra+Columns+Plugin)を入れてみます。
jobの一覧画面の項目を拡張することができます。


### プラグインを入れてみる！

1.　Jenkinsにプラグインをインストール
Jenkinsにプラグインをインストールします。
前回の記事の手順5にもあるようにしてコマンドラインでJenkinsを起動し、ブラウザを開きます。
Topページの左のメニューの「Jenkinsの管理」をクリックします。

![jenkins_menu_top.JPG](https://qiita-image-store.s3.amazonaws.com/0/45528/149c1ff4-85c6-5a53-d567-cdb873394e03.jpeg)

表示された項目の中の「プラグインの管理」をクリックします。

![jenkins_plugin.JPG](https://qiita-image-store.s3.amazonaws.com/0/45528/c30d7720-aeb9-97c8-518d-5d48e59d2fea.jpeg)

タブのなかから「利用可能」タブを選択し、「Extra Columns Plugin」を検索します。
右上のフィルターの検索窓で検索可能です。

![jenkins_Extra_Columns.JPG](https://qiita-image-store.s3.amazonaws.com/0/45528/f26a3f0c-18c2-21a5-ecd5-816480ff0e75.jpeg)

インストールします！
これで完了です。

2．　カラムを変更してみるためにビューを追加する
ビューとはjobの一覧画面(Jenkinsのトップページ)のことです。
最初はデフォルトですべてしかありません。

![jenkins_view_all.JPG](https://qiita-image-store.s3.amazonaws.com/0/45528/2171a476-705d-c3ab-0ebe-2e0efd5d135d.jpeg)

このビューを追加することで、追加したビューのカラムを変更できます。
すべてビューの横の「＋」ボタンで新しいビューを作成できます。

![jenkins_view_plugintest.JPG](https://qiita-image-store.s3.amazonaws.com/0/45528/a134d12d-76a2-7fe7-2632-21c979b9df1c.jpeg)

ビュー名を入力し、「リストビュー」にチェックを入れてOKボタンを押します。
そうするとビューの変更ページが表示されます。

![jenkins_view_custom.JPG](https://qiita-image-store.s3.amazonaws.com/0/45528/c77a03f6-b019-b9ad-fca2-9f28cb94aff7.jpeg)

ジョブフィルターを設定します。
今回は以前に作った「hello jenkins」を選択します。

![jenkins_job_filter.JPG](https://qiita-image-store.s3.amazonaws.com/0/45528/b3018e29-7574-d15b-7039-c30c701e2439.jpeg)

その下にカラムという項目があり、デフォルトのカラムがあると思います。
さらにその下に「カラムの追加」ボタンがあります。

![jenkins_plugin_coulum.JPG](https://qiita-image-store.s3.amazonaws.com/0/45528/91e15a34-4c9f-801b-671b-d9b0e416d729.jpeg)

さきほどインストールしたプラグインによって、ここに項目が追加されています。

試しに「ジョブの設定」を選択して保存してみましょう。
ビューページに戻ると、一番右端に設定のアイコンが追加されています。

![jenkins_view_plugintest_add.JPG](https://qiita-image-store.s3.amazonaws.com/0/45528/eddf52b1-0539-52d5-af48-c2e95b35114d.jpeg)

いままではいちいちプロジェクトを開いてからでなくては設定を開けませんでしたが、一覧ページから設定を開くことができるようになりました！


所要時間はQiitaを書きながら40分程度でしょうか。
思った以上に簡単でした！
おもしろそうなプラグインがたくさんあるので、また入れてみようと思います！
Yeomanで生成されるGrunt.jsを利用したlessのコンパイル方法


## `grunt-contrib-less`をインストール

```shell-session
$ npm install grunt-contrib-less --save-dev
```

*--save-dev* オプションをつけることで、ローカルの *node_module* にインストールされ、かつpackege.jsonにも自動的に追記される。

## `Grunt.js`を修正
修正ポイントは、以下。

### lessタスクを作成する。

```
・・・
grunt.initConfig({

    // Project settings
    config: config,

    // lessタスクの作成：開始
    less: {
        style: {
            options: { cleancss: true },
            src: 'bower_components/bootstrap/less/bootstrap.less',
            dest: 'bower_components/bootstrap/dist/css/bootstrap.css'
        }
    },
    // lessタスクの作成：終了
・・・
```

### watchタスクにlessタスクを追加する。

```
・・・
        watch: {
            // lessタスクの追記：開始
            less: {
                files: ['bower_components/bootstrap/less/*.less'],
                tasks: ['less'],
                options: {
                    livereload: true
                }            },
            // lessタスクの追記：開始
            bower: {
                files: ['bower.json'],
                tasks: ['bowerInstall']
            },

・・・
```

上記設定では、 *less* ファイルに変更が加わった後、 **less** タスクを実行した後、 **ブラウザをリロードする** ことが行える。
AnsibleからSlackに通知する


Ansibleを使ってデプロイしたときに、Slackに『デプロイ完了』みたいにログるのが、ちょっと面倒になったので、AnsibleからSlackに通知するようにしてみました。

## Ansible Slack Notification

[slack - Send Slack notifications — Ansible Documentation](http://docs.ansible.com/slack_module.html)

Ansible 1.6以上が必要なので、1.6未満の場合は、Ansibleをバージョンアップします。

### AnsibleをVer1.6以上にバージョンアップ

```bash
$ ansible --version
ansible 1.7
```

## Slack Incoming WebHooksの追加

下記、URLからチーム内の任意のチャンネルに対するIncoming WebHookを追加します。
[Incoming WebHooks](https://my.slack.com/services/new/incoming-webhook)

## Playbookの準備

デプロイ用のplaybookにSlack通知用の設定を追加します。

```yml:ansible/staging
[staging]
2xx.1xx.2xx.x1 ansible_ssh_user=sshuser

[staging:vars]
app_domain=example.com
app_root_path=/apps/example.com
app_user=appuser
app_group=admins

nginx_use_basic=true

### ここから追加
[local]
localhost ansible_connection=local

[local:vars]
app_url=http://example.com
```

```yml:ansible/deploy.yml
- hosts: staging
  sudo: true
  tasks:
    - include: roles/app/tasks/deploy.yml

# ここから追加
- hosts: local
  sudo: false
  tasks:
    - include: roles/app/tasks/notify_complete_deploy.yml
```

```yml:ansible/roles/app/tasks/deploy.yml
#（省略）
```

### Slackに通知する

```yml:ansible/roles/app/tasks/notify_complete_deploy.yml
- name: Send notification message via Slack
  local_action:
    module: slack
    domain: yourteam.slack.com
    token: slackapitoken
    msg: "{{ app_url }} deploy completed"
    channel: "#channel"
```

## デプロイ

デプロイ用のplaybookを実行します。

```bash
$ ansible-playbook -i ansible/staging ansible/deploy.yml
```

デプロイが正常に終了すれば、「http://example.com deploy completed」のメッセージがSlackに通知されます。
岩手HTML5の勉強会「モバイル時代のWebパフォーマンス」メモ


結構前になってしまったのですが、
2014/8/30に開催された「HTML5とか勉強会 in IWATE 2014」がありました。
普段、web系のサービス開発していましたが業務系のサービスだったため、あまりhtmlレベルでのチューニングを今までしたことがありませんでした。
なのでこれはすごく勉強なったので復習がてら書きます。
ついでにすぐに実践したいと思ったことを個人的な順位をつけて、紹介します。


資料はこちら！！
発表者はhtml5j 代表の吉川さんでした。
> http://www.slideshare.net/yoshikawa_t/web-38508917

勉強会はWebパフォーマンスについての発表で、
以下の視点が重要という話からどうすれば検証できるかという実用的な話でした。

## パフォーマンスチューニングの２つの視点
* Page Load … ページのローディング、表⽰示まで のチューニング 
* Runtime … ページ中の動作を60fpsで実現する ためのチューニング



## 3位 アニメーションで過度な装飾を抑える

以下の装飾は処理が重い

* border-radius
* box-shadow
* text-shadow
* *‒gradient 


アニメーションを使う場合は以下の設定を使用する

* Position : transform: translate(npx,npx)
* Scale    : transform: scale(n)
* Rotation : transform: rotate(ndeg)
* Opacity  : opacity: 0...1

> http://www.html5rocks.com/en/tutorials/speed/high-performance-animations/


## 2位 ページ中の動作が60fps以下かChrome DevToolsで確認する
![kobito.1412603886.739653.png](https://qiita-image-store.s3.amazonaws.com/0/19316/90a158f3-3982-7524-2443-bca8a69a8ae8.png "kobito.1412603886.739653.png")


Chrome DevToolsからTimeline ⇒ 「左の赤い記録」ボタンを押下し、グラフにボタンを押下

画面を動作させると、右軸に30fps、60fpsと表示されるため、
こちら60fpsを超えているイベントを検証していくとサイトが早くなりそうです。


## 1位 PageSpeed Insightsでページを検証してもらう

Googleのツールで簡単にウェブ パフォーマンスを検証するツールがあります。
それがPageSpeed Insightsです。

> http://developers.google.com/speed/pagespeed/insights/


![kobito.1412603363.824943.png](https://qiita-image-store.s3.amazonaws.com/0/19316/4a6f973f-85c0-8989-aabc-80a492013c38.png "kobito.1412603363.824943.png")


URLを入れて、分析すると

![kobito.1412603417.963839.png](https://qiita-image-store.s3.amazonaws.com/0/19316/d3d8e1aa-d9d2-410d-5ab3-1e0399e73b05.png "kobito.1412603417.963839.png")


分析結果を表示してくれて、
修正内容まで教えてくれます。

今後webサービスを何かつくったら是非最初に使いたいと思ってます。
timely でタイムリーなツイート

以前投稿したやつを等間隔でつぶやくようにしてみる

[これまでの投稿の組み合わせ技 - Clojure で アニメ情報をtweetする](http://qiita.com/FScoward/items/7fc63e0b2ddd8313bc1e)

# 使用するもの
[timely](https://github.com/Factual/timely)

# ソースコード（今回変更部分のみ）

`[factual/timely "0.0.3"]` をdependenciesに追加

```clj:project.clj
(defproject tweet-anime-clj "0.1.0-SNAPSHOT"
  :description "FIXME: write description"
  :url "http://example.com/FIXME"
  :license {:name "Eclipse Public License"
            :url "http://www.eclipse.org/legal/epl-v10.html"}
  :dependencies [[org.clojure/clojure "1.6.0"]
                 [org.twitter4j/twitter4j-core "3.0.5"]
                 [org.clojure/data.json "0.2.5"]
                 [com.draines/postal "1.11.1"]
                 [factual/timely "0.0.3"]]
  :main tweet-anime-clj.core)
```

使い方は至極簡単
`(start-scheduler)`でスケジューラーを動かして
`scheduled-item`でスケジューリングしたい動きを指定してやるだけ。

```clj:core.clj
(ns tweet-anime-clj.core
  (:require [tweet-anime-clj.animemap :refer :all])
  (:use [timely.core])
  (:import [twitter4j TwitterFactory Query TwitterException]))

;; tweet (String -> Unit)
(defn tweet [content]
  (let [twitter (. (TwitterFactory.) getInstance)]
    (.updateStatus twitter content)))

(defn -main []
  (start-scheduler)
  (scheduled-item (every 1
                       :minutes)
  (doall (map #(tweet %) content))))

```

なんて簡単なんだ！

# 詳細
https://github.com/Factual/timely
見ればわかるんじゃないかな？
Nugetの使い方とパッケージの作り方

# パッケージを利用する

## Nugetコマンド

VisualStudioのパッケージマネージャーコンソールから使うコマンド。以下の通り。

update-packageのsafeオプションつけると最新マイナーバージョンへアップデートする。

```

install-package <パッケージ名>

install-package <パッケージ名> -version <バージョン番号>

update-package <パッケージ名>

update-package <パッケージ名> -safe

uninstall-package <パッケージ名>

```

# パッケージを作成する

## CUIでパッケージの作成

http://nuget.org/nuget.exe

からダウンロードし、適当なフォルダに配置する。(Pathを通すのも忘れずに)


## GUIでパッケージの作成

http://docs.nuget.org/docs/creating-packages/using-a-gui-to-build-packages

上記UrlからGUI操作でパッケージ作成するアプリをダウンロードすることが可能。

依存ライブラリの指定や、ターゲット.netフレームワーク指定なども簡単にできるので

通常はこっちでパッケージ作ったほうがいい。


## パッケージの作り方

MSの人がPackageManager(GUIツール)について解説している動画が https://www.youtube.com/watch?v=55AQSYqD3vE にて公開されている。

約13分と少し長いが、通してみるべき。

個人的なしおりとして

+ 基本的な使い方は 3:00 から

+ 依存パッケージの設定とターゲット.netフレームワーク設定は 5:14 から

+ ローカルパッケージソースの設定は 7:00 から

を挙げておきます。
aws-cliをつかってDynamic DNSサービス

## はじめに

Route53はAWSのサービスですので、APIが存在します。またawsコマンドで操作も出来ます。
固定IPをもっていないマシンでもDNSで検索できるようなDynamic DNSサービスも簡単に作れます。
ということで、コマンドラインでの設定方法を説明します。cron等にいれればIPが更新されても
大丈夫です。

## 前提条件

- ドメインは既にRoute53に登録してあること
- aws-cliが利用できること(aws-cli 1.4.3で確認しています)
- jq,curlが利用できること

## Hosted Zone IDの取得

まずは登録しているドメインのHosted Zone IDを調べます。以下のようなコマンドで調べられます。

``` bash

aws route53 list-hosted-zones | jq '.HostedZones[] |  {Name , Id } '

```

実行すると下記のように出力されます。

``` bash

$ aws route53 list-hosted-zones | jq '.HostedZones[] |  {Name , Id } '{
  "Id": "/hostedzone/ZZZZZXXXX3333",
  "Name": "xxxxxxx.com."
}
```
この例だと **ZZZZZXXXX3333** が hosted zone ID、ドメインは **xxxxxxx.com** になります。


## レコード登録スクリプト

こちら登録スクリプトになります。スクリプト中に3つのシェル変数を設定してください。

``` bash
#!/bin/sh

R53_ZONE_NAME= #ドメイン名 (example.com等)
R53_HOSTNAME=  #ホスト名 (testserver等)
HOSTED_ZONEID= #Hosted zone ID

R53_CALLER="${R53_ZONE_NAME}-`date +%Y%m%d-%H%M%S`"
R53_COMMENT="dynamic dns record set"
MY_DDNS_RECORD=${R53_HOSTNAME}.${R53_ZONE_NAME}

MY_PUBLIC_IP=`curl -s ifconfig.me`
if [ -z $MY_PUBLIC_IP ] ;  then
    MY_PUBLIC_IP=`curl -s ipinfo.io | jq -r '.ip'`
fi

if [ -z $MY_PUBLIC_IP ] ;  then
    echo "failed to get global IP address"
    exit 1
fi
cat <<EOT > /tmp/recordset.json
{
  "Comment": "create A record",
  "Changes": [
    {
      "Action": "UPSERT",
      "ResourceRecordSet": {
        "Name": "${MY_DDNS_RECORD}",
        "Type": "A",
        "TTL": 3600 ,
        "ResourceRecords": [
         {
           "Value": "${MY_PUBLIC_IP}"
         }
        ]
      }
    }
  ]
}
EOT

aws route53 change-resource-record-sets --hosted-zone-id $HOSTED_ZONEID --change-batch file:///tmp/recordset.json 

rm -rf /tmp/recordset.json

```

ポイントとしてはグローバルIPを調べるために二つサービスを利用している点と、レコードセット登録にinsertではなくupsert(あれば更新、なければ追加)です。

実行するとこんな感じで出力されます。

``` bash

$ ./upsert_dns.sh
{
    "ChangeInfo": {
        "Status": "PENDING", 
        "SubmittedAt": "2014-10-06T13:44:34.264Z", 
        "Id": "/change/ZZZZZXXXX3333", 
        "Comment": "create A record"
    }
}
```

分散サービスなので登録されるまで少し時間がかかりますが、登録されるとホスト名が引けるようになります。

## まとめ

Route53のレコードセットを登録するスクリプトを作成しました。[波田野さん](http://qiita.com/search?utf8=%E2%9C%93&sort=rel&q=user%3Atcsh)の主催する
[JAWS-UG CLI専門支部 #1 - Route53でドメインホスティング](http://jawsug-cli.doorkeeper.jp/events/13530)
を元にしています。この勉強会は役に立つのでおすすめです。

ではでは。
gitで大きいサイズのファイルを扱う時


Git用サーバを管理する立場での、覚え書きになります。

## git client側の調整

git pushをしたとき、411のエラーが出てしまう場合があります。
通常、テキストのようなソースコードのpushでは、こういう症状は発生しないのですが、バイナリや画像データを登録している場合は、pushの際にこのエラーが出ることがあります。


```
error: RPC failed; result=22, HTTP code = 411
fatal: The remote end hung up unexpectedly
```
こういう時は、bufferのサイズを調整しておきます。
以下は、150MBに設定する例。

```
% git config http.postBuffer 157286400
```
もしくは .gitconfig に

```
[http]
        postBuffer = 157286400
```
を追加するなど。

## サーバ側の調整

上記のように、クライアント側でバッファサイズを上げても、サーバ側がそれを処理できない場合があります。そもそも、アップロードの上限値を超えてしまっていたらダメ。

GitのサーバのフロントにNginxを使っている場合は、Nginxのデフォルトのファイルアップロードの上限が小さめなので注意。（Apache自体は上限はデフォルトでは指定無し）

この場合、client_max_body_size を調整します。
【開発中止しました】Boxen --> Brew bundle の先を目指して！！ protostarの超α版リリース

**作ってたら、だんだんshellでansibleを再開発してる風になってきてしまったので、一旦考え直します。期待してた方がいたらすみません。
すごいな、ansible...**



Protostarっていうプロダクトが動くようになったので、まだまだα版とも言えないレベルですが公開しました。
(なので、masterじゃなくてconceptっていうブランチで公開してます。)

https://github.com/protokit/protostar-mac

## Protostarってなんなの？

初期インストールが終わってからの最低限欲しいアプリのインストールとか環境設定とかそういうのを賄ったりその後の管理をするためのシェルコマンドです。
アプリ・シェルコマンドおよびドットファイルをはじめとする設定ファイルを管理します。
(現状公開してるのはただのスクリプト)

**Protostarを使わなくても許されるのは2015年までだよね** といわれるのを目指して鋭意作成中です。

> すみません。個人的な事情で年内リリースむりぽです。
> 節分の頃に豆の代わりにばらまけるように頑張ります

## 使い方

###(現状) Macのみです。

git cloneする

`git clone https://github.com/protokit/protostar-mac`

group_vars/allを書き換える(※追記)
暫定的ですが、gitのuser情報がここに書かれてるので書き換えてください

実行する

`sh ./protostar.sh`

※
ドットファイル書き換わるんで、バックアップ取るようになってますが、それでも心配な方は動かす前に自分でバックアップとってください。
まだベータ版ですらないんで、ベータリリースするまでは動作保証はしません。

###(目標)Mac、Windows、ubuntu、centos

実行する(デフォルト)

`protostar`

実行する(カスタム)

`protostar --option ~`

## なんではじめようと思ったの？

今までの経験上、PCを最初にインストールした直後に入れるものはプログラマだったらプログラマで、イラストレータだったらイラストレータで職種ごとにほぼ一緒です。
新しいPC買ったところで前と同じ、もしくは近しい環境を構築しようと考えます。
だったらこれをパッケージ化してこれをある程度自動化するほうが効率的です。
その上でカスタマイズできるようにしたらいいのです。

いろいろな管理ツールが生まれてくるかで、取っ付き易く汎用的なAnsibleが生まれました。
Macだったらhomebrew、WindowsだったらChocolateyがでてきて、管理がさらに楽になってきました。
だったらこれをまとめるものを作って提供したらみんなのためになるはずです。

こうして、Protostarを作りはじめました。

## PCのパッケージの管理とかの(私の)近代史

何でやろうと思ったかをもうちょっと詳しく時系列で説明してみます。

### "Boxen使わなくても許されるのは2012年までだよね"とかって言われはじめる

このころは、Macをメインで使ってなかったので、dotfileやアプリの管理とかあんまり考えてませんでした。なので、Boxenとか使ってなかったです。ごめんなさい。
ですが、関連記事とかBoxenのドキュメント読んでてなるほど便利そうだ。
でも、敷居がちょっと高い感じがするって思ってました。

### HomebrewがBuzzられはじめる

このころ自宅開発用のPCをMacに移行しはじめます。
そうすると環境作ったりなんだりが面倒に感じられました。
そのタイミングでHomebrewいいよと言われはじめたので、試してみたらHomebrewはBoxenほど敷居が高くなく、とっつきやすかったんですっかり愛用してます。
特にHomebrew-caskは大好きすぎて、pull request送ったりもしてます。

### 衝撃的なdotfileと出会う

Setup Mac OS X Mountain Lion or Mavericks
(https://gist.github.com/millermedeiros/6615994)

このgistを見た時はちょっとした衝撃を受けました。
まさか、dotfileとhomebrewを一緒にしてしまうなんて！！

ソースを見てしまうと理屈は簡単で、dotfileを書き換えて(もしくはgit pullして)スクリプト動かすと
rsyncで差分が書き換えるとともにbrew bundleでシェルコマンドやアプリの更新・追加・削除が動きます。
でも、確かにこれだとアプリ、コマンド、dotfile全て管理できます。
Bestじゃないけどbetterな方法です。
以降、これをベースにして管理することにしました。

### ansible x homebrewはじまりました

[hnakamurさん](http://qiita.com/hnakamur)がqiitaでこんな記事を公開しました。

AnsibleでHomebrew, Cask, Atomエディターのパッケージを管理する
http://qiita.com/hnakamur/items/1c27cf0df19fe57ec624

**Σ(ﾟдﾟ(ﾟдﾟ(ﾟДﾟ; ﾅ､ﾅﾝﾀﾞｯﾃｰ!!**

ですよ、まさに！！
ちょうどAnsibleを触り始めたタイミングでこいつが来ました。
これはAnsibleにのせない理由は無いですよ。
ただhnakamurさんのではdotfileまではやってなかったので、hnakamurさんとか上手に使ってる人たちのを元にdotfileまでやっちゃうバージョンを作りました。
**(今回公開したのはこの状態のものです。)**

### AnsibleのWindows公式サポート開始

たしかchefとかpuppetとかでは、windowsモジュールの公式サポートはMSIファイルのインストールとかコアなレベルまでのサポートはしてなかったはず。
これでおそらく一般的なdestop PCのOSは全部、ansibleサポートできるようになったはずです。
これが今回のプロジェクトをはじめようとしたきっかけになります。

## その他

なんかちょうどいいタイミングでBrew bundleが使えなくなったみたいですね。
リリース急ぎます ε≡≡ﾍ( ´Д`)ﾉ

http://unasuke.com/info/2014/brewfile-is-outdated/
https://github.com/Homebrew/homebrew/issues/30815

## 最後に一言

長くてごめんね。
Pythonでシリアル通信


pySerialを使ったシリアル通信

未だに組み込み系においては何かとお世話になるシリアル通信。最近ではRaspberry Piなどの組み込みようとに使えるLinuxボードが出てきているので、Pythonからシリアル通信が使えると何かと便利です。

##Install
PyPiに登録されているのでpipまたはeasy_installを使ってインストール

```bash
$ pip install pyserial
```
or

```bash
$ easy_install -U pyserial
```


##使い方
###オープンと出力(write)
文字を出力するだけなら至って簡単

```python
>>> import serial
>>> ser = serial.Serial('/dev/ttyUSB0', 9600)  # デバイス名とボーレートを設定しポートをオープン 
>>> ser.write("hello")      # 出力
>>> ser.close()             # ポートのクローズ
```

###リード
timeoutを簡単に設定できるのでノンブロッキングの形にも簡単にできる

```python
>>> import serial
>>> ser = serial.Serial('/dev/ttyS0', timeout=0.1)  # timeoutを秒で設定（default:None)ボーレートはデフォルトで9600
>>> c = ser.read()  # 1文字読み込み
>>> str = ser.read(10)  # 指定も字数読み込み ただしtimeoutが設定されている婆は読み取れた分だけ
>>> line = ser.readline()  # 行終端'¥n'までリードする
>>> ser.close()
```


##参考
公式ドキュメント
[Welcome to pySerial’s documentation](http://pythonhosted.org//pyserial/)
Railsでinitializersに書いた内容をdevelopmentモードで再読み込みさせる


## 外部APIに接続するようなクラスの設計

Railsで外部のAPIサービスにつなぐクラスなどを書く際に、将来的にGemにすることを見越してできる限りそのプロジェクト自体に依存しないように設計すると思います。（ここでいう、「依存しない」とは、たとえばそのプロジェクトのSettingsLogicをこのクラスから見に行かないなど。）

ここで、外部のAPIが接続時にAPIキーと、トランザクション毎に変わる情報を渡さないといけないとすると、APIキーは一度Railsを立ち上げると変わらないのでクラスに持たせて、トランザクションは引数で渡す、ということをやると思います。

```lib/external_service_adapter.rb
class ExternalServiceAdapter
  include ActiveSupport::Configurable
  config_accessor :api_key

  def create_transaction(transaction_info)
    do_something(self.api_key, transaction_info)
  end

  private

  def do_something(api_key, transaction_info)
    puts "api_key: #{api_key}"
    puts "transaction: #{transaction_info}"
  end
end

```

では `ExternalServiceAdapter.api_key` はどこで埋めるかというと、Railsには config/initializers という起動時に読み込まれるものがあるので、そこで以下のように書きます。

```config/initializers/initialize_adapter.rb
ExternalServiceAdapter.configure do |config|
  config.api_key = 'my_api_key'
end
```

こうすることで、起動時にAPIキーを渡すことができて問題なく動くし、Gemも自プロジェクトに依存するようなロジックが入らないのでGem公開に近づいて夢が広がります。

## だがうまく動かない。現実は厳しい。
ところが、development環境でこの外部接続クラスを編集しながら開発しているとExternalServiceAdapter.api_keyが消えるという事象に遭遇します。

### 初回

こういうcontrollerを追加

```
class NanikaController < ApplicationController
  def index
    ex = ExternalServiceAdapter.new
    ex.create_transaction("a")
  end
end
```
※ あくまでサンプルで、controllerから外部接続API直接呼ぶのはおおむね良くないケースが多いので注意

実行 => 

```
api_key: my_api_key
transaction: a
```

### ExternalServiceAdapterに #do_another というメソッドを追加する

```lib/external_service_adapter.rb
   def create_transaction(transaction_info)
    do_something(self.api_key, transaction_info)
+   do_another
   end

---
+  def do_another
+    puts 1
+  end
```

この後に再び先ほどのcontrollerを実行
=> 

```
api_key:
transaction: a
1
```



## なぜ消えるのか
理由は明快で、developmentモードでソースを編集すると、Railsがリロードしてくれます。便利。
ただしinitializersの中は走らない。

## どうすればいいんだ
というわけでRailsを再起動しましょう。編集するたびに再起動しましょう。


とかやってると6回ぐらい再起動したあたりで精神が崩壊して最悪の場合死に至るのでおすすめできない。

## 本当の対処
精神を崩壊させたくなかったので調べたところ、

`Rails.application.config.to_prepare` を使えばproduction環境なら最初の一回だけ読んでくれて、development環境ならリクエストの度に読み込む、というのを実現してくれます。
今回のソースで言うと、以下のようになります。

```config/initializers/initialize_adapter.rb
Rails.application.config.to_prepare do
  ExternalServiceAdapter.configure do |config|
    config.api_key = 'my_api_key'
  end
end

```

これで ExternalServiceAdapterを編集してもapi_keyは消えません。
依存の少ないコードを書きつつ、開発も快適に進められます。

## 参考リンク
http://guides.rubyonrails.org/configuring.html

## 動作確認バージョン
* Ruby 2.1.3
* Rails 4.1.6
Elasticsearchを使うときに最初に調べたこと


Elasticsearchのサーバーはすでにあり、新しい取り組みにElasticsearchを使おうと思ったときのメモです
Elasticsearchのサーバー構成やセットアップはこちらから
http://engineer.wantedly.com/2014/02/25/elasticsearch-at-wantedly-1.html


### ざっくり
* データを保存する
    * ドキュメントとは、ひとつひとつのオブジェクトを入れる
    * ドキュメントタイプとは、ひとつのインデックスに異なるオブジェクトを格納する時に利用する。ドキュメントタイプは、ドキュメントに対してひとつ紐づく。
    * 例) wantedly_indexに対してproject_typeとcompany_typeを作って、projectとcompanyそれぞれのドキュメントを保存する。
* インデックスを作成する
    * マッピングというインデックスを作成するためのフォーマットを作って、インデックスを作成する
* クエリを作成する
    * クエリとフィルターがある。
    * フィルターは、キャッシュされ、スコアに影響しない

### クエリの重み付けをどうするか
* クエリブーストというもので実装。
* 複雑なら、function scoreクエリを利用する
* boost_modeには、multiply, replace, sum, avg, max, minの6つがある
* score_modeには、first, min, max, total, avg, multiplyがある

### 参考
* 実践 Elasticsearch http://engineer.wantedly.com/2014/02/25/elasticsearch-at-wantedly-1.html
* 高速スケーラブル検索エンジン 
http://www.amazon.co.jp/%E9%AB%98%E9%80%9F%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%A9%E3%83%96%E3%83%AB%E6%A4%9C%E7%B4%A2%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%B3-ElasticSearch-Server-Rafal-Kuc/dp/4048662023
node.jsでTwitterにOAuth認証

node.jsおよびnpmはインストールしてあるものとします。

##下準備
1 npmでtwitterとdate-utilsを導入します。twitterは名前の通りnode.jsでTwitterAPIを叩くためのライブラリ、date-utilsは時間を扱いやすくするライブラリです。

```shell-session
npm install twitter
npm install date-utils
```
2 [Twitter Developers](http://dev.twitter.com)で、コンシューマーキー、アクセストークンを取得します。

##コード
```js
//モジュール読み込み
var twitter = require('twitter'),
	dateUtils = require('date-utils');

//認証
var api = new twitter({
	consumer_key: '', //ここに取得したコンシューマーキーを入れる(以下3行も同様にそれぞれ入れる)
	consumer_secret: '',
	access_token_key: '',
	access_token_secret: ''
});

var date = new Date();
//ツイート
api.updateStatus(date.toFormat('YYYY/MM/DD/ HH24:MI:SS'),function(stts){
	console.log(stts);
});
```

保存して実行すると、現在の時刻をツイートするはずです。

```shell-session
node nodeTwitter.js
```
cronなんかに書いておけば、botとして使うことも出来るでしょう。

##出典
>[Node.jsで現在時刻を取得 - Qiita](http://qiita.com/n0bisuke/items/dd28122d006c95c58f9c)
>[20 行で作る node.js による Twitter bot 作成講座 - 凹みTips](http://tips.hecomi.com/entry/20120721/1342876520)
Redisでユーザの最終アクセス時刻を記録


ユーザの最終アクセス時刻をDBで記録していたけど、頻繁に更新したいけどDBだとボトルネックになるので、redisで置き換えたコード。

## 利点
 * zscoreで記録することで、リアルタイムに誰がアクセスしたかが分かる(fluentとかでログはいても確認できるけど)。
 * zrangebyscoreを使用すると、最終サクセス日が現在より24時間以内のユーザ一覧が出せる。


```python:lastaccess.py
from datetime import datetime

import pytz
import redis


class UserLastAccess(object):

    def __init__(self, user_id):
        self._user_id = user_id
        self._client = redis.StrictRedis()
        self._key = self.__class__.__name__

    @property
    def accessed_at(self):
        timestamp = self._client.zscore(self._key, self._user_id)
        if timestamp:
            d = datetime.fromtimestamp(int(timestamp))
            return pytz.timezone('Asia/Tokyo').normalize(pytz.utc.localize(d))

        return None

    def touch(self):
        now = pytz.utc.localize(datetime.utcnow())
        timestamp = now.strftime('%s')

        self._client.zadd(self._key, timestamp, self._user_id)

        return pytz.timezone('Asia/Tokyo').normalize(now)


class LastAccessedAtMixin(object):

    @property
    def user_last_access(self):
        return UserLastAccess(self.id)

    @property
    def last_accessed_at(self):
        return self.user_last_access.accessed_at

    def touch(self):
        return self.user_last_access.touch()


class User(LastAccessedAtMixin):

    def __init__(self, user_id):
        self.id = user_id
```

使用例

```python:ex
user = User('1000')
user.touch()  # => datetime.datetime(2014, 10, 6, 21, 55, 27, 654918, tzinfo=<DstTzInfo 'Asia/Tokyo' JST+9:00:00 STD>)
user.last_accessed_at  # => datetime.datetime(2014, 10, 6, 21, 55, 27, tzinfo=<DstTzInfo 'Asia/Tokyo' JST+9:00:00 STD>)
```