OmniAICreator/Qiita-1.07M huggingface dataset:
Hubotを使ってSlackからalc（英辞郎）の結果を取得する

# はじめに

普段から[alc](http://www.alc.co.jp/)さんにお世話になっているのですが、ブラウザを開くのが面倒なので大体開いているSlackから取得できるようにHubot Scriptを作りました。

現状、英単語の結果しか返ってきません。

# 実行例

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/3353/1f5a74b6-ccb8-8e87-2647-67836c666c2c.png)

`alc hello` or `hubot alc me hello` と命令すれば反応してくれます。

# インストール方法

[npmに公開済み](https://www.npmjs.com/package/hubot-alc)なので、npmからインストールしてください。

[GitHubにも公開済み](https://github.com/kaneshin/hubot-alc)なので、そちらから直で `hubot/scripts` 配下に入れても構いませんが、下記にある依存モジュールを忘れずに。


## hubot/package.json

`hubot`の `package.json` に下記を追加する。

```coffeescript
"hubot-alc": "0.0.1",
"htmlparser": "1.7.6",
"soupselect": "0.2.0",
```

`hubot-alc` は今回作成したscriptです。

alcのhtmlをパースしているので依存モジュールに `htmlparser` と `soupselect` が存在しています。忘れずに。

## hubot/external-scripts.json

```coffeescript
"hubot-alc"
```

を追加して、使用可能にします。

# おわりに

作ったはいいものの、コマンド打つくらいならブラウザで検索する気がする…

1時間くらいで作ったものなので、改良などのプルリクエストお待ちしています。 https://github.com/kaneshin/hubot-alc
StylusでOldなIEにも対応したOpacity

こんなやつをMixinで書きたい

```lang:css
a:hover {
  filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=50);
  opacity: 0.5;
}
```

通常運転でMixin書こうにも、途中でコロンで区切られてたり、最後は関数になってたりと色々課題が多い。

```lang:stylus
opacity(val)
  filter progid:DXImageTransform.Microsoft.Alpha(Opacity=val * 50);
  opacity val

a
  &:hover
    opacity(0.5)
```

調べたら、やりたいことそのまま[公式](https://learnboost.github.io/stylus/docs/mixins.html)に書いてあった。
`unquote()`を使用するといいらしい。
この例では変数でIEのサポートも管理してくれていて大変便利だと思った。

```lang:stylus
support-for-ie ?= true

opacity(n)
  if(support-for-ie) {
     filter unquote('progid:DXImageTransform.Microsoft.Alpha(Opacity=' + round(n * 100) + ')')
  }
  opacity n

a
  &:hover
    opacity(0.5)
```

```lang:css
//出力結果
a:hover {
  filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=50);
  opacity: 0.5;
}
```
[Rails]modelファイルを全部まとめてdestroy


## やりたいこと（困っていること）

（あんまり無いけど）途中まで作ったRailsアプリのModelを全部削除して、最初から作り直したいことがあった。
そのときのモデル数は15個くらいあって、モデル名をひとつひとつ入力しては削除するのがめんどくさかった。`rails destroy`コマンドの引数に渡せるモデル名が1つだけだったのもツライ。

## やったこと

`Dir.glob`でファイル一覧を取得して、それぞれに`rails destroy`コマンドを投げた。うまくいった。ハッピー！

```ruby:
[~/path/to/rails/app]
% ruby -e 'Dir.glob("app/models/*.rb").each{|f| puts %x|rails destroy model #{File.basename(f, ".rb")}| }'
      invoke  mongoid
      remove    app/models/model01.rb
      invoke  mongoid
      remove    app/models/model02.rb
```

私がORMに`mongoid`を利用しているので`invoke`のところが`mongoid`表記になっているが、`ActiveRecord`でも動作は変わらないはず。

ちなみに、実際にファイルを削除せず、動きを確認するだけにとどめたい場合はrailsコマンド部分の最後に`--pretend`を付けると良い（ドライラン）。

## 環境情報

### OS, Kernel

```:os,kernel
% inxi -SM
System:    Host: hostname Kernel: 2.6.32-504.el6.x86_64 x86_64 (64 bit) Console: tty 1
           Distro: CentOS release 6.6 (Final)
Machine:   System: VMware product: VMware Virtual Platform
           Mobo: Intel model: 440BX Desktop Reference Platform
           Bios: Phoenix v: 6.00 date: 04/14/2014
```

### Ruby, Rails

```:ruby
% ruby -v
ruby 2.1.2p95 (2014-05-08 revision 45877) [x86_64-linux]
```

```:rails
% rake about
About your application's environment
Rails version        4.2.1
Ruby version         2.1.2-p95 (x86_64-linux)
RubyGems version     2.2.2
Rack version         1.5
```
Mac ディスプレイの解像度を上げるアプリ

開発用に２年前に Mac Book Retina 13インチを購入したが、もっと大きい解像度で作業したいと思い
探したアプリです。

[Display Menu](https://itunes.apple.com/jp/app/display-menu/id549083868?mt=12)

上部メニューから選択できて、重宝しています。

![スクリーンショット 2015-05-30 10.38.05.png](https://qiita-image-store.s3.amazonaws.com/0/70430/6bffca28-0d44-93ba-c3cd-baff991742e6.png)
snippet: docker-machine

## docker-machine

```rb
# メモリ3GB, DISK50GB
docker-machine create \
  --driver virtualbox \
  --virtualbox-memory 3000 \
  --virtualbox-disk-size 50000 \
  default

docker-machine ls
docker-machine ip
docker-machine config

docker-machine start
docker-machine stop
docker-machine kill
docker-machine restart
docker-machine rm default

docker-machine ssh
docker-machine scp default:/tmp/a.txt .
docker-machine scp b.txt default:
```

## dockerコマンドで操作

```
val "$(docker-machine env)"
docker ps -a
docker images
docker-compose up
```

## 環境変数を元に戻す

```bash
eval "$(docker-machine env -u)"
```
技術英語 > 3 inches in diameter > 単位概念は無冠詞

直径3インチ
3 inches in diameter

in the diameterと言ってしまいそうだが、単位概念の場合は無冠詞にするとのこと。

3cm in depth
1m in width
5m in height

<hr>
数の数え方は奥が深いので今後調べるが、3cmはthree centimeters、1mはone meterだったと思う。
c# ASP.NET MVCで引数を渡さずに呼び出し元コントローラー名、アクション名をセットする

ASP.NET MVCで独自のログクラスを実装しています。
いままで呼び出し元のコンストラクタでコントローラー名やアクション名をセットしていたのですが、いちいち引数を記述するのが面倒だったのでクラス内部で自動的に取得、セットするようにしました。

コントローラー以外（Global.asax）などから呼ばれた場合は、呼び出し元のクラス名、メソッド名をスタックフレームからセットするようにしています。平凡なネタですいません。

```csharp:Logger.cs
using System.Collections.Specialized;
using System.Diagnostics;
using System.Linq;
using System.Web;
namespace Implem.Sample
{
    public class Logger
    {
        public HttpContext HttpContext;
        public NameValueCollection Form { get { return HttpContext.Request.Form; } }
     
        // 呼び出し元コントローラー名（クラス名）
        public string ClassName;

        // 呼び出し元アクション名（メソッド名）
        public string MethodName;

        // 引数無しで初期化
        public Logger()
        {
            if (HttpContext.Current != null && HttpContext.Current.Session != null)
            {
                HttpContext = HttpContext.Current;

                // Controller以外（Global.asax等）からアクセスされた場合
                // コンテキストからコントローラー名、アクション名をセット
                SetCallerDataByContext();
            }
            else
            {
                // Controller以外（Global.asax等）からアクセスされた場合
                // スタックフレームからクラス名、メソッド名をセット
                SetCallerDataByStackFrame();
            }
        }

        private void SetCallerDataByContext()
        {
            // コンテキスト内のルートデータから取得
            var routeData = System.Web.Routing.RouteTable.Routes
                .GetRouteData(new System.Web.HttpContextWrapper(HttpContext));
            ClassName = routeData.Values["controller"].ToString();
            MethodName = routeData.Values["action"].ToString();
        }

        private void SetCallerDataByStackFrame()
        {
            // コンストラクタ .ctor を除く最新のスタックフレームから取得
            var method = new StackTrace(1, false).GetFrames()
                .Select(o => o.GetMethod()).Where(o => o.Name != ".ctor").First();
            ClassName = method.ReflectedType.Name;
            MethodName = method.Name;
        }
    }
}
```
ansible をソースコードからインストール

ansibleの安定版にて [ec2 module](http://docs.ansible.com/ec2_module.html) でawscliで使ってる profile をセットしても失敗するという現象が発生しました。ちなみに、 [ec2_group module](http://docs.ansible.com/ec2_group_module.html) の方は問題なく動きます。
そこで開発版を試してみたところ上手く動いたのですが、公式サイトの [インストール手順](http://docs.ansible.com/intro_installation.html) にある [hacking/env-setup](https://github.com/ansible/ansible/blob/devel/hacking/env-setup) が環境変数を思いっきり追加しまくってちょっと扱うのが難しいので、virtualenv環境作ってsetup.pyを使った方法でインストールしました。
実行環境はOS X Yosemite + MacPortsです。virtualenv-2.7コマンドはvirtualenvに置き換えても良いでしょう。

```sh
virtualenv-2.7 env
source env/bin/activate
pip install --upgrade pip
pip install paramiko PyYAML Jinja2 httplib2
pip install boto awscli
git clone git://github.com/ansible/ansible.git --recursive
python setup.py install
cd ..
rehash
which ansible
```

awscliをこのタイミングで入れてるのはただの趣味です。
which ansibleでvirtualenvの方に出てくればいちおうOK

```
/Users/hoge/dev/unkoproject/server/infra/env/bin/ansible
```

次にawscliでprofileを作ります。

```sh
aws configure --profile toilet
```

あとはlocal_actionを使うのを適当に作って実行します。

```sh
echo "localhost ansible_python_interpreter=`which python`" > hosts
vi unko.yml
ansible-playbook -i hosts unko.yml
```

unko.ymlは以下の様な内容です。

```yaml
- name: Unko
  hosts: 127.0.0.1
  connection: local
  tasks:
    - name: Create Security Group
      local_action:
        module: ec2_group
        name: unko_group
        description: Security Group for Unko
        region: ap-northeast-1
        profile: toilet
        rules:
          - proto: tcp
            from_port: 22
            to_port: 22
            cidr_ip: 0.0.0.0/0
          - proto: tcp
            from_port: 80
            to_port: 80
            cidr_ip: 0.0.0.0/0
          - proto: tcp
            from_port: 443
            to_port: 443
            cidr_ip: 0.0.0.0/0
          - proto: tcp
            from_port: 25
            to_port: 25
            cidr_ip: 0.0.0.0/0

    - name: Unko Web Server Instance
      local_action:
        module: ec2
        region: ap-northeast-1
        keypair: ToiletKey
        group: unko_group
        instance_type: t2.micro
        image: ami-936d9d93
        count: 1
        wait: yes
        profile: toilet
      register: ec2

    - name: Add Web Server instance to host group
      local_action: add_host hostname={{ item.public_ip }} groupname=unko
      with_items: ec2.instances

    - name: Add tag to instances
      local_action: ec2_tag resource={{ item.id }} region=ap-northeast-1 state=present profile=toilet
      with_items: ec2.instances
      args:
        tags:
          Name: Unko

    - name: Wait for SSH to become available
      pause: minutes=1
```

もうちょっとネーミングセンスあればよかった。
Mac のローカルでWordPressの環境を作るときにハマったのでメモ

前提条件として、php, apache, mysql がインストールされていること。

## Apacheの設定

### webサーバでphpが動くように設定

php moduleをapacheで読みこんでやる。

```
$ sudo vi /private/etc/apache2/httpd.conf
```

118行目くらいに

```
LoadModule php5_module libexec/apache2/libphp5.so
```

というphpのモジュールをロードする行がコメントアウトされてる場合は、読み込まれるように#を外す。

### バーチャルホストのconfを設定

```
$ sudo vi /private/etc/apache2/other/xxxx.conf 
```

サンプル

```c:xxxx.conf
NameVirtualHost *:80
<VirtualHost *:80>
  ServerName localhost
  DocumentRoot /dir_path
  DirectoryIndex index.php index.html
  AddType application/x-httpd-php .php
  <Directory /dir_path>
    Options Includes ExecCGI FollowSymLinks
    AllowOverride all
    Allow from All
  </Directory>
</VirtualHost>
```

```
$ sudo apachectl start
```

すでに動いている場合は restart


### ブラウザからアクセスできるように設定を変更する

**（mac限定の話。ここハマった）**
「システム環境設定」 -> 「共有」 から「ファイル共有」にチェックをして、apacheに設定したディレクトリを共有フォルダにしていして、「全員」を「読み出しのみ」を選択してやる。

これでブラウザからlocalhostへアクセスすると指定したディレクトリに設置したファイルを確認できるはず。

### サンプルを動かして確認

設定が終わったらapacheとphpがちゃんと動いていいることを確認用にphpファイルを動かしてみる。

```
$ vi dir_path/info.php
```


```php:info.php

<?php
  phpinfo();
?>

```

localhost/info.php にアクセスして、phpinfoが表示されることを確認する。
サーバエラーがでなければ、設定完了。

## MYSQLでDB作成とユーザ発行

とりあえずDBとユーザを作る

```
$ mysql -u root

> create database db_name;
> GRANT ALL ON db_name.* TO user_name@"localhost"IDENTIFIED BY "password";
```


## PHPの設定変更

**これもハマった。**

### mysqlに接続できるように設定

php.ini がまだ設定されてない場合、defaultをコピーする。

```
$ sudo cp /etc/php.ini.default /etc/php.ini
```

mysqlのsocketの場所を調べて、phpの mysql.socket に設定を追加する。

```
$ mysql_config --socket
$ sudo vi php.ini

...
mysql.default_socket = ”mysqlのsocketのpathを記述”
...


```

apacheを再起動


### サンプルを動かして接続確認

phpからmysqlへ接続が出来てるかどうか確認用のphpファイルを動かしてみる。

```
$ vi dir_path/mysql.php
```

```php:mysql.php
<html>
<head><title>PHP mysql connect test</title></head>
<body>

<?php

$link = mysql_connect('localhost', 'user_name', 'password');
if (!$link) {
    die('接続失敗です。'.mysql_error());
}
echo '<p>接続に成功しました。</p>';

$db_selected = mysql_select_db('db_name', $link);
if (!$db_selected){
    die('DB選択失敗です。'.mysql_error());
}
echo '<p>db_nameを選択しました。</p>';

$close_flag = mysql_close($link);

if ($close_flag){
    echo '<p>切断に成功しました。</p>';
}

?>
</body>
</html>
```

localhost/mysql.php にアクセスして正常に動けばOK

## wordpress のインストール

あとは通常通り、wordpress のファイルをapache で指定したホームディレクトリに設置し、インストール作業をしておしまい。
Rustでライブラリのデバッグをする

とあるライブラリを使っていたらクラッシュはしないが情報の少ないエラーに遭遇して、コードを読んでも手がかりが掴めず困って、Rustのデバッグの仕方を調べました。

## env_loggerでログを見る

コードを読んでいたら以下のようなマクロが使われていました。

```rust
trace!(...);
debug!(...);
info!(...);
warn!(...);
error!(...);
```

どこかに出力されていそうです。[rustdoc](http://doc.rust-lang.org/log/log/index.html) によると、これはFacadeになっているRustのロギングの仕組みで、ロギングの実装を渡さないとすべてのログを無視するようにフォールバックされるそうです。

なので、実行ファイル側にロギングの実装を渡します。ロガーは自分で定義することも可能ですが、今回は出力を見たいだけなので [rust-lang/log](https://github.com/rust-lang/log) のenv_loggerを使います。

```toml
[dependencies]
env_logger = "*"
```

```rust
extern crate env_logger;

fn main() {
    env_logger::init().unwrap();
```

実行ファイルのルートでロガーを初期化します。環境変数にログレベルを渡すことでフィルタすることができます。

```sh
$ cargo build && RUST_LOG=trace ./target/debug/xxx
```

これでどこまで実行できているかを知ることができました。

## rust-lldbでデバッグする

だいたいの箇所が掴めたのでrust-gdbあるいはrust-lldbを使います。Macであればrust-lldbはrustcをインストールしていればそのまま使うことができます。rust-lldbの本体はシェルスクリプト ([rust/rust-lldb at master · rust-lang/rust](https://github.com/rust-lang/rust/blob/master/src/etc/rust-lldb)) です。
実行ファイルを指定してrust-lldbを起動します。

```sh
$ rust-lldb ./target/debug/xxx
```

lldbを起動して `help` でコマンド一覧を見ることができます。あとはこのサイト ([Practical Debugging with LLDB](http://debugging-with-lldb.blogspot.jp/)) が詳しかったです。
基本的にはブレークポイントを貼って、プロセスを起動して、ステップ実行して、変数の中身を見るということをします。

```
// 関数名を指定してブレークポイントを設定する
(lldb) breakpoint set --name access

// モジュールと関数を指定してブレークポイントを設定する
(lldb) breakpoint set --name xxx::http::access

// ファイルと行数を指定してブレークポイントを設定する
(lldb) breakpoint set --file main.rs --line 1

// 設定したブレークポイントのリストを出力する
(lldb) breakpoint list

// プロセスを起動する
(lldb) run

// ステップイン
(lldb) step

// ステップオーバー
(lldb) next

// 現在のフレームの引数やローカル変数を出力する
(lldb) frame variable x
```

`breakpoint -> br` や `frame variable -> fr v` などエイリアスがあります。また変数は型情報まで出力してくれます。

```
(lldb) br set -f main.rs -l 30
(lldb) r
Process 95934 stopped
   26  	extern crate env_logger;
   27  	
   28  	fn main() {
   29  	    let vec = vec![0, 1, 2, 3];
-> 30  	    ...
(lldb) fr v vec
(collections::vec::Vec<i32>) vec = vec![0, 1, 2, 3]
```

これでロガーとデバッガーを見ながらデバッグすることができます。
cgoでコマンドライン引数を渡すには


# 背景

gimpのプラグインをGoで書けそうだったので、作業を
始めたら、C APIでargc,argvつまり、コマンドライン引数を渡す
必要があった。

# コマンドライン引数をC APIに渡すには

コマンドラインの引数の取得にはosパッケージで行える。問題は、これをcgoで
C APIに渡すにはどうすればよいのか。

argcはC.int型。
argvが分からず調べ始めたのだが、C.char*型の配列を用意すると良い模様。
unsafeパッケージを使えば、配列の先頭アドレスとしてC API側に渡せるらしい。

```go
import (
    "os"
    "unsafe"
)

argc := C.int(len(os.Args))
argv := make([]*C.char, argc)
for i, arg := range os.Args {
    argv[i] = C.CString(arg)
}
C.initGimp(argc, (**C.char)(unsafe.Pointer(&argv[0])))
```

# 関連記事

- [GoでFaceTime HDカメラやWebカメラを使う](https://abrakatabura.hatenablog.com/entry/2014/10/24/065607)
- [GIMPのプラグインをGoで書く(その1)](https://abrakatabura.hatenablog.com/entry/2015/05/25/063913)
- [macOSのCPU温度をgRPCを使ってElectronで作ったデスクトップマスコットに表示させた](https://abrakatabura.hatenablog.com/entry/2018/07/23/100505)
Macにrvmをインストールする

複数バージョンを切り替えてRubyを利用するために、rvmを導入する

# 事前準備
public keyをインストール

```
$ gpg2 --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3
```

※ gpg2が入っていない場合は以下のコマンド

```
$ brew install gpg2
```

# rvmインストール
[公式ページ](https://rvm.io/rvm/install)を参考にして好きなオプションを追加してインストール
ここではrailsも一緒に入れる

```
$ curl -sSL https://get.rvm.io | bash -s stable --rails
```

# コマンド
インストール済みruby確認

```
$ rvm list known
```

rubyインストール

```
$ rvm install 2.1
```

利用バージョンセット

```
$ rvm use 2.1
// デフォルトにしたい場合
$ rvm use 2.1 --default
```

# 参考資料
[RVM: Ruby Version Manager - Installing RVM](https://rvm.io/rvm/install)
[rvm 入門 … 複数バージョンの Ruby と Rails を混在させる - まちゅダイアリー(2011-05-21)](http://www.machu.jp/diary/20110521.html)
コンパイラ構築

# コンパイラ構築

以下のサイトから翻訳して転載しました
http://en.wikipedia.org/wiki/Compiler_construction


##ライセンス
以下のライセンスに準じます
http://en.wikipedia.org/wiki/Wikipedia:Text_of_Creative_Commons_Attribution-ShareAlike_3.0_Unported_License

###なぜこれを書こうと思ったか
個人的はセキュリティソリューションを作ろうとしているんですが、そこで、ソースコード解析が必要なんですね。コーセラとかで勉強してもいいんですが、「勉強しながら社会貢献」ができればいいかなと思って、WikiBookを翻訳することにしました。
翻訳下手なので、もっといい訳があれば指摘していただければと思います。

##コンパイラ構築
コンパイラ構築とはコンピュータプログラミング言語やその関連するコンパイラを開発する理論と実際にかんしてあつかうコンピュータサイエンスの一分野である。理論的な部分は、プログラミング言語の構文、文法、意味論、に主に関心を持つ。それにより、このコンピュータサイエンスの特にこの分野は、言語学と深く結びついているということが言える。コンパイラ構築の幾らかのコースでは、文法がプログラミング言語でどのように働いているかをアナロジーで生徒に説明するために、有効な文の形をとっている、話し言葉の単純化された文法を含めているところもある。実用部分は、言語においての、コンパイラの実際の実装をカバーしている。生徒は最終的にMicroのような単純化された教材用の言語のためのコンパイラのフロントエンドを書くことになる。

##字句解析
コンパイラの最初の段階は字句解析と言われている。このフェーズは文字を分類してソースプログラムを語彙素（lexemes）と呼ばれる意味のある並びに作り変える。語彙素は「整数」や「識別子」や「ホワイトスペース」などのトークンの分類に属する。<トークンの分類,属性値>などのトークンの形は、それぞれの語彙素ごとに生成される。字句解析は「スキャニング」とも言われる。 

##構文解析
コンパイラ構築の次の段階は構文解析である。字句解析器の出力はトークンの文法的な構造を示す表現を作成するために使われる。構文解析はParsingとも言われる。

##意味解析
意味解析はコンパイラのフロントエンドの最後の段階である。この段階の間、コンパイラはParserによって構築された構文木に意味的なルールを適用する。このフェーズを実行しているタスクはコンパイラのデザインによって変わってくる、しかし、概して型チェック、スコープのチェック、オブジェクトの結合などを含む。シンボルテーブルはコード生成の準備として意味解析の際に構築される。ワンパスコンパイラのような幾らかのケースでは、意味解析は構文解析と同時に行われる。
Python:lambdaで問題5に挑戦...しないで写経することにした

[kota9](http://qiita.com/kota9)さんの[ソフトウェアエンジニアなら１時間で解けるべき問題５に挑戦](http://qiita.com/kota9/items/91e4fecfae550be8f109#comment-19767d72e87ae0c26afc)。勉強になりました。再帰ってこういう風に考えるんですね。
#lambdaを使って書いてみる
そうそうに挑戦はあきらめて、後学のために写してみることにしました。ただ写しても面白くないので、またまたlambdaしばりっていうことで。

```Python
box=lambda *x:x
unbox=lambda x:x[-1]
do=box
switch=unbox
```

前準備です。自前switch使いたいので。折角作ったので自前foldlも使う。

```Python
foldl=(lambda f,acc,xs:
    switch(
        xs == [] and do( acc )
        or      do( foldl(f, f(acc, xs[0]), xs[1:]) )
    )
)
```

整数を二つとってくっつける関数f_nと
整数のリストをとってくっつける関数ff_n。
intしたりstrしたりがちょっとイケてない感じ。

```Python
f_n=lambda x,y:int(str(x)+str(y))

ff_n=lambda xs:foldl(f_n,0,xs)
```

ここから本題。拡張性を考慮して整数のリストにしてみました。

```Python
f_5=(lambda NUMS, n,M:
    (lambda digits=NUMS[:n],
    r_n=range(1,n),
    out=[]:
    (lambda n_digits=ff_n(digits):
        (
        out.append(str(n_digits)) if n_digits==M else None,
        [[ out.append(x + "+" + str(ff_n(digits[-i:n]))) 
        	for x in f_5(NUMS, n-i , M - ff_n(digits[-i:n])) ] for i in r_n ],
        [[ out.append(x + "-" + str(ff_n(digits[-i:n]))) 
        	for x in f_5(NUMS, n-i , M + ff_n(digits[-i:n])) ] for i in r_n ],
        out,
        )[-1]
     )()
     )()
)

ff_5=lambda NUMS, M: f_5(NUMS, len(NUMS), M)

NUMS=range(1,10)
                      
print ff_5(NUMS,100)
```
できた。
正の整数のリストだったらいけるようです。
試しに適当な数のリストで1000になるパターンを調べてみると


```Python
>>> ff_5([1,5,4,2,3,7,9,34,57,64,23],1000)
['15-4+2+37+934+57-64+23', '1+5-42-3+7+934+57+64-23']
```


#appendは出来るのね...
元が += で書かれてるので、どうやって返り値を蓄積するかちょっと悩みました。
引数outにデフォルトで[]を定義しておいてそこにappendで要素をどんどん足していくっていうの、たぶん出来るんじゃね？と思って書いてみたら、その通り動いてくれているようです。
これってもうほとんど...
#代入できるって言ってもいいレベルじゃない？
例えば

```Python
a=(lambda :
   (lambda b=[]:
    (b.append(1),
     b.append(2),
     b[0]+b[1],
     )[-1]
    )()
)
```
計算結果を空のリストに蓄積して後で使うことができちゃいます。
ほとんどローカル変数ですよね。これ。
実行してみると

```Python
>>> a()
3
```
popしてinsertすれば再代入も可能。
やらないけどね。ダサくなっちゃうから。
Storyboardで作成したViewとコードで作成したViewの背面関係について

# 問題

【理想】
storyboardで作成したButtonをコードで作成した背景の上に表示させたい。

【問題】
Buttonが表示されず背景のみ表示されている。
（背景の下にButtonが隠れてしまっている）

ぱっと、思いついた解決案→作成する順番を変えよう！（先にコードで背景を作成してからstoryboardでButtonを作成）
↓
失敗・・・


【解決策】
 self.view.bringSubviewToFront(**View**)→ 最前面にViewを表示する。
 self.view.sendSubviewToBack(**View**)→最背面にViewを表示する。

これを使って【理想】どおりの実装を行ってみました。

# 実装
1. アシスタントエディターで、プログラムへつなぎます。
![スクリーンショット 2015-05-30 2.08.35.png](https://qiita-image-store.s3.amazonaws.com/0/75593/6eaac7fe-5ae4-fdf0-87fb-74c410fe45ef.png)

2.Viewの背面関係を設定する

今回は、背景の上にButtonを表示させたいので、
self.view.bringSubviewToFront(btn)
self.view.sendSubviewToBack(ImageView)となる。


```swift:ViewController.swift
import UIKit

class ViewController: UIViewController {
    
    @IBOutlet weak var btn: UIButton!
    var image: UIImage = UIImage(named: "sample.jpeg")!
    var ImageView: UIImageView = UIImageView(frame: CGRectMake(0,0,750,1334))
        
    override func viewDidLoad() {
        super.viewDidLoad()

        ImageView.image = image
        ImageView.layer.position = CGPoint(x: self.view.bounds.width / 2,y: self.view.bounds.height / 2)

        self.view.addSubview(ImageView)
        
        self.view.bringSubviewToFront(btn)
        self.view.sendSubviewToBack(ImageView)
        


        

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}

```
3.走らせてみた結果
![スクリーンショット 2015-05-30 2.16.14.png](https://qiita-image-store.s3.amazonaws.com/0/75593/69746902-733c-fefa-40da-00f3e64dde72.png)

# まとめ

今回は、主にStoryboardで作成したView、コードで作成したViewの背面関係について書いてみましたが、Storyboardで作成したView同士の背面関係、コードで生成したView同士の背面関係も
`self.view.bringSubviewToFront()`
`self.view.sendSubviewToBack()`
で実装可能なので、ぜひ試してみてください。
[unicode] boostのソースを色んなunicode符号化スキームでエンコードしてサイズを比較してみた

対象文字列
boost-1-57-0のincludeディレクトリ内のソースを全て結合した文字列。
`find * -type f | xargs cat`
各エンコーディングでのファイルサイズは以下の通り

|スキーム名|ファルサイズ(Byte)|
|---------|-----------------|
|UTF8     |97371269         |
|UTF16-LE |194741986        |
|UTF16-BE |194741986        |
|UTF32-LE |389483972        |
|UTF32-BE |389483972        |

gzipとbzip2での圧縮の結果

|スキーム名|gzip(Byte) |gzip(圧縮率)|bzip2(Byte)|bzip2(圧縮率)|gzip(秒)|bzip2(秒)|
|---------|-----------|-----------|------------|------------|--------|---------|
|UTF8     |8626754    |91.1%      |6237814     |93.6%       |1.618   |17.68    |
|UTF16-LE |11393835   |94.4%      |6647416     |96.6%       |3.185   |50.20    |
|UTF16-BE |11393831   |94.4%      |6647409     |96.6%       |3.193   |49.33    |
|UTF32-LE |17569956   |95.5%      |7283199     |98.1%       |6.412   |83.32    |
|UTF32-BE |17569956   |95.5%      |7283186     |98.1%       |6.440   |81.77    |

bzip2の圧縮率は凄いけど、計算時間も凄い。
NSTimerを用いて画像が徐々にぐわぁ〜っと大きくなっていく実装

ゲームとかで画像がぐわぁ〜っと大きくなっていくときありますよね！？
iOSだとSpriteKitのようなゲーム開発のフレームワークだとUIKitに比べ比較的簡単に実装できるイメージだった僕。そんな中、じゃあUIKitでどうやるんだと考え始めたのでとりあえず作ってみました。

実装内容は、ボタンを押すと画像がぐわぁ〜と大きくなり画面いっぱいに大きくなると処理を止める実装になっています。

# 実装内容

```swift:ViewController.swift
import UIKit

class ViewController: UIViewController {
    
    var image: UIImage = UIImage(named: "background.jpeg")!
    var ImageView: UIImageView = UIImageView(frame: CGRectMake(0, 0, 20, 20))
    var button: UIButton!
    
    var countNum = 0
    var timer = NSTimer()
    var timeRanning = false
    
    override func viewDidLoad() {
        super.viewDidLoad()
        ImageView.image = image
        ImageView.layer.position = CGPoint(x: self.view.bounds.width / 2,y: self.view.bounds.height / 2)
        
        button = UIButton()
        button.frame = CGRectMake(0, 0, 50, 50)
        button.backgroundColor = UIColor.blackColor()
        button.layer.position = CGPoint(x: self.view.bounds.width / 2,y: self.view.bounds.height / 2 - 100)
        button.setTitle("Btn", forState: .Normal)
        button.addTarget(self, action: "onClickButton:", forControlEvents: .TouchUpInside)
        self.view.addSubview(button)
        

    }
    func onClickButton(sender: UIButton){
        if timeRanning == false{
            timer = NSTimer.scheduledTimerWithTimeInterval(0.05, target: self, selector: Selector("update"), userInfo: nil, repeats: true)
            timeRanning = true
        }
        
    }
    func update(){
        countNum++
        if(countNum < 200){
            ImageView.transform = CGAffineTransformMakeScale(0.5 * CGFloat(countNum), 0.5 * CGFloat(countNum))
            ImageView.removeFromSuperview()
            self.view.addSubview(ImageView)
            println("\(countNum)")
        }else{
            timeRanning = false
        }
    
    }


}



```
参考動画をみてscheduledTimerWithTimeIntervalの第一引数の数がポイントだと感じたので簡単に解説をします。例えば第一引数が1の場合は1秒ごとにupdate()を呼び出す。つまりは、scheduledTimerWithTimeIntervalの第一引数の値が大きければ画像が大きくなる速度は遅くなり、小さければ画像が大きくなるスピードが速くなります。

細かな解説は参考にした動画の方が参考になると思いますので、以下の参考からみてください。

# 完成
森の中バトルシーンへとシフトする際のアニメーションをイメージして作ってみました。
画像がぐわぁ〜っと規定の大きさまできたら道からモンスターがぐわぁ〜んと出現するのも面白いかもですね笑

![result.png](https://qiita-image-store.s3.amazonaws.com/0/75593/f2c74ef0-d6a3-b590-a353-ad12d2679803.png)
![result2.png](https://qiita-image-store.s3.amazonaws.com/0/75593/ea973fcb-b61b-fdeb-9734-c42f84948dab.png)

> 参考
[SwiftでなんちゃってStopWatchを作ってみた（その１）](https://www.youtube.com/watch?v=lv0jeCwq5GY)
cesiumでリアルタイム表示

ずいぶん調べて、czmlで時間の経過とともにデータが増える
サンプルです。teimerで追加していますが、net.socketでデータを追加しても大丈夫だと思います。

そうそう、'../../Source/Assets/Textures/arcgis/tile'というローカルファイルでarcgisからダウンロードしたファイルで動くことにしていますが、地球がでませんねえ。'../../Source/Assets/Textures/NaturalEarthII'とかにすれば表示できるかもしれません。

```
<html lang="en">
<head>
    <!-- Use correct character set. -->
    <meta charset="utf-8">
    <!-- Tell IE to use the latest, best version (or Chrome Frame if pre-IE11). -->
    <meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
    <!-- Make the application on mobile take up the full browser screen and disable user scaling. -->
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no">
    <title>Cesium Viewer</title>
    <link rel="shortcut icon" href="favicon.ico" type="image/x-icon" />
    <link rel="stylesheet" href="CesiumViewer.css" media="screen">
	<!--<script data-main="CesiumViewerStartup" src="../../ThirdParty/requirejs-2.1.9/require.js"></script>-->
    <script src="../../ThirdParty/requirejs-2.1.9/require.js"></script>
	<script type="text/javascript">
    require.config({
		baseUrl : '../../../Source',
        waitSeconds : 60
    });
    </script>
</head>
<body style="background: #000;">
    <div id="cesiumContainer" class="fullWindow"></div>
    <div id="loadingIndicator" class="loadingIndicator"></div>
	<script id="cesium_sandcastle_script">
function startupxxx(Cesium) {
    "use strict";
//Sandcastle_Begin
var local = new Cesium.TileMapServiceImageryProvider({
	url: '../../Source/Assets/Textures/arcgis/tile',
	fileExtension: 'jpeg'
	});
var viewer = new Cesium.Viewer('cesiumContainer',{
	//imageryProviderViewModels: [],
	imageryProvider: local,
	//selectedImageryProviderViewModel: local,
    baseLayerPicker : false
});

var layers = viewer.imageryLayers;
   

var 	count = 0;
var endtime=new Date();
var starttime = new Date();
	endtime.setMinutes(endtime.getMinutes()+3);
	var alltime=starttime.toISOString()+"/"+endtime.toISOString();
   function increment() {
	  var x = count * .2;
	  var now = new Date();
	  var nowtxt = now.toISOString();
	  var avtxt=nowtxt+"/"+endtime.toISOString();
	  var	msgData=[{"id":"document",
				"version":"1.0",
				"clock": {
				"interval": alltime ,
				"currentTime": nowtxt ,
				"multiplier": 12,
			 "step":"SYSTEM_CLOCK_MULTIPLIER"
					}
				},
				{  "id":"Plane",
					"availability": avtxt ,
	  				"billboard":{
						"image":'cross_y.png',
						"scale":1.0
					},
					"position":{
						  "interpolationAlgorithm":"LAGRANGE",
						  "interpolationDegree":1,
						  "cartographicDegrees":[139.6278 + x, 41.8819 + x, 1000]
					}
				}];

	  var czmlDataSource = new Cesium.CzmlDataSource();
	  czmlDataSource.process(msgData, 'model json');
	  viewer.dataSources.add(czmlDataSource);
	  
	  count++;
	  if(count<10)setTimeout(increment,3000);
	}

	setTimeout(increment,3000);


}
//Sandcastle_End
    //Sandcastle.finishedLoading();
if (typeof Cesium !== "undefined") {
    startup(Cesium);
} else if (typeof require === "function") {
    require(["Cesium"], startupxxx);
}
</script>
<
</body>
</html>
```
PHPでRedisを使うメモ


###処理速度検証編(2015/6/4追記)
hashを使ってデータを保存されている時の、データ取得速度を、同じデータ構成のmySQLと比較

データ単体取得
`$redis->hGet('key','field');` と `select field from db_table where id="key"` では、Redisの方が高速に動作するが、複数のデータを取得したい時、
例えば

```php
for($i=0;$i<100;$i++){
	$redis->hGet($key,'field');
}
```

みたいなパターンだと

```
select `field` from user_data where uid>=0 and uid<100;
```

の方が高速でした。

---

###expire編(2015/6/3追記)
---
[phpredis - github](https://github.com/phpredis/phpredis) を見ても、expire()みたいなメソッドは存在しない？？
どうやら

```php
$redis->set('x', '42');
$redis->setTimeout('x', 3); // x will disappear in 3 seconds.
```

とか

```php
$redis->set('x', '42');
$now = time(NULL); // current timestamp
$redis->expireAt('x', $now + 3);    // x will disappear in 3 seconds.
```

といった様なメソッドが用意されているみたい。（動作未検証）
`setTimeout()`はミリ秒ではなく「秒」ってのが注意点かな。
`expireAt()`はUNIXtimeを指定できるのは便利そう。今日の24時までとか、簡単に設定出来ちゃいますね。

---

###HASH型編
---


HASHの主キー（便宜上そう呼びます）の ~~末尾に数字が使えない~~
**使えました `'key:1'` のように、コロンを挟む必要があったようです**

```php
$redis->hSet('key1','mykey','test');//false
```

どうやら副キー(フィールド？)には使えるみたいです。

```php
$redis->hSet('key','mykey1','test');//true
```

---

####コネクションの使い回し編

```php
class RedisManager extends Redis{
	public function __construct($is_master,$db_number=0) {
		if($is_master){
			parent::__construct();
			$this->pconnect(Conf::$redis_m_host,Conf::$redis_m_port);
			$this->select($db_number);
		}else{
			parent::__construct();
			$this->pconnect(Conf::$redis_s_host,Conf::$redis_s_port);
			$this->select($db_number);
		}
		return $this;
	}
}
```

色々と突っ込みどころのあるソースですが、やりたいこととしては、

1.newした時点でコネクションを開いて、DB選択までやりたい
2.一度の処理で二度も三度もnewするかもしれないので、コネクションを使いまわしたい
　（一度の処理でいくつもコネクション開いちゃダメ・・・だよね・・・？）

という事なのですが、上記のコードではエラーが発生します。
`Redis server went away`　とのこと。

高度なテクニックを持っていなかったので、下記の様に

```php
class RedisManager extends Redis{
	private $is_master;
	private $is_connected = false;
	public $db_number;
	
	public function __construct($is_master,$db_number=0) { //オーバーライド
		$this->is_master = $is_master;
		$this->db_number = $db_number;
		if($is_master){
			parent::__construct();
		}else{
			parent::__construct();
		}
		return $this;
	}
	
	public function connect() { //オーバーライド
		if(!$this->is_connected){
			if($this->is_master){
				parent::connect(Conf::$redis_m_host,Conf::$redis_m_port);
				parent::select($this->db_number);
				$this->is_connected = true;
			}else{
				parent::connect(Conf::$redis_s_host,Conf::$redis_s_port);
				parent::select($this->db_number);
				$this->is_connected = true;
			}
		}
		return $this;
	}
}
```

使う時は

```php
$redis_master = new RedisManager(true); //こんな感じでnewしておいて

$redis_master->connect()->hGet('aaa','bbb');
$redis_master->connect()->hGet('xxx','yyy'); //こんな感じで使います。

```

これだと繰り返し使ってもエラー出ませんでした。
即時関数でローカルスコープ 3 分クッキング

# 概要

「Effective JavaScript」と「JavaScript Ninja の極意」という書籍でぼちぼち JavaScript の修行をしております。
その修業の中で苦労ジャ初心者の僕がクロウしたポイントを紹介したいと思います。
上忍のみなさんにとってはキホンのキかもしれませんが…。

# 問題

まず、以下のコードを実行します。

```js
var myFuctions = [], girls = ['Yuno', 'Miyako', 'Matsuri'], i;

for (i = 0; i < girls.length; i++) {
    myFuctions[i] = function () {
        console.log('My name is ' + girls[i] + '.');
    };
}
```

その後、以下のコードを実行するとコンソールにどのような文字列が表示されるでしょう。

```js
myFuctions[0](); // ?
myFuctions[1](); // ?
myFuctions[2](); // ?
```

僕の予想 : こうとしか考えられませんぞwww よゆうwwwwww

```js
myFuctions[0](); // My name is Yuno.
myFuctions[1](); // My name is Miyako.
myFuctions[2](); // My name is Matsuri.
```

現実

```js
myFuctions[0](); // My name is undefined.
myFuctions[1](); // My name is undefined.
myFuctions[2](); // My name is undefined.
```

![yuno20100305.jpg](https://qiita-image-store.s3.amazonaws.com/0/6697/d886f47c-fdb4-538a-1508-dc07802db72b.jpeg)

ゆのっち達はどこに消えたんでしょうか…。

# 原因

実はそれぞれの関数の内容は以下のようになっていたのです。

```js
var myFuctions = [], girls = ['Yuno', 'Miyako', 'Matsuri'], i;

for (i = 0; i < girls.length; i++) {
    myFuctions[i] = function () {
        console.log('(i: ' + i + ') My name is ' + girls[i] + '.');
    };
}
```

```js
myFuctions[0](); // (i: 3) My name is undefined.
myFuctions[1](); // (i: 3) My name is undefined.
myFuctions[2](); // (i: 3) My name is undefined.
```

そう、どの関数でも i = 3、つまり for 文が終了した時の i の値となっていたのでした。
(i が 3 にインクリメントされた後に for ループが終了)

これは
**クロージャは外側の変数を値ではなくリファレンスによって保存する**
という特性によって生じます。

# 解決方法

これを期待通りの挙動に修正するには即時関数を用いてローカルスコープを生成させます。

```js
var myFuctions = [], girls = ['Yuno', 'Miyako', 'Matsuri'], i;

for (i = 0; i < girls.length; i++) {
    (function (j) {
        myFuctions[j] = function () {
            console.log('(i: ' + i + ', j: ' + j + ') My name is ' + girls[j] + '.');
        };
    })(i);
}
```

こうすれば for ループの各ステップのそれぞれのローカルスコープ内で j という変数が新たに定義され、
そこに値が保持されます。
ぎゅぎゅっと瞬間凍結 :snowflake: 

```js
myFuctions[0](); // (i: 3, j: 0) My name is Yuno.
myFuctions[1](); // (i: 3, j: 1) My name is Miyako.
myFuctions[2](); // (i: 3, j: 2) My name is Matsuri.
```

✌ ('ω' ✌ )三 ✌ ('ω') ✌ 三( ✌ 'ω') ✌  うごいた！

この話、JavaScript Ninja 等を読むまではイメージでなんとなく掴んでたんですが、しっかり原理を把握しておかないと、忘れた頃に躓いてしまいますね…。

# 追記

ECMAScript 6 では [let](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let) が使えるようになり、ブロックスコープが設定できるみたいですね。
Rails のマイグレーションをフックする


Rails のマイグレーションの前後に任意の処理をしたいとき、以下のように書きます。

```ruby
desc 'Before task'
task :before do
  puts 'Before'
end

desc 'After task'
task :after do
  puts 'After'
end

Rake::Task['db:create'].enhance([:before]) do
  Rake::Task[:after].invoke
end
```
MongoDB+mongooseでN件目〜M件目までを取りたい場合


100件あるデータを１ページ１０件ずつ表示するようなケースで
２０件目から３０件目のデータを引っ張りたい、という場合。

mongooseの初期化部分は飛ばします。
肝心の箇所のみ。

```
collection
  .find()
  .sort({'pubdate':'desc'})
  .skip(10)
  .limit(10)
  .exec(function(err, data) { 
    console.log(data);
  });
```

「skip」を差し込んでやればOK。
C++でtext fileをparsingしたい人生だった

※書きかけです
まずうちさぁ…デリミタで区切られたパラメーターファイルがあるんだけど、読んでかない？

---
こういう感じのパラメーターファイル

```
OUTPUT_DIR=result
MODE=1
```

みたいなファイルを読みたいなぁと思いまして、これがperlなら

```pl
open (DAT, "param.txt");
my @param = <DAT>;
close DAT;
foreach(@param){
    chomp;
    my($key, $val) = split/=/,$_;
}
```
みたいなのでおすぃまいなんだけれど、
C++でこれと同じような事をやろうとすると複雑だったのでメモ。

---

```cpp
#include <string>
#include <fstream>
#include <iostream>
#include <sstream>
#include <vector>
#include <map>

class ParamFile{
	std::map<std::string, std::string> param;
	public:
	ParamFile(const char* const file){
		std::ifstream input;
		input.open(file, std::ios::in);
		if(input.fail() == true){
			std::cout << "Cannot open file..." << std::endl;
			return;
		}
		std::string line;
		while(std::getline(input, line)){
			//comment out
			if(line[0] == '#') continue;
			//empty line
			if(line.empty() == true) continue;
			//make stream
			std::istringstream stream(line);
			std::string tmp;
			std::vector<std::string> keyval;
			while(std::getline(stream, tmp, '=')){
				keyval.push_back(tmp);
			}
			param.insert(std::map<std::string, std::string>::value_type(keyval[0], keyval[1]));
		}
		input.close();
	}
	void show(){
		for(std::map<std::string, std::string>::iterator it = param.begin() ; it != param.end() ; ++ it){
			std::cout << it->first << " = " << it->second << std::endl;
		}
	}
	std::string getValueOf(std::string key){
		return param[key];
	}
	/*
	template <typename type> type getValueOf(std::string key){
		return 1;
	}
	*/
};
```

ParamFileのインスタンスを作ってコンストラクタでread fileを突っ込む。
getValueOf(key)でkeyの値が帰ってくるという感じ。
このままだと全部string型で帰ってくるので、
そのうちテンプレートパラメータでもって数値に変換して返したり出来るようにしたいところ。
esa API 略して esapi を esa-ruby 経由で利用し、生煮え率を計測する #esa_io #ruby

## <i class="fa fa-paw" style="font-size:1em;"></i> 概要
esa API 略して esapi を esa-ruby 経由で利用し、生煮え率を計測します

## <i class="fa fa-question-circle" style="font-size:1em;"></i> 生煮え率とは？
**(WIP の記事 / 全エントリ) × 100** とします。
四捨五入して整数で表示します。

## <i class="fa fa-gears" style="font-size:1em;"></i> .env にアクセストークンとチームを設定
アクセストークンは .env ファイルで管理します。
値の読み込みは dotenv を利用します。
dotenv の使用方法については以下を参照。

* <i class="fa fa-external-link-square" style="font-size:1em;"></i> [Ruby | dotenv gem で 環境変数をスマートに管理](http://qiita.com/tbpgr/items/b7126c3d2d8f0329b11c)

~~~
ESA_API_TOKEN=your token
TEAM=your team
~~~

## <i class="fa fa-code" style="font-size:1em;"></i> プログラム
~~~ruby
require 'dotenv'
require 'esa'
Dotenv.load

client = Esa::Client.new(access_token: ENV['ESA_API_TOKEN'], current_team: ENV['TEAM'])
post_count = client.posts(per_page: 100).body['total_count']
wip_count = client.posts(q: 'wip:true').body['total_count']
puts sprintf("全エントリ %d %", post_count)
puts sprintf("WIP エントリ %d %", wip_count)

生煮え率 =  ((wip_count.to_f / post_count.to_f) * 100).round

puts
生煮え率.times do
  print '₍₍⁽⁽(\\( ≧ө≦)/)₎₎⁾⁾'
  sleep 0.2
end
puts
puts

puts sprintf("生煮え率 %d %", 生煮え率)
~~~

## <i class="fa fa-video-camera" style="font-size:1em;"></i> デモ

![nie_demo.gif](https://qiita-image-store.s3.amazonaws.com/0/43480/d0a14b27-4402-8a36-7a55-7c33eb1f7e3a.gif)

## <i class="fa fa-comment" style="font-size:1em;"></i> メモ
出力内容を元に月に一回エントリを投稿すれば、月次生煮え率レポートとか作れますね。

## <i class="fa fa-book" style="font-size:1em;"></i> 外部資料
* <i class="fa fa-external-link" style="font-size:1em;"></i> [dev/api/v1(beta) - docs.esa - esa.io](https://docs.esa.io/posts/102)
* <i class="fa fa-external-link" style="font-size:1em;"></i> [esa-ruby - GitHub](https://github.com/esaio/esa-ruby/)
gitによるBitbucketの課題管理（トラッカーの状態変更）


## めっちゃ便利
  ここ最近、Bitbucketを利用したチームでの開発を行ってみましたが、その中で[Bitbucket](https://bitbucket.org)が提供している課題管理がすごい使いやすかった。
  
課題をトラッカー単位で管理できるという点については、目新しいものはなかったんだけど、使いやすいな（＝めっちゃ便利）と思ったのは、以下のようなこと。

- 課題番号に対応したコメントをgitログに残し、それを[Bitbucket](https://bitbucket.org)へpushすることで、 **自動的に課題トラッカーを更新してくれるっ！！**
- 課題トラッカーを自動的に更新してくれることで、その課題のウォッチャーに対し、ちゃんと **メールを送付してくれるっ！！**

もうね、この二つを自動的にしてくれるだけで、ずいぶん楽になった。

むかしは、課題が発生すると

- Excelかなんかに課題を起票して
- それを関係者にわざわざメールして
- Excelを開き、自分に該当する課題をみつけ
- 対応したらExcelにコメントする
- コメントしたExcelファイルは当然のことのように他の人とバッティングするので
- 別途、Excelをマージする人が必要となる（←大抵プロジェクトを仕切ってる人がやるんだよね。）

ということが当たり前だった時と比べると、ぜんっぜん楽っ。

## 前置き長くなりましたが
Bitbucketが提供する課題のコミットメッセージのルールについて、以下に整理しておきます。

### 基本的な構文
```
<コマンド> <課題ID>
```

### コマンドの種類
```
# 課題の解決
close / closed / closes / closing / fix / fixed / fixes 

# 課題の再オープン
reopen / reopens / reopening

# 課題のコメントとして、チェンジセットへのリンク追加
address / re / references / ref / refs / see
```

### 参考例
```
# "fixed"というキーワードと、"#1"という課題IDが含まれているので
# 以下のコメントでは、課題#1が解決したということを認識し
# 自動的に課題トラッカーに更新をかける。
$ git commit -m "YYYY/MM/DD : V001 : bug fixed #1"
```

### ちゃんとpushしてね
参考例では、commitをしただけに過ぎないので、Bitbucketの課題に更新をかける際には、ちゃんとpushしてね。

```
# pushの例 
$ git push origin master
```

## 参考にしたサイト
 [Bitbucketのサイト::コミットメッセージに課題を書く方法](https://confluence.atlassian.co.jp/pages/viewpage.action?pageId=25133102)
perl plugin template? for override method

例えば、 Ima::DBI の _mk_db_closure() を再定義する場合、次のように書いて、「use MyPlugin 」しましょう。

```lang:PlugIn.pm
package MyPlugin;
use strict;
use warnings;
use Ima::DBI;

sub import {
    no strict 'refs';
    no warnings 'redefine';
    *{"Ima::DBI\::_mk_db_closure"} = \&_mk_db_closure;
}

sub _mk_db_closure {
    my ($class, $dsn, $user, $pass, $attr) = @_;
}

1;
__END__
```

「use ～」は以下の処理と同等です
```lang:Caller.pm
BEGIN {
    require MODULE;
    MODULE->import(LIST);
}
```
Railsのモデルのデフォルト値設定

データを管理する上で、デフォルト値の設定は避けては通れないものです。もちろん、Railsでもデフォルト値を設定することはできますが、少しややこしくなる場面もあります。

# DBのデフォルト値
ActiveRecordによるモデルの場合、固定値のデフォルトで構わないのなら、マイグレーションに

```rb:migrate.rb
  # create record内で
  t.integer :hoge, default: 8
  # 列追加時
  add_column :table_name, :piyo, :string, default: 'foobar!'
```
と書いておけば、ActiveRecord側で自動的に読み取って、それを初期値としてくれます。また、`null: false`を指定せず、NULLが入りうるテーブルでデフォルトを指定しなかった場合、DB上で`DEFAULT NULL`とみなされ、Ruby側では`nil`となります。

# DBデフォルトに頼れない場合
当然ながら、DBと紐付かないActiveModelを使うような場合、DB頼みのデフォルト値は利用できません。また、単純な固定値ではなく、状況に応じて計算するもの[^1]や、リレーションで設定するデフォルト値のようなものに対しては、DB単体で対応しきれない部分もあります。

## モデルのコールバック
<del>ActiveModelや</del>ActiveRecordでは、モデルが特定の動作をするときに、コールバックを設定することができます。`after_initialize`を使えば、初期化の済んだタイミングでコードを呼び出すことができます。

**※注（追記）：ActiveModel::Callbacksを使えば、ActiveRecordでないモデルにコールバックを仕込むことはできますが、さらにひと手間必要です。**自分で立てるモデルなら、コールバックへ頼らずに、`initialize`から自力で呼び出すほうがスッキリしそうな気もします。

```rb:after_init.rb
  after_initialize :set_default, if: :new_record?

  private
  def set_default
    self.some_date ||= Time.zone.today
  end
```

なお、何も設定しない場合、`after_initialize`はDBから取り出したものにも走りますので、`if: :new_record?`は外せません。

## gemで解決
とはいえ、初期値が必要になるたびにこれだけ書くのは手間です。さらに調べていたところ、`default_value_for`というgem（[Github](https://github.com/FooBarWidget/default_value_for)）があることがわかりました。これを使えば、

```rb:default_value_for.rb
  default_value_for :uuid do
    UuidGenerator.new.generate_uuid
  end
```
のような形で、デフォルト値を宣言的に書くことができます。

[^1]: PostgreSQLやSQliteでは式でデフォルト値を設定できるようですが、このような機能がActiveRecordと整合して使えるのかは、筆者はよくわかっていません（そして、筆者がよく使うMySQLでは`CURRENT_TIMESTAMP`以外の設定はできませんので、逆に気にしなくて構わないという状況です）。
iOSのFrameworkがどのようにCPUとGPUを使い分けるのか

iOSアプリ開発においてパフォーマンスを気にするなら、標準Frameworkのうちどのクラスがレンダリングの際にCPUに依存してしまうのかを理解するのはすごく大事なことだと思います。少し古いですが参考になる記事を見つけたので重要だと感じた部分をピックアップします。
https://robots.thoughtbot.com/designing-for-ios-graphics-performance
とても有名な記事だと思います。（AppleのUIKit開発者Andy Matuschakが情報提供してくれた？）

UIKitの構造
------------

* UIKit
	- CoreAnimation
		+ OpenGLES
			+ GPUを使用
			+ Cで書かれている
		+ CoreGraphics
			+ CPUを使用
			+ Cで書かれている

Offscreen drawing とは
----------------------
GPUに渡す前に、バックグランドでCPUを使ってビットマップを生成する処理。


Offscreen drawing が起こる条件
---------------------------

* CoreGrapics（接頭語がCGのクラス）
* drawRectメソッド
* shouldRasterizeプロパティがYESのCALayer
* setMasksToBoundsを使ってマスクしているか、setShadow*を使って影をつけているCALayer
* CoreTextを含む、画面に表示されるあらゆるテキスト
* GroupOpacity（UIViewGroupOpacity）
React.jsでビルドされる前のコードをブラウザで確認する

React.jsで書いたコードをブラウザでデバッグするとき、ビルド前のコードで確認する方法です。

バンドル化にはwebpack、ブラウザはChromeを使用しています。

まず、webpack.config.jsに次の1行を加えます。
  
```
devtool: 'inline-source-map',
```
これにより、データURLがjavascriptに追加されます。

ブラウザでの確認は、ChromeのJavascriptコンソールのSourcesタブの左のペイにあるwebpack://ディレクトリ内に元ファイル開きます。

また、webpackのdevtool:の設定は他にもでき、webpackのgithubページを引用すると、
http://webpack.github.io/docs/configuration.html
>**devtool**

>Choose a developer tool to enhance debugging.
**eval** - Each module is executed with eval and //@ sourceURL.
**source-map** - A SourceMap is emitted. See also output.sourceMapFilename.
**hidden-source-map** - Same as source-map, but doesn’t add a reference comment to the bundle.
**inline-source-map** - A SourceMap is added as DataUrl to the JavaScript file.
**eval-source-map** - Each module is executed with eval and a SourceMap is added as DataUrl to the eval.
**cheap-source-map** - A SourceMap without column-mappings. SourceMaps from loaders are not used.
**cheap-module-source-map** - A SourceMap without column-mappings. SourceMaps from loaders are simplified to a single mapping per line.

>Prefixing @, # or #@ will enforce a pragma style. (Defaults to #, recommended)
Combinations are possible. hidden, inline, eval and pragma style are exclusive.
i. e. cheap-module-inline-source-map, cheap-eval-source-map, #@source-map
Hint: If your modules already contain SourceMaps you’ll need to use the source-map-loader to merge it with the emitted SourceMap.

とあります。

メモリの使用に大きく影響があるので、環境にあわせ使用するのがいいかと思いますが、Chromeでのデバッグではinline-source-mapが便利でいいですね。
文字列シャッフルワンライナー

Python でのシャッフルは `random.shuffle(list)` でやりますが文字列でやろうとすると怒られるので一度 `list(strings)` しないといけなくて しかも `None` が返ってくるのでめちゃくちゃだるい！死んじゃう！となっていたのですが `random.sample()` を知ったので生きる！！となりました  
`random.sample()` は対象からピックアップして任意の長さのリストを返してくれるので文字列で受け取る `lambda expression` にするとこんな感じ

```py3:Supercalifragilisticexpialidocious
Supercalifragilisticexpialidocious = lambda x: ''.join(random.sample(x ,len(x))
```

ワンライナー書くなら
`s='strings';''.join(__import__('random').sample(s,len(s)));`

```pycon
>>> for _ in 'Supercalifragilisticexpialidocious':
...     print(Supercalifragilisticexpialidocious('Supercalifragilisticexpialidocious'))
...
euirfetxipsailigusodlrlcaiipciSaco
Sodirupiliasgsiurfolapicceexitailc
ooiiscxeiurialaaceldgprpfitiulcisS
igiSaclepilcespuairioxcloaustirdif
iclcfllguporastecSxipiierodaiiausi
Saticaausridlfeocolcilpiipigxureis
Siitreasieaailirloccgsofxluudciipp
iaceliufaStrgiuiroceaxlosppiilidsc
scarllreoiiscdoxtugepaiaSifiicupli
fcigellraoispSpcloexiuiiudistaraic
cgirSdllicsoipcliuispoirataexeufia
tiiuieiclgclSdiaoeplsaorucapsiifxr
pacliiirxslSliiasgieotuufiacdrpeoc
llfscuoiairairlpcopseiSxiiudtgcaie
tipoguaidlecliirosifSaciarpseuicxl
iiaptfusriplosciagcaluexiSicriodel
ioiaxSdlpracluptgcieusrilfiaiicsoe
Saitallirpiudxfusieooigraiseccicpl
opuiocSalscrldriieiisiuetxfgacilpa
aidocalirxitgSieoscliiuiecuarplpfs
prasiriileofxedlosaiacgSipculticui
ipillafcuoslircaeieiiuasitpoScgxrd
ispilpreafitxsuiglcooiuiSeaidrccla
uiipxfSilrsdipoaiirsilaclutecaogec
siaeplipfociSliaierrtlugcdoasxcuii
aisioepieifioxagSsicltcdrcullpiaur
coasSlarlgocauritsilciideuippfiiex
slpeacpicarldegrtxiSiiiisuialooucf
ilpclcsipuuSageaacrfdosiexiriiloit
xrpuoilsfaocaaSeritdlpgsiliuiiecic
ulixlStidaaicsirlsieceougfaciirpop
cgtieloiiSpaaiileaiuduoxcifcslprrs
cruapiorigcaisidpifecelllatusxSiio
liiuSectioixclsioiigpaasclureprfad
```
「RSpecでも assert xxx って書いてテストしたい」=> すぐできます！


## はじめに
「RSpecは `expect(X).to` みたいな書き方しかできないから嫌い！」
「RSpecでも `assert xxx` や `assert_equal X, Y` を使いたい！」

と思ったことはありませんか？

この記事はそんなふうに考えている方へのHowto記事です。

## rspec-railsでMinitestのアサーションを使う

実はrspec-railsを使うと、デフォルトでMinitestのアサーションが使えるようになっています。

もし手元にrspec-railsを使っているプロジェクトがあれば、試しに以下のようなコードを実行してみてください。
きっとパスするはずです。

```ruby
require 'rails_helper'

describe 'Sample' do
  example do
    expect(1 + 1).to eq 2
    
    # Minitestのアサーションを使う
    assert_equal 2, (1 + 1)
    assert ''.blank?
    refute ''.present?
  end
end
```

### 参考：テスト失敗時の出力例

```
F

Failures:

  1) Sample should eq 2
     Failure/Error: assert_equal 2, (1 + 10)
     Minitest::Assertion:
       Expected: 2
         Actual: 11
     # ./spec/models/sample_spec.rb:8:in `block (2 levels) in <top (required)>'

Finished in 0.00235 seconds (files took 2.35 seconds to load)
1 example, 1 failure

Failed examples:

rspec ./spec/models/sample_spec.rb:4 # Sample should eq 2
```

### 動作確認した環境

- Ruby 2.2.2
- Rails 4.2.1
- rspec-rails 3.2.1

## 素のRSpecでMinitestのアサーションを使う

rspec-railsを使わない、素のRSpecでもMinitestのアサーションを使う方法はあります。
手順は以下の通りです。

### 1. GemfileにMinitestを追加

```diff
 source "https://rubygems.org"
 
 gem "rspec"
+gem "minitest"
```

```
# Minitestをインストール
bundle install
```

### 2. spec_helper.rbにMinitestを使う設定を追加

```diff
 RSpec.configure do |config|
+  config.expect_with :rspec, :minitest
   config.expect_with :rspec do |expectations|
     expectations.include_chain_clauses_in_custom_matcher_descriptions = true
   end
   # ...

```

### 3. Minitestのアサーションを使ってテストを書く

```ruby
require 'spec_helper'

describe 'Sample' do
  example do
    expect(1 + 1).to eq 2
    
    # Minitestのアサーションを使う
    assert_equal 2, (1 + 1)
    assert ''.empty?
    refute 'X'.empty?
  end
end
```

```
# 実行
bundle exec rspec
```

### 備考
素のRSpec環境をセットアップする方法は @yusabana さんの以下の記事を参考にしてください。

[RailsじゃないRspec3環境を構築する方法 - Qiita](http://qiita.com/yusabana/items/db44b81bdddf6ed0e9f5)


### 動作確認した環境

- Ruby 2.2.2
- rspec 3.2.0
- minitest 5.7.0

## まとめ
「あれ？RSpecってこんなときどんなマッチャを使うんだったっけなー？あー、調べるの面倒くさい！」って思ったときは、サクッとアサーションを書くのもアリかもしれませんね。

以上、ご参考までに。

### あわせて読みたい
Minitestのアサーションもいいけど、あらためてRSpecのマッチャを勉強したいなと思った方はこちらの記事をどうぞ！

- [使えるRSpec入門・その2「使用頻度の高いマッチャを使いこなす」 - Qiita](http://qiita.com/jnchito/items/2e79a1abe7cd8214caa5)
- [Ruby - 今日から使える！RSpec 3で追加された8つの新機能 - Qiita](http://qiita.com/jnchito/items/a4a51852c2c678b57868)
コマンドの標準出力と標準エラーを logger にパイプしつつ標準エラーはそのまま標準エラーに出す

正常系のメッセージは標準出力に、異常系のメッセージは標準エラーに出すようになっているコマンドがあったとします。

これを cron に設定するときに、次のようにログおよびメール通知を行いたいです。

- 正常系のメッセージ(標準出力)
    - ログファイルに出力
- 異常系のメッセージ(標準エラー)
    - ログファイルに出力
    - メールで通知

メール通知は標準出力または標準エラーにそのまま吐き出せば crond が勝手にやってくれます。

ログファイルへの出力は logger コマンドにパイプしておけば（syslog の設定によりますが） /var/log/messages にそれっぽい形式で書かれるのでオススメです。

```console
$ echo "this is test" | logger -i -t hogehoge
$ sudo tail -1 /var/log/messages
May 29 20:02:39 ore-no-server hogehoge[20595]: this is test
```

が、この２つを前述のように共存させるのは結構面倒でした。

試行錯誤の結果次のようになりました。

```bash
(./hogehoge 2> >(tee /dev/stderr)) | logger -i -t hogehoge
```

`>(command)` はプロセス置換と呼ばれるものです。

`./hogehoge` の標準出力と、プロセス置換の中の `tee` の標準出力をサブシェルでまとめて `logger` にパイプしているのですが、正直これで大丈夫なのか不安です。

----

別の方法も教えてもらいました。

<blockquote class="twitter-tweet" lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/ngyuki">@ngyuki</a> あ、すいません、勘違いしてました。もう解決したみたいですが、こんな感じでもできました。もう何が何やらですけど…。&#10;(hogehoge 3&gt;&amp;2 2&gt;&amp;1 1&gt;&amp;3 | tee /dev/stderr ) 3&gt;&amp;2 2&gt;&amp;1 1&gt;&amp;3 | logger -t xxx</p>&mdash; とみたまさひろ (@tmtms) <a href="https://twitter.com/tmtms/status/604230233516941313">2015, 5月 29</a></blockquote>

```bash
(./hogehoge 3>&2 2>&1 1>&3 | tee /dev/stderr ) 3>&2 2>&1 1>&3 | logger -i -t hogehoge
```

`3>&2 2>&1 1>&3` は標準出力と標準エラーを入れ替えるパターンです。
Unity+NGUIでSpriteを反転する

一般的にSpriteを反転させるには

```lang:一般的なやり方
sprite.x *= -1
```

のようにtransform上の数値をいじる。

しかしNGUIにはflipというフィールドがあり、これを差し替えることで自由に反転することができる。

```lang:NGUIの場合
UI2dSprite _sprite;

void hoge() {
  //左右を反転させる
  _sprite.flip = UIBasicSprite.Flip.Horizontally;
  //上下を反転させる
  _sprite.flip = UIBasicSprite.Flip.Vertically;
  //左右かつ上下を反転させる
  _sprite.flip = UIBasicSprite.Flip.Both;
  //反転をやめる
  _sprite.flip = UIBasicSprite.Flip.Nothing;
}

```

transformをいじるよりはるかに意図が伝わりやすくていいね＞＜
MacアプリでiOSアプリみたいにURL Scheme起動すんのってどうやんの？を調べてみた


意外と説明している記事がなかったのであげてみる。
info.plistにURL Schemeを設定するのはiOSと全く一緒だった。

iOSだとAppDelegateにopenUrlみたいなハンドラがあるんだけど、Macの場合はAPIが違った。

```AppDelegate.swift
  func applicationDidFinishLaunching(aNotification: NSNotification) {
    // Insert code here to initialize your application
    var appleEventManager:NSAppleEventManager = NSAppleEventManager.sharedAppleEventManager()
    appleEventManager.setEventHandler(self, andSelector: "handleGetURLEvent:replyEvent:", forEventClass: AEEventClass(kInternetEventClass), andEventID: AEEventID(kAEGetURL))
    var appUrl = NSBundle.mainBundle().bundleURL.URLByAppendingPathComponent("", isDirectory: true)
    var a:Boolean = 0 // true
    var status = LSRegisterURL(appUrl as CFURL!, a)
  }

  func handleGetURLEvent(event: NSAppleEventDescriptor?, replyEvent: NSAppleEventDescriptor?) {
    println("yay");
  }
```

これだけやれば、
ターミナルから
``` $ open [URLスキーマ]://``` 
とか、
WEBページの
```<a href="[URLスキーマ]://">Open your app</a>```
とかで起動できた。
アプリが起動してなくても、インストール済みであればダイジョブだった。

サンプルを以下に置いてますのでご参考まで。
https://github.com/toshi0383/MacAppURLSchemeSample