OmniAICreator/Qiita-1.07M huggingface dataset:
DBから取った配列をPHPで1行変換

PHPでデータベースから配列を取ってくると、使いづらい形になっていることがよくあります。ものによっては、1行で思い通りの変換ができるので、使いこなせると**快感**です。

# その1…ただの配列でいいのに
DBから1列だけ取ってくると、こんな配列になっていることがよくあります。

```php:配列1
$arr1 = [
  ['column' => 'foo'],
  ['column' => 'bar'],
  ['column' => 'baz']
];
```

このまま使うには明らかに不便ですし、「ただの配列にしたい」ということはよくあるかと思います。普通に書けば`foreach`で回してどうのこうのとなるかと思いますが、実は1行で片付きます。

```php:シンプルに変換
$simple_arr1 = array_map('reset', $arr1);
```

[`array_map`](http://php.net/manual/ja/function.array-map.php)は、配列の各要素に同じ関数を適用する関数なのですが、指定している[`reset`](http://php.net/manual/ja/function.reset.php)はあまり見慣れないかもしれません。説明を読んでもわかりにくいかもしれませんが、返り値としては「配列の先頭の値」を返す関数なので、mapした結果は「先頭要素だけ抜き出した配列」になって、`['foo', 'bar', 'baz']`という、単なる配列ができ上がります。

# その2…ただの配列には興味ありません
逆に、複数項目をDBから取ってきても、返り値はたいてい単なる配列となっています。

```php:配列2
$arr2 = [
  ['id' => '1', 'family' => 'Suzumiya', 'name' => 'Haruhi'],
  ['id' => '2', 'family' => 'Nagato',   'name' => 'Yuki'],
  ['id' => '3', 'family' => 'Asahina',  'name' => 'Mikuru'],
  ['id' => '4', 'family' => 'Koizumi',  'name' => 'Itsuki'],
];
```

特に、キーが1から連続するようなマスターをこのような形で取ってくると、「1個ずれたまま参照してしまって、最後のをアクセスしようとしない限り気づかない」というような、複雑なバグすら起こしかねませんので、使いやすいように`id`をキーにした連想配列にしておきたいものです。

PHP 5.5からは、このような場合に便利な[`array_column`](http://php.net/manual/en/function.array-column.php)関数が登場しています。

```php:連想配列に変換
$assoc_arr2 = array_column($arr2, NULL, 'id');
```

なお、その1のほうも`array_column`で、`$simple_arr1 = array_map($arr1, 'column');`のように書けます。
Citibank APIについて知ろう on Bluemix

##なぜCitibank？
金融xITの領域の大手で先駆けて自社APIを使ったハッカソンをおこなったのがCitibankです。
ハッカソンにはベンチャー企業が多く参加しているようです。
クラウドx基幹系システムのAPIというハイブリッドが、まさに**Fintech**の時代ですね。
http://itpro.nikkeibp.co.jp/atclact/activesp/14/072200061/

##Bluemixとはどんな関係？
IBMはハッカソンのプラットフォームとして、Bluemixを提供しています。
Strategic Sponsorという立場ですね。なるほど。
こちらが現在開催中ハッカソンのCiti Mobile Challenge Asia Pacific(APAC 2015)のサイトです。
http://www.citimobilechallenge.com/
今日のAM11時現在のカウントダウンがのっていますね。
現在開催中のハッカソン優勝者がな、な、なんと今日の24時に発表されるようです！
どんなアプリが出てくるか、これまた楽しみですね！
![スクリーンショット 2015-12-15 10.59.48.png](https://qiita-image-store.s3.amazonaws.com/0/101361/50700c9a-1461-6204-9156-73815f6e08c3.png)


##CitibankのAPIは使用可能？
現在のハッカソンプログラムに参加している人のみ使用可能なようです。
登録期間が終わってしまったので、現在はAPI keyの発行ができません。
逆に言えば、登録すれば使える、のですが、ハッカソン登録には料金がかかるようです。

##CitibankにはどんなAPIがある？
個人・法人の口座基本情報、株式売買、売上分析などができるようになっています。
API Keyがあれば、ここからAPIを試すことができます。
http://citimobilechallenge-api-docs.anypresenceapp.com/#!/Revenue_Analytics_and_Client_Relationship_Management/getCapitalContact

- Retail Banking
- Corporate Payments
- Capital Markets Trading
- Revenue Analytics and Client Relationship Management
- Prepaid Cards 

##実際に動くものはある？

IBMがサンプルアプリとして公開している、下記の２つがあります。
使ってみると、どちらもすでに「Could not contact Citi API」と出ていて応答していませんが、Fintechがどんなものかは体感できると思います。

- Payrewards ( http://payrewardslive.mybluemix.net/ )
- Payfriend ( http://payfriendlive.mybluemix.net/ )

PayrewardsはBluemixのGamificationのAPIを使ったWebアプリです。
これなら初心者でも楽しく運用できそうですね。
<img width="1278" alt="スクリーンショット 2015-12-15 22.15.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/101361/b9a3f798-bdce-c9c4-2159-7384b931cd19.png">


Payfriendは、ワンクリックで友達に送金できるようになっています。
Watson APIのPersonal Insightsで友達の信用度を評価していますね。
<img width="718" alt="スクリーンショット 2015-12-15 22.17.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/101361/7837388e-7aa5-7c56-e332-95c8b2f2b673.png">


##まとめ
アメリカはカード文化なので、こういう浸透ははやいと思われます。
日本でもLinePayを使えば、ランチの代金をモバイルで割り勘することが、現時点ですでに可能です。
ただ全員が使わないと使えないのが現状です。
世界中の人がそうやってお金をやりとりするようになると思うとわくわくしてきますね！
この記事をみて、日本の銀行でも同じことができそうだなと思ったそこのアナタ。
来年のキーワードはFintechかもしれませんね。

##参考資料は？
こちら、IBM USのBluemix developerworksのサイトです。
さすがUSですね。日本にもなかなか入ってこない最新情報が満載です。
これを機にフォローしたいと思います。
https://developer.ibm.com/bluemix/2015/09/11/citi-mobile-challenge-and-bluemix/
lsを間違えてdlと入力してしまったときに、D言語くんが通り過ぎるコマンド

#概要

ls コマンドをつい dl って打ち間違えちゃうことありますよね？
そういった時にD言語くんが注意してくれる癒しコマンドを作りました。

いわゆる sl コマンドのD言語くん版です。
[sl (UNIX) - ウィキペディア](https://ja.wikipedia.org/wiki/Sl_(UNIX))

#D言語くんの雄姿

![D言語くんの雄姿](http://nsplus.dojin.com/ueshita/dl_win.gif)

すごいぞかっこいいぞ！

#公開しました

[dl-cmd (Github)](https://github.com/ueshita/dl-cmd)
※D言語製です！！！

#参考URL
- [D言語くんのAAを作ったよ](https://gist.github.com/simdnyan/20e8fa2a2736c315e2c1)
  @simd_nyan さんのD言語くんAAを使わせていただきました。

- [ANSIエスケープコード - コンソール制御 - 碧色工房](http://www.mm2d.net/main/prog/c/console-02.html)
CentOS7での fail2banのインストールと設定方法（with firewalld）

fail2banとは、SSH等の不正アクセス（ログイン失敗）を検知し、一定時間そのIPアドレスからのアクセスをブロックするソフトである。
通常、fail2banは単体では使用せず、ファイアウォールソフト（iptablesやfirewalld）ともに使用する。この記事では、firewalldを使用する。
また、先述したしたようにSSH以外の不正アクセス対策に使用することもできるが、今回の記事ではSSHの設定に限定した。

※この記事は、2015年11月現在の最新版のfail2ban、CentOS(7.1.1503)にもとづいて記述されている。VPSホスティングサービス等によっては初期インストール状態が違うため、下記の手順があてはまらない場合があるかもしれないことをご承知おき願いたい。


#epel-releaseリポジトリをインストールしていない場合、先にインストールする

    # yum install epel-release


#インストール

    # yum install fail2ban fail2ban-systemd firewalld


#設定

設定ファイル "jail.conf" をコピーする

    # cp -p /etc/fail2ban/jail.conf /etc/fail2ban/jail.d/jail.local

コピーした設定ファイル "jail.local" を編集する（vi などで）

    # vi /etc/fail2ban/jail.d/jail.local
　編集例

    [sshd]                              <-コメントを削除
    enabled = true                      <-コメントを削除

    #banaction = iptables-multiport     <-コメント化（存在すれば）
    banaction = firewallcmd-ipset       <-追加

*   *その他、bantime, maxretry などを必要に応じて設定する。*
*   *bantimeを変更する場合、/etc/fail2ban/action.d/firewallcmd-ipset.conf ファイルのbantimeも変更する。*


#OS再起動時にサービスを自動的に起動にする

    # systemctl enable fail2ban
    # systemctl enable firewalld

#サービスを起動する

    # systemctl start firewalld
    # systemctl start fail2ban

#fail2banのstatusを確認する

    # systemctl status fail2ban

 出力例

     fail2ban.service - Fail2Ban Service
        Loaded: loaded (/usr/lib/systemd/system/fail2ban.service; disabled)
        Active: active (running) since Sun 2015-11-29 05:28:54 UTC; 14s ago
          Docs: man:fail2ban(1)
       Process: 2318 ExecStart=/usr/bin/fail2ban-client -x start (code=exited, status=0/SUCCESS)
      Main PID: 2321 (fail2ban-server)
        CGroup: /system.slice/fail2ban.service
                └─2321 /usr/bin/python2 -s /usr/bin/fail2ban-server -s /var/run/fail2ban/fail2ban.sock -p /var/run/fail2ban/fail2ban.pid -x -b
     
     Nov 29 05:28:54 vultr.guest systemd[1]: Starting Fail2Ban Service...
     Nov 29 05:28:54 vultr.guest fail2ban-client[2318]: 2015-11-29 05:28:54,559 fail2ban.server         [2319]: INFO    Starting Fail2ban v0.9.3
     Nov 29 05:28:54 vultr.guest fail2ban-client[2318]: 2015-11-29 05:28:54,559 fail2ban.server         [2319]: INFO    Starting in daemon mode
     Nov 29 05:28:54 vultr.guest systemd[1]: Started Fail2Ban Service.
     


#banされたIPアドレスの確認(1)

    # fail2ban-client status sshd

 出力例

    Status for the jail: sshd
    |- Filter
    |  |- Currently failed: 0
    |  |- Total failed:     23
    |  `- File list:        /var/log/secure
    `- Actions
       |- Currently banned: 2
       |- Total banned:     3
       `- Banned IP list:   299.152.299.137 299.299.15.198

#banされたIPアドレスの確認(2)　※稼働確認にも使用できる

    # ipset --list

 出力例

    Name: fail2ban-sshd
    Type: hash:ip
    Revision: 1
    Header: family inet hashsize 1024 maxelem 65536 timeout 600000
    Size in memory: 21840
    References: 1
    Members:
    299.152.299.137 timeout 473548

*   *全く何も表示されない場合、実質稼働していないので設定等を見直す。*


#fail2banのログの場所

/var/log/fail2ban.log
【Unity】スワイプとピンチでカメラをグリグリ動かせるライブラリを作った


　モバイルファクトリー [Advent Calendar 2015](http://qiita.com/advent-calendar/2015/mobilefactory) 15日目担当の@kazuman519です。

# はじめに
　先日あるハッカソンでゲームを作った際に、特定のオブジェクトをスワイプとピンチでカメラをグリグリ動かして眺めまくれる機能が欲しかったのですが、ぱっと見見当たらなかったので自作しました。
　これがあれば、
「キャラクターの詳細画面でグリグリしてキャラクターを眺めたい！」
「ステージ選択画面でステージをいろいろな角度から客観的に眺めたい！」!

などといった場面で使えるかもなぁと持ったので、簡単に使えるような形にしてgithubに公開しました。
URL : [ObservationCamera](https://github.com/kazuman519/ObservationCamera)

![](https://raw.githubusercontent.com/kazuman519/ObservationCamera/master/587ef580852cb146803fb236890623a1.gif)

　今回は此方の使い方の紹介をしようと思います。

# リポジトリの構成
- 今回のキモとなるスクリプト「ObservationCamera.cs」はObservationCamera/Assets以下にあります
- また、サンプルプロジェクトを用意してあり、ObservationCamera/Assets以下にあるMainScene.unityからunityを起動すれば動作を試すことができます

# 使い方
## 1. ObservationCameraオブジェクトの作成
　まず、ObservationCameraスクリプトを貼り付けるためのオブジェクトと、眺めるオブジェクトを用意します。
スクリプトを貼り付けるオブジェクトの準備として、
Empty Objectを２つ、Camera Objectを１つ作ってください。
　今回の説明ではEmpty Objectの名前は「ObservationCamera」と「CameraFixObject」、
Camera Objectの名前は「Camera」、
眺めるオブジェクトの名前は「TargetObject」といった名前で説明していきます。

　親子関係は以下のようにしてください。

<img width="300" alt="スクリーンショット 2015-12-15 18.13.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/63597/29b13b65-b93c-7cb9-768a-db59cb1ab559.png">

## 2. それぞれのオブジェクトの配置と役割
### ObservationCamera
 - カメラを上下左右に回転させるためのベースとなるオブジェクトになります
 - 「TargetObject」と同じポジションに配置してください

### CameraFixObject
- カメラのポジションとローテーションを固定するオブジェクトになります
- カメラの高さと角度を調整したい場合はこのオブジェクトのポジションとローテーションを触って調整します
- このオブジェクトの子としてカメラを持たせることで、ズーム機能実装時に角度と座標の計算といった面倒なことをする必要がなく、Cameraオブジェクトのz軸の移動のみでズームが出来るようになっています

### Camera
- カメラです
- 基本的にポジションとアングルは全て０にしておいてください

## 3. スクリプトの設定・プロパティの役割
　後は、上の作業で作成した「ObservationCameraObject」にObservationCameraObjectスクリプトを貼り付けます。
貼り付けると以下のようなプロパティが弄れるようになります。

<img width="277" alt="スクリーンショット 2015-12-15 20.26.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/63597/eb412b9c-f398-8e90-25d8-31b5d421ce4f.png">


#### 各プロパティの役割
- Camera
    - オブジェクトを眺めるためのカメラです
- isAutoRotate
    - 最初に自動で回転させておくかのフラグです
- MinCameraAngleX
    - カメラの最小角度です
- MaxCameraAngleX
    - カメラの最大角度です
- SwipeTurnSpeed
    - スワイプで回転するときの回転スピードです
- PinchZoomSpeed
    - ピンチするときのズームスピードです
- AutoRotateSpeed
    - 自動で回転させるときの回転スピードです

以上の設定ができれば動かせるようになっていると思います。
※注意点として、ピンチによるズームインズームアウトはiOS/Android端末でビルドしないと確認できないのが少し不便です。

突貫でgithubにあげたものなので、まだドキュメントなど全然整っていないですが、
その辺りは今後整備していこうかと思います。


明日は@mattak@githubさんです。
kotlinの話らしいので楽しみです！
GStreamer 1.6.2 リリース！


昨日('15/12/14)に GStreamer 1.6.2 がリリースされました！
最終桁が1つ上がっただけなので、もちろんメインは bugfix のリリースです。

リリースノート: http://gstreamer.freedesktop.org/releases/1.6/

そんな中、気になったアップデートをいくつかご紹介

### ◆ iOS 上で OpenGL のパフォーマンスが大幅に改善されました

### ◆ gst-libav の ffmpeg が 2.8.3. にアップデートされました

### ◆ Android 6.0 以上で発生していたライブラリ読み込みに失敗する問題が修正されました

### ◆ Windows で使用される Direct3D Sink のウィンドウを最小化するとクラッシュする問題が修正されました

### ◆ x264enc のビットレート上限が引き上げられました (100Mbps から 2Gbps に)


などなど...
私にとっては意外と身近なものが修正されていました :)

他の bugfix が気になる人は [Bugzilla](https://bugzilla.gnome.org/buglist.cgi?bug_status=RESOLVED&bug_status=VERIFIED&limit=0&list_id=83309&order=bug_id&product=GStreamer&resolution=FIXED&target_milestone=1.6.2) まで

<br>

---

余談ですが、私は GStreamer 1.4 (?) くらいのタイミングから勉強し始めた、いわゆるアマちゃんということもあり、今回初めてリリース直後にリリースノートを読みました。
 
リリースノート読むのってなかなか面白いもんですね♪

また、リリースにWindows, Android, iOS...と、複数のOSが出てきて、「やっぱ cross-platform multimedia framework なんだなぁ」と改めて思い知らされました。そして、それぞれが継続的にメンテナンスされていというすごさも同時に :)

オープンソースの開発でパッチは投げるのは「道端にゴミが落ちていたから拾う感じ」と言いますが、自分はまだ「あ、ゴミだわ。」という経験が無いので GStreamer の道を歩く頻度が少ないのかもしれません...
springの使い方



基本的に、binファイルにspringを読みこむようなコードが記述されているので、binディレクトリから実行します。

- bin/rails : rails s / rails c / rails g などのコマンドが速くなる。
- bin/rake : rake系のコマンドが速くなる。
- bundle exec bin/rspec : rspecが速くなる。(prereload以外に時間がかかっているのでそこまで速くなったと感じない)
- bundle exec guard : guard specでも速くなる。


- spring status ：　springサーバーの状態を確認
- spring stop : springサーバーを停止(これでバグが消える場合がある)

※ bundle exec付けなくても良いケースはあるかもしれない。
【Rails】guardのwarning　




```
$ guard
[1] guard(main)> 21:39:37 - WARN - Guardfile changed -- _guard-core will exit.
> [#]

21:39:37 - INFO - Bye bye...
21:39:38 - INFO - Guard here! It looks like your project has a Gemfile, yet you are running
> [#] `guard` outside of Bundler. If this is your intent, feel free to ignore this
> [#] message. Otherwise, consider using `bundle exec guard` to ensure your
> [#] dependencies are loaded correctly.
> [#] (You can run `guard` with --no-bundler-warning to get rid of this message.)
/Users/Shige/.rbenv/versions/2.2.3/lib/ruby/2.2.0/open3.rb:193: warning: Insecure world writable dir /Users/Shige/.rbenv/versions in PATH, mode 040777
WARN: Unresolved specs during Gem::Specification.reset:
      rb-fsevent (>= 0.9.3)
      ffi (>= 0.5.0)
WARN: Clearing out unresolved specs.
Please report a bug if this causes problems.
```



bundle exec をつけたら消えた。。
libncursesがあるのにpip install readlineで怒られる

<!--
trivialだった

環境はCentOS6です。Debian/Ubuntuでも大体一緒だと思います。

```bash:
$ pip install readline
---略---
/usr/bin/ld: cannot find -lncurses
---略---
```

と怒られたのに

```bash
$ locate libncurses
/lib64/libncurses.so.5
/lib64/libncurses.so.5.7
/lib64/libncursesw.so.5
/lib64/libncursesw.so.5.7
```

となった。

# 原因

libncurses.soがないとldはライブラリを見つけられないっぽい。libncurses.so.5はダメ。
一方ld-linux.soやlibdlのdlopenはバージョン番号も含めたもので探しているので、libncurses.so.5さえあればOK
[参考](http://archive.linux.or.jp/JF/JFdocs/Program-Library-HOWTO/shared-libraries.html)

# 対策

rootがあればdevelのパッケージを入れるのが簡単です。
なければ

```bash
$ mkdir /tmp/test
$ ln -s /lib64/libncurses.so.5 libncurses.so
$ LDFLAGS=-L/tmp/test pip install readline
```

# 補足

develのパッケージがないのでヘッダはないんですが、なぜかコンパイルできています。readlineがヘッダを持ってるんでしょうか。
ヘッダが欲しければ[この前の投稿](http://qiita.com/__cooper/items/27f2b3f6ca5abaf723ec)のように、ホームディレクトリ以下になんか適当に解凍すればOKです。
rootがなくても大体なんとかなるもんですね。
Mroongaを使ったシステム構成の例

この記事は[Groonga Advent Calendar 2015](http://qiita.com/advent-calendar/2015/groonga)の15日目の記事です。
前の記事は、[naoaさん](http://qiita.com/naoa)の[Mroonga5.10ではノーマライザーをオプションで指定すると全文検索クエリ以外では利用されない](http://qiita.com/naoa/items/cf8b5b8e17806af3aae3)でした。

私事ですが、気づけば、Mroongaを使い始めてから2年が経っていました。
その間、Groongaそのものについての技術情報は色んな所で語られているものの、Groongaを使ったシステムの構成や運用方法のベストプラクティスについては、ネット上であんまり情報が共有されてないなぁ、と思っていました。

なので、今日は、自社で運用している小規模な全文検索システムの構成を書いてみようと思います。
おそらく、(なんちゃって)冗長構成で運用している中では最小構成だと思うので、サービスを小さく作る際の参考になれば幸いです。

# 前提
- 全文検索を提供するのに用いています。
- 業務システム内の一機能です。
    - 夜中に使う人が少ない。
    - ユーザー数が少ない。
- マスタ情報の更新頻度が低く、日次で更新しておけばOK。
- データ量はそこそこ(数千万件)。

# システム構成

ざっくりこんな構成で動いています。

<img width="543" alt="システム構成" src="https://qiita-image-store.s3.amazonaws.com/0/23515/3fa1cb3e-6c07-80d4-1806-d6fba50efb21.png">


(各インスタンスの台数は適当です)

見ての通り、とてもローテクですが、小規模システムなんてこんなもんですよね？

ポイントは、以下の２点です。

- 全文検索インスタンスは複数台構成となっており、WEB/APインスタンスからのアクセスはRoute53を使ったDNSラウンドロビンとしています。
    - 別に普通のLBでも問題ないのですが、HealthCheck付きであることは運用上とても重要です(後述)。
- 全文検索インスタンスにはマスターデータは持たせておらず、必要に応じて、マスター(=DBインスタンス)からデータを洗い替えて使っています。
    - これは運用当初、Mroongaがたまに謎のハングアップを起こしてデータを破壊したからです(と言っても、ここ1年以上は起きていませんが)。 
    - また、MySQLのレプリケーションを使っていないのは(以下同文
    - 個人的に、 **Mroongaをデータ保管用として信用しない**のは、使う上でのコツだと思います。

# データ更新について
システム構成もローテクなら、データの更新もとてもローテクなやり方をしています。

実は全文検索インスタンスではApacheを立てていて、Route53からはHTTPでHealthCheckをしています。
それを利用して、1台ずつ時間をずらして以下の作業を行っています。

1. cronで起動される。
2. DBインスタンスから事前に生成されたCSVデータを持ってくる。
3. 自分のApacheを止める(ラウンドロビンから外れる)。
4. 少し待つ。
5. SQLのTRUNCATE/LOADコマンドでデータを更新。
6. Apacheを立ち上げる(ラウンドロビンに戻ってくる)。

一応、エラーか何かでデータが更新出来なかったインスタンスが複数いる場合は、アラートメールが送られて、それを検知した人が全台がエラーで死ぬ前にcronを止めて耐えるという運用になっていますが、幸い、今のところ発動した事はないです。

# 拡張について

さて、ここまでMroongaを使った「なんちゃって冗長構成」のシステムを紹介してきました。
最後に、今後、このシステムが大きくなっていく際の拡張方針について記載しておきます。

- 全文検索インスタンスをAutoScalingにする。1日1回生まれ変わる運用。
    - [MroongaのDockerイメージ](http://tech.gmo-media.jp/post/134296771997/start-to-maintain-mroonga-docker-image)もありますしね。
    - 後、死活監視をもうちょっとまともに。
- 現在はマスタデータをCSVファイルで配布しているが、Mroonga配下の*.grnファイルを置き換えるだけでいいらしいという噂が…
    - これが事実であれば、DBインスタンスでgrnファイルを作って配布すれば更新がラクチンに。
        - 現在は`LOAD DATA`にそれなりに時間がかかっているため、これを短縮して、別のインスタンスと更新タイミングが被る可能性を下げたい。

このシステムもいつかその規模まで育てばいいなぁと願いつつ、この記事を結びます。
C#でVerilog生成する妄想

#HDLを書くのは面倒
HDL界の二大巨頭といえばVerilog-HDLとVHDLであるが、
2つとも書くのが面倒である。
面倒である。[^1]
でも使わないと回路書けない。

#世の中はどうしているか
<S>諦める</S>
大きく二通りあって

- ある言語で書かれたコードをVerilog,VHDLに変換する。([Synthesijer](http://synthesijer.github.io/web/)等)
- ある言語の内部DSLとしてHDLを提供し、[^2]それをVerilog,VHDLに変換する。[^3]([MyHDL](http://www.myhdl.org/)等)

HDL知識0の人が使うならともかく、
HDL書ける人がHDLマンドクセ('A`)となって使うなら
回路レベルの細かいことを指定しやすい後者で全然問題ないんじゃないか。

#なぜC# 
(C#と言うかVS2015だが)

- Analyzerを使えばポート接続忘れなどのつまらないミスをコーディング時に検出できそう。使ったことないけど。
- Verilogコード変換もT4テンプレートで楽にできそう。使ったことないけど。
- HDLとRxはたいへん似ているので、信号をIObservableでシミュレーションすることもできる。はず。
- そして大正義IntelliSense。

#で、成果物はあるのかね？
- 正直そんなに困るほど複雑なVerilogコード組まないから妄想を書きましたすみません。
- 一応Verilogの基本的な演算子をRxのオペレーターで表現できそうなことは確かめた。
- 「ぼくのかんがえたさいきょうのHDL」は一度学習目的(言い訳)で作ってみたい。

---

[^1]: 構造体という概念のないVerilog、とにかく長ったらしい記述になるVHDL、など。
[^2]: Verilog/VHDLのASTを別の言語で表現できるようにし、更にその生成をラップする。
[^3]: VHDLよりVerilogのほうがよくサポートされている気がする。
CoffeeScriptでプライベートなクラス変数を定義する方法


※ 今回のやり方は、インスタンス変数ではなくクラス変数での話です。複数のインスタンスで、1つのクラス変数が共有されてしまいます。インスタンス変数をプライベートにする方法はないようです。
@kaminalyさん、ありがとうございます。

### CoffeeScriptのプライベート変数は、コロンではなくイコールで

下記は、人間に自己紹介させるクラスです。`_name`はプライベート変数にしてあります。CoffeeScriptでは、プライベート変数はクラス定義の直下に書きます。プラベートメソッドの場合は、変数の値の代わりに関数を指定すればいいです。とにかくプライベートの場合は、コロンではなくイコールを使って定義しましょう。class内で、コロンを使うと、メソッドになってしまいます。プライベートメソッドの場合は、イコールを使うところに注意です。

```coffeescript
class Human
  _name = ''
  constructor: (name) ->
    _name = name
  say: ->
    console.log("I'm #{_name}")

takeshi = new Human("takeshi")
takeshi.say() # I'm takeshi
console.log(takeshi._name) # undefined
```

### CoffeeScriptでは、変数宣言ができない

CoffeeScriptには、`var`がないので変数の宣言のみを記述することができません。なので、今回は初期値として`_name`には空文字を入れています。空文字も嫌な人は、`undefined`を初期値として代入してあげればいいです。

### JavaScriptでは、クロージャでプライベート変数を作る

下記は、上記のcoffeeファイルを、コンパイルして整形したjsファイルです。Humanという変数には、無名関数の中によって定義されたHuman関数が戻り値として代入されています。JavaScriptでクラスを擬似的に表現するのに、関数を使います。

```js
// Generated by CoffeeScript 1.10.0
(function() {
  var Human, takeshi;

  Human = (function() {
    var _name;

    _name = '';

    function Human(name) {
      _name = name;
    }

    Human.prototype.say = function() {
      return console.log("I'm " + _name);
    };

    return Human;

  })();

  takeshi = new Human("takeshi");

  takeshi.say();

  console.log(takeshi._name);

}).call(this);
```

このHuman関数はコンストラクタになります。この関数の中で参照している`_name`変数は、Human関数の外側で定義したものです。このように自分の関数定義より、外側のコンテキストから変数を参照すると、内側の関数を実行しても、変更した内容が保持されます。これがクロージャです。

### thisでインスタンスとバインドしないから、プライベート変数になる

もし、Human関数のコンストラクタで`_name`ではなく、`this._name`としてしていたら、この`this`はHuman関数によって作成されたインスタンスを指します。このように`this`のプロパティとして変数を紐付けることをバインドと言います。

Human関数で生成されたインスタンスを通してアクセスできるのは、このように`this`でバインドされたものです。`_name`は`this`でインスタンスにくっつけてたりせず、全然関係ないところで定義されたものを使っています。だから、Humanクラスのインスタンスを通してアクセスすることが出来ないのです。結果として、プライベート変数になります。
Macで容量の大きなフォルダをduコマンドで確認する

![](https://upload.wikimedia.org/wikipedia/commons/thumb/f/fa/Apple_logo_black.svg/170px-Apple_logo_black.svg.png)

##duコマンドを使用してMacの5GB以上のフォルダを確認
[ハードディスクの空き容量が極端に少なくなる場合の対処方法](https://discussionsjapan.apple.com/docs/DOC-1081)

```shell-session
sudo du -g -x -d 5 / | awk '$1 >= 5{print}'
```

>ルートから5階層下までのフォルダの容量を確認し、容量が5GB以上のフォルダがリストアップされる (出力結果の数字は各フォルダの容量 (単位：GB))。すべてがリストアップされるのには時間がかかるので、プロンプト (例：username-no-macbook:~ username$) が出て次のコマンドが入力できる状態になるまで待つこと。
＃最後にリストアップされるフォルダ名が / のみの項目はファイル容量の合計値なので無視してよい


##duコマンド
ディスク容量を調べるためのコマンド

##duコマンドのオプション
<dl>
<dt>-x</dt>
<dd>別のファイルシステムのディレクトリは除外する</dd>
<dt>-b</dt>
<dd>B(バイト)単位で表示する</dd>
<dt>-k</dt>
<dd>KB単位で表示する</dd>
<dt>-m</dt>
<dd>MB単位で表示する</dd>
<dt>-g</dt>
<dd>GB単位で表示する</dd>
<dt>-h</dt>
<dd>大きさに応じてMB単位だったり、KB単位だったり、人間にとって読みやすい単位で表示する</dd>
<dt>-s</dt>
<dd>サブディレクトリをたどってそれぞれを表示するのではなく、引数に与えられた ディレクトリの容量合計のみを表示する</dd>
<dt>-c</dt>
<dd>トータルの容量も最後に表示する</dd>
<dt>-d</dt>
<dd>ディレクトリのすべてのファイルとディレクトリのエントリを表示する</dd>
</dl>

##awkコマンド
テキストを1行ずつ読み込み、指定されたパターンに一致した場合、対応する処理を実行して、結果を出力する
railsの複合ユニーク制約をshoulda_matchersでテストする


Railsのユニーク制約を[shoulda-matchers](https://github.com/thoughtbot/shoulda-matchers)を使ってテストしてみました。結果として、このマッチャーは複数カラムをまたいだ制約の時は使わない方がいい気がしました。1つのカラムでのユニーク制約も、複数カラムのユニーク制約も同じ扱いになっているようです。

ちなみに、`undefined method`と表示される場合はshoulda-matchersのバージョンを2.8に落とすと直ります。3.0の不具合みたいです。

```ruby
# 【環境】
# ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-darwin14]
# Rails 4.2.3
# rspec 3.3.2
# shoulda-matchers 2.8.0


# db/schema.rb
ActiveRecord::Schema.define(version: 20151012132542) do

  create_table "people", force: :cascade do |t|
    t.string   "first_name"
    t.string   "last_name"
    t.string   "sex"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

  add_index "people", ["first_name", "last_name", "sex"], name: "index_people_on_first_name_and_last_name_and_sex", unique: true

end


# app/model/person.rb
class Person < ActiveRecord::Base
  # 下記3つ、どの書き方でもバリデートは成功。
  # 今回は、一番上を使用してテストを書き進めていきます。
  validates :first_name, uniqueness: { scope: [:last_name, :sex] }
  #validates :last_name, uniqueness: { scope: [:first_name, :sex] }
  #validates :sex, uniqueness: { scope: [:first_name, :last_name] }

  # scopeに渡すカラムが1つの場合は配列にはしません
  #validates :first_name, uniqueness: { scope: :last_name }
end


# spec/models/person_spec.rb
require 'rails_helper'
RSpec.describe Person, type: :model do
  it { is_expected.to validate_uniqueness_of(:first_name) } # true
  it { is_expected.to validate_uniqueness_of(:first_name).scoped_to(:last_name) } # true
  it { is_expected.to validate_uniqueness_of(:first_name).scoped_to(:sex) } # true
  it { is_expected.to validate_uniqueness_of(:first_name).scoped_to(:last_name, :sex) } # true

  # 下記のようなエラーがでる
  # Expected errors to include "has already been taken" when sex is set to "a", got no errors
  it { is_expected.to validate_uniqueness_of(:last_name) } # false
  it { is_expected.to validate_uniqueness_of(:last_name).scoped_to(:first_name, :sex) } # false
  it { is_expected.to validate_uniqueness_of(:sex) } # false
end
```
rspecでundefined method validate_presence_ofとエラーが出る


rspecで`undefined method validate_presence_of`というエラーがでました。not null制約のために`validate_presence_of`を使ったのですが、こんなメソッドないと言っています。他のプロジェクトでは使えていたので、比較してみるとバージョンに問題がありました。

エラーが出てた方の`shoulda-matchers`というgemが`3.0.0`だったのですが、使えてた方は`2.8.0`でした。なのでバージョンを`2.8.0`に落としたところ無事テストが完了しました。
ghqで管理しているリポジトリを検索して開けるAtomプラグインDouglasが便利

これまでAtomでのプロジェクト管理には [project-manager](https://atom.io/packages/project-manager) を使っていましたが、ghqで管理しているリポジトリを検索して開けるAtomプラグイン [Douglas](https://atom.io/packages/douglas) がより便利そうだったのと、元々Gitリポジトリは全部ghq管理下だったので、project-managerから移行してみました。

Douglasを起動するには、`⌘ + shift + P`で Command Palette を開き `Douglas: Toggle` を選びます。

![Screen Shot 2015-12-15 at 20.07.02.png](https://qiita-image-store.s3.amazonaws.com/0/19622/d56e1dc6-f34e-2a93-a199-2eef0a9ad8d3.png)

カスタムした`ghq root`もちゃんと見ているようです。

# flex-tool-barとの組み合わせ

更に、 [flex-tool-bar](https://atom.io/packages/flex-tool-bar) にショートカットを登録して、ボタン一発でDouglasを開けるようにしました。

![Screen Shot 2015-12-15 at 20.15.55.png](https://qiita-image-store.s3.amazonaws.com/0/19622/0a8f759c-237d-66fd-1d99-228b85bb7eff.png)
gemsetからvendor/bundleにgemを移したら、rspecコマンドがつかえなくなった


`vendor/bundle`に`bundle insatll`すればrbenbのgemsetを使う必要がなくなったので、gemsetを削除して切り替えました。すると`bin/rspec`が使えなくなりました。`bin/rspec`がrspecの実行ファイルなので、これを自動作成する時の読み込みパスがgemsetのどこかになっていたのかと思い、次のコマンドで再インストール。

`bundle binstubs rspec-core --force`

無事使えるようになりました。
OLYMPUS AIRのRAWファイルをMacに認識させる


[OLYMPUS AIR A01](http://olympus-imaging.jp/product/opc/a01/)で撮影したRAWファイル(拡張子は.ORF)は、OS X El Capitanをもってしても未だOS標準ではサポートされておらず、Olympus Viewer 3のようなアプリを使わないと表示できません。オリンパスのカメラでも、スペック的に似たような他の機種はすでにOSでサポートされているようなので、これってどうにかならないのか?と思ってゴニョゴニョしたらあっさり認識したっぽいので、まとめておきます。

## 手順

### EXIFタグを操作できるツールをインストールします。

自分の場合は、MacPortsで`exiv2`をインストールしました。

```bash
$ sudo port install exiv2
```

依存関係の都合、他にいくつかのパッケージがインストールされるので、やや時間がかかります。

### 認識させたいRAWファイルをMacにコピーします。

Finderとかターミナルのコマンドで、RAWファイル(拡張子は.ORF)をカメラのSDカードからMacへコピーします。間違って書き壊してしまうかもしれないので、安心できるまではオリジナルのファイルを残しておいた方が吉です。

### RAWファイルの中の属性を確認します。

ひとまず、OLYMPUS AIR A01で撮影したRAWファイルの中身をちょっと覗いてみましょう。

```bash
$ exiv2 -pa RAWファイル
```

```
Exif.Image.ImageWidth                        Long        1  4640
Exif.Image.ImageLength                       Long        1  3472
Exif.Image.BitsPerSample                     Short       1  16
Exif.Image.Compression                       Short       1  Uncompressed
Exif.Image.PhotometricInterpretation         Short       1  Black Is Zero
Exif.Image.ImageDescription                  Ascii      32  OLYMPUS DIGITAL CAMERA         
Exif.Image.Make                              Ascii      24  OLYMPUS IMAGING CORP.  
Exif.Image.Model                             Ascii      17  AIR-A01         
                                        :
Exif.OlympusEq.EquipmentVersion              Undefined   4  1.00
Exif.OlympusEq.CameraType                    Ascii       6  K0055
Exif.OlympusEq.SerialNumber                  Ascii      32  (秘密)
Exif.OlympusEq.InternalSerialNumber          Ascii      32  (秘密)
Exif.OlympusEq.FocalPlaneDiagonal            Rational    1  2160/100
Exif.OlympusEq.BodyFirmwareVersion           Long        1  4356
Exif.OlympusEq.LensType                      Byte        6  0 0 33 16 0 0
Exif.OlympusEq.LensSerialNumber              Ascii      32  (秘密)
Exif.OlympusEq.LensModel                     Ascii      32  OLYMPUS M.14-42mm F3.5-5.6 EZ
Exif.OlympusEq.LensFirmwareVersion           Long        1  4369
                                        :
Exif.Image.GPSTag                            Long        1  698
Exif.GPSInfo.GPSVersionID                    Byte        4  2.3.0.0
Exif.GPSInfo.GPSStatus                       Ascii       2  Measurement Interoperability
Exif.Image.PrintImageMatching                Undefined 528  (Binary value suppressed)
```

すると、`Exif.OlympusEq.CameraType`の値が`K0055`になっています。他にはどんなのがあるのかな?と思って調べると[ここ](http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Olympus.html#CameraType)に一覧がありました。

### RAWファイルの中の属性を変更します。

RAWファイルの`Exif.OlympusEq.CameraType`を、スペックが似ているカメラの値に書き換えます。ひとまず、OLYMPUS PEN Lite E-PL7を選びました。一覧によると値は`S0046`です。

```bash
$ exiv2 -M "set Exif.OlympusEq.CameraType S0046" RAWファイル
```

これで、カメラタイプを書き換えたRAWファイルは、Finderでのサムネイルやクイックルックで表示できるようになっていると思います。

### 注意するところ。

もし、Finderでのサムネイル表示が変わらない場合はファインダーを再起動します。

```bash
$ killall Finder
```

現像パラメータの扱いがカメラのタイプごとに違うかもしれないので、もしかすると色味とか画像効果とか違う可能性はあります。また、この方法はメーカーでは非サポートなのでよしなにお願いします。

## 総括

* RAWファイルの属性を適切に書き換えるとOSで認識できることもある。
* もちろん、自己責任で。
CS-Cart: AddonにJSやCSSファイルを同梱する

CS-CartでAddonが使うJSファイルを同梱する方法。

## AddonのJS置き場

js/addons/[アドオンID]がアドオン固有のJS置き場になる。

```bash:myaddonにJSファイルを追加する例
mkdir -p js/addons/myaddon
echo 'console.log(1);' > js/addons/myaddon/my.js
```

## AddonのJSを読み込む

テンプレート側で読み込むだけだが、`script`関数が提供されているのでそれを使う。

viewテンプレートなら、mainboxの中で読み込む。

```smarty
{capture name="mainbox"}
  ...
  {script src="js/addons/myaddon/my.js"}
  ...
{/capture}
```

hookテンプレートなら、どこに書いてもいい。

## AddonのCSSファイル置き場

管理画面(backend)は`design/backend/css/addons/[アドオンID]/[ファイル名].css`に配置する。

## AddonのCSSを読み込む

これもJS同様にテンプレートで読み込むが、`style`関数を使う。

```smarty
{style src="addons/myaddon/my-style.css"}
```
変数のスコープとカプセル化の話

```
class User
  attr_accessor :first_name, :last_name
  def initialize(first_name, last_name)
    @first_name = first_name
    @last_name = last_name
  end
end

class NameConverter
  def main
    users << User.new('田中', '次郎')
    users << User.new('鈴木', '花子')
    users << user.new('山田', '太郎'
    results = []
    users.each do |u|
      results << "#{u.first_name} #{u.last_name} さん"
    end
    results
  end
  def sub
    # mainみたいなロジック
  end
  def subsub
    # mainみたいなロジック
  end
end
```

↑みたいなロジックがあった時に↓みたいにリファクタリングされることがある、ちょっと極端な例だけど

```
class User
  attr_accessor :first_name, :last_name
  def initialize(first_name, last_name)
    @first_name = first_name
    @last_name = last_name
  end
end

class CommonConstants
  @@name_suffix = 'さん'
end

class NameConverter
  def convert(first_name, last_name)
    return "#{first_name} #{last_name} #{CommonConstants.name_suffix}"
  end

  def main
    users << User.new('田中', '次郎')
    users << User.new('鈴木', '花子')
    users << user.new('山田', '太郎'
    results = []
    users.each do |u|
      results << convert(u.first_name, u.last_name)
    end
    results
  end
  def sub
    # mainみたいなロジック
  end
  def subsub
    # mainみたいなロジック
  end
end
```

これはやめたほうがいいよねーという話
↓みたいに、他のクラスに必要ない変数とかメソッドは関係あるクラスに閉じ込めてほしい

```
class User
  attr_accessor :first_name, :last_name
  @@name_suffix = 'さん'

  def initialize(first_name, last_name)
    @first_name = first_name
    @last_name = last_name
  end

  def formal_name
    "#{@first_name} #{@last_name} #{@@name_suffix}"
  end
end

class NameConverter
  def main
    users << User.new('田中', '次郎')
    users << User.new('鈴木', '花子')
    users << user.new('山田', '太郎')
    results = []
    users.each do |u|
      results << u.formal_name
    end
    results
  end
  def sub
    # mainみたいなロジック
  end
  def subsub
    # mainみたいなロジック
  end
end
```

この場合NameConverterクラスがUserクラスのプロパティの変換ルールを知ってる必要は全くないし、CommonConstantsみたいな全クラスに晒されるクラスにformal_nameメソッドでしか使わない'さん'を書いておく必要は全くない

'さん'をグローバルな定数にしとけば'さん'が変わった時に、
一斉に変わって素敵！って思うかもしれないけど
こんなにふわっとした名前だと
`"#{CommonConstans.name_suffix}タクロース"`
みたいな使われ方されるかもしれないし、グローバルに一度晒した定数は簡単に変更するのが難しいので、
`CommonConstants.name_suffix2 = 'くん'`
みたいな謎の定数が出来かねない
常にUserクラスのメソッドを通してname_suffixにアクセスするってことにすれば、クラスの利用者がname_suffixを意識する必要がなくなるので、定数をクラスの外に出す必要がない

NameConverter#convertだってNameConverterクラスにある以上`convert('お', 'っ')`みたいな使われてるかもしれないし、ただコードが同じってだけの理由で共通の処理に抜き出してもメンテナンス性は向上しない

重要なのは意味的にまとまりがある単位でメソッドと変数を一つのクラスに閉じ込めて抽象化すること

2番目のコードだとNameConverterクラスは常にconvertのことを気にしないといけなくて、例えばミドルネームに対応してくださいってなった時に、Userクラスにプロパティ増やした上でNameConverterクラスも修正しないといけないけど、3番目のコードだと意味的にまとまりがあるクラスで区切ってあるから、Userクラスだけの修正で済む

複雑な事象に対抗する手段は抽象化なので、出来る限りクラスの抽象度を高めて細かいことを考えなくてもいい作りであってほしいですね！

まとめると
メソッドと変数のスコープは可能な限り狭くしてね
という話です！
twitterで特定の単語が含まれるツイートに最速で「いいね」する方法

Twitterで特定のハッシュタグが付けられていたり、特定の単語が含まれるツイートに対して、**出来るだけ早く「いいね」をする**プログラムを作ってみました。

今回使っているのはtwitterAPIのstreamingAPIというものを使いました。

#使い方
1. twitterでアプリ作成・tokenなどの準備  
参考；https://syncer.jp/twitter-api-matome
2. node.jsをインストール
3. twitterモジュールをインストール

>npm install twitter

https://www.npmjs.com/package/twitter

4.下記の５箇所を修正
- consumer_key
- consumer_secret
- access_token_key
- access_token_secret
- var tag = '検索したいハッシュタグ・単語'
  
5.node ファイル名.js　を実行

#ソース
```js:twitter_fav.js
var twitter = require('twitter');

//変更すべき設定
var client = new twitter({
    consumer_key: 'consumer_key',
    consumer_secret: 'consumer_secret',
    access_token_key: 'access_token_key',
    access_token_secret: 'access_token_secret'
});
var tag = '検索したいハッシュタグ・単語';
//変更すべき点はここまで

client.stream( 'statuses/filter', { track : tag }, function( stream ) {
    stream.on( 'data', function( data ) {
    	var tweetid = data.id_str;
		client.post('favorites/create',{id: tweetid},  function(error, tweet, response){
                      if(error) throw error;
                      console.log(response);
              });
    	});
});
```
[github](https://github.com/takuya-andou/fav_hashtag)にも公開しています。
#実例
このプログラムを使って、#いいねした人全員フォローする　というハッシュタグを監視し続けて、ツイートされた瞬間に「いいね」をするようなことをやってみました。

http://andoo.hatenablog.com/entry/2015/12/14/224128
CS-Cart: Addonでコントローラを追加して管理画面を作る

CS-Cartの自作Addonでコントローラを追加して、管理画面(backend)を追加する方法。


## CS-CartではURLとコントローラがどう対応しているか？

```
http://example.com/admin.php?dispatch=[コントローラ名].[モード名]
```

上のURLは下のコントローラに対応する。

```
app/addons/[アドオンID]/controllers/backend/[コントローラ名].php
```

コントローラ名はグローバルなので、dispatchパラメータにはアドオン名が含まれない。
モード名は、コントローラのファイルで自動定義される`$mode`変数に入ってくるので、ファイル名には出てこない。

例えば、`http://example.com/admin.php?dispatch=my_controller.update`にアクセスしたら、インストールされているアドオンから`my_controller.php`を探してきて実行される。

## コントローラを作ったのに404になるのですが？

コントローラを作っただけでは、CS-Cartは404エラーを返す。これはviewテンプレートがないため。テンプレートを作るとエラーが解消される。

テンプレートのファイル名は

* design/backend/templates/addons/[アドオンID]/views/[コントローラ名]/[モード名].tpl

となる。

```smarty:design/backend/templates/addons/myaddon/views/my_controller/update.tpl
{capture name="mainbox"}
    メインボックス
{/capture}

{capture name="buttons"}
    ボタン
{/capture}

{capture name="sidebar"}
    サイドバー
{/capture}

{include
    file="common/mainbox.tpl"
    title=__("my_addon")
    content=$smarty.capture.mainbox
    buttons=$smarty.capture.buttons
    sidebar=$smarty.capture.sidebar}
```
CS-Cart: 出品者(vendor)に管理画面のコントローラアクセス権限を与える

CS-Cartでは、デフォルトでは出品者(vendor)はAddonのコントローラにアクセスすることができない。アクセスしようとすると、403エラーになる。

アドオンのコントローラに対してアクセス権限を与えるには、パーミッションファイルを設置する必要がある。

例えば、`app/addons/myaddon/controllers/backend/my_controller.php`をアクセス可能にする場合は、次のような設定ファイルを作る。

```php:app/addons/myaddon/schemas/permissions/vendor.post.php
<?php

$schema['controllers']['my_controller'] = [
    'permissions' => true
];

return $schema;

```

なお、権限設定ファイル追加したり更新したときは、レジストリのキャッシュをクリアする必要がある。[CS-Cart: テンプレート・翻訳・Add-onの更新方法 - Qiita](http://qiita.com/suin/items/5a5925c23d582af73a61)
Clojureから非同期的にJavaFXを触る(ための下準備)

Clojureで何かGUIを書きたいなと思うことがあり、今からやるならJavaFXだろうと思い立ったのが発端です。
とても初歩的なことばかりになると思いますが、もしおかしな点などありましたらツッコミ頂けると助かります。

## ClojureでJavaFXを使う (基本形)
一番シンプルな書き方だと、次のようなものになると思います。

```clj
(ns hellofx.core
  (:import (javafx.application Application)
           (javafx.stage Stage))
  (:gen-class
   :main true))

(defn -start
  [this stage]
  (doto stage
    (.setTitle "Hello, JavaFX")
    .show))

(defn -main
  []
  (Application/launch hellofx.core (into-array String [])))
```
これはこれで良いんですが、Stageに対して色々操作をしようと考えた場合はApplicationクラスを継承したナニカに実装を付け加えていく必要があり、個人的にあまりしっくりときませんでした。

## とりあえずApplicationは起動しちゃうけど後から色々手を加えたい

(Application/launch)が何か管理用のオブジェクトでも返してくれれば話は早いのですがそんなこともなく、Windowを閉じるまでそもそも帰ってきてくれません。
なので、別スレッドで起動します。

```clj
(defn start-fx
  []
  (doto (Thread.
           #(Application/launch
             hellofx.core
             (into-array String [])))
    .start))
```

これでGUIを立ち上げた後でも処理を書き続けることができます。
とは言えこれだけだと外から何の操作も出来ないので、どうにかStageをJavaFXの外に持ち出します。

```clj
;; Stageオブジェクトが将来的に入る箱
(def window (promise))
;; start-fxはStageオブジェクトを返すように変更します
(defn start-fx
  []
  (when (not (realized? window))
    (doto (Thread.
             #(Application/launch
               hellofx.core
               (into-array String [])))
      .start))
  @window)
;; startメソッド内でstageをdeliver
(defn -start
  [this stage]
  (deliver window stage)
  (.show stage))
```

こうすることで、起動時はstart-fxを呼びさえすればStageをJavaFXの外に持ち出すことができるようになります。
手元のコードは次のようになりました。

```clj
;; Applicationクラスの継承 (application.clj)
(ns hellofx.application
  (:import (javafx.application Application)
           (javafx.stage Stage))
  (:gen-class
    :extends javafx.application.Application
    :name hellofx.application))

;; 将来的にStageが入る箱
(def window (promise))

;; Applicationの起動をラップし、起動後のStageオブジェクトを持ってくる
(defn start-fx
  []
  (when (not (realized? window))
    (doto (Thread.
           #(Application/launch
             hellofx.application
             (into-array String [])))
      .start))
  @window )

;; 起動時にStageをdeliverする
(defn -start
  [this stage]
  (deliver window stage )
  (.show stage))

;;　実行部分 (core.clj)
(ns hellofx.core
  (:require [hellofx.application :as app])
  (:gen-class
   :main true))

(defn -main
  [& args]
  (let [stage (app/start-fx)]
    (doto stage
      ;; Applicationクラスの外でStageの操作ができた!!
      (.setTitle "Hello, JavaFX")
```

これでApplicationクラスから解き放たれて、Stageを操作することができます。

## まとめ

本当はもう少し深掘りしたいと考えていたのですが、予定外に忙しくなってしまったためここまでになってしまいました。が、ひとまずClojureらしくJavaFXを触るための下準備は出来たのではないかと思います。
REPL上で操作できるようになったのも個人的には嬉しいところです。

もう少し色々できるようになったら、また改めて纏めたいと思います。
PythonでJsonを簡単にシリアライズできるクラスを作成してみた

PythonでJsonを扱う必要があり、組み込みの機能だと
若干扱いにくかったので簡単にPythonでJsonを更に扱いやすくなるような
クラスを作成しました

Pythonをきちんと触ったのは初めてなので若干使い方がおかしかったり、
そもそも既存の機能にあるかもしれません。

# 目標

PythonでJsonを扱う際に
Python、Json間はMapじゃないとできない。
これだと、クラス化するにはクラスごとに記述しなくてはいけなく、
またクラスからJsonを出力するさいもクラスごとに処理を書かなくてはいけない。
これは**とても面倒**である

そのため、Jsonのkeyと変数名から自動でシリアライズして
変数名からJson化してくれるようなクラスを作成する


# ソースコード

今回のクラスはこんな感じになりました。

```py3:JsonAdapter.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys
import json


class JsonAdapter(object):
	# jsonからシリアライズ
	def Serialize(self, argJsonData) :

		jsonData = argJsonData
		if isinstance(argJsonData, basestring ) :
			jsonData = json.loads(argJsonData)

		for key in self.__dict__.keys():
			if isinstance(getattr(self,key), JsonAdapter ) or getattr(self,key) == None :
				valclass = getattr(self,key)
				if valclass == None :
					valclass = getattr(sys.modules["Classes.DataPDO"],key)()

				valclass.Serialize(jsonData[key])
				setattr(self,key, valclass)

			elif isinstance(getattr(self,key), int ) :
				setattr(self,key, int(jsonData[key]))
			else :
				setattr(self,key, jsonData[key])

	# Jsonを出力
	def ToJson(self):
		jsonDict = self.__ToDictionary()
		jsonstring = json.dumps(jsonDict, ensure_ascii=False)
		return jsonstring

	#Mapを作成
	def __ToDictionary(self):
		jsonDict = {}
		for key in self.__dict__.keys():
			if isinstance(getattr(self,key), JsonAdapter ) :
				jsonDict.update({key : getattr(self,key).__ToDictionary()})
			else :
				jsonDict.update({key : getattr(self,key)})
		return jsonDict

```


軽く解説をすると

`def Serialize(self, argJsonData) :`
では、jsonから一旦Dictionaryを作成し、
変数名をkeyとして値を取っています。
またクラスの場合はクラスを生成して、再度シリアライズしています。

`ToJson(self):`
では逆に変数名をkeyとしたDictionaryを作成し、
Json化しています


# 使いかた

サンプルコードは以下になります。

```py3:sample.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import JsonAdapter

class Test(JsonAdapter.JsonAdapter):
    def __init__(self):
        self.num = 0
        self.str = ""
        self.test2 = Test2()

class Test2(JsonAdapter.JsonAdapter):
    def __init__(self):
        self.num = 0
        self.str = ""


if __name__ == "__main__":
    json = """{"test2": {"num": 200, "str": "def"}, "num": 100, "str": "abc"}"""
    test = Test()
    # 初期状態
    print test.ToJson()

    test.Serialize(json)

    #シリアライズした後
    print test.ToJson()

```

```:出力結果
{"test2": {"num": 0, "str": ""}, "num": 0, "str": ""}
{"test2": {"num": 200, "str": "def"}, "num": 100, "str": "abc"}
```

初期状態とシリアライズ後の結果出力しました。
正常にシリアライズができ、また出力も問題ないことが確認できるかと思います。

注意点としてはPDOクラスに継承さえる必要があるのと、
変数名とkey名を統一しなければならない点です。


以上です。
きちんと触って思ったことですが
Pythonって面白いですよね
XcodeをアップデートするとXib・Storyboardを開いただけで差分が出るのをなんとかする


iOSに限った話ではないですが。

![Kobito.T5sDkZ.png](https://qiita-image-store.s3.amazonaws.com/0/7325/be6fe480-eb6b-5bd2-489e-996401ddf410.png "Kobito.T5sDkZ.png")



Interface BuilderファイルにはXcodeのバージョンが含まれているので、アップデートしたXcodeでファイルを開いただけで差分が出てしまうという問題。

プルリクエストにこうした差分だけのファイルが紛れているとレビューのノイズになるので、定期的に全IBファイルを更新・プルリクエスト　みたいな事ができないかなーと調べたところ、Xcode付属の[ibtool(1)](https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/ibtool.1.html)を使えば簡単にできました。

まず特定のIBファイル内のXcodeバージョンを最新にするには下記のようにします。

```
$ xcrun ibtool --upgrade ./Sources/MyView.xib --write ./Sources/MyView.xib
```



実際にXcode6.4で生成したxibをXcode7.1.1のibtoolで更新した結果。ちゃんとツールのバージョン番号が更新されています。

![Kobito.K0XuSU.png](https://qiita-image-store.s3.amazonaws.com/0/7325/62c92df2-ddfc-aa90-8647-1c4419185bf6.png "Kobito.K0XuSU.png")


さらに下記のようにすればプロジェクト内の全IBファイル更新も一発。

```
find ./Sources -name "*.storyboard" -or -name "*.xib"  |xargs -IFILE xcrun ibtool --upgrade FILE --write FILE
```

新しいXcodeが出たタイミングとかで一括更新するようにしておけば良さそうですね。
Sassで連想配列が使えるようになってたので使ってみた。

Sassで連想配列が使えずに泣いたあの日はもういない。
無駄に配列２つ用意したあの日よグッバイ。


ということで、早速サンプルいってみよう。

``` style.scss
$member_color:(
  madoka:pink,
  homura:black,
  sayaka:blue,
  kyoko:red,
  kyube:white
);

@each $name, $color in $member_color {
  .color_#{$name} {
     color: $color;
  }
}
```

コンパイルするとこんな感じで書きだされます。

```style.css
.color_madoka {
  color: pink;
}

.color_homura {
  color: black;
}

.color_sayaka {
  color: blue;
}

.color_kyoko {
  color: red;
}

.color_kyube {
  color: white;
}
```

簡単に解説すると、

``` style.scss
$member_color:(//変数の中身をを括弧で囲めばおｋ
  madoka:pink,
  homura:black,
  sayaka:blue,
  kyoko:red,
  kyube:white
);

@each $name, $color in $member_color {//$nameと$colorはkeyとvalueが順番に入る模様。
  .color_#{$name} {
     color: $color;
  }
}
```

という感じです。
ZeroClipboardで擬似クラスのスタイルを適用させる

## 概要

フロントエンドでクリップボードにテキストをコピーすることができるライブラリ「ZeroClipboard」を使ってると、bindさせるエレメントのstyleで`button:hover`とかが使えない問題が発生した。

よく見たらissueに書いてあった。

https://github.com/zeroclipboard/zeroclipboard/issues/494

## 解決策

擬似クラスではなくクラス名でstyleを定義する。

https://github.com/zeroclipboard/zeroclipboard/blob/master/docs/instructions.md#css-effects

例えば`<button class="hoge">`なら

```
button.hoge.zeroclipboard-is-hover { background-color: #eee; }
```

とかやるとhover時スタイルが適用される。

恐ろしい。

## 所感

ButtonクリックイベントでHTML5 Clipboard APIを叩く方法があればそっちでいいのかもしれない。
【やる夫で学ぶRedisの雰囲気】String型とHash型でクラスの名簿管理


KVSのRedisがRDBとどう違うのか？実際に使っているところを見ながら確認したいと思い、「やる夫で学ぶ」シリーズとして作成してみました。基本ログに一言添えただけです。詳しい説明は載せていません。次の目的に使えるかと思います。

* Redisの雰囲気を掴みたい
* KVSでどんな風にデータを管理するのか知りたい
* 実際に使っているシミュレーションで学びたい
* Redisのサンプルを見たい

実際に下記のサンプルを色々変えて打ってみて、エラーを出したりして各コマンドの意味を掴んでいくと身につくと思います。

```bash
# 〜名簿管理〜
# String型、Hash型を学ぶ


# いきなり担任を務めることになったやる夫
# 名簿が手書きだったのでDBで管理して効率化を図ることにした。
# 使用したDBはKVSのRedis。KeyとValueのみで管理する2カラムだけのRDBのようだ。

# (･ω･)「まずはredisの全てのDBのデータを削除して綺麗にするお」
$ FLUSHALL

$ SET name yamada
$ SET sex man
$ SET class a

$ SET name suzuki
$ SET name
"suzuki"

# ＼(^o^)／「さっき登録したyamadaが上書きされてしまったお！」

$ SET user:1:name yamada
$ SET user:1:sex man
$ SET user:1:class a
$ SET user:2:name suzuki
$ SET user:2:sex woman
$ SET user:2:class b

$ KEYS user:1:*
1) "user:1:class"
2) "user:1:name"
3) "user:1:sex"
$ KEYS user:2:*
1) "user:2:sex"
2) "user:2:class"
3) "user:2:name"

# （・∀・）「これで複数の生徒を管理できるようになったお」

$ KEYS *
1) "user:2:sex"
2) "class"
3) "name"
4) "user:1:class"
5) "user:2:class"
6) "user:2:name"
7) "user:1:name"
8) "sex"
9) "user:1:sex"

#  (｀･ω･´)「余分なキーが入っているから削除するお」

$ DEL class
$ DEL name
$ DEL sex
$ DEL class
(integer) 0

# ....φ(・ω・｀ )「既に存在しないkeyの場合は0が返るのか」

$ KEYS *
1) "user:2:sex"
2) "user:1:class"
3) "user:2:class"
4) "user:2:name"
5) "user:1:name"
6) "user:1:sex"

$ MGET user:1:name user:1:sex user:1:class
1) "yamada"
2) "man"
3) "a"
$ MGET user:2:name user:2:sex user:2:class
1) "suzuki"
2) "woman"
3) "b"

# v(｡･ω･｡)「MGETを使えば一気に複数のkeyを取り出せるのか！これは便利だお！
#          MSETというのもあるらしいから、これで登録するお！」

$ MSET user:3:name hiramatsu user:3:sex man user:3:klass a
$ MGET user:3:name user:3:sex user:3:class
1) "hiramatsu"
2) "man"
3) (nil)

# (；・∀・)「クラスが登録されてないお」

$ KEYS user:3:*
1) "user:3:sex"
2) "user:3:name"
3) "user:3:klass"

$ RENAME user:3:klass user:3:class
$ KEYS user:3:*
1) "user:3:class"
2) "user:3:sex"
3) "user:3:name"

# (ヽ´ω`)「どうやらclassをklassと書いていたようだったお。リネームして直したお」

# ( ・ω・)「今はどれくらいのデータが登録したかお？」
$ DBSIZE
(integer) 9
$ KEYS *
1) "user:2:sex"
2) "user:1:class"
3) "user:2:class"
4) "user:3:class"
5) "user:2:name"
6) "user:3:sex"
7) "user:3:name"
8) "user:1:name"
9) "user:1:sex"

# (ヽ´ω`)「たった9個だお。それでも管理が大変になってきたお」

$ FLUSHDB
$ DBSIZE
(integer) 0

# （　´・ω・｀）「現在のDBだけデータを削除して、やり直すお」

$ HMSET user:1 name yamada sex man class a
$ HMSET user:2 name suzuki sex woman class b
$ HMGET user:1 name sex class
1) "yamada"
2) "man"
3) "a"

# (´∀｀*)「Hash型を使えば入力が楽になったお！1つのkeyで一人を管理できてわかりやすいお♪」

$ KEYS *
1) "user:2"
2) "user:1"
$ DBSIZE
(integer) 2

# (ﾟ∀ﾟ )「データサイズで登録人数がわかるようになったお。これで担当クラスを把握しなくて済むお」

$ HSET user:3 name hiramatsu
(integer) 1
$ HMSET user:3 sex man class a
OK

# ( ・∀・)「 Mをつければ複数のKEYが登録できるのは、String型同じみたいだお。MultiのMかお？」

# (　ﾟΩﾟ) 「複数登録だと、なぜか返り値が数値からOKになっているお」

$ HKEYS user:3
1) "name"
2) "sex"
3) "class"
$ HVALS user:3
1) "hiramatsu"
2) "man"
3) "a"
$ HGETALL user:3
1) "name"
2) "hiramatsu"
3) "sex"
4) "man"
5) "class"
6) "a"

# ( ；∀；)「わざわざkey値を打たなくても、中身を一気に確認できたのかお..」
```
zshrcとzshrc-eの違い


zshで`lsof`や`nestat`コマンドが使えなくなっていたので、調べたら`brew install zsh --enable-etcdir`で直るとのこと。zshを一度消して、再インストールをしたらホームディレクトリに`.zshrc-e`とファイルが出来ていました。

[zsh5.0.5を入れたら、PATHがおかしくなった - くろの雑記帳](http://kurochan-note.hatenablog.jp/entry/2014/01/11/144008)

中身は`.zshrc`と同じっぽかったので、それを`.zshenv`から読み込むように`source ~/.zshrc-e`と記載したのですが、どうも読み込んでいないようです。結果としては`.zshrc-e`を`.zshrc`にリネームして読み込むようにしたら直りました。

下記によると、`.zshrc-e`のeはexampleという意味だったようです。`.zshrc`のサンプルコードだったわけですね。

[osx - What is the difference between .zshrc and .zshrc-e - Super User](http://superuser.com/questions/793732/what-is-the-difference-between-zshrc-and-zshrc-e)
Railsのモデルをループで回してdestoryする時に、関連テーブルのレコードも削除したい


下記のモデルと対応するテーブル、3つずつ作成して実験しました。括弧内はカラムを表しています。

* Post（title）
* Tag（name）
* PostTag（post_id, tag_id)

これでdb/seeds.rbにレコードの追加、削除を記述します。title1という記事につけられたtag2を削除します。これで関連テーブルであるPostTagのレコードは削除されるのでしょうか？

```ruby
# db/seeds.rb
Post.create(title: "title1")
Post.find(1).tags.create(name: "tag1")
Post.find(1).tags.create(name: "tag2")
Post.find(1).tags.create(name: "tag3")

Post.find(1).tags.all.each do |tag|
  if tag.name == "tag2"
    tag.destroy
  end
end
```

`rails db`で確認してみると関連テーブルのレコードは残ったままになっています。

```
sqlite> select * from posts;
1|title1|2015-10-05 05:11:36.390481|2015-10-05 05:11:36.390481
sqlite> select * from tags;
1|tag1|2015-10-05 05:11:36.423221|2015-10-05 05:11:36.423221
3|tag3|2015-10-05 05:11:36.437542|2015-10-05 05:11:36.437542
sqlite> select * from post_tags;
1|1|1|2015-10-05 05:11:36.429950|2015-10-05 05:11:36.429950
2|1|2|2015-10-05 05:11:36.434520|2015-10-05 05:11:36.434520
3|1|3|2015-10-05 05:11:36.439099|2015-10-05 05:11:36.439099
```

for文の一時変数に入れたものでは消えないのでしょうか？いいえ。ちゃんとrailsには機能が備わっています。こういう時に`dependent: :destroy`を使います。

```ruby
# app/model/post.rb
class Post < ActiveRecord::Base
  has_many :post_tags, dependent: :destroy
  has_many :tags, through: :post_tags
end

# app/model/tag.rb
class Tag < ActiveRecord::Base
  has_many :post_tags, dependent: :destroy
  has_many :post, through: :post_tags
end

# app/model/post_tag.rb
class PostTag < ActiveRecord::Base
  belongs_to :post
  belongs_to :tag
end
```

これでpostを削除した時、tagを削除した時に、そのidを持つpost_tagのレコードは削除されます。注意すべきところは、上記の例だとid:11のpostを削除した場合は、そのpostにつけられたtagが残っていてもpost_id:1のpost_tagのレコードは削除されます。tagを削除した場合も同じことが起こります。
Railsのモデルバリデーションとカラム制約のユニークはどう挙動が変わるのか


下記のモデルと対応するテーブル、3つずつ作成して実験しました。括弧内はカラムを表しています。

* Post（title）
* Tag（name）
* PostTag（post_id, tag_id)

db/shema.rbに`add_index :tags, :name, unique: true`を追加して、モデルにバリデーションを追加すると、エラーのスタックトレースが表示されます。

```
Loading development environment (Rails 4.2.3)
irb(main):001:0> Tag.create(name: "tag1")
   (0.1ms)  begin transaction
  SQL (0.7ms)  INSERT INTO "tags" ("name", "created_at", "updated_at") VALUES (?, ?, ?)  [["name", "tag1"], ["created_at", "2015-10-05 04:56:25.110261"], ["updated_at", "2015-10-05 04:56:25.110261"]]
SQLite3::ConstraintException: UNIQUE constraint failed: tags.name: INSERT INTO "tags" ("name", "created_at", "updated_at") VALUES (?, ?, ?)
   (0.1ms)  rollback transaction
ActiveRecord::RecordNotUnique: SQLite3::ConstraintException: UNIQUE constraint failed: tags.name: INSERT INTO "tags" ("name", "created_at", "updated_at") VALUES (?, ?, ?)
    from /Users/mitsuru/.rbenv/versions/2.2.2/gemsets/vainglory/gems/sqlite3-1.3.10/lib/sqlite3/statement.rb:108:in `step'
\# ...省略
commands_tasks.rb:39:in `run_command!'
    from /Users/mitsuru/.rbenv/versions/2.2.2/gemsets/vainglory/gems/railties-4.2.3/lib/rails/commands.rb:17:in `<top (required)>'
    from bin/rails:4:in `require'
    from bin/rails:4:in `<main>'
```

次はsema.rbだけではなく、モデルに`validates :name, uniqueness: true`を加えて試してみます。

```
irb(main):001:0> Tag.create(name: "tag1")
   (0.1ms)  begin transaction
  Tag Exists (0.2ms)  SELECT  1 AS one FROM "tags" WHERE "tags"."name" = 'tag1' LIMIT 1
   (0.1ms)  rollback transaction
=> #<Tag id: nil, name: "tag1", created_at: nil, updated_at: nil>
```

返り値がちゃんとありますね。これでRuby側のプログラムが止まらずに対処できるようになります。
JavaScriptで座標を配列とオブジェクト、どちらで管理した方が処理が早くなるか実験


オブジェクトより配列を使ったほうが、計算が早くなると思いましたが実際は違いました。C言語の時は、プリミティブ値が連続的に配置された集まりだったから配列の走査が速いのかもしれません。JavaScriptだと配列はArrayオブジェクトなので、オブジェクトを増やすぐらいならプロパティを増やしたほうがいいということでした。まさか処理速度に約3倍の差が出るとは思いませんでした。

```coffeescript
###
実験内容
1組の座標を管理するのに、下記のどちらが速いかを実験。
実行環境はpaiza.ioにしました。
1. 各座標を別の配列で管理する
   {x:[10, 23], y:[1, 0]}
2. 1組をオブジェクトでまとめる
   [{x: 10, y: 1}, {x: 23, y: 0}]
###

###
# リファレンス #
Math.random()
0から1未満を返す。1は含みません。
Math.floor(number)
小数点以下を切り捨てます。
###

# 0~99の乱数を生成
getPoint = ->
  Math.floor(Math.random() * 100)

# いくつ座標を格納するか
count = 100000

# x, yを別々で管理する。
# 各配列のインデックスがずれてはいけません。
points = { x: [], y: [] }
console.time('array')
# 座標の格納
for i in [0..count]
  points.x.push(getPoint())
  points.x.push(getPoint())

# 座標の取り出し
for i in [0..count]
  nowX = points.x[i]
  nowY = points.y[i]
console.timeEnd('array')
# => 20ms

points = []
console.time('object')
# 座標の格納
for i in [0..count]
  points.push({ x: getPoint(), y:getPoint() })

# 座標の取り出し
for i in [0..count]
  nowX = points[i].x
  nowY = points[i].y
console.timeEnd('object')
# => 7ms

###
結果
1組の座標はオブジェクトで管理でした方が3倍早かったです。
配列もオブジェクトなので、x, yという2つのArrayオブジェクトができると、
計算負荷が大きくなるみたいです。
###
```