OmniAICreator/Qiita-1.07M huggingface dataset:
AndroidStudioでrelease用apkのファイル名を変更して特定フォルダにコピーする

#1 build.gradleを編集する

```xml:build.gradle
  signingConfigs {
    release
  }
  buildTypes {
    release {
      signingConfig signingConfigs.release
    }
  }

  applicationVariants.all { variant ->
    if (variant.buildType.name.equals("release")) {
      variant.outputs.each { output ->
        if (output.outputFile != null && output.outputFile.name.endsWith('.apk')) {
          // Rename APK
          def versionCode = defaultConfig.versionCode
          def versionName = defaultConfig.versionName
          def date = new java.text.SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date())
          def newName = "AppName_r${versionCode}_v${versionName}_${date}.apk"

          def publish = project.tasks.create("publishAll")

          // Move and Rename APK
          def task = project.tasks.create("publish${variant.name.capitalize()}Apk", Copy)
          task.from(output.outputFile)
          task.rename(output.outputFile.name, newName)
          task.into(deployTo)

          task.dependsOn variant.assemble
          publish.dependsOn task
        }
      }
    }
  }

...

  if (project.hasProperty('storeFile')) {
    android.signingConfigs.release.storeFile = new File(storeFile)
  }
  if (project.hasProperty('storePassword')) {
    android.signingConfigs.release.storePassword = storePassword
  }
  if (project.hasProperty('keyAlias')) {
    android.signingConfigs.release.keyAlias = keyAlias
  }
  if (project.hasProperty('keyPassword')) {
    android.signingConfigs.release.keyPassword = keyPassword
  }
```

#2 gradle.propertiesを作成して編集する

```xml:gradle.properties
storeFile=your.keystore
storePassword=yourpassword
keyAlias=youralias
keyPassword=yourpassword

deployTo=/Users/xxxx/Documents/apk
```

AndroidStudioの右端にある「Gradle tasks」を開き、
「publishAll」を探して実行するか(見つからない場合は、「Refresh」ボタンを押してみる)、以下のコマンドをプロジェクトフォルダで実行。

```
$ ./gradlew publishAll 
```

AppName_r5_v1.0.5_20150331_121230.apk
が、
/Users/xxxx/Documents/apk/下に作成されます。

#3 参考
http://qiita.com/takke/items/c6c774807f064500aca4
http://qiita.com/wada811/items/e8047f0f0fd1203b0fc5
EC-CUBE3開発環境設定（失敗編）

# git clone
[EC-CUBE3のメモ - GitHub/Git使い方](http://qiita.com/chihiro-adachi/items/f31c9d90b1bcc3553c20)を参考に、fork した後、git clone

# データベースの用意
使用するデータベースで、データベースユーザとデータベースを作成

# インストールの設定変更
「eccube_install.sh」の内容を変更
多分この辺り

```lang:eccube_install.sh
…
ADMIN_MAIL=${ADMIN_MAIL:-"◯◯◯◯◯"}
HTTP_URL=${HTTP_URL:-"◯◯◯◯◯"}
HTTPS_URL=${HTTPS_URL:-"◯◯◯◯◯"}
…
DBNAME=${DBNAME:-"◯◯◯◯◯"}
DBUSER=${DBUSER:-"◯◯◯◯◯"}
DBPASS=${DBPASS:-"◯◯◯◯◯"}
…
```
「HTTP_URL」などの設定は、「app/config/eccube/config.php」をいじれば後からでも出来そう？！

# インストールの実行
`$ ./eccube_install.sh pgsql`

# 定数の設定
[EC-CUBE/ec-cube インストール方法](https://github.com/EC-CUBE/ec-cube#%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E6%96%B9%E6%B3%95)を参考に、以下のファイルを手動作成

```lang:src/Eccube/Constant.php
<?php

namespace Eccube;

class Constant
{
    const ROOT = '/◯◯◯◯/html/';
    const TPL = '/◯◯◯◯/html/user_data/packages/default/';
    const SHOP_NAME = 'EC-CUBE3 SHOP';
    const RELEASE_YEAR = '2015';
}
```
# 表示確認
「HTTP_URL」に設定した URL にアクセスして、表示を確認
表示されない…
「html/index.php」にて
`var_dump(__DIR__.'/../vendor/autoload.php');`
`string(67) "/◯◯◯/◯◯◯/◯◯◯/◯◯◯/◯◯◯/ec-cube/html/../vendor/autoload.php"`
そもそも「vendor/autoload.php」が無い模様…
今ここで躓き中…

# 原因
PHP のバージョンが合っていないため、vendor 以下が生成されないようでした。
以下の場合は、PHP のバージョンを上げる必要があるようです。
http://qiita.com/chihiro-adachi/items/645fee870d50a985dc88#comment-d167823c0d8b603c4668

```
$ curl -sS https://getcomposer.org/installer | php
#!/usr/bin/env php
Some settings on your machine may cause stability issues with Composer.
If you encounter issues, try to change the following:

Your PHP (5.3.2-1ubuntu4.28) is quite old, upgrading to PHP 5.3.4 or higher is recommended.
Composer works with 5.3.2+ for most people, but there might be edge case issues.

Downloading...

Composer successfully installed to: /◯◯◯/◯◯◯/◯◯◯/◯◯◯/◯◯◯/ec-cube/composer.phar
Use it: php composer.phar
```

```
$ php composer.phar install
                                                              
  [Composer\Json\JsonValidationException]                     
  "./composer.json" does not match the expected JSON schema:  
   - homepage : Invalid URL format                            

install [--prefer-source] [--prefer-dist] [--dry-run] [--dev] [--no-dev] [--no-plugins] [--no-custom-installers] [--no-autoloader] [--no-scripts] [--no-progress] [-v|vv|vvv|--verbose] [-o|--optimize-autoloader] [--ignore-platform-reqs] [packages1] ... [packagesN]
```




# 参考
* [EC-CUBE/ec-cube インストール方法](https://github.com/EC-CUBE/ec-cube#%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E6%96%B9%E6%B3%95)
* [EC-CUBE3のメモ - GitHub/Git使い方](http://qiita.com/chihiro-adachi/items/f31c9d90b1bcc3553c20)
* [EC-CUBE3のメモ - 開発環境 -](http://qiita.com/chihiro-adachi/items/645fee870d50a985dc88)
rubyのsinatraでrspecとcapybaraでテストをやりたいんだがnokogiriがエラーでinstallできないのはどういう訳か。

注）環境は
> OSX10.9.5
> ruby 2.0.0p481 (2014-05-08 revision 45883) [universal.x86_64-darwin13]
> gem 2.4.6


しかし、ruby、gem、bundle、なぜエラーばっか起こしてインストールから先に進めないのか。
元を正せば今度はsinatraで開発しようって話から始まった。
普通に sinatra と sinatra-contrib を入れて

```bash
ruby main.rb
```

で localhost:4567 でアプリ起動〜ってなるはずがエラーになる。
いや、普通に `gem install` しただけなんすけどね。

```bash
gem install sinatra
gem install sinatra-contrib
```

これで `ruby main.rb` すると

```bash
/Library/Ruby/Site/2.0.0/rubygems/specification.rb:2112:in `raise_if_conflicts': Unable to activate sinatra-contrib-1.4.2, because tilt-2.0.1 conflicts with tilt (~> 1.3) (Gem::ConflictError)
```

ってエラーが出て動かない。
ところがbundlerを使って、

```bash
bundle exec ruby main.rb
```

ってやるとなぜか動くんだなこれが。
わからん。
なんで？

で、テストをしたいので Gemfile に、

```ruby:Gemfile
group :test do
	gem 'rspec', '~> 2.14.1'
	gem 'capybara', '~> 2.2.1'
end
```

と追加して、

```bash
bundle install
```

すると、

```bash
libxml2 is missing.  Please locate mkmf.log to investigate how it is failing.
```

となって失敗。もうこのエラーはいろんな人が報告していて対処方法もいろんなものが検索するとヒットするんだが、どうもこれという決定版がない。

```bash
Make sure that `gem install nokogiri -v '1.6.6.2'` succeeds before bundling.
```

と出ているので、やってみる


```bash
sudo gem install nokogiri -v '1.6.6.2'
```

結果。

```bash
libiconv is missing.  Please locate mkmf.log to investigate how it is failing.
```

やっぱしだめ。


なんなんすかね。
で、いろいろ調べて以下のコマンドを打ってみる。


```bash
sudo env ARCHFLAGS="-arch x86_64" gem install nokogiri:1.6.6.2 -- --use-system-libraries --with-xml=/usr/local/Cellar/libxml2/
```

出力。

```bash
Building native extensions with: '--use-system-libraries --with-xml=/usr/local/Cellar/libxml2/'
This could take a while...
Successfully installed nokogiri-1.6.6.2
Parsing documentation for nokogiri-1.6.6.2
unable to convert "\xCF" from ASCII-8BIT to UTF-8 for /Library/Ruby/Gems/2.0.0/extensions/universal-darwin-13/2.0.0/nokogiri-1.6.6.2/nokogiri/nokogiri.bundle, skipping
unable to convert "\xCF" from ASCII-8BIT to UTF-8 for lib/nokogiri/nokogiri.bundle, skipping
1 gem installed
```

入った！

で、再び `bundle install`

```bash
Using backports 3.6.4
Using mime-types 2.4.3
Using mini_portile 0.6.2
Using nokogiri 1.6.6.2
Using rack 1.6.0
Using rack-test 0.6.3
Using xpath 2.0.0
Using capybara 2.2.1
Using diff-lcs 1.2.5
Using multi_json 1.11.0
Using rack-protection 1.5.3
Using rspec-core 2.14.8
Using rspec-expectations 2.14.5
Using rspec-mocks 2.14.6
Using rspec 2.14.1
Using tilt 1.4.1
Using sinatra 1.4.6
Using sinatra-contrib 1.4.2
Using bundler 1.9.1
Bundle complete! 4 Gemfile dependencies, 19 gems now installed.
Use `bundle show [gemname]` to see where a bundled gem is installed.
```

入った！
で、

```bash
bundle exec rspec --init
bundle exec rspec
```

出力。

```bash
No examples found.


Finished in 0.00007 seconds
0 examples, 0 failures
```

動いてるっぽい。だが、

```bash
bundle install --path vendor/bundle/
```

とやるといつものエラー。

```bash
libxml2 is missing.  Please locate mkmf.log to investigate how it is failing.
```

以下のようにしてみても。


```bash
bundle config build.nokogiri --use-system-libraries
bundle install --path vendor/bundle/
```

やっぱりエラー。

```bash
libxml2 is missing.  Please locate mkmf.log to investigate how it is failing.
```

なんで〜。
[Rails 4.x] Linuxで、wkhtmltoimage(wkhtmltopdf) を利用して WebサイトのScreenshot を取る

In many cases, phantom.js is used to get screen capture. But wkhtmltoimage can be alternative.

# Install

http://wkhtmltopdf.org/downloads.html

```rb
$ sudo yum install -y openssl libX11 libXext libXext.so.6
```

```rb
$ cd /usr/local/src
$ wget http://downloads.sourceforge.net/project/wkhtmltopdf/0.12.2.1/wkhtmltox-0.12.2.1_linux-centos6-amd64.rpm

$ sudo rpm -ivh wkhtmltox-0.12.2.1_linux-centos6-amd64.rpm
error: Failed dependencies:
	xorg-x11-fonts-Type1 is needed by wkhtmltox-1:0.12.2.1-1.x86_64
	xorg-x11-fonts-75dpi is needed by wkhtmltox-1:0.12.2.1-1.x86_64
```

## Install dependencies

```rb
$ sudo rpm -ivh ftp://rpmfind.net/linux/centos/6.6/os/x86_64/Packages/ttmkfdir-3.0.9-32.1.el6.x86_64.rpm

$ sudo rpm -ivh ftp://rpmfind.net/linux/centos/6.6/os/x86_64/Packages/xorg-x11-fonts-Type1-7.2-9.1.el6.noarch.rpm

$ sudo rpm -ivh ftp://rpmfind.net/linux/centos/6.6/os/x86_64/Packages/xorg-x11-fonts-75dpi-7.2-9.1.el6.noarch.rpm

$ sudo rpm -ivh wkhtmltox-0.12.2.1_linux-centos6-amd64.rpm
```

# Japanese Font

## Install IPA font

```rb
# set font files at user home directory 
$ mkdir ~/.fonts
$ cp IPAfont00302.zip ~/.fonts
$ cd ~/.fonts 
$ unzip IPAfont00302.zip 
```

```rb
# clear font cache
$ fc-cache -fv
```

```rb
# confirm installed font
$ fc-list
```

## if something doesn't go well....

```rb
$ sudo cp ~/.fonts/*.ttf /usr/share/fonts/
```

# Command

```rb 
$ wkhtmltoimage http://www.google.com hoge.jpg
```

# IMGKit

https://github.com/csquared/IMGKit

if you want to edit captured image, try to use [IMGKit](https://github.com/csquared/IMGKit).

but lots of error has occurred by IMGKit, so I think Phantom.js is better solution than this.

# Batch Script

basic script to get screenshot and save to /tmp/screenshot/hoge.jpg

```rb:example.rb
# encoding: utf-8
namespace :screenshot do
  desc "get screenshot from official_url and save tmp/screenshots/"
  task :get => :environment do

    quality       = 100
    aspect_width  = 4
    aspect_height = 3 # height : width = 4 : 3
    width         = 1200
    height        = width * 3 /4

    output_dir = "tmp/screenshots/"

    items.each do |item|
      output_file = "#{item.id}.jpg"
      file_path = output_dir + output_file
      command = "wkhtmltoimage --quality #{quality} --width #{width} --height #{height} #{url} #{file_path}"
      IO.popen("#{command}")
    end
  end
```

# warnings
process of getting screenshot sometimes stop by some reasons. network trouble, batch-server-spec, js, css...
so try many time to get image completely.

# ref

- http://labs.earthpeople.se/2014/10/making-headless-screengrabs-without-phantomjs/
http://rpmfind.net/linux/rpm2html/search.php?
jQueryで数値をイージング変化させる方法

下記のコード使うとコンソールに r の値が swing の動きで 50 から 90 まで変化しながら数値で書き出されます。

また、jQueryUI や jquery.easing のプラグインを入れて easing に easeOutBounce などを指定すると数値がバウンスします。
SVG の値をイージングをかけて変化させたい時などに使います。

####やりかた####
```javascript:jQuery

var rFrom = 50, rTo = 90;    //rFrom は開始時の値、rTo は終了時の値。

$({ratio: 0})
    .animate({ratio: 1}, {
	duration:1000,
	easing:"swing",
        progress: function(){
            var r = (rTo - rFrom) * this.ratio + rFrom;
            console.log('r ' + r );    //イージング変化した値が出力される。
        }
    });
```
　
####jQuery1.4.x以前のバージョンを使う場合は以下の書き方になります####
```javascript:jQuery1.7.x以前

var rFrom = 50, rTo = 90;    //rFrom は開始時の値、rTo は終了時の値。

$({ratio: 0})
    .animate({ratio: 1}, {
	duration:1000,
	easing:"swing",
        step: function(){
            var rNow = (rTo - rFrom) * this.ratio + rFrom;
            someAnimation(rNow);
        }
        complete: function(){
            someAnimation(rTo);
        }
    });

function someAnimation(r){
    console.log('r ' + r );    //イージング変化した値が出力される。
}
```

　
####作例 SVGの円をボヨンとさせる####
```javascript:jQuery
var rFrom = 50, rTo = 90;

$({ratio: 0})
    .animate({ratio: 1}, {
	duration:2000,
	easing:"easeOutBounce",
        progress: function(){
            var r = (rTo - rFrom) * this.ratio + rFrom;
            $("circle").attr("r",r);
        }
    });
```
```html:html
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.3/jquery-ui.min.js"></script>

<h1>SVGの円をボヨンとさせる</h1>

<svg width="200" height="200"
	xmlns="http://www.w3.org/2000/svg"
	xmlns:xlink="http://www.w3.org/1999/xlink">
	<circle cx="100" cy="100" r="50" stroke="#0172be" fill="#0172be" stroke-width="5"/>
</svg>

```
※ jQuery1.4.x 以前で step を使うとこの場合不具合があったのと、良い方法を教えていただいたのでスクリプトを修正しました。
Proxy環境下のDockerトラブルシューティング


弊社環境がProxyであるために色々とめんどうな設定やらハマって抜け出せないとかあったのでメモ

基本的に反応がなかったりコマンドがまともに機能しなかったり、めんどくさいことしかないです。

## Proxyの設定

これを通しとかないとどうしようもないです。
イメージのPullとかもできません。
設定箇所はOSによって違います。

Dockerのバージョンによっても変わる可能性がありますが、一応1.4，1.5では以下の場所でいけてます。

### CoreOS

`/etc/systemd/system/docker.service`

``` /etc/systemd/system/docker.service
[Service]
Environment="HTTP_PROXY=http://172.17.192.16:8080/"
```

### CentOS

`/etc/sysconfig/docker`

``` /etc/sysconfig/docker
export http_proxy=http://xxx.xxx.xxx.xxx:8080/
export https_proxy=http://xxx.xxx.xxxx.xxx:8080/
export no_proxy=yyy.yyy.yyy.yyy
```

### Ubuntu

`/etc/default/docker`

``` /etc/default/docker
export http_proxy=http://xxx.xxx.xxx.xxx:8080/
export https_proxy=http://xxx.xxx.xxx.xxx:8080/
```

## Docker Toolbox

Docker Toolboxが出て、`docker-machine`が使えるようになったのでBoot2Dockerの方は同じようにdocker-machine上に設定をしてください。

### docker machineにログインする

[boot2dockerにログインする](#1-boot2dockerにログインする)の代わりにこれをどうぞ。

```
docker-machine ssh {docker-machine-name}
```

設定はboot2dockerと同じです。

### Proxy設定されたDocker Machineを作成する

すでにある場合は上記で設定してもらうとして、新しくProxy設定された状態でMachineを作ることもできます。

```
docker-machine create -d virtualbox \
               --engine-env http_proxy=${http_proxy} \
               --engine-env https_proxy=${https_proxy} \
               default
```

## Boot2Dockerトラブル

### NoProxyを設定しましょう。

Dockerを1.5にしたあたりからハマりました。
それまでは普通に動いてたような気がするんだけど…。

設定してないと以下のようなエラーが出ます。

```
FATA[0000] An error occurred trying to connect: Get https://192.168.59.103:2376/v1.17/version: Forbidden
```

環境変数で`NO_PROXY`を設定する必要があるので設定しましょう。
Dockerクライアント（MacとかWindowsとか）側です。

```
export NO_PROXY=xxx.xxx.xxx.xxx,localhost,127.0.0.1,.....
```

ちなみに、これ設定したのにずっと動かない！って悩んでふとしたときに見たら、IPの最後の一桁抜けて書いてました。
なんとマヌケなことか…。

### Docker側のProxyを設定しましょう。

#### 1. boot2dockerにログインする

```
$ boot2docker ssh
```

#### 2. 設定を変更する

```
$ sudo vi /var/lib/boot2docker/profile
```

``` /var/lib/boot2docker/profile
export HTTP_PROXY=http://xxx.xxx.xxx.xxx:8880
export HTTPS_PROXY=$HTTP_PROXY
export NO_PROXY=localhost,127.0.0.1,.sock
```

#### 3. Docker再起動（Boot2docker内）

```
$ sudo /etc/init.d/docker restart 
```

これでBoot2dockerのクライアント側でDockerコマンド使えます！

## Docker Private Registry

Proxyじゃないですけど、ついでに。

プライベートレジストリーを使用する場合、たぶん引っかかると思います。
`--insecure-registry`を設定する必要があります。

### Boot2Docker

#### 1. boot2dockerにログインする

```
$ boot2docker ssh
```

#### 2. 設定を変更する

上記のプロキシの設定の後ろにでも付けてください。

``` /var/lib/boot2docker/profile
export EXTRA_ARGS="--insecure_registry xxx.xxx.xxx.xxx:<port>"
```

#### 3. Docker再起動

これで社内のプライベートレジストリへのPush/Pullできます！

## Kitematic

Mac向けですが、これもProxy環境下だと初期設定すらできません。
普通にアプリのアイコンクリックで起動だとダメです。

きっとProxy環境下を強いられている人は環境変数やらに`http_proxy`、`https_proxy`を設定しているかと思いますが、
ターミナルから上記環境変数を設定した上でアプリを起動してください。

[ここ](https://github.com/kitematic/kitematic/issues/321)にお世話になりました。

```
open /opt/homebrew-cask/Caskroom/kitematic/0.5.13/Kitematic\ \(Beta\).app
```

初回起動はけっこう時間がかかりますが、ほっとけばそのうち起動します。
NodeJS expressをリバースプロキシさせた時にreq.protocolを取れない罠

# 構成
EC2にnginxを入れてlocalhostで動かしている。サイト自体はSSLに対応しており、httpsアクセスできる

# 状況
nginx.confでヘッダを付加するようにしているにも関わらず、` req.protocol`の取得値がhttp。

```nginx.conf
        location / {
            proxy_pass http://localhost:3000/;
            proxy_set_header Host                   $host;
            proxy_set_header X-Real-IP              $remote_addr;
            proxy_set_header X-Forwarded-Proto      https;
            proxy_set_header X-Forwarded-Host       $host;
            proxy_set_header X-Forwarded-Server     $host;
            proxy_set_header X-Forwarded-For        $proxy_add_x_forwarded_for;
        }
```

# 罠の正体
`app.set('trust proxy', 'loopback') `をapp.jsに書いてなかった

>The request protocol string, “http” or “https” when requested with TLS. When the “trust proxy” setting trusts the socket address, the value of the “X-Forwarded-Proto” header (“http” or “https”) field will be trusted and used if present.

[expressの公式ドキュメント](http://expressjs.com/api.html#req.protocol)に書いてあるんですが見逃してました。公式ドキュメント読もう！
Freeモナドまとめ

最近よく耳にするFreeモナドについて、自分用にまとめました。自分以外にはわかりづらい可能性があります。

#モナドとは

自己関手の圏 $\mathcal{C}\to\mathcal{C}$ におけるモノイドのことです。
つまり関手 $M\colon\mathcal{C}\to\mathcal{C}$ で積 $M^2\to M$ と単位 $\mathrm{Id}\to M$ が与えられていて結合律と単位律を満たすもの。

#Freeモナドとは
関手 $F\colon\mathcal{C}\to\mathcal{C}$ に対し、文字通り $F$ で生成される自由なモナドのこと。
つまりモナド $F^\*\colon\mathcal{C}\to\mathcal{C}$ と関手の射 $F\to F^\*$ の組であって、別のモナド $M\colon\mathcal{C}\to\mathcal{C}$ と関手の射 $F\to M$ があったらそれが一意的にモナドの射 $F^\*\to M$ を経由するようなもの。

#性質
$F$ のFreeモナド $F^\*$ が存在するとする。すると自然に次のような同型がある。

$$F^\* = \mathrm{Id} + FF^\*$$

まず右辺から左辺への射は $F^\*$ の積と単位を使って $FF^\*\to F^\*F^\*\to F^\*$ と $\mathrm{Id}\to F^\*$ から作ることができる。
左辺から右辺への射を作るには、右辺をモナドにしてやって $F^\*$ のuniversalityを使えばよい。
ここで積を定義するのに左項の分配法則 $(\mathrm{Id} + FF^\*)^2 = (\mathrm{Id} + FF^\*) + FF^\*(\mathrm{Id} + FF^\*)$ を使う。
合成 $\mathrm{Id} + FF^\* \to F^\* \to \mathrm{Id} + FF^\*$ が $\mathrm{id}$ になることを示すのが少し面倒だが、$FF^\*$ を $F$ で生成される右 $F^\*$-加群だと思えれば簡単。

#構成
上の同型をヒントにして、実際に $F^\*$ を下から構築していくことができる（こともある）。
各順序数 $\alpha$ について、$F_\alpha$ を以下で再帰的に定義する。

$$F_\alpha \colon= \mathrm{Id} + FF_{<\alpha}, \qquad\text{where\}\quad F_{<\alpha} \colon= \varinjlim_{\beta<\alpha} F_\beta$$

ここでinductive limitは自然に定義される射 $F_0\to F_1\to\dots\to F_\omega\to\dotsb$ についてとる。
この列が収束するとき、つまりある順序数 $\delta$ で $F_\delta\to F_{\delta+1}$ が同型となるならば、収束先 $F^\*\colon=F_\delta$ が $F$ のFreeモナドになる。
$F^\*$ の積は下から順に $F_\alpha F^\*\to F^\*$ を作ってlimitをとれば定義できるが、ここで左項について合成がlimitを保つこと $F_{<\alpha}F^\* = \varinjlim_{\beta<\alpha}F_\beta F^\*$ を使っている。
universalityの証明も、同様に与えられた $F\to M$ について一意的な $F_\alpha\to M$ を順に作っていけばよい。

例

1. $F$ が任意個の和を保つとき、$F_0=\mathrm{Id}$, $F_1=\mathrm{Id}+F$, $F_2=\mathrm{Id}+F+F^2$,... と大きくなっていき、$F^\* = F_\omega=\mathrm{Id}+F+F^2+\dotsb$ でストップする。
2. $P\colon\mathcal{S}\mathit{et}\to\mathcal{S}\mathit{et}$ を冪集合をとる関手とする。すると $P_\alpha$ は際限なく大きくなって収束しない。実際もし $P^\*$ があったとすれば、$P^\*\varnothing$ が宇宙全体になってしまう。
3. それに対し $P_{\mathrm{fin}}X$ を $X$ の有限部分集合全体とすると、$P_{\mathrm{fin}}\colon\mathcal{S}\mathit{et}\to\mathcal{S}\mathit{et}$ に対応する列は $\omega$ 世代で収束する。$P_{\mathrm{fin}}^\*X$ は $X$ の元をアトムとする遺伝的有限集合全体になる。

この逆が成り立つか、つまりFreeモナドが存在するなら必ずそこに収束するか、というとそれは難しい気がする。大きい宇宙に目標があった場合小さい宇宙の順序数でいくらがんばっても届かなさそうだし……。ちゃんと考えないとよくわからない。

#より一般に

このFreeモノイドの話は別に関手の圏に限らずもっと一般のモノイダル圏で話ができる。
ただし左項についてモノイダル積がlimitを保つこと $(\varinjlim_i X_i) \otimes Y = \varinjlim_i (X_i \otimes Y)$ が必要。

#Haskellで
$F$ を `f`, $F^\*$ を `Free f` とおきかえて $F^\* = \mathrm{Id} + FF^\*$ の関係をHaskellっぽく書くと、

```
data Free f a = A a | B (f (Free f a))
```

と書ける。`A` と `B` の記号に特に意味はないが、あえて同じ記号を濫用してわかりづらくすると

```
data Free f a = Pure a | Free (f (Free f a))
```

と巷でよく見るやつになる。データの構築も結局limitで下から作っていくのと似たようなことをしているはず。
ただ停止性やら遅延評価やら無限リストみたいなやつのことを考え出すとHaskellの圏は数学的にいろいろ汚くなるので（[参考](https://wiki.haskell.org/Hask)）あくまでメタファーくらいに思っておいたほうが精神的に平安が得られると思う。
[Rails 4.x] bulk insertをupdateでもしたいときにはupdate_allがあります

bulk insertをしたい場合は、

```rb
gem 'activerecord-import'
```

を使うといいのですが、updateの場合は？

MySQLでは↑のgemでbulk updateも出来るようですが。。。（PostgresとかSqliteとか...）

# update_all

速い話がこれで解決です。


```rb:
# openがfalseのレコードをすべてtrueに変更したい
Shop.where(open: false).update_all(open: true)

# 全部のレコードをopen: trueに
Shop.update_all open: true
```


# References

- http://qiita.com/Apuruny/items/cec1b29a5195dda441d1
- http://d.hatena.ne.jp/zucay/20121026/1351219598
Unity初心者のUnityメモ


# 簡単にゲーム出来ちゃう感
- Unityのチュートリアルとか本とか見ているとすぐにゲームが作れちゃう感が半端ない。
- 他のプラットフォームや言語だったら自分自身で書いたり、もしくはライブラリやフレームワークを使ったりしつつも基本的には自分でベースを作らなきゃいけない部分をUnityが補ってくれている感じ
- 物理エンジンや衝突判定など、普通に書いたら結構めんどくさくて心折れる処理はUnityのGUIでクリックしていけば設定できちゃう
- Assetがたくさんあって作りこまれてるのが多いからすぐにそれなり感だせる


# 感じたこと
- 誰でも簡単にできちゃう = 大規模開発になったら尋常じゃなく大変
- Unityありきの開発になってしまう
- Flashの時代で言うとフレームにActionScript書いてる感じがする
- jQuery使えますぐらい初期ハードル低い
- Monobehaiovurの魔法(extends MovieClipしておけばOKだった時みたい)
- Unityが勝手にやってくれている部分をちゃんと理解しないとやばそう

# まとめ
初日はこんなかんじ？
初心者の感じたことのメモなので、それおかしいでしょなどあればぜひご指摘お願いします！
Supervisorにおける死活監視通知とEvent Listenerプロセスを再起動したい

結論だけ書くと新しい名前で追加して、rereadしてupdateすればよい。

## Supervisor

Supervisorという便利プロセス管理ツールがある。プロセス監視以外に、STDOUTとSTDERRをログにつないでくれたり、複数プロセス起動してくれたりして便利だ。Supervisor 3.0からEvent Listenerという機能が追加されて、これを使うとSupervisor上で発生したイベントにフックしていろんな処理ができるようになった。

## EventListener

EventListenerはSupervisorが管理する他のプロセスと同様に、Supervisorの子プロセスとして起動され、標準入力/出力を経由してSupervisorと通信する。Supervisorからはイベントとその情報が渡されてくるので、それを元にメールを送信したり、外部の通知用HTTP APIを叩いたりできる。図にするとこんな感じ。

![supervisor.png](https://qiita-image-store.s3.amazonaws.com/0/5218/8abefc3d-c5ac-3a05-1397-3186e5430db4.png)

取得できるイベントには次の種類がある。

Supervisor側はプログラムの時とほぼ同じで、どのイベントを送るかを指定すれば良い。

```ini
[eventlistener:hello]
command=hello_listener.py
events=PROCESS_STATE_EXITED
```

あとはrereadしてupdateすれば反映される。


## プロトコル

イベントはヘッダとペイロードからできている。ヘッダとペイロードは改行で区切られており、ヘッダにはイベント共通の属性が付与されている。ペイロードはさらにヘッダ行を持っていて、例えば、`PROCESS_STATE_EXITED`イベントの場合次のようなかんじだ。

```
ver:3.0 server:supervisor serial:1 pool:listener poolserial:1 eventname:PROCESS_STATE_EXITED len:74
processname:hello groupname:hello from_state:RUNNING expected:0 pid:8888

```

Supervisorには`childutils`というモジュールが付属していて、これを使うと簡単にEventListenerのスクリプトを書ける。だいたいこんな感じ。

```hello_listener.py
import sys
from supervisor import childutils

def main():
    while 1:
        header, payload = childutils.listener.wait()
        payload_header, data = childutils.eventdata(payload)

        # debug print
        sys.stderr.write("event: %s\n".format(header['eventname']))
        sys.stderr.write("processname: %s\n".format(payload_header['processname']))
        sys.stderr.write("expected: %d".format(payload_header['expected'])
        sys.stderr.flush()


if __name__ == '__main__':
    main()

```

まあこんな感じで便利に使える。で、PagerDutyに通知したりするわけだけど、Event Listenerのスクリプトを修正したとき、Event Listenerだけ再起動したくなる。

## restartコマンドで再起動するとイベントが送られてこなくなる

ということで、`supervisorctl`からリスタートを叩く。

```sh
$ sudo supervisorctl status
hello_listener  RUNNING    pid 8888, uptime 3 days, 00:00:00
program         RUNNING    pid 8889, uptime 3 days, 00:00:00
$ sudo supervisorctl restart hello
$ sudo supervisorctl status
hello_listener  RUNNING    pid 8888, uptime 00:00:10
program         RUNNING    pid 8889, uptime 3 days, 00:00:00
```

一見これでよさそうだが、実際にはイベントが受け取れなくなってしまう。

## rereadしてupdateする

で、どうするか考えた訳だけど、rereadして追加することはできたので、rereadしてupdateすることで別のEvent Listenerとして登録することにした。

supervisord.confを書き換えて別の名前にする。

```diff:/etc/supervisor/supervisord.conf
...

 [include]
 files = /etc/supervisor/conf.d/*.conf

-[eventlistener:hello_listener]
+[eventlistener:hello_listener2]
 command=hello_listener.py
 events=PROCESS_STATE_EXITED

```

で、rereadしてupdateする。

```sh
$ sudo supervisorctl reread
hello_listener: disappeared
hello_listener2: available
$ sudo supervisorctl update
hello_listener: stopped
hello_listener: removed process group
hello_listener2: added process group
$ sudo supervisorctl status
program         RUNNING    pid 8889, uptime 3 days, 00:00:00
hello_listener2 RUNNING    pid 8888, uptime 00:00:10
```

めでたし。
cssminでCSSが崩れたときの対処法

# 背景
しばらくいじっていなかったcssを更新する機会があったので、
grunt-contrib-cssminをnpm installしてcssをminifyすると一部のCSSが壊れスタイルが崩れた。
clean-cssのアップデートでおかしくなったっぽい。
最新版のclean cssでは複数プロパティをまとめて最適化しようとする様子。

```css
.btn {
  text-indent: -15px;
  font-size: 16px;
  line-height: 44px;
  background: url(/img/site_images/btn-login-big.png) 190px 3px/32px 32px no-repeat #ee753e;
  border-color: #ee753e;
}

```

こんな風に壊れてしまったので、grunt-contrib-cssmin最適化のオプションをオフに。

```
cssmin: {
  options: {
    noAdvanced: true
  }
}
```
直った

```css
.btn {
  text-indent: -15px;
  font-size: 16px;
  line-height: 44px;
  background: #ee753e url(/img/site_images/btn-login-big.png) no-repeat 190px 3px;
  background-size: 32px 32px;
  border-color: #ee753e;
}
```
#予防策

npm shrinkwrapという機能で依存モジュールのバージョンを全て保存し固定できる。
頻繁に更新することが無ければこれで制限しておくのがよい。
（ただし、shrinkwrapも一部バグがあるのでご利用は慎重に。）

https://docs.npmjs.com/cli/shrinkwrap
http://blog.koba04.com/post/2014/03/03/npm-and-bower-semantic-version/
CSSでテキストを画像置換をするときに気をつけること

# SEO的には

非推奨です。
HTML文書と見た目が一致しないため、隠しテキストとして悪意あるリンクとみなされ評価が下がる場合があります。
基本的にはimg要素で画像を貼付けるのがベストですが、span要素にクラスをあててbackgroundで画像を指定する方法もあります（googleがやってる）。でもこれは空の要素を増やすことになるので、imgなどと同様と見なしたとしても若干違和感はあります。

# それでもやりたい

深遠な理由でどうしてもテキストを使いつつユーザーには画像を見せたい場合は以下のやり方がよくある方法。

```scss
text-indent: 100%;
white-space: nowrap;
overflow: hidden;
```

+

```scss
font-size: 0;
```
両者を併用する。
基本モダンブラウザなどで確認する場合が多いので見逃しがちですが、一部の古いAndroid端末などではfont-size:0がききません。

# 参考記事
[CSS – 画像置換の種類とその方法](http://www.go-next.co.jp/blog/webdesign/html_css/1438/)
[CSS画像置換（CSS Image Replacement）](http://www.searchengineoptimization.jp/how-to-remove-google-penalty#sec6-2-a)
Legendでmarginがきかない


一部のスマホでlegendのmarginがきかないことがあるらしい。
block要素を想定していないのかブラウザで特殊なスタイルをあてるためかそのあたりが影響している気がする。

手元ではAQUOS PHONE SHL22（Android 4.2.2）の標準ブラウザで再現。
marginを指定してもlegendの次の要素とピッタリくっついてしまっていた。

# 対処

アスタリスクはできれば使いたくないが、やむを得ず参考と同じように対処。

HTML

```html
<fieldset>
  <legend class="form-title">
    タイトル
  </legend>
  <input class="form-text" type="text" name="form-text">
</fieldset>
```

CSS

```sass
.form-title + * {
    -webkit-margin-top-collapse : separate;
    margin-top                  : $margin;
}
```

# 参考

Getting Webkit to pay attention to <legend> margins [duplicate]
http://stackoverflow.com/questions/6063071/getting-webkit-to-pay-attention-to-legend-margins

Cannot add margin to Legend element in Safari & Chrome
http://stackoverflow.com/questions/2568591/cannot-add-margin-to-legend-element-in-safari-chrome

legendはFirefoxやwebkit系でdisplayを変更できない
http://webdev.jp.net/legend-css-display/
Pythonのsqlite3モジュールでのパラメータースタイルを拡張するPyPIモジュールを書いた


`sqlite3`はパラメーターのバインドの形式としてqmarkとnamedを受け付けてくれますが、PEP249[^1]で定義されているformatとpyformat形式は受け付けてくれません[^2][^3]。これは、それらを受け付けるようにするモジュールです。

Pythonのバージョンは2.7.8と3.4.1でテストを実施してあります。

[^1]: [PEP 249 - Python Database API Specification v2.0 | Python.org](https://www.python.org/dev/peps/pep-0249/)
[^2]: [11.13. sqlite3 — SQLite データベースに対する DB-API 2.0 インタフェース — Python 2.7ja1 documentation](http://docs.python.jp/2/library/sqlite3.html#sqlite3.Cursor.execute)
[^3]: [12.6. sqlite3 — SQLite データベースに対する DB-API 2.0 インタフェース — Python 3.4.2 ドキュメント](http://docs.python.jp/3.4/library/sqlite3.html#sqlite3.Cursor.execute)


# :cake: 使い方

```shell-session
pip install sqlite3paramstyle
```

`%s`の箇所にバインドしてくれます。

```python
conn = sqlite3paramstyle.connect(":memory:")
cur = conn.cursor()
cur.execute("select %s, %s", ("foo", "bar"))
cur.fetchall()  # [("foo", "bar")]
```

Python拡張形式のフォーマットにも対応してます。

```python
cur.execute("select %(who)s, %(age)s", {"who": "John", "age": 20})
cur.fetchall()  # [("John", 20)]$
```

どこかの誰かの助けになると嬉しいです :beers: 

* https://pypi.python.org/pypi/sqlite3paramstyle
* https://github.com/shrkw/sqlite3_paramstyle

# :frog: 作成した背景

テストコードのほぼないPythonコードのメンテをすることになって粛々とテストを追加していたが、`psycopg2`を生で使ってるPythonコードを発見。ぜひとも`SQLAlchemy`を使っておきたいところだったが、依存モジュールを変更するのがしんどいフェーズだったので、なるべく変更しない方向で進めることに。
CIサーバーでPostgresqlプロセスを常時動かしておくのはいやだったのと、DBコネクションは外部から引き渡せるかたちになっていたので、テスト時は`sqlite3`のコネクションを渡して実行するようにしてみた。
が、`psycopg2`が受け付けるパラメータースタイルは上記説明にあるformat形式とpyformat形式であり、`sqlite3`とまったく互換性がない。
`psycopg2`を拡張してqmarkスタイルを受け付けるようにする[qmarkpg](https://github.com/dvarrazzo/qmarkpg)というのを見つけたので、それの逆に動くモジュールを書けばいいんじゃね？と思った次第。

PyPIオーサーになれて嬉しい :smiley_cat: ワーイワーイ

## 参照したサイト

### PyPIへの登録方法

* [Python - PyPIにパッケージ登録する - Qiita](http://qiita.com/edvakf@github/items/d82cd7ab77ea2b88506c)
* [今どきのPythonのライブラリ自作からPyPIへの登録 - Qiita](http://qiita.com/futoase/items/fb7400bfa8c956336ff1)

### toxの使い方

* [Pythonを取り巻く開発環境（PyCon JP 2012資料 #pyconjp） - YAMAGUCHI::weblog](http://ymotongpoo.hatenablog.com/entry/2012/09/16/090842)
抽象データ型 (ADT) / クラス (class)

抽象データ型(Abstract Data Type: ADT)はクラスとどう違うのかよくわからないので、いくつか調べたこと。

<hr>
http://www.codereading.com/algo_and_ds/ds/adt_and_class.html
抽象データ型、クラス、この２つの概念は同じです。 データ構造とそれに付随する操作をひとまとまりに表現したものを抽象データ型またはクラスと呼ぶのです。

<hr>
http://java2005.cis.k.hosei.ac.jp/materials/lecture15/adt.html
データ構造 (ここではオブジェクト) をその表現とそれを扱う手続きの集まりで表現したものを「抽象データ型 (Abstract Data Type, ADT)」と呼ぶ。

ADTでは、データの操作を主に振る舞いに任せ、内部のデータ構造の表現は使う側に意識させないのが普通である。

<hr>
http://futurismo.biz/archives/2730
クラス : 抽象データからなるデータ構造.

<hr>

結局のところ、抽象データ型を実装したものがクラスになるということなのだろうか?


<hr>
（追記 150418)
Code Completeには以下の記載があった (ADTs and Classesの節)。

> One way of thinking of a class is as an abstraction data type plus inheritance and polymorphism.
単純に呼べば使えるAOPライブラリMOAspectsを作った

# 単純に呼べば使えるAOPライブラリMOAspectsを作った

Objective-CでAOPを実現するライブラリMOAspectsを一昨日ぐらいにCocoapodsに登録してきた。


MO-AI/MOAspects
https://github.com/MO-AI/MOAspects

## AOPとは？

アスペクト指向(Aspect Oriented Programming)の略、難しい言葉だと`横断的関心事の分離`と言われている。要はロギングのような全体に散らばる処理を一括で管理できるようにしたことをアスペクトという。

## なぜ作ったか？

あるときGoogleAnalyticsの埋め込みをやることになり画面毎、アクション毎にGoogleAnalytics用の定義を切る必要があったが、1つ1つの該当クラスにそのような対応を行うのが煩わしいため一括でその定義を切れるクラスが欲しくて作った。

## 他のAOPライブラリは？

steipete/Aspects
https://github.com/steipete/Aspects

tokorom/BlockInjection
https://github.com/tokorom/BlockInjection

有名なのだと上のようなライブラリがあるが、技術的課題点がいくつかあった。

### Aspects

* クラスメソッドに対して処理をフックできない
* 同一クラス系統に対して複数処理をフックできない
  * UIViewController/UITableViewControllerなど

### BlockInjection

* 64bit対応でない
* 同一クラス系統に対して複数処理をフックできない

## このライブラリの売り所

* 32bit/64bit対応
* インスタンスメソッド/クラスメソッド対応
* 同一クラス系統のクラスに対して複数フックが可能

表にするとこんな感じ

| ライブラリ名 | 64bit対応  | インスタンス<br>メソッド | クラス<br>メソッド | 同一系統<br>クラスフック |
| :---: | :---: | :---: | :---: | :---: |
| Aspects | ○ | ○ | × | × |
| BlockInjection | × | ○ | ○ | × |
| MOAspects | ○ | ○ | ○ | ○ |
 
とにかく実装上の都合を開発者に対して気を使わせないようなライブラリを目的とした。インターフェースとしてインスタンスメソッド・クラスメソッドのフック処理の2種類のみ用意しており、引数のClassとSELを基にターゲットを決定する。

## インストール

```
pod 'MOAspects'
```

## インターフェース

```MOAspects.h
// hook instance method 
+ (BOOL)hookInstanceMethodForClass:(Class)clazz
                          selector:(SEL)selector
                   aspectsPosition:(MOAspectsPosition)aspectsPosition
                        usingBlock:(id)block;

// hook class method
+ (BOOL)hookClassMethodForClass:(Class)clazz
                       selector:(SEL)selector
                aspectsPosition:(MOAspectsPosition)aspectsPosition
                     usingBlock:(id)block;
```

### MOAspectsPosition

`MOAspectsPositionBefore`と`MOAspectsPositionAfter`があり、対象処理の前か後にフックを行うか選択することができる

### block

この中にフックする処理を実装する。blockの型の記載がないが以下のようになる

`void (^block) (id targetObject, Type1 parameter1, Type2 parameter2...)`

## 使い方


### クラスメソッドのフック例
```
[MOAspects hookClassMethodForClass:[NSNumber class]
                          selector:@selector(numberWithInt:)
                   aspectsPosition:MOAspectsPositionBefore
                        usingBlock:^(id class, int intVar){
                            NSLog(@"hooked %d number!", intVar);
                        }];

[NSNumber numberWithInt:10]; // -> hooked 10 number!
```

### インスタンスメソッドのフック例
```
[MOAspects hookInstanceMethodForClass:[NSString class]
                             selector:@selector(length)
                      aspectsPosition:MOAspectsPositionBefore
                           usingBlock:^(NSString *string){
                               NSLog(@"hooked %@!", string);
                           }];

[@"abcde" length]; // -> hooked abcde!
```

## Objective-Cな理由

Swiftでやろうと思ったが、このライブラリは内部でNSInvocationを使っているため現在Swiftだと`NSInvocation is unavailable`と怒られるため止む無くObjective-Cとなった

## TODO

* ドキュメント
* ベンチマーク
* 実際にGAと絡めたデモアプリ

## 最後に

実際に使ってみて元のコードを汚すことなくGoogleAnalyticsを埋め込めたので是非同じような状況になったら使ってみてはいかがでしょうか。
標準出力されたもの代入に使う方法



##使いどころ
あるコマンドの結果を環境変数に代入したい時とかに便利です。

##やり方
TEST_VARIABLEという環境編にpwdの結果をいれる。

```Bash
export TEST_VARIABLE=`pwd`
```

このように「`」で囲む。
Functor < Applicative < Monad

学習の素材は、
[すごいHaskellたのしく学ぼう!](http://www.amazon.co.jp/すごいHaskellたのしく学ぼう-Miran-Lipovača/dp/4274068854)

---
以前、[`Functor < Applicative < Monad` という関係性がある](http://qiita.com/rooooomania/items/3a493a5dcbe3badfa1df#functorapplicativemonad)と書いたもののその根拠を問われると、その時点の知識では より柔軟に計算を行える、という理解しかなかった。今回学びを進めていくうちにもう少し具体的に表せることがわかった。

## より柔軟に計算を行える？
より柔軟に計算を行えるというのは、**`Monad` 型クラスは、`Functor` や `Applicative` を内包しており、さらに便利な関数も持っていてより実用的な対処ができる** ということが言いたかった。ところが、`Monad`はサブクラスなどの型制約を持っておらず、内包しているかどうかはぱっと見ではわからない状態だった。

調べてみると、これは`Monad` が Haskell に導入されたのは `Applicative` よりもずっと前だったという背景が理由にあるらしい。ではどのような考えから、 `Functor < Applicative < Monad` と言えるのだろうか。

## Functor < Applicative
これは、コードから明らかで、`Functor` のサブクラスとして `Applicative` があり、`Applicative` は `fmap` に加えて `<*>` などのアプリカティブ・スタイルがあり、文脈をもった関数をアプリカティブ値に対して続けざまに適用できるので、より実用的である。

```hs
class Functor f => Applicative f where
    -- | Lift a value.
    pure :: a -> f a

    -- | Sequential application.
    (<*>) :: f (a -> b) -> f a -> f b

    -- | Sequence actions, discarding the value of the first argument.
    (*>) :: f a -> f b -> f b
    a1 *> a2 = (id <$ a1) <*> a2
    -- This is essentially the same as liftA2 (const id), but if the
    -- Functor instance has an optimized (<$), we want to use that instead.

    -- | Sequence actions, discarding the value of the second argument.
    (<*) :: f a -> f b -> f a
    (<*) = liftA2 const
```

## Applicative < Monad
`Monad` には、型クラス制約がないため、別の手段で`fmap` や`<*>` などと等価な関数を用意しなくてはならない。やはりその通りで、それぞれに対応した関数として、`liftM` 、 `ap` があった。

```hs:fmapと同等
liftM :: Monad m => (a1 -> r) -> m a1 -> m r
```

```hs:＜＊＞と同等
ap :: Monad m => m (a -> b) -> m a -> m b
```

```hs:pureと同等
return :: Monad m => a -> m a
```

`Monad` はこのほかにも、バインド`(>>=)` を持っていて、文脈をもった値を相互作用させる力も持っている。つまり、`Monad` は`Functor` であり `Applicative` であり、プラスαである。

##Functor < Applicative < Monad
これで、`Monad` は `Applicative` よりも実用的だと、その実装からも説明できるようになった。
Stateモナドと MonadState 型クラスなど

学習の素材は、
[すごいHaskellたのしく学ぼう!](http://www.amazon.co.jp/すごいHaskellたのしく学ぼう-Miran-Lipovača/dp/4274068854)

---
`State` モナドについて学んでいた時に気付いたこと。教材には、

```hs
newtype State s a = State { runState :: \s -> (a, s) }
```

という形で状態付き計算を包んだ`newtype` を提供しているとあるが、それが [hackage](http://hackage.haskell.org/package/transformers-0.4.3.0/docs/doc-index.html) のソースコードを覗いても見当たらない。代わりに、次のような定義があった。

```hs
type State s = StateT s Identity
```

また、`State` モナドは`MonadState` のインスタンスでもあるらしい。それゆえ、便利な関数`get` 、 `put` を使えるということだ。

ふーむ。これらは一体なんだろう、調べてみよう。というのが今回の記事の内容となる。
前述の `newtype` がどこにあるのか、相変わらず探しているのでご存知の方がいらしたら教えてくださいm(_ _)m。


## 定義
関連しそうな定義をざっと表しておく。

http://hackage.haskell.org/package/transformers-0.4.3.0/docs/src/Control-Monad-Trans-State-Lazy.html#get

```hs:StateTのnewtype宣言
newtype StateT s (m :: * -> *) a
  = StateT {runStateT :: s -> m (a, s)}
```

```hs:Stateをシノニムとして宣言
type State s = StateT s Identity
```


http://hackage.haskell.org/package/mtl-2.2.1/docs/src/Control-Monad-State-Class.html

```hs:MonadStateの型クラス宣言
-- | Minimal definition is either both of @get@ and @put@ or just @state@
class Monad m => MonadState s m | m -> s where
    -- | Return the state from the internals of the monad.
    get :: m s
    get = state (\s -> (s, s))

    -- | Replace the state inside the monad.
    put :: s -> m ()
    put s = state (\_ -> ((), s))

    -- | Embed a simple state action into the monad.
    state :: (s -> (a, s)) -> m a
    state f = do
      s <- get
      let ~(a, s') = f s
      put s'
      return a
```

```hs:MonadStateのインスタンス宣言
Monad m => MonadState s (StateT s m)
```

## 読み解く
上のコードから、次のことがわかる。

* `StateT s m` は、`MonadState` のインスタンスである ( `m` は Monadインスタンス )
* `StateT` は `newtype` である
* `State s` は `StateT s Identity` のシノニムである( `Identity` は文脈なしのモナド)

∴ `State s` は `MonadState` のインスタンスとなり、APIの`get` 、 `put` が使える

ここで、`StateT` って何？という疑問が激しく生じるが、落ち着いて[調べてみる](http://www.geocities.jp/m_hiroi/func/haskell29.html)と、モナド変換子と呼ばれる類のもののようだ。これについては後日整理する必要があるが、今はそういうものとしておいておく。

## 終わりに
そういうわけで、`StateT` が `newtype` であることと、`State` は `StateT` のシノニムであることがわかった。~~だから**`State` は `newtype` である** と言っていいのかは、まだわかっていない。~~

(2015-04-02 追記) [シノニムは別名であり、プログラムを整理しているだけ](http://qiita.com/rooooomania/items/fc332d3a2930c05a8769#type)なので、`State` は `StateT` のシノニムなら、`State` は `newtype` であると言っても良いだろう、と自己解決。
DXlibのウィンドウサイズを可変に、Aeroスナップとか最大化も

DXlibでエディタのようなものを作った時のメモです。
本来はDXlibでやるようなことではないのですが、わけあって触ることになったので...
#標準の場合
DXlibではウィンドウのサイズが固定されていて、端にカーソルをやってもサイズを変更することはできません。
その辺の設定をする関数もあるのですが、最大化ボタンを押すと全画面表示になったり、ウィンドウの枠が太かったりと気になるところがあります。
色々と試してみたのですが、サイズは変更できるけどAeroスナップ時にサイズがおかしくなる、といった事件が起きたので別の方法を取ることにしました。
~~もしかしたら見落としているだけで、ちゃんと設定できるのかもしれません（小声）~~
#じゃあどうすればええの？
DXlibくんには`SetUserWindow`という関数があります。
本来はDXlibの初期化時に自動でウィンドウが生成されるのですが、
この関数を初期化の前に呼んでおくことで、自分で作ったウィンドウをDXlibで扱えるようになります。
あとは少し設定をするだけで、問題なく動作します~~（すると思います）~~
#実装してみる
たぶん見るまでもないと思うのですが、無駄に長いソースを貼っておきます。
要は**ウィンドウは自分で作ればええやん**ということなので、参考程度に。

```cpp:長いので分割しています
#include "DxLib.h"
#include <string>
using namespace std;

const int null = NULL;

// DXLib はエラーが発生した場合 -1 を返します
const int dxLibError = -1;
inline bool DXLibError(int result) {
	return result == dxLibError ? true : false;
}

// ちょっとだけ使います
struct Size {
	int width, height;
};
```
```cpp:ウィンドウ関連です（最低限だけ実装しています）
// ウィンドウのクラスです
class Window{
	HWND windowHandle = null;
	MSG message = {};
public:

	// ウィンドウプロシージャ
	static LRESULT CALLBACK Procedure(HWND handle, UINT message, WPARAM wParam, LPARAM lParam) {
		switch (message) {
		// 一応終了処理だけ
		case WM_DESTROY:
			PostQuitMessage(0);
			return 0;
		}
		return DefWindowProc(handle, message, wParam, lParam);
	}

	// ウィンドウハンドルを取得する
	HWND GetHandle() {
		return windowHandle;
	}

	// ウィンドウを生成する
	void Create(string title, string className) {
		// クラス情報を登録する
		WNDCLASS windowClass = {};
		windowClass.lpfnWndProc = Procedure;
		windowClass.hInstance = GetModuleHandle(null);
		windowClass.lpszClassName = className.c_str();
		windowClass.hCursor = LoadCursor(NULL, IDC_ARROW);
		RegisterClass(&windowClass);
		// ウィンドウを生成する
		windowHandle = CreateWindowEx(0, className.c_str(), title.c_str(), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, null, null, GetModuleHandle(null), null);

	}

	// ウィンドウのサイズを取得する
	Size GetSize() {
		Size result;
		GetWindowSize(&result.width, &result.height);
		return result;
	}

	// メッセージ処理
	bool Loop() {
		while (true) {
			if (message.message == WM_QUIT) return false;
			if (PeekMessage(&message, NULL, 0, 0, PM_REMOVE)) {
				TranslateMessage(&message);
				DispatchMessage(&message);
			}
			else return true;
		}
	}

	// ウィンドウを表示する
	void Show() {
		ShowWindow(windowHandle, SW_SHOW);
	}
};

```
```cpp:こ↑こ↓から実際に使ってみます

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {

	// ウィンドウを生成
	Window window;
	window.Create("ヌッ！", "DXlib");
	
	// 使用するウィンドウを設定
	SetUserWindow(window.GetHandle());

	// メッセージ処理は自分でやるよ
	SetUserWindowMessageProcessDXLibFlag(false);

	// 描画可能サイズをディスプレイのサイズに（最大化した時に描画できるように）
	SetGraphMode(GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), 16);

	// 初期化
	if (DXLibError(DxLib_Init())) return dxLibError;

	// ウィンドウを表示
	window.Show();

	// メインループ
	while (window.Loop()) {

		// 試しに枠を描画してみる
		ClearDrawScreen();
		auto &windowSize = window.GetSize();
		DrawBox(0, 0, windowSize.width, windowSize.height, 0xffffff, false);
		ScreenFlip();

	}
	return DxLib_End();
}

```
#おわり！
~~ちょっと長かったんとちゃう？　ウィンドウ関連のソースを載せる必要はありましたか...？~~
こんな感じになりましたが、`SetGraphMode`あたりをもう少し効率よくできる気がしないでもないです。
何かありましたら教えてください~~何でもしますから！~~
Goで、mapをrangeでイテレーションすると、取り出す順番は実行ごとに異なる罠



#はじめに
タイトルどおりですが、気をつけましょうという話です。
不思議な現象だと思ったので簡単な記事にしました。

~~理由までは、わかってません。~~
~~ご存じの方は、教えて頂けると幸いです。~~

ソースを見ると乱数が使われているようです。
https://golang.org/src/runtime/hashmap.go?h=map#L231
詳しくはコメントを参照。


#実験環境
go version go1.4.2 darwin/amd64
(つまりMac OS Xです）

##実行コマンド
go run main.go

#実験

例えば、他の言語で言うsetみたいなのをしたかったとします。

```go:main.go
package main

import (
	"fmt"
)

func main() {

	set := map[int] bool{}

	set[175] = true
	set[119] = true
	set[450] = true

	fmt.Println(set)

	//イテレーション1
	for key, _ := range set {
		fmt.Print(key)
		fmt.Print(" ")
	}
	fmt.Println()

	//イテレーション2
	for key, _ := range set {
		fmt.Print(key)
		fmt.Print(" ")
	}
	fmt.Println()
}
```

これで実行すると


```text:結果1
map[175:true 119:true 450:true]
175 119 450 
175 119 450 
```

こんな感じですよね。
イテレーション1とイテレーション2は同じ **はず**
ですので。
mapも入れた順になってますね。
もう一度、実行してみましょう

```text:結果2
map[450:true 175:true 119:true]
175 119 450 
119 450 175
```

あれ、今度はイテレーション1とイテレーション2で、 **違う** 結果になってますね。。
これはおかしいですね。。
（ちなみに、10回ほど実行しても変わらなかったこともあります。）

#別の言語だと

連想配列の取り出しは、一般に順不同であるというコメントも見受けられたので実験してみました。

(そもそも僕は連想配列の取り出しは、一般に順不同ということを知りませんでしたが）

連想配列とMapは、厳密に等価かどうかわかりませんが、とりあえず僕がさくっと書ける２つの言語で。




##Javaの場合


```java
import java.util.HashMap;
import java.util.Map;

public class Main {

    public static void main(String[] args) {
        HashMap<Integer, Boolean> map = new HashMap<>();
        map.put(175, true);
        map.put(119, true);
        map.put(450, true);

        for (Map.Entry<Integer, Boolean> element : map.entrySet()) {
            System.out.print(element.getKey());
            System.out.print(" ");
        }
        System.out.println();

        for (Map.Entry<Integer, Boolean> element : map.entrySet()) {
            System.out.print(element.getKey());
            System.out.print(" ");
        }
        System.out.println();

    }

}

```

```text:Javaの実行結果
119 175 450 
119 175 450 
```
（20回ほど実行しても同じ）

##Python2の場合

```python
hoge = {175: True, 119: True, 450: True}

for k in hoge:
    print k,

print ""

for k in hoge:
    print k,
print ""
```

```text:pythonの実行結果
450 119 175
450 119 175
```
（こちらも20回ほど実行しても同じ）




#まとめ

mapをrangeでイテレーションすると、実行するたびに異なる結果になりました。
こういうふうに使われる方は気をつけましょう。

Goでは乱択アルゴリズムが使われているようです。
年に数日だけ発現する日付の自動補正を発端とした罠


JavaScriptではよくあるこんな罠があります。

```js:2015/4/1のDateオブジェクトを作ろうとするバグを含むコーディング例
var d = new Date();
d.setFullYear(2015);
d.setMonth(3); // 0オリジンで4月
d.setDate(1);
d // Fri May 01 2015 … 5月になっている
```

ちょうど投稿日の2015/3/31のような日付で実行すると再現するのですが、
3行目の`setMonth`の所で2015/4/31になり、即時補正されて2015/5/1になります。
特定の日時が欲しい時はコンストラクタを使うか、先に`setDate(1)`としておくのが無難そうです。
JavaScriptに限らず`setMonth`、`next month`といった単語が目に入ったら「もし31日に実行したら…」と想像する癖をつけるのが良いと思います。
日付の自動補正関係は時限爆弾になるので気をつけたいですね。

罠についてはこちらも参考になります。
[JavaScript の Date は罠が多すぎる - Qiita](http://qiita.com/labocho/items/5fbaa0491b67221419b4)
コンストラクタに文字列を与える時のブラウザ間の差異はこちらが参考になります。
[Dateオブジェクト (日付と時刻) | JavaScript プログラミング解説](http://so-zou.jp/web-app/tech/programming/javascript/grammar/object/date.htm)
FutureとTryの共通メソッド


## 共通メソッド

`(implicit executor: ExecutionContext)` は省略

| 共通メソッド | Future | Try |
|:-----------|------------:|:------------:|
| `map` | `map[S](f: (T) ⇒ S): Future[S]` | `map[U](f: (T) ⇒ U): Try[U]` |
| `flatMap` | `flatMap[S](f: (T) ⇒ Future[S]): Future[S]` | `flatMap[U](f: (T) ⇒ Try[U]): Try[U]` |
| `foreach` | `foreach[U](f: (T) ⇒ U): Unit` | `foreach[U](f: (T) ⇒ U): Unit` |
| `failed` | `failed: Future[Throwable]` | `failed: Try[Throwable]` |
| `recover`| `recover[U >: T](pf: PartialFunction[Throwable, U]): Future[U]` | `recover[U >: T](f: PartialFunction[Throwable, U]): Try[U]` |
| `recoverWith` | `recoverWith[U >: T](pf: PartialFunction[Throwable, Future[U]]): Future[U]` | `recoverWith[U >: T](f: PartialFunction[Throwable, Try[U]]): Try[U]` |
| `transform` | `transform[S](s: (T) ⇒ S, f: (Throwable) ⇒ Throwable): Future[S]` | `transform[U](s: (T) ⇒ Try[U], f: (Throwable) ⇒ Try[U]): Try[U]`|
| `filter` | `filter(p: (T) ⇒ Boolean): Future[T]` | `filter(p: (T) ⇒ Boolean): Try[T]` |
| `withFilter` | `withFilter(p: (T) ⇒ Boolean): Future[T]` | `withFilter(p: (T) ⇒ Boolean): WithFilter` |

withFilterだけちょっと違うと言えば違うが、まあ同じように使える。

## Futureにだけあるメソッド

```scala
isCompleted: Boolean

ready(atMost: Duration)(implicit permit: CanAwait): Future.this.type

result(atMost: Duration)(implicit permit: CanAwait): T

value: Option[Try[T]]

onComplete[U](f: (Try[T]) ⇒ U)(implicit executor: ExecutionContext): Unit

onFailure[U](pf: PartialFunction[Throwable, U])(implicit executor: ExecutionContext): Unit

onSuccess[U](pf: PartialFunction[T, U])(implicit executor: ExecutionContext): Unit

andThen[U](pf: PartialFunction[Try[T], U])(implicit executor: ExecutionContext): Future[T]

collect[S](pf: PartialFunction[T, S])(implicit executor: ExecutionContext): Future[S]

fallbackTo[U >: T](that: Future[U]): Future[U]

mapTo[S](implicit tag: ClassTag[S]): Future[S]

zip[U](that: Future[U]): Future[(T, U)]
```

collectが意外。Tryにもあっても良さそうなのに。（withFilterとmapで作れるけど）

andThenはfinallyみたいに使ったりする。

* https://github.com/scalikejdbc/scalikejdbc/blob/2860c6a09bad974cfb9a5f817b87c2fb1f4341e8/scalikejdbc-core/src/main/scala/scalikejdbc/LoanPattern.scala#L31

mapToはよくわからん。reflection系?

## Tryにだけあるメソッド

```scala
get: T

isFailure: Boolean

isSuccess: Boolean

getOrElse[U >: T](default: ⇒ U): U

orElse[U >: T](default: ⇒ Try[U]): Try[U]

toOption: Option[T]
```

Tryにはfinallyみたいなのは無くて、こうするしかないっぽい。

```scala
def doSomething(): Try[A] = {
  val resource = open()

  val t = Try { something(resource) }

  resource.close()

  t
}
```
React Nativeをインストールしてみる

# はじめに

React Nativeを入れてデモを動かすまでのお話です。
公式サイトのインストール手順を参考に進めていきます。

導入部分のリンク。
http://facebook.github.io/react-native/docs/getting-started.html#content

# 前準備

以下を準備します

* Xcode及びXcode Command Line Tools
* Homebrew

## Xcode / Command Line Tools

XcodeはApp Storeから。
Command Line Toolsは6だと自動でインストールされるようです。

## Homebrew

[Homebrew 公式サイト](http://brew.sh/index_ja.html)
公式サイトからコマンドをコピペ、ターミナルに貼り付けてインストールします

```bash
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

筆者の環境ではすでに入っていたので、更新をしておきます。

```bash
brew update
```

# 本編〜React Nativeをインストール、そしてデモの実行〜

## その前に・・・

### node.jsのバージョンについて
React Nativeはどうもnode.jsの要求バージョンはv0.10のようです。
Homebrewからインストールすると2015/03/30現在でv0.12が入ります。
そのためnodebrewをHomebrewからインストールし、nodebrewを使ってnode.js v0.10を入れます

```bash
brew install nodebrew
nodebrew install 0.10
nodebrew use 0.10

echo 'export PATH=$PATH:~/.nodebrew/current/bin' >> ~/.bash_profile
source ~/.bash_profile
```

### watchman, flow

公式サイト上ではwatchman並びにflowのインストールが推奨されてますのでそちらも入れます。

```bash
brew install watchman
brew install flow
```

筆者環境では~/.bash_profileがあったのでそこに追記する形を取っています。

## React Nativeのインストール

npm上からインストールを行います

```bash
npm install -g react-native-cli
```

### プロジェクトの作成

React Nativeをインストールすると"react-native"コマンドが利用できるようになっています。
コマンドを利用してプロジェクトを作成します。

```bash
react-native init [プロジェクト名]
```

### デモの実行

実行すると新しくプロジェクト名のディレクトリが作成されています。
その中にXCodeのプロジェクトファイルがあるので、開いてCommand+Rで実行すればもれなくデモが見れます。

デモを実行した状態でも、"index.ios.js"を編集してCommand+Rすることで再実行することなく編集結果をプレビューすることができます。

# TIPS的な

* Homebrewからのインストールでエラーになるんだけど？

いくつかのディレクトリ/ファイルの権限が正しくないと、リンクを張る段階でエラーになるようです。
筆者の環境では/usr/local/share/man/man*でエラーが出ました。

```bash
sudo chown -R [ユーザー名]:admin /usr/local/share/man/man*
```

こんな感じで権限を設定し直しました。

* node.jsのインストールで（ｒｙ

これまたmoduleだったりなんだりで怒られました。
こちらに関してはすっきり削除しました（本当に良かったのかな？）

```bash
sudo rm -rf /usr/local/include/node/
```

nodebrewを入れる前にHomebrewから直接入れる場合にもエラーが出ましたが、その際には以下をしてました

```bash
lsbom -f -l -s -pf /var/db/receipts/org.nodejs.pkg.bom \
| while read i; do
  sudo rm /usr/local/${i}
done
sudo rm -rf /usr/local/lib/node \
     /usr/local/lib/node_modules \
     /var/db/receipts/org.nodejs.*
```


# まとめ

React Nativeを動かすまでの流れを前準備から簡単にまとめてみました。
筆者はReact Nativeとは関係の無いところで詰まってばっかりでしたが、無事に動かすところまで行きました汗

普段Homebrewだったりnode.jsだったりをそこまで使っていないので、色々と間違っているところだったり、こうするといいよ等あれば言って頂けると助かります。
CREATE_FUNCマクロを引数付きinitに対応させた

CREATE_FUNCマクロを少しだけ改造。
initの引数を好きに宣言できます。

それ以外はCREATE_FUNCとまったく同じ使い方です。
（できるだけ元のCREATE_FUNCのコードを使っています）

マクロ名はお好きに変えてください。

```
#define CREATE_FUNC_ARGS(__TYPE__) \
template<class... Args> \
static __TYPE__* create(Args&&... args) \
{ \
    __TYPE__ *pRet = new(std::nothrow) __TYPE__(); \
    if (pRet && pRet->init(std::forward<Args>(args)...)) \
    { \
        pRet->autorelease(); \
        return pRet; \
    } \
    else \
    { \
        delete pRet; \
        pRet = NULL; \
        return NULL; \
    } \
}
```