OmniAICreator/Qiita-1.07M huggingface dataset:
vimの使い方まとめ（メモ）

#削除、コピー、貼り付け （コマンドモード）
[n] ＋キー入力と書いているものは、n 文字（行）分の処理も可能です。

```
キー入力	動作
[n] x	カーソル上の1文字削除
[n] X	カーソルの左の文字を1文字削除
[n] d 目的語 
d [n] 目的語	目的語一覧: 
w - カーソル位置から空白を含む単語の末尾まで削除 
e - カーソル位置から空白を含まない単語の末尾まで削除 
$ - カーソル位置から行末まで削除 
d - 1行削除切り取り（カット）
[n] yy	１行バッファにコピー
p	バッファ内のテキストを挿入（文字はカーソルの右、行はカーソルの下に挿入）
P	バッファ内のテキストを挿入（文字はカーソルの左、行はカーソルの上に挿入）
:r [ファイル名]	ファイルの中身を挿入する
```


#検索する

ノーマルモードで/（スラッシュ）を入力するとカーソルが画面下に 移動します。そこで、検索文字列を入力して、[Enter]を入力することで文字列を検索できます。

```
キー	動作
/[検索文字列]	下方向に、[検索文字列]の検索を行う。
?[検索文字列]	上方向に、[検索文字列]の検索を行う。
n	/や?で検索を行った後に、順方向に次の検索結果にジャンプする。
N	/や?で検索を行った後に、逆方向に次の検索結果にジャンプする。
*	カーソル位置の単語を下方向に検索する。/[カーソル位置の単語]と同じ動作。
#	カーソル位置の単語を上方向に検索する。?[カーソル位置の単語]と同じ動作。
```

「/」(スラッシュ）等特殊な意味を持つ文字列を検索したい場合は「\」を付けてエスケープします。
例 \/home\/temp 「/home/temp」という文字列を検索する場合。
gitのタグ一覧表示

gitのタグ一覧表示をしてくれるaliasらしい。
なんか下書きにほったらかしになってた。
妖精さんが作ったのかしら？

どっかから持ってきたものかも。
作者いたらゴメン。

でもなんか便利。

alias.tag-show=for-each-ref --sort=-taggerdate --format='[%(taggerdate:short)] %(tag) %(taggername) %(subject)' refs/tags
二項演算チックなパターンマッチ

この記事で疑問に思ったのでちょっとやってみたことのメモ。
http://qiita.com/mizuki0420@github/items/5156edd9594632a2dfda

普段はこんなのは代入なんかじゃ使いにくいと思うけど、パターンマッチなら面白いかもしれない。

```scala
trait Tree
case class Node(left: Tree, right: Tree) extends Tree
case class Element(value: Int) extends Tree

val t = Node(Element(1),Node(Element(2),Element(3)))

val e1 Node e2 = t
//=> e1: Tree = Element(1)
//=> e2: Tree = Node(Element(2),Element(3))

val (e1 Node (e2 Node e3)) = t
//=> e1: Tree = Element(1)
//=> e2: Tree = Element(2)
//=> e3: Tree = Element(3)

val s = Node(Node(Element(1),Element(2)),Element(3))

val e1 Node e2 Node e3 = s
//=> e1: Tree = Element(1)
//=> e2: Tree = Element(2)
//=> e3: Tree = Element(3)
```

中置すると左結合とみなされて`(e1 Node e2) Node e3` になるんだな。
じゃあ、いつものコロンを置くと…。

```scala
case class `Node:`(left: Tree, right: Tree) extends Tree

val t = `Node:`(Element(1),`Node:`(Element(2),Element(3)))

val e1 `Node:` e2 `Node:` e3 = t
//=> e1: Tree = Element(1)
//=> e2: Tree = Element(2)
//=> e3: Tree = Element(3)
```

予想通り右結合になる。ふむふむ。

さすがに引数が3つになると難しい。最初の1つだけ前に出せるとかそういうこと？

```
scala> case class Hoge(a:Int, b:Int, c: Int)
defined class Hoge

scala> val h = Hoge(1,2,3)
h: Hoge = Hoge(1,2,3)

scala> val Hoge(e,f,g) = h
e: Int = 1
f: Int = 2
g: Int = 3

scala> val e Hoge(f,g) = h
e: Int = 1
f: Int = 2
g: Int = 3

scala> val e f Hoge(g) = h
<console>:13: error: value f is not a case class constructor, nor does it have an unapply/unapplySeq method
       val e f Hoge(g) = h
             ^
<console>:13: error: recursive value x$1 needs type
       val e f Hoge(g) = h
           ^
```

これ、コップ本で説明されてたっけな。読み返してみよう。
チラシの裏: PythonでDockerを使う

https://github.com/dotcloud/docker-py

```
> sudo pip install docker-py
..
> python
>>> import docker
>>> c = docker.Client(base_url='unix://var/run/docker.sock', version='1.8', timeout=10)
>>> c.info()
{u'KernelVersion': u'3.2.0-4-amd64', u'NFd': 10, u'MemoryLimit': 0, u'InitSha1': u'', u'SwapLimit': 0, u'Driver': u'aufs', u'IndexServerAddress': u'https://index.docker.io/v1/', u'NGoroutines': 15, u'Images': 109, u'InitPath': u'/usr/local/bin/docker', u'Containers': 11, u'LXCVersion': u'0.8.0-rc1', u'Debug': 0, u'NEventsListener': 221, u'DriverStatus': [[u'Root Dir', u'/var/lib/docker/aufs'], [u'Dirs', u'135']], u'IPv4Forwarding': 1}
>>> help(c.containers)
Help on method containers in module docker.client:

containers(self, quiet=False, all=False, trunc=True, latest=False, since=None, before=None, limit=-1) method of docker.client.Client instance

(注意: 上の場所はLESSで表示されたり環境によって表示され方変わる)
>>> c.containers(all=True)
[{u'Command': u'do not look at me',
  u'Created': 1391059918,
  u'Id': u'97115535aacbba9fcf19bbd9bc8ca9aac66132f79acf2820d6225a554b06191d',
  u'Image': u'griflet:oajxuu024euvttj0ar0s-23b235cf82b0301f864f6ad100a2b3245b7dca7d',
  u'Names': [u'/drunk_heisenberg'],
  u'Ports': None,
  u'SizeRootFs': 0,
  u'SizeRw': 0,
  u'Status': u'Exit 0'},
 {u'Command': u'do not look at me',
  u'Created': 1391059896,
  u'Id': u'5c796656a414673ead3c74aaafd95ae6f80c00125eda8cf01ea826b76eca7586',
  u'Image': u'54055ba1f6fe',
  u'Names': [u'/pensive_galileo'],
  u'Ports': None,
  u'SizeRootFs': 0,
  u'SizeRw': 0,
  u'Status': u'Exit 0'},
 {u'Command': u'do NOT look at me :-)',
..

(docker ps です基本的に)
```

ipythonだと"c."の後でTabぶち込むと候補が出てくるので、中途半端なシェル環境より分かりやすい操作になるかもしれません。
[Three.js] クォータニオンを使って任意の方向にオブジェクトを向ける


今製作中のもので、丸影を地面に添わせて地面の法線方向に向かせる、というのをやりたかった。
法線自体はすぐに取れたのだけど、Planeをどうやってその法線方向に向かせるか、というのを[こちらの記事](http://marupeke296.com/DXG_No16_AttitudeControl.html)を参考にして作ってみた。

テスト用に法線方向とオブジェクトの方向をテストするものを作ったので、それをベースにメモを残しておく。

##サンプル

![tfJW.jpg](https://qiita-image-store.s3.amazonaws.com/0/5616/c10dad62-29b0-a225-2c9a-298cc7db7d27.jpeg "tfJW.jpg")
http://jsdo.it/edo_m18/tfJW

サンプルはこんな感じで、頭を任意のベクトルに沿わせる、というもの。
x, y, zの軸の位置のスライダーをいじるとそれに応じてオブジェクトが回転します。

##フロー
先にフローを書くと、

1. 向かせたいベクトルと「上」方向のベクトルを取得
2. 上記2つのベクトルとの外積を取る（これが回転軸となる）
3. 上記2つのベクトルの角度を、内積を使って取得
4. これら情報を元に、回転用のクォータニオンを生成
5. 生成したクォータニオンをオブジェクトに適用

という流れ。
「上」と書いたのは必ずしも空方向ではなく、オブジェクトの「上」となるベクトル。
Three.jsを用いたサンプルコードを抜粋すると以下になる。

##サンプルコード

```Threejs-sample.js
//「上」方向のベクトルを生成。サンプルでは「空」方向。
var up = new THREE.Vector3(0, 1, 0);

//法線ベクトルを取得。サンプルではinput要素から取得。
var normalAxis = new THREE.Vector3(+xInp.value, +yInp.value, +zInp.value).normalize();

//回転軸用のベクトルを生成
var dir = new THREE.Vector3();

//「上」方向と法線ベクトルとの外積を計算。正規化。
dir.crossVectors(up, normalAxis).normalize();

//上記ベクトルとの内積（cosθ）
var dot = up.dot(normalAxis);// / (up.length() * normalAxis.length());

//acos関数を使ってラジアンに変換。
var rad = Math.acos(dot);

//クォータニオンオブジェクトを生成
var q = new THREE.Quaternion();

//計算した回転軸と角度を元にクォータニオンをセットアップ
q.setFromAxisAngle(dir, rad);

//適用したいオブジェクトに回転を適用
mesh.rotation.setFromQuaternion(q);
```

Three.jsを使うとクォータニオンとかその他もろもろのめんどくさい計算をやってくれるクラスがあるので、これくらいの行数で簡単にできちゃいます。
deviseで作ったusersテーブルにseeds.rbからユーザーを作成する


普通に作れるかなと思って以下のように書いたんですが、
rake db:seedしてみるとレコードが追加されていませんでした。

```ruby:seeds.rb
User.create(:email => 'hogehoge@hoge.com', :encrypted_password => 'xxxxxxxxxxxxxxxxxxx')
```

次のように修正するとちゃんとレコードが追加されました

```ruby:seeds.rb
user = User.new(:email => 'hogehoge@hoge.com', :password => 'hugahuga')
user.save!
```

参考: http://stackoverflow.com/questions/12418584/seeding-users-with-devise-in-ruby-on-rails
Bitbucket で最新のソースを表示するURL

GithubだとCodeからたどったURLはbrabchの最新を表示するURL

```
https://github.com/USER/REPOS/blob/master/README.md
```

なのに対して、
BitbucketはソースからたどったURLは特定のコミットを表示するURLになっている。

```
https://bitbucket.org/USER/REPOS/src/3f9639caad0151badb6166408e18e087c8b90884/README.md?at=master
```

これだと更新してもリロードで最新にならないので、URLでここみて！、ってするのが不便なのだが、

```
https://bitbucket.org/USER/REPOS/src/HEAD/README.md?at=master
```

のようにURLのコミットID部分をを「HEAD」にすると、常に最新を表示してくれる
AndroidStudioでDDMSを表示したい


AndroidStudioのバージョン0.4.1からDDMS上でhprofファイルが書き出せるようになりました。
とても嬉しいです。

![DumpJavaHeap!!!](http://tools.android.com/recent/androidstudio041released/heap.png)

このhprofファイルを解析することでプロセス中でメモリリークしてる箇所を調べることができます。
なので、とても嬉しいです。

しかし、肝心のDDMS表示方法が分からずに困ってました。
下記がショートカットです。

`⌘(command)+6`
表示非表示のトグルです

これでOK！
Windowsでのmysql2アダプタのインストール


# WindowsでRails環境を構築時

## 前提条件
* Rubyインストール済み
* 構築マシンにMySQLがインストール済み
http://dev.mysql.com/downloads/installer/
* DevKitがインストール済み 
https://github.com/oneclick/rubyinstaller/wiki/Development-Kit
からダウンロードして展開・配置後

```
ruby dk.rb install
```

ここまでを準備しておく。

## 何もしないでやるとどうなるか？

```
gem install mysql2
```

結果はライブラリやインクルードが見つからないってエラーになってインストールに失敗する。

## 原因
gemがmysql2インストール時に、mysql関連のライブラリを見つけられていないと思われる

## 対応
インストール時の引数で、MySQLのライブラリとヘッダファイルがあるディレクトリを指定する。具体的にはMySQLのインストール先の下にバージョンごとのフォルダがあるので、その配下にincludeとlibというフォルダがあるのでそこを指定する。

```
gem install mysql2 --platform=ruby -- '--with-mysql-lib="MySQLのインストール先\lib" --with-mysql-include="MySQLのインストール先\include"'
```
こんな感じ。もしMySQLのインストール先ディレクトリにProgram Filesなどスペース入りのフォルダがある場合はフォルダ指定の引数を\でエスケープする事

## もう一押し
上記までだとローカルでRails実行時にMySQLのライブラリが見つからんエラーが出るので、使用しているrubyのbinディレクトリに上記のMySQLのライブラリフォルダにあるlibmysql.dllをコピーしておくと幸せ

## おしまい

という感じで割と平穏無事に導入できます。

つーか、こんな苦労して構築せずに、素直にMacか仮想マシンにLinux入れて構築したいと思わないでもないが…
CentOSのネットワーク関係の設定


### NICへのIPアドレス割り当て

```
vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=static
DHCPCLASS=
HWADDR=00:AC:D9:B2:C0:EE
IPADDR=192.168.0.1
NETMASK=255.255.255.0
ONBOOT=yes
```

### GateWayの設定

```
vi /etc/sysconfig/network
NETWORKING=yes
NETWORKING_IPV6=yes
HOSTNAME=CENTOS
GATEWAY=192.168.0.254
```

### DNSサーバの設定

```
vi /etc/resolv.conf
nameserver 8.8.8.8
nameserver 8.8.4.4
```

### 設定の反映

設定を反映させるためには、ネットワークサービスを再起動する。
DNSサーバの設定は、再起動なしでも反映される。

```
service network restart
```
Facebookアプリのテストユーザーの作り方手順

# プライベートアカウントでテストするの怖いです＞＜
GraphAPIを使って使い捨てできるテストユーザーを作りましょう。
案外知られていない、というか、自分自身そういうことが出来ると最近知りました。

公式ドキュメントはこちら https://developers.facebook.com/docs/test_users

## 捨てメアドとかいるの？(´・ω・｀)
いらないです。それはテストユーザーじゃなくて捨てアカウントです。
捨てアカウントを作るの利用規約的にはNGらしい。

### 1.FBアプリを作る
順当に
![WS000002.JPG](https://qiita-image-store.s3.amazonaws.com/0/7193/6ccbeeee-5373-3bdd-0666-20a6d823a0ef.jpeg)

### 2.作成したアプリのAPPIDを確認
https://developers.facebook.com/apps/　
から作成したアプリのダッシュボードを表示
![WS000003.JPG](https://qiita-image-store.s3.amazonaws.com/0/7193/100c93e6-4583-8e57-c33d-3dfc5d35e6a5.jpeg)

### 3.GraphAPIExplorerでapp tokenを取得
https://developers.facebook.com/tools/explorer/
アクセストークンを取得、とGet app tokenの２つのボタンがややこしいので図解
![WS000005.JPG](https://qiita-image-store.s3.amazonaws.com/0/7193/052f04e6-0af8-9177-a5b7-6acafaf10278.jpeg)

### 4.テストユーザー作成用のGraphAPIにリクエストするURLを作成する

```
https://graph.facebook.com/【2.で確認したAPPID】/accounts/test-users?installed=true&name=【テストユーザーの名前（任意）】&locale=ja_JP&permissions=read_stream&method=post&access_token=【3.で作成したapp token】
```

### 5.ブラウザでリクエスト
またはGraphAPIExplorerでGETリクエストしてもOK
![WS000006.JPG](https://qiita-image-store.s3.amazonaws.com/0/7193/af6bb35b-1a6c-8cb1-9ff3-e6455ce054c4.jpeg)

戻ってきたレスポンスのlogin_urlの値にリクエストすれば、テストユーザーとしてFBにログインできます。
![WS000007.JPG](https://qiita-image-store.s3.amazonaws.com/0/7193/064eede2-1b9c-84aa-fd47-1c805f9df3e9.jpeg)


※スクリーンショットのために使用したFBアプリはすでに削除しています。
(｀･ω･´)ゞ
【メモ】rbenv, bundlerトラブル


# 現象

rbenv入れているのに`bundle install`するとシステムのrubyのgemディレクトリにインストールしようとする

```
-> % bundle install
Fetching gem metadata from https://rubygems.org/.........
Fetching gem metadata from https://rubygems.org/..
Installing rake (10.1.1)
Errno::EACCES: Permission denied - /Library/Ruby/Gems/2.0.0/build_info/rake-10.1.1.info
An error occurred while installing rake (10.1.1), and Bundler cannot continue.
Make sure that `gem install rake -v '10.1.1'` succeeds before bundling.
```

```
-> % rbenv versions
  system
* 2.0.0-p353 (set by /usr/local/opt/rbenv/version)
```
本当は`2.0.0-p353`の方に入れたい

# 原因
bundlerのインストール漏れ


```
-> % which bundle
/usr/bin/bundle
```

↑システムのbundlerだった。
ので、`2.0.0-p353`にもbundlerを入れる

```
-> % gem install bundler
Fetching: bundler-1.5.2.gem (100%)
Successfully installed bundler-1.5.2
1 gem installed
-> % rbenv rehash
-> % which bundler
/usr/local/opt/rbenv/shims/bundler
```

これでインストールが出来るようになった

```
-> % bundle install
Fetching gem metadata from https://rubygems.org/.........
Fetching additional metadata from https://rubygems.org/..
Using rake (10.1.1)
Using i18n (0.6.9)
Using multi_json (1.8.4)
Installing activesupport (3.2.16)
Installing builder (3.0.0)
...
Your bundle is complete!
...
```
ユークリッド互除法の計算過程をControl.Monad.Writerで

ユークリッド互除法の計算問題をしていたのですが、途中計算が答えになかったので、自分で作りました。

# ソースコード

```hs:gcd.hs
import Control.Monad.Writer
gcd' :: Int -> Int -> Writer [String] Int
gcd' a b
   |b == 0    = do
                  tell["= " ++ show a]
                  return(a)
   |otherwise = do
                  let nb = a `mod` b 
                      expr = "gcd(" ++ show(b) ++ ", " ++ show(nb) ++ ")"
                      msg  = show(a) ++ " = " ++ show(b) ++ " * " ++ show(a `div` b) ++ " + " ++ show(nb)
                      in (tell["= " ++ expr ++ " [" ++  msg ++ "]"])
                  gcd' b (a `mod` b)

show_gcd :: (Int, Int) -> IO ()
show_gcd (a, b) = mapM_ putStrLn $ snd $ runWriter (gcd' a b)

fib :: Int -> Int
fib 1 = 1
fib 2 = 1
fib n = fib (n-1) + fib (n-2)
```
# 実行結果の例
![gcd_haskell.PNG](https://qiita-image-store.s3.amazonaws.com/0/227/92d94dd4-017d-ac4c-0e65-f8c88cf80a5a.png)
僕とcpとSubprocessと


subprocess回りで少しハマったのでメモ。

デプロイ用のヘルパースクリプトの作成中に、cp -pr相当の処理が必要になった。Pythonで書く(不完全な)cp実装は以下の通り。

```python:python_cp
def _copy(src, dst):
    if os.path.isfile(src):
        shutil.copy2(src, dst)
        return
    if os.path.isdir(src) and os.path.isdir(dst):
        target = os.path.join(dst, os.path.basename(src))
        # TODO Fix behavior like cp -pr (targetディレクトリが存在していた場合、その下にあるファイル/ディレクトリは保持されるべき)
        if os.path.exists(target):
            shutil.rmtree(target)
        shutil.copytree(src, target)
        return
    if os.path.isdir(src) and os.path.isfile(dst):
        raise IOError(
            "(Src:directory/Dest:file) This combination isn't allowed")
```

制約(コメント参照)はあるものの、今回の用途ではそのケースは発生しえなかったため、まあOK。

しかし「うわっ、Subprocessでcp動かせばいいのに、それしないエンジニア（笑）の人って…」という幻聴が、いつもの如く横から聞こえてきたため、subprocessを使う実装も書いてみることとなった。

```python:subprocess_cp_error
def _copy(src, dst):
    subprocess.Popen(['cp', '-pr', src, dst]).communicate()
```

ただ、この実装だとsrcにワイルドカードが使えない。ワイルドカードを解釈するためには、Popenにshell=Trueを渡し、コマンドをシェルを介して実行する必要がある。
http://docs.python.jp/2.7/library/subprocess.html#subprocess.Popen

```python:subprocess_cp_error2
def _copy(src, dst):
    subprocess.Popen(['cp', '-pr', src, dst], shell=True).communicate()
```

で、「これでFinish?」と思いきや、そんなことはなく。上の実装だとcpコマンドが全く動かなくなる。
shell=Trueとした場合、前述の通りシェルを介してコマンドが実行されるわけだが、それは以下のコマンドと等価になる。

```bash:via_shell_error
/bin/sh -c 'cp' '-pr' (src) (dst)
```

一見すると良さそうだが、これだと-prはcpのオプションとしてみなされず、src, dstもcpの引数と見なされない。つまり、cpを何の引数もなく実行したことになり、エラーになる。
正しくは、以下のように一つの文字列で指定してやらなくてはならない

```bash:via_shell
/bin/sh -c 'cp -pr (src) (dst)'
```
で、これに対応するsubprocessを実行するには、Popenに与えるコマンドを、配列ではなく文字列で指定すればよい。

```python:subprocess_cp
def _copy(src, dst):
    subprocess.Popen('cp -pr {0} {1}'.format(src, dst), shell=True).communicate()
```

# 結論

必要なければshell=Trueにするべきでなしw
まあ実際、シェルインジェクションの原因にもなるので、「外部入力を使うときには絶対Trueにすんなよ!」とライブラリリファレンスにも書いてあるし…
Scalaの列挙型をJavaから参照してみる

Javaには列挙型のクラスを作成する`enum`があり、実際にはコンパイル時に色々自動生成しているらしい。
Scalaにはそれとは別の`Enumeration`クラスがあり（むしろ `enum` はキーワードとして予約されていない）、これを継承したシングルトンオブジェクトが列挙するインスタンスのグループを表す。

以下サンプル。

```Signal.scala
/**
 * Define Signal Enumeration
 */
object Signal extends Enumeration {
 
  val Green  = Value        //=> Val(0, "Green")
  val Yellow = Value(2)     //=> Val(2, "Yellow")
  val Red    = Value("RED") //=> Val(3, "RED")
 
  // Alias for Java
  def valueOf(name: String) = withName(name)
 
  // Java-like methods addition (can't use implicitly from Java)
  implicit class JavaLikeValue(v: Value) {
    def name = v.toString
    def ordinal = v.id
  }
}
```

使用するときは以下のようにする。
`implicit class` があると、いかにも列挙型の値にメソッドを追加したように見える。

```ScalaMain.scala
/**
 * Use Signal
 */
object ScalaMain extends App {
 
  // Iteration
  Signal.values.foreach { signal =>
    println(s"id: ${signal.id}, toString: ${signal}")
  }
 
  // Get singleton instance
  val g = Signal.Green
  val y = Signal(2)              // by id
  val r = Signal.withName("RED") // by name
 
  // Mapping function
  def toMessage = {
    import Signal._ // import for shortcut
 
    // pattern match (like switch-case in Java)
    (_: Value) match {
       case Green  => "Go ahead"
       case Yellow => "Be careful"
       case Red    => "Stop"
    }
  }
  println( toMessage(r) )
 
  // implicit conversion
  println( g.name )
  println( y.ordinal )
}
```

一方これをJavaから参照して使う場合は以下のようになる。

```Main.java
public class Main {
  public static void main(String[] args) {
    // Signal class
    System.out.println(Signal.class.toString());
 
    // Signal$ class (Signal.type @ Scala)
    System.out.println(Signal$.class.toString());
 
    // Signal singleton object
    Signal$ obj = Signal$.MODULE$;
    System.out.println(obj.toString());
 
    // Get enumeration instance
    System.out.println(Signal.Green().toString());
    System.out.println(Signal.apply(2).toString());
    System.out.println(Signal.withName("RED").toString());
    System.out.println(Signal.valueOf("RED").toString());
 
    // Instance Type (Inner class of singleton object class)
    Signal$.Value a = Signal.Yellow();
    System.out.println(a.id());
 
    // Use methods explicitly
    System.out.println(new Signal.JavaLikeValue(Signal.Green()).name());
  }
}
```

JavaからScalaコードを参照する場合は、以下に気をつける。

- `object Signal` の型は、`Signal$` として参照できる。
- 列挙子（インスタンス）の型は `Signal$.Value` (内部クラス)となる。
- 暗黙の変換(implicit conversion)は明示的に呼び出す。（Scalaコンパイラの実行時に処理するため）
- Javaのswitch-case文では利用できない(?)

ちなみに、Scalaでは `type Signal = Signal.Value` とすることで型エイリアスを宣言できるが、これもコンパイラが解決してくれるだけなので、出来上がったクラスを javap でチェックしても、型エイリアスの情報は消えている。
sinon.jsをbowerからインストールする時

sinonjsはbower.jsonがあるんですが、そのまま `bower install sinon` だと使えず、buildする必要があります。
ただ、ビルドはビルドでrubyが必要だったりjuicerが必要だったりして面倒です。
ビルド済みのものを使いましょう。

```shell
$ bower install sinonjs --save-dev
```

でok.

使うときはこんな感じでpkgを設定して下さい。


```html
<script src="/bower_components/sinonjs/sinon.js"></script>
```

こういう後でbuildしなきゃいけない系のライブラリが多いとbower installの後で色々とやらなきゃいけないことが多いから、bowerのためにビルド済みのリポジトリ作っておくという戦略が求められる。
gitトラブルシューティング

##リモートブランチと同じ名前のローカルブランチを作ってしまった。
`git checkout origin/hogehoge`
をやろうとして、間違って
`git branch origin/hogehoge`
とやってしまった場合。

とりあえず一旦、間違って作ったorigin/hogehogeをチェックアウトする。

```
git checkout origin/hogehoge
```

リモートとローカルに同じブランチ名のものがある場合、ローカルが優先されるらしい。

チェックアウトしたら、今いるブランチ名を適当なものに変更する。

```
git branch -m foobar
```

##fatal: write error: No space left on deviceというメッセージが出た。
ディスクの容量不足。ディスクを追加するか、要らないファイルを消す。

##間違ってpullしてしまった
`git reset --hard ORIG_HEAD`
で、pullする直前の状態に戻る。
文字列を全て表示する列と省略する列が両方あるHTMLのtable

文字列を全て表示する列と省略する列を両方持つテーブル。
フロントの知識がまるでないと痛感。

```html:sample.html
<html>
<head>
  <style>
    .fixed table {
      width: 100%;
      table-layout: fixed;
    }   
         
    th.fixed, td.fixed {
      max-width: 100px;
      white-space: nowrap;
      overflow: hidden;
      text-overflow: ellipsis;
    }   
  </style>
</head>
<body>
  <table class="fixed">
    <thead>
      <tr>
        <th>visible</th>
        <th>hidden</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>あいうえおかきくけこさしすせそたちつてと</td>
        <td class="fixed">あいうえおかきくけこさしすせそたちつてと</td>
      </tr>
    </tbody>
  </table>
</body>
</html>
```
【ターミナル】さくっとサイトのHTMLの名前一覧と数を調べる

いろいろアプリとか入れるのはめんどいので、コマンドで。
いつも忘れるのでメモ。

## HTMLの名前一覧を取得
サイト直下で

```
find ./ -name "*.html"
```

## HTMLの数を取得
サイト直下で

```
find ./ -name "*.html" | wc -l
```

## オプション：〜分前、〜日前から今まで触ったファイル

### 〜分前（現在から30分前まで）
```
find ./ -mmin -30
```

### 〜日前（現在から3日前まで）
```
find ./ -mtime -3
```

## オプション：特定のディレクトリを除外
https://qiita.com/snaka/items/928d0d47f67bcee600b0

参考：[findコマンドのmtimeオプションまとめ \- Qiita](https://qiita.com/narumi_/items/9ea27362a1eb502e2dbc)
sqlalchemyでgroup_byしてsum


PokoがModelとしてPoko.dateとかでgroup_byして、pvカラムをsumしたいみたいなとき

```
from sqlalchemy import func
q = session.query(Poko.date, func.sum(Poko.pv)).group_by(Poko.date)
```

で

```
for date, sum_pv in q:
	print date, sum_pv
```

みたいにタプルであつかえる

whereはさみたいときは

```
q = session.query(Poko.id, Poko.date, func.sum(Poko.pv)).filter_by(id=1).group_by(Poko.date)
```

みたいに

複数でgroup_byしたいとき

```
q = session.query(Poko.id, Poko.date, func.sum(Poko.pv)).group_by(Poko.date, Poko.id)
```

とか
毎日redmineのissueリストをメールで受け取る

[git-issue](http://yuroyoro.hatenablog.com/entry/20120301/1330580453)を使わせていただきました。

準備
---------

git initだけしたディレクトリを準備。
.git/config に以下記述

```diff:.git/config
[core]
	repositoryformatversion = 0
	filemode = true
	bare = false
	logallrefupdates = true
+[issue]
+	apikey = xxx433d7c1f74a9xxx355d445dxxxa3984956715
+	type = redmine
+	url = http://localhost/projects/study1/
```

redmineのissueリストを表示
--------------

```bash:
$ git issue
```

メールで受信
--------------

* cronに仕込む。

```bash:/home/user/cron/git-issue-list/get-issue-list.sh
#!/bin/sh
set -e
cd /home/user/cron/git-issue-list
# git issue list | awk -F '|' '{print $1}' | mail -s issue_list my@mailaddress.com
git issue | mail -s issue_list my@mailaddress.com
```



注意点
-------

* ruby >= 1.8.7
* gem install git-issue に加え、gem install json が必要。
* markdown拡張で記述しているのがまずいのか、git issue 3 しても404エラーになります。

```text:
404 Not Found
/usr/lib/ruby/1.9.1/open-uri.rb:346:in `open_http'
/usr/lib/ruby/1.9.1/open-uri.rb:775:in `buffer_open'
/usr/lib/ruby/1.9.1/open-uri.rb:203:in `block in open_loop'
/usr/lib/ruby/1.9.1/open-uri.rb:201:in `catch'
/usr/lib/ruby/1.9.1/open-uri.rb:201:in `open_loop'
/usr/lib/ruby/1.9.1/open-uri.rb:146:in `open_uri'
/usr/lib/ruby/1.9.1/open-uri.rb:677:in `open'
/usr/lib/ruby/1.9.1/open-uri.rb:33:in `open'
/usr/lib/ruby/gems/1.9.1/gems/git-issue-0.9.0/lib/git_issue/redmine.rb:181:in `fetch_json'
/usr/lib/ruby/gems/1.9.1/gems/git-issue-0.9.0/lib/git_issue/redmine.rb:197:in `fetch_issue'
/usr/lib/ruby/gems/1.9.1/gems/git-issue-0.9.0/lib/git_issue/redmine.rb:30:in `show'
/usr/lib/ruby/gems/1.9.1/gems/git-issue-0.9.0/lib/git_issue/base.rb:48:in `block in execute'
/usr/lib/ruby/gems/1.9.1/gems/git-issue-0.9.0/lib/git_issue/base.rb:47:in `each'
/usr/lib/ruby/gems/1.9.1/gems/git-issue-0.9.0/lib/git_issue/base.rb:47:in `execute'
/usr/lib/ruby/gems/1.9.1/gems/git-issue-0.9.0/lib/git_issue.rb:166:in `main'
/usr/lib/ruby/gems/1.9.1/gems/git-issue-0.9.0/bin/git-issue:7:in `<top (required)>'
/usr/bin/git-issue:23:in `load'
/usr/bin/git-issue:23:in `<main>'
```
Objective-CやCのプリプロセッサ（マクロ）のメモ


## マクロの入れ子（ネスト）

マクロで指定した数値などをそのまま文字列定数としたい場合などです。

```c
#define ANY_NUM 1

#define _HOGE(str) #str
#define HOGE(str) _HOGE(str)
```

```objc
static NSString *const kSomeString = @"hoge" HOGE(ANY_NUM) @"foo";

// => "hoge 1 foo"
```

※ `#`は引数をそのまま文字列として展開する演算子です。

## Prefixなどのマクロ

```objc
#define Prefix(str) @"Prefix" str
```

どうやら、@""は連続して書くことで連結されるよう。

```objc
NSString *test = @"This " @"is " @"test";
NSLog(@"%@", test); //=> "This is test"
```


## 「##」トークンの結合

```sample.m
#define HOGE(a) tes##a

NSString *test = @"sample text.";
NSLog(HOGE(t));
```

HOGE(t)のところが「tes」と連結され、「test」となり、結果`sample text.`が出力される。

##「…」可変引数

`__VA_ARGS__`で参照できる。

```sample.m
#define HOGE(…) NSLog(__VA_ARGS_)

HOGE(@"---%@---", @"test text."); //=> ---test text---
```

## 「hoge, …」可変引数

こちらも可変引数。ただ、最初の引数は`hoge`に渡され、以降の引数が`__VA_ARGS__`に入る。

## #ifdef HOGE

HOGEシンボルが定義されているか確認する。

```sample.m
#ifdef HOGE
	//HOGEが定義済
#else
	//HOGEが未定義
#endif
```

## #ifndef HOGE

ifdefの逆。未定義の場合に「真」になる。

## #if

ifdefがシンボルの定義判定だったのに対し、こちらは式を評価する。

```sample.m
#if 式1

#elif 式2

#else

#endif
```

## #pragma

pragmaはホストマシンやオペレーティングシステム固有のを使う・・ものらしい。まだしっかり調査してません。

##即定義マクロ

最初から定義されているマクロ。

| 識別子 | 意味 |
|--------|--------|
| `__FILE__` | ソースファイル名 |
| `__LINE__` | 行番号 |
| `__DATE__` | コンパイル日時 |
| `__TIME__` | コンパイル時間 |
| `__STDC__` | ANSI規格対応ならば1、ANSI規格非対応ならば0 |
Elastic Beanstalkに向けてRVMでのRailsのインストール (on Mac OS X Marvericks)

# はじめに
この文章は、Ruby on RailsアプリケーションをAmazon Web Service Elastic BeanstalkにデプロイするつもりでRailsをインストールされる方に向けて書きました。

# 必要なツールのインストール
### gcc
OS X 10.9 Marvericksをお使いの場合は、Xcodeをインストールしたら、ターミナルからgccをインストールしなければなりません。以下のコマンドを実行すると勝手にインストールしてくれます。

```shell-session
$ gcc
```

### brew
コマンドから効率よくツールをインストールするために、brewというパッケージマネージャーをインストールしましょう

```shell-session
$ ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go/install)"
$ brew doctor
$ brew update
```

### git

```shell-session
brew install git
```

### RVM
RVM (Ruby Version Manager)をインストールしましょう。

```shell-session
$ \curl -sSL https://get.rvm.io | bash
```

# Ruby 1.9.3のインストール
Rubyの最新バージョンでは2.0が利用可能なのですが、Elastic BeanstalkではRubyは1.9.3を使用しているので、間違って2.0をダウンロードしないようにしましょう

```shell-session
$ rvm install 1.9.3-p484
$ rvm --default use 1.9.3-p484
```

# Rails 4.0のインストール
Rubyがインストールできたら、最新のRailsをインストールしましょう（Beanstalkでは、なぜかRailsの方は最新が使えるらしい）

```shell-session
$ \curl -L https://get.rvm.io | bash -s stable --rails
```

以上でインストール完了です。
Railsでサブドメインのroutesを定義する方法

以前は下記リンクのrailscastに紹介されている方法で実装していました。

http://railscasts.com/episodes/221-subdomains-in-rails-3


しかし、改めてRails guideを調べてみると[もっと簡単に出来る様です](http://guides.rubyonrails.org/routing.html#request-based-constraints)。


```ruby
constraints subdomain: 'api' do
  # api.sample.com
end

constraints subdomain: '' do
  # sample.com
end
```
gem deviseでAPIの認証を行う方法(Basic認証)

gem deviseはユーザー登録・ログイン機能を手早く実装するのに便利です。

APIを提供する際にもdeviseの機能で認証が出来ると便利と思い調べました。

OAuth2 Tokenによる認証方法だとdevise + doorkeeperが良いと思われますが、もっと簡易的なBasic認証での方法について。

https://github.com/plataformatec/devise/wiki/How-To:-Use-HTTP-Auth-Basic-with-Devise

```ruby
class Api::ApiController < ApplicationController

  before_filter :check_auth


  def check_auth
    authenticate_or_request_with_http_basic do |username,password|
      resource = User.find_by_email(username)
      if resource.valid_password?(password)
        sign_in :user, resource
      end
    end
  end

end
```

wikiの記事そのままですが、上記コードを実装することで`current_user`メソッドからAPIを実行したユーザーのインスタンスを参照出来ます。

※ 実際にサービス提供する際はSSLは必須になりますね :)

## おまけ

下記コードを追加する事で認証無しのリクエスト(ブラウザからのリクエスト時など)を弾くことができる。

```rb
unless env['HTTP_AUTHORIZATION']
  return render json: '{"message":"Requires authentication"}', status: 401
end
```
LLVM SPARCv9 backend が実用的になりつつあります.


2014 年 1 月はたくさんの SPARCv9 backend commit がありましたね.

http://lists.cs.uiuc.edu/pipermail/llvm-commits/Week-of-Mon-20140127/203113.html

http://lists.cs.uiuc.edu/pipermail/llvm-commits/Week-of-Mon-20140127/203131.html

http://lists.cs.uiuc.edu/pipermail/llvm-commits/Week-of-Mon-20140127/202953.html

http://lists.cs.uiuc.edu/pipermail/llvm-commits/Week-of-Mon-20140127/203124.html

とくにこれらのコミットにより, C++ コードが問題なく動くようになってきました. 期待ですね!
PLAY FRAMEWORK2.2での起動時設定

###環境
- play framework 2.2.x

###方法
play frameworkでの本番用起動、開発用起動の方法です。

- 開発モードで起動

 - アクセスごとにコンパイル

 - 必要なら再起動

 - ブラウザ上でコンパイルエラー確認

```bash:開発モード
// 普通に起動
$ play run
// ポート指定
$ play run -Dhttp.port=1234
// jvm起動指定
$ play run -J-Xms128M -J-Xmx512m -J-server
// configfile指定
$ play run -Dconfig.file=/opt/conf/prod.conf
```

- 本番モードで起動
 - オプションは一緒

```bash:本番モード
$ play start
```

### 参考
[play framework2.2 - additional configuration](http://www.playframework.com/documentation/2.2.x/ProductionConfiguration "play framework2.2 - additional configuration")
splunk-sdk-rubyがruby-1.9.2で使えるようになった

https://github.com/splunk/splunk-sdk-ruby/pull/29
でプルリクエストしたのはすぐdevelopにマージされたものの、最近になってようやく
https://github.com/splunk/splunk-sdk-ruby/commit/b1e34d68e0eaa01e65f8e038e6eea731155191da
masterに入り、gemも反映されました。

長かった……。
CloudStackのauthorizeSecurityGroupIngress APIにおけるusersecuritygrouplistパラメータの使い方


## 概要
SecurityGroupのルール追加には

* CIDRをauthorizeするパターン
* usersecuritygroupをauthorizeするパターン

があります.

後者の利用方法(特にAPI利用を前提としたもの)のドキュメンテーションが少ないので関連情報をまとめます

## インターフェース(結論)

```
usersecuritygrouplist[0].account=<account> usersecuirtygrouplist[0].group=<group> account=<account> domainid=<domain id>
```

## その他 付随情報

情報確度が低いのでバージョン等による追加情報、訂正求む！


1. Signature生成 or エンコードでつまづく可能性あり
 配列の部分([0])の影響が疑われ、出回っているkick_apiスクリプトだと改造しないとリクエストが正常に送れないかもしれない

 <デバッグ>
 CloudStackのGUI上からは簡単にオーソライズできる.
 可能ならばManagement Serverに来た動作OKのAPIリクエストと、動作NGの送ろうとしているリクエストを比較してみる 

2. CloudStack 3.x & CloudMonkey(4.x)で動作を確認

 (*) CloudMonkey https://pypi.python.org/pypi/cloudmonkey/ 

3. 該当APIはすべての権限で利用可能 (Domain User / Domain Admin / System Admin)

http://cloudstack.apache.org/docs/api/apidocs-4.2/user/authorizeSecurityGroupIngress.html
SinatraのModular Applicationで機能分割


男は黙ってClassic Styleで1ファイルと言いたいところだがさすがに行数が増えてくるとメンテンナンスし辛いのでファイルをゆるーく分割する。

Modular Applicationの場合は

```ruby:config.ru
require './my_app'
run MyApp
```

のようにして``Sinatra::Base``の継承クラスを``run``で渡して実行できるが、``map``と組み合わせることで、URLのマッピングにあわせて切り替えることができる。


```ruby:config.ru
require './app'
require './hello'

map('/') { run App }
map('/hello') { run Hello }
```


```ruby:app.rb
require 'bundler'
Bundler.require

class App < Sinatra::Base
  configure :development do
    Bundler.require :development
    register Sinatra::Reloader
  end

  get '/' do
    'welcome'
  end

  not_found do
    'not_found'
  end

  error do
    'error'
  end
end
```

```ruby:hello.rb
class Hello < App
  get '/:name' do
    "Hello #{params[:name]}!"
  end
end
```

こんな風にすると``/hello/taro``というリクエストはhello.rbで処理できる。MVCでいうとControllerを作っているだけなのだがMVCやりだすとSinatra以外のフレームワークを使った方がいいんじゃないかと疑心暗鬼になるのでゆるい機能分割程度に留める。
Class内での定数の宣言の仕方


VBScriptのClass内で、PrivateなConst定数を宣言したかったのですが、
以下のような書き方だとエラーになってしまう。

```vbnet:
Class Book
  ' エラー
  ' Private Const Title = "..."
End Class
```

これの解決策は、Getterのみのプロパティを宣言すれば出来た。

```vbnet:
Class Book
  Private Property Get Title()
    Title = "..."
  End Property
End Class

Dim bk
Set bk = New Book
WScript.Echo bk.Title

' Setterがないのでエラー
' bk.Title = "..." 

Set bk = Nothing      
```
カウントなし いいねボタンが公式対応した！


![ライフタイマー2_0_-_未来を楽しくするソーシャルタイマーアプリ-5.png](https://qiita-image-store.s3.amazonaws.com/0/5472/05049738-2e08-37c4-df3e-782da35aefca.png "ライフタイマー2_0_-_未来を楽しくするソーシャルタイマーアプリ-5.png")

最近のいいねには押した後にシェア機能がついているので、シェア吹き出しを活かす必要があるときはJSでのoverflow: hidden解除の実装が必要だった…けれど。

カウントなし いいねボタンが公式対応した！

無駄なoverflow:hiddenとかもう要らない！


Like Button - Facebook
https://developers.facebook.com/docs/plugins/like-button/

リストからbuttonを選択するだけ！
（今まではbutton_countを無理やりCSSで削ってた）

![Like_Button-2.png](https://qiita-image-store.s3.amazonaws.com/0/5472/ccd01f46-658f-a9c7-31ce-e3f7a9687381.png "Like_Button-2.png")


教えてくれた後輩さまに感謝。
ファイル内の正規表現でマッチした行を表示

久しぶりにRubyのプログラムを書きました。
コマンドラインでファイル名と正規表現を入力すると、ファイル内の正規表現にマッチした行を表示するプログラムです。
プログラムは下のようになります。

```rb:matchput.rb
filename = ARGV[0]
word = /#{ARGV[1]}/

File.open(filename, "r") do |file|
  file.each_line do |line|
    puts line if line =~ word
  end
end
```

2行目で第二引数に入力された文字列を正規表現に変換しています。
あとはファイルを読み込み専用で開き、6行目で正規表現にマッチした行を表示しています。
実行結果を下に示します。

```file.txt
I love Ruby.
Ruby is very cool.
```

```bash:実行結果
$ ruby matchput.rb file.txt ^Ruby
Ruby is very cool.
```
実行速度に問題があるかもしれません。
こういうプログラムを簡単に書けるのがRubyの良い所ですね。
Pythonメモ：現在の月を取得

取り出す形式が色々あり、ややこしそうだったのでメモ。
基本的にはcalendarというモジュールを使うとよさげ。

```py
import calendar

cal = calendar.Calendar()    # calendarオブジェクトを作成
# calendar.Calendar(1)のように、週はじめ扱いにする曜日を指定できる。0~6で、デフォルトは0（月曜）。

### 上記Calendarクラスで決めた通りに予定を所得。以下のような形式がある。 ###

cal.itermonthdays(int_year,int_month)
# イテレータ形式。日を順番に取り出せる。

cal.itermonthdays2(int_year,int_month)
# こちらは日と一緒に曜日も取得できる。（day,week_num）というタプルを順番に取得。

cal.itermonthdates(int_year,int_month)
# こちらはdatetime.date(year,month,day)の形。

cal.monthdayscalendar(int_year,int_month)
# [[0,0,1,2,3,4,5],[6,7..],[...]]という感じで週ごとの日を配列で取れる。

### なお、いずれも月初や月末の週には前後の月の月末や月初が入ってくることがあるので注意！


## ちなみにある月の日数のみを知りたい場合は ##
calendar.monthrange(int_year,int_month)
# でOK。１日の曜日（要るのだろうか・・）と合計日数がタプルで返ってくる。

```
CSSアニメーションを（出来るだけ）軽くする

translate3d等コンポジションレイヤー上で動作するプロパティ（いわゆるGPUレンダリング用のレイヤーに配置される）を使っても、
上記を適用した要素がページ内に大量にある場合などはモバイル環境で結構ガタつくケースがある。

そんな時の応急処置をメモ。

1. 出来るだけposition: relativeを使用しない
position: relativeによるレイヤー生成がコンポジションレイヤーとバッティング？してるイメージなのか、デバッガーでコンポジションレイヤーを表示して確認するとアニメと関係ない要素（position: relativeが使用されているレイヤー）までレイヤー上に配置（描画）されるのでposition: relativeを出来るだけ使用しないほうがいいみたい。

2. 組み方的にposition: relativeを取れない場合
z-indexを指定してあげる。

3. いやz-indexも指定してるけど。。。
-webkit-backface-visibility: hiddenや-webkit-transform: translate3d(0,0,0)等のハックを親要素などにも使う。

4. 場合によってはCSS3アニメにこだわらずJSでアニメ、もしくはスプライトシート等の選択肢も考える
発想の転換も必要。ケースバイケース。

## 参考リンク

http://havelog.ayumusato.com/develop/performance/e556-compositing_border_and_layer.html
SSL通信時発生する証明書エラーとその仕組みを理解する



(2014/1/30追記) 
Yahoo!のWebAPIやOpenIDでも同様の事象があったようです。
かなり影響の大きい問題だったのですね。

WebAPIやOpenIDでSSLエラーが起きる現象につきまして
http://techblog.yahoo.co.jp/maintenance/4/


## 問題

curlでとあるhttpsスキームのAPIを叩いたら、こんなエラーが。

```
SSL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
```

後付けで分かりましたが、原因は以下でした。

RHEL5/CentOS5でGlobalSignのルート証明書が有効期限切れで大騒ぎ
http://heartbeats.jp/hbblog/2014/01/rhel5centos5globalsign.html

記事内にもある通り、取り急ぎの対応は
#### 接続側で証明書検証をしないようにする（curlコマンドなら -k をつける）
だったりするのですが、はじめは
#### 証明書切れた癖に検証スルー出来るってどういうこと？そもそもそんな証明書意味ないんでは
とか思ってました・・

ということで、恥を忍んでもろもろ整理してみます。

## 何が起こっていたのか

結論は<strong>クライアント側にインストールされているルート証明書の有効期限切れ</strong>なのですが、順を追ってみます。

### そもそものSSLの仕組みをざっくりと

まずSSLの仕組みを把握しておく必要がありました。
ものすごいざっくりですが、大枠は以下の流れになります。


- もともと、各クライアント（※）には、SSL通信に備えて（認証局/CAが発行した）ルート証明書がインストールされている。

- そのルート証明書によって、（接続先のサーバから得られる）サーバ証明書を検証し、認証局によって正当性が担保されているかどうかチェックする。

- サーバが正当と分かれば、クライアントは共通鍵を準備、サーバへ送信し、以降はその共通鍵を用いて通信を行う。

※ここで言うクライアントとは「あるサーバに対して接続を行う主体/接続元」のこと。
つまりそれは、ブラウザだったり、サーバだったり、何でも有り得ます。

※SSLについての詳細は、以下記事が分かりやすかったです。
イケメンとラブレターで学ぶSSLの仕組み
http://blog.jnito.com/entry/2013/05/26/064803


### つまり、エラーが発生するのは

SSLの流れから考えて、基本的に遭遇するのは以下2パターンだと分かります。

- サーバ側の証明書が不正（有効期限切れorもともと認証局によって正当性が担保されていない、等）
- クライアント側にインストールされているルート証明書が不正（有効期限切れ等）

前者が特によくあるやつですね。

![スクリーンショット_2014_01_29_21_50-2.png](https://qiita-image-store.s3.amazonaws.com/0/8790/be478df4-9968-176c-3e22-205b0af87683.png "スクリーンショット_2014_01_29_21_50-2.png")

通常のwebユーザーとしてもちょくちょく遭遇するこれです。

ですが、今回の原因は<strong>後者</strong>でした。

RHEL5/CentOS5でGlobalSignのルート証明書が有効期限切れで大騒ぎ
http://heartbeats.jp/hbblog/2014/01/rhel5centos5globalsign.html

つまり、

#### （接続先サーバの正当性をチェックするための）クライアント側（となる接続元サーバ（CentOS/RedHat））のチェック用証明書

が期限切れで使えなくなってしまったということ。

こう考えると、

#### 取り急ぎの対応として、接続先サーバの正当性チェックを止める（ことでエラーは回避できる）

というのも納得ですね（もちろん、その際は接続先が間違いなく信頼できる、という前提が必要ですが）。

はじめに問題に遭遇した時は

- クライアント（接続元）としてのサーバ（チェックする側）
- 接続先としてのサーバ（チェックされる側）

という二者を混同していたようです。


## 対策

概念としては、基本は以下の二つになります。

- （上記の通り）接続先のチェックを止めてしまう
- クライアント側にインストールされているルート証明書を最新にする

今回は問題の仕組みの理解/説明を残しておきたかったということで、
対策の詳細は以下記事へのポインタのみで失礼します！

[PHP][cURL] cURLでSSL（https）のCA証明書警告の回避や設定
http://mio-koduki.blogspot.jp/2012/08/php-curlsslhttpsca.html

サーバのSSL CA(認証局)証明書が古くてcurl がエラーになる件
http://d.hatena.ne.jp/hogem/20120705/1340284071
javaScript(基本的な文法)


ここでは`document.write('出力')`の「コンソールログ」を使って進めます。</br>

```ja
document.write('出力')
```

でひとくくりの文です。
つまり下のような書き方になるという訳です。

```js
document.write('出力1');
document.write('出力2');
```

その後続けるときに必ず`;`でつなげます。

「コメントアウト」は//から改行までがコメントになります。</br>これを「行コメント」と言います。

```js
//これはコメントアウトです。
 //document.write('helloWorld');
document.write('helloWorld'); //←ここから適応される。
```

また「/* */」を使ったブロックコメントも使用可能。<br/>

```js
/*これはコメントアウトです。
document.write('helloWorld');
*/
document.write('helloWorld'); //←ここから適応される。
```
お遊び：UIViewのsubviewsから、特定のプロトコルを持つUIViewを探してくる


最初、[【IOS備忘録】UISearchBarのテキストが空の状態で検索ボタンを有効にする](http://life-book.co.jp/delivery/?p=767conform)をやりたかったのです。ですがiOS7時代だと、TextFieldがsubviewsの下の下の方に潜り込んでいるようで、このままでは動きません。
探してピンポイントで拾ってきても良いのですが、subviewsの中を再帰的に探してくる方が、楽しいじゃないですか。わくわくするじゃないですか。

というわけで、[Underscore.m](http://underscorem.org)を使って、特定のプロトコルを実装したsubviewsを探してくるものを作りました。

```objective-c:
@interface UIView(Util)
-(NSArray *)viewsFromSubviewsByMatchProtocol:(Protocol *)protocol;
@end

@implementation UIView(Util)
-(NSArray *)viewsFromSubviewsByMatchProtocol:(Protocol *)protocol
{
    // 1. 配列subviewsの中身を１つずつUIViewとして取り出す
    // 2-a. それがプロトコルを実装していればそれの入った配列を用意
    // 2-b. それがプロトコルを実装していなければ空の配列を用意
    // 3. 2.の配列とくっつけながら、再帰呼び出しして結果を配列で返す
    // 4. flattenで配列を整える
    return _.array(self.subviews).map(^NSArray *(UIView *view){
        NSArray *conformedViews =[view conformsToProtocol:protocol] ? @[view] : @[];
        return @[ conformedViews, [view viewsFromSubviewsByMatchProtocol:protocol]];
    }).flatten.unwrap;
}

@end

// 使うときはこんな感じ
NSArray *textFields = [UIView viewsFromSubviewsByMatchProtocol:@protocol(UITextInputTraits)];
id<UITextInputTraits> textField = textFields[0];


```

実用的か？といわれたら、さぁどうでしょう。
こんな書き方も出来るよ的なお遊びでした。
tigの画面をアニメGIFで紹介してみる（ブラウズ編）

tigを使ったことの無い方に魅力を伝えるのは少し大変です。
「tigは軽量で使いやすいコマンドラインGUIツール」と言葉で説明されても想像が難しいからです。

良いスクリーンキャストがあればご紹介しようと思いましたが、無かったので試しに作ってみました。
tigの操作のうち、リポジトリを探索する時に使う画面をお見せします。

使用したツールは[LICEcap](http://www.cockos.com/licecap/)のMac版です。
一部の画像では[KeyCastr](http://download.cnet.com/KeyCastr/3000-2075_4-125977.html)を利用してキー入力を可視化しています。
対象はtigそのものの[GitHubリポジトリ](https://github.com/jonas/tig)です。

# 起動 - mainビュー

tigの起動からmainビューまでを紹介します。
![tig-intro-with-keyview](http://f.cl.ly/items/3p3R2P353l3g1X0x0P1k/tig-intro-with-keyview.gif)

1. コマンドラインからtigを起動
1. tigのmainビューで`j` or `k` でスクロール
1. splitしたdiffビューで差分を確認
1. カーソル上下でコミットの移動、`j` or `k` でdiffビューのスクロール


# branchビュー - ブランチのcheckout

branchビューで各ブランチを確認し、checkoutするまでを紹介します。
![tig-branch](http://f.cl.ly/items/2y311W2A0g2t3F0t2O1o/tig-branch.gif)

1. tigのmainビューで `H` を押下してbranchビューへ
1. splitしたビューでブランチ毎の履歴を確認
1. `C`で`git checkout %(branch)`

# treeビュー - blobビュー

treeビューでディレクトリを探索し、ファイルを開いて中を確認します。
![tig-tree](http://f.cl.ly/items/2D0J303b1Q3T1Y253Y06/tig-tree.gif)

1. tigのmainビューで `t` を押下してtreeビューへ
1. ディレクトリを探索
1. ファイルを選んで`Enter`するとsplitしたblobビューへ

# blobビュー - blameビュー

blameビューを使って行ごとのファイルの歴史を辿ります。
![tig-blame](http://f.cl.ly/items/3W0d3E1i1S2b0P3c1h1B/tig-blame.gif)

1. diffビューで任意のファイルの差分行から`f`でblobビューへ
1. blobビューで`B`でblameビューへ
1. 任意の行で`Enter`すると、その行がコミットされたコミットのdiffビューがsplit表示
1. blameビューで任意の行で`B`すれば再帰的にblame


以上です。好評であれば編集系の操作も紹介したいと思います。
※ 追記： 続編を書きました → [tigの画面をアニメGIFで紹介してみる（ファイル編集・差分の削除・revert編](http://qiita.com/yoshikazusawa/items/d0df1327dcc9797bb91d) 

（ちなみに今回使用したLICEcapはなかなか便利でした。LICEcapの説明は[デスクトップの指定した範囲をGIFアニメとして録画『LICEcap』 - Macの手書き説明書](http://veadardiary.blog29.fc2.com/blog-entry-4780.html)等が参考になります）
macにvagrantでcentoOS環境構築


## virtualBox install
バイナリDLしてインストール

## vagrant install
http://www.vagrantup.com/downloads.html
上記からバイナリDLしてインストール

* gem　があるけど使えない

## CentOS6を作成する
boxにcentos63という名前をつける
※init時に名称指定しないと「base」というboxがdefaultになるらしい

```
vagrant box add centos63 http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.3-x86_64-v20130101.box

```

### 仮想環境を保存するディレクトリで以下コマンド
```
cd ~/virtual_work/centos63

vagrant init centos63
```

### ネットワーク設定
```変更前 
vim Vagrantfile

# config.vm.network :private_network, ip: "192.168.33.10"
```
上記のコメントを解除する。

```変更後
 config.vm.network :private_network, ip: "192.168.33.10"
```


### 仮想環境起動！
```
vagrant up
```

### ssh でログインしてみる
```
vagrant ssh
```

### ssh 設定
```
vagrant ssh-config --host centos63 >> ~/.ssh/config

ssh centos63

ssh root@192.168.33.10
```
上記で設定したipでログインもできた。
ちなみにrootの初期パスワードは「vagrant」

### vagrant コマンドまとめ
```起動
vagrant up
```
```停止
vagrant halt
```
```破棄
vagrant destroy
```

とりあえず仮想環境構築まで完了

knife-soloを導入　に続く
http://qiita.com/astrsk_hori/items/35b76c32961319f5d69b
javaScript(開発環境)

## 記述方法

### HTMLに直書き

```html
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja" dir="ltr">
<head>
<title>直接書き</title>
</head>
<body>
<script type="text/javascript">ここに書く</script>
</body>
``` 

### 外部ファイル
```html
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja" dir="ltr">
<head>
<title>外部ファイル</title>
<script type="text/javascript" src="sample.js"></script>
</head>
<body>
</body>
``` 

## 便利な練習用サイト

最近ではWeb上でJavaScriptを書いて実行出来るサイトがあります。
以下2つ
- [jsdoit](http://jsdo.it/tsukishimaao/kzuT/edit)
　githubのアカウントから利用した。以下サイトの写真。使えそう。
　![jsdoit.png](https://qiita-image-store.s3.amazonaws.com/0/35975/0a005d2e-29b9-c608-861b-6f7943a0e55b.png "jsdoit.png")

- [jsfiddle](http://jsfiddle.net/)
　こんなのもあるがまだ使用してない。

## まとめ
- プログラムは書かないと覚えない
- JavaScriptはブラウザ上で動く唯一のプログラミング言語である。
- JavaScriptを実行するにはscript要素を使う(記述方法参照)。
- 開発ツールはあらかじめ整備しておく<br>
    - (FirebugをコンソールをONにする)
    - (またグーグルクロームの設定も本に乗っている_P7)
Objective-C と Java と C# でクロージャ的な書き方の比較


クロージャとかラムダとか匿名** とか名前はいろいろですけど、各言語の書き方と動き（特に変数の扱い）について比べてみました。

ついでに非同期処理の例にもなってしまいました。

### Objective-C

Blocks を使います。

```objc:Obj-C
int x = 1;
__block int y = 2;

dispatch_queue_t q_global = dispatch_get_global_queue(0, 0);
dispatch_async(q_global, ^{
    x = 10; // できない(コンパイルエラー
    y = 20; // できる
    
    int z = x + y;
    
    [self dispValue:z]; // self の参照カウンタが+1される
});
```

普通に宣言した変数を Block の中で使うと、自動的に「キャプチャ」され、変数が複製される。この変数には、 Block 内では代入できずコンパイルエラーとなる。
``__block`` を付けた変数は、Block 内外で同じ実体を参照でき、代入もできる。
``self`` やプロパティを Block 内で使用すると参照カウンタがインクリメントされ、明示的に release しないとリークする。
あるいは、Block 外で ``__weak`` を付けた変数に代入しておくと、これは参照カウンタがインクリメントされない。


### Java 6 (Android ベースなので…)

匿名クラスです。

```java:Java
int x = 1;
final int y = 2;

ExecutorService executor = Executors.newSingleThreadExecutor();
executor.submit(new Runnable() {
	@Override
	public void run() {
		y = 20; // できない(コンパイルエラー
		int z = x + y; // できない(コンパイルエラー
		
		String typeName = this.getClass().getInterfaces()[0].getName(); // Runnable になる
	}
});
```

Java は匿名クラスの実装中に使える変数はかなり制限がある。
普通に宣言した変数は、匿名クラス内では使えない(コンパイルエラー)。
``final`` を付けて宣言した変数は、匿名クラス内では参照のみ可能。ちょうど Objective-C の通常変数を Block 内で使った時と同じ。
Obj-C の ``self`` にあたる ``this`` は匿名クラス内では、その匿名クラスを示す。

### C＃

ラムダ式です。

```csharp:C#
int x = 1;
const int y = 2;
Task.Factory.StartNew(() => 
{
    x = 10; // OK
    y = 20; // これはダメ、const だから。
    var z = x + y;

    var typeName = this.GetType().Name;
});
```

C# はかなりゆる〜い印象。
普通に宣言した変数を、ラムダ式の中でも自由に read/write できてしまう。write できちゃうのはこわい。
``this`` は、ラムダ式の外側のクラスを示す。
　

## 所感

個人的には、Java のガチガチなのが好きかも。できる事が限定されているのでミスしにくい。
Objective-C は、ローカル変数は良いけど、self とか使っちゃうミス起こしそう。
C# は、普通に書き換えられて超不安、という感じ。なるべく const 使うようにしたい。
　
　
　

しかし記述量は C# が一番少ないですね、Xamarin いいよ Xamarin。。。
PythonでYouTubeの動画を自動的に検索&ダウンロードする


# 使用するライブラリ
## gdata
[Python client library for Google data APIs](https://pypi.python.org/pypi/gdata)
> GoogleのAPI。YouTubeの動画を検索したりできる

## pytube
[Github: ablanco/python-youtube-download](https://github.com/NFicano/pytube)
> YouTubeの動画をダウンロードする

# YouTubeの動画を検索する
gdataを使ってYouTubeから動画を検索してみましょう

```python
# -*- coding: utf-8 -*-
# 日本語で検索したい場合は上のタグを入れる

from gdata import *
import gdata.youtube
import gdata.youtube.service

search_word = "犬" # 犬の動画を検索
client = gdata.youtube.service.YouTubeService()

# サーチクエリを作成
query = gdata.youtube.service,YouTubeVideoQuery()
query.vq = search_word # 検索ワード
query.start_index = 1 # 何番目の動画から検索するか
query.max_results = 10 # いくつの動画情報を取得したいか
query.racy = "exclude" # 最後の動画を含めるか
query.orderby = "relevance" # どんな並び順にするか

# 検索を実行し、feedに結果を入れる
feed = client.YouTubeQuery(query)

for entry in feed.entry:
	# 動画のリンクを取り出す
	# LinkFinderは、
	#   from gdata import *
	# から使用
	link = LinkFinder.GetHtmlLink(entry)
	print link
```

> 実行結果

```
<?xml version='1.0' encoding='UTF-8'?>
<ns0:link xmlns:ns0="http://www.w3.org/2005/Atom" href="https://www.youtube.com/watch?v=ZhCBEbsjdPo&amp;feature=youtube_gdata" rel="alternate" type="text/html" />
.
.
.
```

こんな感じで10個のリンクを取得出来ました。
次にこのリンクを参考にして動画をダウンロードするのですが、必要なのは"href"の部分だけなので、切り出してあげましょう。

```python
# 先ほど取得したリンクデータの1つ
url = '<ns0:link xmlns:ns0="http://www.w3.org/2005/Atom" href="https://www.youtube.com/watch?v=wwAHyzfEEKc&amp;feature=youtube_gdata" rel="alternate" type="text/html" />'

print url.split('href="')[1].split('&')[0]
# 結果 >>> 'https://www.youtube.com/watch?v=wwAHyzfEEKc'
```

> 注意:
もしforループなどで一気に検索したい場合は、max_resultsは最大50まで、ループの回数は10回までになります。つまり、一度に検索できる最大動画数は500になります。

# YouTubeの動画をダウンロードする
```python
from pytube import YouTube

yt = YouTube()
yt.url = 'https://www.youtube.com/watch?v=wwAHyzfEEKc'

# ダウンロードを実行
video = yt.get('mp4')
video.download('/path/to/videos/download/folder') # 好きなフォルダにダウンロードしてくれる
```

> 実行結果

![Downloads-2.png](https://qiita-image-store.s3.amazonaws.com/0/25585/cecd9054-31ca-20e1-3362-db8d17784304.png)


こんなかんじで簡単にダウンロード出来ました。
今回紹介したプログラムを組み合わせると、一度に最大500まで動画をダウンロードできます。
Heroku コマンド一覧

Herokuでマイグレーション

```
> heroku run rake db:migrate
```

Herokuでシード、初期で登録してあるデータを反映させる場合に使う

```
> heroku run rake db:seed
```

Herokuはデータベースを削除できないのでデータベースをリセットする

```
> heroku pg:reset DATABASE

これを入力した後に下記のコメントがでてコンソールモードになってアプリ名の所を入力すれば完了

!    WARNING: Destructive Action
!    This command will affect the app: アプリ名
!    To proceed, type "アプリ名" or re-run this command with --confirm アプリ名

> アプリ名

```

サイトに接続

```
> heroku open
```

サーバーのログを確認する

```
> heroku logs
```
RailsでXSS対策とそこで浮上した疑問

Railsのerb内で`<%= "<h3>ほげほげ</h3>" %>`みたいに呼び出した際に`<` `>`は自動的に`&gt` `&lt`に置換されるらしい。

普通に使う分にはXSSの対策もちゃんと取られてる。

もし変換させたくないのであれば`<%= raw hoge %>`みたいに`raw`をつけてやったらそのまま出るのか…

`hoge.html_safe`なんてのもあるらしい。

駄菓子菓子

特定の条件でHTML使いたい時ってあるじゃん？

自動リンク化とか...

URLのリンク置換は昔は簡単だったらしい。`auto_link`なんて便利なヘルパーメソッドがあったらしいけど廃止されたとか。
代用品に`rails_autolink`なんていうgemが[あるみたい](http://edywrite.blogspot.jp/2012/06/ruby-on-rails3url.html)だしURL置換はこれでよさそう。

ところで正規表現で特定の文字列拾ってリンク化させるのはどうすればいいの？

Twitterのハッシュタグや@リプライみたいなの。

結局はテキトーにHTMLをエスケープしてやってから置換させていってrawでやることになるのだろうか…
ruby-build(rbenv) でビルドする ruby の名前を指定する

rbenv install ではなく [ruby-build](https://github.com/sstephenson/ruby-build) を直接使うとディレクトリを指定できる。

```ruby
MAKE_OPTS="-j 4" ~/.rbenv/plugins/ruby-build/bin/ruby-build 2.1.0 ~/.rbenv/versions/haikanko
```

使う時は

```
$ rbenv local haikanko
```
みたいな。これで ruby のバージョンをあげてもアプリの起動スクリプトの修正が不要になりますね。

合わせて読みたい: [ruby-build の --enable-load-relative オプション](http://qiita.com/sonots/items/04008fa2337a27fc2692)
PHPで月末日を取得する

## 概説
タイトルの通り、PHPで月末日を取得します。

## 今月の末日を取得する

```php:PHP
echo (new DateTimeImmutable)->modify('last day of')->format('Y-m-d'); // 2021-03-31
```

## 先月の末日を取得する

```php:PHP
echo (new DateTimeImmutable)->modify('last day of last month')->format('Y-m-d'); // 2021-02-28
```

## 翌月の末日を取得する

```php:PHP
echo (new DateTimeImmutable)->modify('last day of next month')->format('Y-m-d'); // 2021-04-30
```

## 指定月の末日を取得する

```php:PHP
echo (new DateTimeImmutable)->modify('last day of 2020-02')->format('Y-m-d'); // 2020-02-29
echo (new DateTimeImmutable)->modify('last day of 2019-02')->format('Y-m-d'); // 2019-02-28
```

---

これより以降は以前投稿していた古い内容になります。参考程度にご覧ください。

---

## 今月の末日を取得する

```php:PHP
echo date('Y-m-t'); // 2014-01-31

もしくは

echo date('Y-m-d', mktime(0, 0, 0, date('m') + 1, 0, date('Y'))); // 2014-01-31
```

## 先月の末日を取得する

```php:PHP
echo date('Y-m-d', mktime(0, 0, 0, date('m'), 0, date('Y'))); // 2013-12-31
```

## 翌月の末日を取得する

```php:PHP
echo date('Y-m-d', mktime(0, 0, 0, date('m') + 2, 0, date('Y'))); // 2014-02-28
```

---

## 失敗するパターン

なお、strtotimeの引数で'+1 month'、'-1 month'を利用すると見ばえよく書けそうですが、2月の周辺で期待通りの動作をしない場合がある注意が必要です。
この件については、[マニュアル](http://jp2.php.net/manual/ja/function.strtotime.php)でもイロイロと言及されているので、ぜひご一読を。

```php:PHP
echo date('Y-m-d', strtotime('2014-01-29 +1 month')); // 2014-03-01
echo date('Y-m-d', strtotime('2014-03-31 -1 month')); // 2014-03-03
```

月初の日付に対して'+1 month'、'-1 month'してあげるとうまくいくということを教えてもらったので、strtotimeを利用した方法を追記しておきます。

## 先月の末日を取得する

```php:PHP
date('Y-m-t', strtotime(date('Y-m-01') . '-1 month')); // 2013-12-31
```

## 翌月の末日を取得する

```php:PHP
date('Y-m-t', strtotime(date('Y-m-01') . '+1 month')); // 2014-02-28
```

## 参考URL
- [DateTimeImmutable クラス](https://www.php.net/manual/ja/class.datetimeimmutable.php)
- [相対的な書式](https://www.php.net/manual/ja/datetime.formats.relative.php)
- [date()関数を使って「月初」「月末」を取得する方法](http://www.hachi-log.com/php-date-month/)
- [php 月末・月初の出力方法](http://the-pleiades.hateblo.jp/entry/20100301/1267423947)
- [【PHP】月末・月初の出力方法](http://qiita.com/shori0917/items/0a2f4a64e55d84919a1c)
- [PHPで指定月の月初と月末の日付を取得](https://qiita.com/HamaTech/items/20b37b614ef84fb3197c)
- [Datetimeで月末最終日を取得する](https://qiita.com/hironobu_s/items/e6d4f4ffa914af82d62d)
- [phpで月初、月末の日付をとる](https://qiita.com/sota/items/570daea4eecd4f196799)
- [PHPで日付を表示する](https://qiita.com/yuwaita/items/f75b34788ae837f0f8a3)
cakeでのデバッグ出力


pr() もしくは debug()を使用すると出力がpreタグ入りなので便利。
また、本番モードだと出力されないのでデバッグの消し忘れにも良い。

```php
$v = array('aa','bb','cc');
// フォーマットして画面に出力してくれる
debug($v);
```
Croudia Rubygem でCroudia APIを使ってみよう！

# Croudia APIをRubyから叩いてみよう！

国産ミニブログ CroudiaのAPIをRuby gemを使って叩いてみる。

Croudiaについては[この記事](http://qiita.com/kimama1997/items/e920e8c4f826e493fd7b)参照。

先に[Croudiaのアカウント](https://croudia.com/regists/welcome)と[アプリケーショントークン](https://developer.croudia.com/)を用意しておきましょう。(callbackはlocalhost等適当に)


今回はターミナルやDOSプロントを開いてコマンドラインからirbを使って作業していきます。

まず、[Croudia gem](https://rubygems.org/gems/croudia)をインストール。

```shell-session
$ gem install croudia
```
>なお、この際[devkitが入っていないとエラーが出る模様](http://bit.ly/1gmAUGH)。WindowsでRuby installer使ってるならRuby installerのDLページから、Win,Linux等で他からDL,インストールした場合はDL元からdevkitを入手しセットアップしておく必要があるようです。[(参考)](http://www.rubylife.jp/railsinstall/rails/index4.html)
Macは特に何もしなくてもいける模様。(OSX 10.9 Ruby2.0で確認)

gemがインストール出来たら`irb`を起動。

```shell-session
$ irb
```

まず、Croudia gemをインクルード

```ruby:irb
require "croudia"
```

croudiaオブジェクトを作ってやる

```ruby:irb
croudia = Croudia::Client.new(client_id:"ここにClient_id",client_secret:"ここにClient_secret")

```

認証URLを取得(実際にはこのURLはclient_idをテンプレに加えているだけ)

```ruby:irb
croudia.authorize_url
```

表示されたURLにブラウザからアクセス、認証。
リダイレクトしたらアドレスからcodeパラメーターをコピー。

```ruby:irb
token = croudia.get_access_token("(ここに取得したcode)")
```

tokenが取得出来たらセットしてcroudiaオブジェクトを作り直す。

```ruby:irb
croudia = Croudia::Client.new(token)
```

PublicTimelineを取得してみる

```ruby:irb
ptl = croudia.public_timeline
#Statusオブジェクト(#<Croudia::Status: xxxxxxx {...}>)のリストが返される
```

取得したTLのテキストとscreen_nameを出力してみたり

```ruby:irb
 ptl.each do |s|
 p "@#{s.user.screen_name} #{s.text}"
 end
```

もちろんささやくことだって。

```rb:irb
croudia.update("test Whisper")
```

あ、気づきました？パラメーターが省略記述できちゃうんです。[Rdoc](http://rdoc.info/gems/croudia/)を見れば省略できる部分は分かるでしょう。

----

tokenは1時間で切れる。
切れると `Croudia::Error::Unauthorized` が返されるのでtokenと一緒に吐かれたrefresh_tokenを使ってトークンを更新する。

```ruby:irb
#client_id,secretを用意して
croudia = Croudia::Client.new(client_id:"ここにClient_id",client_secret:"ここにClient_secret")
# tokenを取得
 new_access_token = croudia.get_access_token(
   grant_type: :refresh_token,
   refresh_token: token.refresh_token
 )
#新しいトークンをセット
croudia  = Croudia::Client.new(new_access_token)

#試しに認証チェック
croudia.verify_credentials
```
----
他にも画像アップロードとかも出来るみたい。

その他の使い方は[rdoc](http://rdoc.info/gems/croudia/)を参考に。