OmniAICreator/Qiita-1.07M huggingface dataset:
Ruby Association Certified Ruby Programmer Gold version 2.1 とってきた！

## 概要
とれました。
<img src="https://qiita-image-store.s3.amazonaws.com/0/19495/ac9f36c8-635b-92db-c6d5-3dc2df00a7a3.png" width="90px">
Ruby Association Certified Ruby Programmer Silver/Goldが version 2.1へと改訂されました。
2014/10/1にから改定されてから時間は少し経ってしまいましたが、受験してきました。
旧versionのSilver/Gold資格を取得していましたが、改訂版がリリースされたので受けてきました！
使い心地がよくてRubyそのものも好きですが、周りにいる開発者の方々の考え方が好きだったりもします。
すでに取得されている方が大勢いて目新しい情報はないかもしれないですが嬉しいので投稿。

## 目的
Rubyのバージョン間差異の把握
得た知識を活用できるようになる

## 受験前にやったこと
* すでに合格している方の情報を参考にする
    * http://qiita.com/ionis_h/items/027e12edd3754a82d0ee
* 公式教科書のオブジェクト指向の部分や『メタプログラミングRuby』の内容をしっかりと理解しておく
    * [Ruby公式資格教科書 Ruby技術者認定試験Silver/Gold対応](http://gihyo.jp/book/2012/978-4-7741-5001-7)
    * [メタプログラミングRuby](http://ascii.asciimw.jp/books/books/detail/978-4-04-868715-7.shtml)
    * 親クラスは誰になるのかなど、継承チェーンをよく理解しておく
* バージョンの差異を確認して、興味をもったところはpryなどで実行して結果を確認しておく
    * http://www.ruby.or.jp/ja/certification/examination/index.data/rubycert.pdf
    * 私はModule#prependとRefinementsに興味が湧いてがちゃがちゃ遊んでました
Ubuntu で kobuki を動かすまでの手順

##1. セットアップを行うバージョン
今回は下記のバージョンを使用します

- Ubuntu : 12.04 (Precise)
- ROS : groovy

##2. ROSのセットアップ
下記を参考にROSをセットアップします。
[http://wiki.ros.org/groovy/Installation/Ubuntu](http://wiki.ros.org/groovy/Installation/Ubuntu)

上記バージョンのUbuntuであれば、特に引っかかることなく行けるかなと思います。

```lang:command
// Setup sources.list
$ sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu precise main" > /etc/apt/sources.list.d/ros-latest.list'

// Set up keys
$ wget http://packages.ros.org/ros.key -O - | sudo apt-key add -

// Installation
$ sudo apt-get update
$ sudo apt-get install ros-groovy-desktop-full

// Initialize rosdep
$ sudo rosdep init
$ rosdep update

// Environment setup
$ echo "source /opt/ros/groovy/setup.bash" >> ~/.bashrc
$ source ~/.bashrc
$ source /opt/ros/groovy/setup.bash

// Getting rosinstall
$ sudo apt-get install python-rosinstall
```

##3. catkinの準備
ROSではcatkinというパッケージ管理ソフトを使って、使用するパッケージを管理しています。

その準備

```lang:command
// ワークスペースの準備
$ source /opt/ros/groovy/setup.bash
$ mkdir -p ~/ros/catkin_ws/src
$ cd ~/ros/catkin_ws/src
$ catkin_init_workspace

$ cd ~/ros/catkin_ws
$ catkin_make
```

develというフォルダが作成されます。
その中のsetup.bashを読み込むようにしておきます。

```lang:command
$ source ~/work/ros/catkin_ws/devel/setup.bash
```

ユーザの.bashrsに下記を追加しておくと楽です

```lang:.bachrc
source /opt/ros/groovy/setup.bash
source /home/ [ユーザ名] /work/ros/catkin_ws/devel/setup.bash
```

##4. TurtleBot用のパッケージ
TurtleBot用のパッケージをざざざっと取得します
apt-getで簡単に習得できます

```lang:command
$ sudo apt-get install ros-groovy-turtlebot
$ sudo apt-get install ros-groovy-turtlebot-apps
$ sudo apt-get install ros-groovy-turtlebot-viz
```

##5. kobuki用のパッケージ
kobuki用のパッケージはgitからソースを取得して、ビルドするのが確実です

```lang:command
$ cd ~/ros/catkin_ws/src
$ git clone -b groovy-devel https://github.com/yujinrobot/kobuki.git
$ cd ~/ros/catkin_ws
$ catkin_make --force-cmake

$ cd ~/ros/catkin_ws
$ catkin_make install
```

また、下記を.bashrsに追加しておきましょう

```lang:.bachrc
source home/ [ユーザ名] /work/ros/catkin_ws/install/setup.bash
```

##6. kobukiドライバ
kobukiを認識するためのドライバをセットアップします
kobuki接続前に行ってください

```lang:command
$ rosrun kobuki_ftdi create_udev_rules
```

この後にkobukiをPCへ接続すると、/dev/kobuki にマウントされます

##7. 動かそう！！
ここまでくると、キーボードでkobukiを動かすことができます！！
起動してみましょう

```lang:command
// 全て別のターミナルで実行してください
$ roscore
$ roslaunch kobuki_node minimal.launch
$ roslaunch kobuki_keyop keyop.launch
```

これで、キーボードを使用して操作できます
カーソルキーで前進、後退、回転
スペースで停止です

また、ドックステーションへの帰還は下記のコマンドを実行

```lang:command
$ roslaunch kobuki_auto_docking minimal.launch
```

ドックステーションへのドッキングは下記コマンド

```lang:command
$ roslaunch kobuki_auto_docking activate.launch
```

なかなか楽しいぞ！！
[メモ][備忘録] ErlangをUbuntuでびるど

```:shell
https://github.com/erlang/otp/archive/OTP-18.0.3.tar.gz
tar xf OTP-18.0.3.tar.gz
mv otp-OTP-18.0.3 $HOME/.anyenv/envs/erlenv/releases/18.0
cd $HOME/.anyenv/envs/erlenv/releases/18.0
export ERL_TOP=`pwd`
```

```:shell
sudo apt-get install g++ libwxgtk2.8-dev libgl1-mesa-dev libglu1-mesa-dev libpng3 libssl-dev autoconf libncurses-dev build-essential unixodbc-dev libxml2-utils
```
```:shell
./otp_build autoconf && ./configure --prefix=$HOME/.anyenv/envs/erlenv/releases/18.0 && make -j 4 && erlenv global 18.0 && erlenv rehash
```
IIJmio のファミリーシェアプランに移行した時の話

# まずはじめに
既にサービスが開始されて期間が立ちますので、通常のお話はより詳しく書かれているサイトが多くあると思います。
私の場合は、ファミリーシェアプランにする時に2年縛りの関係で2台分を同時に移行出来ませんでした。
その場合、店頭では2枚目のSIMに関する手続きは行って頂けないので自分で行う時に不安思ったことを記載しておきます。

# 役に立つ可能性がある対象者
- ファミリーシェアプランを既に利用済みで追加のSIMを発行したい方(どのタイミングでSIMが使えなくなり、次はどれぐらいで使えるのか)
- ファミリーシェアプランを検討しているが、対象端末の2年縛りのタイミングが異なり同時に移行出来ない方

# 1枚目の申し込みについて

- IIJの代理店が近くに出来たため、ショップにてSIMを発行しました。
- 手続きや書類の記載などを含めても1時間程度で完了しました。(MNPの予約番号を取るのに時間がかかったので平日の間に取得したほうが良いかもしれません)

# 追加のSIMの手続きのざっくりとした流れは以下のようになります。

木曜日

- インターネットで追加のSIMを申し込む
- メールが届き、本人確認のため身分証明書などをスマホなどのカメラで撮影して送信する
- 本人確認が2〜3日、SIM到着まで1週間程度という内容のメールが届く。

土曜日

- 本人確認が完了したという内容が届く
- 数時間〜1日以内に現在契約中のSIMが使えなくなる旨の内容が届く

日曜日

- 朝はまだ使えたが、昼には圏外になっていました。
- 新しいSIMが、1〜3日で届くという内容が届く

月曜日

- 不在通知が届いていたので、再配達をお願いして無事回線開通

# 感想
回線が使えなくなって次のSIMが届くまでの時間は私の場合は、約1日間でした。(実質は日曜日の昼から寝るまで、朝起きて会社に行くまでの間だけです)
電話はもちろん使えませんが、WiFi接続でネットは使えるため特に不便とは感じませんでした。
同時に移行出来ない場合はSIM代が必要ですが、店頭で同時に移行する場合は不要のようです。
Go言語のChannelは送信時にもブロックする

# TL;DR

channelからの受信時に処理がブロックするのは有名だけど、送信時にブロックするのは忘れがちだから気を付けましょう、というお話。

# 現象

channelからの受信は完了するまでブロックするというのは有名かと思います。この仕様を利用して同期処理書いたりしますしね。

```go
package main

import "fmt"

func greatFunction(ch chan<- string) {
    // 何かすごい処理
    ch <- "何かすごい処理結果"
}

func main() {
    ch := make(chan string)
    go greatFunction(ch)
    fmt.Println(<-ch) // ここで処理結果が出るまでブロックする
}
```

でも、channelがブロックするのは受信時だけではありません。忘れがちですが送信時にもブロックすることがあります。
その結果、無慈悲なデッドロックに遭遇してしまったコードがこちらです。

```go:server.go
package msqsrv

import "net"

func MsqServer(msq chan<- string) {
    listener, _ := net.Listen("tcp", "localhost:12345")
    conn, _ := listener.Accept()
    buf := make([]byte, 255)
    readLen, _ := conn.Read(buf)
    msq <- string(buf[:readLen])
    conn.Write([]byte("メッセージ受け取ったよ"))
}
```

```go:server_test.go
package msqsrv

import (
	"net"
	"testing"
)

func TestMsqServer(t *testing.T) {
    msq := make(chan string, 10)
    go MsqServer(msq)

    conn, _ := net.Dial("tcp", "localhost:12345")
    conn.Write([]byte("わかめ"))
    buf := make([]byte, 255)
    conn.Read(buf)

    
    if <- msq != "わかめ" {
        t.Error("error!")
    }
}
```

色々と適当ですが、上記はstring型のchannelをメッセージキューと見立てて、受信メッセージをキューに放り込むサーバとそのテストです。サーバは処理終了後にクライアントへ受信完了のメッセージを返します。

そして、残念ながらこのテスト実行時にはデッドロックが発生します。

# 何で？

channelへのデータ送信時にchannelのサイズを超過すると、**超過分のデータがchannelから読み出されるまで送信処理がブロックする**からです。
なお、サイズ指定を省略してchannelをmakeした場合、そのサイズは**0**です。

一方でnetパッケージのConn#Readは相手側でWriteされるまでブロックするため、デッドロックが発生してしまったのですね。

```go
// server.goから抜粋
func MsqServer(msq chan<- string) {
    listener, _ := net.Listen("tcp", "localhost:12345")
    conn, _ := listener.Accept()
    buf := make([]byte, 255)
    readLen, _ := conn.Read(buf)
    msq <- string(buf[:readLen])                // <- ここでブロックしてしまう
    conn.Write([]byte("メッセージ受け取ったよ"))  // <- ここに辿り着けない
}

// server_test.goから抜粋
func TestMsqServer(t *testing.T) {
    msq := make(chan string, 10)
    go MsqServer(msq)

    conn, _ := net.Dial("tcp", "localhost:12345")
    conn.Write([]byte("わかめ"))
    buf := make([]byte, 255)
    conn.Read(buf)     // <- MsgServer関数でWriteされるまでブロックする

    if <- msq != "わかめ" {
        t.Error("error!")
    }
}
```

このデッドロックを回避するにはmsqからの受信処理（テスト関数内のアサーション部分）をRead関数の呼び出しよりも先に持ってくるか、channel生成時に十分なサイズを割り当てます。

先述の例では同時に複数のデータが送受信されることは無いので、以下の様にサイズ1を割り当てればよいでしょう。

```go
msq := make(chan string, 1)
```

チャネル生成時にはサイズにも気を配りましょう、というお話ですね。
（それ以前にロック順にも注意すべきですが・・・）

# 不安

というか、忘れてたの僕だけ？
jekyll 2.5.3をWindows環境にインストール

Win環境でjekyllを動かすまでのメモ

# 参考
基本的には[Run Jekyll on Windows](http://jekyll-windows.juthilo.com/1-ruby-and-devkit/)の手順にしたがっていけば問題なさそう。
「jekyll Windows」でぐぐると、UTF-8対策とか、pygmentsのダウングレードとか記載されていましたが、特に必要ありませんでした。改善されたのかな。

# Rubyのインストール
http://rubyinstaller.org/downloads/

Ruby 2.2.3 (x64)をダウンロードしました。
インストール途中で「Add Ruby executables to your PATH」という環境変数を設定するオプションがあるのでチェックをいれる

# Ruby DevKitのインストール
http://rubyinstaller.org/downloads/

DevKit-mingw64-64-4.7.2-20130224-1432-sfx.exeをダウンロードしました。
解凍して、`C:\RubyDevKit`に設置。

以下のコマンドを実行

```
> cd C:\RubyDevKit
> ruby dk.rb init
> ruby dk.rb install
```

# Pythonのインストール
https://www.python.org/downloads/

Python 2.7.10をダウンロードしました。
インストール後、`C:\Python27`と`C:\Python27\Scripts`にパスを通しておく。

# pygmentsのインストール
https://pip.pypa.io/en/latest/installing/

まずはpipをインストール。
`get-pip.py`をダウンロードし以下のコマンドを実行。

```
> python get-pip.py
```

完了したら、pygmentsをインストール。

```
> python -m pip install Pygments
```

# wdmのインストール

```
> gem install wdm
```

# Jekyllのインストール

```
> gem install jekyll
```

# Jelyllを動かす

EC-CUBE3のドキュメントをgithubからcloneして動かしてみる

```
> git clone https://github.com/EC-CUBE/ec-cube.github.io.git
> cd ec-cube.github.io
> jekyll serve

Configuration file: C:/Users/chihiro_adachi/Documents/ec-cube.github.io/_config.yml
            Source: C:/Users/chihiro_adachi/Documents/ec-cube.github.io
       Destination: C:/Users/chihiro_adachi/Documents/ec-cube.github.io/_site
      Generating...                    done.
 Auto-regeneration: enabled for 'C:/Users/chihiro_adachi/Documents/ec-cube.github.io'
Configuration file: C:/Users/chihiro_adachi/Documents/ec-cube.github.io/_config.yml
    Server address: http://127.0.0.1:4000/
  Server running... press ctrl-c to stop.

```

http://127.0.0.1:4000/

にアクセスし、ページが表示されていれば成功。
終了するときは、ctrl-cで。
Fatal error: Call to undefined function mysql_connect()と言われたのでphp-mysqlを入れたら解決しました。

いままで表示されていたPHPが、Httpdを再起動したところおMySQLに繋がらなくなってしまいました。環境はCentOSです。

# mysql_connect()を呼べないというエラー
ブラウザからなぞのFatalエラーでわからんまん(☝ ՞ਊ ՞)

```
Fatal error: Call to undefined function mysql_connect()
```

ん？MySQLは入っているはずなのにどういうことだろうか(^^ゞ

# phpinfoを確認
困ったときはphpinfoをブラウザから確認します。

```php:phpinfoを確認
phpinfo();
```
するとMySQLの項目がありません。PHPがMySQLを認識してないと出るみたいです。

# インストールされているパッケージを確認
PHPとMySQL関連のパッケージを確認します。

```bash:
yum list installed | grep mysql

mysql.x86_64                              5.6.26-2.el5                 installed
mysql-community-client.x86_64             5.6.26-2.el5                 installed
mysql-community-common.x86_64             5.6.26-2.el5                 installed
mysql-community-devel.i386                5.6.26-2.el5                 installed
mysql-community-devel.x86_64              5.6.26-2.el5                 installed
mysql-community-libs.i386                 5.6.26-2.el5                 installed
mysql-community-libs.x86_64               5.6.26-2.el5                 installed
mysql-community-libs-compat.x86_64        5.6.26-2.el5                 installed
mysql-community-release.noarch            el5-5                        installed
mysql-community-server.x86_64             5.6.26-2.el5                 installed
```
お、php-mysqlがない:(；ﾞﾟ'ωﾟ'):

# php-mysqlをインストール
PHP5.3を使っているのでphp-53-mysqlを入れます。

```
sudo yum install php53-mysql
```
普通はphp-mysqlを入れるといいと思います。

# ブラウザから確認
phpinfoでもMySQLの項目が現れて、エラーが消えました(☝ ՞ਊ ՞)
MagicaVoxelで作ったデータをThree.jsで表示する

## 時代はボクセル！

ゲーム「[Crossy Road](http://www.crossyroad.com/ja/)」とか映画「[ピクセル](http://www.pixel-movie.jp/)」とかあるしね。

## MagicaVoxelってなんだ

[MagicaVoxel](https://ephtracy.github.io/)
![](https://ephtracy.github.io/image/snap0105.png)

@ephtracy さんが開発された、ボクセルアート作成ツールです。

シンプルな操作系とサクサクした動作の軽さが魅力！

## vox.js

というわけで、MagicaVoxelで作ったデータをJSで読み込むライブラリを作りました。

[vox.js](http://daishihmr.github.io/vox.js/)

使い方は簡単。

```html:html
<script src="https://cdn.rawgit.com/daishihmr/vox.js/1.0.1/build/vox.min.js"></script>
```

```js:javascript
// パーサーを作ります
var parser = new vox.Parser();

// *.voxファイルを読み込みます
parser.parse("hoge.vox").then(function(voxelData) { // ←ボクセルデータが取れます

  // データ全体の大きさ
  voxelData.size; // => { x: number, y: number, z: number }

  // ボクセルの配列
  voxelData.voxels; // => [Voxel, Voxel, Voxel, ...]

  // ボクセル一個のデータ
  voxelData.voxels[0]; // => { x: number, y: number, z: number, colorIndex: number }

  // カラーパレット
  voxelData.palette; // => [Color, Color, Color, ...]
  voxelData.palette[0]; // => { r: number, g: number, b: number, a: number }

});
```

## Three.jsで表示

読み込んだボクセルデータをTHREE.Meshに変換する機能も持っています。

```js

// ビルダーを作ります。引数にボクセルデータをわたします
var builder = new vox.MeshBuilder(voxelData);
// THREE.Meshを作ります
var mesh = builder.createMesh();

// THREE.Sceneに追加するなどして使ってください
scene.add(mesh);
```

できたー！
![](https://qiita-image-store.s3.amazonaws.com/0/30568/5aae8bb2-11e3-6114-5ba7-478090cf28f6.png)


## まとめ

MagicaVoxelは本当に簡単に使えるツールです。
絵心というものとは無縁の人生を送ってきた僕でも[これくらいの物](https://github.com/daishihmr/myvox/blob/master/README.md)はチャチャッと作ることが出来ました。
みなさんも是非やってみてください。
ReactNative for AndroidのHello World(セットアップ方法とか)

引用: http://yslibrary.net/2015/09/15/reactnative-for-android-hello-world/

ついにReactNative for Androidが[リリース](https://code.facebook.com/posts/1189117404435352/)されました。
とりあえず簡単にセットアップ方法をご紹介します。

ReactNativeの公式インストラクションは[こちら](http://facebook.github.io/react-native/docs/getting-started.html)。

## 実行環境

### Mac OS X 
今のところOS Xのみサポートされているようです。

### Homebrew
nvm, watchman, flowをインストールするのに利用します。

### Node.js 4.0以上
nvm経由でインストールしましょう。あるいはnodebrew使ってもいいし、直接入れてもよいです。  
Terminalで使えるように環境変数の設定とかも必要です。

### watchman

Node.jsのファイル監視関係のバグを回避するためにもwatchmanを利用するのがいいみたいです。

`brew install watchman`

### flow

flowを使いたい場合はこれもhomebrewからインストールします。

`brew install flow`


### Android SDK

Android向けの開発なのでAndroid SDKが必要です。  
未インストールの方は[こちら](http://facebook.github.io/react-native/docs/android-setup.html)の手順にしたがって設定してください。

※私の環境では実機(Nexus6 5.1.1)で動かすことができなかったので、エミュレータのインストールもしておくといいと思います。
※2015/09/17追記: [実機でのデバッグ方法わかりました](http://yslibrary.net/2015/09/17/reactnative-for-android-debugging-on-real-device/)



## ReactNativeのインストール

下記コマンドを実行します

```
npm install -g react-native-cli
react-native init AwesomeProject
cd AwesomeProject
```

`AwesomeProject` はプロジェクト名なので、なんでもいいです。

## サンプルアプリをAndroid実機で実行する

下記のコマンドを実行すると、エミュレータでアプリが起動します。

`react-native run-android`

## コードに変更を加え、リロードする

適当にコードを書き換えてみましょう。
コードに変更を加えたら、エミュレータ上で `F2` を押すとメニューが表示されます。  
"Reload JS" をクリックすると画面がリロードされ、コードの変更がエミュレータにも反映されます。

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

(クリックするとyoutubeにとびます)



ReactJSでついにAndroidアプリがつくれるようになった…と思うとテンション上がりますね。豊富なnode.jsの資産を使えるので、色々夢が広がります。
TitaniumMobileのようにならないか心配ですが、Webでもある程度市民権を得ている技術ではあるので、それなりに流行るんじゃないかなー、と思ってます。

こちらからは以上です。  
追って簡単なアプリとかも作ってみようと思います。

## 参考リンク
- [React Native for Android: How we built the first cross-platform React Native app | Engineering Blog | Facebook Code](https://code.facebook.com/posts/1189117404435352/)
- [Getting Started – React Native | A framework for building native apps using React](http://facebook.github.io/react-native/docs/getting-started.html)
コマンド実行結果を、改めて1行ずつ扱いたい場合


```bash:a.sh
#! /bin/sh

lines=`mount`

while read line
do
        if [[ $line =~ sda ]]; then
                echo $line
        fi
done <<END
$lines
END

```

何かのコマンドの実行結果を変数に入れて、
1行ずつ、改めて処理したいときの方法とか。

上記サンプルは、mountの実行結果を一旦変数に入れて、
改めて、sdaを含む行を1行ずつ探して、echoで表示しています。

上記サンプルだと、grepでやれ、っていう話ですが（
WebPayで簡単にクレジットカード決済を導入する

クレジットカード決済はなんかめんどくさそう…と思ってたのですが、WebPayがとても簡単だったのでご紹介。
ドキュメントも充実していて、かなり開発者フレンドリーだと思います。

# テスト環境の利用登録をする

[WabPay](https://webpay.jp/)のページより、テスト環境を利用する登録をします。
メールアドレスがあれば登録できます。
登録すると、ユーザー設定ページで、テスト環境用の公開鍵と秘密鍵が確認できます。


# JSのボタンを設置する

[CheckoutHelper](https://webpay.jp/docs/checkout)を使って、カード情報を入力するためのボタンをViewのHTML等に設置します。
ボタンを押してカード情報を入力すると、`webpay-token`という名前のパラメータとしてトークンがPOSTされるボタンです。
`data-partial="true"`を指定すれば、別途自分でsubmitボタンや他の情報を入力するフォームを作成して一緒にPOSTできます。

# 課金等を実行する処理を書く

Ruby、PHP、Java、Python、Node.jsなど各言語の[ライブラリ](https://webpay.jp/docs/libraries)が用意されているので、それを使ってPOSTされた`webpay-token`で課金を実行します。

カード情報を自システムのユーザー情報の1つとして保持しておきたい場合は、Customerを作成して、返ってくる顧客ID(『cus_』で始まる文字列)を保存しておけば、この顧客IDで(カード情報を都度入力せずに)課金を作成することができます。APIでこの顧客IDの顧客情報を取得すれば、カードの種類や有効期限なども表示できるので、カード情報を自システムに保持しなくてすみます。


[APIドキュメント](https://webpay.jp/docs/api)もわかりやすく(日本語だし！)、思った以上に簡単に実装できました。
php+html+css+jsでデスクトップアプリケーションを作った

phpでnode Desktop的なことがやりたかったので作ってみました。
ソースはコチラになります。　https://github.com/Misaki-Shibata/phpDesktopApp

# 説明
- サーバーはPHPのビルドインサーバーを使っています。
- デスクトップアプリケーションとしては、Google Chromeのappモードというのを使います。

# 完成度について
- とりあえず、自分のmacでは動くという状態です。

# サンプル Excel2Json  
[![phpDesktopApp](http://i.ytimg.com/vi/NzyPfdr7WCk/1.jpg)](https://www.youtube.com/watch?v=NzyPfdr7WCk&feature=youtu.be)
取引実行モードがカウントダウン方式か成行注文方式どうかの自動判定方法

◎概要

MQLプログラムから成行注文を発注する場合、
該当証券会社MT4サーバの取引実行モードが、「成行方式」、「カウントダウン方式」の違いによって、処理を変える必要があります。

具体的には、

「成行方式」の場合、成行注文の発注と利益・損失の設定をセットでできるので問題ないですが、

「カウントダウン方式」の場合、成行注文の発注と利益・損失の設定をセットでできない為、

①成行注文の発注（利益・損益は0設定）

②利益・損益を修正する。

と分けて処理する必要があります。



なお、MQLプログラム内部に、下記の詳細の様に記述すれば、自動判定可能です。



◎詳細

１，取引実行モード変数の宣言
ENUM_SYMBOL_INFO_INTEGER TradeExeMode;



２，初期化関数の中で、取引実行モードを取得する。

int init() {

//取引実行モードの取得
TradeExeMode=SymbolInfoInteger(Symbol(),SYMBOL_TRADE_EXEMODE);
Print("TradeExeMode=",TradeExeMode);

return(0);
}

３，発注関数の中で、成行方式、カウントダウン方式の処理を分岐させる。

////////////////////
//SYMBOL_TRADE_EXECUTION_REQUEST 0
//SYMBOL_TRADE_EXECUTION_INSTANT 1
//SYMBOL_TRADE_EXECUTION_MARKET 2
//SYMBOL_TRADE_EXECUTION_EXCHANGE 3
////////////////////
int doOrderSend(
//成行方式の場合
if(TradeExeMode==0 || TradeExeMode==1){
}

//カウントダウン方式の場合
else{
}
}
Travis CI で定期的にビルドする (Google Apps Script を使って)

#Update
2015/11/19 から /auth/github へアクセスできなくなっているため、サポートに連絡する必要あり...orz

Travis CI Status - /auth/github disabled due to continued DDoS
https://www.traviscistatus.com/incidents/bntk781kb8y8

# はじめに
[Travis CI](https://travis-ci.org) は [Github](https://github.com) への push をトリガーにしてビルドしてくれるのが便利。けど、決まった時間 / 定期的にビルドを実行する機能はない。そこで、Google Apps Script を cron 代わりに使い、 Travis CI API を定期的に呼び出すことで実現した。


# 前提
- Github にオープンソースを公開している。
- Travis CI でビルドしている。

# 手順

Travis CI API に使う access_token は Travis CI の accounts ページに表示されているものではない。Github の personal access token から生成する必要がある。

### Github で Personal access token を作る (github_token)

Personal Access Tokens
https://github.com/settings/tokens

にアクセスして、以下の5つの scope を持つ github_token を作る。生成された github_token はメモしておくこと（メモし忘れたら再生成すればよい）。

- read:org
- repo:status
- repo_deployment
- user:email
- write:repo_hook

### Google Apps Script を作る

Google Drive で新しい文書を作り、Tools > Script Editor... でスクリプトを作る。

github_token をスクリプト上で記述するのを避けるため、Script property として保存しておく。

Script Editor の File > Project Properties を開き、 Script Properties タブで +Add row して、Property に github_token、Value に作った値を保存する。

### Travis CI API で access_token を取得する

以下のスクリプトで github_token から access_token を取得する。

```js
function travisToken() {
  var github_token = PropertiesService.getScriptProperties().getProperty('github_token');
  var url = 'https://api.travis-ci.org/auth/github';
  var params = {
    method: 'post',
    headers: {
      'Accept': 'application/vnd.travis-ci.2+json'
    },
    payload: {"github_token": github_token }
  }
  var request = UrlFetchApp.getRequest(url, params);
  Logger.log(request);
  var response = UrlFetchApp.fetch(url, params);
  Logger.log(response);
  return JSON.parse(response.getContentText()).access_token;
}
```

### Travis CI API でビルドする

以下のスクリプトでビルドする。

```js
function travisToken() {
  var github_token = PropertiesService.getScriptProperties().getProperty('github_token');
  var url = 'https://api.travis-ci.org/auth/github';
  var params = {
    method: 'post',
    headers: {
      'Accept': 'application/vnd.travis-ci.2+json'
    },
    payload: {"github_token": github_token }
  }
  var request = UrlFetchApp.getRequest(url, params);
  Logger.log(request);
  var response = UrlFetchApp.fetch(url, params);
  Logger.log(response);
  return JSON.parse(response.getContentText()).access_token;
}
```

### Google Apps Script を定期実行する

Script Editor の Resources > Current project's triggers で、Run に build を選び、実行したい時間を設定する。

# 注意点 (はまりどころ）
UrlFetchApp.fetch に渡す params に contentType は設定せず、payload に javascript の object をそのまま記述する。

もし params に contentType : 'application/json' を設定した場合は、payload には String (JSON.stringify した値) を入れておく。

# 参考

- [Triggering builds through the API - Travis CI](http://docs.travis-ci.com/user/triggering-builds/)

- [Travis CI - API Reference - Authentication](http://docs.travis-ci.com/api/#authentication)

- [Properties Service  |  Apps Script  |  Google Developers](https://developers.google.com/apps-script/guides/properties)
【Go】print系関数の違い


fmtパッケージによって提供されるprint系関数。
Fprint, Sprintln, Printf...などいろいろあって、なんとなく使っているとこんがらがってしまうので、違いを整理してみました。
初歩的な内容ですが、間違っていたらご指摘ください :kissing: 


## はじめに

print系の関数は`Print()`を基本形として、`{接頭辞}Print{接尾辞}()`というふうに接頭辞・接尾辞によって挙動が変わってくるようですね。

ですので、説明も基本形の`Print()`からはじめ、各接頭辞・接尾辞による挙動の違いを見ていきます。


## 基本形 Print()

デフォルトのフォーマットで標準出力に出力します。

```go

fmt.Print("Hello world!")
// -> Hello world!

```

https://golang.org/pkg/fmt/#Print

## 接頭辞 F

`Fprint()`, `Fprintf()`, `Fprintln()` 

はじめに「F」が付いているものは、書き込み先を明示的に指定できます。

```go

// os.Stdout で書き込み先を標準出力に指定
fmt.Fprint(os.Stdout, "Hello world!")
// -> Hello world!

```
https://golang.org/pkg/fmt/#Fprint
https://golang.org/pkg/fmt/#Fprintf
https://golang.org/pkg/fmt/#Fprintln


## 接頭辞 S

`Sprint()`, `Sprintf()`, `Sprintln()` 

はじめに「S」が付いたものは、出力ではなくフォーマットした結果を文字列で返します。
変数に代入する際などはこちらを使用します。

```go

hello := fmt.Sprint("Hello world!")
fmt.Print(hello)
// -> Hello world!

```

https://golang.org/pkg/fmt/#Sprint
https://golang.org/pkg/fmt/#Sprintf
https://golang.org/pkg/fmt/#Sprintln

## 接尾辞 f

`Printf()`, `Fprintf()`, `Sprintf()` 

後ろに「f」が付いたものは、フォーマットを指定することができます。

```go

hello := "Hello world!"
fmt.Printf("%s\n", hello)
fmt.Printf("%#v\n", hello)
// -> Hello world!
// "Hello world!"

```

https://golang.org/pkg/fmt/#Printf
https://golang.org/pkg/fmt/#Fprintf
https://golang.org/pkg/fmt/#Sprintf

## 接尾辞 ln

`Println()`, `Fprintln()`, `Sprintln()` 

後ろに「ln」が付いたものは、オペランドの間に半角スペースが入り、文字列の最後に改行が追加されます。

```go

// Printの場合は、スペースも改行も挿入されない
fmt.Print("Hello", "world!")
fmt.Print("Hello", "world!")
// -> Helloworld!Helloworld!

// Printlnの場合は、スペースと改行が挿入される
fmt.Println("Hello", "world!")
fmt.Println("Hello", "world!")
// -> Hello world!
// Hello world!

```

https://golang.org/pkg/fmt/#Println
https://golang.org/pkg/fmt/#Sprintln
https://golang.org/pkg/fmt/#Fprintln


## まとめ

<dl>
<dt>接頭辞 F</dt>
<dd>書き込み先を指定</dd>

<dt>接頭辞 S</dt>
<dd>結果を文字列で返す</dd>

<dt>接尾辞 f</dt>
<dd>フォーマットを指定</dd>

<dt>接尾辞 ln</dt>
<dd>オペランド間にスペース、最後に改行を追加</dd>
</dl>

特徴を覚えて、使い分けましょう :blush: 


## 参考

https://golang.org/pkg/fmt/
「DOCKER CLI」で、”接続を拒否されました”的なことを言われた場合の対処方法

Docker Toolboxをインストールすると導入されるKitematic。
環境やバージョンによって「DOCKER CLI」からdockerコマンドを実行すると下の様なメッセージがでて怒られる場合があります。

```bash:
Get http:///var/run/docker.sock/v1.20/containers/json: dial unix /var/run/docker.sock: no such file or directory.
* Are you trying to connect to a TLS-enabled daemon without TLS?
* Is your docker daemon up and running?
```

こんな時は、Dockerの環境変数が有効となっていないので、次のコマンドをCLI（Windowsの場合はコマンドプロンプト）で実行します。（machine名のdefaultは環境に合わせて変更してください。）

## 1.OS Xの場合

### 1.1.docker-machineの設定確認
```bash:
docker-machine env default
```
↑の実行結果例↓  

```bash:
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="/Users/xxxxxxxx/.docker/machine/machines/default"
export DOCKER_MACHINE_NAME="default"
# Run this command to configure your shell: 
# eval "$(docker-machine env default)"
```

### 1.2.docker-machineの設定を反映
「eval "$(docker-machine env default)"」をCLI上で実行。
これで、dockerコマンドが正常に機能します。

-----

## 2.Windowsの場合
注意：Kitematicの「DOCKER CLI」からは現在デフォルトの設定では有効とならないためWindowsのコマンドプロンプトから実行します。  

### 2.1.失敗した例：「docker ps」の実行
```bash:
> docker ps
An error occurred trying to connect: Get https://127.0.0.1:2375/v1.20/containers/json: dial tcp 127.0.0.1:2375: ConnectEx tcp: No connection
 could be made because the target machine actively refused it.
```

### 2.2.docker-machineの設定確認
```bash:
> docker-machine env default --shell cmd
set DOCKER_TLS_VERIFY=1
set DOCKER_HOST=tcp://192.168.99.100:2376
set DOCKER_CERT_PATH=C:\Users\xxxxxxxx\.docker\machine\machines\default
set DOCKER_MACHINE_NAME=default
# Run this command to configure your shell:
# copy and paste the above values into your command prompt
```

### 2.3.上の環境変数をコマンドプロンプトへコピペ
```bash:
> set DOCKER_TLS_VERIFY=1
> set DOCKER_HOST=tcp://192.168.99.100:2376
> set > DOCKER_CERT_PATH=C:\Users\xxxxxxxxi\.docker\machine\machines\default
> set DOCKER_MACHINE_NAME=default
```

### 2.4.動作確認：「docker ps」の実行
```bash:
>docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
```
無事dockerコマンドが実行されました。
イントラネット内で使えるチャットツール「DevHub」が使いやすい

チーム内でちょっとしたことを共有したり、雑談したいと思ったことがあると思います。
そんな時は、SlackなどのチャットツールやQiitaのような情報共有ツールを使う時もあるかと思いますが、
社内の機密事項を扱う可能性もあるため、敷居が高い。。。

そんな時、イントラネット内で簡単に構築できて、
使い方がシンプルなチャット＆情報共有ツールを発見しましたので、紹介したいと思います！

# DevHubの特徴

## 向いていること
* イントラネット内でのみの共有
* 軽い情報共有(チャット)
* ちょっとしたことの共有(URL等)
* 共同編集できるメモ(Wiki)としての利用

## 向いていないこと
* インターネット経由の共有
* 長文のやり取り
* 誰が何を書いたかのログを残したい

# 構築方法(Ubuntu)
基本的にNode.jsとMongoDBをインストール後起動という至ってシンプルな手順ですが、
今回私はUbuntuで構築したため、Ubuntuでの構築方法となります。

## 環境
Ubuntu 14.04

## Node.jsのインストール
PPA リポジトリから最新版をインストール

    $ sudo add-apt-repository ppa:chris-lea/node.js 
    $ sudo apt-get update
    $ sudo apt-get install nodejs npm

## MongoDBのインストール

    $ sudo apt-get install -y git-core mongodb

## nmpのインストール

    $ sudo apt-get install npm

## DevHubのインストール

    $ git clone git@github.com:volpe28v/DevHub.git
    $ cd DevHub
    $ npm install 

## foreverのインストール
node.jsをデーモン起動するためにインストールします。

    $ npm install forever -g

## foreverでのDevHub起動&停止

    // 起動
    $ forever start app.js -p 3000 -d devhub_db -t title
    
    // 停止
    $ forever stop /hogehoge/DevHub/app.js

## アクセス方法
下記のようにアクセスすればdevhubのトップページへ行けます。
http://UbuntuサーバーのIP:30000/

# 使用方法
基本的には[❏ココ](http://dev-hub.herokuapp.com/)のdemoサイトを見ていただけると一発でわかりますが、
軽く下記に写真をつけて説明します。

1. まずは任意の名前を入力してログイン。
![devhub_demo.png](https://qiita-image-store.s3.amazonaws.com/0/53476/5394c269-e8a8-3fa5-ac74-fc52f89b48ad.png)
2. ログイン後は左側にチャット、右側に共有メモが用意されていますので自由に使えます。
![devhub_demo_main.png](https://qiita-image-store.s3.amazonaws.com/0/53476/cea3c5d4-2d08-a0c9-6f2d-bfe16014b7dc.png)


ということで使ってみると結構使いやすくて面白かったです！
ブログの機能もあるみたいなので、今度書いてみます。
qiita > タグは5つ以内


以下の記事が興味深かった。
http://qiita.com/HirofumiYashima/items/b6e69170d4167659136c

Neural Network関連なので、NeuralNetworkタグをつけてください、と編集リクエストしようとしたら、「タグは5つ以内にしてください」とエラーとなった。

Qiitaのシステムで表示領域などの制約からタグ数を５つまでとしているのだろうか?

結構長い間使用しているブックマークサービスではタグを6つとか使うことが多い。Qiitaのこれまでの自分の記事ではそれほどタグづけしていないが5つの制限にひっかかることが今後もあるかもしれない。
Windows > エクスプローラ > フォルダばかり表示されているフォルダへファイルをコピーしたい > 下側にドラッグする

```txt:動作確認
Windows 7 pro (32bit)
Windows 8.1 pro (64bit)
```

##問題

以下の表示状態の場合、Z_WORKの下にファイルをコピーしたい場合、どうするか。

![question.png](https://qiita-image-store.s3.amazonaws.com/0/32870/adf85600-fdc7-990f-5151-13e689701373.png)


##回答

以下のように、エクスプローラの下側にファイルをドラッグドロップすればいい。

![answer.png](https://qiita-image-store.s3.amazonaws.com/0/32870/a5dc282f-ea4a-8081-a89c-895da588b80f.png)


これまでは、エクスプローラで一階層上がってからドロップしてたが、偶然間違って下側に持って行って、こういう使い方ができるのを知った。


右クリックしながらドラッグすると、「移動」の選択もできる。
gulp-cssnextにpostcss-nestedプラグインを追加したらエラーが発生したので対処してみた

[gulp-cssnext](https://www.npmjs.com/package/gulp-cssnext)にPostCSSを追加する方法については、以下のエントリーにて紹介しました。

- [gulp-cssnextにPostCSSプラグインを追加する方法](http://qiita.com/youthkee/items/2dfdd8fdfee3bd2b7e45)

ところが、Sassのようなセレクターのネストを実現する[postcss-nested](https://www.npmjs.com/package/postcss-nested)プラグインを導入しようとしたところ、エラーが起きてしまい、うまくいかなかったので、経緯と解決策をまとめてみました。

# 前提

CSSのコンパイルはPostCSSの機能をラップしている[gulp-cssnext](https://www.npmjs.com/package/gulp-cssnext)にて行う。
（[gulp-postcss側から、cssnextを用いてコンパイルする](https://www.npmjs.com/package/gulp-postcss#using-a-custom-processor)のではないやり方）

# gulp-cssnextのインストール

プロジェクトのルートディレクトリで以下のコマンドを実行。

```
$ npm i gulp-cssnext --save-dev
```

# CSSのコンパイル

gulpfile.jsのタスクは以下のような形で記述すれば、CSSのコンパイルは可能。

```gulpfile.js
var gulp = require('gulp');
var cssnext = require('gulp-cssnext');

var paths = {
  'src': 'src/',
  'dist': 'dist/'
}

gulp.task("css", function() {
  return gulp.src(paths.src + 'css/*.css')
    .pipe(cssnext({
        compress: false,
        import: true
    }))
    .pipe(gulp.dest(paths.dist + 'css/'))
});

```

ただし、gulp-cssnextには、importなどの機能はデフォルトで実装されているが、
Sassのようなセレクターのネストを実現する[postcss-nested](https://www.npmjs.com/package/postcss-nested)などのプラグインは、現状で内蔵されていない模様。

# プラグインのオプションを追加

公式サイトによれば、PostCSSのプラグインを追加するには、[このように](http://cssnext.io/usage/#plugins)プラグイン名を指定して読みこめばいい、とあるので、gulpのタスクにオプションを追記してみる。

```gulpfile.js

gulp.task("css", function() {
  return gulp.src(paths.src + 'css/*.css')
    .pipe(cssnext({
        compress: false,
        import: true,
        plugins: [
          require("postcss-nested")
        ]
    }))
    .pipe(gulp.dest(paths.dist + 'css/'))
});

```

その上で、ソース側のCSS内でネストを使ってコンパイルしてみると、以下のようなエラーが出てしまい、実行できなかった。

```
Error: Cannot find module 'postcss-nested'
```

# プラグインのインストール

これは、プラグイン自体がインストールされていないので当然かと思い、プロジェクトのルートディレクトリで下記のコマンドを実行してみた。

```
$ npm i postcss-nested --save-dev
```

すると、今度はコンパイル時に以下のエラーメッセージが表示され、処理が中断。

```
Your current PostCSS version is 4.1.16, but postcss-nested uses 5.0.4. Perhaps this is the source of the error below.
```

# PostCSSのアップデート

エラーメッセージ通りに、これはPostCSSのバージョンが一致してないため、との解釈でPostCSSをアップデートしてみることに・・。

ここで疑問なのが、「PostCSS」はどこにインストールされているのか？というところ。

cssnextがPostCSSをラップしているのだから、当然その中にあるはず、ということで/node_modules/の中を見てみると、下記ディレクトリ以下にPostCSS本体やPostCSSのプラグインらしきファイルが入っていることが分かった。

```
./node_modules/gulp-cssnext/node_modules/cssnext 
```

そこで、このディレクトリ上でターミナルを開いて、以下のコマンドを実行してみた。

```
npm i postcss@5.0.4 --save
```

すると、PostCSSのバージョンが5.0.4にアップデートされたので、先ほどのエラーが解消。

これで、postcss-nestedを用いたCSSのネスト機能が利用できるようになった。

# まとめ＆分かったこと

- cssnextはPostCSSの機能をラップしている
- gulp-cssnextも、それ単体としてPostCSSをラップしている
- gulp-cssnextが現時点で内蔵している機能やプラグインはデフォルトで使用できる
- gulp-cssnextに実装されていないPostCSSプラグインを使いたい場合は、requireするだけではなく、自分で個別にインストールする必要がある
- プラグインをインストールする場所は、プロジェクトのルートディレクトリでnpm installすればOK
- ただし、バージョンの不一致がある場合は、内蔵のPostCSS側のモジュールを更新する必要あり？

# 懸念点

応急処置として、ひとまず上記の運用で問題なさそうだが、gulp-cssnext自体をアップデートした際に、PostCSSのバージョンが戻ってしまうのではないか？という点が心配。

いずれにしても、そのうちgulp-cssnext自体がアップグレードされれば、上記エラーは解消されるような気もするのですが・・。
Play Framework (2.1～2.4) で作成したアプリでバッチを実行する。

メリット

- 機能の再利用ができる。(特にORM)
- 新しいプロジェクトを作らなくて済む。

適当なクラス(例:batch/HogeMain.java)に main() 関数を作成し、以下のコマンドで実行できます。

開発環境の場合
`$ activator "run-main batch.HogeMain"`

デプロイ環境の場合
`$ java -cp lib/* batch.HogeMain`

ただしアプリが起動されていないと実行できない(ORMなど設定や状態に依存する)ものは例外を吐いたりします。その場合、以下のように Play を実行状態にしてあげれば良いようです。

Play 2.3 まで

```scala:Scala
Play.start(new play.api.DefaultApplication(new java.io.File("."), getClass.getClassLoader, None, Mode.Prod))
```

```java:Java
Play.start(new play.api.DefaultApplication(new java.io.File("."), getClass().getClassLoader(), null, Mode.Prod()));
```

Play 2.4 の場合

```scala:Scala
val env = new Environment(new java.io.File("."), getClass.getClassLoader, Mode.Prod)
val context = ApplicationLoader.createContext(env)
val loader = ApplicationLoader(context)
val app = loader.load(context)
Play.start(app);
```


参考にさせて頂きました！
http://argius.hatenablog.jp/entry/20121011/1349953945
技術英語 > 最上級 > 同じものの状態や一部を述べる場合、定冠詞がつかない > This lake is deepest around here.

引用: 冠詞マスター教本 by 石井隆之さん

> 同じものの状態や一部を述べる場合には、定冠詞がつきません。
...
This lake is deepest around here.

1つの湖の中でdeepestの場合はtheが付かない.

<hr>

フォルダの階層が一番深いものについては、以下かと思う。
This folder is the deepest one in this project.

上記の場合は、他のfolderとくらべてだから the が付くだろう。
JXAのUIエレメントのリンクを取得するスクリプト

アプリのメニューとかにアクセスするコードを取得します。
一覧からアプリを選んで、検索したいUIエレメントの名前を入力するだけです。
(全てのUIエレメントを調べるのでけっこう時間かかります)

```js:search_ui.scpt
MSG_1 = "どのプロセスを調べますか？"
MSG_2 = [
  "検索するUIの名前を入力してください。(正規表現可)\n",
  "数分かかる可能性があるので気長にお待ちください。",
  "なるべく他の作業はしないでください。"
].join("\n")

app = Application.currentApplication()
app.includeStandardAdditions = true
se = Application("System Events")  

function search_ui(process_name, ui_name){
  var process = se.processes[process_name]
  var ui_rex = new RegExp(ui_name)
  var result = []
  
  if(process.exists()){
    var all_ui = process.entireContents()
    result = all_ui.filter(function(e){ return ui_rex.test(e.name()) })
    result = result.map(function(e){ return Automation.getDisplayString(e) })
  }
  return result
}

target_app = app.chooseFromList(se.processes.name(), {withPrompt:MSG_1})[0]

if(target_app.length){
  try {
    target_ui = app.displayDialog(MSG_2, {defaultAnswer: ""}).textReturned
    
    if (target_ui.length){
      result = search_ui(target_app, target_ui)
      msg = result.length + " 件見つかりました。\n\n" + result.join("\n\n")
    }
  } catch(e){}  
}

app.displayDialog(this.msg || "キャンセルされました。", {buttons:["OK"], defaultButton:1})
```

たとえば「iTunes」「フルスクリーン」と入力すると以下のようなダイアログが表示されます。

>2 件見つかりました。
>
>Application("System Events").applicationProcesses.byName("iTunes").menuBars.at(0).menuBarItems.byName("表示").menus.byName("表示").menuItems.byName("ビデオ再生").menus.byName("ビデオ再生").menuItems.byName("フルスクリーン")
>
>Application("System Events").applicationProcesses.byName("iTunes").menuBars.at(0).menuBarItems.byName("表示").menus.byName("表示").menuItems.byName("フルスクリーンにする")

コピペでそのままJXAに使うことができます。

```js:iTunes_fullscreen.js
// 上で作ったメニューアイテム
target = Application("System Events").applicationProcesses.byName("iTunes").menuBars.at(0).menuBarItems.byName("表示").menus.byName("表示").menuItems.byName("フルスクリーンにする")

// .click()で実行 (iTunesがフルスクリーンになる)
target.click()
```

(けっこう前に似たようなうんこスクリプト書いた気がするけど忘れた)

追記：
全UIエレメントの名前だけ見たいとき用のスクリプトも作りました
下の方はたぶんダイアログに入りきらないので、テキストエディタとかにコピペしてください

```js:reveal_all_ui_names.js
MSG = "どのプロセスを調べますか？"

app = Application.currentApplication()
app.includeStandardAdditions = true
se = Application("System Events")  

function all_ui_names(process_name){
  var process = se.processes[process_name]
  var all_ui = process.entireContents()
  return all_ui.map(function(e){ return e.name() })
}

target_app = app.chooseFromList(se.processes.name(), {withPrompt:MSG})[0]

if(target_app.length){
  elms = all_ui_names(target_app)
  app.displayDialog(elms.join(", "), {buttons:["OK"], defaultButton:1})
}
```

[Macのキーボード入力、マウスクリックをJavaScriptで (JXA)](http://qiita.com/zakuroishikuro/items/afab0e33ad2030ba2f92)

(2016/01/29追記：console.logでやればいいのに何でダイアログに表示してんだっけこれ)
电脑相关用语

中国のwebサービスなどを調べるときに知っておきたい用語たちをまとめます。

|日本語|中国語|
|:--|:--|
|ネット|互联网，网际网络|
|ネットビデオチャット|网络视频|
|ブラウザゲーム|网络游戏|
|webページ|网页|
|サイトアドレス|网址|
|ログインする|登录|
|ログアウト|退出|
|クリックする|点击|
|コピーする|复制|
|添付ファイル|附件|
|マウス|鼠标|
|削除する|删除|
|メニュー|菜单|
|パスワード|密码|
|ウイルス|病毒|
|チャットルーム|聊天室|
|メールアドレス|邮址|
|電子メール|电邮|
|ブロードバンド|宽带|
|ノートパソコン|笔记本电脑|
|デスクトップパソコン|桌上型电脑|
|タブレット|平板电脑|
|スマートフォン|智能手机|
|macPC|苹果电脑|
|macファン|果粉|
|iPhone|爱疯手机|
|スティーブ・ジョブス|史蒂夫・乔布斯|
|マイクロソフト|微软|
|ウィンドウズ|视窗|
|ビル・ゲイツ|比尔・盖茨|
|Google|谷歌|
|Yahoo!|雅虎|
|ウェイボー|微博|
|facebook|脸书，面书，面簿|
|facebookで知り合った人|面友|
|ポータルサイト|门户网站|
|ネットフレンド|网友|
|ネットユーザ|网民|
|サイトへアクセスする|访问|
|平均アクセス数|平均访问量|
|ブログ|博客|
|ブログ主|博主|
|ダウンロード|下载|
|インストール|安装|
|アンインストール|卸载|
|キーボード|键盘|
|スクリーン|屏幕|
|ファイル|文件夹|
|USB|移动硬盘，U盘|
|切り取り|剪切|
|ペースト|粘贴|
|リンク|连接|
|掲示板|论坛|
|書き込み|发帖|
|他の書き込みに応答する|跟贴|
|ハッカー|黑客|
|文字化け|乱码|
|レイアウト|排版|
|cc|抄送|
vim 基本命令

vimの基本的な操作について中国語でまとめます。

|文件命令|动作|
|:--|:--|
|:open file|在vim窗口中打开一个新文件|
|:split file|在新窗口中打开文件|
|:bn|切换到下一个文件|
|:bp|切换到上一个文件|
|:e ftp://xxx.xxx.xxx.xxx/...|打开远程文件|


|插入命令|动作|
|:--|:--|
|i|在当前位置插入|
|I|在当前行首插入|
|a|在当前位置后插入|
|A|在当前行尾插入|
|o|在当前行之后插入一行|
|O|在当前行之前插入一行|

|移动命令|动作|
|:--|:--|
|h|左移一个字符|
|l|右移一个字符|
|k|上移一个字符|
|j|下移一个字符|
以上四个移动命令（h,l,k,j）可以配合数字使用，比如20j就是向下移动20行，5h就是向左移动5个字符，在Vim中，很多命令都可以配合数字使用，比如删除10个字符10x，在当前位置后插入3个！，3a！<Esc>，这里的Esc是必须的，否则命令不生效。

|移动命令|动作|
|:--|:--|
|w|向前移动一个单词|
|b|向后移动一个单词|
|e|同w，只不过是光标停在单词尾部|
|ge|同b，光标停在单词尾部|
|^|移动到本行第一个非空白字符上|
|0|移动到本行第一个字符上|
|$|移动到行尾|
|3$|移动到下面3行的行尾|
|gg|移动到文件头|
|G|移动到文件尾|
|f|fx将找到光标后第一个为x的字符，3fd将找到第三个为d的字符|
|F|同f，反向查找|
跳到指定行，冒号+行号，回车，比如跳到240行就是 :240回车。另一个方法是行号+G，比如230G跳到230行。

|移动命令|动作|
|:--|:--|
|ctrl + e|向下滚动一行|
|ctrl + y|向上滚动一行|
|ctrl + d|向下滚动半屏|
|ctrl + u|向上滚动半屏|
|ctrl + f|向下滚动一屏|
|ctrl + b|向上滚动一屏|

|撤销和重做命令|动作|
|:--|:--|
|u|撤销|
|U|撤销对整行的操作|
|ctrl + r|重做|

|删除命令|动作|
|:--|:--|
|x|删除当前字符|
|5x|删除当前光标开始向后三个字符|
|X|删除当前字符的前一个字符。X=dh|
|dl|同x|
|dh|同X|
|dd|删除当前行|
|dj|删除上一行|
|dk|删除下一行|
|d10|删除当前行开始的10行|
|D|删除当前字符至行尾。D=d$|
|d$|同D|
|kdgg|删除当前行之前所有行（不包括当前行）|
|jdG|删除当前行之后所有行（不包括当前行）|
|:1,10d|删除1-10行|
|J|删除两行之间的空行，实际上是合并两行|

|拷贝和粘贴命令|动作|
|:--|:--|
|yy|拷贝当前行|
|2yy|拷贝当前行及其下一行|
|p|在当前光标后粘贴,如果之前使用了yy命令来复制一行，那么就在当前行的下一行粘贴|
|shift+p|在当前行前粘贴|
|ddp|交换当前行和其下一行|
|xp|交换当前字符和其后一个字符|

|退出命令|动作|
|:--|:--|
|:wq|保存并退出|
|ZZ|保存并退出|
|:q!|强制退出并忽略所有更改|
|:e!|放弃所有修改，并打开原来文件|
全力で ES Decorator使ってみた


Proposalはここ
[wycats/javascript-decorators](https://github.com/wycats/javascript-decorators "wycats/javascript-decorators")

stage: 1 なのでまだまだ仕様変わる可能性あり。

typescriptやbabelでつかいたい場合は次のようなコンパイラオプションが必要

```
tsc --experimentalDecorators
babel --stage=1
```

## デコレータの振る舞い

- クラスデコレータは Class Functionをとって Class Function を返す関数
- クラスの関数デコレータは instance とname と descriptor を引数に descriptorを返す関数
- 引数を取るデコレータは、関数を返す関数として実装する(部分適用っぽい感じ)
- クラスに所属しない関数へのデコレータはbabel/typescriptともに未実装？

## 使ってみた感想

- 元の振る舞いを変えずに参照透過を維持するような関数が見通しが良い
- 用途は以下が考えられる
    - DI
    - Logging
    - Memoize
    - Mixin
    - アノテーション付与
    - テスト用ヘルパ

結局Javaやpythonと同じような用途になると思う。

変わった用途として、pythonのflaskとかはAPI ルーティングで使ってたっけ。

```
@get('/')
def index():
  ...
```

こんなやつ

## Debug Decorator

作ってみた。関数の振る舞いを変えずに入出力をconsole.log で吐くデコレータ。

npm install @mizchi/debug-decorator で入る

```js
const debug = require('@mizchi/debug-decorator');
class X {
  @debug
  get name() {
    return 'xxx';
  }

  @debug
  square(n: number){
    return n * n;
  }
}
const x = new X;
x.name;
const r = x.square(2);
```

こんなログが出る。

```
debug: get name - xxx
debug: call square
        [args] 2
        [return] 4   
```

それぞれにdescriptorがあるかどうか判定してオリジナルのものをラップした関数に書き換えている。

コードはこんな感じ

```js
module.exports = function debug(target, name, descriptor) {
  if (descriptor.value) {
    const original = descriptor.value.bind(target);
    descriptor.value = (...args) => {
      const val = original(...args);
      console.log(`debug: call ${name}\n\t[args]`, ...args, `\n\t[return] ${val}`)
      return val;
    }
  }
  if (descriptor.get) {
    const originalGet = descriptor.get.bind(target);
    descriptor.get = () => {
      const val = originalGet();
      console.log(`debug: get ${name} - ${val}`);
      return val;
    }
  }
  if (descriptor.set) {
    const originalSet = descriptor.set.bind(target);
    descriptor.set = (val) => {
      const r = originalSet(val);
      console.log(`debug: set ${name} - ${val}`);
      return r;
    }
  }
  return descriptor;
}
```

## Dependency Injection

Decorator, たしか元々TypeScript with AngularにDIを、みたいな話から始まってた話、とりあえず作ってみた

[mizchi/injector](https://github.com/mizchi/injector "mizchi/injector")

npm install @mizchi/injector で入る

サンプルコード

```js
const createInjector = require('@mizchi/injector');
const rootInjector = createInjector();
const injector = rootInjector.createChildInjector(); // can search parents
class A {}
class B {}

injector.mapSingleton(A);
injector.mapValue(B, new B);
// injector.unmap(B); // to remove
@injector({a: A, b: B})
class T {
  a: A;
  b: B;
}
const t = new T();
assert.ok(t.a instanceof A);
assert.ok(t.b instanceof B);
```

T に対して injectorがgetterを定義することでメンバアクセス時にDIから参照を解決する。
自分が唯一業務で使ったことがあるDIの  [Robotlegs AS3 Micro-Architecture - index.html](http://www.robotlegs.org/ "Robotlegs AS3 Micro-Architecture - index.html") を参考にした。

これもうちょっとちゃんと設計しないと治安が悪くなりそうなので、もっと良いAPIを考える。
tinymce advanced使用時 ビジュアルエディタとテキストエディタを切り替えた時、ショートコードの中身が実体参照置換されてしまう問題について

tinymce advancedの設定項目

```
Stop removing the <p> and <br /> tags when saving and show them in the Text editor
```

にチェックを入れると、ショートコードの前後に勝手にpreが付加されて以下のGIFような悲しい現象が発生する。
ショートコードを使わないのであればいいけれども、使用予定がある場合は注意してほしい。

![alt](http://giant.gfycat.com/GratefulAcceptableIvorygull.gif)
UIAlertView 複数回 + UITextView でキーボードが消えない問題


# UIAlertViewに重なってキーボードが出てしまう！！
- ちゃんと resignFirstResponder してるのに！！
- という状況に遭遇しました

- 結論から言います

```
-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
}
```
を・・・・・


```
-(void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex{
}
```
に変えるだけで直ります

clickedButtonAtIndex 内で次の UIAlertView を呼び起こすと、
実際は resignFirstResponder が挟まる間もなく次の UIAlertView が出てしまうということでしょうか。
どちらにしてもUIAlertViewはもう捨てたほうがいいですね
Instruction to debug MySQL server from source tree build

It applies only on Linux :p

# Clone source tree from GitHub

```bash
git clone git@github.com:mysql/mysql-server.git
```
Wait with coffee :)

## switch branch if you want

```bash
cd mysql-server/
git checkout 5.6
```

# Build

## Prepare build directory

```bash
mkdir /path/to/mysql-server-build/
cd /path/to/mysql-server-build/
```

## Do build

```bash
cmake -DWITH_DEBUG=1 /path/to/mysql-server/
make -j8
make test
```

# Debug run

Prepare a test query case

```bash
cd mysql-test/
mkdir t/
echo "select 1;" > t/example.test
# initiate database
./mysql-test-run.pl --record example
# debug run (need X11 forwarding: xterm opens)
./mysql-test-run.pl --gdb example
```

# Debugging

* At the beginning of debugging, there is only one breakpoint at `main()` (`i b`).
* Repeatedly run `c` and it terminates once, xterm resides.
* Rerun the server by `r` in the xterm shell.
* Make a breakpoint at `mysql_parse` by `b mysql_parse`.
* Run `c` and the server starts to wait for a connection

```
Version: '5.6.26-debug-log'  socket: '/path/to/mysql-test/var/tmp/mysqld.1.sock'  port: 13000  Source distribution
```
* You can connect to this instance via 13000/tcp `127.0.0.1` (not `localhost`).

```
mysql -uroot -h 127.0.0.1 --port 13000 test
```
centos7にphp5.6をインストールする

CentosへPHP5.6のインストール。
いつも忘れるので備忘録的な感じで。

## remi,epelリポジトリの用意

```
$ rpm -Uvh http://ftp.iij.ad.jp/pub/linux/fedora/epel/7/x86_64/e/epel-release-7-5.noarch.rpm
$ rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
```

## yumの設定

```
$ vi /etc/yum.repos.d/CentOS-Base.repo

# 次のセクションで無効化
[base]
enabled=0

[updates]
enabled=0

[extras]
enabled=0
```


## PHP5.6インストール

```
yum install --enablerepo=remi --enablerepo=remi-php56 php php-mysql php-json php-mysql
```

追加のphp関連インストールは都度。。。ということで。
Linux Mint 17.2(Rafaela)におけるGyazoインストール時のバグ（404Error）を無理矢理解消する

Windowsでは便利なGyazoがLinuxMintではインストール出来なかったので先輩に解決してもらった。
先輩ありがとう！
Gyazo公式サイト:https://gyazo.com/ja  

##実際のGyazo-for-Linuxの導入方法

> **apt-get**
>$ curl -s https://packagecloud.io/install/repositories/gyazo/gyazo-for-linux/script.deb.sh | sudo bash
$ sudo apt-get install gyazo

とするとOKらしいが、実際には1行目の時点で

![de9d51a210d592a2a5388f84bacdcaf4.png](https://qiita-image-store.s3.amazonaws.com/0/51275/b5b432e9-68bb-4285-9551-b5225139a158.png)

となってしまった

##原因

curlで利用するURLの指定したインストールスクリプトがどうもLinuxMintを想定していないみたいです。

##解決方法

`curl -s https://packagecloud.io/install/repositories/gyazo/gyazo-for-linux/script.deb.sh | sed -e 's/^os=/os="Ubuntu"/' -e 's/^dist=/dist="trusty"/' | sudo bash`

を実行し、実際の導入方法の2行目、`sudo apt-get install gyazo`でgyazoのインストールが出来ます。

（やっているのはインストールスクリプトの`os`をUbuntuに、`dist`をtrustyにする様に設定）

これでTerminal上で`gyazo`と打つか、タスクバーにコマンド登録する事でWindowsのgyazoと同様の事が出来ます。

##問題点

撮影した画像を確認すると**デスクトップの背景が真っ黒**になってしまったりと、撮影出来るものと出来ないものがあります。

標準のスクリーンショットを使え、という事なんでしょうかね〜。

##[追記 2015/09/18]

取り上げていた問題点ですが、コメントを頂いた通り、`/usr/bin/gyazo`を編集してスクリーンショットツールを変更する事で解決しました！ありがとうございました！
Sublime Text で、タイプスタンプを挿入（保存時に自動更新）

Emacs には標準で付いてて便利だなと思っていたのですが、Sublime Text で、タイムスタンプ挿入コマンドとそれを保存時に自動更新するプラグインを書きました。

```timestamp.py
import sublime, sublime_plugin
from datetime import datetime

TIMESTAMP_PATTERN = 'Last\sModified:\s+20[0-9][0-9]-\d+-\d+\s+\d+:\d+:\d+(\.\d+)?'

class InsertTimestampCommand(sublime_plugin.TextCommand):
  def run(self, edit):
    timestamp = datetime.today().strftime("%Y-%m-%d %H:%M:%S")
    replacement = 'Last Modified: %s' % timestamp
    for r in self.view.sel():
      if r.empty():
        self.view.insert (edit, r.a, replacement)
      else:
        self.view.replace (edit, r, replacement)

class UpdateTimestampListener(sublime_plugin.EventListener):
    def on_pre_save(self, view):
      if view.settings().get("insert_timestamp_on_save") == True:
        region = view.find(TIMESTAMP_PATTERN, 0)
        if region:
          view.sel().clear()
          view.sel().add(region)
          view.run_command("insert_timestamp")

```

## 設定

上のスクリプトを、`~/Library/Application Support/Sublime Text 3/Packages/User` に置きます。

Preferences -> Keybindings - User に、

```
{ "keys": ["ctrl+shift+t"], "command": "insert_timestamp" }
```

と書き（キーバインドはお好みで）、キーを押すと `Last Modified: 2015-09-15 01:37:14` という日時が挿入されます。

Preferences -> Settings - User に、

```
"insert_timestamp_on_save": true
```
と書くと、上の `Last Modified: 2015-09-15 01:37:14` の文字が保存時に自動で更新されます。



## 参考
[Sublime Forum • View topic - Automatically updated Timestamp?](http://www.sublimetext.com/forum/viewtopic.php?f=2&t=9093)
[SublimeTextでかんたんにタイムスタンプを挿入させる](http://b.hishitu.net/4658.html)
Raspberry Pi にホスト名でアクセス出来るようにする


DHCPだと毎回IP変わるし、持ち運ぶので固定IPはちょっと、という場合に便利です。
hostsファイルは使わずにavahiを使います。（Macでいうbonjour機能らしい）

```
sudo apt-get install avahi-daemon 
```

`/etc/hostname`に記述した名前 + `.local`でアクセスできるようになります。

```
ssh pi@trapple-no-pi.local
```

### [追記]sudoすると警告がでる

sudoで作業をすると以下のようなエラーがでてしまいました。

```
sudo: ホスト trapple-no-pi の名前解決ができません
```

`/etc/hosts`を編集します。

```
127.0.1.1       trapple-no-pi
```

警告がでなくなりました。
反映されないようなら`sudo reboot`してみましょう。


---

参考

http://qiita.com/kasei-san/items/087e5b33207c214c8db6
http://daisukekmr.hatenablog.com/entry/20150118/1421556642
SSH（SCP）でサーバにアクセスしようとしたら警告が出てアクセスできなかった場合の対処法

はじめてサーバにアクセスしようとしたときに下のようなエラーが表示されることがある。

```
Warning: Permanently added 'xx.xxx.xxx.xxx' (RSA) to the list of known hosts.
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for 'keyfile.pem' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
bad permissions: ignore key: keyfile.pem
Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
```

そういうときはpemファイルのパーミッションを400にすればアクセスできるようになる。

```
chmod 400 keyfile.pem 
```

※パーミッションを600にするとアクセスできるようになったという情報もある。
画面回転した後の画面サイズを正確に取得したい

## 問題点
画面回転のNotificationを受け取って

```swift
self.view.bounds
```
とかすると画面回転前のビューのサイズが表示される。
ゆっくりやるとちゃんと出来るけど超速でくるくるやると画面サイズがおいついてこない

## やりたいこと
- 連続したorientationイベントが発生した場合でも正確な画面サイズを取得したい…

## 解決策
viewWillTransitionToSizeを使用します。

```swift
override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
  println("\(size.width)")
  println("\(size.height)")
}
```

## 画面縦横の判別


```swift
UIDevice.currentDevice().orientation.isLandscape.boolValue
//画面が横だったら true
```