OmniAICreator/Qiita-1.07M huggingface dataset:
Ansible Vault を試す

Ansible 1.5 が 2014/2/28 にリリースされました。
[Ansible 1.5 Released](http://blog.ansibleworks.com/2014/02/)

今回の目玉機能が [Ansible Vault](http://docs.ansible.com/playbooks_vault.html) です。Git などにそのまま登録したくないパスワードやAWSなどのAPIキーなどを暗号化することができます。

ansible-vault コマンドが追加されました。

* * *
2015/5/12 追記
Ansible 1.8 で view サブコマンドが追加されています。
(その後 1.8.3 で view のためのテンポラリファイルの権限問題が修正されているので最新版を使いましょう)
* * *

それでは試してみます。

## テスト用 Playbook の作成

ひとまず、暗号なしでテスト用 Playbook を作成します。

```:hosts
localhost ansible_connection=local
```

```yaml:site.yml
---
- hosts: localhost
  gather_facts: no
  vars_files:
    - private.yml
  tasks:
    - debug: msg="password = {{ password }}"
```

```yaml:private.yml
---
password: 'hogehoge'
```

## テスト用 Playbook の確認

```
$ ansible-playbook -i hosts site.yml 

PLAY [localhost] ************************************************************** 

TASK: [debug msg="password = hogehoge"] *************************************** 
ok: [localhost] => {
    "msg": "password = hogehoge"
}

PLAY RECAP ******************************************************************** 
localhost                  : ok=1    changed=0    unreachable=0    failed=0
```

Playbook の動作確認はできました。

## Vault で暗号化する

それでは、ansible-vault で private.yml を暗号化します。暗号化のためのパスワードの入力を求められます。

```
$ ansible-vault encrypt private.yml 
Vault password: 
Confirm Vault password: 
Encryption successful
```

暗号化された private.yml の中身は次のようになっています。cipher は今のところ AES (1.5.1でAES256になりました)だけっぽいですが、将来は選べるようになりそう。

```text:private.yml
$ANSIBLE_VAULT;1.0;AES
53616c7465645f5fcc735bd59e5a55875bf96e5b184181ebc13c4ce1b6b813315fd7bfbe384038b1
4d93ece05905d8f9618080fb8e4f3ec04693e9592299f6347add4bf94e57e83d6615236a83dae0a9
5e4400964c944c90d99cba6bf587f168e4ab2dc0774e91b3beadf5c7160a9072
```

## 暗号化されたファイルを使った Playbook

ファイルを暗号化した場合、同じコマンドで Playbook を実行するとパスワードを指定しろというエラーで実行できません。

```
$ ansible-playbook -i hosts site.yml 
ERROR: A vault password must be specified to decrypt data
```

`--ask-vault-pass` でプロンプトを表示させるか `--vault-password-file=VAULT_PASSWORD_FILE` でパスワードの書かれたファイルを指定します。

```
$ ansible-playbook -i hosts site.yml --ask-vault-pass
Vault password: 

PLAY [localhost] ************************************************************** 

TASK: [debug msg="password = hogehoge"] *************************************** 
ok: [localhost] => {
    "msg": "password = hogehoge"
}

PLAY RECAP ******************************************************************** 
localhost                  : ok=1    changed=0    unreachable=0    failed=0
```

ひとつの Playbook 内で、複数の暗号化されたファイルを扱う場合、すべてのパスワードを同じに揃えておく必要があります。

ファイルをまるっと暗号化してしまうので、どんな変数が定義されているのかもわからなくなるのでちょっと不便な気もしますね。[Jan-Piet Mens :: My thoughts on Ansible's vault](http://jpmens.net/2014/02/22/my-thoughts-on-ansible-s-vault/)

## ansible-vault コマンド

`ansible-vault` コマンドには `create`, `encrypt`, `decrypt`, `rekey`, `edit` というサブコマンドがあります。

* create
  * 新規に暗号化されたファイルを作成します
* encrypt
  * 既存のファイルを暗号化します
* decrypt
  * 暗号化されたファイルを復号化します
* edit
  * 暗号化されたファイルをそのまま編集します
* rekey
  * パスワードを変更します
* view
  * 暗号化されたファイルを復号して PAGER で表示します

（「復号化します」っていう表現は正しいのだろうか？とか書きながら思った）

## 追記

「[Ansible Vault を賢く使う](http://qiita.com/yteraoka/items/de9da64ca2d9261b0292)」も見てね
FacebookでURLを貼付けたときにでてくるサブネイルをカスタマイズする方法


# はじめに

自分で作ったWebページのURLなどをfacebookのポストに貼り付けて共有しようとすると、その内容が自分の思ったとおりにいかないことがある。特に先に最小限の体裁を整えて公開し、後で微修正しようなどとすると修正前の情報のままで固定されて、困ったことになる。ここでは、作成されるサブネイルをこちらの意図通りにカスタマイズする方法を紹介する（リマインダ）

# 手順

カスタマイズの手順は以下の通り

1. 作成したページのヘッダにOGプロトコルに基づいて、カスタマイズしたい情報をメタタグとして入力する
1. サブネイルキャッシュの更新ページに更新したいページのURLを貼付け、デバッグボタンを押す
	* https://developers.facebook.com/tools/debug/


単純に情報を更新したい場合は、2.だけで十分だ。さらに、その内容を自分の意図通りに更新したい場合は手順1.と2.を実行する。

# OGプロトコルの編集

OG(Open Graph)プロトコルは、webページがソーシャルグラフと連携することを可能にする。OGPをWebページに含めることで、そのページはFacebookページと同等に扱わる。でも、有り体に言えば、サブネイル作るときの詳細指定できるよ・・ってのが一番わかりやすい（もちろん、他の効果もあるのだろうけども）。

Facebookだけでなく、google+、gree、mixiなどでも使われているので、それらのSNSで共有されることを考えているならば、設定していて損はないし、そんなに手間でもない。具体的には以下のメタ情報をヘッダに書いておくだけ。

```html
<head>
	…
	<meta property="og:title" content="記事のタイトル" />
	<meta property="og:type" content="article" /> //トップページはwebsite、個別ページはarticle
	<meta property="og:description" content="記事の説明" />
	<meta property="og:url" content="記事のURL" />
	<meta property="og:image" content="画像のURL" />
	<meta property="og:site_name" content="サイトのタイトル" />
	…
</head>
```

上記を書いておくと、手順2.のデバッグボタンを押したときにその情報の確認画面が出てきて、意図通りの内容であるかを確認できる。

以下は入れておいた方が良いらしいが、ないからといってサブネイルが作られないということはない。

```html
<meta property="og:locale" content="言語" />
<meta property="fb:app_id" content="facebookのアプリID" />
<meta property=“fb:admins” content=“facebookのユーザーID” /> //できればfb:app_idを利用
```

また、htmlのxmlnsも設定した方が良いらしいが、なくても大丈夫だった。

```
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja" dir="ltr" xmlns:og="http://ogp.me/ns#" xmlns:fb="http://www.facebook.com/2008/fbml">
```

# おわりに

昨今のWebページなら、SNSで共有されないことの方が珍しい。ほとんどコピペで作れるOGPのメタ情報は忘れずに入れておきたい。

【Robotium】Android UIテスティングフレームワーク Robotiumとは？

# 概要
　Robotiumとは、Android用UI操作テスティングフレームワークです。

　Robotiumを使用したテストケースは、以下のAndroid SDKから提供されているテストクラスを継承したクラスに記述します。

・ActivityInstrumentationTestCase2
・ActivityUnitTestCase
・SingleLaunchActivityTestCase

　各クラスの特徴について、簡単に説明します。

##ActivityInstrumentationTestCase2

　複数のアクティビティに跨がる試験を想定したテストクラスです。
　結合試験や総合試験等でのシナリオを組んだ試験に適しています。

　他のテストクラスに関しても同様ですが、このクラスのテストケースはUIスレッドで実行されないため、UIへの操作はActivity#runOnUiThread()を使用し処理しなければいけません。

##ActivityUnitTestCase

　アクティビティ単体のテストを行うためのテストクラスです。
　コンテキストやアプリケーションのモックを差し込むことができます。このテストクラスを継承したクラスでは別のアクティビティを開始することはできません。

　ActivityInstrumentationTestCase2クラスでは、getActivityメソッドを呼び出すと、テスト対象のアクティビティのライフサイクル（onCreate()〜onResume()）が開始されますが、このクラスでは、getActivityを呼び出しても、アクティビティのonCreate()しか呼び出されなく、onStart()や、onResume()等のイベントに関しては、テストケース内で呼び出さなければいけません。

　これにより、アクティビティの各ライフサイクルを自在に実現できるため、ライフサイクルに応じたアクティビティの状態を試験するのに適しています。

##SingleLaunchActivityTestCase

　単一アクティビティの試験を行うためのテストクラスです。
　単一アクティビティの試験を行う試験に適しています。



尚、Robotiumでは、ベースとなるJUnitは3.8です。

# 特徴
　複数のアクティビティに跨がるシナリオテストに適しています。
　ボタン押下やテキスト入力をテストコードから簡易に呼び出すことができます。waitForXXXメソッド等の処理待ちメソッドが多数用意されているため、非同期処理がある場合の処理待ちも簡易にできます。

# 難点
　IDを割り振っていない、表示テキストがない等の操作対象の特定が難しいViewが多数存在する場合、操作対象のViewがActivity内の何番目に存在するかを指定しなければいけません。Viewの増減がない場合は特に問題はありませんが、View数が非常に多い、または、Viewが動的に増減する場合、View指定方法にロジックが必要になり、テストコードが複雑になってしまいます。

　特に理由がなく、Robotiumを利用する前提の場合は、ViewにIDを割り振っておく方が無難です。

# Robotium公式サイト
　Robotium公式サイトは[こちら](https://code.google.com/p/robotium/ "Robotium公式サイト")です。

# ダウンロード
　サイト左のFeautured＞Downloads＞robotium-solo-5.0.1.jarのリンクをクリックします。
　（2014/3/2時点最新版）

　[次回](http://qiita.com/shinya_0911/items/ebe747f497470b81e97f "【Robotium】Robotiumテストプロジェクトの作成（前編）")は、Robotium導入方法、テストプロジェクトの作成について説明します。
IE9でHTML5のDOCTYPEにするとQuirksモードになる

## Quirksモードだと動かないコードがある
InternetExplorerには、HTMLのDOCTYPE宣言によってドキュメントモードをQuirksモードにするか、Standardモードにするかを自動判別する機能があります。

これがQuirksモードだと、 `JSON.parse()` とか、 `JSON.stringify()` とかが使えません。

で、HTMLのDOCTYPE宣言が

```html
<!DOCTYPE html>
```

だとIE9はこれを解釈できず(？)、ドキュメントモードがQuirksモードになるみたいです。

## 回避方法
この場合、以下のMETAタグを追加してやるとうまく動きます。
たぶんIE8でも同じ問題が起きそうな気がする。

```html
<meta http-equiv="X-UA-Compatible" content="IE=9">
```
Git初心者向けの初期設定と運用方法

## CloneからUpstreamの設定まで

* hogeオーガナイゼーションのfugaリポジトリをcloneする

```
git clone git@github.com:hoge/fuga.git
Cloning into 'fuga'...
remote: Counting objects: 109, done.
remote: Compressing objects: 100% (70/70), done.
remote: Total 109 (delta 15), reused 109 (delta 15)
Receiving objects: 100% (109/109), 12.34 KiB, done.
Resolving deltas: 100% (15/15), done.    
$ cd fuga
```

* リモートリポジトリとして、オリジナルのリポジトリを upstream という名前で設定

```
$ git remote add upstream git://github.com/fuga/hoge.git
```
これでリモートblanchの設定は可能

## 運用方法
* master もしくは、develop branchにチェックアウトする

~~~~
git checkout master
もしくは
git checkout develop
~~~~
* いまのブランチの状態を確認

~~~~
git branch -a
~~~~

* 不要なローカルブランチを削除する

~~~~
git branch -d feature/hogehoge
~~~~

* リモート上の削除されたブランチをローカルから削除する

~~~~
git remote prune origin
~~~~

* 本家リポジトリの変更を取り出すため、fetchをします

~~~~
git fetch --all
Fetching origin
Fetching upstream
remote: Counting objects: 6, done.
remote: Compressing objects: 100% (5/5), done.
remote: Total 6 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (6/6), done.
From github.com:hoge/hoge
   hoge  master     -> upstream/master
~~~~

* fetchをしたのをマージします

~~~~
git merge upstream/master
Updating hoge
Fast-forward
~~~~

* featureブランチを作成

~~~~
git checkout -b feature/hogehoge
~~~~

## ツールの設定
bash で git コマンドのブランチ名などを補完してくれるgit-completion.bash を導入する。

* git/contrib/completion/git-completion.bash をダウンロードして適当な場所に配置(例えば ~/.git-completion.bash)
    * home brewでgitをインストールしていたら`/Users/your/brew/etc/bash_completion.d` にある
* ~/.bashrc に source ~/.git-completion.bash の一行を加える


## 参考
http://qiita.com/xtetsuji/items/555a1ef19ed21ee42873
http://qiita.com/snaka/items/4b0437a32da832d2e0db
F#でcatamorphism/anamorhphism

[[F#] おーおーふぁんくた](http://igeta.cocolog-nifty.com/blog/2009/08/similar.html)でFunctorをオブジェクトで実現するのを見て、その方向で[categorical programming with inductive and coinductive types](http://www.cs.ut.ee/~varmo/papers/thesis.pdf)にあるcatamorphismとanamorphismのF#による実装を考えてみた。

```fsharp
type F<'c> =
    abstract fmap : ('a -> 'b) ->  F<'a> -> F<'b>

type Mu<'a> =
    In of F<Mu<'a>>

let unIn p =
    match p with
    | In(x) -> x

let rec cata phi x =
    let y = (x |> unIn)
    y |> y.fmap (cata phi) |> phi

type Nu<'a> =
    Wrap of F<Nu<'a>>

let out p =
    match p with
    | Wrap(x) -> x

let rec ana phi x = 
    let y : F<'c> = (x |> phi)
    Wrap(y.fmap(ana phi) y)
```

Mu,Nuの定義に直接Fを使っているが使わなくてもよい方法はあるかしら。

定義してみたはいいが使い道は不明。
Atomで新しくキーバインドを定義する方法

GitHub製のエディタであるAtomでキーバインドを設定する方法について書く。ここでは"ctrl-tab"でタブの切り替えを行えるようにする。

## "ctrl-tab"が既に使われていないか確認

「"cmd-," => Keybindings」で現在のキーバインドを確認できる。「Search Keybindings」のところに"ctrl-tab"と打ち込み、これが現在使用されていないことを確認する。

## テンプレートとなる"alt-cmd-right"のキーバインドを検索

「Search Keybindings」のところに"alt-cmd-right"と打ち込む(このキーがデフォルトのタブ切り替えにバインドされている)。表示されるクリップアイコンをクリックし、テンプレートをクリップボードにコピーする。

## `~/.atom/keymap.cson`の編集

```
'body':
  'ctrl-tab': 'pane:show-next-item'
```

を追記する。
npm cookbook で npm_package "pm2" など

# 概要

[npm](https://github.com/balbeko/chef-npm) cookbook の使い方を覚えて `npm_package 'pm2'` などと書くことができるようになった。

手順はこんな感じ。

1. npm と、依存する cookbooks を取ってくる
  * cookbooks を入れてあるディレクトリで `git clone https://github.com/balbeko/chef-npm.git npm` などして取ってくる。 **ディレクトリ名は npm で！**
  * あと、chef-npm が依存してる nodejs とか、nodejs が依存してる apt とか yum とか build-essential を取ってくる。
  * 面倒臭ければ Berksfile に `cookbook 'npm'` 書けば一発なんじゃないかな
2. 自分の cookbook の metadata.rb に `depends 'npm'` を書き足す。

これで、`npm_package` リソースを使えるようになって、レシピに `npm_package 'pm2'` などと書くことができるようになった。ちなみにいままでは bash リソースにしぶしぶ `npm install` とか書いてた。

# npm_package の使い方

action の使い方は [USAGE](https://github.com/balbeko/chef-npm) に書いてある。[providers/package.rb](https://github.com/balbeko/chef-npm/blob/master/providers/package.rb) 読むと、action と `npm install` との対応がこうなってることが分かる。

| action     | 対応する npm install |
|:-----------|:------------|
| :install   | npm install -g <pkg> |
| :install_local     | npm install <pkg> |
| :install_from_json | npm install |
| :uninstall   | npm uninstall -g <pkg> |
| :uninstall_local     | npm uninstall <pkg> |

アプリケーションの開発と違って、今やりたいのはインフラのセットアップだから、デフォルト(:install) が -g になってるのは使いやすいと思った。

# 私はこのように間違えました

最初、cookbooks に `git clone https://github.com/balbeko/chef-npm.git` して、自分の metadata.rb に `depends 'chef-npm'` と書いてしまっていた。こうすると、`No resource or method named 'npm_package'` というエラーが出て cookbooks のコンパイルに失敗する。

cookbook をどんな名前のディレクトリとして設置すればいいかは、metadata.rb の name に書いてあるので、それを元に決めよう。
Qiitaのテーブルの書き方についてまとめた

Qiitaのテーブルについて、試した結果をまとめた。
テーブルの入力ってめんどくさいけど、みんな手入力してるのかな。
そもそも、あんまり使ってない人が多いのかも。

#構造

```markdown:基本的なテーブル

|a  |b  |c  |
|---|---|---|
|1  |2  |3  |
|4  |5  |6  |
```
- 1行目: ヘッダを表示する行。ここでは「 __ヘッダ行__ 」と呼ぶ。
- 2行目: 列ごとのアラインメントを設定する行。ここでは「 **アラインメント行** 」と呼ぶ。
- 3行目以降: データを表示する行。ここでは「 __データ行__ 」と呼ぶ。好きなだけ追加可能。

テーブルの前には、空白行が必要。
上のMarkdownは、下のようなテーブルとして表示される。

|a  |b  |c  |
|---|---|---|
|1  |2  |3  |
|4  |5  |6  |

セルの両端の空白は削除される。
セル同士の結合は不可。

## ヘッダ行
主に、列の名前を表示する。
文字列は全て太字で表示される。

ヘッダ行の列数によって、テーブルの列数が決まる。

## アラインメント行
「左寄せ」「右寄せ」「センタリング」を設定する。
列ごとの設定であり、セルごとにアラインメントを設定することは不可能。
テーブルには表示されない。

- 左寄せ `---` (または`:--`)
- 右寄せ `--:` 
- センタリング `:-:`

最低3文字必要。ハイフンはいくらでも延ばしてよい。

使用可能な文字は「:」「-」の2種のみである。(削除されるが、前後に空白も可能)
他の文字が混入していた場合、テーブルと認識されない。
ただし、テーブルに表示されていない列であれば好きに書いてよい。

アラインメント行の列数は、ヘッダ行の列数以上必要。
それ未満の場合、テーブルとして認識されない。
多ければ表示が省略される。

## データ行
各セルの値を表示する。

何行でも、何列でも追加可能。
1つ以上の列があれば、データ行と見なされる。
多ければ表示が省略される。

# テーブルの大きさ
テーブルの列数は、ヘッダ行の列数と同一である。
また、同数以上のアラインメント行の列も必要である。

データ行はテーブルの列数に影響を与えない。
データ行の列数は、少なければ空のセルが挿入され、多ければ省略される。

テーブルの行数は、アラインメント行が表示されない為、Markdownの行数-1となる。

```markdown:変則的なテーブル

|a  |b  |c  |
|---|---|---|---|---|---|表示が省略されている列であれば、アラインメント行は好きに書いてよい。|
|
|
|1  |2  |3  |4  |5  |6  |ヘッダ行が3列なので、4列目からは表示されない。|
```

|a  |b  |c  |
|---|---|---|---|---|---|表示が省略されている列であれば、好きに書いてよい。|
|
|
|1  |2  |3  |4  |5  |6  |ヘッダ行が3列なので、4列目からは表示されない。|


#最小の構成
```markdown:1×1のテーブル

x|
---
```

x|
---

最小のテーブルは上のようなものである。
両端の「|」は省略可能である。

```markdown:2×2のテーブル

x|x
---|---
x|x
```

x|x
---|---
x|x


#他のMarkdownとの併用
テーブル内部でも、1行で終わるMarkdownであれば使用可能。
太字・斜体は通常は前に空白が必要だが、左端では不要。
また、ヘッダ行の先頭に「>」を置くと、テーブル全体が引用となる。

```markdown:テーブル内で使用可能なMarkdown


|`code`    |*italic*                  |
|----------|--------------------------|
|**bold**  |***bold italic***         |
|$ \omega $|[Qiita](http://qiita.com)||

```

|`code`    |*italic*                  |
|:---------|:-------------------------|
|**bold**  |***bold italic***         |
|$ \omega $|[Qiita](http://qiita.com)||
Bashでコマンドライン実行結果を空白区切りで配列に入れる

# おことわり

人に聞かれて20分ぐらいで調べた範囲なので、ちょっと間違ってたりするかも。
あと説明に適したシチュエーションが見つからなかったので、応用例がほしい。

# やりたいこと

出力結果が空白区切りになるコマンドを配列に入れてゴニョゴニョしたい。

例えば、`foo bar baz`という出力の`foo`と`bar`と`baz`をそれぞれ別変数として処理したい。

# やり方

```bash:example.sh
#!/bin/bash

declare -a FOOBARBAZ=($(echo foo bar baz))

echo ${FOOBARBAZ[0]}
echo ${FOOBARBAZ[1]}
echo ${FOOBARBAZ[2]}
```

```bash:出力
$ bash example.sh
foo
bar
baz
```
`sh`では動かない模様。

# 解説


## その1
```bash
echo foo bar baz
```

ここはただ単にコマンドを実行しているだけ。
お好みのコマンドに置き換えてください。

## その2

```bash
declare -a FOOBARBAZ=($(echo foo bar baz))
```

ここが本題。

`FOOBARBAZ=$(echo foo bar baz)`としたときはただ単に文字列`foo bar baz`を`$FOOBARBAZ`に代入するだけ。

Bashで配列を扱うには、配列として宣言された変数と配列リテラルが必要になる。

変数を配列として宣言するには`declare -a`をつけて変数を宣言する。右辺値を同時に書いて良い。

配列リテラルは`(0 1 2 3)`とカッコで始り空白で区切られた要素で構成される。

## その3

```bash
echo ${FOOBARBAZ[0]}
```

配列の要素を参照するには、`${VARNAME[N]}`というように変数名と添字をブラケットでくくる必要がある。
もし`$VARNAME[N]`とすると、`$VARNAME`と`[N]`だけ評価されてしまうので注意。
`$VARNAME`は`${VARNAME[0]}`と同じ内容が出るようだ。

# その他

* `declare -A`とすると、連想配列が作れるらしい。
* 配列の要素の代入はどうするのだろう。
* 配列の長さを取得する文法があるので、いつかまとめる。

# 参考

* `man bash`
* [Man page of BASH](http://linuxjm.sourceforge.jp/html/GNU_bash/man1/bash.1.html)
* [Bashで覚えておくとよいデータ構造 - 配列 - いろいろ解析日記](http://d.hatena.ne.jp/nattou_curry_2/20091104/1257346587)
foo.cをfoo.c.bakにするときの小技と解説と応用

# `foo.c`を`foo.c.bak`にするときの小技

bash上で、ファイルにサフィックスをつけてリネーム・コピーするときの、個人的にやりやすい方法

```bash
$ touch foo.c
$ cp f
# TABで補完
$ cp foo.c
# {,bak}をケツにつける
$ cp foo.c{,.bak}
# ENTER
$ ls foo.c*
foo.c  foo.c.bak
```

# 解説

bashは`x{a,b}` を`xa xb`に、`{a,b}x`を`ax bx`に展開します。

なので、`cp foo.c{,.bak}`は `cp foo.c foo.c.bak`に展開されます。

# 応用

* 逆にサフィックスをとるとき

```bash
$ cp config.rb{.example,} 
```

* プロジェクトにある`foo`, `bar`, `baz`ディレクトリそれぞれの下にある`include`ディレクトリをインクルードして、`foo.c, bar.c, baz.c`をビルドするとき

```bash
$ set -x # コマンドラインをエコーさせる。 set +xでもとに戻る
$ gcc -I/project/{foo,bar,baz}/include  {foo,bar,baz}.c
+ gcc -I/project/foo/include -I/project/bar/include -I/project/baz/include foo.c bar.c baz.c
```

# その他

展開のされ方を試したいときは、とりあえず`echo`を使う。

```bash
$ echo {foo,bar,baz}.c
foo.c bar.c baz.c
```

# ネタ元

https://github.com/gitlabhq/gitlab-recipes/blob/4-2-stable/install/CentOS_6.md#configure-it
Maybe型の入ったList から、Nothingを抜いてJustの中身だけを抜いたListを作る

# やりたいこと

型`[Maybe a]`の配列には、`Just a`と`Nothing`が入っているが、そこから`Nothing`を抜いて、`Just`でくるまれている中身だけをリストにしたい。

つまり、

```hs
[Just "foo", Just "bar", Nothing, Just "baz"]
```

から、

```hs
["foo","bar","baz"]
```

を作る。

# やりかた

`catMaybes`を使えばよろし。

```hs
import Data.Maybe
catMaybes [Just "foo", Just "bar", Nothing, Just "baz"] -- => ["foo","bar","baz"]
```

# 参考

http://hackage.haskell.org/package/base-4.6.0.1/docs/Data-Maybe.html#v:catMaybes
お手軽！ grep find

# 追記

以下と思っきしかぶってます。こっちがむしろ小さくまとまっていてきれいです。

http://qiita.com/shori0917/items/632763533b6408803d3f

あと、上記のコメント欄の`-exec grep {} +`が少し気になりますので、分かったらまた別の記事に。

# こんなときに使える

`ack`とか`ag`がなく、`git`のレポジトリ以下でもないところで、特定の文字列を含むファイルを列挙したい。
また、できればその行を表示したい。

# やり方

## オススメではないが、一応できる。

```bash
$ for f in {foo,bar,baz}.c; do echo hogehoge > $f; done
$ find . -type f -name '*.c' -exec grep hogehoge {} \;
hogehoge
hogehoge
hogehoge
```
* ファイル1個マッチするごとに`grep`が実行されるので、ファイルがたくさんあるときに面倒。
* `-exec`のルールがめんどい。`{}`にファイル名、` \;`でコマンドの終わりを指定するが、空白を`\`の前に入れたり、bashが`find`コマンドそのものの終わりと勘違いしないように`;`の前に`\`を入れなきゃいけなかったりする。あと、文字列がマッチしたファイル名を出してくれない。

## オススメしたいやりかた

```bash
$ for f in {foo,bar,baz}.c; do echo hogehoge > $f; done
$ find . -type f -name '*.c' | xargs grep hogehoge
./baz.c:hogehoge
./foo.c:hogehoge
./bar.c:hogehoge
```
ただし、ファイル名に空白を含むファイルを`find`が吐いたときに問題になる。
そういうファイルがなければ、上記で十分

```bash
$ for f in {foo,bar,baz}.c; do echo hogehoge > $f; done
$ echo hogehoge > hoge\ poo.c
$ find . -type f -name '*.c' | xargs grep hogehoge
./baz.c:hogehoge
./foo.c:hogehoge
./bar.c:hogehoge
grep: ./hoge: No such file or directory
grep: poo.c: No such file or directory
```
## 更におすすめしたいやり方

```bash
$ for f in {foo,bar,baz}.c; do echo hogehoge > $f; done
$ echo hogehoge > hoge\ poo.c
$ find . -type f -name '*.c' -print0 | xargs -0 grep hogehoge
./baz.c:hogehoge
./foo.c:hogehoge
./bar.c:hogehoge
./hoge poo.c:hogehoge
```

## 結論

プアな環境下で特定の文字列を含むファイルを列挙したければ、とりあえず
`find . -type f -name 'ファイル名' -print0 | xargs -0 grep 文字列` でやれば大体オッケー。

めんどかったら、`find . -type f -name 'ファイル名' | xargs grep 文字列` でやって、エラーが出たら前述のやつをやるのもあり。
grep のちょっとイカした使い方

# 前置き

前の[お手軽！ grep find](http://qiita.com/katoken0215/items/f05e14c25ebd9c8802d0 "お手軽！ grep find")のときに面倒だったので、grepの引数は省略しました。

もったいないので、こちらでその続きです。前の記事と合わせると少し便利です。

# 本題

全部は紹介しませんが、たまに便利なものだけ紹介します。
また、LinuxのGNU Grepで試しているので、\*BSD, MacOSではどうなるかわかりません。

## `-H` ファイル名出力を強制

ファイル1個だけだとファイル名が出ません。

```bash
$ (echo moge; echo hoge; echo muga) > foo.c # リテラルで改行出すやり方わからないのでこれで勘弁して。
$ grep hoge foo.c
hoge
```
`-H`でファイル一個でもファイル名がつきます。`--with-filename`という別名もあります。

```bash
$ (echo moge; echo hoge; echo muga) > foo.c
$ grep -H hoge foo.c
foo.c:hoge
```
## `-n` 行番号も出力する

`-n`で行番号もつきます。私は`-nH`をつけるのを好みます。

```bash
$ (echo moge; echo hoge; echo muga) > foo.c
$ grep -nH hoge foo.c
foo.c:2:hoge
```
## `-l` むしろマッチしたファイル名だけ表示

```bash
$ for f in {foo,bar,baz}.c; do (echo moge; echo hoge; echo muga) > $f; done
$ grep -l *.c
bar.c
baz.c
foo.c
```

## `-L` またはマッチしないファイル名だけ表示

```bash
$ for f in {foo,bar,baz}.c; do (echo moge; echo hoge; echo muga) > $f; done
$ touch poo.c
$ grep -L *.c
poo.c
```

## `-v` マッチしない行を表示（条件反転）

```bash
$ for f in {foo,bar,baz}.c; do (echo moge; echo hoge; echo muga) > $f; done
$ grep -v hoge *.c
bar.c:moge
bar.c:muga
baz.c:moge
baz.c:muga
foo.c:moge
foo.c:muga
```

## `-An,-Bn,-Cn` マッチした行とその前後を表示(`--after-context`, `--before-context`, `--context`)

`-An`は、マッチした行と、そのn行下まで表示する。`:`が付いているのがマッチした行、`-`が付いているのが`-An`で追加して表示されている行。

```bash
$ for f in {foo,bar,baz}.c; do (echo moge; echo hoge; echo muga) > $f; done
$ grep -A2 -nH moge *.c
bar.c:1:moge
bar.c-2-hoge
bar.c-3-muga
--
baz.c:1:moge
baz.c-2-hoge
baz.c-3-muga
--
foo.c:1:moge
foo.c-2-hoge
foo.c-3-muga
```

`-Bn`は、マッチした行と、そのn行上まで表示する。`:`が付いているのがマッチした行、`-`が付いているのが`-Bn`で追加して表示されている行。

```bash
$ for f in {foo,bar,baz}.c; do (echo moge; echo hoge; echo muga) > $f; done
$ grep -B2 -nH muga *.c
bar.c-1-moge
bar.c-2-hoge
bar.c:3:muga
--
baz.c-1-moge
baz.c-2-hoge
baz.c:3:muga
--
foo.c-1-moge
foo.c-2-hoge
foo.c:3:muga
```

`-Cn`は、マッチした行と、その前後n行ずつを表示する。`:`が付いているのがマッチした行、`-`が付いているのが`-Cn`で追加して表示されている行。

```bash
$ for f in {foo,bar,baz}.c; do (echo moge; echo hoge; echo muga) > $f; done
$ grep -C1 -nH hoge *.c
bar.c-1-moge
bar.c:2:hoge
bar.c-3-muga
--
baz.c-1-moge
baz.c:2:hoge
baz.c-3-muga
--
foo.c-1-moge
foo.c:2:hoge
foo.c-3-muga
```
### ユースケース

コードから気になる箇所を`grep`で見つけたけど途中で改行されていた、なんてときには`-An`は便利です。

## その他

時間があれば、以下に目を通しておくとよいです。

```bash
$ grep --help
$ man grep
$ info grep
```
shで、 find . -name でファイル名パターンマッチを使用するときの注意事項

Jenkinsでちょっと凝ったことをするときにハマるのでメモ。

# 前提知識

特定のフォルダ以下から、`foo.c`を探すときは、以下のコマンドで可能。

```bash
$ mkdir -p foo bar baz && touch {foo,bar,baz}/foo.c
$ find . -name foo.c
./baz/foo.c
./foo/foo.c
./bar/foo.c
```
# 問題の現象

特定のフォルダ以下から、`*.c`にマッチするファイルを探すときは、注意が必要。

インラインで書くので見にくいかもですが、勘弁してください。

```bash
$ mkdir -p foo bar baz && touch {foo,bar,baz}/{moge,moga}.c mogogo.c
$ set -x
# 困る例
$ find -name *.c
+ find -name mogogo.c # *.cがカレントフォルダのmogogo.cに展開されちゃう
./mogogo.c

# 対策
$ find -name '*.c'
+ find -name '*.c' # 意図通り
./baz/moge.c
./baz/moga.c
./foo/moge.c
./foo/moga.c
./bar/moge.c
./bar/moga.c
./mogogo.c
$ set +x

# これが状況をわかりにくくするパターン
$ rm mogogo.c
$ ls *.c
ls: cannot access *.c: No such file or directory
# カレントフォルダに*.cにマッチするファイルがない状況では...
$ set -x
$ find -name *.c
+ find -name '*.c' # ご丁寧にクオートされて実行され、意図通りに動く。
./baz/moge.c
./baz/moga.c
./foo/moge.c
./foo/moga.c
./bar/moge.c
./bar/moga.c
$ set +x
```

# 結論

`find`でパターンマッチさせたかったら、`find . -name '*.c'`と、パターンを含む引数をクオートで囲む。
Lubuntu 13.10 で、gnome-terminal を使う

```bash
sudo apt-get install gnome-terminal
sudo update-alternatives --set x-terminal-emulator /usr/bin/gnome-terminal.wrapper 
```

このままでは`gnome-terminal`をメニューから実行することができないので、`alacarte`を入れてメニューをいじれるようにする。

```bash
sudo apt-get install alacarte
```

すると、設定→メイン・メニューの項目が追加される。
メイン・メニューを開くと、システムツールに`Terminal emulator`の項目があるのでチェックボックスを入れる。

あとはランチャーにこれを追加するなり、新規項目を追加するなりお好みで。
[Emacs] MacOSでEmacsを使うときは、バックスラッシュにご注意

ひどくハマったのでメモ。

# 状況

Windows, Linuxでは日本語キーボードの円マーク（`¥`）の刻印のキーを打鍵すると、
バックスラッシュ`\`、ASCII 0x5cが出てきますが、フォントによって円マークだったりバックスラッシュだったりします。

ですが、日本語キーボードのMacBookでは、円マークの刻印のキーを打鍵すると本当の(?) `¥`、つまりUTF8 0xC2 0xA5 YEN SIGNが出てきます。

私はこれでHaskell コンパイラが謎のエラーを吐いてしまい、45分間これで苦しみました。

# 解決方法

## MacOS

`Option + ¥` で、0x5cのバックスラッシュが入力できます。

## Emacs

Cocoa Emacsでは、通常`Option + ¥`では`/`を入力できません。
`¥`に対するキーアサインをいじって、`/`を入力するようにします。

```el
(define-key global-map [?¥] [?\\])  ;; ¥の代わりにバックスラッシュを入力する
```

（ http://d.hatena.ne.jp/nekotank/20130628/1372411052 より引用）

**上記コードをコピペしたときに意図通り動くかどうかは未確認です**
念の為、円マークとバックスラッシュはEmacs以外のところでそれぞれ打ち込んでからyankしたほうが安全です。

# 参考

`Mac Emacs backslash`でググるとたくさん出てきますが、以下の2サイトが非常に参考になりました。

* http://d.hatena.ne.jp/nekotank/20130628/1372411052
* http://www.glamenv-septzen.net/view/1119

# 追記

保存するときにUTF-8にしないと、文字コード変換によって以下のコードの`¥`がダメになってしまうことがあるみたいです。

```el
(define-key global-map [?¥] [?\\])
```

なので、上記コードを`.emacs.d/init.el`等に保存した場合は、`C-x RET f utf-8`として、バッファのエンコーディングをUTF-8にしたうえで保存するようにしましょう。

C言語のように数値で`¥`をする方法があればそれがベストなのですが、
とりあえずファイルローカル変数でファイルエンコーディングを指定する方法で回避できそうです。
http://www.gnu.org/software/emacs/manual/html_node/emacs/Specifying-File-Variables.html

誰かいい方法教えてー
diredで上のフォルダに移動する

# デフォルト

`^` にアサインされてる。

# カスタマイズ

`^`がどうしても気に入らない場合は、もちろん変えることができる。

例として、`C-l`に割り当ててみた（`helm`風(?)に）。

```el
(define-key dired-mode-map (kbd "C-l") 'dired-up-directory)
```

※ `C-l`を推奨するわけではないです。
Lubuntu 13.10 で、Fcitx + mozcを使う

最近のiBusはキーがアレだったりするので、Fcitxに乗り換えましょう。

導入
----
以下で詳細に導入方法が紹介されていて、そのまま実行して導入出来ました。

<http://fu-sen.org/post/66172726472/lubuntu-13-10-ubuntu-japanese-team>

モード切り替えキーの変更
---------------------
Fcitxのキーが`Ctrl-Space`になっているためにEmacsが使いづらいです。

メニュー→設定→Fcitx 設定を開き、
全体の設定タブの一番上の入力メソッドのオンオフのCtrl-Spaceと表記されたボタンをクリックし、
ダイアログが出たらEscで割り当てを解除できます。
忙しい人のためのHello, world （またはGNU Makeの裏ワザ的ななにか）

# 前置き

もっと良い方法を考えついた方は”もっと忙しい人のための”とか”もっと^2”とか題名つけてくれると嬉しいです。

# 本題

```bash
$ echo -e '#include <stdio.h>\nint main(void){puts("Hello, world!");return 0;}'>main.c;make main;./main
cc     main.c   -o main
Hello, world!
```

shなら`-e`を削ってください。

```bash
$ echo '#include <stdio.h>\nint main(void){puts("Hello, world!");return 0;}'>main.c;make main;./main
cc     main.c   -o main
Hello, world!
```
# 解説

## その1

```bash
$ echo -e '#include <stdio.h>\nint main(void){puts("Hello, world!");return 0;}'>main.c
```

ただ単に、以下を`echo`で吐くだけです。

```c
#include <stdio.h>
int main(void){puts("Hello, world!");return 0;}
```

## その2

```bash
$ make main
```

なぜこれで、実行バイナリ`main`ができるか不思議ですよね。 **というかこれが書きたかったのです**。

GNU Makeには組み込みルールというのがあり、`make -p`で表示できます。

ターゲットを与えるとから自動的にそれを生成するためのものを組み込みルールから探し出し、ターゲットを生成してくれます。

上記の例では、`main`がターゲットです。

組み込みルールの中には、こんなのが含まれています。

```mf
%: %.c
#  commands to execute (built-in):
        $(LINK.c) $^ $(LOADLIBES) $(LDLIBS) -o $@
```

「`foo`を`foo.c`からこのコマンドで作る」というルールです。
同様に、「`foo.o`を`foo.c`から作る」とか「`foo.c`を`foo.y`から作る」なんてのもあります。

このルールの読み方は、以下を参照してください。

http://www.gnu.org/software/make/manual/make.html#Canned-Recipes
http://www.ecoop.net/coop/translated/GNUMake3.77/make_10.jp.html#SEC89

## その3

```bash
$ ./main
```

解説不要ですね。
Sentryを使って、Webアプリで起きた例外をキャプチャしてオンラインで見られるようにする


# 概要

[Sentry](https://www.getsentry.com/)は、PythonやJavaScript、Ruby、PHPなど、様々な言語で実行時に捕捉されなかった例外を自動的にトラップし、オンラインで閲覧可能にするツールです。

元々は[Disqus](http://disqus.com/)の社内で開発され（[当時の社内ブログ](http://blog.disqus.com/post/1178923988/django-sentry)）、その後、[オープンソースとして公開](https://github.com/getsentry/sentry)されました。

Sentryは、オープンソースなので、比較的簡単にLinuxサーバやHerokuなどのPaaS上にも入れることが出来るほか、Webサービスとしても提供されており、ユーザ登録することで使用することも出来ます。

Sentryを使うと、特に500エラーなど、ユーザが実際に目にする例外をオンラインで簡単に監視することが出来るため、非常に便利です。

## サービスへの登録

今回は、[Webサービス版](http://getsentry.com)を使用してみたいと思います。Webサービス版は、個人で使用し、秒間2回以下の例外を捕捉する場合には、無料で使用することが出来ます。

まずは、[こちら](http://getsentry.com)からユーザ登録を済ませ、自分のチームを作成します。

次に、新しいプロジェクトを作成し、Platformで「Flask (Python)」を選択します。

これで、オンラインでの登録処理は完了です。

## プログラムへの導入

まず、必要であれば、virtualenvを作成します。

```bash
% virtualenv --no-site-packages .venv
% source .venv/bin/activate
```

次に、必要なライブラリを導入します。

```bash
% pip install flask raven blinker
```

そして、以下のように、エラーを出すだけの機能を持ったFlaskアプリケーションに、導入してみます。

```python:test.py
from flask import Flask
app = Flask(__name__)

from raven.contrib.flask import Sentry
app.config['SENTRY_DSN'] = 'https://[APP_CODE]@app.getsentry.com/20258'
sentry = Sentry(app)

@app.route("/err")
def err():
    raise RuntimeError('Error')


if __name__ == "__main__":
    app.run()
```
([APP_CODE]はWebサービスの管理画面で取得可能なURLに置き換えてください）

必要はコードは三行程度です。あとはRavenが自動的に例外を捕捉し、サーバサイドに送信してくれます。

## 実装状況の確認

作成したFlaskアプリケーションを実行し、curlで、/errにアクセスしてみます。

```bash
% python test.py
```

```bash
% curl localhost:5000/err
```

そうすると、上で登録した管理画面上に例外をあらわした項目が下記のように作成されているはずです。


![default   Sentry.png](https://qiita-image-store.s3.amazonaws.com/0/19357/c75d090f-bcce-694b-319e-a52427040099.png "default   Sentry.png")


## さいごに

Sentryは、実行時エラーを全て捕捉して管理することの出来る非常に優れたツールだと思います。無料で簡単に導入可能ですし、皆さんも導入検討されてみてはいかがでしょうか。
作業中のブランチとは別のリモートブランチにとりあえず作業状態を保存しておく。

前置き
======

こんな機会、よくありますよね

* 帰宅時間になったので作業状態を保存しておきたい。
* ロングスパンの作業をやってる雰囲気を演出するために、途中経過をリモートブランチにpushしておきたい。
* **でも、本命のブランチは綺麗にしておいて、けちな修正は`git rebase -i`でまとめてからコミットやレビューにだしたい。**

それを叶えます。

実際
----

まずは通常の作業をする。

```bash
cd repo
git checkout foo
vi foo/foo.c
git commit -a -m "WIP"
git commit -a -m "WIP"
# ...
```

帰りたいので、状況をリモートレポジトリにpush。

```bash
git commit -a -m "Save WIP" # とりえずコミット
git push origin HEAD:foo-WIP # WIPつけてpushしちゃう
```

次の日、ブランチは`foo`のままで作業を再開できる。
また、朝起きてPCが壊れていても、リモートから`foo-WIP`をチェックアウトして別の環境で再開できる。

```bash
git branch
* foo
vi foo/foo.c
```

作業が一段落ついたときに、”Fix build error"とか”Revert previous commit”とかを消して、`foo`にpushできる。

```bash
git rebase -i xxxx
git push origin foo # 本命をpush!
```

あとはレビューなりPull RequestなりでマージすればOK。

蛇足ですが、コードレビューはせいぜい3コミットぐらいにしてから出さないと、読む人が大変なので注意。
rbenvを一発で入れるShellScript

# 元ネタ
以下の内容を単に書き下しただけ。

https://github.com/sstephenson/rbenv/blob/master/README.md

また、パッケージは以下を参考に。

https://github.com/sstephenson/ruby-build/wiki#suggested-build-environment

# 本題

以下のファイルを、`rbenv.sh`等にして`sh rbenv.sh`すれば、最初に`sudo`パスワード聞かれる以外は自動で全部やってくれる。
特にビルドに必要なパッケージインストールは覚えるのも探すのも面倒なので、ここにまとめておくと楽。

```bash:Ubuntu
#!/bin/bash

sudo true
sudo apt-get install build-essential autoconf libssl-dev libyaml-dev libreadline6 libreadline6-dev zlib1g zlib1g-dev

git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(rbenv init -)"' >> ~/.bashrc
. ~/.bashrc # ここはうまくいかないかも。

git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
```

# 課題

* `which rbenv`ですでに追加済みのケースは排除したい。
* `. ~/.bashrc`が意図通りに動いてなかったかも。
* `sudo`は`apt-get`だけしか使わないから、いらないときはパスワード入力省きたい。
* CentOS等、RedHat系に対応
Gitのローカルレポジトリを簡単に複製する方法

たしかこんな感じ。

```
git clone http://github/user/foo.git
mkdir bar
cp -r foo/.git bar/
cd bar
git checkout .
```

基本的にすべての情報は`.git`にのみ入っているので、
ステージした変更やら、Untrackedな変更やらはさておき、
ブランチの情報はそっくりそのまま複製できるので、いちいち`git clone`/`git fetch`する手間が省ける。
Vimの色変更の後始末をする

# はじめに
gnome-terminal から起動した Vim でカラースキームを変更すると、Vim の終了後に起動した別のコマンドで表示が乱れる場合があるようです。

どうやら xterm では発生しないようですので、ひょっとすると gnome-terminal の問題なのかもしれませんが、Vim側で何とか対処できましたのでその方法を紹介します。

# Vim の終了後に起動したコマンドで表示が乱れる
例えば、Vim の終了後に `less --help` を実行するとこのような画面になります。

![broken_less.png](https://qiita-image-store.s3.amazonaws.com/0/235/431f8f7e-c04b-8d96-a62a-bfdcb3c12684.png)

一応、`r`キーで再描画すれば直ることは直るのですが、一々面倒ですし、何となく気持ち悪いですよね。
 
# `t_Co`オプションの値を変更して対処する
そこで色々試した結果、Vim の終了時に `t_Co`オプションの値を変更すればこの現象は発生しないことが分かりました。
（相談に乗っていただいた、[@osyo-manga](https://github.com/osyo-manga) さんありがとうございました）

現在は下記のコードを `~/.vimrc` に追加して対処しています。

```vim
" Set 256 colors
let s:saved_t_Co=&t_Co
if $COLORTERM == 'gnome-terminal'
  set t_Co=256
endif

" Restore t_Co for less command after vim quit
augroup restore_t_Co
  autocmd!
  if s:saved_t_Co == 8
    autocmd VimLeave * let &t_Co = 256
  else
    autocmd VimLeave * let &t_Co = 8
  endif 
  autocmd VimLeave * let &t_Co = s:saved_t_Co
augroup END
```

終了時に `let &t_Co = `を二度実行しているのは、`t_Co`オプションの値を同じ値で上書きした場合は直らなかったからです。

試した限りでは、終了時に`t_Co`オプションの値さえ変更すれば初期値に戻す必要はなかったのですが、念のため安全側に振ってあります。

同様の現象で困っている方は、ぜひお試しください。

# 最後に
この投稿は当初、「256色表示にしたVimの後始末をする」というタイトルだったのですが、Vim の256色表示モードが原因ではないことが分かったので、タイトルと本文を大幅に修正しました。

私が普段使っている `desert256`カラースキームは、8色表示モードでは背景色を変更しないために256色表示モードが発生条件と誤解してしまったのですが、`blue`カラースキーム等で確認して、8色表示モードでも `less --help` の表示が乱れることを確認しました。

上記の対処方法で何か問題点や改善策等ありましたら、ぜひコメント等でお知らせください。
日付指定で、GASからTwitterに投稿するスクリプトを作ってみた


##経緯
2014/3/1にあった[OSC 2014 Tokyo/Spring](https://www.ospn.jp/osc2014-spring/)の2日目。
最後のLTでDahlia*さんが「Twitterに投稿できれば・・・」と言っていたので、以前作った[スクリプト](https://github.com/koricori/GAS_Limit-mail)を応用すればいけるかな？と勉強も兼ねて作ってみました！
(コピー人形はさすがに無理ですｗ)

##作成方法(認証関連含め)

を書こうとしましたが、さすがにスクリプトを書くだけで疲れました。。。(日頃、開発をしている人間ではないので、書くのに数時間かかりました^^;)
今日は疲れたので、また今度書きます。

##スクリプト
[Gist](https://gist.github.com/koricori/9291944)に置いておきました。

##使い方
1. Spreadsheetを画像のように作ります。  
![Spreadsheetの中身](https://qiita-image-store.s3.amazonaws.com/0/23370/e36a4863-f1bb-4c1e-8e90-7d67bce64e61.png "Spreadsheetの中身")

2. Twitter APIを利用するためアプリ登録をします。
![Twitterアプリの登録](https://qiita-image-store.s3.amazonaws.com/0/23370/4bed48b8-7fa1-fcc1-fd06-47a64c452df6.png "Twitterアプリの登録")  
注意：twitterという文字はアプリ名に使えないのと、(私の場合)携帯をtwitterに登録させる必要がありました。
  
3. Scriptの設定をします。
※ わかりやすくできなかったので、投稿日の○日前と指定する形になっています。詳細はスクリプトを見て下さいｗ
4. test_oauthを実行して認証をします。
5. post-tweetを実行すればツイートできます。  
![ツイート結果](https://qiita-image-store.s3.amazonaws.com/0/23370/6e7ea891-b717-7203-a792-0e812dbf17b6.png "ツイート結果")


##参考にさせていただいたもの
・[GAS(Google Apps Script)でお手軽にbotを作る方法。](https://sites.google.com/site/usakoyama/gastotwitterbot)
・[Making requests to services with OAuth / Google Developers](https://developers.google.com/apps-script/guides/services/external#making_requests_to_services_with_oauth)
連続した数列を範囲形式にまとめたい をPHPで - その2

[前回のコード](http://qiita.com/hidenorigoto/items/5b3240fa427a7c79a0f5)では対象が数値配列固定だったので、データ構造とアルゴリズムを分離してアルゴリズムを再利用できるようにする。

```php
<?php

class ContinuousRangeDivider
{
    public function divide($data, $continuousChecker)
    {
        return array_reduce($data, function ($current, $element) use ($continuousChecker) {
            if (count($current) == 0) {
                $current[] = [$element];
                return $current;
            }

            $currentLastRange = end($current);
            $currentLastNumber = end($currentLastRange);
            if ($continuousChecker($currentLastNumber, $element)) {
                if (count($currentLastRange) > 1) {
                    array_pop($currentLastRange);
                }
                $currentLastRange[] = $element;
                array_pop($current);
                $current[] = $currentLastRange;
            } else {
                $current[] = [$element];
            }
            return $current;
        }, []);
    }
}

class ContinuousRangesPrinter
{
    public function render($ranges, $toString = null)
    {
        if (!$toString) {
            $toString = function ($input) {
                return $input;
            };
        }
        return array_reduce($ranges, function ($current, $range) use ($toString) {
            if ($current != '') {
                $current .= ',';
            }

            $current .= $toString($range[0]);

            if (count($range) > 1) {
                $current .= '-' . $toString($range[1]);
            }

            return $current;
        }, '');
    }
}

$divider = new ContinuousRangeDivider();
$printer = new ContinuousRangesPrinter();


// 数値配列
$data = [1, 3, 4, 5, 7];
$ranges = $divider->divide($data, function ($a, $b) {
    return ($b - $a) == 1;
});
echo $printer->render($ranges),PHP_EOL;


// 日付配列
$data = [
    new \DateTime('2014-01-01'),
    new \DateTime('2014-01-02'),
    new \DateTime('2014-01-13'),
    new \DateTime('2014-01-14'),
    new \DateTime('2014-01-15'),
    new \DateTime('2014-01-31'),
    new \DateTime('2014-02-01'),
];
$ranges = $divider->divide($data, function ($a, $b) {
    return ($b->getTimestamp() - $a->getTimestamp()) == 86400;
});
echo $printer->render($ranges, function ($input) {
    return $input->format('n/j');
}),PHP_EOL;


// 結果
// 1,3-5,7
// 1/1-1/2,1/13-1/15,1/31-2/1
```
#ssmjp で #seccon CTFオンライン予選のWrite upのデモをしてきました

1月下旬に行われたSECCON CTFのオンライン予選のネットワーク・Webの200点問題、 "Find the key!" をdpktを使って解くデモをしてきました。

SECCON CTF自体については公式サイト http://2013.seccon.jp/ をご覧ください。
また、問題や解き方については、既に多くの方がWrite upを書いているので、そちらもご覧ください。

この問題は、pcapファイルが渡されて、その中からキーを見つけると言う問題でした。
pcapファイルの中身はPingの通信で、Pingのデータ部分にHTTPの通信がトンネルされていて、その中で kagi.png という画像がGETされていました。要はその画像を復元してやればよいという問題でした。


まずは問題のファイルを開きます。

```py
>>> import dpkt
>>> p=dpkt.pcap.Reader(open("seccon_q1_pcap.pcap","rb"))
```

Wiresharkでパケットを眺めていると、大体100バイトより大きいパケットに目当てのデータが含まれているコトが分かります。そこで、100バイトより大きいパケットのデータ部分をリストに抜き出します。

```py
>>> pl=[]
>>> for t,b in p.readpkts():
...     ip=dpkt.ethernet.Ethernet(b).data
...     if ip.len > 100:
...             pl.append(ip.data.data.data)
```

リストの中身を見ていくと、 `pl[2]` から　 `pl[6]` に画像が入っていることが分かります。

まずは `pl[2]` を見ます。これにはHTTPのレスポンスヘッダも含まれているので、それを取り除いてやります。PNGファイルは先頭1バイトが 0x89 ではじまり、続く3バイトがASCIIでPNGなので、PNGを探してその1バイト前からを抜き出すようにします。

```py
>>> pl[2].index("PNG")
285
>>> PNG=pl[2][284:]
```

次に `pl[3]` から `pl[6]` ですが、これをすべて `PNG` につなげるとうまくいきません。
PNG画像（の一部）以外の何かが入っています。
kagi.png の中身はレスポンスヘッダの Content-Lengthの値から2795バイトであることが分かっています。

```py
>>> pl[2][216:238]
'Content-Length: 2795\r\n'
```

それに対し、 `pl[3]` から `pl[6]` を全部つなげると、上記の値より大きくなってしまいます。

```py
>>> len(PNG)
768
>>> l=len(PNG)
>>> for n in range(3,7):
...     l+=len(pl[n])
... 
>>> l
2908
```

というわけで、 `pl[3]` から `pl[6]` の各パケットにどれだけ余計なのがついてるんだろうか、としらべてみると、28バイト取り除いてあげればよさそうということが分かります。

```py
>>> 2908 - 2795
113
>>> 113 / 4
28
```

余りが1あるのと、取り除くのは先頭か最後か、は `pl[6]` の最後を見ると分かります。

```py
>>> pl[6][-10:]
'\x00IEND\xaeB`\x82\x00'
```

というわけで、 `pl[3-6][28:]` をつなげて、最後の1バイトを取り除いてあげればよいことが分かりました。

```py
285
>>> PNG=pl[2][284:]
>>> for n in range(3,7):
...     PNG=PNG+pl[n][28:]
... 
>>> len(PNG)
2796
>>> PNG=PNG[:-1]
>>> open("kagi.png","w").write(PNG)
```

あとは、書き込んだ kagi.png を適当な画像ビューワで開いてあげるとフラグが見えます。


後で気づいたのですが、　`pl[2]` で HTTPのレスポンスが始まる位置を調べても、先頭28バイトを取り除いてあげればよいことが分かります。

```py
>>> pl[2][:50]
'\xd5 \x08\x80\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x02\x00\x00\x00\x01\x00\x00\x04\x00\x00\x01\x028HTTP/1.1 200 OK\r\nDate:'
>>> pl[2].index("HTTP")
28
```
メールをチャットワークに転送する

## 追記 2015/09/09

どうやら、同様のことを行うもっとキレイな方法ができたようです。

[Zapierでできることと初期設定方法〜チャットワークとZapierが連携　その① | ChatWorkブログ](http://blog-ja.chatwork.com/2015/09/zapierzapier.html)

------

会社でのコミュニケーションツールを一本化したいと常々思っていた
チャットワークのAPIトークンを取得できたのを期にやってみたらできたので紹介


# ゴール

未読メールをチャットワークの特定のルームに転送する

# 前提

* Gmailを利用していること
* チャットワークのAPIトークンを取得できること

# やること

1. チャットワークのAPIトークンを取得する
2. チャットワークに転送先となるルームを作成し、ルームIDを取得する
3. Google Apps Script で未読メールを監視し、作成したルームに書き込む

## チャットワークのAPIトークンを取得する

2014-03-01現在、利用するにはまだ申し込みが必要
申し込みはここから
https://www.chatwork.com/service/packages/chatwork/subpackages/api/apply_beta.php

## チャットワークに転送先となるルームを作成し、ルームIDを取得する
今回は「Mail Box」というルームを作成した
ルームIDは赤枠の数字部分

![スクリーンショット 2014-03-01 23.35.49.png](https://qiita-image-store.s3.amazonaws.com/0/10718/f99e679b-9846-0582-5c5a-ae3b1a7c54a0.png "スクリーンショット 2014-03-01 23.35.49.png")


## Google Apps Script で未読メールを監視し、作成したルームに書き込む

ここが今回のキモ
まずGoogleDriveで空のスプレッドシートを作成し、「ツール」→「スクリプトエディタ」→「空のプロジェクト」でプロジェクトを作成
以下のスクリプトを保存

```js
function notifyMail() {
  var token = '[APIトークン]';
  var roomId = '[ルームID]';
  
  // 未読メールを取得する 検索クエリを変更すれば転送するメールを絞ることも可能
  var threads = GmailApp.search('is:unread');
  if (threads == null || threads.length === 0) return;
  
  for (var i = 0, tlen = threads.length; i < tlen; i++) {
    var msgs = threads[i].getMessages();
    for (var j = 0, mlen = msgs.length; j < mlen; j++) {
      var msg = msgs[j];
      if (!msg.isUnread()) continue;
      
      var from = msg.getFrom();
      var subject = msg.getSubject();
      // 添付ファイルがあるときに時々エラーになるため、その場合は自前でプレーンテキスト化する
      var body;
      try {
        body = msg.getPlainBody();
      }
      catch(e) {
        body = msg.getBody().replace(/<br[^>]*>/g, '\n').replace(/<[^>]+>/g, '').replace(/&(lt|gt|quot|amp|nbsp|#x?[0-9]+);/g, function(w, $1) {
          if ($1.indexOf('#x') === 0) {
            return String.fromCharCode(parseInt($1.substr(2), 16));
          }
          if ($1.indexOf('#') === 0) {
            return String.fromCharCode(parseInt($1.substr(1), 10));
          }
          return ({
            lt: '<',
            gt: '>',
            quot: '"',
            amp: '&',
            nbsp: ' '
          })[$1];
        });
      }
      var link = 'https://mail.google.com/mail/ca/u/0/#inbox/' + msg.getId(); // Gmailへのリンク
    
      // http://developer.chatwork.com/ja/endpoint_rooms.html#POST-rooms-room_id-messages
      UrlFetchApp.fetch('https://api.chatwork.com/v1/rooms/' + roomId + '/messages', {
        headers: {
          'X-ChatWorkToken': token
        },
        method: 'post',
        payload: 'body=' + encodeURIComponent(
          // メールっぽく装飾する
          // http://developer.chatwork.com/ja/messagenotation.html
          '[info][title]' + subject + '\n'
          + 'from: ' + from + '[/title]'
          + body + '\n\n' + link + '[/info]'
        )
      });
    
      msg.markRead();
    }
  }
}
```

さいごに、「リソース」→「現在のプロジェクトのトリガー」から時間主導型のイベントを追加する

以上
jQueryのセレクタメモ

# はじめに
最近 jQuery はじめたけど、セレクタ自由に使えないと捗らないのでまとめておく。

# 注意点
* 以下に出てくるセレクタ特殊文字（'.', ',', ':', '#', '[', ']'）はエスケープが必要

# 基本セレクタ
タグ名 or クラス名 or ID による指定ができる。

```js
$("form");       // タグ名="form"
$(".className"); // クラス名="className"
$("#formId");    // ID="formId"
```

# 複合条件の指定
区切りなしでAND、カンマ区切りでOR。
## AND 指定

```js
$("ul.listClass1"); // タグ名="ul" and クラス名="listClass1" 
$("ul#listId1");    // タグ名="ul" and ID="listId1"
```

## OR 指定

```js
$("div,.listClass1"); // タグ名="div" or クラス名=listClass1 
$("ul,#divId1");      // タグ名="ul"  or ID="divId1"
```

# 階層関係の指定
## 親-子関係

```js
$("#root > .node");         // 「ID="root"」を親に持つ「クラス名="node"」 
$(".node").parent("#root"); // 「クラス名="node"」の親のうち「ID="root"」の要素
```

## 先祖-子孫関係

```js
$("#root .node");            // 「ID="root"」を先祖に持つ「クラス名="node"」 
$(".node").parents("#root"); // 「クラス名="node"」の先祖のうち「ID="root"」の要素
```

## 兄-弟関係

```js
$(".node").siblings(); // 「クラス名="node"」の兄弟（自分を除く）
```

# フィルタ

## 属性

```js
$('input[name]');          // タグ名="input" and name属性を持つ
$('input[name="quiz1"]');  // タグ名="input" and name属性が"quiz1"と一致
$('input[name!="quiz1"]'); // タグ名="input" and name属性が"quiz1"と不一致
$('input[name^="quiz1"]'); // タグ名="input" and name属性が"quiz1"と先頭一致
$('input[name$="quiz1"]'); // タグ名="input" and name属性が"quiz1"と末尾一致
$('input[name*="quiz1"]'); // タグ名="input" and name属性が"quiz1"と部分一致
```

## 使用可否

```js
$('input[type="text"]:enabled');   // 入力可能テキストボックス
$('input[type="text"]:disabled');  // 入力禁止テキストボックス
```

## 選択状態

```js
$('input[type="checkbox"]:checked'); // 選択済チェックボックス
$('input[type="radio"]:checked');    // 選択済ラジオボタン
$('select > option:selected');       // リストボックス・コンボボックス内の選択済要素
```

## 可視性

```js
$('div:hidden');    // 不可視状態になっているdiv要素（display:noneも含む）
$('input:hidden');  // 不可視状態になっているinput要素≒$('input[type="hidden"]');
$('div:visible');   // 可視状態になっているdiv要素
```

なお、単純な":hidden"だとhead,title,scriptタグ等にもマッチする可能性がある。

# おことわり
* ここで挙げたのは、個人的によく使いそうなもののみである。
* 動作未確認のため、表記ミス・勘違いがあるかもしれない。
* 指摘があれば多分修正する。
dandelion を使って FTP 経由でデプロイする

FTP しか接続手段がないサーバーで利用できるデプロイツールを探してたところ、[dandelion](https://github.com/scttnlsn/dandelion) というツールが見つかりました。とりあえずファイルがデプロイできることが確認できたのでシェアします。git でコミットしていない変更はデプロイされないみたいなので、git との連携もできるようです。

## 1. まずは gem でインストールします。

```bash
gem install dandelion
```

## 2. Git リポジトリのプロジェクトルートに移動して、`dandelion.yml` というファイル名で設定ファイルを作成します。このファイルにはデプロイ先サーバーの FTP 接続情報を yaml 形式で記述します。

```yaml
scheme: ftp
host: FTPHOSTNAME
username: FTPUSERNAME
password: FTPPASSWORD
path: /path/to/directory
```

## 3. `dandelion.yml` を `.gitignore` に追記しておきます。

## 4. ファイルの変更をコミットしたうえで、下記のコマンドを実行すると Git プロジェクトがデプロイされます。

```bash
dandelion deploy
```
Empty ApplicationでSpriteKitを使うときにはまるエラー

Empty Application TemplateからSprite Kitを使う方法は下記サイトが詳しくわかりやすい。その通り行うだけでうまくいく。

http://spritekit.jp/tutorial/scratch/

ただし、間違って設定をすると、分かりにくいエラーではまるので、起こった問題をメモしておく。

## 問題
### NSInvalidArgumentExeptionでクラッシュ
```bash
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIView setShowsFPS:]: unrecognized selector sent to instance
```

SKViewを(SKView *)self.viewというキャストする方法で取得するが、下記の場合にエラーが起こる。

- self.viewがランタイム時にSKViewではなくてUIView
- そもそも正しいStoryBoardが使用されていない・読み込まれていない

#### 解決策
下記の点について確認・修正する。

1. Storyboardが正しく設定されているか
  - プロジェクトの設定で、General -> Deployment Info -> Main Interface にStoryBoardを設定する
  - ![Screen Shot 2014-03-01 at 11.53.08 PM.png](https://qiita-image-store.s3.amazonaws.com/0/1635/48f9e212-fb71-0c45-8e29-99af6341e180.png)
1. StoryboardのView Controllerに作成したView Controllerが設定されているか
  - Custom Classに設定する
  - ![Screen Shot 2014-03-01 at 11.55.02 PM.png](https://qiita-image-store.s3.amazonaws.com/0/1635/f8f22bfa-3d66-3df9-4d64-20732e076027.png)
1. Storyboardで設定したView ControllerのViewがSKViewに設定されているか
  - ViewのCustom ClassでSKViewを指定する
  - ![Screen Shot 2014-03-01 at 11.59.47 PM.png](https://qiita-image-store.s3.amazonaws.com/0/1635/9f7e2506-c1e7-e766-6945-0b688a46c8c5.png)

#### 参考
http://www.ggkf.com/objective-c/simple-sprite-kit-scene-setup-going-wrong
http://qiita.com/tnantoka/items/5c24e72dc569da1c9b62

### 画面に何も表示されない時

- FPS等が表示されず、白い画面しか表示されない。下記のメッセージがコンソールに出力されている
```
Application windows are expected to have a root view controller at the end of application launch
```

#### 解決策
1. AppDelegate.mを修正する

```objc
// Before
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];
    return YES;
}
```

```objc
// After
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    return YES;
}
```

#### 参考
http://stackoverflow.com/questions/8260036/rootviewcontroller-set-in-storyboard-not-showing-on-app-launch
rails開発してたらコミットコメントが文字化けた話


先週ぐらいからrails開発をしています。
Eclipseにaptana plugin(なにやらこれが使いやすいという話をきいたので)を入れて、First commit！

実はこのときにgit pluginのUIが慣れているEgitとはだいぶ違ったのですが、大幅にUI変更したのだろうと気にしてませんでした。

そしてブラウザでコミットを確かめてみると、なにやら???と文字化け。

なんじゃこりゃと思い調べてみると、ここにこんな情報が…
[解決：Aptana(eclipse) + EGit のコミットログ文字化けと化けたログの修正方法](http://www.k-brand.gr.jp/log/002510)
>実際のコミットに使用されていたのは EGit ではなく Aptana 導入時にこっそり追加されている PortableGit だったというオチでした




おおぅ...やっぱりアレはEgitじゃなかったのか。

実際にみてみる。

```
username-no-MacBook-Air:plugins username$ ls |grep git
com.aptana.git.core_3.0.0.1375993045
com.aptana.git.ui_3.0.3.1371850011.jar 
org.eclipse.egit.core_3.2.0.201312181205-r.jar
org.eclipse.egit.doc_3.2.0.201312181205-r.jar
org.eclipse.egit.ui_3.2.0.201312181205-r.jar
org.eclipse.egit_3.2.0.201312181205-r.jar
org.eclipse.jgit.archive_3.2.0.201312181205-r.jar
org.eclipse.jgit_3.2.0.201312181205-r.jar
```

確かに何か居る。
試しにどいていただくことに…

```
username-no-MacBook-Air:plugins username$ mv com.aptana.git.* ~/tmp/
```

```
username-no-MacBook-Air:plugins username$ ls |grep git
org.eclipse.egit.core_3.2.0.201312181205-r.jar
org.eclipse.egit.doc_3.2.0.201312181205-r.jar
org.eclipse.egit.ui_3.2.0.201312181205-r.jar
org.eclipse.egit_3.2.0.201312181205-r.jar
org.eclipse.jgit.archive_3.2.0.201312181205-r.jar
org.eclipse.jgit_3.2.0.201312181205-r.jar
```

このあとeclipseを立ち上げ直して、git cloneして再度コミットしたら文字化けがなおりました。

文字化けたコミットコメントはめんどくさくて直してないです。
GASでYouTubeの自分の再生リストを全て非公開にする。

## 前置き
今まで、YouTubeの動画をお気に入りに登録するのと同じように、再生リストにまとめてきたのですが、
非公開のつもりでまとめていたら、どうやら公開されているということに気が付きました。
で、泣く泣く手動で再生リストを非公開化しようと思ったら、「数が膨大でやってられない！」
ということで、ふと、GASにYouTubeのAPIが追加されたのを思い出して、全て非公開にするスクリプトを
作って動かしてみました。

## 本日のコード

```js:コード.gs
function myFunction() {
  var nextToken = "";
  while(nextToken != null) {
    var res = YouTube.Playlists.list('snippet,status', 
                                     {maxResults: 50,
                                      mine: true,
                                      pageToken: nextToken});
    
    for(var i = 0; i < res.items.length; i++) {
      var item = res.items[i];
      
      // PlaylistResponse.itemsの型はPlaylist
      if(item.status.privacyStatus != "private") {
        Logger.log("update: " + item.snippet.title + ", " + item.status.privacyStatus );
        item.status.privacyStatus = "private";
        var updateRes = YouTube.Playlists.update(item, "snippet, status");
        Logger.log(updateRes.status.privacyStatus);
      }
      
    }
    
    nextToken = res.nextPageToken;
  }
}
```

## YouTube Data APIの有効化と承認が必要です。
GASからYouTubeのAPIを実行するためにAPIを有効にします。
![gas側の有効化.png](https://qiita-image-store.s3.amazonaws.com/0/11925/ad538c6d-1632-d705-5c19-7d1de24450b8.png)

同時に、Developer ConsoleでもAPIを有効にしておきます。
![api有効化.png](https://qiita-image-store.s3.amazonaws.com/0/11925/a0cc91ad-e153-a144-090e-3e37939e3343.png)

実行時に、読み取りと、書き込みの承認をします。`YouTube.Playlists.list()`と`YouTube.Playlists.update()`を別々に試したので2つに分かれていますが、いきなり更新まで試す場合は、1回で済むと思います。
![読み取りの承認.png](https://qiita-image-store.s3.amazonaws.com/0/11925/6989f113-c96f-8300-326f-da4c01de79b3.png)
![書き込み承認.png](https://qiita-image-store.s3.amazonaws.com/0/11925/42da92e7-ca38-6d07-d163-95170fbe142c.png)

## 解説
まず、自分の再生リストを取得するには、`YouTube.Playlists.list()`を使います。第1引数が難しいですが、"snippet"を指定すると、再生リストのデータが取得されますが、公開／非公開などのstatus情報は付加されません。（GASでは、undefined）
従って、第1引数は、カンマ区切りで、"snippet,status"と指定しています。ただし、"status"だけでは、エラーになります。

`YouTube.Playlists.list()`は、最大50件まで、デフォルト5件なので、それ以上登録している場合は、pageTokenパラメータに`YouTube.Playlists.list()`で取得したnextPageTokenを指定します。最後まで取得し終わったらnextPageTokenがnullになりますので、while文で繰り返し取得します。
（私は、タイプミスがあって、無限ループしていると思い込んでいたけど、実は違ってた…）

戻り値に再生リストレスポンスが返されるので、それをそのまま利用します。
`res.items[i]`が再生リストの情報です。

公開／非公開情報は、`res.items[i].status.privacyStatus`に入っていて、"private"、"public"、"unlisted"の3のうちどれかが格納されています。ので、"private"でなければ、"private"に上書きして、`YouTube.Playlists.update()`を呼び出します。
引数が2つのものと、3つのものがありますが、今回のケースでは、2つの方を使えば大丈夫です。

## 結果
無事、全て非公開になりました！
が、もう少しGAS側で吸収できないのかな…。statusを付けずに読み取るなんていうことがありえるんだろうか…？まあ、いらないものは送らない方が速度面で有利だとは思うけど、パラメータの指定方法はわかりにくい…。

## 参考
https://developers.google.com/apps-script/advanced/youtube
https://developers.google.com/youtube/v3/docs/playlists