OmniAICreator/Qiita-1.07M huggingface dataset:
C#でenumをクラスのように扱う

もちろんenumはクラスではないので擬似的に、という感じだが。
方法としては拡張メソッドを使用する。

```csharp:
/// <summary>
/// ゲーム状態
/// </summary>
public enum GameState : int
{
    /// <summary>
    /// なにもなし
    /// </summary>
    None = 0,
    /// <summary>
    /// ゲーム開始
    /// </summary>
    Start = 1,
    /// <summary>
    /// ゲームプレイ中
    /// </summary>
    Play = 2,
    /// <summary>
    /// ゲーム終了
    /// </summary>
    Finish = 3,
}

public static class AppUtil
{
    /// <summary>
    /// ゲームプレイ中かどうか
    /// </summary>
    /// <param name="value">GameState</param>
    /// <returns>ゲームプレイ中なら true</returns>
    public static bool IsPlay(this GameState value)
    {
        return (value == GameState.Play);
    }

    /// <summary>
    /// 値取得
    /// </summary>
    /// <param name="value"></param>
    /// <returns>値</returns>
    public static int GetValue(this GameState value)
    {
        return (int)value;
    }
}

public class SceneStart : MonoBehaviour
{
    private static readonly string[] GameStateMes = { "なにもなし", "ゲーム開始", "ゲームプレイ中", "ゲーム終了" };

    void Main()
    {
        // ゲーム状態判定
        GameState state = GameState.Play;
        if (state.IsPlay())
        {
            // 値取得
            int value = state.GetValue();

            // メッセージ表示
            string mes = GameStateMes[value];
            Debug.Log(mes);
        }
    }
}
```

最初の発想は列挙型の名前が長くなってきた時に if 文の判定が長くなって1行で書けなくてスマートじゃなかったので、究極に短くするには？と考えた結果、上記のようにしてみた。ただ実際使ってみて enum の中身を拡張メソッドで隠ぺいしてるので分かりづらいは定義が長くなるわでデメリットの方が多く。。。そもそも enum にそんなたくさん情報持たせるなって話だけど(笑)

enum には使えないけど、なんか他の利用方法ないかな～
mac / gem install pg_typecast でエラー

ActiveRecordでRedShiftにアクセスしたいから、以下の2つのgemをインストールしました。

* activerecord4-redshift-adapter
* pg_typecast

activerecord4-redshift-adapterはさっくり入りましたら、pg_typecastで苦戦。

インストールしようとしたら、以下のエラーが。。。

```
$ gem install pg_typecast

uilding native extensions.  This could take a while...
ERROR:  Error installing pg_typecast:
	ERROR: Failed to build gem native extension.

    /usr/local/opt/ruby/bin/ruby -r ./siteconf20151013-2900-1269pij.rb extconf.rb
creating Makefile

make "DESTDIR=" clean

make "DESTDIR="
compiling pg_typecast.c
pg_typecast.c:5:10: fatal error: 'libpq-fe.h' file not found
#include <libpq-fe.h>
         ^
1 error generated.
make: *** [pg_typecast.o] Error 1

make failed, exit code 2
```

結局のところ、libpq-fe.hのパスが通らないってことで、findしてみたらいるんですよね。

```
$ sudo find / -name 'libpq-fe.h'
/Library/PostgreSQL/9.3/include/libpq-fe.h
```

ググってもわからず、結局、pg_typecastのソースを見るハメに。。。
https://github.com/deepfryed/pg_typecast/blob/master/ext/extconf.rb

extconf.rbの先頭の方で、PATHを設定している。

```
incdir = `pg_config --includedir`.chomp rescue ENV.fetch('POSTGRES_INCLUDE', '/usr/include/postgresql')
libdir = `pg_config --libdir`.chomp     rescue ENV.fetch('POSTGRES_LIB',     '/usr/lib')
```

pgのgemのときもだったけど、結局、pg_configが$PATHのところにいないのが原因。
/usr/local/binにリンク貼って解決！
PyQueryで抜き出したhtmlがxmlで困るの巻


PyQuery使ってみたんですけど、 PyQuery で item_detail というクラスの inner html を全部抜き出すとき、

```
d = PyQuery(htmlstr)
detail = d('.item_detail').html()
```

っつってやったんだけど、なんか取得結果をChromeで表示するとかなりおかしくて、理由が、中身に iframe があったんだけど、もともとは `<iframe src=XXX></iframe>` となってたところが PyQueryで抜き出したら`<iframe src=XXX/>` みたいな感じで、XMLになってる。どうやらこいつのせいで以降の表示がおかしくなってる。てかよくみたら`<br>`とかも`<br/>`とか言って全部XMLにしてくださっている！！ ただ一部を抜き出したいだけなのに勝手にそういうことしないでくれるかな！！！ 藤吉郎気分か！！！！

んで、ただのhtmlで欲しいんだけど…… って思って、公式ドキュメント見たらこうでした。

```
d = PyQuery(htmlstr)
detail = d('.item_detail').html(method='html')
```

それだけなんだけど。ちょっと迷ったので備忘録。
おしまい。
設定メモ Fluentd+Amazon Elasticserch+Kibana4+ELB s3 Log


# 準備
```bash
# AWS Ubuntu 14.04 LTS/Trusty
$ curl -L https://toolbelt.treasuredata.com/sh/install-ubuntu-trusty-td-agent2.sh | sh
$ sudo /opt/td-agent/embedded/bin/fluent-gem install fluent-plugin-elasticsearch
$ sudo /opt/td-agent/embedded/bin/fluent-gem install fluent-plugin-elb-log
```
参照: http://docs.fluentd.org/articles/install-by-deb

# 設定
```bash
$ sudo vi /etc/td-agent/td-agent.conf
  <source>
    type elb_log
    access_key_id xxxxxx
    secret_access_key xxxxxx
    region ap-northeast-1
    s3_bucketname xxxxxxx
    s3_prefix xxxxxxxx
    timestamp_file /tmp/elb_last_at.dat
    buf_file /tmp/fluentd-elblog.tmpfile
    refresh_interval 300
    tag elb.access
  </source>
  <match **>
    type elasticsearch
    type_name access_log
    host xxxxxxx.ap-northeast-1.es.amazonaws.com
    port 80
    logstash_format true
    include_tag_key true
    tag_key @log_name
    buffer_type file
    buffer_chunk_limit 5m
    buffer_queue_limit 1280
    flush_interval 5s
    buffer_path /var/log/td-agent/buffer/access.buffer
    disable_retry_limit false
    retry_limit 17
    retry_wait 1s
  </match>
</ROOT>
```
* portは9200じゃなくて80で通る
* Amazon Elasticsearch のインスタンスサイズによって一度にアップできるpayloadのサイズが限られてい
https://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/aes-limits.html

```
Each supported instance type has a maximum supported payload for HTTP requests:
t2.micro.elasticsearch: 10 MB
t2.small.elasticsearch: 10 MB
t2.medium.elasticsearch: 10 MB
m3.medium.elasticsearch: 10 MB
m3.large.elasticsearch: 10 MB
m3.xlarge.elasticsearch: 100 MB
m3.2xlarge.elasticsearch: 100 MB
r3.large.elasticsearch: 100 MB
r3.xlarge.elasticsearch: 100 MB
r3.2xlarge.elasticsearch: 100 MB
r3.4xlarge.elasticsearch: 100 MB
r3.8xlarge.elasticsearch: 100 MB
i2.xlarge.elasticsearch: 100 MB
i2.2xlarge.elasticsearch: 100 MB
```

# 起動
```
$ sudo /etc/init.d/td-agent start
```
OSXターミナルでファイルダウンロードを行う

例：

```
curl -O http://appldnld.apple.com/ios8.4.1/.../iPad4,4_8.4.1_12H321_Restore.ipsw
curl -O https://appldnld.apple.com/ios8.4.1/.../iPad4,4_8.4.1_12H321_Restore.ipsw

Or
curl -fsSLv1 https://appldnld.apple.com/ios8.4.1/.../iPad4,4_8.4.1_12H321_Restore.ipsw

also you can use:
wget -v --secure-protocol=SSLv2 https://appldnld.apple.com/ios8.4.1/.../iPad4,4_8.4.1_12H321_Restore.ipsw
```
ブラウザでES6のJavaScriptを実行する


babelで変換せずに、ES6で書いたJSをブラウザで実行したい。

ここに書いてある方法を使う。
[Browser · Babel](https://babeljs.io/docs/usage/browser/)

## babel-coreの導入

```
$ npm install babel-core
```

## es6で書く

Chromeで確認するため、
敢えてChromeでサポートされていない引数のデフォルト値を使ってみる。

[ECMAScript 6 compatibility table](https://kangax.github.io/compat-table/es6/)

```js:app.es6.js
class Foo {
  constructor(x, y) {
    this._x = x;
    this._y = y;
  }

  sum() {
    return this._x + this._y;
  }
}

class Bar extends Foo {
  constructor(x, y, z=8) {
    super(x, y);
    this._z = z;
  }

  sum() {
    return super.sum() + this._z;
  }
}

var foo = new Foo(1, 2);
var bar = new Bar(2, 4);
console.log(foo.sum());
console.log(bar.sum());
```

## browser.js をロードする

- `browser.min.js` があるのでそれを使う
- ES6で書いたjsは `type="text/ecmascript-6"` を指定してロードする

```html:index.html
  <script src="node_modules/babel-core/browser.min.js"></script>
  <script src="app.es6.js" type="text/ecmascript-6"></script>
```

## ブラウザで実行する

`browser.js` をロードしたHTMLでES6が実行されているのがわかる。

![localhost_5002.jpg](https://qiita-image-store.s3.amazonaws.com/0/82948/255386f0-4661-3ff3-3a98-61337f260202.jpeg "localhost_5002.jpg")

意図したとおりの動作をしているが、
本当にbrowser.jsのおかげなのかがわからないため、
browser.jsをロードしないで確認してみる。

### browser.jsをロードしない場合

```html:index.html
<!--
  <script src="node_modules/babel-core/browser.min.js"></script>
--->
  <script src="app.es6.js" type="text/ecmascript-6"></script>
```

app.es6.jsは `text/ecmascript-6` なのでそもそも実行されない。

### browser.jsなしで無理矢理実行した場合

さらに `type="text/ecmascript-6"` を外し、
app.es6.jsをJavaScriptとして実行してみる。

```html:index.html
  <script src="app.es6.js"></script>
```

結果:
![syntax error](https://qiita-image-store.s3.amazonaws.com/0/82948/be5e7cb1-ecc8-f0c5-af8f-2be86be07b94.jpeg "http___localhost_5002.jpg")

シンタックスエラーになる。
`class` はstrict modeであれば利用できるので `use strict` をつけると…

```js:app.es6.js
"use strict";

class Foo {
  constructor(x, y) {
    this._x = x;
    this._y = y;
  }
```

結果:
![syntax error](https://qiita-image-store.s3.amazonaws.com/0/82948/3bcf3e8b-591f-b50b-4a2f-aea5aaecdc24.jpeg "http___localhost_5002.jpg")

引数のデフォルト指定をしている箇所でシンタックスエラーが発生するので、
`browser.js` が仕事をしていたことがわかる。

## ただし…

> Not intended for serious use
> Compiling in the browser has a fairly limited use case...

とあるので、ちょっとES6を試したいときに使う程度にとどめるのがよさそう。
swiftでMapを外部アプリとして起動する

# 実装例

```swift
import CoreLocation

// 参考サイト
// - Map Links: https://developer.apple.com/library/ios/featuredarticles/iPhoneURLScheme_Reference/MapLinks/MapLinks.html
//

class MapLinkUtils {  
  // 目的地周辺の地図を表示する
  class func showLocation(location: CLLocation, address: String) {
    let daddr = NSString(format: "%f,%f", location.coordinate.latitude,  location.coordinate.longitude)
    let urlString = "http://maps.apple.com/?ll=\(daddr)&address=\(address)"
    print(urlString)
    let encodedUrl = urlString.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet())!
    let url = NSURL(string: encodedUrl)!
    UIApplication.sharedApplication().openURL(url)
  }

  // 経路情報を表示する
  class func showNavigation(srcLocation: CLLocation, destLocation: CLLocation, address: String) {
    let saddr = NSString(format: "%f,%f", srcLocation.coordinate.latitude,  srcLocation.coordinate.longitude)
    let daddr = NSString(format: "%f,%f", destLocation.coordinate.latitude, destLocation.coordinate.longitude)
    let urlString = "http://maps.apple.com/?saddr=\(saddr)&daddr=\(daddr)&dirflg=d&q=\(address)"
    print(urlString)
    let encodedUrl = urlString.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet())!
    let url = NSURL(string: encodedUrl)!
    UIApplication.sharedApplication().openURL(url)
  }
}
```

# 参考

- [Map Links](https://developer.apple.com/library/ios/featuredarticles/iPhoneURLScheme_Reference/MapLinks/MapLinks.html)
Apache POI導入方法（個人用）

Apache POIを使ってJavaでExcelを操作するアプリケーションを作成。

以下サイトからApache POIをダウンロード。
http://poi.apache.org/download.html
![2.JPG](https://qiita-image-store.s3.amazonaws.com/0/60528/6241722c-4c78-5db1-e095-3ca7279f5038.jpeg)

<br>

（http://www.apache.org/dyn/closer.lua/poi/release/bin/poi-bin-3.13-20150929.zip）
![3.JPG](https://qiita-image-store.s3.amazonaws.com/0/60528/7854257a-d58e-f2c3-c891-eee186338aeb.jpeg)



<br>
Eclipseへ導入するライブラリは以下。プロジェクトのビルドパスに追加する。
![キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/60528/92af054e-e060-5b6d-c7b2-f7e03eab311d.jpeg)








<br>



参考URL
http://itpro.nikkeibp.co.jp/article/COLUMN/20110405/359101/?ST=develop&P=1
RailsをPassengerを使ってサブディレクトリで動かす


大分前に試したので怪しいですが、動作はRails 4.2.0で行ったはず。

## Passengerの設定
以下のセットを並べれば複数のアプリケーションを動かすことができる。

```/etc/httpd/conf.d/app.conf
Alias /sample /home/mitsui/sample/public
<Location /sample>
	Options Indexes FollowSymLinks
    PassengerAppEnv development
    PassengerBaseURI /sample
    PassengerAppRoot /home/mitsui/sample
</Location>
```

## アセットのプリコンパイル
production環境でやるやつです。RAILS_RELATIVE_URL_ROOTが重要で、たしかこれがないとbootstrap-sassやjquery-ui-railsで利用する画像を/から見にいこうとしてしまい404が返ってくる。

```
rake assets:precompile RAILS_RELATIVE_URL_ROOT=/sample RAILS_ENV=production
```
tarで圧縮する際にフルパスで保存したり、ディレクトリごと保存したりする

昨日、なぜbasenameを取ってきたかったのかの続き。
tarでバックアップを取る時に、ディレクトリごと保存したかったので考えていました。

例えば以下のディレクトリがあるとする。

バックアップ元：`/home/hoge/bin`
バックアップ先：`/home/hoge/backup`

バックアップコマンド：`/home/hoge/test.sh`

こんな感じの階層

```
# cd /home/hoge
# ls *
test.sh

backup:

bin:
file1  file2  file3
```

`test.sh`を叩くことによって、
このbinディレクトリを`bin/file1`、`bin/file2`のような形で圧縮して、backupディレクトリに`piyo.tar.gz`として保存したい。

# フルパスで圧縮

```sh:test.sh
#!/bin/bash
BACKUP_DIR="/home/hoge/bin"   # バックアップ元ディレクトリ
SAVE_DIR="/home/hoge/backup"  # バックアップ先ディレクトリ

tar czfP ${SAVE_DIR}/piyo.tar.gz ${BACKUP_DIR}
```

```:実行して中身を見てみる
# cd /home/hoge
# ./test.sh
# ls *
test.sh

backup:
piyo.tar.gz

bin:
file1  file2  file3
# tar ztf backup/piyo.tar.gz
/home/hoge/bin/
/home/hoge/bin/file1
/home/hoge/bin/file2
/home/hoge/bin/file3
```

解凍するとフルパスなので、その位置に解凍してしまって危険。
オプションPを外すと解凍した時にそのディレクトリ配下に解凍される。
`tar czf ${SAVE_DIR}/piyo.tar.gz ${BACKUP_DIR}`

```:中身を見てみる
# tar ztf backup/piyo.tar.gz
home/hoge/bin/
home/hoge/bin/file1
home/hoge/bin/file2
home/hoge/bin/file3
```

このままだと例えば、「`home/hoge/backup`」配下で解凍した時、「`home/hoge/backup/home/hoge/bin/file1`」…のようになって少し不便・・。

# バックアップ元のカレントディレクトリ配下を圧縮

```sh:test.sh
#!/bin/bash
BACKUP_DIR="/home/hoge/bin"   # バックアップ元ディレクトリ
SAVE_DIR="/home/hoge/backup"  # バックアップ先ディレクトリ

( cd ${BACKUP_DIR} ; tar czf ${SAVE_DIR}/piyo.tar.gz . )
```

一番右の「.」はカレントディレクトリを指しているので、消さないこと！

```:実行して中身を見てみる
# cd /home/hoge
# ./test.sh
# ls *
test.sh

backup:
piyo.tar.gz

bin:
file1  file2  file3
# tar ztf backup/piyo.tar.gz
./
./file1
./file2
./file3
```

解凍するとその解凍したディレクトリ配下に`file1`、`file2`、`file3`のように解凍される。

# バックアップ元のカレントディレクトリごと圧縮

```sh:test.sh
#!/bin/bash
BACKUP_DIR="/home/hoge/bin"   # バックアップ元ディレクトリ
SAVE_DIR="/home/hoge/backup"  # バックアップ先ディレクトリ

( cd ${BACKUP_DIR} ; cd .. ; tar czf ${SAVE_DIR}/piyo.tar.gz `basename ${BACKUP_DIR}` )
```

```:実行して中身を見てみる
# cd /home/hoge
# ./test.sh
# ls *
test.sh

backup:
piyo.tar.gz

bin:
file1  file2  file3
# tar ztf backup/piyo.tar.gz
bin/
bin/file1
bin/file2
bin/file3
```

binも圧縮されている。これでうちのやりたいことは終了。
~~ちょっと気になるのが、わざわざcdで移動しなきゃいけないところ。~~

# 追記：
GNUのtarには-Cオプションという「オプションで指定したディレクトリに移動してからコマンドを開始する」というものがあるようで、

`tar -C "$(dirname ${BACKUP_DIR})" -czf "${SAVE_DIR}/piyo.tar.gz" "$(basename ${BACKUP_DIR})"`

のようにするとわざわざサブでcd移動しなくて済む！やったぜ。

---------------------


変数の名前で保存元、保存先が思い浮かばなくてこうなったけどみんなどんな感じの名前を付けているんだろう。
いつもここで結構悩む。
Java と Android の正規表現の動作の違い

この記事は、先日の potatotips #22 では説明しきれなかった部分を補足するものです。potatotips #22 でのスライドは [Regular Expression in Android And Java](https://speakerdeck.com/keithyokoma/regular-expression-in-android-and-java) です。

# おさらい

[Pattern | Android Developers](http://developer.android.com/intl/ja/reference/java/util/regex/Pattern.html)

## Java の正規表現

`Pattern`クラスを用いて、正規表現文字列をコンパイルしてマッチする処理を描くことになります。`String`クラスには一部便利なメソッドがあり、正規表現文字列を渡してマッチするものに処理を施す事ができるようになっていますが、あまり複雑なことはできないため、`String`クラスで提供されている以上のことをする場合は`Pattern`クラスを用います。

Java の正規表現は Perl5 のシンタックスのサブセットですが、Perl のように正規表現リテラルは存在せず、文字列を用いて正規表現を記述するため、特別なエスケープ処理が必要な場合があります。

`Pattern.compile`を使って正規表現文字列をコンパイルするとき、`int`の flag を付与することで、マッチする条件をコントロールすることができます。

## Android の正規表現

すべての正規表現 API は Java のものと同じものが提供されています。`Pattern`クラスを用いて正規表現文字列をコンパイルしてマッチするという機能も同じです。

# 少しずつ違う Java と Android の正規表現の結果

## 文字クラス

例えば、[このブログ記事](http://www.ecoop.net/memo/archives/regular-expression-problem-o-android-java.html)では、文字クラスを用いた時の結果の違いを説明しています。

## フラグ

Java のクラスをそのままポートしていますが、Android ではサポートしないフラグが存在します。
現状では、`CANON_EQ`(Canonical Equivalence)フラグはサポートしておらず、これを指定すると`UnsupportedOperationException`がスローされます。それ以外に、定義外のフラグをセットした場合は`IllegalArgumentException`がスローされます。

# なにが違うのか

根本的には、Java と Android で使用している正規表現エンジンが異なります。Java は独自のエンジンを持っていますが、Android は [ICU](http://www.icu-project.org) が提供しているエンジンを使用しています。このため、微妙ながら満たしている仕様が違ってきます。

両者とも、[Unicode Technical Standard #18 Unicode Regular Expressions Level1](http://unicode.org/reports/tr18/) の仕様を満たしますが、この他 Java は [2.1 Canonical Equivalents](http://unicode.org/reports/tr18/#Canonical_Equivalents) を満たし、一方 Android は [2.3 Default Word Boundaries](http://unicode.org/reports/tr18/#Default_Word_Boundaries) と [2.5 Name Properties](http://unicode.org/reports/tr18/#Name_Properties) を満たします。Android で`CANON_EQ`フラグが使えないのは Canonical Equivalents の仕様を満たしていないからです。


# 困ること

## Robolectric vs Runtime

Robolectric のような、JVM 上でテストを動かすものの場合、実行時とユニットテスト時で結果が異なります。

## IntelliJ の Regexp Check 

IntelliJ の機能として Regexp Check があり、正規表現文字列にフォーカスした状態で補完メニューを表示すると正規表現の動作チェックができます。この機能はもちろん JVM 上で解釈されるので、Android のランタイムとは結果が異なる場合があります。
# なぜ違うのか

一つにはライセンスの問題がありそうです。また、ICU は独立したプロジェクトとして、Unicode 標準を常にトラッキングしていたり、パフォーマンスのチューニングが施されていたりすることもありそうです。実際どの程度 Java のエンジンとくらべて良いかは測定できていませんが……

# さいごに

Android の Javadoc には、Implementation Notes として特別な項目があります。Android の正規表現エンジンは他の Java 言語の実装のスーパーセットですので、一部のレアケースを除いては Java 言語での正規表現がそのまま使用できます。ただし、一部 Java 言語の実装では動作しない正規表現が、Android では動作する場合があります。
KobitoはLinuxに対応するのか！？


まぁ、しないでしょうか。
するのか、というより、して欲しいなんです。

Linux用のMarkdown Viewerが欲しいんですよねぇ。

Qt使ってなんかそれっぽいの作ろうかな、個人用に。

というわけで、進捗があれば更新します。
image-urlなどで指定した画像が読み込めない時の対処法

`assets/images`に画像置いて `image-url`で指定したのに読み込めない。
サーバーを再起動したのに読み込めない。そんな悲しい時の対処法。

### 対策

`tmp/cache/assets`のキャッシュを削除

[Rails 4 image-path, image-url and asset-url no longer work in SCSS files - Stack Overflow](http://stackoverflow.com/questions/16843143/rails-4-image-path-image-url-and-asset-url-no-longer-work-in-scss-files)
form_forで複数のcheck_boxを表示して配列で取得する方法

チェックボックスで複数選択して、その情報を配列で取得する方法。方法は複数あるが今回は、form_forのcheck_boxを例として記載します。

## view例
check_boxのオプションにmultipleを使用することによって、:hoge_idsの結果を配列で渡せれる。

```
= form_for @form_hoge, url: { action: 'update' } do |f|
  div
    - @hoges.each do |hoge|
      div
        label
          = f.check_box :hoge_ids, { multiple: true, checked: hoge[:checked], disabled: hoge[:disabled] }, hoge[:id]
          = hoge[:name]
```
* 自動的にhiddenが作成されて、0の値が含まれる配列になる。チェックした値のみの配列を取得したい場合は、オプションで下記設定する。

```
include_hidden: false

= f.check_box :hoge_ids, { multiple: true, checked: hoge[:checked], disabled: hoge[:disabled], include_hidden: false }, hoge[:id]
```

## controller例

```
  def show
    @hoge = Hoge.new
  end

  def update
    @hoge = Hoge.new(hoge_params)
  end

  private

  def hoge_params
    params.require(:hoge).permit(hoge_ids: [])
  end
```

取得結果

```
"hoge_ids" => ["0", "1", "0","0","3"]
```
to_queryの意外な機能


to_queryはto_sやto_iよろしく,単純なクエリ文字列への変換をするだけだと思っていましたが、
どうやら自動的に辞書順にソートしたり、引数を渡すとラップしてくれたりしてくれるようです


```
{ac: 'dammy', aa: 'dammy', ab: 'dammy'}.to_query
# => "aa=dammy&ab=dammy&ac=dammy"

{ac: 'dammy', aa: 'dammy', ab: 'dammy'}.to_query('data')
# => "data%5Baa%5D=dammy&data%5Bab%5D=dammy&data%5Bac%5D=dammy"
```

参考リンク
http://apidock.com/rails/Hash/to_query
今からはじめるReact.js〜サーバーサイド〜

前回→[今からはじめるReact.js〜propsとstate、それからrefs〜](http://qiita.com/kuniken/items/a22adda392ccc30011b1)

# サーバサイドの実装(今回はReact.jsは出てきません)
## Node.js
いいかげん、サーバーサイドを実装します。

Node.jsでサーバーを起動できるようにします。

Node.jsはノンブロッキング（非同期）IOという特徴があります。
クライアントサイドから来たリクエストごとにスレッドを立てるわけでなく、
サーバー側で処理が終わったものからどんどんクライアントサイドに返却していきます。

下記のサイトが参考になりました。
http://satoshun00.hatenadiary.com/entry/2012/08/02/172936

## express
実装するにあたり、フレームワークのexpressを利用したいと思います。

npmでインストールします。
`npm install express --save`

作業ディレクトリ直下にserverディレクトリを作成し、その直下にserver.jsというファイルを作成しました。

内容は以下の通りです。

```js:server.js
var express = require('express');
var app = express();

//ポートの指定
app.set('port', process.env.PORT || 5000);

//ルートパスの指定
var clientPath = __dirname.replace("/server", "/client");
app.use('/', express.static(clientPath));

//redirect NOT FOUND page
//app.use(function(req, res, next){
//	res.status(404);
//	res.sendFile(clientPath + '/404.html');
//});

//エラーが発生した場合の指定
app.use(function(err, req, res, next) {
    console.log(err.stack);
    res.status(500).send(err.message);
});

//指定したポートでリクエスト待機状態にする
app.listen(app.get('port'), function () {
    console.log('server listening on port :' + app.get('port'));
});
```
前半は、
expressのインスタンスを作って、ポートの指定および、クライアント側ソースの起点を指定する感じですね。

コメントアウトしているところは、ユーザーの指定したURLがどのアドレスにも一致しなかった際の処理を記述しています。

後半はエラーが発生した場合の処理があり、最後にリクエスト待機状態にしています。

では、サーバーを起動してみましょう。
`node server/server.js`
とコマンドを実行します。

上記のソースの場合、
`server listening on port :5000`
とターミナルに表示されたら、
http://localhost:5000/
にアクセスしてみてください。

# サンプルソース
https://github.com/kunitak/react-tutorial/tree/day6

次回→[今からはじめるReact.js〜仮想環境を作成する〜](http://qiita.com/kuniken/items/bc01ece78784f36a9906)
Flashとここが違うよSpineは（深度編）

# はじめに
自分は今でもスマホ用にAIRアプリを開発したりするFlash大好きっ子なのですが、Spineにも深い可能性を感じコツコツと勉強しだしております。アニメーターの方でも同じようにFlashに慣れている方も多いと思いますので、両者の比較的な投稿を何本かしてみようと思います。（どちらにも贔屓目なしでお届けしますよ！）

ここではパーツのジョイント親子構造を作る場合を例にしてパーツの重ね合わせ順(深度)について考察してみます。パーツの親子構造というのは胴体に腿がついて、脛がついて、足首がついて、、みたいな奴です。

# パーツの親子構造が重ね合わせ順に影響するFlash
 
Flashでパーツの親子構造を(IK機能を使わないで ※1)作る場合、MovieClip(以下MC)でも親子関係を作ります。胴体MC内に腿MCがあってその中に足首MCがある状態にします。こうする事によって胴体MCの位置や回転を編集するだけで腿MCや足首MCがそこに追従して移動する形になります。

そんなことでMCを入れ子にしないよ、という方ももちろんいると思いますが、MCアニメーションの入れ子というのは日常的に使われるというところは同意いただけると思います。（左右移動アニメの中に歩き足踏みアニメを入れ込むなど）一つの例として捉えてください。

![スクリーンショット 2015-10-14 1.15.44.png](https://qiita-image-store.s3.amazonaws.com/0/8302/7a8cb13a-ecf9-2785-688d-a9edf2c20a36.png)
_上下にジャンプするアニメの中に_

![スクリーンショット 2015-10-14 1.22.22.png](https://qiita-image-store.s3.amazonaws.com/0/8302/4e9160a8-2db0-47f1-70af-b865647ab415.png)
_手足をじたばたさせるアニメを用意した例_

ここで各パーツMCの重ね合わせ順はMC親子関係にそのまま影響を受けます。最初の例で言えば、腿が胴体より背面にあった場合、脛や足首が胴体より前面に来ることはありません。

# パーツの親子構造と表示順が独立しているSpine

これに対してSpineではbone設定によるパーツの親子構造とパーツの重ね合わせ順序の設定が独立しています。同じように胴体に手足と顔が子パーツとして接続されているデータを例に見てみると、

![スクリーンショット 2015-10-14 1.36.22.png](https://qiita-image-store.s3.amazonaws.com/0/8302/9cd682b9-3b68-c850-f701-8adaf339426f.png)
右側のツリービューの中にDraw Orderという青いアイコンのツリー部があるのがわかると思います。Spineでは親子構造と関係なく、ここの順序をドラッグ操作で編集することによって、パーツの表示重ね合わせ順を変えることができます。

![スクリーンショット 2015-10-14 1.46.32.png](https://qiita-image-store.s3.amazonaws.com/0/8302/3d5a99d5-e339-cc64-f343-60a72eec61eb.png)
顎を顔より前に、胴体を手足より後ろに移動してみました。実に簡単です。

Flashでは、複雑な親子構造を作りこんでしまってからのパーツの深度移動は作業に苦痛を伴いそうです。とはいえ、通常そのような大幅な深度移動は作業の後半で発生しないのかもしれません。

# アニメーション中にパーツの深度を変更でききるSpine

Spineではこのパーツの深度変更をアニメーションとして使うことができます。ANIMATEモードの任意のフレームで先ほどと同じようにDraw Orderを変更してみます。(Auto Key設定を使っていない場合は、深度変更後に青いDraw Orderアイコン横にある鍵のアイコンをクリックして、キーフレーム設定をします。）これだけでアニメーション途中での深度変更を実現することができます。

![スクリーンショット 2015-10-14 2.17.48.png](https://qiita-image-store.s3.amazonaws.com/0/8302/2e05aab0-7643-6bad-9305-5fb01fef6cd8.png)
ここではジャンプしながら踊っているアニメーションに、回転の途中でボディの前と後ろに交互に移動する尻尾をつけ加えてみました。尻尾はわかりやすくするため、赤く配色してあります。

Flashではタイムライン上でパーツの深度移動をすることができません。なんとか実現するには、同じパーツをあらかじめ２つの深度に配置しておきvisibleを交互に切り替えるか、プログラムで制御するかの方法をとる必要があります。なかなか苦しいところです。

# 終わりに

完成したアニメーションは以下になります。深度変更アニメーションがきれいに書き出せたのがわかると思います。

![dinosaur_bone-animation_3.png](https://qiita-image-store.s3.amazonaws.com/0/8302/0ff56ea9-e11a-89bc-2da6-9995d56df3f4.png)![dinosaur_bone-animation_13.png](https://qiita-image-store.s3.amazonaws.com/0/8302/5a9b60c9-4978-be91-d301-1027cbc86a00.png)![dinosaur_bone-animation_22.png](https://qiita-image-store.s3.amazonaws.com/0/8302/7c5c2222-71c5-f4e3-29f2-7fa8c1b38a24.png)![dinosaur_bone-animation_28.png](https://qiita-image-store.s3.amazonaws.com/0/8302/73e23552-5d79-a945-748d-05becff24b26.png)
動画 https://twitter.com/harayoki/status/654076009419960320


## 補足

_※1 Flashにもボーンを使ったIK機能があります。（一度ツールから消滅しましたが、需要がありまた復活しました。）しかし、携帯向けのFlash liteでは利用できなかった事もあり、あまり一般的には使われていない機能でした。自分もほとんど使用したことがないので、SpineとFlashの比較の投稿に関してはIK機能を使わない通常の(クラシックトゥイーン)タイムラインアニメーションを対象にしています。_
![スクリーンショット 2015-10-14 8.02.17.png](https://qiita-image-store.s3.amazonaws.com/0/8302/4084b086-c563-f57a-bc77-747947def3f1.png)
slimをruby+cgiで動かす(日本語は非対応)

```rb:index.rb
require 'slim'

print "Content-Type: text/html\n\n"
print Slim::Template.new('index.slim').render()
```

```slim:index.slimの例
doctype html
html
  head
    title Slim Examples
    meta name="keywords" content="template language"
    javascript:
      alert('Slim supports embedded javascript!')

  body
    h1 Markup examples
```
Cordovaの開発環境を作成する手順

# インストール手順
Windows環境でCordovaの開発環境を準備するところまでの行なったのでメモ。
※コマンドのcordovaをphonegapにすればphonegap環境が作成できます。

## node.jsインストール
<a href="https://nodejs.org/">nodejsをインストール</a>

インストーラ実行後に以下のコマンドを実行
> npm -v
> node -v

それぞれバージョンが返ってくればOK。
返ってこなければ一度PCの再起動を。

## Cordovaインストール
<a href ="http://phonegap.com/install/">Phonegap参考</a> 
コマンドプロンプトより以下のコマンドを実行

> npm install -g cordova

インストール後に以下で確認。

> cordova -v

成功していればバージョンが返ってくる。
成功してるっぽいけど返ってこなければ一度PCの再起動を。

インストールでコケる場合はproxyに阻まれている可能性あり。

## HelloWorld作成
コマンドプロンプトで任意の場所に移動して以下を実行

> cordova create アプリ名

## プラットフォームの追加
利用プラットフォームを追加する。
一旦開発ではブラウザから確認できるようにしておきたいので以下実行。



> cd アプリのフォルダ
> cordova platforms add browser


追加できたら以下で確認


> cordova platforms

インストール済みプラットフォームに追加されていればOK

## 立ち上げ
仮想で立ち上げてブラウザで確認しましょう。

> アプリディレクトリにて
> cordova serve

起動したらブラウザでアクセス。
localhost:8000
※ポートはコマンドプロンプトに書いてあると思うのでそちらに。
※終了する場合はctrl + c
rubyをcgiで動かす

以下サンプルコードをapacheのcgiで動かすのにはまった。

```sendmail.rb
#!/usr/bin/ruby
# encoding: utf-8

# sendmail.rb?body=本文 というように値を取得できる。
def get_body()
    require 'cgi'
    cgi = CGI.new
    body = cgi['body']
end

def send_mail(body)
    require "mail"
    mail = Mail.new do
      from    "from@from.com"
      to      "to@addr.com"
      subject "件名"
      body    body
    end

    mail.delivery_method :smtp, {
      enable_starttls_auto: false,
    }
    mail.charset = 'UTF-8'
    mail.deliver!
end

def print_html()
    print "Content-Type: text/html\n\n"
    print "mail sent."
end

body = get_body()
send_mail(body)
print_html()
```

## .htaccess

```bash:.htaccess
Options +ExecCGI
AddHandler cgi-script .rb
```

* /etc/apache2/mods-enabled/cgi.load <- 存在すること
* /etc/apache2/mods-enabled/mime.load <- 存在すること
* /etc/apache2/mods-enabled/mime.conf <- 一応中身確認

## Premature end of script headers

* `\n\n`が`￥n￥n`になっていたのが原因。
  * cliから ./sendmail.rb で出力結果をみればもっと早く気がついた・・・
[Qiita][Git] やること＆調べることメモ


# Markdownの謎 (誰かおしえての意)

## 改行すると改行されちゃう

通常、Markdownは1個の改行は無視されちゃう仕様（たぶん）[^but]。


```markdown:normal
   line1
   line2

   >>> 
   line1 line2
```

でもQiitaだと改行されちゃう

```markdown:qiita
   line1
   line2

   >>> 
   line1 
   line2
```

MarkdownプレビューはViewerによって様々だけど、これは個人的に困る。
vimmerである私は1行に表示させたい文章でもかなり細かく改行する。でもそのまま表示すると見栄えが悪い。
だって、実際のところ
こんなに改行してたら
読みにくいでしょ？

## テキストファイルアップロードで投稿ができない

localにMarkdown形式でメモ書きを書いているんだけど、これをアップロードしたい。でもできない。
catしてコピペしてってめんどくさい・・・

## codebreak; と非連動

謎というよりGitHubと連動してるからでしょうね（当たり前）。
でもgitの使いみちが9割private repositoryの私は無料のcodebreak; のほうが使いやすかったり。
運営さん、営業さん、なんとか1つお願いします -人-

**ぇ、codebreak;ってサービス終了すんの？**

---
---

# 調べることリスト

## local viewer: syntax color of code in markdown

Qiitaを使うモチベーションはコードの色付け。他にはない[^*]！
[^*]: 嘘です、ごめんなさい。最初はそうだったけど公開したいです。
というわけで、LocalでQiitaのようなcodeのsyntax colorを実装する方法を探そう。
でもediterはterminal上のvimなのでmarkdown editorじゃなくてviewerの方向で。
Finderからquicklookできるのが理想だけど、そこまでとなると自作？　めんどくさいなぁ、、、

ついでにLinux版のQuickLookみたいなのもほしい。挙動軽くてMarkdown表示できるの。
・・・やっぱり作るべきかなぁ。

## vim-qiita uploader

なんかちらっとVim pluginでQiitaに投稿できるのを見た。
設定やら構築方法を調べなければ。

## git repository sharing

一人でgit使ってバージョン管理してたけど、コードをグループで共有するようなことになった。
適当に使ってたおかげで他人がコードを書いた時の使い方がよくわかってない。


---
[^but]: でもそれはそれで困るんだよね。日本語だと間に半角スペースが挟まるので見栄えが悪い。
[python] os.path

# os.path.[*functions*]

ファイルパスとディレクトリパスの両方を処理できるスクリプト書こうとして思ったのと違う動きしたのでメモ。

最近よくつかったos.path.*functions*について。全部じゃありません、使ったやつだけ。
help(*function*)とか読んだわけではないので違う環境で再現性なくても怒らないでね！
`もし便利なのがあったら教えて下さい`
> 環境：
>
> + MacBook (12 inchのやつ)　OS X 10.10
> + Python 2.7.10, ipython 4.0.0
> + 他なんか必要な情報あったっけ、、、

## os.path.abspath(*str*)

作業ディレクトリ+ *str*を返す

**単なる絶対パスへの変換ではありません。**
また、ディレクトリ名を引数として渡した場合、最後のバックスラッシュがなくなります。

```python
    print os.path.abspath('~/Documents/files/')
    # => <WorkingDir>/~/Documents/files
    # 最後の"/"が消えている
```
~ や　\$name みたいな環境変数は使えませんが、../../みたいな相対パスはちゃんと働きます。
環境変数たちはexpandusersとexpandvarsが必要です (下の方に説明)。

## os.path.dirname(*str*)

*str*の文字列のうち、ディレクトリまでを返す。**最後の/は消える。**
多分次みたいな処理をしてるんだと思う。

```python:dirname
    def dirname(filepath):
        dirs = filepath.split('/')
        return '/'.join(dirs[:-1])
```
splitとjoinはggrか、下を見て察して

```py
    a = '/color/test/test/'
    print a.split('/')
# => ['', 'color', 'test', 'test', '']
    print '/'.join(a.split('/'))
# => '/color/test/test/'
    print '/'.join(a.split('/')[:-1])
# => '/color/test/test'
```

## os.path.basename(*str*)

ファイル名を返す。*str* がディレクトリパス(/で終わってる)だったら空文字が帰ってくる。
多分処理内容は下の様な感じ。

```py
    def basename(filepath):
        dirs = filepath.split('/')
        return dirs[-1]
```

## os.path.expanduser(*str*)

ホーム記号(~)をログインユーザーで定義されているパスへ展開する。
たぶんデフォルトだと`/Users/<username>/`とか`/home/<username>/`とか[^*]。

[^*]: MacとLinuxでここのパスが違うのがなんでなんでしょう。Windowsは使ってないから知らない。

## os.path.expandvars(*str*)

\$マークで呼び出すような環境変数を展開します。\$HOMEでも\${HOME}でもいいみたい。
でもexpandvars(\$PATH)とかで呼び出しても":"が入ってるので結局split(':')とかやらないといけない。
しかもpathじゃない環境変数でも呼び出せる。
でも~は展開しない。なぜ別けたし。



___

## 事故例

```python:事故例
    from os.path import dirname, abspath, expandusers, expandvars

    def smartpath(filepath):
        _dir = dirname(abspath(expandusers(expandvars(filepath))))
        _file = basename(abspath(expandusers(expandvars(filepath))))
        return [_dir,_file]

    print smartpath('$HOME/file')
    # => ['/Users/username','file']
    print smartpath('~/Documents/note/')
    #    ['/Users/username/Documents/note',''    ]    :想定
    # => ['/Users/username/Documents'     ,'note']    :実際    
```
こんな感じで、ファイルパスでもディレクトリパスでもおんなじようにしてディレクトリ名とファイル名が欲しかったのだけど、適当に関数を重ねたところ、ファイルパスは絶対でも相対でも大丈夫だったけど、ディレクトリパスだと最後のディレクトリ名がファイル名と誤認されちゃったということ。

結局はファイルパスかディレクトリパスかを判定してif分岐にしました。

---
技術英語 > but to say that it is impossible is an exaggeration. / Logic would dictate that ...

@ Star Trek Voyager > JETREL

NeelixとTuvokがビリヤードをしている。困難なボールの配置についてのNeelixの言葉に対してのTuvokの返答

> but to say that it is impossible is an exaggeration.

論理的人種であるTuvokの次の言葉は

> Logic would dictate that if I strike the cue ball properly, it will deflect first off the rear bumper, then the side, striking the 11 ball and causing it to roll directly into the corner pocket.

Tuvokが打ったショットについては別の回で。
Flutter x Dartlang で Androidアプリ作成 

# DartでMobileアプリの開発環境が生まれた
Flutterを使うことで、AndroidやiOSなどの Mobile Platform 向けのアプリが Native な Dartlang で開発できるようになります。今のところ、Android のみの対応となっています。


* http://flutter.io/

* https://github.com/flutter/engine/ 


# Dart Mobile on Chrome　との違い
Chromeアプリとして変換することで、Android と iOS上で動作可能なアプリを作成すことは、今までも可能でした。
しかし、JavaScriptに変換したものを利用するため、DartVMの強力なパフォーマンスを生かす事ができませんでした。
FlutterはAndroid上でDartVMが動作するため高速であり。Browser向けの助長な構成を排しているため、Simpleです。

Material デザインが初めからサポートされているのも目を引くところでしょう。


# Demo 

Kyorohiroがミニゲームを作成すのに必要そうな機能を調べて、サンプルアプリを書いてみました。
https://www.gitbook.com/book/kyorohiro/hello_skyengine/details
のページにまとめました。


#### 2D Game Demo
https://kyorohiro.gitbooks.io/hello_skyengine/content/spacewar/doc/index.html

![screen.png](https://qiita-image-store.s3.amazonaws.com/0/54192/1ba77f82-3706-564a-cee6-14a900ca3abd.png)


#### 3D Demo
https://kyorohiro.gitbooks.io/hello_skyengine/content/draw_vertices_demo/doc/index.html

![screen (1).png](https://qiita-image-store.s3.amazonaws.com/0/54192/6a3f4d66-8675-0655-2d37-9b3e73fe9d9b.png)


#### 2D physics and gravity sensor

https://kyorohiro.gitbooks.io/hello_skyengine/content/ph_2d_boun_no_friction/doc/index.html

![screen.png](https://qiita-image-store.s3.amazonaws.com/0/54192/537e0558-d0f8-75ec-0c9f-3029d85df509.png)

これは、Kyorohiroが フルスクラッチで書いた、100-200行くらいの、即席Physicsエンジンです。Googleでも、 FlutterようのPhysicsライブラリを作成しているもよう。https://github.com/flutter/newton 



　
　
　
　
　
　

# Hello Worldを試してみよう

![screen (2).png](https://qiita-image-store.s3.amazonaws.com/0/54192/d9eea2e5-ed7d-f85b-11c2-3b16e39da4ff.png)


```
import 'package:flutter/widgets.dart';

void main() {
  Text t = new Text("Hello World");
  Center c= new Center (child: t);
  runApp(c);
}

```

## 環境の設定
2015/10/1の時点では、Flutterの開発環境としてはAtomが良い感じです。ですが、まずはメモ帳から初めてみましょう。

* 公式サイトの[Getting Start with Flutter]( http://flutter.io/getting-started/)

### [○] Dart SDKをインストール
コマンドラインから、pubコマンドとdartコマンドを使えるようにしましょう。

* [Macの場合]

```
brew tap dart-lang/dart && brew install dart --devel
```


### [○] Android SDKのインストール
adbコマンドが使えるようにしましょう。
TODO
* [Android SDK](https://developer.android.com/sdk/installing/index.html?pkg=tools)

## アプリを作成する。
#### [○] pubspec.yamlを作成する
```
name: hello
dependencies:
  sky: any
  flutter: any
  sky_tools: any
```

#### [○] libフォルダを作成する

```
./pubspec.yaml
./lib/
```

#### [○] Pubコマンドでsky関連のライブラリをダウンロードする

"./" で、pubコマンドを入力する。

```
> pub get
..
> pub upgrade
..

```

#### [○] mainプログラムを書く

"./lib/main.dart" を作成して以下を書く。

```
import 'package:flutter/widgets.dart';

void main() {
  Text t = new Text("Hello World");
  Center c= new Center (child: t);
  runApp(c);
}

```


#### アプリを起動する

"./" で、以下のコマンドを入力する。

```
./packages/sky/sky_tool start --checked && ./packages/sky/sky_tool logs
```

これで完了です。


# お勧めの開発環境

Atomがおすすめです。
セミオフィシャルのpluginが公開されています。
https://dart-atom.github.io/dartlang/






-- 
kyorohiro work
http://kyorohiro.strikingly.com
gulpのタスクをコマンドラインで確認したい


## やりたいこと

- タイトル通り、ピンポイントのメモです...。
 - gulpfileに定義したタスクに、どんなもどがあるか確認したい（忘れちゃったので）

## こうします

grunt -T, rake -T と同じで、-T で出力できます。

```
% gulp -T
[14:38:12] Using gulpfile ~/workdir/gulpfile.js
[14:38:12] Tasks for ~/workdir/gulpfile.js
[14:38:12] ├── partials
[14:38:12] ├─┬ html
[14:38:12] │ ├── inject
[14:38:12] │ ├── partials
[14:38:12] │ └── optimizeImage
[14:38:12] ├── clean
[14:38:12] ├─┬ build
[14:38:12] │ ├── html
[14:38:12] │ ├── fonts
[14:38:12] │ └── other
[14:38:12] ├─┬ protractor
[14:38:12] │ └── protractor:src
[14:38:12] ├─┬ protractor:src
[14:38:12] │ ├── serve:e2e
[14:38:12] │ └── webdriver-update
[14:38:12] ├─┬ protractor:dist
[14:38:12] │ ├── serve:e2e-dist
[14:38:12] │ └── webdriver-update

--- [ 以下略 ] ---

```

## GUIの助けを借りる場合

IDEやエディタでもプラグイン利用でgulpのタスクの一覧表示 -> 実行ができます。
わたしの場合は、[Backets](http://qiita.com/akiko-pusu/items/49e49b54bf78eab1038c) や RubyMine を利用しています。
Perl6導入とHello, world!

# 最初に

2015年クリスマスの正式リリース[^Christmas]の前に、Perl6の予習をしようというもの…でした。
この記事は、MacとWinへのインストールと、お約束の「Hello, World!」実行を扱います。

# インストール

公式ドキュメント[^install]に従って実施します。

### macOS Sierra での手順

[rakudobrew](https://github.com/tadzik/rakudobrew) でも良いですが、今回は [homebrew](http://brew.sh/index_ja.html) でインストールします。

```bash:インストール
$ brew install rakudo-star
```

```bash:バージョン確認
$ perl6 -v
This is Rakudo version 2016.11 built on MoarVM version 2016.11
implementing Perl 6.c
```

2015年末ごろ homebrew では Perl6 のパッケージ管理コマンド `panda` がインストールされず、以下のような手順で別途持ってきていたのですが、今は不要になっています。

```bash:過去に実施していたpandaコマンドの導入(今は実施不要です)
$ git clone --recursive git://github.com/tadzik/panda.git
$ cd panda
$ perl6 bootstrap.pl

echo 'export PATH=$PATH:/usr/local/Cellar/rakudo-star/2015.12/share/perl6/site/bin' >> ~/.bashrc
source ~/.bashrc
```

### Windows 10 Pro での手順

1. [公式](http://rakudo.org/downloads/star/)から拡張子.msiのファイル[^version]をダウンロード[^chrome]する。
2. インストールする。
3. [任意] C:\rakudo\bin\ をPATHに追加する。

```bash:バージョン確認
> perl6 -v
This is perl6 version 2016.11 built on MoarVM version 2016.11
```

# Hello, world!

### インタプリタでHello, world!

```
$ perl6
> say "Hello, world!";
Hello, world!
> exit
$
```

### ワンライナーでHello, world!

```
$ perl6 -e 'say "Hello, world!"'
Hello, world!
```


### スクリプトファイルを作ってHello, world!

以下のような`hello_1.pl`ファイルを作成し、

```perl:hello_1.pl
use v6;

my sub MAIN(){
  say 'Hello, world!';
}
```

実行します。

```
## シンタックスチェック
$ perl6 -c hello_1.pl
Syntax OK

## 実行
$ perl6 hello_1.pl
Hello, world!
```

***

`hello_1.pl`にはいろいろ書いていましたが、

```perl:hello_2.pl
### この一行だけで動作します。
say 'Hello, world!';
```

おわりです。


# 参考や注釈

* [The Perl 6 Programming Language](http://perl6.org/)
* [Perl 6 Download](https://perl6.org/downloads/)
* [rakudo.org](http://rakudo.org/)

* [Perl6導入記 - Qiita](http://qiita.com/kamichidu/items/0889d6e70a4185b24287)
* [Hello_world/Text#Perl_6 - Rosetta Code](http://rosettacode.org/wiki/Hello_world/Text#Perl_6)

[^Christmas]: [Perl開発者Larry Wall氏が、Perl 6.0の正式バージョンを2015年のクリスマスにリリースすると発言、Perl開発者の中には懐疑的な見方も - CodeZine](http://codezine.jp/article/detail/8457)
[^install]: [How to get Rakudo Perl 6](http://rakudo.org/how-to-get-rakudo/)
[^version]: 本稿執筆時点〜2016/12/06更新時の最新版は 64bit 版が rakudo-star-2016.11-x86_64 (JIT).msi 、32bit版が rakudo-star-2016.01-x86 (no JIT).msi でした。
[^chrome]: ダウンロードの際、Google Chromeブラウザでは「一般的にダウンロードされておらず、危険を及ぼす可能性があります。」というメッセージが表示されます。
GCD (Grand Central Dispatch)の他OSへの最新移植状況


以前、こんな記事を書きました。

* 「[GCD(Grand Central Dispatch)をWindows、Mac、Linuxで利用する](http://qiita.com/emadurandal/items/fa6fac306bfebd3ba0de)」

今でも上記は使えると思います。ただ、上記で紹介しているXDispatchは長らく更新されていません。

更新が途絶えたライブラリは、ある意味生きているとは言えません（将来的な意味で）

そこで、現在他の方による移植物がないか、探してみました。

見つけたのがこちら

Linux移植版：https://github.com/nickhutchinson/libdispatch
Windows移植版：https://github.com/DrPizza/libdispatch

## 実用性について

それぞれ、まだ私はちゃんと実際に試して検証等していません。
Linux移植版とWindows移植版はそれぞれ別の方が開発されているため、
以前の記事のように、Mac/Linux/Windows間で完全に同一コードを共有できるかもまだわかりません。

そもそも、それらの移植版のメンテナンスがいつまで続くかも、それはもうその作者さんの意志次第なので、なんともいえないですね。

## っていうか、マルチプラットフォームGCDは世から求められているのだろうか？

マルチスレッドプログラミング・並列処理においてよく起きる問題を低減するマルチOSプラットフォームソリューションは、GCDだけではありません。

* Javaにおける`java.util.concurrent`
* Scalaの`アクター`や`並列コレクション`
* C/C++における`OpenMP`や、未来のC++標準`C++17`における`ParallelSTL`。

それぞれプログラミングにおけるアプローチが違うので、単純な比較はできませんが、これだけあるわけですね。

そもそも、本家Apple版GCDの利点は、スレッドプールをOSXが適切に管理することによって、OS全体で最高のパフォーマンスを出すことがメリットの一つだったわけで、LinuxやWindowsへの移植版が、そこまで高度な統合を果たしているかも未知数です。

そして、業界のトレンドとしては、関数プログラミングへの志向＆マルチスレッドモデルからActorモデルへの移行が進んでいます。

さらに、OpenCLやらOpenACCなど、GPGPU系なども考えるともう、色々過渡期っすね。なんかオイラ、ようけわからなくなってきたよｗ

## まとめ

ちょっと風呂敷を広げすぎましたが、少なくともこういうことは言えそうです。

* iOS/Macでの開発においてGCDを多用する人にとっては、LinuxとWinで同じ作法が使える、移植版の存在は魅力的ではないか。
* それ以外の人にとっては、C++11でクロスプラットフォームになった`<thread>`、`OpenMP`、C++17での`parallelSTL`（これについては、実用できるのは相当先ですが）など、他のソリューションの方があっているかも。

なんか、それぞれアプローチの違う色んなソリューションを引っ張ってきたから、単純な比較もできないし、そもそも各ソリューションのベンチマークもしてないじゃんという、突っ込みどころ満載の手抜き記事になってしまいましたが、まぁ「マルチプラットフォームでワンソースで並列処理」という夢に一番近いソリューションは何か、というのを色々検討するのはそれなりに意義あることでは・・・ない・・・カナ？カナ？

という感じで無理やり締めて、そろそろビールの酔いが回ってきたので寝ますｗ（←夜酒しながら書いてた）
Ansible の mysql_variables モジュールのメモ

# はじめに

とりま Ansible で MySQL の設定をチェックするようにしたかったのでやってみた。
既存の MySQL サーバが開発ステージング本番マスタースレーブあわせて80機ほどあるのでツールなしで面倒見るのもう無理ぽ。

# mysql_variables モジュール

http://docs.ansible.com/ansible/mysql_variables_module.html

他のモジュールは require 書いてあるのにこれには書いてない。
けど MySQL-python （pyhons-mysqldb?）が必要っぽい（当然MySQLサーバ機上に）。
CentOSでデフォルトのpythonならyumでおｋ
<pre>
sudo yum install -y MySQL-python
</pre>
もちろん pip でもいい（はず）
<pre>
pip install MySQL-python
</pre>

# playbook

<pre>
# cat playbooks/mysql_check.yml
- hosts: all
  sudo: yes
  gather_facts: no
  tasks:

    - name: check max_connections
      mysql_variables:
        variable=max_connections
        login_user=接続ユーザ
        login_password=パスワード
</pre>

# 発生したエラーと対処方法

<pre>
$ ansible-playbook playbooks/mysql_check.yml -l XXXXX
PLAY [all] ********************************************************************

TASK: [check max_connections] *************************************************
failed: [XXXXX] => {"failed": true}
msg: the python mysqldb module is required

FATAL: all hosts have already failed -- aborting

PLAY RECAP ********************************************************************
           to retry, use: --limit @/home/myaccount/mysql_check.retry

XXXXX              : ok=0    changed=0    unreachable=0    failed=1

※ 対象のサーバに MySQL-python が入っていないので前述のとおりインストールする
</pre>

<pre>
$ ansible-playbook playbooks/mysql_check.yml -l XXXXX

PLAY [all] ********************************************************************

TASK: [check max_connections] *************************************************
failed: [XXXXX] => {"failed": true}
msg: unable to connect to database, check login_user and login_password are correct or ~/.my.cnf has the credentials

FATAL: all hosts have already failed -- aborting

PLAY RECAP ********************************************************************
           to retry, use: --limit @/home/myaccount/mysql_check.retry

XXXXX              : ok=0    changed=0    unreachable=0    failed=1

※ 権限系エラー。MySQLの権限まわりは別途調べましょう。
ちなみにAnsibleだとローカルホスト扱いみたいなので root で接続してもいい、ハズ。。。（いやよくない（反語
</pre>

# 成功
<pre>
$ ansible-playbook playbooks/mysql_check.yml -l XXXXX

PLAY [all] ********************************************************************

TASK: [check max_connections] *************************************************
ok: [XXXXX] => {"changed": false, "msg": [["max_connections", "151"]]}

PLAY RECAP ********************************************************************
XXXXX              : ok=1    changed=0    unreachable=0    failed=0

※ わざわざ changed_when: False 書かなくても参照時はちゃんとfalseなのは小町的にポイント高い
</pre>

# one more thing

sudo:yes の場合には root ユーザの、sudo:no の場合には実行時ユーザの、ホームディレクトリの .my.cnf に user と password を設定しておけば、playbook 中からは login_user と login_password は外すことができる。
もっとも、Ansible 実行側の vars 等にホスト毎の変数として置いておいたほうが取り回しは楽だと思うけど。

あと、この .my.cnf に余計な設定があるとエラーになるので注意。
no-auto-rehash と interactive-timeout が ConfigParser.py でエラーになった。
テンプレートエンジンSimplate 配列と連想配列のアクセスの違い

Simplateを使っていて配列の要素にアクセスできず少しハマりました。

# PHPの配列のアクセス
配列の要素へのアクセスには、配列でも連想配列でもarray[key] 構文を使います。

```php:Php.php
//配列
$array = [];
//連想配列
$associative_array = [];
for ($i = 0; $i < 10; $i++) {
    $array[] = $i * 1000;
    $associative_array[$i] = $i * 1000;
}

// どちらもアクセスできます
var_dump($array[0]);
var_dump($associative_array[0]);
```

# Simplateの配列と連想配列のアクセス
Simplateでは、配列と連想配列で要素のアクセスの仕方に違いがあります。

## 配列のアクセス
配列に対しての要素のアクセス

```tpl:array.tpl
<{* どちらもアクセスできます。 *}>
<{$array[1]}>
<{$array.1}>
```
 
## 連想配列のアクセス
連想配列に対し要素のアクセス

```tpl:associative_array.tpl
<{* こちらはアクセスできません。勝手にできると思い込んでいて嵌まった。*}>
<{$associative_array[1]}>
<{* こちらはアクセスできます。 *}>
<{$associative_array.1}>
```

# まとめ
- Simplateでは、連想配列の要素へのアクセスの方法が、PHPと違うので注意が必要。
- Simplateの連想配列の要素へのアクセスは`$associative_array.key`のようにする。

# 参考
- [Variable.from.php - simplate Wiki - simplate - OSDN.html](https://osdn.jp/projects/simplate/wiki/Variable.from.php "Variable.from.php - simplate Wiki - simplate - OSDN.html")
テンプレートエンジンSimplate loop属性の設定の仕方


あるサイトの改修を行っていて、テンプレートエンジンのSimplateを触っています。
ループ文のループの回数を指定がなかなかできず、エラーに対処するのに少し苦労しました。

# Simplateでループ文
配列をループするためには`<{section}>`タグを使用します。
ループの回数を指定するにはloop属性（たいていは配列）を使用します。

# エラーが起きるコードと正常なコード
一見同じように見えるコードですが、何が違うか分かりますか？
（タイトルから予想付いているかもしれませんが）

## エラーが起きるコード
下が問題のコードです。

```tpl
<{section name=i loop=range(0, 10)}>
  <P><{$array[i]}><p>
<{/section}>
```

## 正常なコード
問題なく動くコードです。

```tpl
<{section name=i loop=range(0,10)}>
  <P><{$array[i]}><p>
<{/section}>
```


# まとめ
上の答えは、range関数のパラメータ間に空白があるかどうかです。
なぜ、関数のパラメータ間に空白があると動作しないかはわかっていませんが、
for文で回数を指定したい場合には、パラメータ間の空白に注意してください。

# 参考
- [Builtin.functions.section - simplate Wiki - simplate - OSDN]
(https://osdn.jp/projects/simplate/wiki/Builtin.functions.section "Builtin.functions.section - simplate Wiki - simplate - OSDN")
touchIDやってみた。

TouchIDで指紋ごとに誰って振り分けできるのかな―って調べてみたけど、
認証のパーツでしかないのかな[LAPolicy](https://developer.apple.com/library/prerelease/ios/documentation/LocalAuthentication/Reference/LAContext_Class/index.html#//apple_ref/doc/c_ref/LAPolicy)にはできる、実行しかないし。
結果もBOOLだからYES,NOだし。
あれ？でもこれだとログインって誰＋認証だから端末変わって誰でも入れないか？？？
もうちょっとしれべてみよう
[サンプルコード](https://github.com/kameware/TouchIDSample)

参考サイト
[[iOS 8] Touch ID で指紋認証を行う](http://dev.classmethod.jp/references/ios8-touch-id/)
[公式サンプル](https://developer.apple.com/library/prerelease/ios/samplecode/KeychainTouchID/Introduction/Intro.html)
pm2でもbabel-nodeを使いたい (Intel Edison)


[babel-nodeをpm2でデーモン起動](http://qiita.com/n0bisuke/items/55f86fb3300eefcc63e4)って記事を書いたんですけど、シェルスクリプトを書いてそれを実行する感じでした。Intel Edisonでやろうとしたら(これが原因か分からないけど)、うまくいかなかったので別の書き方です。

## 結論

調べるとRun using Babelってissueありますね。
> [Run using Babel](https://github.com/Unitech/PM2/issues/1167)

```
pm2 start app.js --interpreter ./node_modules/.bin/babel-node
```

これでいけました。

ローカルのnode_modulesを指してるので、 babelは `npm i -g babel`じゃなくて`npm i babel`て感じみたいですね。

## 補足でバージョン

dependenciesはこんな感じです。

```package.json
"dependencies": {
    "babel": "^5.8.23",
    "pm2": "^0.15.7"
 }
```

```
# node -v
v0.12.7
```

参考までに。
オブジェクト指向とは？

その答えを出すためにオブジェクト指向が生まれた背景から考える

# 50年前 ～理解しにくく書きにくい時代～

## なぜそんな時代があった？

* CPUの性能は低い
* メモリは超高価で性能も低い

⇒ メモリ占有量を減らしステップ数を減らすための「職人芸」的プログラミング
（読みやすさ、作りやすさよりも小さく速いソフトウェアを作ろうとした）
（これは今の組み込み系も同じ）

⇒ 作りにくく理解しにくいソフトウェアが世に溢れた

## その結果

<dl>
  <dt>生産性</dt>
  <dd>⇒ 上がらない</dd>
</dl>
<dl>
  <dt>工程、品質、コスト</dt>
  <dd>⇒ 制御できない</dd>
</dl>

## しかし
<dl>
  <dt>コンピューターに注目が集まり需要は爆発的に増加</dt>
  <dd>⇒ 質・量ともに追いつかず</dd>
</dl>

### おまけ ～1000ステップ/1人月～

> 1人が1ヶ月で開発できるステップ数の平均は1000と言われており、これは30年後も変わらないだろうと言われている

この頃COBOLなど「高級言語」と呼ばれるプログラミング言語が登場し、1ステップあたりの意味を4～5倍に増やしたため、効率も4～5倍上昇
これだけの生産性の向上は最初で最後であろうとも言われている

⇒それでも質・量ともに需要に供給が追いつかなかった

## ソフトウェア危機

生産性も品質も上がらず制御も出来ないこの現象を**ソフトウェア危機**と呼んだ

# 45年前 ～GOTO文からの脱出～

## ベームの数学理論

> * 連結
> * 選択
> * 反復
> 
> （読みにくく書きにくいGOTO文など使わずとも）どんなプログラムでも上記3つで表現できる

画期的だが当時は誰も相手にせず

### なぜ認められなかった？

高級言語が普及しはじめたばかりで`ifelse`などまだ存在せず`GOTO`しかない時代に

* `GOTO`文がなくてもプログラミングはできる
* `GOTO`文を使わないプログラミングは理解しやすい

という主張は受け入れられるものではなかった

## ダイクストラの書簡

ベームは「`GOTO`文がなくてもプログラミングできるよ」という消極的な否定であったのに対し

> * `GOTO`文はスパゲッティ構造を助長する
> * `GOTO`文は有害である

と世の中のプログラマー達全てに宣戦布告するかのような衝撃的な内容

大論争を巻き起こした

### なぜベームと違い大論争になったのか

<dl>
  <dt>ベーム</dt>
  <dd>⇒ 一介の研究家</dd>
</dl>
<dl>
  <dt>ダイクストラ</dt>
  <dd>⇒ OSとソフトウェア工学の両分野で巨大な業績を挙げている誰もが知る超有名人</dd>
</dl>

無視できない発言力・説得力があった

### 大論争へ

大多数の技術者の意見は

> 言いたいことは分かるが現実問題`GOTO`文無しでどうプログラミングをするのか

中には

> goto文がないと、プログラミングは不可能

と唱え猛反対するものも

# 40年前 ～理解しやすく書きやすい時代へ～

## クヌースの論文

ソフトウェア業界のご意見番でもあったクヌースにより

> 構造化プログラミングとは「`GOTO`文を使わないプログラミング」**ではなく**、
> **書きやすく、理解しやすいプログラミングのこと**である

とされ、10年近く続いた大論争は終結

`GOTO`文有害説の肯定派、否定派の両者が合意した、

> 1.. 構造化プログラミングとは、**書きやすく、理解しやすいプログラミングのこと**である。
> 2.. 構造化プログラミングは、goto文を**なるべく**使用せずにプログラミングすることである。
> （goto文の使用はエラー処理に限定し、かつ「前方goto文（先へ進むgoto文）」に限る。）

上記を持って**構造化プログラミング**が誕生

⇒ **処理性能重視から保守性重視へ**

# 近年 ～理解していなくても再利用できる時代へ～

<dl>
  <dt>小規模再利用</dt>
  <dd>⇒ ライブラリ関数や100ステップ程度の小さいサブルーチンをコピーする程度のもの</dd>
</dl>
<dl>
  <dt>大規模再利用</dt>
  <dd>⇒ ソフトウェア全体をコピペして必要個所を変更するもの</dd>
</dl>

小規模は既に大成功を収めている
ソフトウェア業界が求めているのは「大規模再利用」

しかし構造化プログラミングでも「大規模再利用」が得意とは言えない

## なぜ？

構造化プログラミングは50年前の職人芸に比べれば理解しやすいが、
自分で書いたプログラムでも3ヶ月経てば他人のものと同じぐらい理解するのは大変という側面がある

## 大規模再利用のために

再利用を成功させるためのキーは**元のプログラムが理解しやすいかどうか**にある

理想は**理解していなくても再利用できる**こと
（例として言語のライブラリ関数を使うとき内部のデータ構造や処理・制御を知ることなく使っている）
この利点を一般のプログラムにも拡張することが出来たら生産性が大きく向上する

## つまり

オブジェクト指向とは**理解していなくても再利用できるソフトウェア**を開発する技法

# オブジェクト指向的ソフト開発

どうすれば中身を理解せずに再利用できるソフトウェアを開発出来るのか
なぜ構造化プログラミングでは同じ事が出来ないのか

## ローカル変数とグローバル変数

グローバル変数はプログラム内のあらゆるモジュールからアクセス・変更できるため
どのモジュールとどのように関係しているのかを突き止める事が難しい
そして突き止めるためには**コードを読み解き理解する**必要が出てくる

⇒ グローバル変数のあるモジュールは切り離すことが困難（どこからアクセスされているか分からない）

一方でローカル変数は1つのモジュール内部でしか使用できない

⇒ なるべくローカル変数を使うことで情報を隠蔽し、大規模再利用を促す

## 構造化プログラミングとの比較

<dl>
  <dt>構造化プログラミング</dt>
  <dd>⇒ GOTO文をなるべく使わない</dd>
  <dd>⇒ 制御構造に制限を設けてコントロールの流れを綺麗に</dd>
</dl>
<dl>
  <dt>オブジェクト指向プログラミング</dt>
  <dd>⇒ グローバル変数を使わない</dd>
  <dd>⇒ データ構造にも制限を設けてグローバル変数の弊害を是正し再利用性を向上</dd>
</dl>

# 参考

[山浦恒央の“くみこみ”な話（23）](http://monoist.atmarkit.co.jp/mn/articles/1009/17/news118.html)
Processingでシミュレーション～熱伝導

# はじめに
Processingを使って熱伝導をシミュレーションします。

# 熱伝導方程式
時間とともに変化する温度の分布を教えてくれる方程式です。

温度$T(x,t)$は時間と位置の関数になります。

```math
\frac{\partial T}{\partial t} = k \frac{\partial ^2 T}{\partial x^2}
```

# 差分化・離散化
差分に変換します。

```math
\frac{1}{Δt}(T(x,t+Δt) - T(x,t)) = k\frac{1}{Δx^2}(T(x+Δx,t)-2T(x,t)+T(x-Δx,t))
```

離散化
Δt=1, t=0,1,2,...
Δx=1, x=0,1,2,...,len
とします。

```math
T(x,t+1) - T(x,t) = k(T(x+1,t)-2T(x,t)+T(x-1,t))
```

t=0のとき

```math
T(x,1) = T(x,0) + k(T(x+1,0)-2T(x,0)+T(x-1,0))
```

$T(x,0)$は初期条件です。時刻0での温度分布です。
$T(x,1)$は1時刻進んだ温度分布です。
xが0~lenの範囲をとると、$x(-1,t),x(len+1,t)$のデータが必要になります。これは境界条件になります。

# Processingで可視化
## サーモグラフィーのような色付け
HSBカラーモードを使ってHue値を0%~68%まで使うと0%が赤、68%が青色になります。
高温を赤、低温を青で色づけします。

```java
void setup() 
{
  size(680, 120);
  int step = 100;
  PImage img = createImage(step, 1, RGB);
  colorMode(HSB, step*100/68, 100, 100);
  noSmooth();
  for (int i=0; i<step; i++) {
    img.pixels[i] = color(i+1, 100, 100);
  }
  img.updatePixels();
  image(img, 0, 0, width, height);
}
```

![1.JPG](https://qiita-image-store.s3.amazonaws.com/0/84205/96043619-9dc0-a218-2c60-5e4976198cfd.jpeg)

## シミュレーション

t1は現在の温度分布、t0は1時刻前の温度分布です。
xminは左端の温度、xmaxは右端の温度です。初期条件はすべて温度0です。
右が高温、左が低温になっており、温度が右から左に移動します。

```java
float k = 0.5;
float[] t0;
float[] t1;
float xmin;
float xmax;
PImage img;
int step = 100;

void setup() {
  size(640, 100);
  init();
  noSmooth();
  frameRate(60);
}

void draw() {
  for (int i=0; i<step; i++) {
    img.pixels[i] = color(255-t1[i], 100, 100);
  }
  img.updatePixels();
  image(img, 0, 0, width, height);
  for (int i=0; i<10; i++) // speed up
    updateTime();
}

void init()
{ 
  t0 = new float[step];
  t1 = new float[step];
  xmin = 0;
  xmax = 255;
  img = createImage(step, 1, RGB);
  colorMode(HSB, 255*100/68, 100, 100);
}

void updateTime()
{
  for (int i=0; i<step; i++) {
    t0[i] = t1[i];
  }

  t1[0] = t0[0] + k * (xmin - 2 * t0[0] + t0[1]);
  for (int i=1; i<step-1; i++) {
    t1[i] = t0[i] + k * (t0[i-1] - 2 * t0[i] + t0[i+1]);
  }
  t1[step-1] = t0[step-1] + k * (t0[step-2] - 2 * t0[step-1] + xmax);
}
```

[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/AKWqd5z71CY/0.jpg)](http://www.youtube.com/watch?v=AKWqd5z71CY)