OmniAICreator/Qiita-1.07M huggingface dataset:
ฅ(・ω・ฅ){ EA (Emoji Art) でサザンイマジネーション 第2回 お題「 ねこあつめ 」 }

## <i class="fa fa-image" style="font-size:1em;"></i> 概要
Ascii Art ならぬ EA (Emoji Art) で 3 x 3 の絵を作る。

## <i class="fa fa-history" style="font-size:1em;"></i> 経緯
CodeIQ で <i class="fa fa-external-link" style="font-size:1em;"></i> [Emoji-サザンイマジネーション](https://codeiq.jp/ace/tbpgr_badge/q1323)
という問題の出題を始めました。

Emoji で 3 x 3 の絵を作るプログラムを作成する問題です。

この問題のフィードバック時に、解答者の 3 x 3 の Emoji に対して、
3 x 3 の Emoji でフィードバックする、という試みをしています。
これが結構楽しかったので、 Qiita 上でも出題期間中 ( ～ 2015年3月6日) は
1日1お題くらいやってみたいな、と思いました。

最近の チャットツール とか GitHub とか、多くのツールが Emoji をサポートしてるので
面白いものを作っておくと、開発メンバー間のコミュニケーションツールとして使えそうですよね。

Emoji のリストと対応サービスはこちらで確認。
<i class="fa fa-external-link" style="font-size:1em;"></i> [EMOJI CHEAT SHEET](http://www.emoji-cheat-sheet.com/)

## :flower_playing_cards: 作品 「 ねこあつめ 」
猫の日ということで。

:house::cat::sun_with_face:
:joy_cat::baseball::smirk_cat:
:herb::kissing_cat::soccer:

## :books: 関連情報
* <i class="fa fa-external-link-square" style="font-size:1em;"></i> [emoji 関連記事](http://qiita.com/tbpgr/items/b32c83e2f3f348a4ce0a)
気分が落ち込んだ時に読んでるもの

## 読み物

[わかった気になるJS開発手法](http://www.slideshare.net/rosylilly/js-7993247)

[【推理アドベンチャー】スペイン語版ＦＦ７攻略の軌跡 - Togetterまとめ](http://togetter.com/li/778247?page=1)

## 本

宮田 珠己「ときどき意味もなくずんずん歩く」
[ときどき意味もなくずんずん歩く](http://www.amazon.co.jp/%E3%81%A8%E3%81%8D%E3%81%A9%E3%81%8D%E6%84%8F%E5%91%B3%E3%82%82%E3%81%AA%E3%81%8F%E3%81%9A%E3%82%93%E3%81%9A%E3%82%93%E6%AD%A9%E3%81%8F-%E5%B9%BB%E5%86%AC%E8%88%8E%E6%96%87%E5%BA%AB-%E5%AE%AE%E7%94%B0-%E7%8F%A0%E5%B7%B1/dp/4344410602)
複数行のechoを、きれいにインデントして書く方法の試案


## 動機

```bash
$ echomultiline
hoge
fuga
```

* こんな関数を書きたいとする。
    * 主にシェルスクリプトのhelpを表示する関数。
* 普通にスペースでインデントすると、出力にスペースが入ってしまう。

```bash
echomultiline () {
  echo "hoge
  fuga"
}
```

```bash
$ echomultiline
hoge
  fuga
```


* ヒアドキュメントで書くと、（タブ文字でしか）インデントできない。

```bash

echomultiline () {
  cat << _EOB_
hoge
fuga
_EOB_
}

# タブ文字でインデント
echomultiline () {
	cat <<-_EOB_
	hoge
	fuga
	_EOB_
}
```

* 普段通りスペースで、きれいにインデントしたい。
* 結論先出しすると、決定版と言えるものはない。

## 複数回echo

```bash
echomultiline () {
  echo "hoge"
  echo "fuga"
}
```

* 単純明快。
* `echo <text> 1>&2`とかしたいとき大変。

### `{}`か`()`で括る

```bash
echomultiline () {
  {
    echo hoge
    echo fuga
  } 1>&2
}
```

## 一行で記述してtrコマンドで改行に置換

```bash
echomultiline () {
  echo "hoge@fuga" | tr '@' '\n'
}
```

* 全体の可読性は上がるが、この部分は見づらい。

## sedコマンドで余分なものを削除

```bash
echomultiline () {
  echo "hoge
  fuga" | sed 's/^ *//g'
}
```

```bash
echomultiline () {
  echo "
    hoge
    fuga
  " | sed -e 's/^ *//g' -e '1d' -e '$d'
}
```

* やりすぎ感。

## 別解：whatコマンドを使用
* 実行可能ファイル形式シェルスクリプトの説明文限定。

```sample.sh
#!/bin/bash
# @(#)hoge
# @(#)fuga
what $0
```

```bash
$ what sample.sh
sample.sh
	hoge
	fuga

$ ./sample.sh
sample.sh
	hoge
	fuga
```

* わりときれいに書ける。
ScratchとArduinoで作成したレゴロボットを光センサーで操作する

[前回](http://qiita.com/snumano/items/0008c5e6132e6b1e50f8)、レゴロボットを作成し、Scratchの矢印キーで操作するところまで作成しました。
今回は、光センサーを使って、レゴロボットのコントロールパネルを作成します。
電子工作っぽくなってきました。

# 動作概要

ブレッドボード上に、光センサーを上下左右の4つ並べ、コントロールパネルとします。コントロールパネルの操作は下記とします。  
* コントロールパネル全体に、手のひらをかざすと前進。
* 指先を上に向けると後進。
* コントロールパネルから手を外すと停止。

お気づきかもしれませんが、上記動作のためには、実際は光センサーは2個で十分です。
今後、光センサー4個で、前後左右を表現したいなと思い、今回用意しました。

# 回路図

今回も[Fritzing](http://fritzing.org/home/)を使用します。
analogのピン0-3を使用します。

![なのどっぐ回路図2_ブレッドボード.png](https://qiita-image-store.s3.amazonaws.com/0/4779/e18f58d3-8e83-f914-23f9-baae43031ea5.png "なのどっぐ回路図2_ブレッドボード.png")

# Scratch(S4A)でプログラムを書く

[前回](http://qiita.com/snumano/items/0008c5e6132e6b1e50f8)のものに少しだけ追加します。analog0〜3の値をみて、前進・後進・停止を判断します。

![なのどっぐ2画像.gif](https://qiita-image-store.s3.amazonaws.com/0/4779/6be1953f-e0c8-c189-b6da-4f08bce69e4f.gif "なのどっぐ2画像.gif")


# 完成動画

[Vine](https://vine.co/v/OQO00xpYETi)にupしてみました。
luminusでomを使う

omをウェブアプリに組み込む際の備忘録です。
omを使いたいだけなら、[専用のテンプレ](https://github.com/swannodette/mies-om)が簡単ですが、luminusと組み合わせて楽にWebアプリ化したかったので、

１，Luminus+ClojureScriptでプロジェクト作成
２，omライブラリの追加
３，ルーティングの設定
４，テンプレート作成
５，ClojureScriptを書く

という流れになります。


## Luminus+ClojureScriptのテンプレプロジェクトを作成

```
$ lein new luminus omtest +cljs
$ cd omtest/
```

## omライブラリを追加する
 * 現在のluminusでプラグインにデフォルトで入ってくる"lein-ancient"のバージョンが古いせいでエラーになることがあるので、最新バージョンに変更しておく

```
(defproject
  :dependencies
    [org.omcljs/om "0.8.8"] ;<-追加
  :plugins
    [lein-ancient "0.6.2"] ;<-修正
```

## ルーティングの設定
 * 新しいページ用のtemplateとルーティングパスをhome.cljに追加（ここに追加すべきじゃないけど面倒なのでとりあえずここに書いた）

```clj:routes/home.clj
(defn hello-page []
      (layout/render
        "hello.html"))

(defroutes home-routes
  ~
  (GET "/hello" [] (hello-page))
  ~
```

## cljs->jsの自動コンパイルを走らせて、アプリを立ち上げる

```
$ lein cljsbuild auto
$ lein ring server
```

## テンプレートを作成
デフォルトで作成されている、"home.html"を流用し、修正点は以下だけです。

 * ①jsが書き込む空のdivタグ
 * ②で、対象のclojurescript(src-cljs/helloom/core.cljs)の名前空間を指定

```html:resources/templates/hello.html
<html>
  <head>
      <META http-equiv="Content-Type" content="text/html; charset=UTF-8">
      <title>om demo</title>
  </head>
  <body>
    <div id="app"></div>　①
    <!-- scripts and styles -->
    <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">
    <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap-theme.min.css">
    {% style "/css/screen.css" %}

    <script src="//code.jquery.com/jquery-2.0.3.min.js" type="text/javascript"></script>
    <script src="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script>
    <script type="text/javascript">
        var context = "{{servlet-context}}";
    </script>
    {% if dev %}
      <script src="//cdnjs.cloudflare.com/ajax/libs/react/0.11.2/react.js"></script>
      {% script "/js/out/goog/base.js" %}
      {% script "/js/app.js" %}
      <script type="text/javascript">goog.require("helloom.core");</script> ②
    {% else %}
      <script src="//cdnjs.cloudflare.com/ajax/libs/react/0.11.2/react.min.js"></script>
      {% script "/js/app.js" %}
    {% endif %}
  </body>
</html>
```

## ClojureScriptを書く
[公式チュートリアル](https://github.com/omcljs/om/wiki/Basic-Tutorial)の通りにhelloworldしてるだけです。

```clj:src-cljs/helloom/core.cljs
(ns helloom.core
  (:require [reagent.core :as reagent :refer [atom]]
            [secretary.core :as secretary]
            [reagent-forms.core :refer [bind-fields]]
            [ajax.core :refer [POST]]
            [om.core :as om :include-macros true]
            [om.dom :as dom :include-macros true])
  (:require-macros [secretary.core :refer [defroute]]))

(def app-state (atom {:text "Hello OM!!"}))

(om/root
 (fn [app owner]
   (reify om/IRender
     (render [_]
       (dom/h1 nil (:text app)))))
 app-state
 {:target (. js/document (getElementById "app"))})
```

htmlとcljsを編集すると、それぞれ自動で読み込まれるので、ブラウザで、"アドレス/hello"にアクセスすると、app-stateに定義した"Hello OM!!"が動的に表示されるはずです。
あとは好きなだけClojurescriptを書けばよろし。
以上です。
SoftLayerのCDNでSSLを有効にする

※2019年11月現在、IBM CloudのCDNは当記事に記載の方式とは異なっていますが、参考のため、記事は削除せずに残しています。

SoftLayerのサイトには、CDN SSL Bandwidth の記載があります。
http://www.softlayer.com/content-delivery-network

![cdn_price.png](https://qiita-image-store.s3.amazonaws.com/0/59627/133e42cc-7287-9504-ffdd-95849e03b636.png)

ただ、管理ポータルでStorage > CDN のページを見ても、SSLを設定できそうなメニューはありませんし、マッピングを追加して、HTTPでCDN経由でアクセスできるようになっても、HTTPS(HTTP over SSL)でアクセスすると 404 Not Foundが返ってきます。

例えば、試しにwww.yahoo.comをoriginにしてみると、下記のようになります。

HTTP接続した場合(※URLがCDN経由になっていないのは、一旦、http://1XXX4.http.cdn.softlayer.net/801XXX4/www.yahoo.com/ に行った後、originサイト側でhttpsサイトにリダイレクトされるためです。)
![cdn_http2.png](https://qiita-image-store.s3.amazonaws.com/0/59627/c781ae72-5687-8919-4d1b-6c7d004a5e44.png)


HTTPS接続した場合
![cdn_https1b.png](https://qiita-image-store.s3.amazonaws.com/0/59627/f2e79389-9a2f-0d4c-069a-8d6ca9848c59.png)


どのようにSoftLayer上のCDNでSSLを有効にすればよいのでしょうか？

結論としては、管理ポータルからチケットで依頼する事で、SSLを有効にしてもらえます。
CDNアカウント番号をチケットで伝えると、ほどなくCDN on SSLを有効にしてくれます。CDNアカウント番号は、下記の赤枠で囲った部分に表示されています。SSL有効化の初期費用はかかりません。
![cdn_portal.png](https://qiita-image-store.s3.amazonaws.com/0/59627/2b8cf589-5534-92a1-dd78-53df31f02208.png)

これでHTTPSでアクセスできるようになりました。
![cdn_https2b.png](https://qiita-image-store.s3.amazonaws.com/0/59627/e28a72b3-8599-7cef-3de6-1aca05692da9.png)


さらに、URLに独自ドメインを使用し（CNAMEの利用は[こちら](http://qiita.com/testnin2/items/af9848517477b3c45a4e)を参照ください）、独自ドメイン用のカスタムSSL証明書を使ってHTTPSアクセスを行いたいという要件もあるかもしれません。

カスタムSSL証明書を使用する場合は、個別にCDNのエッジサーバー(SoftLayerのCDNは、実際にはEdgecastのCDNサービスを使用しています)に証明書をセットする必要があります。これもチケットによる個別対応となります。カスタムSSL証明書の利用は有料となりますので、併せてチケットで確認をお願いします。
数について

$
\newcommand{\Z}{\mathbb{Z}}
\newcommand{\Q}{\mathbb{Q}}
\newcommand{\R}{\mathbb{R}}
\newcommand{\C}{\mathbb{C}}
\newcommand{\A}{\mathbb{A}}
\newcommand{\X}{\mathrm{X}}
\DeclareMathOperator{\Ga}{G_a}
\DeclareMathOperator{\Gm}{G_m}
\DeclareMathOperator{\ord}{ord}
\DeclareMathOperator{\sgn}{sgn}
\DeclareMathOperator{\abs}{abs}
$
# アデール
有理数体　$\Q = \varinjlim \Z/s$

有理整数環の副有限完備化　$\widehat{\Z} = \varprojlim n \backslash \Z = \prod_p \Z_p$

$p$進体　$\Q_p = \Z_p \otimes \Q$

実数体　$\R = \Q_\infty$

アデール環　$\A_\Q = \widehat{\Z} \otimes \Q \times \R$

有限アデールの表現　$n \backslash r / s$
ここで$n$は法，$s$は分母，$r$は分子であり，アデールの有限部分$\widehat{\Z}\otimes\Q$の元の近似表示とみなす．
$0 \backslash r / s = r/s$
$n \backslash r / 1= n \backslash r$
と書く．$s$の逆元が$1/s$で$s \times 1/s = 1$，$r$の反元が$-r$で$r + -r = 0$，$n$の法が$n\backslash 0$で$n + n\backslash 0 = n\backslash 0$となる．

# 非アルキメディアンな場合
$p$進数はリトルエンディアンで表示する．つまり，$p$を$p$進で表示すると$p = 0 + 1 \times p = 0.1$となる．
また，非零な$x$に対して
$x = p^{\ord x}(\sgn x)(\exp \log x)$
となるようにタイヒミュラー指標$\sgn$と対数$\log$を拡張しておく．
もちろん，常識的な定義域の範囲では
$\sgn x = \lim_{n\to\infty} x^{p^n}$
$\log x = \sum_{n=1}^\infty \(1 - x^{-1}\)^n/n$
である．
$\ord : \Gm(\Q_p) \to \Ga(\Z)$
$\sgn : \Gm(\Q_p) \to \Gm(\Q_p)$
$\exp : \Ga(\Q_p) \to p\Z_p \stackrel{\sim}{\to} 1 + p\Z_p \to \Gm(\Q_p)$
$\log : \Gm(\Q_p) \to 1 + p\Z_p \stackrel{\sim}{\to} p\Z_p \to \Ga(\Q_p)$

ここで，レトラクション（準同型ではない）$\Ga(\Q_p) \to p\Z_p$をどう選ぶのが妥当かよくわからないが，
$a.b \mapsto 0.b$ つまり，$\sum c_n p^n \mapsto \sum_{n>0} c_n p^n$に選んでおく．
$p=2$の場合は，さらに修正が必要なのはそのとおり．
もちろん，常識的なところでは
$\exp x = \sum_{n=0}^\infty x^n/n!$
である．

# アルキメディアンな場合
実数や複素数はもちろんビッグエンディアンで表示する．
つまり，$p$を$p$進で表示すると$p = 1 \times p + 0 = 10$となる．
が，さらにその続きがある．

$\tau = 2 \pi i$とする．
$0, 1, e, \tau$が複素数体における特別な元となっている．

$\abs : \Gm(\C) \to \Gm(\C)$
$\sgn : \Gm(\C) \to \Gm(\C)$
$\exp : \Ga(\C) \to \tau \backslash \Ga(\C) \stackrel{\sim}{\to} \Gm(\C)$
$\log : \Gm(\C) \stackrel{\sim}{\to} \tau \backslash \Ga(\C) \to \Ga(\C)$

ここで，セクション（準同型ではない）$\tau \backslash \Ga(\C) \to \Ga(\C)$は$\tau\backslash(\tau/2)\mapsto -\tau/2$に選んでおく．

$\tau \backslash \Ga(\C)$の元$x$を
$x = a.b.c = a.b + \tau \times 0.c$
のように書く．また，それが$\exp$で移った先を
$x\ \X = \exp x$
と書く．このように対数表示すれば，乗法・逆元・反元で誤差が発生せず，
$e = 1\ \X$
$-\tau/2 = 0.0.5$
$i = 0.0.25\ \X$
などとなる．また，ダイナミックレンジの大きな量も
$$ a.b.c \ \X $$
としてコンパクトに表現される．ここで$a$がオーダー，$b$が精度，$c$が次元を表していると思える．ちなみに$\log$は
$$\log x = \int_1^x \frac{ds}{s}$$
と定義されているものとする．

余談ながら，慣用の指数表示は，例えば基数を$r$として
$x = 
(\sgn x)\exp\left((\log r) \left\\{\frac{\log \|x\|}{\log r}\right\\}\right) \times 
\exp\left((\log r) \left\lfloor\frac{\log \|x\|}{\log r}\right\rfloor\right) =
(\sgn x)\ \alpha.\beta \times 10^\nu$
としているわけで，これに比べれば
$x = \exp \log x = a.b.c\ \X$
が単純だと思う．例えば，$2$進表記されたものを$2\times 5$進表記に変換する手間を考えてみて欲しい．
swift勉強しててふむふむ思った事５【extension】

ObjCの時にあったカテゴリではなく、extensionというものになったらしい。

```
public extension NSDate {
    public class func datetime(date: NSDate) -> String {
        var dateFormatter = NSDateFormatter()
        dateFormatter.dateFormat = "MM-dd HH:mm:ss"
        return dateFormatter.stringFromDate(date)
    }
}
```

 - プロパティの追加
 - メソッドの追加
 - イニシャライザの追加

オーバーライドとかさせても動くのかな。
とか思ってたら試されている方が
[Swiftのextensionの挙動をゆる〜く確認してみた](http://qiita.com/yonell/items/2744d462d0243022f705)

どうやらできないようですね、swiftのほうが直感的に書けていい感じする。。。
Ubuntu14.04にPukiwiki1.5.0をインストールする

Ubuntu14.04に、Apache2.40とPHP、およびPukiwikiをインストールし、Basic認証するところまで。


#Apache2.4とPHPのインストール
まずは普通に、apt-getする。

```
$ sudo apt-get install apache2
$ sudo apt-get install php5
```

/var/www/html がデフォルトのパブリックフォルダとなっている。apt-getでインストール後は、自動的にサーバプロセスが起動する。
ブラウザで、

```
http://[サーバー名]/
```
へアクセスし、Apacheのデフォルトページが表示されればOK

#Pukiwiki1.5.0を設置
utf8版のPukiwiki1.5.0を使う。WikiのURLは、http://[サーバ名]/wiki とする。
zipファイルなので、まずUnzipをインストールする。

```
$ sudo apt-get install unzip
```

```
$ cd /var/www/html
$ sudo unzip pukiwiki-1_5_0_utf8.zip
$ sudo mv pukiwiki-1_5_0_utf8 wiki
```

Wikiの実行権限をサーバプロセスと同じ、www-dataにする。

```
$ chown -R www-data.www-data /var/www/html/wiki
```

これで、http://[サーバ名]/wiki にアクセスし、PukiwikiのデフォルトのFrontPageが表示される。

#PukiwikiをBASIC認証対応にする。
htpasswdで個別にパスワードファイルを設置する。htpasswdを使うため、apache2-utilパッケージをインストールする。

```
$ sudo apt-get install apache2-utils
```

パスワードファイルは、/etc/apache2 直下に置くこととする。

```
$ cd /etc/apache2
$ sudo htpasswd -c [ユーザ名]
```

##Pukiwiki内の.htaccessの設定

Apache2.4では、.htaccessの書式が以前と少し異なっているため、注意が必要。
アクセス制御の書式を以下のように変更する。

###変更前
```
<FilesMatch "\.(ini\.php|lng\.php|txt|gz|tgz|zip)$">
	Order allow,deny
	Deny from all
</FilesMatch>
```

###変更後
```
<FilesMatch "\.(ini\.php|lng\.php|txt|gz|tgz|zip)$">
	Require all denied
</FilesMatch>
```

最後に、BASIC認証有効化のため、以下の4行のコメントアウトを解除する。AuthUserFileのパスは、適切に修正すること。

```
AuthType Basic
AuthName      "Authentication required"
AuthUserFile  /etc/apache2/.htpasswd
Require       valid-user
```

##Apache2.confの修正
オーバーライドの設定有効化を行う。BASIC認証とは関係ないが、Indexesオプションの無効化も合わせてやっている。

###変更前
```
<Directory /var/www>
	Options Indexes FollowSymLinks
	AllowOverride All
	Require all granted
</Directory>
```

###変更後
```
<Directory /var/www>
	Options FollowSymLinks
	AllowOverride All
	Require all granted
</Directory>
```

修正完了後、ApacheをリスタートすればOK

```
$ sudo service apache2 restart
```

以上
swift勉強しててふむふむ思った事４【UITableViewCell】

setとgetが便利なので真っ先に思いついたやりたいことはTableViewCellに値を動的に入れたいときに便利だな〜と思った。

Objc時代はsetterを自分で書いてたけど、swiftだと以下のように出来る。


```
// カスタムクラスでGUIはXibで定義しているとき
// Cellの登録
var nib  = UINib(nibName: "DayCheckEventCell", bundle:nil)        
self.tableview.registerNib(nib, forCellReuseIdentifier:"Cell")

...

// Cellの生成
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        var cell = tableView.dequeueReusableCellWithIdentifier("Cell") as? DayCheckEventCell
        cell?.event = self.events[indexPath.row]
        return cell!
}

...

// カスタムセル
class DayCheckEventCell: UITableViewCell {
    @IBOutlet weak var titleLabel: UILabel!
    @IBOutlet weak var startEventLbl: UILabel!
    @IBOutlet weak var endEventLabel: UILabel!
    @IBOutlet weak var SeparatorLabel: UILabel!
    var event:EKEvent{
        set{
            self.titleLabel?.text = newValue.title
            if newValue.allDay{
                self.startEventLbl?.text = NSDate.time(newValue.startDate)
                self.endEventLabel?.text = NSDate.time(newValue.endDate)
            }
        }
        get{return self.event
        }
    }

    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

    override func setSelected(selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }

}

```

コレ以外にもModelのValidationとかもいい感じに実装できるよな〜と思いました。
case classをmapに変換


#### case class を map に変換する。

[gist / CaseClass_to_Map](https://gist.github.com/fkmt-disk/1829bf80974d5697f74e)

* case classかどうかを判定するのが困難だったのでアノテーションつけることで逃げた。

* MapはキーがStringのものだけサポート。

* Seqは型関係なしにOKのはず。

* OptionはOptionのまま扱う。

---

リフレクション使ってます。  
scalaのリフレクションはスレッドセーフに問題アリだったらしいが2.11.0-M7で解決済みっぽい。
↓
https://issues.scala-lang.org/browse/SI-6240
IntelliJ IDEAでRubyのテスト実行ショートカットキーが効かない場合の対処法

IntelliJに乗り換えようといろいろ試していてちょっと困っていたのでメモ。
RubyMineでも同様なのかどうかはわかりません。

前提
---

* IntelliJでRubyプラグインを使っている
* Keymapsは「Mac OS X 10.5+」
* Google日本語入力を使っている（v1.13.1880.1）

現象
---
RSpecでテストを書いているときに、カーソルのある場所に応じてexample単位やファイル単位でテストを実行してくれるショートカットが、デフォルトでは`shift+ctrl+R`に割り当てられています。

しかし、`shift+ctrl+R`を押しても反応が無いし、IntelliJ内の他のショートカットと重複している訳でもなさそうでした。
（同様の機能のデバッグ版のショートカット`shift+ctrl+D`は効いていました。）

原因
---
検索してみると以下のページが見つかりました。

[Google日本語入力のショートカットキーを変更(Mac)](http://blog.shinichy.com/2012/05/googlemac.html)

どうやらGoogle日本語入力が`shift+ctrl+R`を使用しているようです。

解決方法
---
上記のページに書いている通り、Macのキーボードショートカット設定で、すべてのアプリケーションを対象に「再変換」という名前で別の組み合わせのショートカットを登録してやれば解決しました。


これで快適なコーディングができそうです。
Rを使ったスクリーンキャプチャ: webshotパッケージの応用

## はじめに

Rを使って、webページのスクリーンショットを撮影する[`webshot`](https://github.com/wch/webshot)パッケージというものがあります。

日本語での***使ってみた事例***が見つからなかった（[seekRで検索 150222](https://www.google.co.jp/cse?q=webshot&cx=partner-pub-6801897182966827%3A61726vqhhgw&ie=utf-8&hl=ja&sa=#gsc.tab=0&gsc.q=webshot&gsc.page=1)）のでQiitaでも紹介します。といいつつ、以前rpubsに記事を書いたのでそちらをご覧ください。

http://rpubs.com/uri-sy/demo_webshot

今回はその応用例を自分用にメモ書き。

## webshotパッケージの応用

スライド資料作成時に、Twitterのつぶやきを引用する（魚拓をとる）こととか、あると思います。そういうときにいちいちページにアクセスしてキャプチャを撮ると、都度サイズがばらついたり、無駄なスペースも含んでしまったりと、アレな感じです。

`webshot`関数では、スクリーンキャプチャを撮影する位置を引数によって指定することができますので、つぶやき部分のCSSセレクターを指定し、そんな面倒をなくすことが可能です。

実例↓ https://twitter.com/u_ribo/status/561669079430201344 のつぶやきをキャプチャします。

```r
library("webshot") # https://github.com/wch/webshot
webshot(url = "https://twitter.com/u_ribo/status/561669079430201344", 
        file = "webshot150222_1.png", 
        selector = ".expansion-container")
```

とすると、

![webshot150222_1.png](https://qiita-image-store.s3.amazonaws.com/0/19462/7e61ee57-4220-a3d1-9e6b-618c429d6c78.png)


このような画像ファイルが生成されます。ファイル拡張子は`png`形式以外にも、`jpeg`, `pdf`に対応しています。LaTeXならPDFにすると綺麗な図になりますね。

同様に、slideshareやSpearkerDeckのスライドを参照するときには次のように。

```r
webshot(url = "http://www.slideshare.net/uribo/data-pretreatment", 
        file = "webshot150222_2.png", 
        selector = "img.slide_image")
```

ちょっとしたtips。slideshareでは特定ページのアクセスはスライドのURLのサブディレクトリにページ番号、という形式になっているので、特定のページの画像が欲しいときはURLを`http://www.slideshare.net/uribo/data-pretreatment/22`のようにすると良いです。


```r
webshot(url = "https://speakerdeck.com/s_uryu/ecologist-must-use-git", 
        file = "webshot150222_3.png", 
        selector = "iframe.speakerdeck-iframe")
```

GitHubでの議論も魚拓をとってみます。ついでに`resize`関数でサイズ変更もしてみます。

```r
webshot(url = "https://github.com/pilotmoon/PopClip-Extensions/pull/451", 
        file = "webshot150222_4.png") %>% 
  resize("120%")
```

![webshot150222_4.png](https://qiita-image-store.s3.amazonaws.com/0/19462/a85c8652-fbea-d24c-7ca3-99c55d46e93d.png)

ShinyAppのスクリーンキャプチャをとる`appshot`関数も用意されているのですが、自分の環境ではデモが正常に動きませんでした（なぜ？）。

他にもいろいろ使えそうですね。

## 注意点

自分以外のつぶやきやコメントなどをキャプチャする際は、用法用量を守って、正しくお使いください（著作権うんぬん）。
Slideshareにアップロードしたプレゼンの表紙を崩れないようにする

プレゼンテーションをアップロードして共有できるサービス[Slideshare](http://www.slideshare.net/ "Slideshare")。
多くの方が利用されていますが、普通にプレゼンテーションをアップロードするとサムネイルの表紙が崩れてしまうことがあります。

![スクリーンショット 2015-02-22 17.51.58.png](https://qiita-image-store.s3.amazonaws.com/0/43421/e00e7165-aa66-9e70-3499-cd6fa9815eec.png)

「気にしない！」って方はいいのですが、せっかくつくったプレゼンがFacebookやTwitterなどにShareされると残念な画像になってしまうのがイヤな方にTipsの紹介です。
（まあ自分も先輩に教えてもらったワケですが・・・）

#How To

* プレゼンテーションの表紙を画像にする

それだけです（ごめんなさい）。
プレゼンテーションを作成したら一枚目のスクリーンショットを撮って貼付ければOKです。

![スクリーンショット 2015-02-22 18.03.34.png](https://qiita-image-store.s3.amazonaws.com/0/43421/e6c6e386-6641-e61c-172f-0a56480301cb.png)

当たり前ですがこのTipsを使うようになってからはキレイにサムネイルが表示されています。

サムネイルのみが崩れるようなので他のページもすべて画像にする必要はないですが、スクリーンショットを貼るだけでキレイに表示されるなら対応してもよいのではないのでしょうか？ちなみにフォントなどの影響で崩れてしまうようです（一部のフォントでは崩れない模様）。

意外と困っている方がいらっしゃるようなので念のため紹介しておきます。
さくらVPSにFTP（vsftpd）を導入

## vsftpdをインストール

```
$ yum install vsftpd
```

vsftpdを起動

```
$ sudo /etc/rc.d/init.d/vsftpd start
```

自動起動を有効化

```
$sudo chkconfig vsftpd on
```


## vsftpd.confの設定

vsftpd設定ファイルのバックアップ
バックアップファイルを置くディレクトリは任意に。

```
$ mkdir vsftpd_conf_bk
$ sudo cp /etc/vsftpd/vsftpd.conf vsftpd_conf_bk
```

絶対パスでコマンドを書くのが面倒なので、該当ディレクトリに移動

```
$ cd /etc/vsftpd/ 
```

vsftpd設定ファイルを開く

```
$ sudo vim vsftpd.conf
```

以下vsftpd.confの設定

```
# 匿名アクセスの禁止
anonymous_enable=NO

# 設定したlocal_rootより上層ディレクトリへの移動を禁止
chroot_local_user=YES

# 設定したlocal_rootより上層ディレクトリへの移動を許可するユーザを設定
# 後述の/etc/vsftpd/chroot_listに移動を許可するユーザを記載
chroot_list_enable=YES

# アスキーモードを有効にする
ascii_upload_enable=YES
ascii_download_enable=YES

# -------以降、設定ファイル下部に追記
# /etc/vsftpd/user_listのユーザのみを許可する。
userlist_deny=NO

# パッシブモードを有効化を明示する
pasv_enable=YES

# xxxをftp接続した際のルートディレクトリとして設定する
local_root=/var/www/html/xxx
```

## アクセスディレクトリの制限

/etc/vsftpd/chroot_list（デフォルトだと無いため自分で作成）
![Screen Shot 2015-02-22 at 17.41.13.png](https://qiita-image-store.s3.amazonaws.com/0/43937/363b89f2-2f76-ca61-fb4a-f658f070ac19.png)

/etc/vsftpd/user_list
![Screen Shot 2015-02-22 at 17.40.44.png](https://qiita-image-store.s3.amazonaws.com/0/43937/77f965f7-5b28-5179-0f19-d917011a878d.png)

vsftpd.confの中で、

```
chroot_local_user=YES
chroot_list_enable=YES
``` 

とすることで、chroot_listに記載されたユーザーのみが、全ディレクトリに移動できる。

```chroot_local_user=NO``` だと、/etc/vsftpd/chroot_listに未記載のユーザは、ログイン後に
該当ディレクトリ以外にもアクセスできてしまうため、どちらも```YES```が良いと思われる。


chrootについて詳しく知りたい方は、[FTPサーバ(vsftpd)の構築(RedHat系編)](http://www.aconus.com/~oyaji/ftp/vsftpd_rpm.htm)

## vsftpdの設定を反映

```
$ sudo /etc/rc.d/init.d/vsftpd restart
```
ボタンでスプライトを切り替える

ボタン宣言時のλ関数内で、リンク先の方法が使えなかったので試行錯誤した。
(cf. http://bribser.co.jp/blog/changeimage/)

要点は、
・ベクター形式で画像を格納
・setVisibleで表示非表示を切り替え
・ボタン押下時の操作はsetVisibleのみ

心配なのはメモリの食いだが、とりあえずこの方法を保存しておく。
画像切り替えに置けるメモリ消費はないはず。

以下コード

```c++:changeSprite.cpp
// 親スプライト
Sprite* prnt = Sprite::create();
// 各画像を子スプライトとして登録
Vector childSpr = Vector();
std::string pngName;
for (int i = 0; i < 4; i++) {
pngName = StringUtils::format("%d.png", i);　　　//適当に
childSpr.pushBack(Sprite::create(pngName));
// すべて非表示で登録
childSpr.at(i)->setVisible(false);
childSpr.at(i)->setPosition(prntPos); //prntPosは適当な位置、前もって宣言
prnt->addChild(childSpr.at(i));
}
// スコープ番号のスプライトを表示
childSpr.at(_scpNum)->setVisible(true); //スコープ番号はグローバル変数で宣言


//test button
auto chgBtn = MenuItemImage::create("button.png",
"pressed.png",
[this, childSpr](Ref* ref){
childSpr.at(_scpNum)->setVisible(false);
_scpNum++;
if (_scpNum >= SCOPE_PNG_NUM) { //最大画像登録数
_scpNum = 0; //最初に戻る
}
childSpr.at(_scpNum)->setVisible(true);
});
```
Gradleでtarget=1.8でscalaをコンパイル


#### gradleでtarget=1.8でscalaをコンパイルする。

```groovy
apply plugin: 'scala'

sourceCompatibility = 1.8
targetCompatibility = 1.8 // <= !!

compileScala {
  scalaCompileOptions.additionalParameters = ['-target:jvm-1.8']
}
```

```bash
javap -v ${classファイル} | grep version
```

で「major version: 52」って表示されたらOK。

---

* targetCompatibility  
  ↑これは効かない。  
  1.6と1.7は指定どおりに動いた。。。  
  1.8は対応してないのか...？
Sails.jsでModelごとにDBの接続先を切り替える

普段`models.js`に記述しているadapter定義をModelにも書くだけ。modelにadapter定義が無い場合は`models.js`に書いたデフォルトが反映され、modelに定義がある場合はそのDBを見に行く。

``` api/models/hoge.js
module.exports = {

  adapter: 'someMysqlServer',
  attributes: {

  }
};
```

ちなみにconnections.jsにはいくつでも定義が書けるので、同じDBシステムを使いながらModel毎にアクセスするDBサーバやスキーマ(MySQLで言うdatabase)を分けることも可能です。

``` config/connections.js
  someMysqlServer: {
    adapter: 'sails-mysql',
    host: 'localhost',
    database: 'test'
  },

  someMysqlServer2: {
    adapter: 'sails-mysql',
    host: 'localhost',
    database: 'hoge'
  },
```
User.find params[:user_id]の落とし穴


## 問題
- 黙然的に`User.find params[:user_id]`を使っていますが、ある日、「user_idパラメータに存在してないユーザIDを渡してもエラーにならなかったよ」と突っ込まれました。
- 調べてみたら、下記のような検索で、そして`id=333`のレコードが存在していましたwww

```ruby
User.find '333aaa'
# User Load (0.2ms)  SELECT  `users`.* FROM `users`  WHERE `users`.`deleted_at` IS NULL AND `users`.`id` = 333 LIMIT 1
```

- なぜ `users.id = 333`になっているかというと、そもそも

```ruby
[12] pry(main)> '333aaa'.to_i
=> 333
[13] pry(main)>
```

**これは困る**

## 対策
- `String#to_i`の仕様ではありますが、直接にそれを上書きするのは怖すぎる
- `params`でなんとかしたいのですが、整数値のパラメータであるかどうかの情報を持ってないようなので、断念
- 結局、`ApplicationController`に`safe_id_params`メソッドを追加して、`params`から整数値を取得する場合は、`safe_id_params`メソッドを利用するようにしました。
	- 正規表現で数値であるかどうかを判断する
	- 整数値以外のものが含まれている場合は、`-1`を返す
		- `where`の検索条件で使われる前提なので、`id`が`-1`であることはないと思うので、`-1`にしました

```ruby
def safe_id_params(id_string)
  id_string =~ /^\d+$/ ? id_string.to_i : -1
end
```

## 懸念点
- `-1`で返すのは、想定外のケースがあるかどうかはちょっと不安
- おそらくよくあるパターンだと思いますが、ほかの方はどう対応しているのかを知りたいところです
Xcodeのビルド時に初心者が陥りやすい罠

本を買って「さぁ、始めるぞ！」とおもってSWIFT始めたんですが、実行時に下記のエラーが出ました。
  
    error*** CodeSign error: code signing is required for product type 'Application' in SDK 'iOS 8.1'
 

##結論
iPhoneかiPadを繋いでいませんか？それを取って適切なデバイスにすればOKのようです。

基本的過ぎて気付きませんでした。

以上
postLink()のメッセージ内に変数を使う



```
<?php echo $this->Form->postLink('削除', 
	array('action' => 'delete', $user['user']['id']), 
	array('class' => 'btn btn-sm btn-danger'),
	__('ユーザーID:%1$d %2$sさんを削除しますか?', $user['user']['id'], $user['user']['name']));
?>
```

$confirmMessageの部分を配列で、PHPのsprintifと似た形式で書ける。
[PHP: sprintf - Manual](http://php.net/manual/ja/function.sprintf.php)
ruby gold 2.1

2.1も難しかった。

でもやはりネットの海は広大です。ほかに参考になる情報はありますが、
この情報も誰か（自分）のためになるかもと思い残しておきます。

すでに１．８版の試験をもっていてバージョンアップに伴い再受験しました。
基本的には１．８の範囲を押さえつつ、２．１の範囲で点を稼ぐことができ、
９０点くらいで合格できました。
とは言っても、全然楽勝とは思えなかったですが。

###記憶にある限り２．１の範囲は以下
受験時には８問くらいが２．１の範囲だったと記憶している

* iのリテラル記法
* prepend(includeとの違い、優先順を押さえる)
* refinementsをusingする前、した後の動き（定義の仕方、スコープ）
* Fiberの定義、呼び出し、Fiberを定義した時の戻り値（resume、ジェネレータでそこが尽きた時のエラー：FiberError）
* Hashのキーワード引数（キーワードありの場合→変数に受け取ることができる、無しの場合）
* Enaumable#lazy

###個人的に難問題

* 可変長引数の展開のルールで＊をつける場所と結果を選ぶ問題
* ancestorsが呼び出しのタイミングで結果が変わるようなことを問う問題
* ブロックの結合度（do〜end、{}の違い。ブロックとして渡す方法）
* 起動オプション（lが出題されたような）
* to_s,to_strとp,inspectの関連とか再定義とかに絡むところ
* rescueで引数省略でエラーが捕捉される、されないとかを問う問題
* all?とeachを組み合わせて正しい動きになるようにする問題（問題文が長くて全然理解できなかった）

###試験範囲に含まれている認識がなかったもの

* append_features,includedの動き

###既存の範囲

その他については公式教科書の内容がまだ通じました。１．８取得後に手放そうかと思ったけど手元に置いておいて正解でした。

* メソッド内での定数の扱い
* クラスを継承した場合のクラスメソッドの扱い
* module_functionをもつモジュールのincludeと呼び出し（selfが絡んでいた→いつでもselfは大事だ）
* attr_シリーズ
* Threadの中でのエラーとデバッグモードを絡めた話
* ヒアドキュメント
* protectedとprivateメソッドの可視性
* open-uriとopen
* DateTime、Dateの使い方
* Timeのインスタンスの計算結果
* strftimeの記法
cmderからgit bashを使う時のビープ音を無効にする

cmder全体でbeep音を無効にする手順が本家issueに挙がっていたので書いておく。

https://github.com/bliker/cmder/issues/179

cmderのインストールされたフォルダで vendor/init.bat を開いて `net stop beep`との行を入れてやればcmder全体でbeep音が無効化されるらしい。一応自分の環境では後述の設定をした後にこの設定も入れて確認済み。

どうも後述の設定を入れてもsshでvagrantのvmに入った時等にこれが効いていないらしく、init.batにコマンドを追加した所やっとssh接続中も含めてbeep音を無効化できた。

## git bashでの手順 （上述手順を行えば不要？）

http://superuser.com/a/759948

```
echo "set bell-style none" >> ~/.inputrc
```

上記のように.inputrcにベルを無効にする行を追加しておく。cmderを再起動したら次からは鳴らなくなる。
mb_strimwidth関数なんて必要なかった（？）

# 導入

PHPerにとって丸め処理の定番と言われれば、こんなコードを思いつきますよね。

```php
$str = mb_strimwidth($str, 0, 10, '…', 'UTF-8');
```

しかし出力結果が意図したとおりになるためには、以下の条件が揃っている必要がありました。

- 等幅フォントを使用している
- 半角幅になる特殊なマルチバイト文字を使用していない（半角カナなど）

実はこれらの問題を鮮やかに **CSS3** だけで解決する方法がありました。

# 実装

以下のようなクラスを適用すれば実現できます。

```css:CSS
.trim {
    
    /* 任意 */
    min-width: 100px; /* 最小表示幅の指定 */
    max-width: 200px; /* 最大表示幅の指定 */

    /* 必須 */
    white-space: nowrap; /* 空白で改行させない */
    overflow: hidden; /* はみ出た部分を表示しない */
    text-overflow: ellipsis; /* はみ出た場合に「…」を表示 */
    -webkit-text-overflow: ellipsis; /* はみ出た場合に「…」を表示 (Safari用) */
    -o-text-overflow: ellipsis; /* はみ出た場合に「…」を表示 (Opera用) */
    
}
```

**※ インライン要素が対象の場合、`display` プロパティの値を `inline-block` または `block` に設定する必要があります。**

# SEO面での問題点（？）

```css
.trim {
    overflow: hidden;
    text-overflow: ellipsis;
}
```

私が調べた限りでは、この記述が直接SEOペナルティに結び付くという主張をしている人は見られませんでした。安心して使えると思います。むしろ **文字列を削らずにそのままHTML中に残せる** ので、優良な検索結果に結びつきやすいと考えることも出来るかもしれません。

# 参考リンク

- [mb_strimwidth](http://php.net/manual/ja/function.mb-strimwidth.php)
- [mb_strimwidthが意図した結果にならない場合](http://lab.flama.co.jp/archives/1065/)
- [CSS で指定幅を超えた文字列を切り取り「…」を付加する方法](http://monopocket.jp/blog/css/2866/)
- [文字数制限をしないでCSSだけで「...」を表示する](http://www.ilovex.co.jp/blog/system/html/css-1.html)
- [スタイルシートで文字列を省略し、・・・を付ける方法](http://sfi.hamazo.tv/e1906425.html)
- [隠しテキストと隠しリンク](https://support.google.com/webmasters/answer/66353)
- [text-overflow:ellipsis;やoverflow:hiddenの隠しテキストでペナルティを受けるのか](http://www.seo-blogs.biz/2013/01/28/4333/)
CasperJS内でcasperjs --versionとphantomjs --versionの確認をする

```js
String.prototype.trim = function () {
    return this.replace(/^\s+|\s+$/g, '');
};
require("child_process").execFile("/usr/local/bin/casperjs", ["--version"], null, function (err, stdout, stderr){
    test.assertEqual("1.1.0-beta3", stdout.trim());
});
```

```js
String.prototype.trim = function () {
    return this.replace(/^\s+|\s+$/g, '');
};
require("child_process").execFile("/usr/local/bin/phantomjs", ["--version"], null, function (err, stdout, stderr){
    test.assertEqual("1.9.7", stdout.trim());
});
```
非公式QiitaクライアントAndroidアプリ「Qiitapp」リリース


## Qiitapp v1.4.0
ページ内検索機能を追加しました。

1日に2回更新です。無計画。。。

## Qiitapp v1.3.0
注目の投稿、人気の投稿を表示するようにしました。
Qiita公式のトレンドとは内容が異なります。
また、すべてのタグの並び順を投稿数順に変更しています。

Android4時代のUI・実装を変えたいと思いつつもなかなかモチベーションが。。。

対応バージョン: Android 4.4以上

[![Qiitapp](https://developer.android.com/images/brand/ja_app_rgb_wo_60.png)](https://play.google.com/store/apps/details?id=team.birdhead.qiitapp)

## スクリーンショット
![1.png](https://qiita-image-store.s3.amazonaws.com/0/22848/a479d58f-da7f-9f24-db53-7a7738750ec1.png)

![2.png](https://qiita-image-store.s3.amazonaws.com/0/22848/298d074d-675f-fc34-0132-0e9935b0fab6.png)

![3.png](https://qiita-image-store.s3.amazonaws.com/0/22848/31cf8cd0-c4ad-17d3-f4ce-6a1736351200.png)

![4.png](https://qiita-image-store.s3.amazonaws.com/0/22848/187ea063-9003-e052-0778-6790ad89bf00.png)

![5.png](https://qiita-image-store.s3.amazonaws.com/0/22848/a95de642-5c05-7a8e-077b-0ca81c0a763f.png)

## 主な機能
参照系の機能といいね、ストック、フォローが可能

* 注目の投稿、人気の投稿の表示(公式のトレンドとは別)
* OAuthによるログイン（未ログインでも使用可）
* 投稿、タグ、ユーザー、コメントの表示
* 投稿、タグ、ユーザーの履歴表示
* 投稿、タグ、ユーザーの検索
* 投稿のストック、いいね
* タグ、ユーザーのフォロー
* 投稿や一覧ページのシェア、ブラウザ表示
* ページ内検索

## 非対応機能
更新系の機能は非対応

* 投稿・コメントの作成・編集・削除
* Qiita:Team関連機能

## 使用しているOSSライブラリ

* [Okhttp](http://square.github.io/okhttp/)
* [Retrofit](http://square.github.io/retrofit/)
* [Picasso](http://square.github.io/picasso/)
* [Jackson](https://github.com/FasterXML/jackson)

[Butter Knife](http://jakewharton.github.io/butterknife/)や[RxAndroid](https://github.com/ReactiveX/RxAndroid)などは今回は使用せず。
browserify - jqueryの$をスコープの中に閉じ込めたほうがよいのか、他1点

**この記事だいぶ間違っていたので、[あらためて書き直しました。](http://qiita.com/tkdn/items/dd9cd9b6d4094f3b7f48)**

----
# browserify 使ってみてる

## 掲題の件

browserifyでjqueryならびに依存するプラグインなどをまとめてrequireしてみたけど、グローバルを汚染しないまま$をスコープに閉じ込める。これってどうなんだろう、いやそれでいいのか、という迷いが出てきた。

他所から触らせないって意味では、これでよい感がある。

### ブラウザデバッグどうすんだ

じゃ、ブラウザでデバッグしたいときどうするんだろう。chrome dev toolのコンソールによくjqueryの構文を打ってデバッグする自分としては、どうテストしていいか分からない。開発時はjquery及びプラグイン.jsを直読みして、成果物はbrowserifyで吐き出したbundle.js読むとかそういうのがいいんだろうか。

まだきっちり答えが出てない。

## 他1点 browserify-shim と debowerify が一緒に使えない問題

jquery はbower経由じゃなくてカスタムビルドした軽めのものを使う、それと bower 経由でjqueryのプラグインを入れたい。みたいな状況下で、browerify-shimとdebowerify使ってシンボリックはり合うと競合して嫌になる。bower_componentsにjqueryも入れてくるプラグインとかあるじゃないですか（あったんです）。そうするとjqueryがぶつかってしまった。

```json:package.json
{
  "browserify": {
    "transform": [
      "browserify-shim",
      "debowerify"
    ]
  },
  "browser": {
    "jquery": "./lib/vendor/jquery/dist/jquery.js"
  },
  "browserify-shim": {
    "jquery": "$"
  }
}
```

`"jquery": "./lib/vendor/jquery/dist/jquery.js"`がカスタムビルドしてるjquery。もちろんbower_compornentsにもjqueryがあるからぶつかるという感じ。

カスタムビルドのjqueryを外したくなかったので、debowerifyはやめて、browserディレクティブに使うものは全部書くみたいな感じにするということにした。

```json:package.json
{
  "browserify": {
    "transform": [
      "browserify-shim"
    ]
  },
  "browser": {
    "jquery": "./lib/vendor/jquery/dist/jquery.js",
    "jquery.plugin01": "./bower_components/jquery.plugin01/dist/jquery.plugin01.js",
    "jquery.plugin02": "./bower_components/jquery.plugin02/dist/jquery.plugin02.js"
  },
  "browserify-shim": {
    "jquery": "$"
  }
}
```

```js:index.js
var $ = require('jquery');
require('jquery.plugin01');
require('jquery.plugin02');
```

これでぶつからない。

---

本日は以上です。
【Ruby De】csvを使ってなんかする【練習】


ruby on rails が流行っているのですが
そんなにruby自体を触ったこと無いので

ちょっろ練習です。


```ruby
require 'csv'
data_list = Array.new

csvDatas = CSV.read('test.csv')
csvDatas.each do |data|
  #1列　２列　３れつ
  menu_data = [data[0], data[1], data[2]]
  data_list.push(menu_data)
end

puts('sample.csv を読み込みました。')

file_name = "test.txt"    #保存するファイル名

File.open(file_name, 'w') {|file|
  data_list.each do |data|

    write = "num:"+data[0]+" name:"+data[1]+" age:"+data[2];

    file.write write
  end
}

puts('書き込み完了')


```

標準でcsvを読み込むあれ（require 'csv'）がついていて便利ですね！

データの中身をランダムにして書き込む時は

```ruby
data_list.shuffle!
```

とするといいそうです。
んー。()がないぶんPHPと違ってメソッドなの？それともポインタ？
とはっきり区別出来ないので勘違いすることが多そうですね。

rubuMasterになればそのへんは直感でわかったりするのでしょうか。

勉強に励みます。
Unityで拡張子を変換するエディタ拡張

UnityでLive2Dのファイル（.moc、.mtn）をインポートする時、Unityに持って行く前にbytes拡張子を付けて[テキストアセット](http://docs.unity3d.com/ja/current/Manual/class-TextAsset.html)にする必要があります。
毎回面倒だな〜って思っていたので、ファイルをUnity上にドラッグ＆ドロップしたらbytes拡張子をつけるエディタ拡張を作りました。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/15028/9ae09622-fd99-3998-9380-496c71500db8.png)


Editorフォルダを作って以下のスクリプトを入れればOK！
ファイルアクセス系は重そうなので、複製してから削除という処理にしてます。

##ソースコード

```csharp:AssetRenameBytes.cs
using UnityEngine;
using UnityEditor;
using System.IO;
using System.Collections;

public class AssetRenameBytes : AssetPostprocessor {
    /// <summary>
    /// あらゆる種類の任意の数のアセットがインポートが完了したときに呼ばれる処理
    /// </summary>
    /// <param name="importedAssets"> インポートされたアセットのファイルパス。 </param>
    /// <param name="deletedAssets"> 削除されたアセットのファイルパス。 </param>
    /// <param name="movedAssets"> 移動されたアセットのファイルパス。 </param>
    /// <param name="movedFromPath"> 移動されたアセットの移動前のファイルパス。 </param>
    static void OnPostprocessAllAssets
        (string[] importedAssets, string[] deletedAssets,
         string[] movedAssets, string[] movedFromPath)
    {
        // アセットがインポートされた場合
        foreach(string asset in importedAssets){
            // 拡張子のみ取得
            string type  = Path.GetExtension(asset);

            // mtn、mocファイルをインポートした時
            if(type == ".mtn" || type == ".moc"){
                // 拡張子にbytesを付けて複製
                FileUtil.CopyFileOrDirectory(asset, asset + ".bytes");
            }

            // bytesファイル作成時に走る処理
            if(type == ".bytes"){
                // 拡張子なしのファイル名を取得
                string filenm = Path.GetFileNameWithoutExtension(asset);
                // コピー元ファイルとmetaデータを削除
                FileUtil.DeleteFileOrDirectory(asset.Replace(".bytes", ""));
                FileUtil.DeleteFileOrDirectory(asset.Replace(".bytes", ".meta"));
                Debug.Log(filenm + "をbytes拡張子に変換");
                // Editorに反映されるの遅いのでリフレッシュ
                AssetDatabase.Refresh();
            }
        }
    }
}
```

mocやmtnファイルをドラッグ＆ドロップすれば変換してくれます。
なかなか元ファイルが削除されない時があるけど、1分弱ほっておけば削除されます。
![result.png](https://qiita-image-store.s3.amazonaws.com/0/15028/caa280a9-b549-0ad0-592c-852bfff942b3.png)

始めはAssetDatabaseでやろうと思ったけど、参考URLのように拡張子は変換してくれないのでFileUtilで解決できました。

[参考URL]
[アセット読み込み時に独自の処理を実装する](http://neareal.net/index.php?ComputerGraphics%2FUnity%2FTips%2FEditor%2FCustomAssetPostprosessor)

[【Unity】AssetDatabaseでアセットを操る！] (http://yusuke-hata.hatenablog.com/entry/2014/12/04/230630)


2015/02/24追記
実は半年前ぐらいからLive2D Unity SDKに同じような処理がありました。
でも、motionsフォルダごとドラッグ＆ドロップすると変換されないファイルがいくつか出るので謎です。
このページに書いたソースならフォルダごと大丈夫でした。
SampleApp1\Assets\Editor\Live2DImporter.cs

2015/10/16追記
ちなみにファイル名.mtn.bytesにするとLive2D Viewerで参照できなくなる。
その場合はコマンドプロンプトで拡張子を一括置換してみるといいかも。
対象フォルダに移動して「ren *.mtn.bytes *.」とするとbytes拡張子が取れる。
macの場合は[Shupapan.app](http://sunsky3s.s41.xrea.com/shupapan/)というフリーソフトで一括置換がおススメです
Railsでの日本語対応（i18n日本語辞書データ）


Railsでの日本語対応。

i18nの設定で対応という事で一般的な記載。

```rb:config/application.rb
module AppName
  class Application < Rails::Application
    config.i18n.default_locale = :ja
  end
end
```

一般的にi18nで日本語対応しているだけです。

で、「パーフェクト Ruby on Rails」にあったやり方。
汎用的なエラーメッセージ用の辞書データはrails-i18nのリポジトリにまとめられているようなので、辞書データを保存。

```bash
$ curl -o config/locales/ja.yml -L https://raw.githubusercontent.com/svenfuchs/rails-i18n/master/rails/locale/ja.yml
```

確かに汎用辞書適用は便利かも。

★Railsの多言語化対応 I18nのやり方を整理してみた！【国際化/英語化】
http://morizyun.github.io/blog/i18n-english-rails-ruby-many-languages/


※追記
Gemを使ってのインストールが便利そうです。
http://easyramble.com/i18n-with-i18n-generators.html
iTunesConnectに提出する際のエラー解決方法（適宜追加）

####1. This bundle is invalid. Apps that include an arm64 architecture are required to include an armv7 architecture.
提出用にビルドをarchiveして、validateしてみるとこんな感じのエラーが出てしまいました。
原因は実機を繋げたままarchiveしていることでした。実機を外してターゲットが[iOS Device]になっていることを確認してからアーカイブしたらできました。
参考：[StackOverflow](http://stackoverflow.com/questions/22421234/apps-that-include-an-arm64-are-required-to-include-to-include-both-armv7-and-ar)

![スクリーンショット](https://qiita-image-store.s3.amazonaws.com/0/44151/a09b7d36-9315-1758-f1b0-90a995517a81.png "スクリーンショット 2015-02-22 15.28.56.png")
Rubyスクリプトでレコードのフラグを監視して変更を通知する

数十分かかる処理の終了をレコードのフラグ値で検知しなければならない場面がありました。
当初はタイマーをかけて、５分毎に手動でselectを発行して目視確認してましたが、面倒なので自動化しました。

### 必要なもの

* Ruby
* oci8 (gem)

### スクリプト

``` check_upload_flg.rb
# coding : sjis
require 'oci8'

user = 'user'
pass = 'pass'
tns  = 'tns'

sql =<<SQL
select UPLOAD_FLG
from UPLOAD_MNG
where id = 3
SQL

begin
  conn = OCI8.new(user, pass, tns)
  finished = false

  loop do
    conn.exec(sql){|row| finished = (row.first == 1) }
    if finished
      `msg gomao9 /time:3600 アップロード終了`
      break
    end

    sleep(30)
  end

ensure
  conn.logoff if conn
end

```

`conn.exec(sql)～` のあたりはもっと綺麗に書けそうですが、hackなので動けばよし。

`msg` は、ダイアログで通知を行うコマンド。初めて知りました。
他のマシンや自分以外のユーザに送る場合には、別途設定やオプション指定が必要みたいですが、自分へのリマインド目的なら`msg ユーザ名 メッセージ`で十分。

※追記
`msg`コマンドに `/time:時間` オプションを指定すると、ダイアログが自動で消去されるまでの時間を設定できます。デフォルトは60（秒）。
Linux で Samba をマウント

主に自分向け。

# はじめに

ローカルのパソコンで開発や動作確認をとるため仮想環境を構築することがあると思う。

そこで、たとえばローカルのファイルをリモートとやり取りすることを検討すると思う。

VirtualBox であれば、 共有フォルダの仕組みがあり使えると思う。

しかし、 client Hyper-V などの共有フォルダの仕組みを提供しない環境を利用する場合困ると思う。

これを `mount.cifs` を利用し samba でローカルのディレクトリを仮想環境にマウントすることで対応する。

# 事前準備

1. ローカルのパソコンの共有したいディレクトリを共有する。 (セキュリティに注意)
2. `cifs-utils` をインストールする。

# 設定

仮想環境で以下のコマンドを叩く。以下は例なので適宜設定を見直すこと。

```console
# mount -t cifs -o credentials=</path/to/samba/.credential>,uid=<uid>,gid=<gid>,file_mode=0777,dir_mode=0777,rw </samba/path> </path/to/mount/target>
```

なお、 `</path/to/samba/.credential>` は以下の書式。詳しくは `man mount.cifs` とすること。

```
username=<value>
password=<value>
domain=<value>
```

## /etc/fstab の場合

以下の設定を `/etc/fstab` に記載する。状況によっては `/etc/rc.local` に上記のコマンドを設定しないと動かないケースがあるかも。

```
</samba/path> </path/to/mount/target> cifs credentials=</path/to/samba/.credential>,uid=<uid>,gid=<gid>,file_mode=0777,dir_mode=0777,rw 0 0
```
Dashのdocset作成方法


Dashのdocset作成方法を[自作Dash docsetの作り方 — Alfred + Dashの爆速リファレンス引き環境を拡張する | ここぽんのーと](http://cocopon.me/blog/?p=5356)←こちらや公式ドキュメントを参考にしながら書こうと思ったのですが、、

GitHubでこんな素敵なコードがあったので[alexblunck/Dash-Docset-Creator](https://github.com/alexblunck/Dash-Docset-Creator)

こちらを使わせていただくととりあえずHTMLデータさえ揃っていればデータベース作ったりなんやかんやする必要なく作成出来ちゃいました。

###PHPの日本語版を作った流れ

1. [PHP: Get Download](http://php.net/get/php_enhanced_ja.chm/from/a/mirror)
ここからドキュメントデータをダウンロードする。
UserNoteなしで良ければ他のでも。

2. [alexblunck/Dash-Docset-Creator](https://github.com/alexblunck/Dash-Docset-Creator)
Githubから上記データをクローンする。

3. docset.config.phpに必要事項を記入。

4. あとは$ php create-docset.phpの実行。
メソッド、クラスなどの区分けは行われませんがとりあえずすぐに使えます。

やっぱり日本語便利！！
[Unity] MiniJsonをちょっと楽にするスクリプト


Unity(C#)でjsonったら

- [LitJson](http://lbv.github.io/litjson/) : 型指定して、クラスor構造体に変換する。大型プロジェクトで使うかも
- [MiniJson](https://gist.github.com/darktable/1411710) : object型にする。ゆるく使いたい。

LitJsonは完全に型安全にパースできるけど、
そのためにjsonに完全に対応した型を毎回つくらなきゃいけない。
状況に応じて、jsonの中身が変わるようなやつだとつらい。



最近はMiniJsonを使うほうが多いのですが、
いかんせんパラメータのアクセスが面倒。

例えばこんなjsonがあったとして…。

```sample.json
{
  "result":"ok",
  "response":{
    "code":1,
    "users":[
      {"name":"kuro"},
      {"name":"tama"}
    ]
  }
}
```

よくある普通のjsonですが

## MiniJson

```C#:Sample_MiniJson.cs

var json = (IDictionary) MiniJSON.Json.Deserialize (jsonAsset.text);

// 一階層目までは楽。
string result = (string) json["result"];

// クロの名前を…
var response = (IDictionary) json["response"];
var users = (IList) response["users"];
var kuro =  (IDictionary) users[0];
string kuroName = (string) kuro["name"];

Debug.Log(kuroName);
```

jsとかやってた人には耐えられない感じになります。


## JsonNode.cs

MiniJson + このスクリプトを入れれば、こんなかんじでアクセス出来るようになります。
[JsonNode.cs](https://gist.github.com/asus4/7f7b5912d703f44c2711)

```C#:Sample_JsonNode.cs

JsonNode json = JsonNode.Parse(jsonAsset.text);

// Get<T> で型指定して取得
string result = json["result"].Get<string>();

// IDictionary or IListは繋げられます
string kuroName = json["response"]["users"][0]["name"].Get<string>();

Debug.Log(kuroName);

```

for文も使えます。

```C#:Sample_foreach.cs

JsonNode json = JsonNode.Parse(jsonAsset.text);
foreach(var user in json["response"]["users"]) {
    string name = user["name"].Get<string>();
    Debug.Log(name);
}

```

jsなんかにくらべると、まだ固いですが。
これくらいのゆるさで使えれば、わりかし楽になるかと。

[JsonNode.cs](https://gist.github.com/asus4/7f7b5912d703f44c2711)
MongoDBにデータを入れてみる

# やること
ひたすら"hogehoge"という文字列をローカルにたてたMongoDBにぶち込み続ける

# じゅんび
MongoDBをローカルにインストールして立ち上げておいてください。
「MongoDBの薄い本」が参考になります。

あとpymongo入れといてください。pythonでMongoDB触るためのやつです。

# かきこむ
"hogehoge"を準備でたてたMongoDBのなかにぶちこみます。

まずgetDBCollectionでローカルのMongoDBへのクライアントを用意して、コレクションを選択する。
あとはCollection.insert(formatToInsert("hogehoge"))で書き込むだけ。

```lang:Main.py
#-*- coding: utf-8 -*-

from pymongo import MongoClient

# DBの書き込み先を取得する
def getDBCollection():
    # LocalhostのMongoDBに書き込みます
    client = MongoClient()
    # LogsDBというDBを使います
    db = client.LogsDB
    # LogsCollectionというコレクションを使います
    Collection = db.LogsCollection
    return Collection

# データを書き込み用に変形する
def formatToInsert(Contents):
    # DBの  "キー名"     : "データ"   
    return {"Contents"  : Contents}

if __name__ == '__main__':
    Collection = getDBCollection()
    # コレクションにレコードを書き込みます
    while true:
        Collection.insert(formatToInsert("hogehoge"))
        time.sleep(10)
```
Atom でメニューバーが消えてしまった時

# メニューバーを非表示にしてしまった

何気によくある（？）この手の問題。
ちょっと探してもすぐに見つからなかったのでメモ。

## メニューの再表示方法

1. `Ctrl + Shift + P` 押下  
※ Macの場合は `Cmd + Shift + P` だが、そもそもメニューが消えない。
1. メニュー一覧が表示される
1. `toggle` と入力
1. `Window:Toggle Menu Bar` を選択
1. メニューが表示される

## メニューの消し方

説明不要ですが、消し方も。

1. メニューバー
1. View を押下
1. Toggle Menu Bar を押下
【STEP3】run（実行）する : Scalaでコードを書く

run（実行）する : Scalaでコードを書く
=======

この記事はScalaでコードを書く時の、セットアップや動かし方、テストなどをまとめた研修用資料です。

## 実行

実行します。

※ コマンドプロンプトから実行します。eclipseはエディタとして使用し、eclipseから実行することはありません。

### コマンドプロンプトから実行

- コマンドプロンプロトを起動し、プロジェクトが存在するディレクトリまで移動します。

```
cd [プロジェクトのルートディレクトリ]
```

- activatorを起動します。

Windowsの場合

```
activator.bat
```

Macの場合

```
./activator
```

ここから一緒です。

- Mainクラスを実行します。

```
> run
```

下記のように表示されれば成功です。

```
[info] Running com.example.Hello
Hello, world!
[success] Total time: 0 s, completed 2015/02/22 14:16:00
> 
```

- コードを変更して、再度実行してみましょう。

(before)


```scala:Hello.scala
package com.example

object Hello {
  def main(args: Array[String]): Unit = {
    println("Hello, world!")
  }
}
```

(after)

```scala:Hello.scala
package com.example

object Hello {
  def main(args: Array[String]): Unit = {
    println("Aloha, world!")
  }
}
```

- Mainクラスを再度実行します。

```
> run
```

下記のように表示されれば成功です。

```
[info] Running com.example.Hello
Aloha, world!
[success] Total time: 0 s, completed 2015/02/22 14:18:00
> 
```

- 変更する度に「run」コマンドを実行するのは面倒です。「~」をコマンドの頭に追加すると、変更を検知して実行してくれます。

```
> ~run
```

下記のように表示されます。

```
[info] Running com.example.Hello
Aloha, world!
[success] Total time: 0 s, completed 2015/02/22 14:19:00
1. Waiting for source changes... (press enter to interrupt)
```

- eclipse上でコードを変更して保存してみます。

```scala:Hello.scala
package com.example

object Hello {
  def main(args: Array[String]): Unit = {
    println("Bye, world!")
  }
}
```

- 変更を検知して、再度「run」コマンドが実行されます。

```
[info] Compiling 1 Scala source to /Applications/eclipse/workspace/minimal-scala/target/scala-2.11/classes...
[info] Running com.example.Hello
Bye, world!
[success] Total time: 4 s, completed 2015/02/22 14:20:00
2. Waiting for source changes... (press enter to interrupt)
```
【STEP2】IDE（eclipse）にプロジェクトをインポート : Scalaでコードを書く

IDE（eclipse）にプロジェクトをインポート : Scalaでコードを書く
=======

この記事はScalaでコードを書く時の、セットアップや動かし方、テストなどをまとめた研修用資料です。

## IDE

Scalaでコードを書く時のIDEは、今の所下記2つ辺りが良さそうです。

- [eclipse](https://eclipse.org/)
- [Intellij IDEA](https://www.jetbrains.com/idea/)

今回はeclipse(luna)を使います。

### eclipseにScala用のプラグインをインストールする

[Scala IDE for eclipse](http://scala-ide.org/download/current.html)を使います。

1. eclipseのツールバーの「Help」を選択し、「Install New Software...」をクリックします。
1. 上記サイトに記載されていた下記URLを「Work with:」に入力します。  
http://download.scala-ide.org/sdk/lithium/e44/scala211/stable/site
1. 表示されたプラグインを全てチェックし、「Next」をクリックします。
1. License条項に同意し、「Finish」をクリックします。
1. 最後にeclipseを再起動します。

### eclipseにプロジェクトをインポートする(Windowsの場合)

- コマンドプロンプロトを起動し、プロジェクトが存在するディレクトリまで移動します。

```
cd [プロジェクトのルートディレクトリ]
```

- activatorを起動します。

Windowsの場合

```
activator.bat
```

Macの場合

```
./activator
```

ここから一緒です。

- eclipse用の.projectと.classpathファイルを作成します。  
(※「with-source=true」オプションでソースをダウンロードし、eclipse上でソースを参照出来ます。)

```
> eclipse with-source=true
```

初回実行時はかなり時間がかかるので、ゆっくり待ちます。  

急ぎの人はオプション無しでも良いです。

```
> eclipse
```

下記が表示されたら完了です。

```
[info] Done updating.
[info] Successfully created Eclipse project files for project(s):
[info] minimal-scala
```

最後に、eclipseにプロジェクトをimportします。

- eclipseのツールバーの「File」を選択し、「Import」をクリックします。
- 「Existing Projects into Workspace」を選択し、「Next」をクリックします。
- 「Select root directory」の「Browse...」を選択し、プロジェクトのルートディレクトリを選択し、「開く」をクリックします。
- 「Finish」をクリックします。

※ 今後、eclipseでビルドすることはしませんので、eclipseの「Build Automatically」はチェックを外すようにします。ツールバーの「Project」からチェックを外します。

### Windows用の文字コード対応

activator.bat起動時に、キーボードの上矢印（↑）で以前入力したコマンドを再度実行したい場合があります。
Windowsの場合にはデフォルトでは文字化けしてしまうため、activatorの設定を変更します。

- ユーザのホームディレクトリにある「.activator」というディレクトリ内に、「activatorconfig.txt」という設定ファイルがあります。

```
例) C:\Users\john\.activator\activatorconfig.txt
```

もしディレクトリやファイルが存在しなければ新規に作成してもよいです。
ファイル名の頭が「.(ドット)」のディレクトリはコマンドプロンプトから作成します。

```
c:\> cd [ユーザのホームディレクトリ]
C:\Users\john\> mkdir .activator
```

- activatorconfig.txtを開き、下記を追記してください。

```
-Dinput.encoding=Cp1252
```

既に「-Dfile.encoding=UTF-8」が記載されている場合は、下記のようにコメントアウトして追記してください。

```
#-Dfile.encoding=UTF-8

-Dinput.encoding=Cp1252
```
【STEP1】新規プロジェクト作成 : Scalaでコードを書く

新規プロジェクト作成 : Scalaでコードを書く
=======

この記事はScalaでコードを書く時の、セットアップや動かし方、テストなどをまとめた研修用資料です。

## 新規プロジェクト作成

Scalaプロジェクトを作成します。主に下記2つの方法があります。

- [sbt](http://www.scala-sbt.org/0.13/tutorial/ja/index.html)

Scala用のビルドツールです。

- [activator](https://typesafe.com/get-started)

Typesafe社というScalaを推進している会社が提供しているScala用のビルドツールです。  
(※中身はsbtをラップしたもので、sbtと同様のことが出来ます。加えて、プロジェクトの雛形を作ったり、GUIから操作する機能が追加されています。)

今回はactivatorを使います。

### 事前にactivatorのファイルをダウンロードしておきます。

1. [activatorのサイト](https://typesafe.com/get-started)からダウンロードします。
1. zipファイルを解凍します。

### activatorでプロジェクト作成

Windowsの場合

- **activator.bat**を右クリックし、「開く」をクリックします。

Macの場合

- **activator**を右クリックし、「開く」をクリックします。

後は一緒です。

1. ブラウザでactivatorのGUIが起動します。
1. **Seeds**から「Minimal Scala Seed」を選択します。  
(※色々な雛形があるので便利です。今回は一番シンプルな雛形を選択しました。)
1. 任意のディレクトリを選択し、「Create app」をクリックします。  
少し時間がかかるのでゆっくり待ちます。
1. プロジェクトの作成が完了すると、「Your application is ready!」が表示されます。
1. 「Run the app」をクリックする。
1. 左のサイドバーの「Run」をクリックし「Start」をクリックすると、「Hello, world!」が表示されます。
【STEP0】環境要件（Java） : Scalaでコードを書く

環境要件（Java） : Scalaでコードを書く
=======

この記事はScalaでコードを書く時の、セットアップや動かし方、テストなどをまとめた研修用資料です。


## はじめに

下記バージョンのJavaをインストールしておくこと。

- Java 1.6 以上 

参照: [Scalaに必要なJavaのversion](http://www.scala-lang.org/download/)

※ Scala 2.11.xでは、Java 1.8は未対応なので注意。2.12.xでは対応するようです。

参照: [Scala 2.12 ロードマップ](http://jp.scala-users.org/2014/06/30/scala-2.12-roadmap.html)
pythonでKinesisになんか投げて、入ってることを確認する

# やること
1. "hogehoge"をひたすらKinesisに投げる
1. "hogehoge"が入っているか確認する

# じゅんび
1. Pythonを使えるようにする
1. botoをインストールしておく
1. IAMでKinesisをいじれるアカウントを作成しておく
1. Kinesisにデータを受け取る口であるStreamとShardを作成する

ちなみに今回はshardの名前は「test」で数は1本としています。

# かきこむ
```lang:Main.py
#-*- coding: utf-8 -*-

from boto import kinesis

auth = {"aws_access_key_id":"IAMのACCESS KEYを入れてください", "aws_secret_access_key":"IAMのSECRET ACCESS KEYを入れてください"}

if __name__ == '__main__':
    #            kinesis.connect_to_region('リージョン',IAM認証情報)
    Connection = kinesis.connect_to_region('us-east-1',**auth)
    while true:
        # 書き込む
        #             Connection.put_record(ストリーム名,書き込むデータ, PartitionKey)
        put_response = Connection.put_record('test'    , "hogehoge"  , 'one')
        sleep(10)

```
これだけ。

# みる
shardが増えても処理できるようにshardごとにworkerを取り付けてデータを読むようにしてます。

```lang:show.py
# -*- coding: utf-8 -*-
 
import time
import base64
import multiprocessing
from boto import kinesis
import threading

auth = {"aws_access_key_id":"IAMのACCESS KEYを入れてください", "aws_secret_access_key":"IAMのSECRET ACCESS KEYを入れてください"}

# ストリームの名前
STREAM_NAME='test'
 
def worker(connect, kinesis_iterator):
    next_iterator = kinesis_iterator['ShardIterator']
    while True:
        response = connect.get_records(next_iterator)
        next_iterator = response['NextShardIterator']
        time.sleep(1)
        
        # shardに書かれてる内容を表示する
        for data in response['Records']:
            print(data)
 
 
def get_record():
    connect = kinesis.connect_to_region('us-east-1',**auth)
    stream = connect.describe_stream(STREAM_NAME)
    # shardのリストを取得する
    shards = stream['StreamDescription']['Shards']

    # shardごとにworkerを取り付けてデータを取得する
    for shard in shards:
        kinesis_iterator = connect.get_shard_iterator(STREAM_NAME, shard['ShardId'], shard_iterator_type='TRIM_HORIZON')
        job = threading.Thread(target=worker, args=(connect, kinesis_iterator))
        job.start()
 
if __name__ == '__main__':
    get_record()

```

こんな感じで行けました。