OmniAICreator/Qiita-1.07M huggingface dataset:
Hive on TreasureData Explode Multiple Arrays 

# 目的
下記ブログに書いてあるように、1つのレコードに複数のArrayカラムがあり、それらが対応関係があるので展開したい。
http://linuxandryan.wordpress.com/2014/01/17/hive-explode-multiple-arrays/

例1：元のテーブル

| cookie  | ids (array) | values (array) |
|--------:|:-------:|:-------:|
| 1234123 | [a,b,c] | [1,2,3] |
| 1234123 | [a,d]   | [4,5]   |

上記のテーブルを下記のようにしたい

例2：展開後のテーブル

| cookie  | id (string) | value (int) |
|--------:|:-------:|:-------:|
| 1234123 | a | 1 |
| 1234123 | b | 2 |
| 1234123 | c | 3 |
| 1234123 | a | 4 |
| 1234123 | d | 5 |

# 解決策 (2017-10-08)

HivemallのUDTFを使って下記みたいな形で実現できるようになった。

```
WITH t as (
select 'id1' as id, ARRAY(11,12,13) as a, ARRAY(21,22,23,24) as b
union all
select 'id2' as id, ARRAY(31,32,33) as a, ARRAY(41,42,43,44) as b
)
select
   id,
   n as array_index,
   subarray(a, n-1, n)[0] as  val_1,
   subarray(b, n-1, n)[0] as  val_2
from
   ( select id, a, b from t ) t1
lateral view
   generate_series(1,4) n1 as n
```

# 解決策（現状では無理

下記ブログでは、下記のUDFを使ったクエリによって記載されている。
http://brickhouseconfessions.wordpress.com/2013/03/07/exploding-multiple-arrays-at-the-same-time-with-numeric_range/
https://github.com/klout/brickhouse

```sql
select
 cookie,
 array_index( ids, n ) as id,
 array_index( values, n ) as value
from
( select cookie, ids, values from my_table ) t
lateral view numeric_range( size( values ) - 1 ) n1 as n
```

UDFが大変便利そうではあるが、TreasureDataでは現在利用できないので、サブクエリを多様して頑張るとどうなるだろうか。
ポイントとしては、numeric_rangeとarray_indexをどうHiveで表現するのかなので、それぞれについて考えてみる。
numeric_rangeを作るには、文字列をsplitして配列を作る。
array_indexはliteral Viewで頑張る。

# 代替案
事前準備として、データとして1レコードしか持たない one テーブルを作成しておくこと。

また、クエリのポイントとして、
numeric_rangeで生成される一定範囲の数値(ex. 0,1,2,3,...)をsplit_lineで擬似的に作成している。
つまり、idsの最大要素数を文字列'0,1,2,3,'にマッチさせて、各レコード毎の要素数分の数値を残し、
SPLITしている。これにより、要素数が1なら'0,'だけのこし、Lateral Viewをした際に対象のレコードの0の値を持つカラムが追加される。
この値をその配列から値をとる際の要素の目安にする。

```sql
SELECT
  cookie,
  CASE cast(num as int)
    WHEN 0 THEN ids[0]
    WHEN 1 THEN ids[1]
    WHEN 2 THEN ids[2]
    WHEN 3 THEN ids[3]
    ELSE NULL
  END as id,
  CASE cast(num as int)
    WHEN 0 THEN values[0]
    WHEN 1 THEN values[1]
    WHEN 2 THEN values[2]
    WHEN 3 THEN values[3]
    ELSE NULL
  END as value
FROM
(
  SELECT
    /*+mapjoin(t2)*/
    cookie, ids, values,
    split(substr(line, 0, instr(line, concat(',', cast(ids_size as string), ','))), ',') as split_line
  FROM (
    SELECT cookie, ids, values, size(ids) as ids_size from my_table
  ) t1 Join (
    -- one table have only 1 record
    select '0,1,2,3,' as line from one
  ) t2 ON 1=1
) t3 LATERAL VIEW explode(split_line) numtable AS num
```

つまり、上記の例1と例2のテーブルの間に一時的に下記のようなテーブルが内部的には生成されている。

例3：一時的なテーブル

| cookie  | ids (array) | values (array) | split_line (array) |
|--------:|:-------:|:-------:|:-----:|
| 1234123 | [a,b,c] | [1,2,3] |[0,1,2] |
| 1234123 | [a,d]   | [4,5]   |[0,1] |

そして、split_lineの値をCASE文で分岐させることで各要素の値のみを取得できるようにしている。
そのため、'0,1,2,3,'とCASE部分についてはids内の最大要素数に依存して増やす必要が有る。

# まとめ
もっと簡単な書き方はないでしょうかね・・・
Terminalで画像編集:Mac


Terminalで画像の編集をまとめてできれば便利だなと思って調べてみました。
### 画像ファイル一括リサイズ
`sips`コマンドはTerminalで使える画像処理用のコマンドです。

ディレクトリに入っている画像すべてを一括で横幅600pxにリサイズしたいときは、
ターミナルで該当ディレクトリに入って以下のコマンドをうつ。

`sips --resampleWidth 600 *jpg`


`--resampleWidth`は指定した横幅(600)で縦横比率は変えずにサイズ変換してくれるオプションです。

### 一括でファイルの拡張子を変える
当該ディレクトリに入って、以下のコマンドをうつ。

```
 for F in *.jpg; do sips -s format png $F --out ${F/.jpg/.png}; done
```
当該ディレクトリの中にある`~ jpg`ファイルをてpngに変換する。

### ファイル一括リネーム
当該ディレクトリに入って、以下のコマンドをうつ。

```
 for F in Kamakura*; do mv $F ${F/Kamakura/Yokohama/}; done 
```
`Kamakura ~`という名前のファイルを全て`Yokohama ~`に置換する。
mrb_get_argsを使用して可変長引数の個数を取得する際の型はmrb_int

# 問題
mrubyにおいて、Cで記述したメソッドが、mruby側から渡された引数を受け取る際には、mrb_get_args()を使用する。
その際、mrubyから渡された引数の個数を受け取るための整数型のポインタは、mrb_get_args()内において、mrb_int型と定義されている。
https://github.com/mruby/mruby/blob/master/src/class.c
のmrb_get_args()を参照。
しかし、誤って、int型のポインタを渡しているmrb_gemが複数あり、sizeof(int) != sizeof(mrb_int)の環境において、問題が発生する。
mrb_intの型は、mrbconf.h及びvalue.h
において定義されており、環境に応じて、コンパイラオプションで再定義することが想定されている。
# 実際に遭遇した現象
mrb_intの型を64bit整数型と定義したところ、あるmrb_gem内でmrb_get_args()呼び出し時に、引数の個数を受け取る変数の型がintだったため、別の引数であるmrb_stateのポインタが破壊されてNULLになり、直後にNULLポインタにアクセスしてプロセスが異常終了した。

# なぜ直接バグレポートせずにここに？
1箇所手元で修正したが、別の箇所でも再現したため、使用中のmrb_gemを総当りで調べたところ、他の箇所にも同じ問題が発見され、該当するプロジェクトに順に報告する際の説明のために、ここに記述した。

***
ということで、これから順にバグ報告に行ってきます……
Vagrant で外部設定ファイルを扱う

プライベートネットワーク設定の IP アドレスを設定として外出ししたい !!
こういうファイルを読み込ませたいわけですよ主に。

```yml:conf.yml
---
ip_address: 192.168.50.120
```


Vagrantfile = Ruby script
-------------------------

じゃあ Ruby で書けばいいじゃない。

```ruby:Vagrantfile
require 'yaml'

begin
  conf = YAML.load_file(File.join(File.dirname(__FILE__), 'conf.yml'))
rescue Errno::ENOENT
  # default settings
  conf = {
    'ip_address' => '192.168.50.100'
  }
end


VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|

  # snip

  config.vm.network "private_network", ip: conf['ip_address']
end
```

どうやら yaml モジュールは Ruby 標準なのでいろいろ心配する必要はないらしい。

rescue 節にデフォルト設定をつっこんでおけばファイルがなくても動くようにできる。

ファイルがあることを強制したい場合は以下のように rescue 節でゴニョゴニョすればいいんじゃないでしょうか。

```rb:require-conf.rb
require 'yaml'

begin
  conf = YAML.load_file(File.join(File.dirname(__FILE__), 'conf.yml'))
rescue Errno::ENOENT => ex
  STDERR.puts ex
  STDERR.puts 'Create conf.yml at the same dir with Vagrantfile'
  exit(false)
end
```
Ansible で設定をファイルに外出しする

接続するユーザー名とか、単一ホストであれば IP アドレスとか、あるよね ?
こういうファイルを作っておいて読み込ませたい !!

```yml:conf.yml
---
ip_address: 192.168.50.120
host_name: web01.example.com
```

こういうときに使える Ansible の仕組みは 2 つ。


vars_files
----------

こういう感じで指定する。

```yml:playbook.yml
---
- hosts: web01
  vars_files:
    - conf.yml
  roles:
    - common
    - web
```

するとテンプレート内で以下のように使える。 hosts に自分の IP アドレスとホスト名を付け加える例。

```j2:hosts.j2
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
{{ ip_address }}        {{ host_name }}
```


ansible-playbook の --extra-vars オプション
-------------------------------------------

<code>vars_files</code> は指定されたファイルが存在していることが前提みたい。ないと怒られる。

ファイル指定しなくても動くけどしたら設定値書き換えられるよ、ということがしたい場合は以下のように playbook 実行時に指定してやる。

```sh:play-with-extra-vars.sh
ansible-playbook playbook.yml --extra-vars="@conf.yml"
```

注意点として Ansible は基本的に定義されてない変数名があるとエラー吐いて止まるのでテンプレート内とかで使うときには default フィルターを使ってここらへんを迂回してやる。上記の hosts の例だと以下のようになる。

```j2:hosts-with-defaults.j2
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
{{ ip_address | default('192.168.50.100') }}        {{ host_name | default('web01.example.com') }}
```
subversionのpost-commitで更新されたファイルを取得する


## はじめに

subversionのpost-commitフックで更新されたファイルを取得する方法を記載します。

trunkにコミットされたときだけ、XXXしたいのような要望に対応できそうです。

## 環境

* Amazon Linux AMI release 2014.03
* subversion 1.8.8

## subversionのインストール

```shell
$ sudo yum install subversion
```

## リポジトリの作成

```shell
$ svnadmin create sample
$ svn mkdir file:///path/to/repository/trunk \
    file:///path/to/repository/branches      \
    file:///path/to/repository/tags          \
    -m 'create trunk,branches,tags'
```

## post-commitフックを有効にする

```shell
$ cp -p /path/to/repository/hooks/post-commit.tmpl /path/to/repository/hooks/post-commit
```

※ post-commitに実行権限がついていることを確認しておきます。

```shell
$ ls -l /path/to/repository/hooks/post-commit
-rwxrwxr-x 1 ec2-user ec2-user 2062 Aug 25 21:57 /home/ec2-user/repos/svn/sample2/hooks/post-commit
```

## 更新されたファイルを取得する

svnlookコマンドで更新されたファイルを取得します。
post-commitフックの引数やsvnlookコマンドの出力をログファイルへ記録するようにしておきます。

```shell:post-commit
#!/bin/sh

REPOS="$1"
REV="$2"
TXN_NAME="$3"

echo "$REPOS $REV $TXN_NAME" >> path/to/logfile
svnlook changed -r $REV $REPOS >> /path/to/logfile
```

## 動作確認

### リポジトリをチェックアウトする

```shell
$ svn checkout file:///path/to/repository/trunk sample-trunk
```

### リポジトリへ変更をコミットする

```shell
$ cd sample-trunk
$ touch sample.txt sample2.txt sample3.txt
$ svn add *
A    sample2.txt
A    sample3.txt
A    sample.txt
$ svn commit -m 'add sample files.'
Adding sample.txt
Adding sample2.txt
Adding sample3.txt
Transmitting file data ...
Committed revision 3.
```

※ post-commitフックによる出力を確認します。

```shell
$ cat /path/to/logfile
/path/to/repository 3 2-2
A    trunk/sample.txt
A    trunk/sample2.txt
A    trunk/sample3.txt
```

※ branchからもコミットしてみます。

```shell
$ svn copy file:///path/to/repsitory/trunk file:///path/to/repository/branches/b1 -m 'create b1 branch'
$ cd ../
$ svn checkout file:///path/to/repository/branches/b1 sample-branches
$ cd sample-branches
$ hostname > sample.txt
$ touch sample4.txt
$ svn rm sample3.txt
$ svn add sample4.txt
$ svn commit -m 'modify sample.txt, delete sample3.txt and add sample4.txt'
Sending    sample.txt
Deleting   sample3.txt
Adding     sample4.txt
Transmitting file data ..
Committed revision 5.
$ cat /path/to/logfile
...(省略)...
/path/to/repository 5 4-4
U    branches/b1/sample.txt
D    branches/b1/sample3.txt
A    branches/b1/sample4.txt
```
Project Eulerをhaskellで練習していく日記: Problem 32

#問題
n桁の数が"pandigital数"であるとは、そのn桁の数の各桁に1からnまでの数がちょうど１回ずつ現れる場合を言う。
例えば 15234 は5桁のpandigital数である。

さらにこれを発展させて、例えば 7254 のような数は、
39 × 186 = 7254
というように1から9までの数がちょうど１回ずつ現れる積で書ける。
これを上の話に沿って「9桁のpandigital積」と呼ぶことにしよう。

9桁のpandigiral積で書ける数の「積」の部分の和を求めよ。
ただし、同じ数が複数のpandigital積で書ける場合がある（A*B=A'*B'=Cのように）。
その場合は重複するものは除外した和を求めよ。
#回答
まず、判定の計算量を減らすために、a * b = c の式で、a,b,cの各桁に制限をつけるための関係式を導こう。
両辺のlog（底は10）をとると、
log a + log b = log c
a,b,cのそれぞれが
a=A*10^n, b=B*10^m, c=C*10^l
（ただし、1.0<=A,B,C<10.0）
と書けるので、それを代入すると、
n+log A + m+log B = l + log C
移項して、
l-(n+m) = log A+ log B - log C
今、0 <= log A,B,C <1　が成り立つので、
-1+(n+m) < l < 1+(n+m)
これにより、
l=n+m

```hs
import qualified List as L

-- 1..tの文字を使うとする
t=9

-- 1..tの全ての順列を列挙する
numlist :: [[Int]] 
numlist = f [1..t]
  where f [] = [[]]
        f xs = concat [map (x:) (f (filter (/=x) xs)) | x<-xs] 

-- a*b=cの各数の桁数制限を使って、あり得る桁数の候補を作る
ketas :: [[Int]]
ketas = [[n+1,m+1,(n+m)+1]| n<-[0..t-1], 
                        m<-[0..t-1], 
                        n<=m, (n+1)+(m+1)+((n+m)+1)==t]

-- 桁数の列を使って、数列を分割する
split :: [Int] -> [Int] -> [[Int]]
split [] xs = []
split (k:ks) xs = take k xs : (split ks $ drop k xs)

-- 分割された数列を１０進数のリストに変換する
makenum :: [[Int]] -> [Int]
makenum [] = []
makenum (x:xs) = (f x): (makenum xs)
        where f [] = 0
              f (y:ys) = y+10*(f ys)

-- a * b = c の候補[a,b,c]の列を求める
kouho :: [[Int]]
kouho  = filter (\y->(y!!0)*(y!!1)==(y!!2)) $ 
         filter (\x->(x!!0)<(x!!2) && (x!!1)<(x!!2)) [makenum (split k n) |k<-ketas, n<-numlist]

main = do
     -- 積cの和を求める(重複は除外)
     print $ sum $ L.nub $ map (!!2) kouho
```

#感想
またしても考える時間の圧倒的に長い問題であった。
しかも、プログラムというよりは数学の問題として解法を考える割合が９割で、プログラムに関しては１割ぐらいしか考えていないだろう。
Project Eulerはなんだかそろそろプログラムの練習というよりは、数学の訓練の色合いが濃くなって来たように感じだしている。
gflagsでコマンドライン引数を処理する

# 概要

[gflags](https://code.google.com/p/gflags/)はGoogleがオープンソースで公開しているコマンドライン引数を処理するためのライブラリです．
C++でコマンドライン引数のフラグを処理するときは`getopt()`を使うのが通説ですが，`gflags`を使うとよりフレキシブルに処理することができます．

ここでは，ごく簡単な使い方のみを紹介するので，詳しくは[ドキュメント](https://gflags.googlecode.com/git-history/master/doc/gflags.html)を読んでください．


# 導入

Macならばbrewで一発で入ります．

が，**CMake関連のファイルが入らないっぽい**ので，素直にダウンロードしてビルドします．
gflags自体もcmakeで管理されています．

ダウンロードは[こちらから](https://github.com/schuhschuh/gflags/releases) 



# リンク

`CMake`を使えば簡単にリンクできます．

```CMakeLists.txt
cmake_minimum_required(VERSION 2.8)

find_package (gflags REQUIRED)
include_directories (${gflags_INCLUDE_DIR})
   
add_executable (hoge main.cc)
target_link_libraries (hoge gflags)
```

# サンプル

テキストファイルに文字列を追加するプログラムを考えます．

## 実行

```
./hoge --filename foobar.txt --append_text "aaa"
./hoge --filename foobar.txt --append_text "bbb"
./hoge --filename foobar.txt --read
```

## 結果

```
aaa
bbb
```

## コード

```main.cc

#include <gflags/gflags.h>
#include <iostream>
#include <fstream>
#include <string>

//フラグの定義
DEFINE_string(filename, "", "file name to write or read");
DEFINE_bool(read, false, "read file and show text");
DEFINE_string(append_text, "", "append text to the file");

/**
 * ファイルの内容を標準出力する
 */
int read_text(const std::string& filename) {
  std::ifstream ifs(filename.c_str());
  if (!ifs) {
    std::cerr << "Failed to open " << filename << std::endl;
    return 1;
  }
  std::string buf;
  while (std::getline(ifs, buf)) {
    std::cout << buf << std::endl;
  }
  return 0;
}

/**
 * ファイルに文字列を追加する
 */
int append_text(const std::string& filename, const std::string& append_text) {
  std::ofstream ofs(filename.c_str(), std::ios::app);
  if (!ofs) {
    std::cerr << "Failed to open " << filename << std::endl;
    return 1;
  }
  ofs << append_text << std::endl;
  return 0;
}

/** メイン関数 */
int main(int argc, char* argv[]) {
  // gflagsで定義したフラグを取り除く
  gflags::ParseCommandLineFlags(&argc, &argv, true);

  int return_value = 0;

  //フラグごとの処理
  if (!FLAGS_filename.empty()) {
    if (FLAGS_read) {
      return_value = read_text(FLAGS_filename);
    } else {
      return_value = append_text(FLAGS_filename, FLAGS_append_text);
    }
  } else {
    std::cerr << "Error: Use --filename flag to give a file name" << std::endl;
    return_value = 2;
  }

  return return_value;
}

```

# 超適当な解説

フラグは，以下の６種類あります．

- `DEFINE_bool`: boolean
- `DEFINE_int32`: 32-bit integer
- `DEFINE_int64`: 64-bit integer
- `DEFINE_uint64`: unsigned 64-bit integer
- `DEFINE_double`: double
- `DEFINE_string`: C++ string

定義は，大体こんな感じ↓

```
DEFINE_型(フラグの名前, デフォルトの値, ヘルプの説明)
```

フラグは`FLAGS_フラグの名前`で普通に変数として使えます．

```
gflags::ParseCommandLineFlags(&argc, &argv,
true)
```

としておくと，`gflags`で定義したフラグをコマンドライン引数から取り除くことができます．なので，`getopt`を使っていたコードに`gflags`を後で追加した場合でも互換性を保つことが出来るかと思います．

ヘルプは `./hoge --help`で出てきます．

# 最後に

他にも色々あるけどドキュメント読んでください．
（Djangoメモ）データベースにMySQLを設定

Vagrant環境で実験。MySQLは既に入っていて、[Djangoのテストページまで表示できている](http://qiita.com/juniskw/items/b9278557daf471a89205)のが前提。

まずsettings.pyのデータベースをMySQLに。

```py:settings.py
DATABASES = {
     'default': {
         'ENGINE': 'django.db.backends.mysql',
         'NAME': 'myproject',
         'USER':'vagrant',
         'PASSWORD':'**************',
         'HOST':'',
     }
 }
```

で、

```
python manage.py sql [APPNAME]
```

すると以下のエラーとなり上手くいかない。

>django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module: No module named MySQLdb

**MySQLdb** っていうモジュールが無いよと言われているわけだが、```pip search MySQLdb```で見つからないので少しハマった。そこでググる。

・・・これかな？
http://stackoverflow.com/questions/15312732/django-core-exceptions-improperlyconfigured-error-loading-mysqldb-module-no-mo

とりあえずそれらしいものを実行。

```
pip install mysql-python
```

だがこのインストールがそもそも失敗してしまう。

>UnicodeDecodeError: 'ascii' codec can't decode byte 0xe3 in position 40: ordinal not in range(128)

おまけに何を言われているのかよく分からない（文字コード？）ので、ノータイムで即ググる。

・・・・これ？
http://momijiame.tumblr.com/post/30661437311/centos-6-3-pip-mysql-python-mysqldb

ということで真似してみる。

```
sudo yum -y install python-devel mysql-devel
```

ちなみにオプションの **-y** は全部YESにしますよってこと。

>Complete!

インストール完了。そこでもう一度。

```
pip install mysql-python
```

>Successfully installed mysql-python
Cleaning up...

お、できた。一応```pip freeze```で確認したが問題なし。

満を持して最初のコマンドに戻ってみる。

```
python manage.py sql [APPNAME]
```

>django.db.utils.OperationalError: (1049, "Unknown database 'myproject'")

あれ？できないじゃないか・・・・と思ったがよく考えたらまだデータベースを作っていないからそのせいだった。 **生成はMySQL側でやらないといけない** 。

実は **MySQL** の使い方はまだちょっとしか勉強していなくてしかも勉強したことも忘れていたので[過去の自分](http://qiita.com/juniskw/items/a8a2400d93a9f0fabfa4)に教えてもらった。彼もまだほんの触りしかやっていなかったようだが、ひとまず **データベースの生成まで出来ればあとはDjangoが上手いことやってくれる** のである意味これでちょうどいい気もする。

三度目の正直。

```
python manage.py sql [APPNAME]
```

上手くいった。
あの娘が一番可愛い

　[アニメキャラ（個別）板](http://hello.2ch.net/anichara2/)の「○○○は○○○可愛い」スレで、パート数が一番多いのは誰なのでしょう。気になります。

```rust
extern crate encoding;
extern crate hyper;
extern crate regex;
extern crate unicode_normalization;

use std::io::prelude::*;
use encoding::{DecoderTrap, Encoding};
use encoding::all::WINDOWS_31J;
use hyper::client::Client;
use regex::Regex;
use unicode_normalization::UnicodeNormalization;

fn main() {
  let url = "http://hanabi.2ch.net/anichara2/subback.html";
  let mut response = match Client::new().get(url).send() {
    Ok(response) => response,
    Err(error) => panic!(error.to_string()),
  };

  let mut buffer = Vec::new();
  let _ = response.read_to_end(&mut buffer);

  let source = match WINDOWS_31J.decode(&buffer, DecoderTrap::Strict) {
    Ok(result) => result.nfkc().collect::<String>(),
    Err(error) => panic!(error.to_owned()),
  };

  let re = Regex::new(r"【(.+?)】(.*(?:かわいい|カワイイ|可愛い|ｶﾜｲｲ))\D*(\d*).*\[").unwrap();
  let mut titles =
    re.captures_iter(&source)
    .map(|x| (
        x.at(3).and_then(|x| x.parse::<usize>().ok()).unwrap_or(1),
        x.at(2).map(str::trim).unwrap_or(""),
        x.at(1).map(str::trim).unwrap_or("")
    ))
    .collect::<Vec<_>>();

  titles.sort_by(|a, b| b.0.cmp(&a.0));

  for x in titles.iter() {
    println!("{:3} {}（{}）", x.0, x.1, x.2);
  }                     
}
```

```
344 巴マミはﾏｽｹｯﾄ銃可愛い（まどか☆マギカ）
211 暁美ほむらはほむほむ可愛い（まどか☆マギカ）
191 美樹さやかはドーナツ可愛い（まどか☆マギカ）
168 高坂桐乃 こんなに可愛い（俺妹）
149 ユーノ司書長はｶﾜｲｲ（ﾘﾘｶﾙなのは）
147 佐倉杏子はロールケーキ可愛い（まどか☆マギカ）
136 柊つかさはハードル全倒し可愛い（らき☆すた）
131 鹿目まどかはシルクハット可愛い（まどか☆マギカ）
117 エイラはラジオパーソナリティｶﾜｲｲ（ｽﾄﾗｲｸｳｨｯﾁｰｽﾞ）
 85 南ことりちゃんはアイスクリーム可愛い（ラブライブ！）
 67 柊かがみも10周年かわいい（らき☆すた）
 62 C.C.は猫耳ギタリスト可愛い（ｺｰﾄﾞｷﾞｱｽ）
 53 ｹﾞﾙﾄﾙｰﾄちゃんが来た！ｶﾜｲｲ（ｽﾄﾗｲｸｳｨｯﾁｰｽﾞ）
 50 宮永咲は予感、咲きました！ｶﾜｲｲ（咲-Saki-）
 40 長谷川平乃さんは残り10段かわいい（ﾐﾙｷｨﾎｰﾑｽﾞ）
 39 東條希はオバケが来てもウチが守るよ可愛い（ラブライブ！）
 37 佐天涙子はお風呂あがり可愛い（とある科学の超電磁砲S）
 36 アスナはお風呂あがりかわいい（ソードアート・オンライン）
 35 銀ちゃんは対価かわいい（DTB）
 34 赤座あかりは主人公かわいい（ゆるゆり）
 34 南春香は姉様ｶﾜｲｲ（みなみけ）
 34 サーニャはふわふわ銀髪ｶﾜｲｲ（ｽﾄﾗｲｸｳｨｯﾁｰｽﾞ）
 34 赤座あかりは主人公かわいい（ゆるゆり）
 33 南春香は姉様ｶﾜｲｲ（みなみけ）
 32 星空凛はシャボン玉キック可愛い（ラブライブ！）
 32 ペリーヌは名領主ｶﾜｲｲ（ｽﾄﾗｲｸｳｨｯﾁｰｽﾞ）
 31 見崎鳴ちゃんはミステリアスだけど実はお茶目かわいい（Another）
 30 安城鳴子は高校デビューｶﾜｲｲ（あの花）
 30 南夏奈は△かわいい（みなみけ）
 28 リネットはチアコスで応援カワイイ（ｽﾄﾗｲｸｳｨｯﾁｰｽﾞ）
 27 矢澤にこはにこにー飯店看板娘可愛い（ラブライブ！）
 26 矢澤にこはスク水ぺったんかわいい（ラブライブ！）
 26 先導アイチは頬染めｶﾜｲｲ（ｶｰﾄﾞﾌｧｲﾄ!!ｳﾞｧﾝｶﾞｰﾄﾞ）
 25 園田海未ちゃんはラブアローシュート可愛い（ラブライブ！）
 25 イカ娘かわいい（侵略！イカ娘）
 25 シャロはかわいい（ミルキィホームズ）
 24 小泉花陽はごはん！かわいい（ラブライブ！）
 24 宮藤芳佳は2014年も可愛い（ｽﾄﾗｲｸｳｨｯﾁｰｽﾞ）
 23 丹生谷森夏はでいなばよって☆ﾏｻﾘﾓ可愛い（中二病でも恋がしたい）
 23 小泉花陽はごはん！かわいい（ラブライブ！）
 23 石動乃絵は赤いハーフコート可愛い（true tears）
 23 小泉花陽はごはん！かわいい（ラブライブ！）
 21 三日月夜空は煌のﾀﾞｰｸﾅｲﾄｶﾜｲｲ（僕は友達が少ないNEXT）
 20 坂本美緒はわっはっはｶﾜｲｲ（ｽﾄﾗｲｸｳｨｯﾁｰｽﾞ）
 20 柏崎星奈は巨乳ｶﾜｲｲ（僕は友達が少ないNEXT）
 19 遊佐恵美は勇者可愛い（はたらく魔王さま！）
 19 原村和はＪ→Ｋカップｶﾜｲｲ（咲-Saki-）
 19 相生祐子は朝も早よから可愛い（日常）
 18 絢瀬絵里ちゃんと2人っきりの海水浴かわいい（ラブライブ！）
 18 新子憧は誕生日が5月17日かわいい（咲-Saki-）
 ...
```

楽しい！ ₍₍ (ง╹◡╹)ว ⁾⁾

- [アニメキャラ（個別） - 2ch 掲示板](http://hello.2ch.net/anichara2/)
ClojureScript入門

ClojureScriptで二週間ぐらい遊んでるのでメモ


## セットアップ

まずは leiningen いれる
macだったらhomebrewで `brew install lein` でいい。

通常のチュートリアルでは`lein new app-name` でプロジェクト生成して、cljsbuildプラグインセットアップしてビルドする。

が、今回は練習用スケルトン作ったので使うといい。

https://github.com/mizchi-sandbox/cljs-webapp-skeleton


bowerとgulpでプロジェクト管理してある。

```
git clone https://github.com/mizchi-sandbox/cljs-webapp-skeleton
$ npm install -g bower
$ npm install
$ bower install
$ lein cljsbuild once
$ gulp watch
```

`localhost:3000` で開く


## REPL

殴って確かめるのが速い。

```
$ lein trampoline cljsbuild repl-rhino
> 
```

## 自動監視とコンパイル

ClojureScriptにおいては自動監視はただの監視以上の意味がある。

project.cljのcljsbuild

```lisp
  :cljsbuild {
    :builds [{
        :source-paths ["src"]
        :compiler {
          :output-to "public/main.js"
          :optimizations :none
          :pretty-print true}}]})
```

コンパイル

```
$ lein cljsbuild once
```

とするところを onceでなくautoにする

```
$ lein cljsbuild auto
```

ClojureScriptで一番重いのはJVMの立ち上げとClojure処理系そのものの起動で、autoだと処理系立ち上げっぱなしのホットスタンバイになるので、速い。
どれぐらい速いかというと、HelloWorldのプロジェクトで最初の一回は7秒ぐらいだが、以降0.4秒ほどになる。
自分は、ClojureScriptを今まで本気で使ってなかった理由がこのコンパイル速度だったので、速度大事。

## Hello World!

console.log でダンプしてもいいのだが、 clojureのprintlnを使うと構造体をいい感じでpretty-printしてくれる。
printlnを使うには一行おまじないが必要。

src/main.cljs

```lisp
(ns main)
(enable-console-print!)
(println "initialized")
```

名前空間を深くするお約束に従ってない。とりあえず適当に触る分には大丈夫。

## メンバアクセスと関数呼び出し

JSでよく書くやつ

```javascript
window.addEventListener("load", function(){
  console.log("hello");
});
```

これをclojurescriptで書く

```lisp
(.addEventListener js/window "load" (fn []
  (.log console "hello"))
```

`..`で深いプロパティフィールドにアクセスする

```lisp
(.. js/window -document -body)
```

代入

```javascript
window.onload = function(){}
  console.log("hello");
});
```

```lisp
(!set (.-onload js/window) (fn [] (.log console "hello"))
```

あとはまあなんとかなるのでは適当

## 外部モジュールの読み込み

src/hellocljs/foo.cljs

```lisp
(ns hellocljs.foo)
(defn hello [] (println "hello"))
```

fooに名前をつけて読み込む

```
(ns hellocljs.core
  (:require [hellocljs.foo :as foo]))
(foo/hello)
```

helloだけ呼び出す。

```
(ns hellocljs.core
  (:use [hellocljs.foo :only [hello]]))
(hello)
```

## マクロ

拡張子cljsの中でマクロを書くことは許されていない

debug.clj

```lisp
(ns hellocljs.debug)
(defmacro debug [expr]
  `(let [result# ~expr]
    (println "Evaluatng:" '~expr)
    (println "Result:" result#)
    result#))
```

読み込む

```lisp
(ns hellocljs.core
  (:require-macros
    [hellocljs.debug :as debug]
    ))

(debug/debug (+ 3 3))
;Evaluatng: (+ 3 3)
;Result: 6
```

## plugin

ここらへん使ってる

- [swannodette/om](https://github.com/swannodette/om "swannodette/om")
- [clojure/core.async](https://github.com/clojure/core.async "clojure/core.async")
- [ibdknox/jayq](https://github.com/ibdknox/jayq "ibdknox/jayq")

自分はomを使いたいがためにclojurescript始めたと行っても良い。
Undefinedオブジェクトのプロパティを取得しようとするとTypeErrorが出力される


JavaScriptでUndefind値を持ったオブジェクトに対し、
更にそのプロパティを取得しようとするとTypeErrorを吐かれてしまう。

従って、まずそのオブジェクトが存在しているか (Undefinedになっていないか)
確認してから、プロパティを取得するやり方が厳密には望ましい。

これを完結に書くと、

```
person.student && person.student.male
```

といった具合になる。
【codeigniter】modelメソッドチェーンでアクティブレコードを使うのが便利！


最近codeigniterを利用し始めたので、
codeigniterのモデルからメソッドチェーンでアクティプレコードを利用する方法をご紹介します。

記載する場所は /application/core/MY_Model.php がよろしいかと思います。



```php
class MY_Model extends CI_Model
{
	public function __construct() {
		parent::__construct();
	}


	function __call($name, $arguments)
	{
		call_user_func__array([$this->db, $name], $arguments);
		return $this;
	}
}
```

最も簡単に実装してたったこれだけ。

何をしているのか説明。

1. ```__call``` はマジックメソッドで、そんなメソッドねーよ！という状態の時に呼び出されるものです。

1. call_user_func_arrayで動的にメソッドを実行してます。引数も動的
に取れるすぐれもの！

1. 最後に$thisを返します。

使用例です。

```php
$users = $this->User
			->select('name', 'password')
			->where('id', $id)
			->get_all();
	
```


と、こんな具合に指定idのUserテーブルから1行で取り出せます！
```get_all```は拡張なのでアクティブ・レコードなら```get```、```result_array```等を使ってください。
需要があればそちらも記事にします！


```$this->db``` にもメソッドがない場合はwarningが出ます。
正しくエラー処理をしたい場合は```call_user_func```がfalseを返すので
```trriger_error```または例外を投げて処理をしましょう！


以上です。
Hubot | 自作Script | gitlab_api_sample.coffee - GitLab API を利用した Hubot - GitLab - Kandan の連携を検証するサンプル

# Hubot | 自作Script | gitlab_api_sample.coffee - GitLab API を利用した Hubot - GitLab - Kandan の連携を検証するサンプル

## 概要
gitlab_api_sample.coffee - GitLab API を利用した Hubot - GitLab - Kandan の連携を検証するサンプルを作成します。

## 仕様
### filename
gitlab_api_sample.coffee

### 機能
GitLabに登録しているユーザーをすべて出力します

## ソースコード

~~~coffeescript:gitlab_api_sample.coffee
# Description
#   Output GitLab Users
#
# Dependencies:
#   None
#
# Configuration:
#   None
#
# Commands:
#   hubot gitlab users ... - Output gitlab users.
gitlab = (require 'gitlab')
  url:   'http://your_gitlab'
  token: 'your_token'

module.exports = (robot) ->

  robot.respond /gitlab users/i, (msg) ->
    gitlab.users.all (users) ->
      msg.send "GitLab Users | id:#{user.id}: , name:#{user.name}" for user in users
~~~

## 前提
* Kandan 1.1
* Hubot 2.4.7
* GitLab 7.0

node.js の GitLab api はインストール済みとする

~~~
npm install gitlab
~~~

## 手順
### gitlab_api_sample.coffee を配置

gitlab_api_sample.coffee を hubot サーバーの scripts 配下に保存する。

### Hubot の再起動
### 確認
* Hubot に　`@hubot gitlab users` とメッセージを送ります

* 全ユーザーが表示されました
※画像は1ユーザー分ですが、実際には全ユーザー表示されます

![gitlab_user.png](https://qiita-image-store.s3.amazonaws.com/0/43480/9e737f50-7dac-54db-d875-8d71f00c8cab.png)

## 補足
今のところ、 npm で公開したりする予定はないので適当にGitHubに突っ込んでおきます。
https://github.com/tbpgr/hubot_scripts

## 参照
https://github.com/moul/node-gitlab
osxでvagrantのpluginがインストールできない

インストールしようと試したのは以下の２つ。

  - vagrant-digitalocean
  - vagrant-vbguest

以下のようなエラーが発生してbundlerが途中で止まる。

```shell-session
Bundler, the underlying system Vagrant uses to install plugins,
reported an error. The error is shown below. These errors are usually
caused by misconfigured plugin installations or transient network
issues. The error from Bundler is:

An error occurred while installing nokogiri (1.6.3.1), and Bundler cannot continue.
Make sure that `gem install nokogiri -v '1.6.3.1'` succeeds before bundling.
```

`NOKOGIRI_USE_SYSTEM_LIBRARIES=1`を使った方法がうまくいかなかったので、githubのフォーラムを参考に`gemspec`を編集。

```shell-session
sudo vi /Applications/Vagrant/embedded/gems/specifications/vagrant-1.6.3.gemspec
```

```rb
  if s.respond_to? :specification_version then
    s.specification_version = 4
    s.add_dependency(%q<nokogiri>, ["= 1.6.2.1"]) #これを追加
```

参考
https://github.com/mitchellh/vagrant/issues/3769
stack machine アセンブラ

#stack machine ニーモニック
```
push "x"    スタックに"x"を積む
add         スタックの二番目と一番目を文字列連結
+           スタックの二番目と一番目を足す
-           スタックの二番目から一番目を引く
/           スタックの二番目を一番目で割る
*           スタックの二番目と一番目を掛ける
set         スタックの二番目を変数として、一番目の値をセット
get         スタックの一番目を変数として、その値をセット
++          スタックの一番目をインクリメント
<           スタックの二番目を一番目で比較
>           スタックの二番目を一番目で比較
!           スタックの一番目を反転
if  skip    スタックの一番目が真ならskipに飛ぶ
jp loop     loopに飛ぶ
int         スタックの一番目を整数化
end         停止

```
#実行環境
webで実行
[jsdo ohisama1](http://jsdo.it/ohisama1/5rr0)
<uses-permission>設定の罠

# \<uses-permission\>
Androidアプリが特定の機能を**利用する**場合、`AndroidManifest.xml`にその機能の一覧を\<uses-permission\>として記述します。
たとえば、マイクによる録音を行うアプリの場合、以下の様な記述が必要となります。

```AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.nein37.kanidaisuki" >
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
```

この\<uses-permission\>の定義はアプリの中で使用する全ての機能に関して記述します。
\<uses-permission\>の内容はPlayストアのアプリページに記載され、その機能が重要なものであればインストール時に権限を許可しても良いかを確認するダイアログが表示されます。

# \<uses-feature\>
Androidアプリが特定の機能を**必要とする**場合、`AndroidManifest.xml`にその機能の一覧を\<uses-feature\>として記述します。
必要とするというのは、例えばOpenGL ESの特定のVersion以降が必要であるとか、カメラ機能が必須であるという場合です。
たとえば、マイク機能が必須であるアプリは以下の様な記述が必要となります。
(この記述だけでは録音機能を使うことはできませんが、マイクは必須となります)

```AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.nein37.kanidaisuki" >
    <uses-feature android:name="android.hardware.microphone" android:required="true" />
```

この\<uses-feature\>情報はPlayストアには記載されません。
\<uses-feature\>を満たしている端末の場合、Playストア上から何の問題もなくインストールされます。
このとき、\<uses-permission\>と違い、特に確認ダイアログなどは表示されません。
\<uses-feature\>を満たしていない端末の場合、そもそもアプリがPlayストア上に表示されません。
ブラウザ版から該当端末にインストールしようとした場合でも「お使いの端末にはインストールできません」という旨のメッセージが表示され、インストールすることができません。

# 2つの設定の違い
\<uses-permission\>と\<uses-feature\>の違いは、それがチェックされるタイミングになります。
\<uses-permission\>がアプリを許可するかどうかをユーザに判断させているのに対し、
\<uses-feature\>はそもそもアプリがインストール可能かどうかをPlayストアが判定しています。
\<uses-feature\>の設定を失敗すると潜在的なアプリユーザを狭めてしまうので、要注意です。

# \<uses-permission\>の罠
\<uses-permission\>を設定した時、その機能が参照するハードウェア機能の\<uses-feature\>が暗黙的に設定されます。

```xml
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
```

上記の設定は、Playストア上では以下のように解釈されます。

```xml
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-feature android:name="android.hardware.microphone" android:required="true" />
```

通常、上記のような場合はあまり問題になることはありません。
録音機能を利用するためにマイクが必要なのは当然だからです。
しかし、次の様な場合もあります。

> このアプリはメモ録音と文字起こしのためにマイク機能を利用します。**しかし必須ではありません。**
> マイクがない端末でもキーボードによる文字入力で代替したいです。

この時、\<uses-permission\>だけ設定してしまうと、\<uses-feature\>も補完されてしまい、マイクがない端末にはインストールできなくなってしまいます。
このように\<uses-permission\>が必須機能でない場合、以下のように記述します。

```xml
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-feature android:name="android.hardware.microphone" android:required="false" />
```

これでこのアプリにマイクは必須ではないと宣言することができました。
マイクのない端末でもインストールできるようになります。
ただし、実行時にマイクがあるかどうかを判定する必要があるので注意が必要です。

# おまけ
\<uses-permission\>と\<uses-feature\>の対応表はAndroid Developersの以下のページに書いてあります。
http://developer.android.com/guide/topics/manifest/uses-feature-element.html#permissions
Windows 8.1 で Apple Wireless Keyboard (US) を使ってみる

忘れるのでメモ

# Apple Wireless Keyboard
1. Bluetooth でペアリング
2. BootCamp のドライバをインストール
3. fn を押さなくてもファンクションキーが使えるようにする
【HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\KeyMagic】
の【OSXFnBehavior】(REG_BINARY)を【00】に変更．

# Caps lock を Control に
【HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout】
に【Scancode Map】(REG_BINARY) 

```
【00,00,00,00,00,00,00,00,02,00,00,00,1d,00,3a,00,00,00,00,00】
```

を追加．

# 右 Alt(Option) を PrintScrenn に
(2014/10/03 追加)  
スクショを取るのに PrintScreen がないと不便なので追加することに．
個人的に右 Alt キーを使わないので割当る．

```
【00,00,00,00,00,00,00,00,02,00,00,00,1d,00,3a,00,00,00,00,00】
```

を

```
【00,00,00,00,00,00,00,00,03,00,00,00,1d,00,3a,00,37,e0,38,e0,00,00,00,00】
```

に変更する．
以前使っていたアプリケーションが，Windows 8.1 に対応していないようなので，`GreenShot` を使ってみる．

# キーボードの配列を修正
【HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\i8042prt\Paramaters】を下記の様に変更．


| 値の名前                    | 値のデータ    | 
|:---------------------------|:------------|
| LayerDriver JPN            | kbd101.dll  |
| OverrideKeyboardIdentifier | PCAT_101KEY |
| OverrideKeyboardSubtype    | 0           |
| OverrideKeyboardType       | 7           |

[（引用元）](http://engineermemo.wordpress.com/2013/03/03/キーボードの配列を日本語英語に変更/)

# 動作の確認
再起動して動作を確認．
* command → Win
* delete → BackSpace
* fn + delete → Delete
* option + ` → 入力切替
sudo時にPATHを引き継ぐ方法


## 背景
sudoしたときにせっかく設定した`ruby`やら`rubygem`が見つからないよって、言われて嫌な気持ちになったので対処方法を残しておく、

以下環境情報。

* ubuntu: 12.04

## デフォルト設定
デフォルトの設定では`sudo`実行ユーザの`PATH`は引き継がれずに、ユーザ固有の`PATH`に指定したコマンドは失敗する。

```cmd:path_not_found
$ gem list | head -5
bigdecimal (1.2.4)
fluent-logger (0.4.9)
hirb (0.7.2)
httpclient (2.3.4.1)
io-console (0.4.2)
$ sudo gem list | head -5
sudo: gem: command not found
$ env | grep PATH
PATH=/usr/local/rbenv/shims:/usr/local/rbenv/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
$ sudo env | grep PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
```

これはデフォルトの`/etc/sudoers`が以下のように`security_path`を指定して`PATH`を固定しているため。

```file:/etc/sudoers
#
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#

Defaults	env_reset
Defaults	secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

# Host alias specification
```

## 設定変更
`visudo`コマンドで以下のように`secure_path`をコメントアウトして、`env_keep`に`PATH`を追加すれば、`sudo`実行ユーザが使っていたコマンドが使えるようになる。

```cmd:visudo(/etc/sudoers)
#
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#

Defaults	env_reset
#Defaults	secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
Defaults	env_keep += "PATH"
```

`env_keep`には`PATH`だけでなく環境変数で指定しているものはなんでも入れて良さげ。

ここで注意することは、`PATH`を引き継いでしまうと`security_path`で指定されていた`/sbin`などの管理系のコマンドの`PATH`が設定されなくなってしまうので注意。

## 変更確認
以下のコマンドで`PATH`が引き継がれていることを確認。

```cmd:check_path
$ env | grep PATH
PATH=/usr/local/rbenv/shims:/usr/local/rbenv/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
$ sudo env | grep PATH
PATH=/usr/local/rbenv/shims:/usr/local/rbenv/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
$ 
$ sudo gem list | head -5
bigdecimal (1.2.4)
fluent-logger (0.4.9)
hirb (0.7.2)
httpclient (2.3.4.1)
io-console (0.4.2)
$ 
```

おしまい。
i8080 アセンブラ　その3

#fizzbuzz

```
        org 08000h
;fizz buzz test
        mvi a, 00h
        sta 81e0h
        sta 81e1h
        mvi a, 1
loop:   call gati
        inr a
        cpi 100
        jnz loop
        hlt
;
gati:   push psw
        push psw
        push psw
loop1:  cpi 15
        jc skip3  
        sui 15
        jmp loop1
skip3:  cpi 0
        jnz skip4
        call fibu
        jmp skip9
skip4:  pop psw
loop2:  cpi 5
        jc skip6
        sui 5
        jmp loop2
skip6:  cpi 0
        jnz skip7
        call buzz
        jmp skip10
skip7:  pop psw
loop3:  cpi 3
        jc skip8
        sui 3
        jmp loop3
skip8:  cpi 0
        jnz skip12
        call fizz
        jmp skip11
skip9:  pop psw
skip10: pop psw  
skip11: pop psw
        ret
skip12: pop psw
        call print
        ret  
;
fizz:   mvi b, 66h
        call echo
        mvi b, 69h
        call echo
        mvi b, 7ah
        call echo
        mvi b, 7ah
        call echo
        mvi b, 20h
        call echo   
        ret
;
buzz:   mvi b, 62h
        call echo
        mvi b, 75h
        call echo
        mvi b, 7ah
        call echo
        mvi b, 7ah
        call echo
        mvi b, 20h
        call echo
        ret    
;
fibu:   mvi b, 66h
        call echo
        mvi b, 69h
        call echo
        mvi b, 7ah
        call echo
        mvi b, 7ah
        call echo
        mvi b, 62h
        call echo
        mvi b, 75h
        call echo
        mvi b, 7ah
        call echo
        mvi b, 7ah
        call echo
        mvi b, 20h
        call echo
        ret
;
print:  push psw
        mvi d, 0
calc:   cpi 10
        jc skip  
        sui 10
        inr d
        jmp calc
skip:   mov e, a
        mov a, d 
        cpi 0
        jz skip2
        adi 30h
        mov b, a
        call echo
skip2:  mov a, e
        adi 30h
        mov b, a
        call echo
        mvi b, 20h
        call echo
        pop psw
        ret
;
echo:   push psw
        lda 81e1h
        mov l, a
        lda 81e0h
        mov h, a
        cpi 40
        jc pass
        mov a,l
        inr a
        mov l, a
        mvi a, 0
        mov h, a
pass:   mov a, h
        out 92h
        inr a
        sta 81e0h
        mov a, l
        out 93h
        sta 81e1h
        mov a, b
        out 94h
        pop psw
        ret
```
#実行環境
エミュレータは、z80です。
webで実行
[jsdo ohisama1](http://jsdo.it/ohisama1/fh9w)
2つ目のiOSアプリケーションをswiftに書き換えてみた

[前回](http://qiita.com/bnrh29/items/469c92bb545194ac844a)は、「初めてのiOSアプリケーション」をswiftに書き換えてみましたが

今回は「2つ目のiOSアプリケーション」をswiftに書き変えてみました。
https://github.com/bnrh29/BirdWatchSwift


AutoLayout周りにはまってしまい下記の記事を参考にさせてもらいました。
[2つ目のIOSアプリケーションのAutoLayout周りXCode5.1に読みかえ](http://qiita.com/Hoshi_7/items/03cfb945d55014d0bdb4)
ASP.NET MVC でViewの検索先をシンプルに

Razor 専用で良いし、VBとか使わない。
ついでに、Shareだと探すのが面倒なので、_Share で。
って人向け。

```lang:Global.asax.cs
        protected void Application_Start()
        {
            ...
            ViewEngines.Engines.Clear();
            ViewEngines.Engines.Add(new RazorViewEngine {
                ViewLocationFormats = new[] {
                    "~/Views/{1}/{0}.cshtml",
                    "~/Views/_Shared/{0}.cshtml"
                },
                AreaViewLocationFormats = new[] {
                    "~/Areas/{2}/Views/{1}/{0}.cshtml",
                    "~/Areas/{2}/Views/_Shared/{0}.cshtml"
                }
            });
        }
```

わざわざ別クラスを作る必要はないよねってことで修正(2016.11.30)
「あれ？このファイルってどのブランチで追加したんだっけ？」

コマンド一発じゃないけど。

```:sh
$ git log --reverse path/to/file
commit xxxxxxxxxxxxxxxxx
Author: aaaa...
Date:   bbbbbbb...
...
$ git name-rev xxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxx remotes/origin/found-out-branch-name
```
i8080 アセンブラ　その2

#画面にキャラクタを表示
```
        org 08000h
;screen test
        mvi a, 00h
        sta 8060h
        sta 8061h
        mvi a, 20h    
loop:   mov b, a
        call echo
        inr a
        cpi 80h
        jnz loop
        hlt
echo:   lda 8061h
        mov l, a
        lda 8060h
        mov h, a
        cpi 40
        jc pass
        mov a,l
        inr a
        mov l, a
        mvi a, 00h
        mov h, a
pass:   mov a, h
        out 92h
        inr a
        sta 8060h
        mov a, l
        out 93h
        sta 8061h
        mov a, b
        out 94h
        ret

```

#実行環境
メモリは、0x8000から0x8fffです。
i/oの0x92,0x93,0x94に出力すると、
画面の横（0x92）、縦（0x93）に
（0x94）を表示します。
webで実行
[jsdo ohisama1](http://jsdo.it/ohisama1/vvxJ)
Selenium でファイルのダウンロード

自動的に指定したフォルダにファイルをダウンロードするように設定する。

PhantomJS ではできそうにないので Firefox Driver で。

```scala
// プロファイルを設定してドライバを作る
private def createDriver(outputDirPath: String): FirefoxDriver = {
  val profile = new FirefoxProfile()
  profile.setPreference("browser.download.folderList", 2)
  profile.setPreference("browser.download.dir", outputDirPath)
  profile.setPreference("browser.download.useDownloadDir", true)
  profile.setPreference("browser.helperApps.neverAsk.saveToDisk", "application/octet-stream")
  new FirefoxDriver(profile)
}

// ダウンロード待ち(waitSecondsごとにダウンロードが完了したかチェック)
private def waitDownloading(waitSeconds: Int, outputDirPath: String, downloadFileName: String): Unit = {
  val downloadFilePath = Paths.get(outputDirPath, downloadFileName)
  while (!downloadFilePath.toFile.exists || Files.size(downloadFilePath) == 0) {
    (1 to waitSeconds).foreach { _ =>
      Thread.sleep(1 * 1000)
      print(".")
    }
    println()
  }
}
```
メモ：今日覚えたgit：fileModeとdenyCurrentBranch

メモ：今日覚えたgitのコマンド。

fast-export
-----------

Mercurialからgitのレポジトリに変換する。
https://github.com/frej/fast-export

ただし、defaultが複数あるとかエラーで変換してくれない場合に遭遇。こんなエラーメッセージ。

```shell-session
Error: repository has at least one unnamed head: hg r790
```

オプション```--force```をつけると動いた。

```shell-session
hg-fast-export.sh -r <repo> --force
```

参考：http://learnaholic.me/2013/02/01/converting-mercurial-hg-to-git-repository-on-mac/

fileMode
--------

ファイルパーミッションの変更を無視する方法。異なるOSでレポジトリを操作するとファイルのパーミッションが変わってしまう（SMBでもDropBoxでも経験済み）。そんな時は、

```shell-session
git config core.fileMode false
```

denyCurrentBranch
-----------------

ファイル上でgithubみたいに、pull＆pushしたい場合、一般的にはbareなレポジトリを作成する。そうしたくない場合は、他のリポジトリからのpushを受け取るように設定を変更できる。

```shell-session
git config --add receive.denyCurrentBranch ignore
```

で、それがなぜ危険かは、ここに詳しい。
http://d.hatena.ne.jp/nishiohirokazu/20120416/1334548800
Jenkinsでビルド履歴が非表示になったけどジョブの名前を変えて戻したらなおった

Jenkinsの1.529でビルド履歴が非表示になる問題が発生した。
あまり手間をかけたくなかったのでJenkinsのアップデートは未実施。
とりあえず記録として対応内容を残しておく。

# 発生した現象

* サーバーの再起動直後からJenkinsジョブのビルド履歴がある時点から表示されなくなった。
* 表示されなくなるだけで直にアクセスすれば履歴は残っている

# 対応

* ジョブの名前変更(変更してまた元に戻した) => OK
* Jenkinsの再起動 => 効果無し
* Jenkinsの管理で設定の再読み込みを行う => 効果無し
分割キーボードの通知がよく分からない件

# はじめに

通常、キーボードの表示／非表示の通知はUIWindowのNSNotificationを使う。

```objc
UIKeyboardWillShowNotification
UIKeyboardDidShowNotification 
UIKeyboardWillHideNotification 
UIKeyboardDidHideNotification
```

それぞれWill/Didが取れて、これでキーボードに合わせた処理なんかが行えた。しかし、分割キーボード(iPad)だとこれが通用しないようだ。

今回はiOS 7.1でしか検証できていないので、他のOSではまた変わる可能性がある。


# 各種通知の検証

固定キーボードのとき、分割キーボードのとき、互いを切り替えたときにどのような通知が来るのかを調べた。

## 操作の度に ChangeNotification が来る

固定→分割、分割→固定、移動、表示、非表示などの操作の度に`UIKeyboardWillChangeFrameNotification` `UIKeyboardDidChangeFrameNotification`が来る。
userInfoの中身は`UIKeyboardFrameEndUserInfoKey`以外は何も無い場合もある。

```objc
UIKIT_EXTERN NSString *const UIKeyboardWillChangeFrameNotification  NS_AVAILABLE_IOS(5_0);
UIKIT_EXTERN NSString *const UIKeyboardDidChangeFrameNotification   NS_AVAILABLE_IOS(5_0);
```

それぞれのuserInfoに含まれる内容を出力してみた：

```
// 分割キーボード表示時 UIKeyboardWillChangeFrameNotification
{
    UIKeyboardAnimationCurveUserInfoKey = 7;
    UIKeyboardAnimationDurationUserInfoKey = "0.25";
    UIKeyboardBoundsUserInfoKey = "NSRect: {{0, 0}, {1024, 267}}";
    UIKeyboardCenterBeginUserInfoKey = "NSPoint: {512, 901.5}";
    UIKeyboardCenterEndUserInfoKey = "NSPoint: {512, 634.5}";
    UIKeyboardFrameBeginUserInfoKey = "NSRect: {{768, 0}, {267, 1024}}";
    UIKeyboardFrameChangedByUserInteraction = 0;
    UIKeyboardFrameEndUserInfoKey = "NSRect: {{326, 0}, {267, 1024}}";
}

// 分割キーボード表示時 UIKeyboardDidChangeFrameNotification
{
    UIKeyboardAnimationCurveUserInfoKey = 7;
    UIKeyboardAnimationDurationUserInfoKey = "0.25";
    UIKeyboardBoundsUserInfoKey = "NSRect: {{0, 0}, {1024, 267}}";
    UIKeyboardCenterBeginUserInfoKey = "NSPoint: {512, 901.5}";
    UIKeyboardCenterEndUserInfoKey = "NSPoint: {512, 634.5}";
    UIKeyboardFrameBeginUserInfoKey = "NSRect: {{768, 0}, {267, 1024}}";
    UIKeyboardFrameChangedByUserInteraction = 0;
    UIKeyboardFrameEndUserInfoKey = "NSRect: {{326, 0}, {267, 1024}}";
}

// 分割キーボード移動時 UIKeyboardDidChangeFrameNotification
{
    UIKeyboardFrameEndUserInfoKey = "NSRect: {{245, 0}, {267, 1024}}";
}

// 分割キーボード結合時 UIKeyboardDidChangeFrameNotification
{
    UIKeyboardFrameEndUserInfoKey = "NSRect: {{272, 0}, {352, 1024}}";
}
```

## UIKeyboardFrameChangedByUserInteraction の意味が分からない

「ユーザの操作によるフレーム変更通知」のように読み取れるが、どう操作しても常に値は`0`であるため、これが何を意味するのかが分からない。文書にも特に記載はないので謎のまま。。

## 固定→分割のときは HideNotification が来る

固定キーボードを分割キーボードにしたときには`UIKeyboardWillHideNotification` `UIKeyboardDidHideNotification`が来る。
分割は「キーボードを隠した」という扱いなのだろうか……？

## 分割→固定のときは ShowNotification が来る

分割キーボードを固定キーボードにしたときには`UIKeyboardWillShowNotification` `UIKeyboardDidShowNotification`が来る。
ShowNotification/HideNotificationとは固定キーボードに関する通知で、分割キーボードはこれに関わらないものに思える。


# 分割キーボードの表示／非表示の判定

以上の事から、ChangeNotification に含まれる`UIKeyboardFrameEndUserInfoKey`あたりを利用して、キーボードが画面内にあれば`表示`、否であれば`非表示`と判定すれば良いのか？

なんとも面倒くさくて本当にこれで良いのか不安になってしまう。
Web Componets

# WebComponetsとは？

開発者がHTMLに独自の要素を定義できる仕組みです。
例）見慣れたHTMLタグ

```html:html
<input><img><li><a>
```

例）独自のHTML
このタグを設置すると、GoogleMapが埋め込まれます。
属性値に値を設定することで、マップ情報をカスタムできる。

```html:html
<google-map>
```

WebComponetsを使うことで、HTMLをすっきり書けます。
要するに、***HTML,CSS,JavaScriptをコンポーネント化***する技術を指してます。

# WebComponentsを構成する技術

WebComponentsを構成する技術は大きく４つの技術があります

* Templates
* Shadow DOM
* Custom Elements
* HTML Imports

## Templates

TemplatesはUIパーツのテンプレート。
<template>要素にHTMLとCSSを定義していきます。

## Shadow DOM

ページの他の部分からDOMツリーを分離することができます。
既存のHTML、CSSにはスコープの概念がありませんでしたが、Shadow DOMによって、HTML、CSSにおいてもスコープが使用可能になります。

## Custom Elements

開発者独自のHTML要素をつくることができます。
それに加えて、ほかの要素を継承することができます。
なので、既存のHTML要素を拡張したり、修正したりすることが可能です。

## HTML Imports

HTML Importsは別ファイルとして作成されたHTMLドキュメントを読み込み、再利用するための仕組みです。

# まとめ

この仕組みを使えるようにすることができるのがWebComponentsです。
そして、この技術を使えるのがpolymerです！
[Android]URLエンコードしたjson形式のリクエストパラメータを送信する


リクエスト形式はjsonなんだけど、マルチバイト(っていうか日本語)が入ってくるパターンがググってもイマイチ出てこなかったので忘備録。

```request.java
// リクエストパラメータをセット		
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair(RequestParameters.AUTH_PARAM.toString(), myself.getAuthToken()));
params.add(new BasicNameValuePair(RequestParameters.HITOKOTO.toString(), message));

// URLエンコード
String entityValue = URLEncodedUtils.format(params, HTTP.UTF_8);
StringEntity se = new StringEntity(entityValue, HTTP.UTF_8);
// Content TypeはPOSTのヘッダと同じ			se.setContentType(URLEncodedUtils.CONTENT_TYPE);
url = http://localhost/hogehoge;

// リクエスト
HttpPut put = new HttpPut(url);
put.setEntity(se);

// レスポンス
HttpResponse httpResponse = client.execute(put);
str = EntityUtils.toString(httpResponse.getEntity(), HTTP.UTF_8);
```

マルチバイトを考慮しなければ、StringEntityにjsonなりを直接セットしておけなんだけど、エンコードする場合は、UrlEncodedFormEntityを使うってサラッと書いてる場合が多かった。
それだとjsonじゃなくなるんだよね。。（これも結局jsonのリクエストではないけどｗ
サーバ側が変えられない中で四苦八苦した結果、これでOKが返って来たので良いこととするー

## 参考
http://stackoverflow.com/questions/7915029/how-to-encode-space-as-20-in-urlencodedformentity-while-executing-apache-httppo
Vim初心者がvimrcを育てていく

#はじめに

Vim初心者の自分もやっぱりVimをカスタマイズしたいと考えた。
想定する対象者は

- とりあえずvimとかよくまだわかんないけど、最近の主流っぽいvimmerの環境を整えたい方
- **\[web開発に関わる、vimを複数仮想マシンで使いたい方\]**

(不備があればコメント下さい。)

###前提
- 環境のOSはLinux系(CentOS 6.5系, Ubuntu14系, などなど)
- ここではshellはbashを想定(違ってもできるのでそのへんは適宜読みかえて、どうぞ)
- Gitはある程度すでに使える
- vim7.3以上を導入済み

> [CentOS 6.3にVim 7.3をインストールする](http://qiita.com/muniere/items/0569d05d470c5d3dc51b)


###ここに書いてること
- vimrcをカスタマイズ
- NeoBundleでプラグイン管理
- 設定ファイル郡(dotfiles)をGitで管理

#vimrcを書いていく

特に難しいことはない。
ユーザーディレクトリに`.vimrc`を設置して書いていくだけ。
基本的にはこのファイルでvimをカスタマイズしていくことができる。
例えば、「TabはキモチワルイからTabキーで半角スペース4ずつに展開したい」なら

```vim:.vimrc
"Tabをスペース4つに展開＆Tabの設定
set tabstop=4
set autoindent
set expandtab
set shiftwidth=4
```

みたいに書いておけばそうなってくれる。
ちなみに即時適用したいときはvim起動中に`:source .vimrc`で適用される。
他にもいろいろ設定できるので自分のほしい設定を探してみると育てている感が楽しい。
> [参考：vimの全オプション](http://www15.ocn.ne.jp/~tusr/vim/options.html)

#NeoBundleのプラグイン管理
世界にはたくさんのVim用プラグインがある。
それらを統括的に管理してくれるプラグインがあり、そのひとつがNeoBundleである。
管理と言っても、プラグインによっては個別にコンパイルが必要だったりするので、自分の入れたいプラグインは自分で調べるべき。

まずNeoBundle本体を落としてくる。

```bash:
$ mkdir -p ~/.vim/bundle
$ git clone https://github.com/Shougo/neobundle.vim  ~/.vim/bundle/neobundle.vim
```


本体を落としてきたら`.vimrc`の方にもそれ用に記入

```vim:.vimrc
set nocompatible
if has('vim_starting')
  set runtimepath+=~/.vim/bundle/neobundle.vim
endif
call neobundle#begin(expand('~/.vim/bundle/'))
NeoBundleFetch 'Shougo/neobundle.vim'

" ここに入れたいプラグインを記入

call neobundle#end()
filetype plugin indent on
```

これでVim起動中に`:NeoBundleInstall`で導入は完了。
たとえば、基本的なシンタックスのチェックプラグインを入れたいなら

```vim:.vimrc
NeoBundle 'scrooloose/syntastic'
```
のように記入して、`:NeoBundleInstall`で導入できる。
アップデートしたいなら`:NeoBundleUpdate`で。

> [参考：NeoBundle](https://github.com/Shougo/neobundle.vim)

#dotfilesをGit管理
vimを使いはじめると、あらゆる環境で使えるというvimの強みをいかして自分のカスタマイズをどこでも統一して適用したいと考えはじめるだろう。
(※あらゆる環境と言いつつ今回の設定ではwin環境では使えないと思われます)
ここではdotfilesという名前が示す通り、vim関連のファイルにかぎらず.bashrcや.zshrcなども管理下に含めることでその辺の環境も統一したいという動機が背景にある(このように管理するとき一般的にdotfilesという名称が使われているようだ)。

事前にGithubで新規repositoryをREADME.mdファイル無しで作成しておく。
ホームディレクトリにdotfilesディレクトリを作り、各種ファイルを移動する(今回はvim関連のファイル郡のみ)。
ホームディレクトリにはsymlinkを貼っておく。

```bash:
$ mkdir ~/dotfiles
$ mv ~/.vimrc ~/dotfiles/.vimrc
$ mv ~/.vim ~/dotfiles/vimfiles
$ ln -Fis ~/dotfiles/.vimrc ~/.vimrc
$ ln -Fis ~/dotfiles/vimfiles ~/.vim
$ cd ~/dotfiles
$ git init
```

ここまでしたら、`.gitignore`ファイルを作成して`/vimfiles/bundle/*`を追加しておく。
あとはaddしてcommitしてpushしてください。

他環境で引っ張ってくるときは
1. 自分のdotfilesリポジトリを`clone`
2. neobundleを`vimfiles/bundle`配下に`clone`
3. ホームディレクトリにsymlink作成
4. vimを開いて`:NeoBundleInstall`
5. enjoy

以下とても参考にさせていただきました。
> [いつでもどこでも同じ.vimrcを使う](http://sue445.hatenablog.com/entry/2012/12/06/000026)
> [NeoBundleによるVimプラグイン管理とおすすめプラグイン](http://catcher-in-the-tech.net/1063/)
> 世界のvimmerの先輩方
[MySQL] processlistをgrep


普段よく使う`show processlist`ですが、

```
mysql> show processlist;
+----+------+-----------+-------------+---------+------+-------+-----------------------+
| Id | User | Host      | db          | Command | Time | State | Info                  |
+----+------+-----------+-------------+---------+------+-------+-----------------------+
|  1 | root | localhost | foo_dev     | Sleep   | 3737 |       | NULL                  |
|  3 | root | localhost | bar_dev     | Query   |    0 | init  | show full processlist |
+----+------+-----------+-------------+---------+------+-------+-----------------------+
2 rows in set (0.00 sec)
```

mysqlクライアントから出て、

```
 $ mysqladmin -uroot -hyyyy -pxxxx processlist
```

としても見ることが可能です。

```
 $ mysqladmin -uroot -hxxxx -pyyyy processlist
+----+------+-----------+-----------+---------+------+-------+------------------+
| Id | User | Host      | db        | Command | Time | State | Info             |
+----+------+-----------+-----------+---------+------+-------+------------------+
| 1  | root | localhost | foo_dev   | Sleep   | 3770 |       |                  |
| 6  | root | localhost |           | Query   | 0    | init  | show processlist |
+----+------+-----------+-----------+---------+------+-------+------------------+
```


後は好きなようにgrepすればok。

```
 $ mysqladmin -uroot -hxxxx -pyyyyy processlist |grep localhost |grep -v processlist
| 1  | root | localhost | foo_dev   | Sleep   | 4095 |       |                  |
```
Zabbix 特定のホストの監視を無効化するスクリプト

#やりたいこと
サーバのシャットダウンが正常に行われる際に、zabbixの監視を無効にしたい。
→正常シャットダウンでガタガタ騒ぐなよ！

#がんばったこと
出来るだけ単純化したかった。あまりrubyとか諸々の言語に詳しくないので。。。。

#スクリプト
以下のようなスクリプトになりました。jsonで返ってきたところを無理やり文字抽出しています。他にいい方法があればお教えください・・・・

```
#!/bin/sh

###################################################################
# 宣言部                                                           #
###################################################################

# 変数宣言
zabbix_server=サーバのホスト名orIP

# ホスト名
hostName=エージェントのホスト名

# アクセスURL　（Zabbix フロントエンドのトップ URL）/api_jsonrpc.php
access_URL="http://$zabbix_server/zabbix/api_jsonrpc.php"

# ユーザ情報
strUser=ユーザ名
strPwd=パスワード

###################################################################
# 処理部                                                           #
###################################################################

# ユーザ認証のための情報
json='{"method":"user.login","params":{"user":"'$strUser'","password":"'$strPwd'"},"id":1,"jsonrpc":"2.0"}'

# 認証情報の取得
# 「,」区切り取得後に32桁の認証トークンを取得する
strToken=`curl -s -XGET -H "Content-Type:application/json-rpc" \
                -d $json $access_URL | cut -d "," -f 2 | cut -c 11-42`

#### 個別処理
#１．ホスト名に対応したホストIDを取得する
#無理やり「：」で分割した後に「}」前まで格納
strId=`curl -s -XGET -H "Content-Type:application/json-rpc" \
-d '{"auth":"'$strToken'","id":1,"params":{"output":"hostids","filter":{"host":"'$hostName'"}}, \
"method":"host.get","jsonrpc":"2.0"}' $access_URL | cut -d ":" -f 4 | cut -d "}" -f 1`

#２．ホストを無効化する
#status 0:enable 1:disable
curl -s -XGET -H "Content-Type:application/json-rpc" -d '{"auth":"'$strToken'","id":1,"params":{"hostid":'$strId',"status":1},"method":"host.update","jsonrpc":"2.0"}' $access_URL
```