OmniAICreator/Qiita-1.07M huggingface dataset:
Travis CIのpipをアップグレードする

皆様、明けましておめでとうございます。今年もどうかよろしくお願いいたします。

さて、2014年の元日に[pip 1.5 がリリース](http://www.pip-installer.org/en/1.5.X/news.html#changelog)されました。

このバージョンには、[今までのバージョンと互換性のない変更点](http://www.pip-installer.org/en/1.5.X/news.html#changelog)がいくつかあるために、新春早々からその対応をしていた方もいらっしゃるようで、お疲れ様でした。

現時点で、[Travis CI](https://travis-ci.org/) の Python 環境にインストールされている pip のバージョンは 1.4.1 ですが、1.5 にアップグレードされるのは時間の問題です。

どうせアップグレードされるのだから先にアップグレードしてしまった方が楽だろう、ということで考えてみたのが下記の手順です。

事前に`devel`相当のブランチから`fix-requrements`ブランチを切ったりするのは、お好みでどうぞ。

### 1. `.travis.yml`の`before_script:`エントリに`pip freeze`を追加する
`before_script:`エントリは、テスト本体が実行される`script:`エントリの直前に実行されるエントリです。
このエントリに`pip freeze`を追加します。

```yaml:.travis.yml
before_script:
    - "pip freeze"
```

もし、`requirements.txt`が存在するようでしたら、`pip freeze -r requirements.txt`と記述すると、出力結果が少し見やすくなります。

ただし、`pip freeze`は`pip install`とは違い、`-r`で複数のファイルを指定すると、最後に指定したファイルしか有効になりませんのでご注意ください。

### 3. 編集した `.travis.yml`を commit して Travis CI でテストを走らせる。
これは、デフォルトの`pip`でテストをパスした時の環境をビルドログに記録するのが目的ですので、ここで一度 commit しておくことを強くオススメします。

### 4. `.travis.yml`の`before_install:`エントリを編集する
`before_install:`は、`pip install`等を実行する`install:`エントリの直前に実行されるエントリです。

このエントリに下記の行を追加します。

```yaml:.travis.yml
before_install:
    - "easy_install --version"
    - "pip freeze"
    - "travis_retry pip install -U setuptools"
    - "cd `mktemp -d`"
    - "travis_retry wget https://raw.github.com/pypa/pip/master/contrib/get-pip.py"
    - "travis_retry python get-pip.py"
    - "cd $OLDPWD"
    - "pip --version"
    - "easy_install --version"
```

以下、箇条書きで説明します。

* デフォルトの pip で`pip --version`を実行しないのは、Travis CI の Python 環境では何もしなくても python と pip のバージョンがビルドログに出力されるからです。
* 行2: `pip freeze`では setuptools のバージョンは表示されないので、`easy_install --version`を実行します。
* 行3: この`pip freeze`は`pip install`の前に実行されますので、`-r`オプションの追加は無意味です。
* 行4: [travis_retry](http://about.travis-ci.org/blog/2013-05-20-network-timeouts-build-retries/)は引数のコマンドを三回リトライするコマンドです。setuptoolsはここでアップグレードしますが、pipは[`pip install`ではなく`get-pip.py`を使ってアップグレードする](http://pip.readthedocs.org/en/latest/installing.html#install-or-upgrade-pip)ことになっています。
* 行5: `get-pip.py`をダウンロードするディレクトリを作成します。
* 行6: `get-pip.py`をダウンロードします。
* 行7: `get-pip.py`を実行します。pipの本体がここでダウンロードされますので、`travis_retry`で実行します。
* 行8: ビルドディレクトリに戻ります。一時ディレクトリはビルド終了時に破棄されるはずなので、ここでは削除しません。
* 行9,10: pip と setuptools のインストール後にバージョンを確認しているのは、アップグレードした最新版が間違いなく使われていることを問題発生時に確認できるようにするためです。

### 5. pip の変更点を確認して必要があれば修正する
pip の変更点については [pip の Changelog](http://www.pip-installer.org/en/latest/news.html#changelog) をご覧ください。

### 6. 変更を commit して Travis CI でテストを走らせる。
テストが無事パスすれば終了です。

### 最後に
以上の変更で、pip と setuptools の（開発版を除いた）最新リリースが常に適用されるようになりました。

同時に、インストールされたモジュールのバージョンの一覧がビルドログに残るようになりましたので、テストでエラーが発生した際に`pip install`のログを調べるよりも簡単に切り分けができるようになるはずです。

余談ですが、Ruby のプロジェクトでは`before_script: "bundle show"`するのはよくあることだそうですが、Python のプロジェクトで`.travis.yml`に`pip freeze`や`pip list`が含まれていた事例は見たことがありません。（ちなみに、PyPIでPython 3.Xをサポートしている3585モジュール中106ファイルの`.travis.yml`で0件）

Travis CI は、サイトが Ruby で構築されているサービスのようですので、ひょっとすると Pythonista には敬遠されているのかもしれませんね。
デフォルト引数とデリゲートの危険

```kamosika.cs
private void kamosika(int pKamosika = 100)
{
　UnityEngine.Debug.LogError("kamosika!!!" + pKamosika);
}
Start ()
{
Action aaa = kamosika;
　aaa();
}
```
えー、Unityで上の様なコードを書くと
結果は
kamosiuka!!!-1675146973
になりました。

Monoの仕様なのかC#の仕様なのか・・・・
誰か詳しい人おしえて・・・
MacBook Airを買ったので必要ソフトのインストールと設定

## 初期設定

* 英字配列なので`Caps Lock`を`Control`に変える
    * 環境設定のキーボードから修飾キーで`Caps Lock`を`^ Control`に
* トラックパッドのクリックを１タップにする
    * 環境設定のトラックパッドからポイントとクリックにチェック

## パスワード管理

他のデバイスでも管理したいのでKeePassを使用する。  
Macの場合はKeePassXとKeePassと２つの選択肢があるが、どちらも一長一短で

* [KeePass](http://keepass.info/)はKBD2.x形式に対応しているが動作にはMono上で動くが、動作が不安定
* [KeePassX](http://www.keepassx.org/)はKDB1.x形式にしか対応していなかったが最近出たAlpha版だと2.x形式に対応している※ただしαであること

軽く触ってみたところKeePassXはAlpha版ながら使用上は問題なさそうなので、こちらを使う

## キーボード設定

なんでもできるので[KeyRemap4MacBook](https://pqrs.org/macosx/keyremap4macbook/index.html.ja)をとりあえずインストール

* キーボードのリピート速度がデフォルトは遅いので早くする
    * Key Repeat/Basic Configurations/Key Repeat
        * Delay Until Repeatを80
        * Key Repeatを30

## ウェブブラウザ

[Chrome](http://www.google.co.jp/intl/ja/chrome/browser/)

## 日本語入力

[Google日本語入力](http://www.google.co.jp/ime/index-mac.html)

## ファイルシステム

* ext4をマウントする
    * [FUSE for OS X](http://osxfuse.github.io/)
        * インストール時に`MacFUSE compatibility Layer`にチェックを入れておく
    * [fuse-ext2](http://sourceforge.net/projects/fuse-ext2/)

ref: [Read and write ext4 file system on Mac OS X Lion](http://tex-numerics.blogspot.jp/2013/05/read-and-write-ext4-file-system-on-mac.html)

## トレントクライアント

軽量な[Transmission](http://www.transmissionbt.com/)

## ターミナル

やはり[iTerm2](http://www.iterm2.com/#/section/home)にしておく

## 音声通話

[Skype](http://www.skype.com/ja/)を使用する。インストールはサイトにいってサインインしないといけなくなったので若干めんどくさくなった。
アプリ初回起動時のみ実行する


initializeクラスメソッドは、アプリ初回起動時に一回だけ実行されるようだ。各クラスごとに呼ばれるので、継承していて子クラスでinitializeメソッドがないと、親クラスでinitializeメソッドが複数回呼ばれる可能性があるので注意する。

```objectivec:ViewController.m
+ (void) initialize
{
	// アプリ初回起動時のみ実行.
}
```
ruby-electric のコマンドを括弧に割り当てない

ruby-electric.el をロードすると、 begin の後にスペースを入力したときに end を挿入してくれて非常に便利です。しかし、 smartchr.el を使用している私には () や {}、|| などのキー (delimiter) を ruby-electric に取られるのは非常に迷惑でした。

ruby-electric を割り当てるキーを制御するには、 ruby-electric をロードするまえに `ruby-electric-mode-map` を改変します。例えば ruby-electric のコマンドを割り当てるキーから括弧を排除したい場合、以下のようなコードを .emacs に記述してください。

```common-lisp
(setq ruby-electric-mode-map
      (let ((map (make-sparse-keymap)))
        (define-key map " " 'ruby-electric-space/return)
        (define-key map [remap delete-backward-char] 'ruby-electric-delete-backward-char)
        (define-key map [remap newline] 'ruby-electric-space/return)
        (define-key map [remap newline-and-indent] 'ruby-electric-space/return)
        map))

(require 'ruby-electric)
```

改変前のコードは ruby-electric.el に記述されているので、他のキーを割り当てから取り除くのであれば元コードを参考にしてください。

先に ruby-electric をロードすると上手くいかないのでそこは注意です。
Windows7にVirtualBox,Vagrantを入れ、Dockerを試してみる

### VirtualBoxのインストール

利用しているOS用のインストーラをDLし、実行する
https://www.virtualbox.org/wiki/Downloads

### Vagrantのインストール

利用しているOS用のインストーラをDLし、実行する
http://www.vagrantup.com/downloads.html

インストール後、再起動する必要がある。

### CoreOSのセットアップ(dockerのホストOS)

```
$ git clone https://github.com/coreos/coreos-vagrant/
$ cd coreos-vagrant
$ vagrant up
```

Gitがインストールされていない場合は、適当にインストールする。
※Windowsだと[msysgit](http://msysgit.github.io/)とか

### PuttyでVagrantのCoreOSに接続する

1.  puttygen.exeを実行し、 **既存の秘密鍵の読み込み** で `%HOMEPATH%\.vagrant.d\insecure_private_key ` を読み込み、 **秘密鍵の保存** で `.ppk` 形式で保存する
2. Puttyを開き、ホスト名に `core@127.0.0.1 ` , ポートに `2222` を設定する(ユーザーが vagrantではなく **core** である点に注意！)
3.  Putty設定 - 接続 - SSH - 認証 で保存した秘密鍵を設定する

これで開けば接続される。

![putty_coreos.jpg](https://qiita-image-store.s3.amazonaws.com/0/6092/776ec97e-8ea8-fd63-a01d-c0547cc85da8.jpeg)

CoreOSには最初からDockerがインストールされている。

```
core@localhost ~ $ docker -v
Docker version 0.7.2, build 28b162e
```

### proxy環境下での実行

以下の投稿を参考に `/usr/share/oem/run` を編集し、実行権限を付け再起動しても自分の環境ではうまく動かなかった。（調査中）

* [プロキシ環境下でのCoreOS + Docker - Qiita [キータ]](http://qiita.com/kawasima/items/6cdb79913b5dfffd1a31)

ダサい！と書かれていたけど、仕方なく以下で実行。

```
$ sudo systemctl stop docker.service
$ sudo HTTP_PROXY=http://hogeproxy:3128 docker -d
```


### dockerfileの取得

pullコマンドでdockerfileを取得する

```
$ sudo docker pull ubuntu
```

### コンテナを作成し、Hello world

```
core@localhost ~ $ docker run ubuntu /bin/echo hello world
hello world
```
Node.js公式ドキュメント日本語訳のリポジトリをクローンする

```shell-session:Terminal
$ git clone --depth 1 http://github.com/nodejsjp/nodejs.org_ja.git
```

リポジトリをクローンしたあと、`docs/v0.10/api/index.html`を開くとnode.jsのいつものドキュメントが閲覧できます。

上越新幹線はトンネルが多く、電波が通じにくいのでブラウジングが困難なのですが、こうしてドキュメントをローカルにダウンロードしておけばいつでも見れるので、退屈な乗車時間も有用な開発時間にできますね！

ということに乗車してから気がついて、リポジトリをクローンしようとがんばったのだけど、トンネルの多い地点まで来てしまっていて結局クローンできなくてずっと寝てたのだけど(´・ω・`)
Oracleで接続元マシンのIPアドレスを取得する

```sql:
SELECT SYS_CONTEXT('USERENV', 'IP_ADDRESS') AS IP_ADDRESS FROM DUAL;
```

```text:実行結果
IP_ADDRESS
--------------
192.168.1.21
```

#参考
- [ＯＲＡＣＬＥ／オラクルＳＱＬリファレンス（SYS_CONTEXT）](http://oracle.se-free.com/dml/13_sys_context.html)

他にも色々取れるっぽい。
UIWebviewで前ページ、次ページがない場合は戻る、進むボタンを押せなくする。


```objective-c
-(void)webViewDidFinishLoad:(UIWebView*)webView{

if(wv.canGoBack == YES){
        btnBack.enabled = YES;
    }else{
        btnBack.enabled = NO;
    }
    
    if(wv.canGoForward == YES){
        btnForward.enabled = YES;
    }else{
        btnForward.enabled = NO;
    }
}

```

webの読み込みが終わった際に、webViewDidFinishLoadメソッドが呼ばれるので、

そのタイミングで次ページがあるかどうか（canGoForward）と前ページがあるかどうか（canGoBack）の判定を行い、

TRUEならenabled=YESにし、なければNOにしております。
GAE/PythonのDatastoreで重複禁止処理


調べたらKey_nameを使ってユニーク設定出来るみたいだけど，試した感じよく分からなかったので，selectをかけて一致するものが無ければ保存する形にした．

```Python
def SaveMusic(minfo,rank_info):
    MusicModel = Music()
    MusicModel.category = rank_info['category']
    MusicModel.title = minfo['title']
    MusicModel.artistName = minfo['artist']
    entity = Music.gql("WHERE title = :title", title=minfo['title'])
    if entity is None:
        MusicModel.put()
```

titleフィールドを重複禁止にしてます．
Trace/BPT trap: 5 error と表示されてRailsアプリケーションが落ちる


* MacOSX 10.8.5
* ruby 2.0.0p195

Gemfileに以下の1行を追加したらエラーでなくなったけどなんだったのかよくわかってない。

```Gemfile
gem 'pg'
```

参考: http://stackoverflow.com/questions/7087385/pg-gem-trace-bpt-trap-5-error-on-mac-os-x-lion
git remote add のミス


```$ git remote add origin(ラベル名) "リポジトリURL(git@github.com:〜)"```

とするところを勢いで

```$ git remote add origin master```

にしてしまった

```$ git push -u origin master```
>fatal: 'master' does not appear to be a git repository
fatal: Could not read from remote repository.

>Please make sure you have the correct access rights
and the repository exists.

###上書きはできないっぽい
```$ git remote add origin git@github.com:n0bisuke/music-tube.git```

>fatal: remote origin already exists.


## git remote のラベルを消す



```$ git remote remove origin(ラベル名)```
とすることで，

```$ git remote add git@github.com:〜```
が実行できた．
[教えて]Go言語:なぜインターフェイスはポインタにできない?


なぜ、インターフェイスはポインタにできないのでしょうか?

下記のコードのように`FooInterface`のポインタを受け取る関数`Call`を定義するとコンパイルエラーになります。

```go
package main

import "log"

type FooInterface interface {
	DoSomething()
}

type Foo struct {
}

func (this *Foo) DoSomething() {
	log.Println("Foo DoSomething was called")
}

func Call(foo *FooInterface) {
	foo.DoSomething()
}

func main() {
	Call(&Foo{})
}
```

エラーの内容

```
./main.go:17: foo.DoSomething undefined (type *FooInterface has no field or method DoSomething)
./main.go:21: cannot use Foo literal (type *Foo) as type *FooInterface in function argument:
	*FooInterface is pointer to interface, not interface
```

下記のようにアスタリスク `*` を取るとエラーがでなくなります

```go
func Call(foo FooInterface) {
	foo.DoSomething()
}

```
【JavaScript】指定した文字列が配列の中の何番目に格納されているか表示する。

こんにちは。

ちょっと無理くり学習したものを使ってみました。
function,if,forです。

```js

var ary = ["a","b","c","d"] ;
var searchNum = "b" ;

function newFunk(){
    for(var i = 0 ; i < ary.length ; i++){
        if(searchNum === ary[i]){
            var num = i ;
            console.log(num) ;
        }
    }
}
newFunk() ; //1
```

最初に配列を定義して、キーワードを指定。
newFunkのなかで、配列をまわしてsearchNumとaryが合致した値を表示

何かもっと上手くやる方法あると思いますが
まずはfunctionに慣れていきたかった＆期待の結果が得られたのでOKですかね・・。

それではこれからもよろしくお願いいたします。
肥大するimpalaのログをどうにかしたい


#課題
/var/log/impalad/profile以下にimpala_profile_log_xxxxのようなログファイルが大量に生成されてdiskが圧迫される

#確認

####impala_profile_logがなに奴かを確認してみる

`# view /var/log/impalad/profiles/impala_profile_log_xxx-xxxx`

```impala_profile_log_xxx-xxxx
1389023567970 e44325113dee8aaa:924a7462703efbbb eJztmw10FMUdwDchhBAIX5p4KbSOVWuwcOzt3nfB9pJcTJRcYu4A2+crb7nbhH3cR9zdS4yv7xkRY0ojKAatHw8VUamP0kiLHzRiQKRIQVEkoKYYwVrgAY
```

中身を見ただけだと何かわからない

[Using Impala Logging](http://www.cloudera.com/content/cloudera-content/cloudera-docs/Impala/latest/Installing-and-Using-Impala/ciiu_logging.html) によるとノード間に配布されたクエリーや転送結果などがログとして保存されるらしい。また、その内容はzlib-compressedされて保存されているとのこと。このデータは、Impala web user interfaceから参照できるらしい。

####Impala web user interfaceでチェック

query idをチェック
http://hoge.com:25000/queries

```
Query (id=e44325113dee8aaa:924a7462703efbbb):
  Summary:
    Session ID: 344bd91ef220378b:98af975dfd7c000
    Session Type: BEESWAX
    Start Time: 2014-01-01 16:52:14.596559000
    End Time: 2014-01-01 16:54:03.407829000
    Query Type: QUERY
    Query State: FINISHED
    Query Status: OK
    Impala Version: impalad version 1.x.x RELEASE (build 83d5868f005966883a918a819a449f636a5b3d5f)
    User: www
    Network Address: 192.168.23.xx:59026
    Default Db: hoge_db
    Sql Statement: SELECT
            *
        FROM
            hoge_log
        WHERE
            account_id = ’11’
          AND
            project_id = ‘111’
          AND
.
.
.

```

#対応

WebUIからも直近のデータだけ参照しているようであれば圧縮または別の場所に退避出来る気がする

####念のためどこまでのデータか確認

上記のqueryを例にすると **e44325113dee8aaa:924a7462703efbbb** がidなのでコレをキーに探してみる

`grep “e44325113dee8aaa:924a7462703efbbb” /var/log/impalad/profiles/*`

####影響がなさそうな範囲を圧縮

```Bash:gzip
# find -mtime +1 -type f ! -name "*.gz"|xargs gzip
```

#まとめ

gzipで25%(24.4MB -> 18.4MB)程度空きができたので、一時凌ぎにはなりそう。Cloudera managerでそもそもローテート設定出来るとこが無いのかな。。
環境に依存しない区切り文字の書き方

Linuxの/やwindowsの|などの区切り文字を環境に依存せずに書く方法。

PHPではDIRECTORY_SEPARATORを使用する。

cakeでは、定数のDIRECTORY_SEPARATORの省略形のDSを使用する。
DSはapp/webroot/index.phpに定義されている。
Chromeのキャッシュを強制的に消す


chromeの`cmd + shift + r`でも設定画面から削除しても消えないうざいキャッシュを強制的に消す。

```
rm -rf ~/Library/Caches/Google/Chrome/*
```

見ての通りかなり強引な方法なのでご利用は計画的に。私は乱用しています。
Ubuntu12で固定IPにする


Ubuntuで固定IPにする場合のメモ

`/etc/network/interfaces`の修正

```
# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto eth0

iface eth0 inet static
        address 192.168.xxx.xxx
        netmask 255.255.255.0
        broadcast 192.168.xxx.xxx
        gateway 192.168.xxx.x
```

DNSを設定する必要があったため、`/etc/resolvconf/resolv.conf.d/base`にnameserverを追加

```
nameserver 192.168.xxx.xxx
```

OS再起動もしくかコマンドで再起動

```
sudo /etc/init.d/networking restart
sudo /etc/init.d/resolvconf restart
```

おわり

***
参考サイト

* [ubuntu server 固定ipにする](http://w.livedoor.jp/frogapp/d/ubuntu%20server%20%B8%C7%C4%EAip%A4%CB%A4%B9%A4%EB)
* [Ubuntu 12.04 で resolv.conf に書いた記述が消える](http://linte.blog.fc2.com/blog-entry-12.html)
screenしてpythonでscreenをsplitしてリモートサーバーにsshログインする

screen上で実行する。
対象サーバーはssh鍵認証を事前に設定しておく

```py:screen.py
#!/usr/bin/python

import os
import time
from subprocess import Popen, PIPE, STDOUT


_SERVER_LIST     = (#('hostname', 'ipaddress'),
                     ('s1',      '192.168.0.1'),
                     ('s2',      '192.168.0.2'),
                     ('s3',      '192.168.0.3'),)

_SSH_USER        = 'admin'

_SUBPROCESS_ARGS = {'stdin'     : None,
                    'stdout'    : PIPE,
                    'stderr'    : STDOUT,
                    'shell'     : False,}

#----------------------------------------------------------
# SCREEN
#----------------------------------------------------------
def screen_ssh():

    for server_name, server_ip in _SERVER_LIST:

        screen_ssh = ('screen',
                      '-X',
                      'eval',
                      'split',
                      'focus',
                      'screen',
                      'title %s' % server_name,
                      'stuff "ssh -l %s %s\n"' % (_SSH_USER, server_ip))

        p = Popen(screen_ssh, **_SUBPROCESS_ARGS)
        time.sleep(1.0)

        for i in p.stdout : print i

#----------------------------------------------------------
# MAIN
#----------------------------------------------------------
if os.environ['TERM'] == "screen" :

    screen_ssh()

else :
    print "not screen"
```
git リモート操作

##リモートリポジトリの内容をローカルリポジトリに取得(マージしない)
```shell-session
# git fetch [リモートリポジトリURL|リモートリポジトリ名]
```
>
```shell-sessionl:コマンド例
# git fetch file:///opt/repos/git_test.git
	From file:///opt/repos/git_test
	 * branch            HEAD       -> FETCH_HEAD
```

##リモートリポジトリの内容をローカルリポジトリに取得(マージする)
```shell-session
# git merge FETCH_HEAD
```
>
```shell-sessionl:コマンド例
# git fetch file:///opt/repos/git_test.git
	From file:///opt/repos/git_test
	 * branch            HEAD       -> FETCH_HEAD
# git merge FETCH_HEAD
	Updating 70ff494..708600b
	Fast-forward
	 date.txt |    1 +
	 1 files changed, 1 insertions(+), 0 deletions(-)
```

##リモートリポジトリの内容をローカルリポジトリに取得(マージする)
```shell-session
# git pull [リモートリポジトリURL|リモートリポジトリ名]
```
>
```shell-sessionl:コマンド例
# git pull file:///opt/repos/git_test.git
	remote: Counting objects: 5, done.
	remote: Compressing objects: 100% (2/2), done.
	remote: Total 3 (delta 0), reused 0 (delta 0)
	Unpacking objects: 100% (3/3), done.
	From file:///opt/repos/git_test
	 * branch            HEAD       -> FETCH_HEAD
	Updating 70ff494..708600b
	Fast-forward
	 date.txt |    1 +
	 1 files changed, 1 insertions(+), 0 deletions(-)
```

##リモートリポジトリとローカルリポジトリの差分表示
```shell-session
# git diff HEAD FETCH_HEAD

```
>
--- 作業例 ---
1. リモートリポジトリの内容をローカルリポジトリに取得(マージしない)
1. 差分表示
>
```shell-sessionl:コマンド例
# git fetch file:///opt/repos/git_test.git
	From file:///opt/repos/git_test
	 * branch            HEAD       -> FETCH_HEAD
# git diff HEAD FETCH_HEAD
	diff --git a/date.txt b/date.txt
	index 377cd4e..31c4c67 100644
	--- a/date.txt
	+++ b/date.txt
	@@ -1 +1,2 @@
	 Sat Nov 23 05:46:22 JST 2013
	+Sat Nov 23 06:54:13 JST 2013
```

##ローカルリポジトリの内容をリモートリポジトリへ送信
```shell-session
# git push [リモートリポジトリURL|リモートリポジトリ名] [ローカルブランチ名]
```
>
--- 作業例 ---
1. ファイルの修正
1. ステージング
1. コミット
1. リモートリポジトリへ送信
>
```shell-sessionl:コマンド例
# echo $(LANG=C;date) >> date.txt
# git add date.txt
# git commit -m 'message 3' date.txt
	[master 45d530d] message 3
	 1 files changed, 1 insertions(+), 0 deletions(-)
# git push file:///opt/repos/git_test.git master
	Counting objects: 3, done.
	Writing objects: 100% (3/3), 232 bytes, done.
	Total 3 (delta 0), reused 0 (delta 0)
	Unpacking objects: 100% (3/3), done.
	To file:///opt/repos/git_test.git
	 * [new branch]      master -> master
```
git ブランチ操作

##ブランチ確認

```shell-session
# git branch
```
>
```shell-sessionl:例
# git branch
	* master
```

##ブランチ作成

```shell-session
# git branch [ブランチ名]
```
>
1. ブランチ作成
1. ブランチ確認
>
```shell-sessionl:例
# git branch test
# git branch
	* master
	  test
```

##ブランチ切替

```shell-session
# git checkout [ブランチ名]
```
>
1. ブランチ確認
1. ブランチ作成
1. ブランチ切替
1. ブランチ確認
>
```shell-sessionl:例
# git branch
	* master
# git branch test
# git checkout test
	Switched to branch 'test'
# git branch
	  master
	* test
```

##ブランチ削除

```shell-session
# git branch -d [ブランチ名]
```
>
1. ブランチ確認
1. ブランチ削除
1. ブランチ確認
>
```shell-sessionl:例
# git branch
	* master
	  test
# git branch -d test
	Deleted branch test (was 0b6162d).
# git branch
	* master
```

##ブランチマージ
```shell-session
# git merge [マージ元]
```
>
1. ブランチ確認
1. テストブランチ上でファイル修正
1. テストブランチ上でステージング
1. テストブランチ上でコミット
1. マスターブランチへ切替
1. テストブランチをマスターブランチへマージ
1. テストブランチ削除
>
```shell-sessionl:例
# git branch
	  master
	* test
# echo $(LANG=C;date) >> date.txt
# git add date.txt
# git commit -m 'message' date.txt
	[test 5906b81] message
	 1 files changed, 1 insertions(+), 0 deletions(-)
# git checkout master
	Switched to branch 'master'
# git merge test
	Updating d1884a2..5906b81
	Fast-forward
	 date.txt |    1 +
	 1 files changed, 1 insertions(+), 0 deletions(-)
# git branch -d test
	Deleted branch test (was 5906b81).
```

##ブランチ間の差分確認
```shell-session
# git diff [差分元ブランチ] [差分先ブランチ] [ファイル名]
```
>
```shell-sessionl:例
# git diff master test

```
privateなフィールドをインスペクタに表示する

Unityはコンポーネントのpublicなフィールドをインスペクタに表示してくれます。
しかし「設計的にはprivateにしたい。だけれどインスペクタで値を調整したい」という場面があります。
(フィールドはあまりpublicにしたくないものですし...)

そんな時は``[SerializeField]属性``を使います。
インスペクタに表示したいフィールドに``[SerializeField]属性``を指定すると表示されるようになります。

またクラスの場合は、クラスの定義に``[System.Serializable]属性``を指定すると、インスペクタに表示されるようになります(クラスのフィールドに``[SerializeField]属性``を指定する必要もあり)。

```csharp:Hoge.cs
using UnityEngine;
using System.Collections;

public class Hoge : MonoBehaviour
{
	[SerializeField]
	float parameter;
	
	[SerializeField]
	Piyo piyo;
	
	[System.Serializable]
	class Piyo
	{
		[SerializeField]
		float param;
	}	
}
```

![inspector.png](https://qiita-image-store.s3.amazonaws.com/0/35356/79069826-769f-6198-46c2-0b2702cc5cb7.png)
Linuxでユーザーアカウント名、グループ名の変更

```bash:ユーザー名の変更
usermod -l newname oldname
```

```bash:グループ名の変更
groupmod -n newgroup oldgroup
```

```bash:HOMEの変更
usermod -d /home/user1 -m user1
```

* `-m`でファイルの移動もしてくれる。

-------

```bash:ユーザーIDの変更
usermod -u 501 username
```

```bash:グループIDの変更
groupmod -g 520 groupname
```
Gitのちょっと便利な使い方 (git graph)

昔、会社のBlogでGitのコマンドラインでマージの履歴を目で追える方法を紹介したのですが、いまはちょっと改造して使ってます。

```ini:.gitconfig
[alias]
        graph = log --graph --date-order -C -M --pretty=format:\"<%h> %ad [%an] 
%Cgreen%d%Creset %s\" --all --date=short
```

--allを外したバージョンもあると便利
g = log --graph --date-order -C -M --pretty=format:\"<%h> %ad [%an] %Cgreen%d%Creset %s\" --date=short
デプロイしたリビジョンをファイルに書き出す

### 追記

Capistrano 3.1からは何もしなくてもprevious_revisionとcurrent_revisionが `set` されるようです。

- [capistrano/capistrano#32920c1](https://github.com/capistrano/capistrano/commit/32920c12570d237bdd355d662c28cec34bd9a2b3)

---

Capistrano2の頃はデプロイするとそのときのリビジョンがREVISIONという名前のファイルに書きだされていた（ような気がする）のですが、Capistrano3ではデフォルトでそういうことをやらなくなったみたいです。

下記のタスクを追加するとファイルに保存されるようになります。

```rb:config/deploy.rb
set :revision_file, 'REVISION'

namespace :deploy do
  task :save_current_revision do
    on role(:app) do
      within repo_path do
        set :revision, capture(:git, :'rev-parse', fetch(:branch))
      end
      within release_path do
        execute :echo "#{fetch :current_revision} > #{fetch :revision_file}"
      end
    end
  end

  before :updated, 'deploy:save_current_revision'
end
```
UITableViewのCellのアクセサリーを選択した時の遷移先を指定。StoryBoardを使用。

写真の赤枠の部分と、緑枠の部分で遷移先を変えたいとき。コードは書かずにStoryBoardを使用します。

![スクリーンショット 2014-01-06 15.03.27.png](https://qiita-image-store.s3.amazonaws.com/0/6688/9819f5e6-d3b9-8b95-b2e7-8c869ac54107.png)

赤枠の部分は通常通り、遷移元を選択して、controlボタンを押しながら遷移先へカーソルをドラッグすれば遷移ができるようになります。
（参考）　http://www.youtube.com/watch?v=M5KmaOcEc1w

緑枠の部分はカーソルでは選択ができないため、Attribute Inspectorのある右側のウィンドウから指定します。
一番右上の「→」というアイコンをクリックするとTriggered Seguesと書かれた中にaccessory actionという部分がありその横に「◯」があります。この「◯」から青い線を引っ張ってきて、遷移先のViewControllerにドラッグドロップします。

![スクリーンショット 2014-01-06 15.17.51（2）.png](https://qiita-image-store.s3.amazonaws.com/0/6688/dfd426da-cd64-c835-8ea1-b1ba57381c45.png)

これで遷移先との接続が完了。アクセサリーからの遷移だけを別のものに変更できます。

![スクリーンショット 2014-01-06 15.14.46.png](https://qiita-image-store.s3.amazonaws.com/0/6688/a02b382e-99f4-c731-9f3f-3e4da16f8a2f.png)
GetComponentでinterfaceを使いたい場合

特定のコンポーネントを取得したい場合、GetComponentを使うと思います。
で、その時に特定のinterfaceを実装しているものを取得したい場合の話。

例えばIHogeを実装しているコンポーネントを取得したい場合、以下のように書きたくなります。

```csharp:InterfaceTest.cs
using UnityEngine;
using System.Collections;

public class InterfaceTest : MonoBehaviour
{	
	void Start ()
	{
		var hoge = GetComponent<IHoge>();	
		if (hoge != null) {
			hoge.Hoge();		
		}
	}	
}

interface IHoge
{
	void Hoge();
}
```

しかしGetComponent<T>()は「where T : UnityEngine.Component」となっているようで、
以下のようなエラーが出ます。

```
Assets/InterfaceTest.cs(9,28): error CS0309: The type `IHoge' must be convertible to `UnityEngine.Component' in order to use it as parameter `T' in the generic type or method `UnityEngine.Component.GetComponent<T>()'
```

このエラーはジェネリックメソッドを使わずに、GetComponent(Type)を呼び出すと回避出来ます。

```csharp
public class InterfaceTest : MonoBehaviour
{	
	void Start ()
	{
		var hoge = GetComponent(typeof(IHoge)) as IHoge;
		
		if (hoge != null) {
			hoge.Hoge();		
		}
	}	
}
```

気持ち的にはジェネリックを使いたいですが...
Remiリポジトリを使って最新版のphp等をyumでインストールする

root権限で作業する。

## 1. yumを最新にする

```bash
# yum install yum-fastestmirror
# yum upgrade
# yum update
```

## 2. リポジトリの取得と初期インストール済みパッケージのアップデート

GPGキーをインポートとリポジトリファイルを追加

```bash
# rpm –import http://rpms.famillecollet.com/RPM-GPG-KEY-remi
# cd /etc/yum.repos.d
# wget http://rpms.famillecollet.com/remi-enterprise.repo
```

## 3. remiの設定ファイルを編集する

```bash
# vim /etc/yum.repos.d/remi-enterprise.repo
```

```bash
[remi]
name=Les RPM de remi pour Enterprise Linux $releasever - $basearch
#baseurl=http://rpms.famillecollet.com/enterprise/$releasever/remi/$basearch/
mirrorlist=http://rpms.famillecollet.com/enterprise/$releasever/remi/mirror
enabled=0
gpgcheck=1
gpgkey=http://rpms.famillecollet.com/RPM-GPG-KEY-remi

[remi-php55]
name=Les RPM de remi de PHP 5.5 pour Enterprise Linux $releasever - $basearch
#baseurl=http://rpms.famillecollet.com/enterprise/$releasever/php55/$basearch/
mirrorlist=http://rpms.famillecollet.com/enterprise/$releasever/php55/mirror
# WARNING: If you enable this repository, you must also enable "remi"
enabled=0
gpgcheck=1
gpgkey=http://rpms.famillecollet.com/RPM-GPG-KEY-remi
```

remi-testは消しても良い。

enabledを1にすると、デフォルトのレポジトリがremiになるが、今回は0のままにしておく。

yumコマンドを実行するときに、レポジトリをremiに指定すれば良い。

```bash
# yum --enablerepo=remi update
```

Apacheのインストールはこうなる。

```bash
# yum -y --enablerepo=remi install php
```
.NET FrameworkでWindows Media Player Controlを利用するもう一つの方法

.NET Frameworkでサウンドを再生するときは、Windows Media Player Controlを利用すると、さまざまな形式のファイルを利用できて便利です。その方法は[DOBON.NETに解説があります](http://dobon.net/vb/dotnet/programing/playmidifile.html#wmp)。しかしこの方法を使うアプリケーションには、自動的に生成されるInterop.WMPLib.dllとAxInterop.WMPLib.dllの二つのCOM Interop DLLを同梱しなければなりません。

.NET Framework 4には、COM Interop DLLなしでCOMコンポーネントを利用可能にするEmbedded Interop Types (相互運用機能型の埋め込み)があります。しかし、Windows Media Player Controlはこの方法に必要な要件を満たしていないので、利用すると以下のようなエラーになってしまいます。

> アセンブリ 'Hoge\obj\Release\AxInterop.WMPLib.dll' に 'ImportedFromTypeLibAttribute' 属性または 'PrimaryInteropAssemblyAttribute' 属性が指定されていないため、このアセンブリから相互運用機能型を埋め込むことはできません
> アセンブリ 'Hoge\obj\Release\AxInterop.WMPLib.dll' に 'GuidAttribute' 属性が指定されていないため、このアセンブリから相互運用機能型を埋め込むことはできません

この問題を解決するには、.NET Framework 4のdynamic型を使ってCOMコンポーネントを利用すればよいです。具体的には以下のように記述します。

```java
private readonly dynamic _wmp = Activator.CreateInstance(Type.GetTypeFromProgID("WMPlayer.OCX.7"));

private void button1_Click(object sender, EventArgs e)
{
    _wmp.URL = soundFile;
    _wmp.controls.play();
}
```

これはDOBON.NETのWMPLib.WindowsMediaPlayerオブジェクトを使う例のオブジェクトの生成を、ActivatorによるCOMインスタンスの生成に置き換えたものです。音量の設定や各種イベントハンドラーの登録など、WindowsMediaPlayerオブジェクトとまったく同様に記述できます。この方法ではAxWMPLibとWMPLibの参照設定はいりません。
How to install RSpec 2.99 beta with Rails

詳しくはこちらなんですが…。
http://qiita.com/yujinakayama/items/a1d31b2caa35642e8e69

RSpec が 3 になるにあたって、2.99 を使ってテストした方がよさそうです。

RoR の場合は `Gemfile` に

```ruby
group :development, :test do
  gem `rspec`, '~> 2.99.0.beta1'
  gem 'rspec-rails'
```

と書くのではなく、

```ruby
group :development, :test do
  gem 'rspec-rails', '~> 2.99.0.beta1'
```

と書くという、それだけのハナシです。まだベータなんでアレですけど。
Google Driveの文書でダブルクォートなどが自動置換されるのを止める

Google Driveの文書ではダブルクォートやシングルクォートがスマートクォートへ自動置換されるようになっています。例えば"foo"が“foo”、'bar'が‘bar’になります。また、(c)を©にするなどの自動置換機能もあります。

これらは文書内にソースコードやコマンドを書くときには不便なので、設定でオフにしておきます。

設定手順

1. 文書を開いた状態で[ツール]/[設定...]メニューを開く
1. [スマート クォートを使用]と[自動置換]のチェックを外して[OK]ボタンを押す

新規に作成した文書でも設定が引き継がれるようです。
【PHPStorm】初期設定

##行番号表示
Settingsを開いてAppearanceを検索。Show line numbersにチェックを入れる。


## 独自の拡張子を認識させる。(ctpファイルを認識させる。)
Settingを開いてFile Typesを検索。

1. Recongized File Types から PHP filesを選択
* Registered Patternsのプラスボタンを押下して、パターンに「*.ctp」を追加

##右上のブラウザで表示するポップアップを消す
File > Settings... > Tools > Web Browsers

各ブラウザのチェックを外す
tmux起動時に「Unable to find any JVMs matching version "(null)”.」ってでる


MacのosをLionからMavericksにupgradeしたらtmuxの起動で「Unable to find any JVMs matching version "(null)”.」ってメッセージがでるようになった。

```
Unable to find any JVMs matching version "(null)".
No Java runtime present, try --request to install.
```

調べてみたらどうもMavericksからjavaのruntimeはデフォルトでは無くなったらしい。

ということでjavaのjdkをインストールします。

* まずはターミナルでコマンドうちます

```
% java --version
No Java runtime present, requesting install.
```
* ポップアップがでるので[詳しい情報…]をクリック![スクリーンショット 2014-01-06 12.34.03.png](https://qiita-image-store.s3.amazonaws.com/0/6129/c11351ad-6fa7-282e-1638-5a928a8b271e.png "スクリーンショット 2014-01-06 12.34.03.png")
* オラクルのjdkダウンロードページが開くので後は画面にしたがってダウンロードして、インストール

めでたくメッセージがでなくなりました。
flycheck + chruby

flycheck の checker executable を PATH や exec-path を Emacs (GUI モード) を操作して設定するのがめんどいときは flycheck-define-checker で上書きできる。参考: [flycheck で C/C++ のエラーチェック定義を追加する](http://qiita.com/akisute3@github/items/6fb94c30f92dae2a24ee)

```el
(flycheck-define-checker ruby
  "A Ruby syntax checker using the standard (MRI) Ruby interpreter.

See URL `http://www.ruby-lang.org/'."
  :command ("chruby-exec" "ruby" "--" "ruby" "-w" "-c" source)
  :error-patterns
  ;; These patterns support output from JRuby, too, to deal with RVM or Rbenv
  ((error line-start
          "SyntaxError in " (file-name) ":" line ": " (message)
          line-end)
   (warning line-start
            (file-name) ":" line ":" (optional column ":")
            " warning: " (message) line-end)
   (error line-start (file-name) ":" line ": " (message) line-end))
  :modes 'ruby-mode)

(add-hook 'ruby-mode-hook 'flycheck-mode)
```

* flycheck https://github.com/flycheck/flycheck
* 2.3.1 Syntax checker executables http://flycheck.github.io/Usage.html#Syntax-checker-executables
* 3.1 Definition of syntax checkers http://flycheck.github.io/Extending.html#Definition
* flycheck-define-checker (ruby) https://github.com/flycheck/flycheck/blob/0.15/flycheck.el#L4103-L4117
* chruby-exec (Run a command under a Ruby with chruby-exec:) https://github.com/postmodern/chruby/tree/v0.3.8#examples
発表スライドを作るときに便利な３つのツール

##はじめに
最近外部でのお話が多くなってきていて、プレゼン資料を作る機会が増えてきました。
最近でいえば[第14回yidev](http://atnd.org/events/45778)や[MOSA Software Meeting  2013](http://www.mosa.gr.jp/?p=13705&page=2#sakurai)でお話をさせていただきました。
それ以外でも自分の勉強会でお話をしてたりしていたので延べ回数でいえば２０回以上は勉強会でのプレゼンをしていたりします。

そんな中で最近自分の中でスライドを作るときに便利だなー、と思えるツールが３つありますので参考になればと思い投稿してみました。

##発表スライドを作るときに便利な３つのツール
###１．マインドマップ

ストーリーの流れを作るのには最適です。
最初の頃はとりあえずスライドから書き始めてしまっていたりしますが、けっこう困ることも多かったです。

* 話が迷走したりする
* 前後の文脈が崩れたりする
* 最後に全体を俯瞰して通しで見た時に違和感が出たりする

ある時からマインドマップを最初に書くようにしてみたらこんな効果がありました。

* 話の大筋からブレークダウンしていける
* ストーリーの一貫性を保ちやすい
* 俯瞰的に見て、話の前後を簡単に入れ替えたりできる

実際こんな感じで作ってるかですが、そんなに複雑なマインドマップを作っているわけでもないです。
例えばこの記事の場合はこんな感じで作ってから書き始めたりしています。

![マインドマップ](https://qiita-image-store.s3.amazonaws.com/0/34824/074f032e-8b89-a453-e827-2630832552d0.png)

マインドマップツールは色々ありますが、私は [FreeMind](http://sourceforge.jp/projects/freemind/) を使っています。
フリーツールですし、Javaで作られているのでMac/Windows/Linuxでも使えて便利です。

###２．Frickr
有名なフォトサービスなので特に説明は必要ないでしょう。
最近はベタ書きスライドから画像メインでお話側でカバーできるようなビジュアルプレゼンが作れるように修行しようとしているので、使えそうな画像をサクッと探したいニーズが増えてきました。

Frickr のいいところは Creative Commons なライセンスな写真が多いことです。
発表スライドでは名前開示、変更無し、非商用として作ることが多いので、用途的に使えることが多くとても便利です。

ただ問題点もあって、特にWebのFrickrは __探しづらい__ という問題があります。（私だけかもしれませんが・・・）
そこで私の場合は[FlickStackrXP](https://itunes.apple.com/jp/app/flickstackr-explore/id390094427?mt=8&uo=4&at=1l3v5rp)を使っています。
![FlickStackrXP](https://qiita-image-store.s3.amazonaws.com/0/34824/3d87b6ad-72e4-1dd5-bf84-3d584551a858.png)

FlickStackrXP は Frickr 上の写真を簡単に探せるアプリで以下の特徴があります。

* アプリは無料・アカウント不要
* Creative Commons に絞って探せる
* ダブルタップアクションでスタックに保存
* スタックに保存した写真を選択してメールで送信

スタックというのはお気に入りフォルダのようなもので、キーワードで探してぽいぽい写真を登録した後に使いたい写真を最後にメールで一括してPCに送信することで今までの面倒だった手間がだいぶ削減できました。
細かいことを言えば Credit を資料に載せるために、メール本文に著作権者の名前まで入れてくれたら完璧だった・・・

###３．bitbucket

[bitbucket](https://bitbucket.org/)はリポジトリサービスの１つです。
発表スライドをバージョン管理するためによく利用しています。
少ない人数のプロジェクトならプライベートリポジトリが無料で作ることができるので、こういう発表資料のリポジトリを作るのに向いています。
リポジトリは Git,  Mercurial のどちらかで選ぶことができます。

##おわりに
最近色々なうまい人のプレゼンを見ていると、共通しているのが話のメリハリが良いことが共通してあるなと感じています。特に笑えるポイントを上手く取り入れているなと思います。
なので最近プレゼン資料を作るときには __必ず笑いを１箇所入れること__ を目標に作っています。

勉強会に興味がある方は、こんなのも主催していたりするので是非ご参加くださいませ！

* [iPhone Developer Workshop](http://workshop.iphonework.biz/)
* [もくもくiOS勉強会 @ Retty](https://www.facebook.com/groups/225109317669648/)
kibanaによるログ可視化対策と実践編


fleuntdを活用したいと決意し、しばらく放置していたのですが、
kibanaというログ可視化ツールと連携するとおもしろいことができる
というのを知り、ちょこっと調査してみました。

どうやら、fluentd、kibana、elasticsearchを使えば、
apacheのログをかっこ良く表示できるようです。


もろもろさくっと社内システムに導入できたので、キャプチャとってみました！
下記画像は、apacheのアクセスログです。(x:時間 y:アクセス数)
![kibanaのサンプル](http://i.imgur.com/A0fans1.png "kibanaのサンプル")

かっこ良くていいですね！
でも、これだけだと、活用しがいがないので、検索してみましょう。
検索ボックスに「code:200」、「code:304」と打ち込んでいくと、
こんなかんじのグラフになりました。
![ステータスコードで検索](http://i.imgur.com/NZ1Xcwt.png "ステータスコードで検索")

 
ステータスコード別にグラフが表示できるのがわかりましたね！
では、正常系のコードを非表示にするとどうなるでしょうか。
![エラーコードで検索](http://i.imgur.com/wDIrzeW.png "エラーコードで検索")


おや？どうやら、404エラーがたびたび出ているようです。
ログの中身を見てみると、存在しないjsが呼び出されていました。
![pathを確認](http://i.imgur.com/uzPHvK5.png "pathを確認")

ここまでkibanaで確認できれば、あとはソースコードをgrepし、
修正できますね！

という流れで、kibanaの実践方法をさらっと説明してみましたが、いかがでしたでしょうか？
使ってみたくなったという方は、下記URLからオフィシャルサイトを見ていただければと思います！

Kibana | Overview | Elasticsearch http://www.elasticsearch.org/overview/kibana/
Kibana 3 http://demo.kibana.org/

では、良い一年を。
[Ruby] 便利な組み込みクラスのメソッド達（Array編）


## 概要

[パーフェクトRuby](http://www.amazon.co.jp/gp/product/4774158798/ref=as_li_qf_sp_asin_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4774158798&linkCode=as2&tag=kidachi-22)を読んでいて便利だと思ったもの一覧です。

Enumerable編
http://qiita.com/kidachi_/items/a00558cfb0a6a3e23f4b
Hash編
http://qiita.com/kidachi_/items/651b5b5580be40ad047e
String編
http://qiita.com/kidachi_/items/7b355eb355b2d1390cf5

## 配列の整形

### compact

配列からnilを除去。

```ruby
> [false, nil, 0, '', []].compact
=> [false, 0, "", []]
```

### uniq

配列から重複要素を排除。

```ruby
> %w(Ruby Python Java Ruby Python Java).uniq
=> ["Ruby", "Python", "Java"]
```

### flatten

多次元配列を一次元にして返却。

```ruby
> arr = ["Ruby", ["Python", ["Java", "C"]]]
> arr.flatten
=> ["Ruby", "Python", "Java", "C"]
```

### transpose

二次元配列を行列と見立てて、行と列の入れ替えを行う。

```ruby
> arr = [[1, 2, 3], ["Ruby", "Python", "Java"]]
> arr.transpose
=> [[1, "Ruby"], [2, "Python"], [3, "Java"]]
```

### zip

二つの配列を行と列を入れ替えた上で結合する。

```ruby
> arr1 = [1, 2, 3]
> arr2 = ["Ruby", "Python", "Java"]
> arr1.zip(arr2)
=> [[1, "Ruby"], [2, "Python"], [3, "Java"]]
```

## 要素の連結

### join

要素を連結する。
引数に文字列を与えた場合は、それをセパレータとして連結する。

```ruby
> %w(Ruby Python Java).join
=> "RubyPythonJava"
> %w(Ruby Python Java).join(', ')
=> "Ruby, Python, Java"
```

## 要素の取得

### sample

与えた引数だけ、ランダムに要素を取り出す。

```ruby
> arr = %w(Ruby Python Java C Smalltalk Brainfuck)
=> ["Ruby", "Python", "Java", "C", "Smalltalk", "Brainfuck"]
> arr.sample
=> "Python"
> arr.sample
=> "Brainfuck"
> arr.sample
=> "C"
> arr.sample(2)
=> ["Ruby", "Smalltalk"]
> arr.sample(2)
=> ["Smalltalk", "C"]
```

### assoc

多次元配列から、キーを指定して要素を取り出す。

```ruby
> arr = [[:ruby, 1], [:python, 2], [:java, 3]]
=> [[:ruby, 1], [:python, 2], [:java, 3]]
> arr.assoc(:ruby)
=> [:ruby, 1]
```

## 要素の追加と削除

### pop, push, shift, unshift


```ruby
> arr = ["Ruby", "Python", "Java"]
=> ["Ruby", "Python", "Java"]
# 末尾の要素を取り出す
> arr.pop
=> "Java"
# 破壊的
> arr
=> ["Ruby", "Python"]
# 末尾に要素を追加する
> arr.push("Java")
=> ["Ruby", "Python", "Java"]
# 破壊的
> arr
=> ["Ruby", "Python", "Java"]

# 先頭の要素を取り出す
> arr.shift
=> "Ruby"
# 破壊的
> arr
=> ["Python", "Java"]
# 先頭に要素を追加する
> arr.unshift("Ruby")
=> ["Ruby", "Python", "Java"]
# 破壊的
> arr
=> ["Ruby", "Python", "Java"]

```

※ スタック（FirstIn, LastOut/先入れ後出し）は
pop/pushもしくはshift/unshift

※ キュー（FirstIn, FirstOut/先入れ先出し）は
pop/unshiftもしくはpush/shift
[Ruby] 便利な組み込みクラスのメソッド達（String編）



## 概要

[パーフェクトRuby](http://www.amazon.co.jp/gp/product/4774158798/ref=as_li_qf_sp_asin_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4774158798&linkCode=as2&tag=kidachi-22)を読んでいて便利だと思ったもの一覧です。

Enumerable編
http://qiita.com/kidachi_/items/a00558cfb0a6a3e23f4b
Array編
http://qiita.com/kidachi_/items/e9cb26c4e6cb36b70a1c
Hash編
http://qiita.com/kidachi_/items/651b5b5580be40ad047e

## 文字列の整形

### strip

余分な空白を削除。

```ruby
> "  Ruby \n\t ".strip
=> "Ruby"
```

### squeeze

重複文字列の削除

```ruby
> 'Ruuuubbbbyyyyy'.squeeze
=> "Ruby"

# 選択した文字のみ重複削除
> 'Ruuuubbbbyyyyy'.squeeze('ub')
=> "Rubyyyyy"
```

### sub

あるパターンに最初にマッチした文字列を置換。

```ruby
> 'Ruby is practical programming language!'.sub(/p.*?\s/, 'awesome ')
=> "Ruby is awesome programming language!"
```

### gsub

マッチした文字列すべてを置換。

```ruby
> 'Ruby is practical programming language!'.gsub(/p.*?\s/, 'awesome ')
=> "Ruby is awesome awesome language!"

# マッチした文字列はブロックに与えて操作することも出来る。
> 'Ruby is practical programming language!'.gsub(/p.*?\s/){|str| str.upcase}
=> "Ruby is PRACTICAL PROGRAMMING language!"

# マッチした文字列情報を$&で取得。
> 'Ruby is practical programming language!'.gsub(/p.*?\s/){ $&.to_s.upcase}
=> "Ruby is PRACTICAL PROGRAMMING language!"

```

### split

特定の文字列をセパレータに指定して分割した要素を、配列として返却。

```ruby
> str = 'Ruby, Python, Java'
> str.split(', ')
=> ["Ruby", "Python", "Java"]

# 正規表現も可
> str.split(/,\s/)
=> ["Ruby", "Python", "Java"]

# 第2引数を与えると、その数以上は分割しない。
> str.split(/,\s/, 2)
=> ["Ruby", "Python, Java"]
```
## 部分文字列の取得

### slice

部分文字列の取得。

```ruby
# 始点から終点を指定
> 'Ruby is my 1st language!'.slice(0..3)
=> "Ruby"

# 正規表現での指定も可能
> 'Ruby is my 1st language!'.slice(/[0-9]+/)
=> "1"
```

## 繰り返し処理

### each_char

文字ごとの繰り返し

```ruby
> 'Ruby'.each_char {|c| str << "#{c}!"}
> p str
"R!u!b!y!"
```

### each_line

行ごとの繰り返し

```ruby
> "Ruby\nis\ngood\nlanguage!".each_line { |line| puts line }
Ruby
is
good
language!
```

### each_byte

バイトごとの繰り返し

```ruby
> 'Ruby'.each_byte { |b| puts b}
82
117
98
121
```
ruby から gcm を使って android 端末へメッセージを送信する

テスト用のスクリプトです。頻繁にこういうかき捨てのコードを書くのでメモしておきます。

# 準備

簡単のため、https://github.com/spacialdb/gcm を利用。（基本的にはここの readme のままです。）
まずは gem をインストールしておく。

```
gem install gcm
```

先に Google API Console にアクセスし、「Google Cloud Messaging for Android」を有効にしておく必要がある。メッセージを送信するためには、さらに「認証情報」から Server Key を発行する。Project Number と Server Key が一致しないとメッセージが送信できない。

# 実装

以下のコードを gcm_test.rb として作成する。

```ruby:gcm_test.rb
#-*- coding:utf-8 -*-
require 'gcm'
require 'pp'
# Google API Console で発行する API KEY を指定する
API_KEY="fugafuga"
gcm = GCM.new(API_KEY)

# 複数の registration id を指定できる
registration_ids = [ 'testtest' ]

# :data の内容が extras に格納される
option = { :data => {'message' => 'Hello Gcm!'} }
response = gcm.send_notification(registration_ids, option)

pp response

if response[:body]
  pp JSON.parse(response[:body])
end
```

# 実行

実行すると、以下のように json が帰る。この出力は Google Cloud Messaging のサーバが返しているレスポンスである。 success:1 と書いてあるが、送信しようとしたIDが無効だった場合など、failure:0 の部分が変化する。

```
$ ruby gcm_test.rb
{:response=>"success",
 :body=>
  "{\"multicast_id\":11111111111111111111,\"success\":1,\"failure\":0,\"canonical_ids\":0,\"results\":[{\"message_id\":\"0:111111111111111111111111111111111\"}]}",
 :headers=>
  {"content-type"=>["application/json; charset=UTF-8"], "date"=>["Mon, 06 Jan 2014 00:31:24 GMT"], "expires"=>["Mon, 06 Jan 2014 00:31:24 GMT"], "cache-control"=>["private, max-age=0"], "x-content-type-options"=>["nosniff"], "x-frame-options"=>["SAMEORIGIN"], "x-xss-protection"=>["1; mode=block"], "server"=>["GSE"], "alternate-protocol"=>["443:quic"], "connection"=>["close"]},
 :status_code=>200}
{"multicast_id"=>1111111111111111111,
 "success"=>1,
 "failure"=>0,
 "canonical_ids"=>0,
 "results"=>[{"message_id"=>"0:1111111111111111111111"}]}
```

Android の端末側では、以下のようにメッセージが受け取れる。

```
01-06 08:31:36.846: D/GcmShow(20042): String = null
01-06 08:31:36.846: D/GcmShow(20042): Uri = null
01-06 08:31:36.846: D/GcmShow(20042): IntentType = null
01-06 08:31:36.846: D/GcmShow(20042): IntentAction = com.google.android.c2dm.intent.RECEIVE
01-06 08:31:36.846: D/GcmShow(20042): Extra[message] = Hello Gcm!
01-06 08:31:36.846: D/GcmShow(20042): Extra[from] = 785728092392
01-06 08:31:36.846: D/GcmShow(20042): Extra[collapse_key] = do_not_collapse
```

なお、Intent のダンプにはいい方法が思いつかなかったのでこんなベタな方法を利用している。

```Java:Util.java
	public static void logIntent(String tag, Intent arg0){
		Log.d(tag, "String = " + arg0.getDataString());
		Log.d(tag, "Uri = " + arg0.getData());
		Log.d(tag, "IntentType = " + arg0.getType());
		Log.d(tag, "IntentAction = " + arg0.getAction());
		for(String key : arg0.getExtras().keySet()){
			Log.d(tag, "Extra[" + key + "] = " + arg0.getExtras().getString(key));
		}		
	}
```
リモートのPostgreSQLのDBをダンプして取得する


とりあえず以下のようなシェルスクリプトを用意してみたんですがどのようにやるのがいいんですかね。

```bash:dump-and-fetch-database.sh
#!/bin/sh

ssh_username=yourname
ssh_host=yourhostname
time_id=$(date "+%Y%m%d%H%M%S")
database=yourdatabasename
filename=dump_$time_id.pgsql-custom
filepath=/var/tmp/$filename

ssh -t $ssh_username@$ssh_host "sudo -u postgres pg_dump --format=custom $database > $filepath"
scp $ssh_username@$ssh_host:$filepath ./
ssh -t $ssh_username@$ssh_host "rm $filepath"
echo fetch done: $filename
```
ユーザーからのページ表示時に、キャッシュから読ませたくないスクリプトの読み込ませ方（小ネタ）

no-cache書けばいいんですけど、それが出来ない時とかに。常識かもしれませんが。

##ふつう

```php:cache.php
echo<<<HTML
  ....
  <script src="hoge.js"></script>
  </head>
  <body>
     ......
  </body>
HTML
;
```

これではhoge.jsがキャッシュされてしまい、ページを再読み込みしてもキャッシュから読み込まれてしまう。

##キャッシュから読ませない

```php:nocache.php
$time = time();
echo<<<HTML
  ....
  <script src="hoge.js?t={$time}"></script>
  </head>
  <body>
     ......
  </body>
HTML
;
```

これでよし。
クリップボードのテキストを取り出して、VBScriptで扱う

#概要
VBScriptを使って、クリップボードからテキストを取り出したいという話。

結論としては、Clipboard.GetText メソッド (System.Windows.Forms)でクリップボードからテキストを取り出して標準出力に出し、VBScriptでそれを受けるという方法でできたようだ。

- [Clipboard.GetText メソッド (System.Windows.Forms) - ＠MSDN][0]
- [maruton's memorandum: ［Script］［VBS］コマンド実行（WSHShell.Exec）][0.1]

## 2017.08.21 追記
vbs + C#と違い、コンソールが一瞬表示されてしまうデメリットはありますが、vbs単独版(内部でpowershell利用)をつくりました。

```vbnet
Set exec = CreateObject("WScript.Shell").Exec("powershell.exe -sta  -Command Add-Type -Assembly System.Windows.Forms; [System.Windows.Forms.Clipboard]::GetText()")
exec.StdIn.Close
WScript.Echo exec.StdOut.ReadAll
```

### 参考
- [PowerShellをはじめよう　～PowerShell入門～_ PowerShellからクリップボードを扱う](https://letspowershell.blogspot.jp/2016/03/powershell_12.html)

- [PowerShellのワンライナをWScript.ShellのExec()すると、終了待ちが解けない。_ Windows Script Programming](http://scripting.cocolog-nifty.com/blog/2010/07/powershellwscri.html)

- [VBS(WSH)で標準出力取得 – 伊藤清徳の垂直落下式ムーンサルトプレス](http://agilmente.com/blog/2009/10/31/vbs_whs_get_stdout/)


#他
[Hey, Scripting Guy! クリップボードから URL を取得し、その Web サイトをブラウザで開く方法はありますか][1]に、Internet Explorer(COM)経由でクリップボードからテキストを取得する方法が記載されている。

この方法だと、クリップボードからテキストを取り出す程度のために毎回IEが起動するので重いし、
↓のポップアップが出てしまうので若干おいしくない。

![クリップボード01.png](https://qiita-image-store.s3.amazonaws.com/0/34777/9bab877d-b396-53c5-d14e-f9d2272b9653.png)


# クリップボード→標準出力
コンソールアプリケーションで以下のコードをビルドする。
今回は、ConsoleApplication1.exeというファイルができるようにビルドした。

[コンソールアプリでのクリップボードの使用について - 質問・相談ならMSN相談箱][2]に書かれているとおり、\[STAThreadAttribute\]をMain関数の前に入れないと動かないようだ。


```C#:Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms; //参照設定にも追加

namespace ConsoleApplication1
{
    class Program
    {
        [STAThreadAttribute]//←デフォルトでは追加されないので注意
        static void Main(string[] args)
        {
            string str = Clipboard.GetText();
            Console.WriteLine(str);
        }
    }
}
```


# 標準出力からの取り出し
ConsoleApplication1.exeと同じフォルダ(パスが通ったフォルダ)に以下のスクリプト(test.vbs)
を作成した。

```VBScript:test.vbs
Dim wsh
Set wsh = CreateObject("WScript.Shell")

Dim exec
Set exec = wsh.Exec("ConsoleApplication1.exe")

str = exec.StdOut.ReadAll

WScript.Echo str
```

#結果
test.vbsの内容をコピーして、test.vbsをダブルクリックすると、以下のポップアップが表示され、
クリップボードのテキストを取得できていることが確認できた。

![クリップボード02.png](https://qiita-image-store.s3.amazonaws.com/0/34777/b9326e78-f531-4f65-86ed-d55b4f833f86.png)


#備考
コピーしたものよりも改行が多い気がする（Console.WriteLine等の影響だと思う）が、とりあえずそのままにする。

[0]:http://msdn.microsoft.com/ja-jp/library/system.windows.forms.clipboard.gettext(v=vs.110).aspx
[0.1]:http://maruton-memorandum.blogspot.jp/2012/11/scriptvbswshshellexec.html
[1]:http://gallery.technet.microsoft.com/scriptcenter/c56466b1-73d9-4346-a3a6-3d6c5a1d81c4
[2]:http://questionbox.jp.msn.com/qa5744059.html
Sublime Textを "subl" で起動する（Windows PowerShell編）

Sublime Text 2/3を利用するとき、コマンドラインから利用する機会もある。[OS Xや Linuxでは「subl」というエイリアスをつくって実行できる](http://www.sublimetext.com/docs/2/osx_command_line.html)が、Windowsでは少し手順が複雑なのでまとめておきます。

# PowerShellの権限を変更する

最初に、PowerShellのセキュリティ権限を変更します。最初は、「Restricted」に設定されていますが、このままではこのあと作成する「.ps1」というファイルが実行できないため。

スタートメニューなどから PowerShellのアイコンを右クリックして「管理者として実行」を選びます。そして、次のコマンドを打ち込みます。

```
$ Set-ExecutionPolicy RemoteSigned
```

# .ps1を作る

次に、エディタを使って次の内容を書き込みます。Sublime Textのインストール場所は、環境に合わせてください。

```
Set-Alias subl "C:\Program Files\Sublime Text 3\sublime_text.exe"
```

これを、以下の場所に保存します。

> C:\Users\(UserName)\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1

# PowerShellを再起動

こうして、PowerShellを再起動（今度は一般権限で大丈夫です）すれば、「subl」コマンドが利用できるようになっています。作られたエイリアスを確認するには、次のコマンドを使います。

```
$ alias
```
php5.4からshort_open_tagがデフォルトでONになった

php5.4からshort_open_tagがやっとデフォルトでONになるとのこと。
short_open_tagオプションは、phpタグの短縮型<?= ***; ?>を使用可能にするかどうかのオプション。
5.3以下だとこのオプションがデフォルトでOFFなので<?php= ** ?>でないといけない。
rubyのerbとかにいったん慣れ親しむと、できるだけ、VIEWはシンプルに書くべしと、思うもの。いちいち、煩雑なphpタグを入れたくなんか無い。
そもそもASPやxmlのレンダリングを考慮してこういうオプションがあるんだと思うのだが、当初から僕はいちいち面倒と思っていたので、こういうのは、大いに歓迎。

http://www.php.net/manual/ja/ini.core.php#ini.short-open-tag
Android-Query(AQuery)を使って画像を操る(基本編)

色々出来る汎用的なAndroid用ライブラリ、Android-Queryを使ってWeb上の画像を読み込むコード色々。以下も参考にしてみてね。

* [公式サイト(サンプル)](http://code.google.com/p/android-query/wiki/ImageLoading)
* [Android用デモアプリ](https://play.google.com/store/apps/details?id=com.androidquery&hl=ja)

以下、特に説明がなければ使用する変数、ビューの名称は以下の通り

* $:AQueryオブジェクト
* url:読み込みたい画像を示すURLオブジェクト
* thumbnailUrl:サムネイル画像を示すURLオブジェクト
* R.id.image:ImageView
* R.id.progress:ProgressBar
* R.drawable.ic_unknown_image:なんらかのPNGイメージ


# まずは普通に画像を読み込む

```java:基本形
  $.id(R.id.image).image(url.toString());
```

```java:読み込み中を示すプログレスを表示する
  $.id(R.id.image).progress(R.id.progress).image(url.toString());
```
なお、プログレスバーはVisibility.HIDDENではなくVisibility.GONEで非表示になるようです。周辺のビューレイアウトには気をつけておいてください。

```java:読み込む画像を縮小表示する
  $.id(R.id.image).image(url.toString(), false, false, 200, 0);
```
読み込みたい画像ファイルが大きすぎて、ログに「Bitmap too large to be uploaded into a texture (2560x1920, max=2048x2048)」というような文字列が出てきたときは、これで対処出来ます。

# サムネイルなど代替画像を先行表示する

```java:サムネイル用の画像を先行表示する
  Bitmap thumbnail = $.getCachedImage(thumbnailUrl.toString());
  $.id(R.id.image).image(url.toString(), false, false, 0, 0, thumbnail, 0);
```
なお、以降のimage()メソッド共通で、第2，3引数は次のような効果を持ちます

* 第二引数：メモリキャッシュを行うかどうか
* 第三引数：ファイルキャッシュを行うかどうか

画像の扱いや使用頻度によって適切な値を選択するとよさげです(実効性は不明)。

```java:画像がなかったり読み込み失敗したときに表示する画像を指定する
  Bitmap placeholder = $.getCachedImage(R.drawable.ic_unknown_image);
  $.id(R.id.image).image(
    url.toString(), false, false, 0, R.drawable.ic_unknown_image, placeholder, 0, 0.75f);
```
画像が画面に表示されてから少したって読み込みを開始、順次URLの画像に置き換える(読み込み完了まではR.drawable.ic_unknown_imageが表示される)。
主にリストビュー上に画像を配置するときなどに有効(リストビューでの実行例も見たい人は、デモアプリのImage Loading>List Items のあたりを読むと良さそうです)。

# WebViewを使う
ImageViewでなくWebViewを使うことでこういうこともできます。

```java:画像をピンチズームできるようにする
  $.id(R.id.image).webImage(url.toString(), true, true, Color.WHITE);
```

このコードのR.id.imageは、ImageViewではなくWebViewです(ImageViewだと処理がスキップされます)。

なお、progress()メソッドによる読み込みプログレスの表示は併用できますが、ImageViewではないのでサムネイル画像や読み込み失敗画像の処理との併用は出来ません。場所によって使い分けが必要そう。

#ダウンロードする

```java:ダウンロードする
  File file = /* ファイルを保存するファイルパスを示すFileオブジェクト */
  $.download(
      url.toString(),
      file,
      new AjaxCallback<File>() {

        @Override
        public void callback(String url, File file,
            AjaxStatus status) {
          if (file != null) {
            /* 読み込み成功時の処理 */
          } else {
            /* 読み込み失敗時の処理 */
          }
        }
      });
```

なお、ファイルを共有に回したい場合、もっとおあつらえ向きっぽいmakeSharedFile()というメソッドもありますが、扱いが悪いせいか自環境では必ずnullを返しますので上手く使えませんでした。また[前にも書いたとおり](http://qiita.com/TakamiChie/items/f998b11f34157a387abf)Seesmicなど一部のアプリはfileスキームのURLを読み込んでくれないので、download()メソッドでファイルを保存してから処理するのがよさげです。

なお、「基本編」としていますが、そのあとを書く予定はありません。あしからず。
Cからmrubyのクラスメソッドを呼び出す方法

[Big Sky :: mruby でmrbgemsから別のmrbgemsのクラスを参照して継承する](http://mattn.kaoriya.net/software/lang/ruby/20130129103808.htm)

上記サイトを参考にしながら、Cからmrubyのクラスメソッドを呼び出す方法をメモ

```c:test.c
#include "mruby.h"
#include "mruby/string.h"
#include "mruby/dump.h"

static void
p(mrb_state *mrb, mrb_value obj)
{
  obj = mrb_funcall(mrb, obj, "inspect", 0);
  fwrite(RSTRING_PTR(obj), RSTRING_LEN(obj), 1, stdout);
  putc('\n', stdout);
}

int main()
{
  mrb_state* mrb;
  mrb_value val, val2;
  struct RClass *c_time;

  mrb = mrb_open();

  val = mrb_funcall(mrb, mrb_obj_value(mrb_module_get(mrb, "Time")), "gm", 7,
      mrb_fixnum_value(1970), // year
      mrb_fixnum_value(1),    // month
      mrb_fixnum_value(1),    // day
      mrb_fixnum_value(3),    // hour
      mrb_fixnum_value(4),    // min
      mrb_fixnum_value(5),    // sec
      mrb_fixnum_value(6)     // usec
      );

  p (mrb, val);

  val2 = mrb_funcall(mrb, val, "usec", 0);

  p (mrb, val2);

  mrb_close(mrb);

  return 0;
}
```