OmniAICreator/Qiita-1.07M huggingface dataset:
ucsによる環境が違うBIG-IPにコンフィグをロードさせる方法

<h2>始めに</h2>
・ucs展開前に別環境のBIG-IPのVersionを同じにしておく必要がある
・ucsに含まれているライセンスで筐体のライセンスを上書きしないようコマンドにてucsをロードする必要がある
・移し元のucsファイルを取得しておく、下記にその例を書いておきます

```
[root@BIG-IP移し元:Active:Standalone] ~ # tmsh
root@(BIG-IP移し元)(cfg-sync Standalone)(Active)(/Common)(tmos)# save sys ucs /var/tmp/hogehoge.ucs
Saving active configuration...
/var/tmp/hogehoge.ucs is saved.

```
保存した"hogehoge.ucs"をFTPとかでローカルPCとかに取得しておく



<h2>設定手順</h2>

１．移し先へucsのアップロード
GUIかFTP等を用いてucsをアップロードする
　-GUIの場合
　　GUI > System >  Archives > Uploadよりアップロード

　-SFTP等を利用する場合
　　/var/local/ucs/配下にucsをアップロードする

２．移し先のライセンスのバックアップ

```
[root@BIG-IP移し先:Active:Standalone] ~ # cp /config/bigip.license /var/tmp/

```

３．ucsのロード
※ライセンスの上書きを防ぐため、以下のコマンドにてucsを展開する事。これ重要です。

```
[root@BIG-IP移し先:Active:Standalone] ~ # tmsh
root@(BIG-IP移し先)(cfg-sync Standalone)(Active)(/Common)(tmos)# load sys ucs hogehoge.ucs no-license
Replace all configuration on the system? (y/n) y
Processing UCS file: /var/local/ucs/hogehoge.ucs

Installing full UCS (11.5.1) data, excluding license file.
Saving active configuration...
The hostname is set to BIG-IP.jp
Extracting manifest: /var/local/ucs/hogehoge.ucs
Product : BIG-IP
Platform: D110
Version : 11.5.1
Edition : UCS   : Hotfix HF4
          System: Hotfix HF5
Hostname: BIG-IP.jp
Installing --full-- configuration on host BIG-IP.jp 
Installing configuration...
Post-processing...
Reloading License and configuration - this may take a few minutes...
Full configuration has been loaded successfully.

```
となれば、終了！
以上っす(｀･ω･´)ゞ

参照先URL
[Backing up and restoring BIG-IP configuration files](https://support.f5.com/kb/en-us/solutions/public/13000/100/sol13132.html)
気を付けよう!! Ajax通信中の画面再描画

今回は、jQuery（v1.10）を使ったAjaxについて、先日ちょっとはまったので共有です。

#はまったこと
先日、jQueryのAjaxを使って以下のような感じで、サーバから情報を適時取得するようなコードを書いていたのですが、

```js

$.ajax({
	url : '/get_data.json',
	type : 'POST',
	dataType : 'json',

	data : {
		'hoge' : hoge_id,
	},

	success : function(data) {
		//data表示処理
	},

	error : function(request, status, err) {
		alert('ERROR!!' + ' [' + request.status +']');
	}
});
```

なぜか、とあるタイミングでF5をすると

**ERROR!![0]**

というエラーダイアログが表示されることに気付いてしまいました。。

エラーステータスが0なので、ちょっと戸惑いましたが
色々とググったところ、Ajax通信中にF5で画面再描画をすると通信が切断されて、このような現象が発生するようです。
error : functionでalertを表示しなければいいのですが、通常（再描画時以外）のエラー時にはエラーダイアログを表示したいです。
でも、再描画時には表示したくない、という訳で悩んでしまいました。

#解決策
以下を追加してあげると、ページの再描画時にAjaxの通信がアボートするようになり、
エラーダイアログが表示されなくなります。

```
$(document).bind("ajaxSend", function(c, xhr) {
    $(window).bind( 'beforeunload', function() {
        xhr.abort();
    })
});
```	

#コメント
ググったらすぐに分かったのですが、ググらないと中々気づきずらい現象ですね。
しかもメッセージが不親切で、テストでもカバーするのは難しいです。
Ajaxを使うときには必然と回避策のコードを書いたほうが安全かもしれませんね。
vim: PHP PSR-2 チェック


- [PSR-2](http://www.php-fig.org/psr/psr-2/)

# neobundle でsyntasticをバンドルする

- [neobundle](https://github.com/Shougo/neobundle.vim)
- [syntastic](https://github.com/scrooloose/syntastic)


~~~
$ vi ~/bin/home/.vimrc.neobundle 


NeoBundle 'scrooloose/syntastic'
~~~

~~~
$ grep neo ~/.vimrc 
source ~/bin/home/.vimrc.neobundle
~~~

## バンドル

~~~
$ vim

Not installed bundles:  ['syntastic']
Install bundles now?
(y)es, [N]o: y

[neobundle/install] Update started: (2014/11/12 10:30:52)
(1/1) [====================] syntastic
[neobundle/install] (1/1): |syntastic| Updated
[neobundle/install] |syntastic|  -> de5e025ef0b8a9eec588d618ebaebd104945af4c
[neobundle/install] Installed/Updated bundles:
syntastic
[neobundle/install] Update done: (2014/11/12 10:31:02)
続けるにはENTERを押すかコマンドを入力してください
~~~

# PHP_CodeSniffer 設定

- [Vim の Syntastic で PSR-2 コーディング規約でチェックするお話](http://yuzuemon.hatenablog.com/entry/2014/08/13/135412)。

## PEARでインストール

~~~
$ sudo pear install PHP_CodeSniffer
Unknown remote channel: pear.phpunit.de
Did not download optional dependencies: channel://pear.phpunit.de/PHP_Timer, use --alldeps to download automatically
pear/PHP_CodeSniffer can optionally use package "channel://pear.phpunit.de/PHP_Timer"
downloading PHP_CodeSniffer-1.5.5.tgz ...
Starting to download PHP_CodeSniffer-1.5.5.tgz (412,025 bytes)
.........................................done: 412,025 bytes
install ok: channel://pear.php.net/PHP_CodeSniffer-1.5.5
~~~

~~~
$ phpcs --version
PHP_CodeSniffer version 1.5.5 (stable) by Squiz (http://www.squiz.net)
~~~

~~~
$ phpcs -i 
The installed coding standards are MySource, PEAR, Squiz, PHPCS, PSR2, Zend and PSR1
~~~

## .vimrc

~~~

$ vim ~/.vimrc

" -- for PHP syntastic  -----------------------
let g:syntastic_mode_map = {
  \ 'mode': 'active',
  \ 'active_filetypes': ['php']
  \}
let g:syntastic_auto_loc_list = 1
let g:syntastic_php_checkers = ['phpcs']
let g:syntastic_php_phpcs_args='--standard=psr2'
~~~
[Python] Read From Stdin

If you want to read a line from the stdin. Use this:

```py
raw_input()
#or
sys.stdin.readline()
```

If the value is a integer, float or something else, you should cast the input to the type that you want.

```py
a = int(raw_input())
b = float(raw_input())
```

if the line have some integers splitted by space such as this:

```
12 25 37
```
Then you can do this:

```py
(a, b, c) = map(int, raw_input().split())
```
Python で Project Euler #7「10001番目の素数」

[Problem 7 「10001番目の素数」](http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%207)

> 素数を小さい方から6つ並べると 2, 3, 5, 7, 11, 13 であり, 6番目の素数は 13 である.
> 10001 番目の素数を求めよ.

```py:Python
n = 10001

def generate_primes(n):
  primes = [2]
  i = 3
  while len(primes) < n:
    for p in primes:
      if i % p == 0:
        break;
    else:
      primes += [i]
    i += 2
  return primes

primes = generate_primes(n)
result = primes[-1]

print result
print result == 104743
print len(primes)
```

```:結果
104743
True
10001
```
AngularJS公式にあるサンプルコードが動かない

AngularJS公式サイトにあるInterceptorsの下記サンプルコードコピペして利用するとエラーが発生！

```js:interceptors
// alternatively, register the interceptor via an anonymous factory
$httpProvider.interceptors.push(function($q, dependency1, dependency2) {
  return {
   'request': function(config) {
       // same as above
    },

    'response': function(response) {
       // same as above
    }
  };
});
```

ググって辿りつき同じように困っている人を[StackOverFlow](http://stackoverflow.com/questions/23665246/uncaught-error-injectorunpr-unknown-provider-dependency1provider-depend)で発見、
そこでの回答は、

__This is the damned code I copied without much thinking__

「 __のろわれたコード__ 」とい文字が・・・やっぱり動かないのね。
公式にあるサンプルコードだから動くのが当たり前と思ったけど、動かないこともあるんですね・・・
もしかしたら何かが影響してて動かないのかな。
わかる方がいたら教えて下さい―

ちなみに、もうひとつある下記サンプルコードはちゃんと動きました！

```js:interceptors
// register the interceptor as a service
$provide.factory('myHttpInterceptor', function($q, dependency1, dependency2) {
  return {
    // optional method
    'request': function(config) {
      // do something on success
      return config;
    },

    // optional method
   'requestError': function(rejection) {
      // do something on error
      if (canRecover(rejection)) {
        return responseOrNewPromise
      }
      return $q.reject(rejection);
    },



    // optional method
    'response': function(response) {
      // do something on success
      return response;
    },

    // optional method
   'responseError': function(rejection) {
      // do something on error
      if (canRecover(rejection)) {
        return responseOrNewPromise
      }
      return $q.reject(rejection);
    }
  };
});

$httpProvider.interceptors.push('myHttpInterceptor');
```
はじめてのAmazon VPC①

## はじめに
この内容は、社内向けに実施した勉強会資料のアンチョコです。
特定ネットワーク環境を作ってみよう！という内容で、 ~~物理環境を用意するのは準備が面倒だったため、~~ Amazon VPC を利用して実施したものです。
\# 触れることがメインのため簡単な構成としています

## 課題内容
以下の要件を満たす環境を作成せよ。

### 要件
- 指定したネットワークサイズのVPC環境を作成せよ
- 作成したVPC環境に、指定したネットワークサイズのパブリックサブネット環境を作成せよ
- 作成したサブネット環境に、EC2インスタンスを作成した際に自動でPublicIPが振られるようにせよ


| region |        VPC    | Availability Zone | Public Subnet  |
|:------:|:-------------:|:-----------------:|:--------------:|
| Tokyo  | 10.100.0.0/16 | ap-northeast-1a   | 10.100.10.0/24 |

## 想定構成図
このような環境を想定
![sample_vpc.gif](https://qiita-image-store.s3.amazonaws.com/0/45524/cd158e6d-ba38-3121-f835-f860769727e7.gif)

## 手順

基本的には以下サイト内容に沿って実施します。

- [シナリオ1:1つのパブリックサブネットのみを持つVPC](http://docs.aws.amazon.com/ja_jp/AmazonVPC/latest/UserGuide/VPC_Scenario1.html)

### VPC/サブネット/インターネットゲートウェイを作成

1. Amazon VPC コンソールを開く
2. ナビゲーションペインで **[VPC Dashboard]** をクリックする
3. Resources 画面で **[Start VPC Wizard]** をクリックする
4. 最初のオプション **[VPC with a Single Public Subnet]** を選択し、 **[Select]** をクリックする
5. 要件に応じて設定し、 **[Create VPC]** をクリックして、VPC/サブネット/インターネットゲートウェイ/ルートテーブルを作成する
6. ナビゲーションペインで **[Subnets]** をクリックする
7. 一覧から先ほど作成したサブネットを選択し、 **[Modify Auto-Assign Public IP]** ボタンをクリックする
8. **[Enable auto-assign Public IP]** にチェックを入れ、 **[Save]** ボタンをクリックする

### セキュリティグループを作成

1. Amazon VPC コンソールを開く
2. ナビゲーションペインで **[Security Groups]** をクリックする
3. **[Create Security Group]** ボタンをクリックする
4. 適当な Group name / Description を設定し、VPC には先ほど作成した VPC の ID を選択し、 **[Yes, Create]** をクリックする
5. 先ほど作成したセキュリティグループを選択する
    1. **[Inbound Rules]** タブで **[Edit]** をクリックする
    2. 適当なセキュリティグループを設定する(e.g.: SSH/HTTPなど)
    3. **[Save]** をクリックする

### EC2インスタンスを作成

1. 作成したVPC/パブリックサブネット内にEC2インスタンスを作成する
2. 作成したEC2インスタンスに、作成したセキュリティグループを紐付ける
3. 外部からPublicIPに対してSSHログインできることを確認する

***

ここまでの手順で、作成したVPC内のEC2インスタンスにPublicIPで接続できるようになったはずです。
KarabinerでEmacsのキーバインドを使えるようにする（MacをEmacs化させる？）


キー配置をリマップできるKarabinerというアプリが素晴らしい．

( ˘⊖˘) 。o( Word for Macはショートカットが`Command`中心だからしんどいなぁ・・）
( ˘⊖˘) 。o( ファイル保存でついつい`C-x C-s`とか押しちゃうんだよなぁ）
と思っていた件が解決した．

## 設定方法

Karabinerの検索窓に`emacs`といれると，その中に`Emacs Mode`のグループがある．

その中の以下のチェックボックスにチェックを入れた．

 * Control+D to Forward Delete
 * Control+Y to Command+V
 * Control+AE to Command+Left/Right
 * Control+K to Command+Shift+Right, Forward Delete

これを設定することで，行頭へのジャンプに`Command+Left`をおす必要がなくなり，直感的（?）に操作できるようになる．

そのなかでもこれが格別だった
 
  * [ex]Use Control+X as prefix key  Control+X detail (略) Enable Control+X

これを設定すると，ファイル保存がEmacsと同じように`C-x C-s`になる．

## まとめ

他にもkarabinerの良い設定はあると思います．
ちょっとずつでも使いこなしていきたいです．
他にいい設定方法を知っていたらご享受ください．
$HOME/.gem/ruby/ 以下にある最新バージョンの Ruby の gem executable を自動で $PATH に追加する

```bash
if [ -d "$HOME/.gem/ruby" ] ; then
  local gem_bin_dir=$(ls -d -1 $HOME/.gem/ruby/* | sort -r | tail -n 1)
  if [ -d "$gem_bin_dir" ] ; then
    export PATH="$PATH:$gem_bin_dir/bin"
  fi
fi
```

適当に書き換えるだけで rbenv とかでも使えるはずです。
つ部 Android Studio 勉強会 2014年12月


## 事前準備

### Android Studioのダウンロード・インストール

https://developer.android.com/sdk/installing/studio.html にアクセスし、一番目立つボタンを押してダウンロード・インストールしてください。

しかし、ここでダウンロードできるAndroid Studioは最新版にはなっていません。ので、起動後のメニューから`Help > Check for updates (Macの場合は, Android Studio > Check for updates)`を押して、最新版（投稿時点0.9.1）にアップデートしとくと良いかもしれません。Mustではありません。

### 新規プロジェクト（HelloWorldアプリ）の作成

ここを参考にしてください。
http://qiita.com/sugoi_wada/items/6a1fdc3ab0ff673a9082

### Android SDK Tools/Platform-tools/Build-toolsのインストール

Android Studioのツールバー内にあるDroid君に下矢印のアイコンをクリックするとSDK Managerが起動します。

![スクリーンショット 2014-11-12 4.27.50.png](https://qiita-image-store.s3.amazonaws.com/0/16620/6e71131b-aeec-9b70-1b0f-d79f70b18591.png "スクリーンショット 2014-11-12 4.27.50.png")

この中で、

- Android SDK Tools
- Android SDK Platform-tools
- Android SDK Build-toolsの21以上（最新なら21.1.1）
- あなたが持っているor仮想環境で作る端末のバージョン（わからなければAndroid 4.0.3）内のSDK Platform

の中で、Not installedになっているものにチェックをうち、`Install xx packages...`を押してインストールしてください。

![スクリーンショット 2014-11-12 4.31.41.png](https://qiita-image-store.s3.amazonaws.com/0/16620/ffec9da9-d836-3b7d-e80e-5766fc29fcc4.png "スクリーンショット 2014-11-12 4.31.41.png")

下記画面で、左側のパッケージを選択し、右下の`Accept License`を押さないとインストールボタンが有効にならないので注意してください。

![スクリーンショット 2014-11-12 4.39.09.png](https://qiita-image-store.s3.amazonaws.com/0/16620/02f1d4c0-ba6d-1156-9220-47db8dc89e49.png "スクリーンショット 2014-11-12 4.39.09.png")

### エミュレータ（仮想環境）のインストール

実機があり、そちらを使うかたはエミュレータをインストールする必要はありません。Android端末を持っていない方や、古すぎるなどの理由でデバッグが困難な方はエミュレータをインストールしておいてください。

説明が大変なので省きますが、GenyMotionをオススメします。下記サイトのGapps導入`前`まで行ってあれば十分です。起動するAndroid端末のバージョンは、全項目でインストールしたSDKのバージョン`以上`に合わせてください。

http://www.teradas.net/archives/13895/

ここまでくれば、準備完了です。お疲れ様でした！
sassで計算を行う際の注意


sassで計算を行い、単位をつける際は、+で連結させないといけない。

例えば、

sass:

```
	+rotate( ( random(40) - 20 )deg )
```

とすると、

css

```
	transform: rotate(4 deg);
```

というふうに数値と単位の間にスペースが空く。
気づきにくいのでたちが悪い。
sudo tlmgr update --self --allで MacTeX2013古いんだよーって怒られた時の対処方法


##環境
OS X:Mavericks
MacTeX2013インストール済み

##更新を試してみる
``sudo tlmgr update --self --all``コマンドで更新を試すと以下のようにエラー

```shell
%sudo tlmgr update --self --all
 tlmgr: The TeX Live versions supported by the repository
 ftp://ftp.kddilabs.jp/CTAN/systems/texlive/tlnet
  (2014--2014)
do not include the version of the local installation
  (2013).
```

2013バージョンがインストールされているが、そのバージョンがレポジトリでサポートされていないということらしい

##対策
MacTeX2014を入れると直る
ただし、そのまま上書きしてはうまくいかない
MacTeX2013を綺麗にアンインストールする必要がある

###手順:
何かしらカスタマイズしてる場合はバックアップしておくこと
以下を削除
1./Applications/TeX
2./Library/Tex
3./Library/PreferencePanes/TeXDistPrefPane.prefPane
4./usr/local/texlive
5./usr/texbin
6./etc/paths.d/TeX

##参考
Mac Texをアンインストールしてみた。 http://jyun1.blogspot.jp/2014/05/remove-basic-tex-pkg.html
vim+marldown+wordpress

blogを更新するのにvim+markdownでwordpressに投稿したい。

　　

全部vimで完結させたかったが、VimRepressがどうにも合わなかった(´ε｀；)ｳｰﾝ…
というわけで、vimでhoge.mdをつくりvimプラグインのprevimでおおまかにつくり、コピペでwordpressにもってきて最終チェックってのがいい感じかな(　・∀・)ｲｲ!!　　

ということを準備したのでさぁあとは書くだけ(｀・ω・´)ｂ
BigQuery へブラウザからクエリを投げて結果をテーブルで表示する

まあ，[BigQuery の Web console](https://bigquery.cloud.google.com/)  から叩けば良いのですが，別途ブラウザで処理したいという需要もありますよね．

## OAuth 認証のためのクライアントIDを取得する

https://console.developers.google.com/ の任意のプロジェクトで，`[API と認証] -> [認証情報] -> [新しいクライアント ID を作成]`と進むとクライアントIDを発行できます．
今回はブラウザから認証を行ったユーザ自身の認可情報を使用するので，`ウェブアプリケーションのクライアントID`を発行します．

この項目は後から変更できるので，とりあえず `localhost` で試すようにしています．適宜変更してください．

![スクリーンショット 2014-11-12 0.32.29.png](https://qiita-image-store.s3.amazonaws.com/0/8597/e9533e26-77a4-1835-4c17-fe0ed70a9e35.png)

![スクリーンショット 2014-11-12 0.32.54.png](https://qiita-image-store.s3.amazonaws.com/0/8597/242c3051-32c0-8228-a397-4940891cdb8f.png)

## 認証する

Google API を利用するためのクライアントライブラリを読みこんでおきます．

```html
<script src='//apis.google.com/js/client.js'></script>
```

JS 側では先ほど発行した`client_id`と，BigQuery へのアクセス認可のための `scope` を指定します．
`readonly` にしておくのが良いでしょう．

```coffeescript
gapi.auth.authorize
  client_id: '1234567890-abcdefg.apps.developer.gserviceaccount.com'
  scope: 'https://www.googleapis.com/auth/bigquery.readonly'
  ->
    gapi.client.load('bigquery', 'v2')
```

おなじみの権限認可の画面に遷移して戻ってきます．

![スクリーンショット 2014-11-12 2.46.47.png](https://qiita-image-store.s3.amazonaws.com/0/8597/97d65afc-72c2-250b-1389-de44bcc8c686.png)

ちなみに，権限を認可したアプリケーションは，https://security.google.com/settings/security/permissions で管理できますね．

## クエリを投げる

クエリを投げて結果を取得します．
`projectId`, `query` を指定して，リクエストを構築します．

```coffeescript
request =
  gapi.client.bigquery.jobs.query
    projectId: 'twitter2bigquery'
    query: 'SELECT user_screen_name, COUNT(*) AS cnt FROM [twitter.timeline] GROUP BY user_screen_name LIMIT 1000'
```

実際に API リクエストするには，これを`execute`します．
callback でレスポンスが取得できます．

```coffeescript
request.execute (response) ->
  console.log response
```

## table に表示する

```json
> response.schema.fields
[{"mode":"NULLABLE","name":"user_id","type":"INTEGER"},{"mode":"NULLABLE","name":"user_name","type":"STRING"}, ...]
> response.rows
[{"f":[{"v":"123"},{"v":"alice"}]},{"f":[{"v":"456"},{"v":"Bob"}]},...]
```

このように返ってきたレスポンスはちょっと扱いにくい形になっているので，整形します．

```coffeescript
columns =
  response.schema.fields.map (field) ->
    { title: field.name }
data =
  _.map response.rows, (row) ->
    _.map row.f, (values) ->
      values.v
```

これをさらに，整形して `<tr><td>...` としても良いですが，ここでは [DataTables](http://www.datatables.net/) という jQuery プラグインに渡してしまうことにします．

```coffeescript
$('#result').dataTable
  data: data
  columns: columns
```

簡単ですね．

![スクリーンショット 2014-11-12 3.14.36.png](https://qiita-image-store.s3.amazonaws.com/0/8597/1b4f5881-9425-adab-b7c5-b54f6f125063.png)

これらの全体のコードは， https://github.com/ckazu/bigquery-viewer-example にあります．

さらに， [HighchartsJS](http://www.highcharts.com/) なんかだと HTML の `<table>` 要素をそのままグラフにできるので，ちょっと手を加えたら簡易ダッシュボードがすぐに作れちゃいますね．
goenv(とgoof)で仮想環境を作ってみた #golang


# goenv(とgoof)ってなに
* Goのプロジェクトを管理するためのツール
* プロジェクトごとにバージョンの違う外部ツールを使いたい時とか便利
* https://bitbucket.org/ymotongpoo/goenv/src
* Pythonのvirtualenvに相当する
* 今だとgoenvをラップしてさらに使いやすくしたgoofを使う
	* Pythonのvirtualenvwrapperに相当
* virtualenv+virtualenvwrapper for Golang

# 使いかた
* ```goof make <ENVNAME>```
	* 新しくENVNAMEという環境を作成する
* ```goof workon <ENVNAME>```
	* ENVNAME環境に切り替える

* ```goof show```
	* 環境一覧
* ```goof remove <ENVNAME>```
	* ENVNAME環境を削除

## Goを自前コンパイルした人だけが使えるコマンド
* ```goof goinstall <version>```
	* 指定したバージョンをインストールする
* ```goof go [version]```
	* 指定したバージョンに切り替える

# インストール
## 前提条件
* Goが入っている(brewでも自前コンパイルでも)
* ```GOPATH```、```GOROOT```が設定されている

## 手順
* zshrcに次の変数を追加する

```sh
export GOENVHOME=$HOME/.goenvs
```

* 以下を実行

```sh
$ go get bitbucket.org/ymotongpoo/goenv
$ cp $GOPATH/src/bitbucket.org/ymotongpoo/goenv/shellscripts/goenvwrapper.sh $GOPATH/bin/
```

* 以下をzshrcに追加する

```sh
if [[ -r `which goenvwrapper.sh` ]]; then
    source `which goenvwrapper.sh`
else
    echo "WARNING: Can't find goenvwrapper.sh"
fi
```

* zsh再起動

# 使ってみた感じ
* めっちゃ便利
* 自分は以前Python書いていたので、その時の運用をそのまま使える感じになっている
* ```deactivate```がvirtualenvwrapperと完全にバッティングしているので、何とかしたい
* ```goof make hoge```で環境のディレクトリに飛ばされるの、若干ここでコード書けみたいな誤解が生まれそうだった
Google Compute Engine のSSH接続

[前回](http://qiita.com/NewGyu/items/c34bcddd13d96c740d82)も触れましたが表題のSSH接続についてもうちょっと深く掘ってみました。

## 基本形(gcloudコマンドによるssh)

### まずは gcloud auth login
まずは ```gcloud auth login``` でログインしましょう。ブラウザで認証するアレですね。

これによってgcloudコマンドがgoogleアカウントに紐付けられます。
auth loginはしょっちゅうする必要は無くて、作業端末を再起動しても情報は残るようです。多分どこかのファイルに書かれるんでしょうね。

もうログイン済んでるはずって人は次のコマンドを試してみましょう。どんな状態になっているかを確認することができます。

```
$ gcloud config list
[core]
account = newgyu
disable_usage_reporting = False
project = upheld-caldron-XXX
user_output_enabled = True
```

### gcloudコマンドでssh


```
$ gcloud compute ssh ＜インスタンス名＞ --zone ＜ゾーン名＞
```

ipとかわからなくても自分のつけたインスタンス名でログインできるのが便利ですね。エフェメラルIPだと再起動するたびにIPが変わってしまうので地味に便利です。

--zoneは省略してもいいのですが、どうせ実行時に選択させられるのでコマンドで指定したほうがいいでしょう。

これで先ほどのauth loginしたユーザー（上記例だとnewgyu）でインスタンスにログインできます。このユーザーはsudo可能に設定されています。（AWSのec2-user相当ですね）
ssh鍵はgcloudコマンドによって```~/.ssh/google_compute_engine```というファイル名で自動生成されます。

以上です。

事前にssh-keygenコマンドで鍵生成してアップロードとか必要ないのでちょっとした利用の時は至って簡単です。

## 自分で作った鍵を配置する

ちょっとした使用であればgcloudコマンドで便利に使えるのですが、本格的に使おうと思うと既存のssh鍵を使いたいということもありますよね。
また、gcloudコマンドは便利だけど普通にssh接続できないとAnsibleやcapistranoを使うときに困ってしまいますよね。

そんな時にはインスタンス生成時またはインスタンスの詳細画面で登録することができます。

![Google Developers Console.png](https://qiita-image-store.s3.amazonaws.com/0/31010/cc879549-69a5-9e1b-4689-01c5e4fa9811.png)

この部分に、```プロトコル 公開鍵 ユーザー名```という形式の文字列を貼ります。
ローカルマシンで、```ssh-keygen -t rsa -C "ユーザー名"```で生成したコメント付きの公開鍵をペタッと貼ればOKです。

特筆すべきはユーザー名の部分に指定したユーザーをインスタンス内にuseraddしてくれます。

```
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCyGROMaW4hatAblZpz4sC0VWKCg3rNFNz8B3ZTPqPpxZsZgzSdscIFnlPqSqspAacSOpLgeqMtM80yYB6unlSk9XAsa6woR4kQyIYB765ISo4nhJmfMYrYl3VJ0/HxlkbUez2WQnE6UJ1i4N6Er8wObvgUI0exaH+t+58B4eyrpOToYz7fd4ZqM3TLFpPKYAFyB8mLl1sPKkM1gijbRkiYx06h1tJRqPr5qEVV6BWYg37VLiU8HN7png50E+nB1D+T839h8dkVR6gEaw2UIT8GjWqebIDHFSov/ZtoxbH1pOIsPUm4/V8/uUVEiKmUlKv3M0zvZ+uClQS797Qjdt1V someuser@domain
```

として登録すれば```ssh someuser@<インスタンスのIP>```でログインできます。
AWSだと一旦ec2-userでログインして、```sudo useradd someuser```して、ssh-keygenして、sudoers登録して…というのが一発で出来てしまいます。

少々注意が必要なのはこの方法で作ったユーザーはsudo可能なので管理ユーザー的な位置づけで捉えておいたほうがいいでしょう。権限を絞ったユーザー作成は普通通り管理権のあるユーザーでuseraddして作りましょう。

ということでsshの鍵管理はかなり楽なGCEでした。
DynamicListViewで変なとこでどハマりしてしまったのでメモ

ListViewAnimationsに含まれている`DynamicListView`はとても素晴らしいです
お手軽にGmailアプリのようなリストビューができるのです

ということで、それを使ってドラッグアンドドロップでリストの並び替えをしてみたのですが、
意外な(？)なとこでハマってしまったのでメモ。

## 問題ない正しい方から

使い方は公式wikiにも書かれている通りです

```java
mDynamicListView = (DynamicListView)findViewById(R.id.dynamic_list_view);

// ドラッグあんどドロップを有効に
mDynamicListView.enableDragAndDrop();

// 長押しリスナーでドラッグ開始の処理
mDynamicListView.setOnItemLongClickListener();

// ドロップの処理
mDynamicListView.setOnItemMovedListener();

```

と、こういう感じで各リスナーで正しく処理をかけば問題なく、ドラッグアンドドロップで並び替えできるでしょう
それぞれの処理は端折ってますけど。

## 自分が血迷ってできなかった方

でも、自分の場合、最初…

```java
mDynamicListView = (DynamicListView)findViewById(R.id.dynamic_list_view);

// 長押しリスナーでドラッグ開始の処理
mDynamicListView.setOnItemLongClickListener();

// ドロップの処理
mDynamicListView.setOnItemMovedListener();

// ドラッグあんどドロップを有効に
mDynamicListView.enableDragAndDrop();

```

こう書いていたのです。
違い、わかりますか？
`enableDragAndDrop()`の呼ぶ順番です。(最後に呼んでいたのです

こうすると、どうなるのか…
ドラッグアンドドロップはできます
(画面上リストアイテムもきっちり移動します)
がしかし・・・

**`onItemMoved()`が呼ばれない**

という事態に…。
なので、画面上の並び替えの結果を受け取ってサーバーへ送信したいとかっていう場合、
処理できません…(汗)

## 結論

ちゃんと順番を守って使いましょう。


こんなことで、めちゃ時間くった…orz


## 参考

[ListViewAnimations](https://github.com/nhaarman/ListViewAnimations)
GinnieでRe:VIEW原稿編集中、箇条書きを書くのを簡単にする

さてGinnieのスクリプトマクロを使って編集機能を強化しようシリーズ。

今回はRe:VIEWの原稿編集中、箇条書き入力を便利にします。
具体的には、QiitaのMarkdownエディタのように、箇条書きの行で改行した場合は、次の行も改行になるようにします。

Ginnieでは、Events.jsというファイルを作成しておくことで、新しいドキュメントの作成やキャレットの移動、キーの押下など、さまざまなタイミングで処理を実行するスクリプトを作ることができます。

今回は、そんなイベントスクリプトを使ってRe:VIEW原稿編集中の処理を拡張し、以下の処理を追加します。

 * ENTERキー入力時、もし前の行が箇条書き(*または1.)であれば、次の行も箇条書きにする
 * BACKSPACEキー入力時、箇条書きの文字しか存在しない場合、その文字を全部削除する

-[動画](https://vine.co/u/1110619523012575232)

```js:Events.js
function onDocumentKeyPress( tabIndex, key)
{
  var VK_BACK = 0x8;
  var VK_ENTER = 0xd;
  var VK_SHIFT = 0x10;
  // ReView編集モードの時に限り、オートインデントチェック
  var doc = Documents.NewDocument();
  switch(doc.DocumentType){
    case "ReVIEW":
      var l = doc.caret.lineString(doc.caret.line);
      switch(key){
        case VK_BACK:
            // 箇条書きを削除(シフトキー同時押しの時は削除しない)
            if(!App.keyState(VK_SHIFT)){
              var m = l.match(/^\s*(\*+|\d\.)\s*$/);
              if(m != null){
                  doc.caret.selStart = doc.caret.selStart - m[0].length;
                  doc.caret.selLength = m[0].length;
                  doc.caret.deleteSelected();
                  return 0;
              }
            }
            break;
        case VK_ENTER:
            // 箇条書き中に改行したら、次の行も箇条書きに
            var m = l.match(/^\s*(\*+|\d\.)\s*/);
            if(m != null){
              doc.caret.selText = "\n" + m[0];
              return 0;
            }
            break;
      }
    break;
  }
  return key;
}
```

# 工夫したところ

とりあえずそのままではなんなので工夫したところを書きます。

今回は、Ginnieの用意しているイベント、onDocumentKeyPress()を使っています。

このメソッドは、文字キーを押したときに呼び出されるイベントで、戻り値に0を返すことで、キー入力をキャンセルすることも出来るものです。そのためReVIEWモードかつ、こちら側で処理を行ったときは、キーコードを0とすることで、Ginnie自体のキー入力をキャンセルしています。

改行が押されたときかつ、一つ上の行が「*」または「1.」で始まっている場合は、その部分だけを複写して次の行の先頭に書きます。こうして箇条書きを実現しています。

また、BACKSPACEキーが押されたときかつ、その行に「*」または「1.」しかない場合は、行頭まで全ての文字を削除します(例外として、Shiftキーを押しているときは、削除しません)。こうすることで、箇条書きの解除が簡単になるという感じ。Shift+↑+Delなんかでも代用できるにはできますが。


とりあえず、[Githubにもアップしているので良ければどうぞ](https://github.com/TakamiChie/ginnie-scripts)。
html/templateでlayoutファイルとcontentsファイルを分けたい場合

[html/template](http://golang.org/pkg/html/template/)で、よくあるテンプレートエンジンのように、
コンテンツファイルとレイアウトファイルを分けたい(jadeでいうextendみたいなやつ)時があるけれど、
その場合はどうも [ParseFiles](http://golang.org/pkg/html/template/#ParseFiles)関数を使えばそれっぽくなる。

```go:main.go(一部)
func main() {
	http.HandleFunc("/", handler)
	err := http.ListenAndServe(":8080", nil)
	if err != nil {
		log.Fatal("ListenAndServe: ", err)
	}
}
 
func handler(w http.ResponseWriter, r *http.Request) {
	data := map[string]string{
		"Name": "Mike",
	}
 
	tmpl := template.Must(template.ParseFiles("layout.html", "content.html"))
	w.Header().Set("Content-Type", "text/html")
 
	err := tmpl.Execute(w, data) // Hello, Mike
	if err != nil {
		panic(err)
	}
}
```

```html:layout.html
<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  </head>
  <body>
    {{ template "content" . }}
  </body>
</html>
```

```html:content.html
{{ define "content" }}
<p>Hello, {{ .Name }}</p>
{{ end }}
```

特に、どこかのドキュメントにやり方が書いてあるわけじゃなかったので、
今の今まで気づきませんでした。

gist: https://gist.github.com/hiroosak/fe52f06895dc40f7030b
Movable Typeで記事のないカテゴリーだけ表示させないようにする

記事がないときは、カテゴリを非表示にするという要件があったため、調べてたのメモしておきます。
以下、ソースになります.



```
<MTTopLevelCategories>
  <MTHasNoParentCategory>
    <mt:SetVarBlock name="cat_cnt"><$MTCategoryCount$></mt:SetVarBlock>
    <MTSetVarBlock name="folder_name"><$MTCategoryLabel$></MTSetVarBlock>
    <mt:If name="cat_cnt" ne="0">
      <$MTCategoryLabel$><-- カテゴリを表示 -->
    </mt:If>
  </MTHasNoParentCategory>
</MTTopLevelCategories>
```

```<$MTCategoryCount$>```が0じゃない場合( ne="0")で取得できる
AzureでmongoDBをインストール

Azure上でMongoDBを展開したので備忘録。次のサイトを参考に作業を行う。
[Azure 上で CentOS Linux を実行する仮想マシンへの MongoDB のインストール](http://azure.microsoft.com/ja-jp/documentation/articles/store-mongodb-virtual-machines-linux-install-centos/)
[Install MongoDB on Linux on Azure](http://docs.mongodb.org/ecosystem/tutorial/install-mongodb-on-linux-in-azure/)

##環境
OpenLogic CentOS 7.0
MongoDB 2.6.5

##仮想マシンの設定
■ AzureポータルでVMを作成したのちSSHでVMにアクセス
ひとまずupdate

```sh
$ sudo yum update
```

■ データディスクを接続
Azureポータルで作成したVMにディスクを接続。
とりあえず10GB割り当てた。


■ データディスクの初期化
最後に追加されたデータディスクを確認

```sh
$ sudo grep SCSI /var/log/messages
```

パーティション分割

```sh
$ sudo fdisk /dev/sdc
```
nで新しいパーティション作成
pでディスクの詳細情報
wで設定の書き込み

データディスクをフォーマット

```sh
$ sudo mkfs -t ext4 /dev/sdc1
```

データディスクをマウント

```sh
$ sudo mkdir /datadrive
$ sudo mount /dev/sdc1 /datadrive
```

マウント設定

```sh
$ sudo -i blkid
/dev/sda1: UUID="11111111-1b1b-1c1c-1d1d-1e1e1e1e1e1e" TYPE="ext4"
/dev/sdb1: UUID="22222222-2b2b-2c2c-2d2d-2e2e2e2e2e2e" TYPE="ext4"
/dev/sdc1: UUID="33333333-3b3b-3c3c-3d3d-3e3e3e3e3e3e" TYPE="ext4"
```
/etc/fstabに追記

```sh:/etc/fstab
UUID=33333333-3b3b-3c3c-3d3d-3e3e3e3e3e3e  /datadrive  ext4  defaults  1  2
```

マウント確認

```sh
$ sudo umount /datadrive
$ sudo mount /datadrive
```

##MongoDBのインストール
/etc/yum.repos.d/mongodb.repoを作成。

```sh:/etc/yum.repos.d/mongodb.repo
[mongodb]
name=MongoDB Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64/
gpgcheck=0
enabled=1
```

mongodbをインストール

```sh
$ sudo yum install mongo-10gen mongo-10gen-server
```

データディレクトリの作成

```sh
$ sudo mkdir -p /mnt/datadrive/data
$ sudo chown `id -u` /mnt/datadrive
$ sudo chown `id -u` /mnt/datadrive/data
```

設定ファイルの編集

```sh:/etc/mongod.conf
logpath=/mnt/datadrive/mongod.log
dbpath=/mnt/datadrive/data
```

起動（初回起動は時間がかかる）

```sh
$ mongod --config /etc/mongod.conf
```

起動状態はログファイルをチェック

```sh
$ tail --f /mnt/datadrive/mongod.log
```

##ユーザー設定
アクセスコントロール

```sh
$ mongo

# データベース管理権限
> use admin
> db.createUser({
    user: "[user]",
    pwd: "[password]",
    roles: [
      {
        role: "userAdminAnyDatabase",
        db: "admin"
      }
    ]
  })

# 特定データベース管理権限
> use [database]
> db.createUser({
    user: "[user]",
    pwd: "[password]",
    roles: [
      {
        role: "userAdmin",
        db: "[database]"
      }
    ]
  })

# ユーザーが追加されているか確認
> use admin
> db.system.users.find()
```
mongoDBをシャットダウン

```sh
$ mongo
> use admin
> db.shutdownServer()
```
設定ファイルに以下を追記して認証を有効化

```sh:/etc/mongod.conf
auth=true
```
mongoDBを起動して認証をチェック

```sh
$ mongo
> use admin
# 成功なら1が返る
> db.auth("[user]","[password]")
```
シェルスクリプトでredisデータ作成

redisのソート済リストデータに適当なデータを大量に作りたい、ということでシェルスクリプトでやってみました。そしてここに備忘録として残すことにしました。


まず、シェルスクリプトを作ったことがないのでそこから調べました。

vi で適当なファイル(sh形式)を作成し、第１行目に

```
#!/bin/sh
```

を書く。（/bin/shでスクリプトを実行しますという意味）

次にループで適当な値を適当なメンバでソート済データを作成するために以下を記述します。

```
for a in `seq 1 1000`
do
redis-cli zadd THIS_KEY $a $a
done
```

ファイルを保存して実行すると
zadd THIS_KEY 1 1
zadd THIS_KEY 2 2
zadd THIS_KEY 3 3
・
・
・
zadd THIS_KEY 1000 1000
が行われます。

```
(integer) 1
(integer) 1
(integer) 1
(integer) 1
(integer) 1
(integer) 1
(integer) 1
(integer) 1
・
・
・
```

が書き出されたらデータ作成成功です。

手動で全部書き出していったらとても疲れる作業になると思います。でもシェルなら一発でリストデータを作成することができました。
RailsでproductionからDBコピー

productionやstagingのDBからデータをコピーしたい時、[yaml_db](https://github.com/yamldb/yaml_db)などありますが、ちょっとパフォーマンスが悪いです。

そこで、`mysqldump`を使ってDBをダンプし、emailなどのprivacy情報を潰すcapistranoタスクを作りました。

https://github.com/kaizenplatform/capistrano-db-mirror

使い方は簡単。`Gemfile`に`gem "capistrano-db-mirror"`などとして、

`Capfile`に以下を追加。

```
require "capistrano/db-mirror"
```

```bash
cap staging db:mirror
```

とするだけ！

mysqldumpによりdumpしたファイルをダウンロードして、ローカルでロードします。
念のため、`./dump`に１つ前のデータが残っており、

```bash
rake db:mirror:rollback
```

でロールバックできます。

※使用に関しては自己責任でお願いします。
TopCoder Competition Arena 外部エディタの設定


環境作りなおすたびに毎回ググってるのでまとめる．

基本はこれ
http://gulfweed.starlancer.org/d/index.php?itemid=10


## プラグインを拾ってくる
以下から`TZTester.jar`,`FileEdit.jar`,` CodeProcessor.jar` の3つを拾ってくる．
http://community.topcoder.com/tc?module=Static&d1=applet&d2=plugins

ちなみに私は必要なファイルや過去のコードなどをDropboxにつっこんであります．

## CommonClasspathの設定
CommonClasspathに`TZTester.jar`と`FileEdit.jar`へのパスを設定する．
`:`で区切って複数指定する．`Browse`ボタンで選択してもOK．

例:`/Users/tac/Dropbox/topcoder/TZTester.jar:/Users/tac/Dropbox/topcoder/FileEdit.jar`




## Pluginを追加
Arenaの `Options` -> `Editor` -> `Editor Preferences` -> `Add` で `Enter Plugin Information` を開いて以下のように入力．

+ Name: `CodeProcessor`
+ EntryPoint: `codeprocessor.EntryPoint`
+ ClassPath: CodeProcessor.jarへのパス(例:`/Users/tac/Dropbox/topcoder/CodeProcessor.jar`)

## Pluginの設定

上記で追加された `CodeProcessor`を選択した状態で`Configure` ボタンを押す．

### CodeProcessor Configuration

Editor EntryPoint: に `fileedit.EntryPoint` と入力して 、右隣の`Configure` ボタンを押す．

### FileEdit Configuration
Enter directory to read/write problems to: に、ソースを置くディレクトリへのパスを指定する．
例:`/Users/tac/Dropbox/topcoder`

次に、Code Template タブでテンプレートを指定する．
私はC++を使うので、 LanguageにC++を指定してテンプレートをコピペする．
ちなみにこんなかんじにしています．

```template.cpp
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <climits>
#include <cfloat>
#include <map>
#include <utility>
#include <set>
#include <iostream>
#include <memory>
#include <string>
#include <vector>
#include <algorithm>
#include <functional>
#include <sstream>
#include <complex>
#include <stack>
#include <queue>
using namespace std;

class $CLASSNAME$ {

	public:

	$RC$ $METHODNAME$($METHODPARMS$) {

	}

	$TESTCODE$

};

// BEGIN CUT HERE

int main() {

	$CLASSNAME$ ___test;

	___test.run_test(-1);

}

// END CUT HERE
```

テンプレートを入力したら`Save` -> `Close` で閉じる．

### 再び CodeProcessor Configuration
`Add`ボタンを押すと、`CodeProcessor Script` に空欄が追加されるので、以下を入力する．

`tangentz.TZTester`

Verity ボタンを押してこんな表示が出ればOK

```
Class: tangentz.TZTester
Method configuration: not found
Method preProcess: found
Method postProcess: found
Method getUserDefinedTags: found
```

`Please specify class for the code processor` が表示される場合はどっかおかしいです．

最後に`Save`ボタンを押して閉じる．その後Arenaを再起動して設定を反映する．

## 使いかた
適当に問題を開くと、`Enter directory to read/write Problems to:`で指定したディレクトリに、開いた問題のClassNameでファイルが作られる．
中身はさっき登録したテンプレートが元になっている．

あとは、そのファイルを好きなエディタで編集して保存するだけ．
保存するとArenaに反映されるので、CompileしたりTestしたりSubmitすればOK.

### テスト
テンプレートにはテストケースとエントリポイントが挿入されてるので、g++とかjavacとかでコンパイルして実行すればテストできる．

ちなみに私は、こんなかんじのスクリプト書いてテストしています．

```test.sh
#!/bin/sh
echo $1
g++ -o $1.out $1 && ./$1.out
rm $1.out
```
結果はこんな感じ．

```
% ./test.sh Containers.cpp
Test Case #0...PASSED
Test Case #1...FAILED
        Expected: "3"
        Received: "0"
Test Case #2...FAILED
        Expected: "7"
        Received: "0"
Test Case #3...FAILED
        Expected: "3"
        Received: "0"
```

おしまい．結構長いな．．．
Web上のコンテンツや入力情報などが、英語か日本語か判別したいときのメモ


##判別の仕方

rubyでは、正規表現で「ひらがな」「カタカナ」「漢字」をそれぞれ、

- ひらがな：/\p{Hiragana}/
- カタカナ：/\p{Katakana}/
- 漢字：/[一-龠々]/

で表現できるので、とある文字列に日本語が含まれるかどうかの判定は以下で判別できる。

    "#{text}" =~ /(?:\p{Hiragana}|\p{Katakana}|[一-龠々])/

##念のためやってみる。

    "test text desu" =~ /(?:\p{Hiragana}|\p{Katakana}|[一-龠々])/
    => nil
<br>

    "test text です" =~ /(?:\p{Hiragana}|\p{Katakana}|[一-龠々])/
    => 10
    #最初の日本語のindexを出力します。
<br>

    "test テキスト desu" =~ /(?:\p{Hiragana}|\p{Katakana}|[一-龠々])/
    => 5
<br>

    "test 試験 desu" =~ /(?:\p{Hiragana}|\p{Katakana}|[一-龠々])/
    => 5



###はい、できた！
そういえば: associative array

実験結果をまとめるのに作ったので書いておく。

sparseになるとあんまり効率良くない。

```lisp

(defstruct (associative-array (:constructor %associative-array))
  (dimensions 1 :type fixnum :read-only t)
  (%tables (vector (make-hash-table :test 'eq))
           :type (array hash-table 1)
           :read-only t) 
  (%array (make-array 0 :adjustable t :fill-pointer 0)
          :type (array t *)
          :read-only t))


(defun associative-array (dimensions)
  (%associative-array :dimensions dimensions
                      :%tables (iter (with tables = (make-array dimensions))
                                     (for i below dimensions)
                                     (setf (aref tables i) (make-hash-table :test 'eq))
                                     (finally (return tables)))
                      :%array (make-array (make-list dimensions :initial-element 0)
                                          :adjustable t)))

(defun aaref (associative-array &rest subscripts)
  (apply #'aref
         (associative-array-%array associative-array)
         (map 'list #'gethash
              subscripts
              (associative-array-%tables associative-array))))

(defun (setf aaref) (new-value associative-array &rest subscripts)
  (with-accessors ((%a associative-array-%array)) associative-array
    (apply #'(setf aref)
           new-value
           %a
           (map 'list
                (lambda (thing hash i)
                  (or (gethash thing hash)
                      (let* ((dimensions (array-dimensions %a))
                             (old (array-dimension %a i)))
                        (incf (nth i dimensions))
                        (adjust-array %a dimensions :initial-element nil)
                        (setf (gethash thing hash) old))))
                subscripts
                (associative-array-%tables associative-array)
                (iota (associative-array-dimensions associative-array))))))

(defun associative-array-dimension (associative-array dimension)
  (hash-table-keys 
   (aref (associative-array-%tables associative-array) dimension)))

(defparameter a (associative-array 2))
(setf (aaref a :one :one) 1)
(setf (aaref a :one :two) 2)
(setf (aaref a :three :two) 6)
(setf (aaref a :four :two) 8)
(associative-array-dimension a 0) ; -> (:one :three :four)
(associative-array-dimension a 1) ; -> (:one :two)
```
ffmpeg で画像ファイルに文字入れ、グレースケール化等の画像処理をする ヽ(ﾟｰﾟ*ヽ)(ﾉ*ﾟｰﾟ)ﾉわぁい

ffmpeg使ってますか？本当に便利で、こんなツールがオープンソースで無料で使えるなんて夢みたいです :smile: みんなはばりばり使いこなしちゃってると思うけど、今日はかわった使い方を紹介するよ :smiley: 

画像ファイルも動画 :tv: ファイルもそんなに違いは無いよね。ffmpeg といえば『動画ファイルの加工』って感じ、画像ファイル加工するために、imagemagickとか入れるのもなーと思ってffmpegでどこまでできるかやってみたよ。

できることはわかってたんだけど、注意点もあるから時間があったら読んでみてね :smile: 

:dog: :dog:

# ffmpeg で画像に文字 :ab: を書いてみた

画像に文字を書いたりもできたよ :+1: ↓のコマンド感じで 1.txt にある文字列を赤い文字、白いボーダーつけた新しい画像を作成する ffmpeg コマンドがこれ。1.txt に日本語書くならUTF-8にしようね :smile:

## コマンド

```bash
ffmpeg -i sample.png -filter_complex "drawtext=fontsize=20:fontfile=yourfontfile.ttf:fontcolor=#FF0000:bordercolor=white:borderw=5:x=0:y=10:textfile=1.txt" -y text.png
```

## 注意点

もとになる画像がPNGの場合、透明部分にdrawtextしてもできないです。いや、たぶん、出来てるんだけ透明だから見えていないっていう落ちだと思う :tractor: 

じゃあ、次 :traffic_light: 

# 画像をグレースケールにしてみた

全く問題無くできるよ。windows で評判の悪い colorchannelmixer も、pngファイルに対しては問題無く期待通りの結果がでたよ :+1:

## コマンド

```bash
ffmpeg -i sample.png -filter_complex "colorchannelmixer=.3:.4:.3:0:.3:.4:.3:0:.3:.4:.3" -y grayscale.png
```

# 上下反転

## コマンド

```bash
ffmpeg -i sample.png -filter_complex "vflip" -y vflip.png
```
ISO8583で定義されたビットマップの生成

突然ですが
http://ja.wikipedia.org/wiki/ISO_8583
のBitMapを生成します。
byte配列で。

# 使用するもの
java.util.BitSet
https://docs.oracle.com/javase/jp/7/api/java/util/BitSet.html

デフォルトで bit off の状態。

# ソースコード

```clj
(import (java.util BitSet)
        (sun.misc HexDumpEncoder))

; ビットマップ生成
; 64bit(8byte)で生成
(def bitset (doto (BitSet. 64)
              (.set 2 true)
              (.set 7 true)
              (.set 12 true)
              (.set 28 true)
              (.set 32 true)
              (.set 39 true)
              (.set 41 true)
              (.set 42 true)
              (.set 50 true)
              (.set 53 true)
              (.set 62 true)))

; byte配列化
(def b (.toByteArray bitset))

; 16進数でダンプしてみる
(def hexdumpencoder (HexDumpEncoder.))
(.encodeBuffer hexdumpencoder b)
```

# repl

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/39243/b01bb438-d2f0-4bd9-9b39-88d737f3b8d2.png)

# なんかWikipediaと結果が違う
↓Wikipedia

|ビットマップ|存在フィールド|
|------------|-------------|
|4210001102C04804|フィールド 2, 7, 12, 28, 32, 39, 41, 42, 50, 53, 62

## 右から左じゃねぇか!!!

BitSetってケツから詰めてくのん？

```clj
(import (java.util BitSet)
        (sun.misc HexDumpEncoder))

(defn calc-bit [bit-number]
  (- 64 bit-number))

(def bitset (doto (BitSet. 64)
              (.set (calc-bit 2))
              (.set (calc-bit 7))
              (.set (calc-bit 12))
              (.set (calc-bit 28))
              (.set (calc-bit 32))
              (.set (calc-bit 39))
              (.set (calc-bit 41))
              (.set (calc-bit 42))
              (.set (calc-bit 50))
              (.set (calc-bit 53))
              (.set (calc-bit 62))))

(def b (.toByteArray bitset))
(def hexdumpencoder (HexDumpEncoder.))
(.encodeBuffer hexdumpencoder b)
```

![bitmap.png](https://qiita-image-store.s3.amazonaws.com/0/39243/3bc22d58-5a80-6533-5aa2-fccf8418fd07.png)


## まだ逆だよ！！！
・・・力尽きた
バイトオーダーの問題というところまで掴みました
ByteBufferでゴニョゴニョすればWikipediaと同じになるのではないかと

# でもまぁ
ネットワークバイトオーダーはビッグエンディアンなので、問題ないかと
http://e-words.jp/w/E3838DE38383E38388E383AFE383BCE382AFE38390E382A4E38388E382AAE383BCE38380E383BC.html
Elixir Nested Structures #elixir

# Elixir Nested Structures

## 概要
Elixir の Nested Structures について

Elixir の Structures をネストして利用します。
ネストした要素への dot をつないでアクセス出来ます。

また、 put_in, update_in を利用することで、内部の要素への値の更新を
簡潔に行うことが出来ます。

## サンプル

~~~elixir
defmodule Person do
  defstruct name: "", age: 0
end

defmodule Group do
  defstruct name: "", leader: %{}, sub_leader: %{}
end

defmodule UserStruct do
  def use do
    black = %Group{ name: "black company", leader: %Person{ name: "watanube mikitaro", age: 50 }, sub_leader: %Person{ name: "hei tai", age: 20 } }
    study = %Group{ name: "study group", leader: %Person{ name: "high motivation man", age: 30 }, sub_leader: %Person{ name: "next high motivation man", age: 20 } }
    [black, study] |> Enum.each(fn (x) ->
      IO.inspect x
      IO.inspect x.name
      IO.inspect x.leader.name
      IO.inspect x.leader.age
      IO.inspect x.sub_leader.name
      IO.inspect x.sub_leader.age
      end
    )
    white = put_in(black.leader.name, "not watanube mikiaro")
    white = put_in(white.name, "white company")
    IO.inspect white
    IO.inspect white.name
    IO.inspect white.leader.name

    lazy = put_in(study.leader.name, "low motivation man")
    lazy = put_in(lazy.sub_leader.name, "next low motivation man")
    lazy = put_in(lazy.name, "lazy group")
    IO.inspect lazy
    IO.inspect lazy.name
    IO.inspect lazy.leader.name
  end
end

UserStruct.use
~~~

## 出力

~~~
%Group{leader: %Person{age: 50, name: "watanube mikitaro"},
 name: "black company", sub_leader: %Person{age: 20, name: "hei tai"}}
"black company"
"watanube mikitaro"
50
"hei tai"
20
%Group{leader: %Person{age: 30, name: "high motivation man"},
 name: "study group",
 sub_leader: %Person{age: 20, name: "next high motivation man"}}
"study group"
"high motivation man"
30
"next high motivation man"
20
%Group{leader: %Person{age: 50, name: "not watanube mikiaro"},
 name: "white company", sub_leader: %Person{age: 20, name: "hei tai"}}
"white company"
"not watanube mikiaro"
%Group{leader: %Person{age: 30, name: "low motivation man"}, name: "lazy group",
 sub_leader: %Person{age: 20, name: "next low motivation man"}}
"lazy group"
"low motivation man"
~~~

## 参照
[Elixir 記事一覧](http://qiita.com/tbpgr/items/a55ef9ea40200c5fd8ec)
STAで実行されるTaskの生成


C# の async/await を利用した非同期処理はお手軽で良いけれど、XPSDocument なんかをいじってると、`Task.Run()` で返される Task オブジェクトが MTA なため時々実行できませんと怒られてしまう。そういう場合、STA で実行される Task オブジェクトを生成してやると回避できる場合がある。

そこで見よう見まねで、`Task.Run()` ぽい感じで使える、STA で実行されるスレッドを生成する Task オブジェクトを返すクラス STATask を書いてみた。 

```csharp:statask.cs

// STAで実行されるTaskオブジェクトを生成する
class STATask
{
  public static Task Run<T>(Func<T> func)
  {
    var tcs = new TaskCompletionSource<T>();
    var thread = new Thread(() =>
    {
      try
      {
        tcs.SetResult(func());
      }
      catch (Exception e)
      {
        tcs.SetException(e);
      }
    });
    thread.SetApartmentState(ApartmentState.STA);
    thread.Start();
    return tcs.Task;
  }

  public static Task Run(Action act)
  {
    return Run(() =>
    {
      act();
      return true;
    });
  }
}

```

以下のような感じで使うことができる。


```csharp:sample.cs

private async void foo()
{
  await STATask.Run(() =>
  {
    // 非同期実行したい処理
    Thread.Sleep(1000);
  });
}

```
thor gem でテンプレートを利用してファイルを生成する #thor #ruby

# thor gem でテンプレートを利用してファイルを生成する #thor #ruby
## 概要
thor gem でテンプレートを利用してファイルを生成します。

Thor の Thor::Actions を利用することで内部的に ERB を利用した
ファイル出力が可能です。

後述の例は Thor::Group でファイル出力処理を定義し、
Thor を継承したクラスに `register` で登録しています。

* `argument` メソッドに引数を定義します。定義した引数はクラス内、テンプレートファイル内で利用可能です
* `source_root` クラスメソッドに処理のルートディレクトリを定義します
* `template` メソッドでテンプレートの出力を行います。引数の最後にハッシュを渡すと、  
  テンプレート内で `config` という名前でアクセス出来ます。  
  これは、 thor の内部実装を知っている必要があって結構微妙な仕様だな、と思ったりします。  
  本当は `template` メソッド呼び出し時に指定する Hash の変数名は自由なのですが、  
  `config` という名前にしておいた方が理解しやすいかもしれません。    
  以下URLにて内部実装を確認可能。 create_file 時に config と言う名前で Hash を渡している  
  [thor file_manipulation.rb L108-120](https://github.com/erikhuda/thor/blob/067f6638f95bd000b0a92cfb45b668bca5b0efe3/lib/thor/actions/file_manipulation.rb#L108-L120)

## 仕様
下記の3ファイルを生成する

~~~
<name>/lib/<name>.rb
<name>/lib/version.rb
<name>/README
~~~

## テンプレート
### template/ruby_src.tt
`module_name` , `class_name` は argument を参照している。
`config` は template メソッドの呼び出し時に渡した `opt` の内容を取得している。

~~~
module <%=module_name%>
  class <%=class_name%>
    def hoge
      <%=config[:logic]%>
    end
  end
end
~~~

### template/version.tt

~~~
module <%=module_name%>
  VERSION = '0.0.1'
end
~~~

## ソースコード
### thor_generate_file_from_template.rb

~~~ruby
require 'thor'

class Generator < Thor::Group
  include Thor::Actions

  argument :module_name
  argument :class_name
  argument :file_name
  argument :logic

  def self.source_root
    File.dirname(__FILE__)
  end

  def create_lib_file
    # わざと config 以外の命名にしているが、 config にしたたほうがよさそう
    opt = {
      logic: "puts 'hoge'"
    }
    template('templates/ruby_src.tt', "#{file_name}/lib/#{file_name}.rb", opt)
  end

  def create_version
    template('templates/version.tt', "#{file_name}/lib/version.rb")
  end

  def create_readme
    create_file "#{file_name}/README.md"
  end
end

module Hoge
  class CLI < Thor
    register(Generator, "gen", "generate sample", "generate sample")
  end
end

Hoge::CLI.start(ARGV)
~~~

## 実行

~~~bash
$ ruby thor_generate_file_from_template.rb gen HogeModule HogeClass hoge "puts 'hoge'"
      create  hoge/lib/hoge.rb
      create  hoge/lib/version.rb
      create  hoge/README.md
$ tree
.
┣ hoge
┃ ┣ lib
┃ ┃ ┣ hoge.rb
┃ ┃ ┗ version.rb
┃ ┗ README.md
┣ templates
┃ ┣ ruby_src.tt
┃ ┗ version.tt
┗ thor_generate_file_from_template.rb

$ cat hoge/lib/hoge.rb
module HogeModule
  class HogeClass
    def hoge
      puts 'hoge'
    end
  end
end
$ cat hoge/lib/version.rb
module HogeModule
  VERSION = '0.0.1'
end
$ cat hoge/README.md
~~~

## Thor 関連資料
* [thor GitHub](https://github.com/erikhuda/thor)
* [thor RubyGems](https://github.com/erikhuda/thor)
* [thor wiki - Generators](https://github.com/erikhuda/thor/wiki/Generators)
Laravel4をMacで動かしたときのメモ


# 環境構築

PHPはMAMPものを利用(anyenvからだとハマったので割愛・・・）
/usr/local/binあたりにシンボリックリンク
複数のPHP環境があるとartisan実行時にこける
post-update-cmdにPHPのパスを絶対指定で書く
php artisan serveでローカルサーバ動かす場合はPHP >= 5.4で
Artisanからmigrate


# SQLiteでmigrate

```app/config/database.php
'default' => 'sqlite'
```
特に変更しなければ、production.sqliteで作成

```
$ php artisan migrate
```

でスキーマができてればSQLiteファイル生成

# Seederを使って初期データ作成

## モデルに個別のSeederを作成

```app/database/seeds/UserTableSeeder.php
class UserTableSeeder extends Seeder {
    public function run()
    {
        DB::table('users')->delete();
        User::create(array(
            'email' => 'info@example.com',
            'name' => 'Test Man'
        ));
    }
}
```

## モデルごとのSeederを呼び出し

```app/database/seeds/DatabaseSeeder.php
<?php

class DatabaseSeeder extends Seeder {

    public function run()
    {
        Eloquent::unguard();

        $this->call('UserTableSeeder');
    }

}
```

```
$ db:seed
```

で実行

```
$ php artisan db:seed
``` 

# コントローラー周り

## JSONを返す

```app/routes.php
Route::get('users.json', function()
{
    $users = User::all();

    return Response::json($users);
});
```

# ルーティング

# バリデーション

## 宣言的に書ける
```
public static $rules = array(
	'name' => 'required|max:50',
	'kana' => 'required|katakana|max:50',
	'email' => 'required|email',
	'interview1' => 'required|date_format:Y-m-d|after:+3 days|before:+30 days',
	'interview2' => 'required|date_format:Y-m-d|after:+3 days|before:+30 days|different:interview1',
	'resume' => 'required|mimes:pdf,zip|max:10000',
	'message' => 'max:65535',
);
```

afterとbeforeの日付指定が便利。strtotime()の形式で記述できる。
max, min, sizeはコンテクストで変わる。文字列なら文字数、ファイルならファイルサイズ。

```

```

# Sccafold
concrete5(5.6.x)で既存システムと連携させながらサイト構築


## Zend Frameworkをconcrete5内で使いたい

今回は、独自テーマのdefault.php内から呼び出す想定

### HTTPでGETを送信してみる

* 前提として、既存システムはリクエストを受けつけるとJSONを返すAPIサービスの機能を持っている

```
// concrete5のLoaderは指定のクラスが見つかると、そのインスタンスを返してくれる
$json = Loader::helper('json');
// 3rdparty以下のライブラリだと、concrete5のディレクトリ構成や命名規則に準拠していないので
// インスタンスを返してくれる保証はない。
// この場合、Zend_Http_Clientがクラス名なのでインスタンスはかえってこない。
Loader::library('3rdparty/Zend/Http/Client');
$client = new Zend_Http_Client('http://example.com/api/test', array(
    'maxredirects' => 0,
    'timeout'      => 30
));
// Zend_Http_Responseがかえってくるので、bodyを取得
$body = $client->request(Zend_Http_Client::GET)->getBody();
// JSONはPHPオブジェクトにデコードされる
$json = $json_helper->decode($body);
```

## コアをオーバーライドするときは同じディレクトリ構造とファイル名で
```
blocks/page_list/templates/blog_index.php // 正常にオーバーライド
blocks/page_list/tmeplates/blog_index/view.php // 同名のカスタムテンプレートが追加されてしまう
```

## 独自に追加するブロックなどのディレクトリ構造は局所化重視
```
// 管理方法が統一できるし、タスクツールとの相性も良くなる
blocks/autonav/templates/bootstrap/view.php
blocks/autonav/templates/bootstrap/view.css

// sass側も同じ構造で用意する
sass/blocks/autonav/templates/bootstrap/view.sass
```
Ruby | 範囲を扱うクラスを自作する #ruby

# Ruby | 範囲を扱うクラスを自作する #ruby
## 概要
範囲を扱うクラスを自作します。

Ruby で範囲（ Range ）を扱うためには、
`<=>` と `succ` の二つのメソッドを実装する必要があります。

http://docs.ruby-lang.org/ja/2.1.0/class/Range.html

## 仕様
年齢を扱うクラスを範囲で扱えるようにします。

## サンプルコード

~~~ruby
require 'tbpgr_utils'

class Age
  attr_accessor :age

  def initialize(age)
    @age = age
  end

  def adult?
    !!(age >= 20)
  end

  def minor?
    !adult?
  end

  def succ
    copy = self.dup
    copy.age += 1
    copy
  end

  def <=>(other)
    age <=> other.age
  end
end

bulk_puts_eval binding, <<-EOS
(Age.new(18)..Age.new(22)).to_a
Range.new(Age.new(18), Age.new(22)).to_a
(Age.new(18)...Age.new(22)).to_a
Range.new(Age.new(18), Age.new(22), true).to_a
(Age.new(18)..Age.new(22)).min
(Age.new(18)..Age.new(22)).max
EOS

(Age.new(18)..Age.new(22)).each do |a|
  bulk_puts_eval binding, <<-EOS
a.age
a.adult?
a.minor?
  EOS
end

__END__
下記はTbpgrUtils gemの機能
bulk_puts_eval

https://rubygems.org/gems/tbpgr_utils
https://github.com/tbpgr/tbpgr_utils
~~~

## 出力

~~~
(Age.new(18)..Age.new(22)).to_a
# => [#<Age:0x00000600cb5b28 @age=18>, #<Age:0x00000600cb5a60 @age=19>, #<Age:0x00000600cb5a38 @age=20>, #<Age:0x00000600cb5a10 @age=21>, #<Age:0x00000600cb59e8 @age=22>]
Range.new(Age.new(18), Age.new(22)).to_a
# => [#<Age:0x00000600cb5358 @age=18>, #<Age:0x00000600cb5290 @age=19>, #<Age:0x00000600cb5268 @age=20>, #<Age:0x00000600cb5240 @age=21>, #<Age:0x00000600cb5218 @age=22>]
(Age.new(18)...Age.new(22)).to_a
# => [#<Age:0x00000600cb4c28 @age=18>, #<Age:0x00000600cb4b60 @age=19>, #<Age:0x00000600cb4b38 @age=20>, #<Age:0x00000600cb4b10 @age=21>]
Range.new(Age.new(18), Age.new(22), true).to_a 
# => [#<Age:0x00000600cb44a8 @age=18>, #<Age:0x00000600cb43e0 @age=19>, #<Age:0x00000600cb43b8 @age=20>, #<Age:0x00000600cb4390 @age=21>]
(Age.new(18)..Age.new(22)).min                 # =>  #<Age:0x00000600bf2448 @age=18>
(Age.new(18)..Age.new(22)).max                 # =>  #<Age:0x00000600bf1fe8 @age=22>
a.age    # => 18
a.adult? # => false
a.minor? # => true
a.age    # => 19
a.adult? # => false
a.minor? # => true
a.age    # => 20
a.adult? # => true
a.minor? # => false
a.age    # => 21
a.adult? # => true
a.minor? # => false
a.age    # => 22
a.adult? # => true
a.minor? # => false
~~~
transform: scaleの挙動


例えば、body自体をscaleで拡大させたとき、
順方向への拡大はブラウザの中に収まるが、
逆方向への拡大はブラウザの外に消える。

例えば、transform: originを bottomもしくはrightに設定した状態でbodyを拡大すると、
上端、左端がブラウザの外にはみ出し、スクロールしても見ることができない。