OmniAICreator/Qiita-1.07M huggingface dataset:
bash、これだけは知っておきたいショートカット


皆さん、CUIアレルギーにかかってませんか！？

自分のようなおじさんエンジニアは、GUIは直感的ですが、効率化という意味では悪！なんて思っている人が幾ばくかいるのではないでしょうか？

さて、では黒い画面に白い文字で悪戦苦闘しなければいけなくなった人向けに、これを知っていれば効率的に作業できるよ、という初心者向けのショートカット(キーバインド) for bash を紹介したいと思います。

## bashにはモードの概念がある

何気なく普段使っているbashですが、実はモードの概念が存在します。特に設定などをいじらなければ、emacsモードでの動作になりますので、今回はemacsモード前提で話を進めます。

## tab補完、使ってますか？

bashには、tab補完の機能があり、パスやコマンドを全て手入力せずとも、たとえば、ema まで入力した後にtab入力すれば、emacsと補完される機能があります。パスなどは非常に長いものになることもよくある話なので、このtab補完を直感的に使えるようになるまで習熟する事が、作業の効率化の鍵になります。

余談ですが、昔のMS-DOS(DOSプロンプト)はこの機能がなくてイライラしたのを覚えています。(確か、Windows2000ぐらいからtab補完が実装された記憶があります)

## コマンドのカーソル移動

コマンドを入力してみたら誤字があって修正、なんていう事は日常茶飯事です。そんな時、1つ前のコマンドを呼び出して…となりますが、カーソルキーに指を移動させていませんか？~~それを売るなんてとんでもない。~~ホームポジションから指を離すなんてとんでもない。

まず、過去のコマンドの呼び出しですが、Ctrl+pで遡れます。逆に行き過ぎた場合はCtrl+nで1つずつ手前のコマンドに戻る事ができます。

Ctrl+pでお目当てのコマンドを見つけて編集！となります。カーソルキーに指を移動させていませんか？~~それを売るなんてとんでもない。~~ホームポジションから指を離すなんてとんでもない。

コマンドの先頭へはCtrl+a、最末尾にはCtrl+eで移動できます。また、カーソルを1つずつ先に移動するにはCtrl+f、逆に1つずつカーソルを戻すにはCtrl+bで行えます。

また、編集するという事で、文字を削除したいケースもあると思いますが、カーソルのある文字の削除はCtrl+dで行えます。

## 履歴を活用しようず

先ほど、Ctrl+p、Ctrl+nで過去のコマンドを再利用出来る事を紹介しましたが、過去のコマンドを振り返るコマンドとしてhistoryコマンドというそのものずばりのコマンドがあります。

```
473  sudo purge
474  ps
475  ps aux
476  top
477  man top
478  top -o cpu
```

historyコマンドの出力結果を抜粋したものです。コマンド毎になにやら数字が付与されています。Ctrl+pを何度も入力して戻ってコマンドを入力しなくても、historyコマンドで過去のコマンド一覧を表示して、付与されている数字を確認すれば、1発でそのコマンドを再入力する仕組みがbashには用意されています。

今回の場合だと、```ps aux```を再入力したい場合は```!475```と入力すれば、コマンドが再入力されます。便利ですね。

さて、たったこれだけ知っているだけでも、かなりホームポジションから指を離す機会が減るのではないでしょうか？効率化の道はまだまだ続きますが、今回はこれぐらいで。
点が三角形の内側にあるか


キャンバスに回転する三角形を表示します。
マウスカーソルがその三角形の内側にあるときのみ、その三角形を塗りつぶすサンプルです。

## 環境

- OS X 10.10.4
- Ruby-Processing version 2.6.13


## サンプルコード

```ruby:point-in-triangle.rb
# 2 次元ベクトル
class Vec2
  attr_reader :x, :y

  def initialize(x, y)
    @x = x
    @y = y
  end

  def subtract(v)
    Vec2.new(@x - v.x, @y - v.y)
  end

  def -(v)
    subtract(v)
  end

  def rotate!(deg)
    rad = deg.radians
    x = @x
    y = @y
    @x = x * cos(rad) - y * sin(rad)
    @y = x * sin(rad) + y * cos(rad)
  end
end

def setup
  size 400, 400

  $a = Vec2.new 100, 0
  $a.rotate! 0
  $b = Vec2.new 100, 0
  $b.rotate! 120
  $c = Vec2.new 100, 0
  $c.rotate! 240
end

def draw
  background 255

  # 三角形の 3 点を回転
  $a.rotate! 1
  $b.rotate! 1
  $c.rotate! 1

  pushMatrix()
  translate(width/2, height/2)

  a, b, c = $a, $b, $c
  ellipse(a.x, a.y, 10, 10)
  ellipse(b.x, b.y, 10, 10)
  ellipse(c.x, c.y, 10, 10)

  p = Vec2.new(mouseX - width/2, mouseY - height/2)
  ab = b - a
  bp = p - b

  bc = c - b
  cp = p - c

  ca = a - c
  ap = p - a

  c1 = ab.x * bp.y - ab.y * bp.x
  c2 = bc.x * cp.y - bc.y * cp.x
  c3 = ca.x * ap.y - ca.y * ap.x

  if (c1 > 0 && c2 > 0 && c3 > 0) || (c1 < 0 && c2 < 0 && c3 < 0)
    # 3 点の内部にある
    fill(120, 120, 120)
  else
    noFill
  end
  triangle(a.x, a.y, b.x, b.y, c.x, c.y)

  popMatrix()
end
```

コマンドラインから以下のように実行します。

```bash:
$ rp5 --nojruby watch point-in-triangle.rb
```

## 疑問:ソースコードにあるコメントを書いたら、Java の例外が生成される => 最新の Java SE を入れたら解決

ソースコードに「# あ」とコメントを書くと、Java の例外が生成されます。「# ああ」というコメントだと、例外は生成されません。特定のコメント文字列だと例外が生成されるのか、よく分かっていません。ソースコードは UTF-8 で書いています。

```ruby:例外が生成されるコード(UTF-8)
def setup
  # あ
end
```

RubyRegexp.java で例外が生成されています。

```ruby:生成される例外
Exception occured while running sketch a.rb...
Backtrace:
	org/jruby/RubyRegexp.java:1680:in `match'
	org/jruby/RubyString.java:1747:in `match'
	/usr/local/lib/ruby/gems/2.2.0/gems/ruby-processing-2.6.13/lib/ruby-processing/runners/base.rb:31:in `load_and_run_sketch'
	/usr/local/lib/ruby/gems/2.2.0/gems/ruby-processing-2.6.13/lib/ruby-processing/runners/watch.rb:47:in `start_runner'
	/usr/local/lib/ruby/gems/2.2.0/gems/ruby-processing-2.6.13/lib/ruby-processing/runners/watch.rb:35:in `report_errors'
	/usr/local/lib/ruby/gems/2.2.0/gems/ruby-processing-2.6.13/lib/ruby-processing/runners/watch.rb:46:in `start_runner'
reloading sketch...
```

(追記:解決しました) 最新の Java SE (JDK 8u51)をインストールしたら上記のエラーは再現しなくなりました。

## 参考

- [Ruby-Processingのインストール方法](http://qiita.com/yohm13/items/f3f82f423b507cec1dcc)
- [ruby-processingをもっと知って更なるイケメンになろう](http://hoshi-sano.hatenablog.com/entry/2013/12/09/000154)
AudioSourceをアタッチせずに音を再生する【Unity】


AudioSource.PlayClipAtPoint()を使用して、AudioSourceをアタッチせずに音を鳴らします。

```C#
private AudioClip clip;

void Start () {
	clip = Resources.Load ("se") as AudioClip;
}

void Update () {
	if (Input.GetButtonDown ("Fire1")) {
		AudioSource.PlayClipAtPoint(clip, Vector3.zero);
	}
}
```

この方法だと、"One shot audio"というGameObjectができて、再生が終了すると消えます。
CentOS7にPHPBrewインストール


自分でこんなサイトあったらいいなーって思い、たまにはPHPのフレームワークで実装してみようってことで、
今後を考慮し開発環境はPHPバージョン管理可能にしたい。
そこでPHPBrewのバージョン管理興味あったのでインストールしてみました。

### PHPBrewに必要なモジュールをインストール
- PHPインストールのオプションに依存するのでここは皆さんの環境に合わせてインストールしてください
- libcryptはCentOSのリポジトリではインストールできないのでepelリポジトリ追加

```
yum install -y epel-release
vi /etc/yum.repos.d/rpmforge.repo
yum --enablerepo=epel install libmcrypt-devel
```

- apxsを利用するため

```
yum install httpd httpd-devel
```

- PHPBrewを利用するにはphpが必要

```
yum install php libxml2-devel bzip2-devel libxslt-devel 
```

### PHPBrewインストール
- インストール

```
# rootで実行する
cd /usr/local/src
curl -L -O https://github.com/phpbrew/phpbrew/raw/master/phpbrew
chmod +x phpbrew
cp phpbrew /usr/bin/phpbrew
```

- PHPBrewの設定を読み込む。

```
# rootで実行する
vi /etc/bashrc

# これを記載する
phpbrew init

# 設定反映する
source /etc/bashrc
```

- PHPの複数バージョン管理をhogeユーザで利用可能にする

```
# hogeで実行する

vi /home/hoge/.bash_profile

# これを記載する
source ~/.phpbrew/bashrc

# 設定反映する
source /home/hoge/.bash_profile
```

- 5.6.11をインストールする

```bash
# rootで実行。
# hogeでPHPBrewを利用してインストールするとapacheの設定あたりでパーミッションエラーとなるので変更。
chown root:hoge /usr/bin/apxs
chmod 774 /usr/bin/apxs
chown root:hoge /usr/lib64/httpd/modules
chmod 774 /usr/lib64/httpd/modules
chown root:hoge /etc/httpd/conf
chmod 774 /etc/httpd/conf

# hogeで実行
phpbrew install 5.6.11 +default +mysql +gd +json +mbregex +mbstring +mcrypt +readline +session +xml_all +apxs2=/usr/bin/apxs +openssl=/usr -- --with-libdir=lib64
```

### 主な操作

```
# 最新のPHPBrewリストを取得
phpbrew known --update

# インストールされているPHPを表示
phpbrew list

# 利用するPHPの反映。use switchどちらで利用可能
phpbrew use php-5.6.11
phpbrew off
phpbrew switch php-5.6.11
phpbrew switch-off

# 利用できる拡張モジュールリスト
phpbrew variants

# あとから拡張モジュール追加する場合
phpbrew ext install gd

# 拡張の有効無効切り替え
phpbrew ext enable gd
phpbrew ext disable gd

# 現在利用しているphpバージョンのphp.iniを編集
phpbrew config
```
nyagosスクリプト解説 - CMD.EXEで化けさせず、nyagosの中だけプロンプトをカラー化

（コメント欄にて、nyagos 4.1 向け修正点を追記しています）

そのままエスケープシーケンスを %PROMPT% に代入しちゃうと、CMD.EXE を実行した時に色がつかず、エスケープシーケンスコードが「文字」として出てしまう。そこで、nyagos.prompt フックを使おう！

```Lua:.nyagos
-- Simple Prompt for CMD.EXE
nyagos.env.prompt='$L'.. nyagos.env.computername .. ':$P$G$_$$$s'
```

まずは CMD.EXE 向けに普通に %PROMPT% を設定する。自分は VM を含む、いろんな環境で .nyagos を共通化させており(`mklink /S %USERPROFILE%\.nyagos %USERPROFILE%\OneDrive\etc\.nyagos` してる )、PC 名(%COMPUTERNAME%) もプロンプトに含んでいるが、**ここは好みで変えていただきたい**。

```Lua:.nyagos
-- Coloring Prompt for NYAGOS.exe
do
    local prompter=nyagos.prompt
    nyagos.prompt = function(this)
        return prompter('$e[36;40;1m'..this..'$e[37;1m')
    end
end
```

- 一番外側の do～loop は単にローカル変数 prompter の有効範囲を狭めているだけなので、気にしなくてよろしい。
- nyagos.prompt はプロンプトを出す関数が格納されている。これを横取りする。
- nyagos.prompt は第一引数に %PROMPT% の内容が渡される。別に nyagos.env.prompt から得ても良いが、nyagos.prompt を入れ子などした場合、ここに改変された後のプロンプトのフォーマット文字列が入ってくる可能性があるので、全てのプロンプト書き換え関数を活かすのであれば、引数の方を使った方がよろしい
- nyagos.prompt を実行するのは nyagos.exe だけなので、ここで前後にエスケープシーケンスを挟み、prompter に退避した**旧のnyagos.prompt**を呼び出してプロンプトを表示させる。

### 余談だが

自分はプロンプトに改行コードを入れてる。nyagos はコマンドラインが長い場合、折り返さず、横にスクロールさせる。これは倍角文字列が行の一番最後で表示されて行を跨いだ場合、コンソールが勝手に半角スペースを挟んでしまい、文字がどこにあるかをプログラムが把握できなくなってしまうのを避けるためにとった処置だ。だが、このせいで編集の空間が小さくなってしまう。改行を入れてるのは、できるだけ編集の空間を広げようという苦肉の策なのだ。(´・ω・｀)
直接requireされているreact-jadeのファイルをwatchifyできるようにする

# 対象バージョン
- [jadejs/react-jade](https://github.com/jadejs/react-jade) :: v2.4.0

# react-jadeのインライン展開

react-jadeはbrowserify用のtransformを提供しており、jadeファイルをコンパイルして生成したjsコードを[substack/brfs](https://github.com/substack/brfs)と同じようにインライン挿入することができます。

# watchifyにjadeファイルの変更が伝わらない
[substack/brfs](https://github.com/substack/brfs)と同じようにwatchifyによる差分更新をしたいのですが、現状のreact-jadeが提供するbrowserify用のtrasformは'file'イベントを発火しないため、watchifyがjadeファイルの変更を探知してくれません。そのためjadeファイルを編集するたびに、それをrequireしているjsファイルも更新(もしくはtouch)しなければなりません。

# 自分で書く
react-jadeのtransformがfileイベントを発火するように修正してもいいですが、自分が欲しいのはcomfileFileだけだったのでスクラッチで小さいtransformを書いてみました。

```
var reactJade = require('react-jade');
var staticModule = require('static-module');
var path = require('path');

module.exports = transform;

function transform(file) {
  var modules = {
    "react-jade": {
      "compileFile": compileFile,
    },
  };
  var vars = {
    __dirname: path.dirname(file)
  };
  var sm = staticModule(modules, {vars: vars});
  return sm;

  function compileFile(file, localOptions) {
    sm.emit('file', file); // これが必要
    return reactJade.compileFile(file, localOptions);
  }
}
```
static-moduleはjsコードを構文解析した上で特定モジュールの関数呼び出しを静的に評価しインライン展開します。上の例では、"react-jade"というモジュールのcompileFile関数を呼び出している文があれば、そこだけ静的に評価します。その静的評価の中でfileイベントを発火するように書けばwatchifyに依存ファイル情報が追加されます。

# jadeファイル間の依存は未対応
記事タイトルの通りこの実装はjsコードからrequireされているjadeファイルだけwatchします。つまり、jadeファイルからincludes構文などで参照されているjadeファイルには対応出来ていませんので注意してください。(jadeの`compileClientWithDependenciesTracked`のようにjadeファイル間の依存を簡単に取得出来ればいいのですが...)
ATOMのフォント


Japanese-Menuが設定の日本語化にも1.1.0から対応し始めている。

ATOMのフォント設定ってなぜかEDITORの表示エリアだけに反映されて、その他の部分（メニュー、タブ、ステータスバー等々、ツリービューもかな？）、もちろん設定画面にも反映されないようなので「中華フォントがあああああ」とか記事を見る割にはその辺は変わってなくても気にならないのがいつも疑問だった。

ま、解決方法が乗ってないわけじゃないのだが、個人のスタイルシートで

```less:style.less
atom-workspace {
  font-family:Consolas,"ヒラギノ角ゴ Pro";
}
```

atom-workspace下のフォントをまとめて指定しろってことなんだが・・

ただ、これって設定画面のフォント指定ってなんのためのGUIやねん！！

と思うだけなんだけど。
あそこのフォント指定を拾うような記述はできんの？と。

Macだとそこまでフォントは気にならないけど、会社で見るWindows版はほんと気になるので、上記でフォントは違うけど設定してる。
Macのショートカットキーのチートシートを呼び出す神アプリCheatSheetをインストールする

#初めに
Macのショートカットキーのチートシートを⌘(command)を長押しするだけで呼び出すことができる超便利なアプリ、
その名も<b>CheatSheet</b>を見つけたので、それをターミナルを駆使してインストールする手順を書いてみます。

#インストールに必要な環境を構築する
まず初めにHomebrewをインストールします。
[Hombebrew](http://brew.sh/)は、Macにソフトウェアやライブラリをインストールするパッケージ管理システムです。
##Command Line Tools for Xcodeをインストール
Homebrewをインストールするには、Command Line Tools for Xcodeが必要です。
注：事前にXcodeがインストールされていて、ライセンス使用許諾契約に同意済みであることが前提です。

ターミナルで以下のコマンドを打ちます。

```
$ xcode-select --install
```

そうすると
>コマンドライン・エベロッパ・ツールが必要です。
今すぐインストールしますか？

と聞かれるので、
1.インストールを押下します
2.使用許諾契約画面が表示されるので、同意します
3.Command Line Tools for Xcodeのインストール完了です！

これでHomebrewをインストールする環境が整いました。

##Homebrewをインストール
[Hombebrewのサイト](http://brew.sh/)にインストール実行コマンドが記載されているので、それをコピペして実行すれば完了です。

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

途中でEnterの入力とパスワードを求められます。
パスワードはお使いのマシンのパスワードで大丈夫だと思います。

インストールが終わると、brew doctorコマンドを実行するように要求されるので実行します。
brew doctorはインストールやその後の使用に問題がないことを確認するためのコマンドです。

```
$ brew doctor
Your system is ready to brew.
```

このように表示されれば問題ありません。

念のため、バージョンの確認と、アップデートを行っておきます。

```
$ brew -v
Homebrew 0.9.5

$ brew update
```

アップデートは時々行っておくといいらしいです。

これでHomebrewのインストールは完了です。

##homebrew-caskをインストール
次にHomebrewの拡張であるhomebrew-caskをインストールします。
これを使えばコマンドで様々なアプリがインストールできます。

```
$ brew install cask
```

これだけでおしまいです。
これを使って、好きなアプリを探せます。

```
$ brew cask search
```

多分沢山ヒットしたアプリが表示されると思いますが、その中に今回の目的であるcheatsheetもあると思います。

#CheatSheetをインストール
以下のコマンドを打ってCheatSheetが本当にあるか確認しましょう。

```
$ brew cask search cheatsheet
```

ヒットすれば表示されるはずです。

ではcheatsheetの情報を取得してみましょう。

```
$ brew cask info cheatsheet
```
ここで
>Not installed

と表示されていることを確認します。
確認できたらいよいよcheatsheetのインストールです。

```
$ brew cask install cheatsheet
```

これでインストールは完了です。

user/'ユーザ名'/Applications/配下にインストールされているはずです。
そこにあるcheatsheet.appを起動すれば、いつでも⌘長押しで呼び出すことができます。

---

cheatsheetの便利なところは、何よりも簡単に呼び出せて、いつでも確認できる手軽さ！
だけでなく、起動しているアプリに対応したショートカットキーをちゃんと表示してくれるところ！
kobitoならkobitoの、ターミナルならターミナルのショートカットキーを表示してくれます。

これでショートカットキーを使いこなして作業を快適にしていきましょう。

因みに、cheatsheetは[こちら](http://www.cheatsheetapp.com/CheatSheet/)から普通にダウンロードしても使えます。
Yahooショッピングの購入数制限

Yahoo デベロッパーネットワーク　ご担当者様

Yahooショッピングでの商品アップロードCSVについての質問です。
http://developer.yahoo.co.jp/webapi/shopping/upload_format.html
こちらのページを拝見させていただきました。

「購入数制限」については「半角数字のみ。1～999を入力」と記載されていますが、一度設定したあと、購入数制限を解除する(制限しないようにする)には、「sale-limit」の項目に何も入れずにCSVを作成すればよいのでしょうか？

ご回答よろしくお願いします。
Firefox 設定カスタマイズ

##Firefox 設定カスタマイズ
業務上必要になり、設定ファイルをVBSで作成。
osバージョン取得して、フォルダパスを設定。
もっと細かくできるけれど、WinXPじゃなかったらWin7ぐらいの判断で用件としてはたりるので。

```
Set nwk = WScript.CreateObject("WScript.Network")
Set fso = CreateObject("Scripting.FileSystemObject")

tmpUserName = nwk.UserName

Dim strComputer
Dim Wmi
Dim colTarget
Dim strWork
Dim objRow
Dim aData

strComputer = "."
Set Wmi = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colTarget = Wmi.ExecQuery( "select Version from Win32_OperatingSystem" )
For Each objRow in colTarget
  strWork = objRow.Version
Next
aData = Split( strWork, "." )
strWork = aData(0) & "." & aData(1)

if CDbl( strWork ) = 5.1 then
  'WinXP
  tmp = "C:\Documents and Settings\" & tmpUserName & "\Application Data\Mozilla\Firefox\Profiles"
else
  'Win7
  tmp = "C:\Users\" & tmpUserName & "\AppData\Roaming\Mozilla\Firefox\Profiles"
end if

If fso.FolderExists(tmp) Then
  Set src = fso.GetFolder(tmp) ' 対象フォルダの指定
  '指定のフォルダに格納された各サブフォルダを処理する
  tmpfolder = ""
  For Each FolderName In src.Subfolders
    tmpfolder = FolderName
    If fso.FolderExists(tmpfolder) Then
      Set oLog = FSO.CreateTextFile(tmpfolder & "\user.js")
      '起動時に開くページをホームページにする
      oLog.WriteLine("user_pref('browser.startup.page', 1);")
      '起動時のホームページ
      oLog.WriteLine("user_pref('browser.startup.homepage','http://www.yahoo.co.jp');") 	    
      '新規タブ起動時のホームページ
      oLog.WriteLine("user_pref('browser.newtab.url', 'http://www.yahoo.co.jp');")
      'ページ先読みを無効
      oLog.WriteLine("user_pref('network.prefetch-next',false);")
      'バックグラウンドでタブ読み込み無効
      oLog.WriteLine("user_pref('browser.tabs.loadDivertedInBackground', false);")
      'Webブラウザの既定設定画面表示無効
      oLog.WriteLine("user_pref('browser.shell.checkDefaultBrowser', false);")
      'アップデート確認無効
      oLog.WriteLine("user_pref('app.update.enabled', false);") 
      oLog.Close()
      Set oLog = Nothing
    End If
  Next
End If
```
c++ builder > JSON > ファイル読込み > キー指定で値読込み > pairObj = jsonObj->Get(L"name");

http://qiita.com/7of9/items/41d8b9adb06a6e930058
にて書き出したファイルからの読み込み

"name"`というキーの値を取得する。

```cpp
#include <DBXJSON.hpp> // for JSON
#include <memory> // for unique_ptr

...

	std::unique_ptr<TStringList> slread(new TStringList);
	slread->LoadFromFile(L"test.json");

	TJSONObject *jsonObj = new TJSONObject();
	String jsonKey, jsonValue;
	TJSONPair *pairObj;

	for(int li=0; li < slread->Count; li++) { // file line index
		String jsonText = slread->Strings[li];
		jsonObj = dynamic_cast<TJSONObject*>(TJSONObject::ParseJSONValue(jsonText));

		pairObj = jsonObj->Get(L"name");
		if (pairObj != NULL) {
			jsonValue = pairObj->JsonValue->Value();
			ShowMessage(L"name:" + jsonValue);
		}
	}
	jsonObj->Free();
```

こちらが参考になった。
http://www.gesource.jp/weblog/?p=4567
2015-07-25 c++ builder > JSON > ファイル読込み > ParseJSONValue() / Size() / JsonString->Value() / JsonValue->Value() > メモリリークコード修正

http://qiita.com/7of9/items/41d8b9adb06a6e930058
にて書き出したファイルからの読み込み

## code v0.1 > メモリリークあり

```cpp
#include <DBXJSON.hpp> // for JSON
#include <memory> // for unique_ptr

...

	std::unique_ptr<TStringList> slread(new TStringList);
	slread->LoadFromFile(L"test.json");

	TJSONObject *jsonObj = new TJSONObject();
	String jsonKey, jsonValue;
	TJSONPair *pairObj;

	for(int li=0; li < slread->Count; li++) { // file line index
		String jsonText = slread->Strings[li];
		jsonObj = dynamic_cast<TJSONObject*>(TJSONObject::ParseJSONValue(jsonText));

		for(int pi=0; pi < jsonObj->Size(); pi++) { // pair index
			pairObj = jsonObj->Get(pi);
			jsonKey = pairObj->JsonString->Value();
			jsonValue = pairObj->JsonValue->Value();
			ShowMessage(jsonKey + ":" + jsonValue);
		}
	}
	jsonObj->Free();

```

## code v0.2 > メモリリーク修正

(追記 2016/07/28)

<font color=red>上記の実装ではjsonObj に関してメモリリークが生じることをFastMMで確認した。</font>

jsonObj を定義する時に`jsonObj = new TJSONObject();`をしているが、そのjsonObjを使わずに`jsonObj = dynamic_cast<...>`としているため、メモリリークが発生している。


以下が正しいコードと思われる。


```cpp
#include <DBXJSON.hpp> // for JSON
#include <memory> // for unique_ptr

...

	std::unique_ptr<TStringList> slread(new TStringList);
	slread->LoadFromFile(L"test.json");

	TJSONObject *jsonObj;
	String jsonKey, jsonValue;
	TJSONPair *pairObj;

	for(int li=0; li < slread->Count; li++) { // file line index
		String jsonText = slread->Strings[li];
		jsonObj = dynamic_cast<TJSONObject*>(TJSONObject::ParseJSONValue(jsonText));

		for(int pi=0; pi < jsonObj->Size(); pi++) { // pair index
			pairObj = jsonObj->Get(pi);
			jsonKey = pairObj->JsonString->Value();
			jsonValue = pairObj->JsonValue->Value();
			ShowMessage(jsonKey + ":" + jsonValue);
		}
	}
	jsonObj->Free();

```


### 備考
(追記 2019-05-07)

フォルダをJSONのvalueとしている場合は、下記のような対応をする必要がある場合がある。

```cpp
		// フォルダに使われる"\"の扱いによるエラー対応のため
		jsonText = StringReplace(jsonText, L"\\", L"\\\\", TReplaceFlags()<<rfReplaceAll);
```
2015-07-25 c++ builder XE4, 10.2 Tokyo > JSON > ファイル書出し > AddPair() / ToString() | 2019-05-21 コードの間違い

```txt:動作確認
C++ Builder XE4
C++ Builder 10.2 Tokyo
```

AddPair()にてキーと値を元にTJSONObjectに追加して、それをファイル書き出しする。

http://www.gesource.jp/weblog/?p=6067
にてDelphiで書かれているコードを参考にした。

```cpp
#include <DBXJSON.hpp> // for JSON
#include <memory> // for unique_ptr

...
	TJSONObject *json;

	json = new TJSONObject();

	json->AddPair(L"name", L"John Smith");
	json->AddPair(L"age", L"33");

//	ShowMessage(json->ToString());

	std::unique_ptr<TStringList> sl(new TStringList);
	sl->Add( json->ToString() );
	sl->SaveToFile(L"test.json");

	json->Free();
```

```json:test.json
{"name":"John Smith","age":"33"}
```

AddPair(L"key", NULL);
とした場合は、このペアは追加されないようだ。

### コードの間違い
(追記 2019/05/21)

上記の実装では`json->Free();`としている。
`delete json;`が正しいだろう。

- https://stackoverflow.com/questions/56017235/c-builder-10-2-tokyo-json-replace-jsonvalue-causes-access-violation-with

> Never directly call `TObject::Free()` in C++, use the delete operator instead:

```cpp
#include <DBXJSON.hpp> // for JSON
#include <memory> // for unique_ptr

...
    TJSONObject *json;

    json = new TJSONObject();

    json->AddPair(L"name", L"John Smith");
    json->AddPair(L"age", L"33");

//  ShowMessage(json->ToString());

    std::unique_ptr<TStringList> sl(new TStringList);
    sl->Add( json->ToString() );
    sl->SaveToFile(L"test.json");

    delete json;
```

### 10.2 Tokyo対応 (2019-05-29)

10.2 Tokyoになり、インクルードファイルが変わった。

- [C++ Builder 10.2 Tokyo > JSON > DBXJSON.hppでなくSystem.JSON.hppをインクルードする (移行: XE4 -> 10.2Tokyo)](https://qiita.com/7of9/items/393ecb6af625a79fbe79)



```.cpp
#include <System.JSON.hpp>
#include <memory>

void __fastcall TForm1::Button2Click(TObject *Sender)
{
	TJSONObject *json;

	json = new TJSONObject();

	json->AddPair(L"name", L"John Smith");
	json->AddPair(L"age", L"33");

//  ShowMessage(json->ToString());

	std::unique_ptr<TStringList> sl(new TStringList);
	sl->Add( json->ToString() );
	sl->SaveToFile(L"test.json");

	delete json;
}
```
「Node.js を選ぶとき 選ばないとき」を読んだメモ

# [Node.js を選ぶとき 選ばないとき](http://www.slideshare.net/tricknotes/nodejs-27589695) 18p

* Node.jsライブラリにはRuby/Railsに影響を受けているものが多い
    * [Sinatra](http://www.sinatrarb.com/) <--> [Express](http://expressjs.com/)
    * [Rails](http://rubyonrails.org/) <--> [Sails](http://sailsjs.org/)
    * [Sprockets](https://github.com/sstephenson/sprockets) <--> [Mincer](http://nodeca.github.io/mincer/)
    * [Rails(generator)](http://railsguides.jp/generators.html) <--> [yoeman](http://yeoman.io/)

## express

* とてもシンプルだが自由度が高いために整理するのに工夫が必要。p28

```
mkdir prj1 && cd prj1
npm install express --save
```

```js:main.js
var express = require('express');
var app = express();
app.get('/', function(req, res) {
  res.send('Hello world');
});
app.listen(3000);
console.log('Listening :3000');
```

```bash:
node main.js
```

* http://localhost:3000 にアクセスすると`Hello world!`が表示される。

## sails


* model周りが貧弱(関連を扱えない、マイグレーションがない) p33

* 最初に大長編 Gruntfile.js を生成する p34

## grunt (ビルドツール)

* http://gruntjs.com/
* rubyで言うところの rake + guard + webrick がこれひとつで。
* 設定を毎回書くのは手間 p37

## nodeos (OS？)

* [nodeos](http://nodeos.github.io) p50

## ネイティブGUIアプリが作れる node-webkit

* [node-webkit](https://github.com/rogerwang/node-webkit) p51
    * [List of apps and companies using nw.js · nwjs/nw.js Wiki](https://github.com/nwjs/nw.js/wiki/List-of-apps-and-companies-using-nw.js)
    * [HTML5＋CSS3＋JSでネイティブGUIアプリが作れる、node-webkitを触ってみる : アシアルブログ](HTML5＋CSS3＋JSでネイティブGUIアプリが作れる、node-webkitを触ってみる : アシアルブログ)

## chrome extensionの例 p61

![aa.png](https://qiita-image-store.s3.amazonaws.com/0/25728/0221f482-f836-cfe5-dbb7-20b3ee19d95f.png)

* 通知の部分は単純なpush通知なので [Socket.IO](http://socket.io/) がフィット p64

## socket.io

```bash:
npm install socket.io
```

* [Node.js + Socket.IO + jQuery で最小構成チャット - Qiita](http://qiita.com/naga3/items/bdf6176537a5ac77a9b5)

![chat.png](https://qiita-image-store.s3.amazonaws.com/0/25728/5eabfc3d-f745-3c30-f322-1240703bf0f2.png)

* ブラウザを開いている間だけデータを受信する。

リアルタイム通信は他に以下がある p92

* WebSocket
* Server-Sent Events
* XHR Polling
* Pusher

## イベント発火の記述方法違い p79

```js:DOMの場合
jQuery('form').trigger('form');
```

```js:nodejsの場合
stream.emit('fetch', data);
```
Nginx - 特定のUserAgentを転送する設定

Nginxの特定のUserAgentを転送する設定をしたのでメモ
設定ファイルをif文で記述できるのでいろいろと応用ができそう

### Nginxの設定
```
  location / {

    if ($http_user_agent ~ <UserAgent>) {
      proxy_pass http://172.30.10.101;
    }

  }
```
particles.jsを使って動く星を描くHugoのテーマを作成した


##hugo-theme-air

[particles.js](https://github.com/VincentGarreau/particles.js)が思った以上にカッコ良かったので、触ってみようかなと思い、作りました。

https://github.com/syui/hugo-theme-air

![](https://raw.githubusercontent.com/syui/hugo-theme-air/master/images/screen.gif)

Demo : http://syui.github.io/hugo-theme-air/

基本的に以下でプレビューできると思います。

```bash:
$ git clone https://github.com/syui/hugo-theme-air

$ cd hugo-theme-air

$ cp config.toml.backup config.toml

$ hugo new post/foo.md

$ hugo server
---------------------------------
$ curl 127.0.0.1:1313/hugo-theme-air 
```

ビルドとアップロードは以下の様な感じのコマンドを叩けばよいのではないかと思います。

```
# build
$ hugo 

$ cd public

# make repository
# export YOUR_REPOSITORY="https://github.com/username/repository.git"
$ git init
$ git remote add origin $YOUR_REPOSITORY
$ git add .
$ git commit -m "first commit"
$ git push -u origin master

# push branch:gh-pages
$ git checkout -b gh-pages
$ git commit -m "open pages"
$ git push -u origin gh-pages

# preview
$ curl username.github.io/repository
```

動く背景をカスタマイズするには、`static/js/particles.js`を編集します。値はドキュメントの方を読んでください。

https://github.com/VincentGarreau/particles.js/blob/master/README.md#options

あと、テーマを作成したら[spf13/hugoThemes/](https://github.com/spf13/hugoThemes/)にて、[.gitmodules](https://github.com/spf13/hugoThemes/blob/master/.gitmodules)に`Pull Request`すると良いかもです。

```bash:.gitmodules
+ [submodule "theme-name"]
+   path = theme-name
+   url = https://repository-url.git
```

##particles.js

[particles.js](https://github.com/VincentGarreau/particles.js)

Configure, export, and share your particles.js configuration on CodePen: 
http://vincentgarreau.com/particles.js/

基本的に、`node`や`bower`で使えるので、以下のようにインストールします。

```bash:
$ npm install particles.js

or

$ bower install particles.js --save
```

設定ファイルに書く場合は、本家のリポジトリにサンプルが置いてあります。例えば、`bower`を使う場合は以下。テーマなどに使う場合は、直接書き込まず、このような設定ファイルを用いると楽かもしれませんね。

```bash:
$ git clone https://github.com/VincentGarreau/particles.js

# bower
$ cat particles.js/bower.json
{
  "name": "particles.js",
  "main": "particles.js",
  "homepage": "https://github.com/VincentGarreau/particles.js",
  "authors": [
    "Vincent Garreau <vin.garreau@gmail.com>"
  ],
  "description": "A lightweight JavaScript library for creating particles.",
  "keywords": [
    "particle",
    "particles"
  ],
  "license": "MIT",
  "ignore": [
    "**/.*",
    "node_modules",
    "bower_components",
    "test",
    "tests"
  ]
}
```
phaserのサンプルを動かす時つまづいた点

## 参考

* [HTML5ゲームエンジンPhaserのサンプルゲームを動かす - Qiita](http://qiita.com/kawax/items/493e17100550d2278ae6)
* [node.js - Cannot install NodeJs: /usr/bin/env: node: No such file or directory - Stack Overflow](http://stackoverflow.com/questions/26320901/cannot-install-nodejs-usr-bin-env-node-no-such-file-or-directory)

## 手順

* Debian8にて作業

```bash:nodejsの環境をインストール
sudo apt-get install -y npm node
sudo ln -s /usr/bin/nodejs /usr/local/bin/node
sudo npm install -g grunt-cli
```

```bash:サンプル
git clone https://github.com/photonstorm/phaser-examples.git
cd phaser-examples/
```

```bash:node_modules/フォルダにパッケージが入る。
npm install
```

```bash:port8001でLISTEN
grunt connect
```

## つまづいた点

* http://localhost:8001/examples/basics/01%20-%20load%20an%20image.js が404エラー
    * [seven basic examples are with link broken · Issue #83 · photonstorm/phaser-examples](https://github.com/photonstorm/phaser-examples/issues/83)

```diff:examples/_site/examples.json
  "basics": [
    {
-     "file": "01+-+load+an+image.js",
+     "file": "01+load+an+image.js",
      "title": "01 - load an image",
      "jsbin": "http://jsbin.com/zagob/1/edit?js,output"
    },
    {
-     "file": "02+-+click+on+an+image.js",
+     "file": "02+click+on+an+image.js",
      "title": "02 - click on an image",
      "jsbin": "http://jsbin.com/zagob/6/edit?js,output"
    },
    {
-     "file": "03+-+move+an+image.js",
+     "file": "03+move+an+image.js",
      "title": "03 - move an image",
      "jsbin": "http://jsbin.com/zagob/7/edit?js,output"
    },
    {
-     "file": "04+-+image+follow+input.js",
+     "file": "04+image+follow+input.js",
      "title": "04 - image follow input",
      "jsbin": "http://jsbin.com/zagob/9/edit?js,output"
    },
    {
-     "file": "05+-+load+an+animation.js",
+     "file": "05+load+an+animation.js",
      "title": "05 - load an animation",
      "jsbin": "http://jsbin.com/zagob/10/edit?js,output"
    },
    {
-     "file": "06+-+render+text.js",
+     "file": "06+render+text.js",
      "title": "06 - render text",
      "jsbin": "http://jsbin.com/zagob/11/edit?js,output"
    },
    {
-     "file": "07+-+tween+an+image.js",
+     "file": "07+tween+an+image.js",
      "title": "07 - tween an image"
    }
  ],
```

# nodejs入門

* [いまアツいJavaScript！ゼロから始めるNode.js入門〜5分で環境構築編〜](http://liginc.co.jp/web/programming/node-js/85318)

```js:example.js
var http = require('http');
 
http.createServer(function (request, response) {
  response.writeHead(200, {'Content-Type': 'text/plain'});
  response.end('Hello World\n');
}).listen(8124);
 
console.log('Server running at http://127.0.0.1:8124/');
```

```bash:実行
node example.js
```

* http://127.0.0.1:8124/ にアクセスすると`Hello World`が表示されることを確認。
技術英語 > We cannot [preclude] the possibility that there is ...


@ Start Trek Voyager > エピソード: Eye of the needle.

会議においてTuvokが言った言葉

> We cannot preclude the possibility that there is ...

...がある可能性は排除できない。

<hr>

http://ejje.weblio.jp/content/preclude

> 1. 〈事を〉起こらないようにする，不可能にする; 排除する.

<hr>
https://github.com/semsogutlu/Prevent-user-to-upload-file-more-than-4mb

> Precluding user from upload a file that is bigger than 4MB.

<hr>
畜生ォ･･･持っていかれたァ・・・ッッ！！特定のEmacs拡張に奪われたキーを取り戻す方法


人気のあるキーバインドは他の拡張によって上書きされてしまうことってありますよね。
そこで、あらかじめ変数に関数名を保存しておき、拡張が読み込まれ上書きされた後に元に戻します。

ここではキーバインド`c-tab`に紐づけている機能が奪われないようにしています。

```el
;; 奪われたくないキーバインド
(setq my-key-c-tab (kbd "<C-tab>"))
(global-set-key my-key-c-tab 'tabbar-forward-tab)

;; .
;; .
;; .

;; キーに紐付いている関数を保存
(setq my-func-c-tab (key-binding my-key-c-tab))
;; 拡張の読み込み
(require 'magit)
;; mode-mapを特定し、それに紐付いているキーバインドを取り戻す
(define-key magit-mode-map my-key-c-tab `,my-func-c-tab)

;; 同様に他の拡張にも
(require 'org)
(define-key org-mode-map my-key-c-tab `,my-func-c-tab)
```

これで安心。

## その他対処方法

独自のマイナーモードを作るという手もあるようです。
:link: http://stackoverflow.com/questions/683425/globally-override-key-binding-in-emacs
GMO VPSサーバに取り急ぎECCUBE3.0.1のインストール

共有サーバ（レンタルサーバ/heteml→なんかシステムエラー発生）だったので、
とりあえずVPSサーバにインストール。
KAGOYAさんのVPSは問題なくインストール可能。
GMOVPSサーバでちょっとばかし苦戦したので、メモ

サーバ条件
PLESK10/PHP 5.3.3/mysql 5.1.73

1:まずドメインを反映するとデフォルトで、httpdocs になってしまうので、html に変更

2:html より上の階層にアクセスできるように
open_basedir の値を変更

```{DOCROOT}/:/tmp/:/var/www/vhosts/ドメイン名/```

これで、html(httpdocs)より上のPHPも動かせる(ちなみにPleskの管理画面から)

3:インストールSTEP5 でタイムゾーンを設定しろ！と怒られる。
PLESKのシステム時間では、ちゃんと設定されてるんだけど、なぜか反映されないので
php.ini に以下を追加(ちなみにPleskの管理画面から)

```lang:php.ini
[Date]  
; Defines the default timezone used by the date functions  
; http://php.net/date.timezone  
date.timezone = Asia/Tokyo
```

とりあえず無事にインストール完了。

ちなみに、インストールは何度か失敗するのが普通だと考えるのが妥当。
インストール完了するまでやり続けることが大事なのは
1系の頃から感じてたので、諦めずにやる！！

次回は、Twigのカスタマイズをガンガンやってみる。

* * *
補足：ECCUBE3.0 の決済プラグイン情報：2015年7月度
※決済モジュールとは呼ばないらしい。

決済プラグインに関して、主要各社に問い合わせてみたところ、ほとんどが未定という回答。
現在は、ECCUBEペイメントがとりあえず利用可能（但し、直接問い合わせが必要）
ベリトランス社は、10月頃を予定。
それ以外はみんな未定！とのこと。水面下で動いてるとこもあると思いますが。。。
* * *
React体験


2015/07/24はReactで遊んでみたぞい（今更）。以下全然体系だってない感想。

# setStateの反映が遅い件

    <p>{this.state.text}</p>

みたいなテキストを、いくつかのメソッドからappendしながら構築したい。

しかし、setStateの反映がrenderのタイミングなので

    setState({text: this.state.text + str})

みたいなジツはつかえん。

かといって、それ用のフィールドを作るのもクソ設計感ある。

やはりFluxか……

## 追記

フィールド作っちゃったほうがシンプルっぽい。

stateは表示に直結するもの、という扱いが良さそう。なんだったら要らないかも知れないけど、コンポーネントのupdateのトリガーになる存在なので一応要るのか。

このフィールドを別のクラスに切り出した存在がFluxのStoreちゅーことになりそう。

Storeの変更をcallbackで拾ってsetStateの流れ。

ここは理解。

だが、それならトップレベルだけがStoreとやりとりするってのがひっかかるな。

state持ってるコンポーネントからStoreにcallbackを仕掛けた方がコンポーネントの責任が明確な感ある。

Storeとトップレベルコンポーネントの両方がデータ集約しちゃうからね。

# Fluxよくわからんぞいや

まず説明の図に箱がいっぱいあるのがヤバイ。

View(React)→Action→Dispatchcer→Store→View

という４者の一方向に回るメッセージ構造が基本らしい。

気になるのはStoreで、こいつが全ての情報を握っているのだが、Reactを使うとViewもstateを持つわけで、なんか二重管理感がある。

Storeに変更があったら即イベント通知してViewを更新する的な感じだと思うんだけど、めんどくさい……

# 結局stateはどこへ置くべきか

トップレベルにまとめて置くプランと、コンポーネント毎に置いて、上から参照するプラン。どっちがいいんだ。

トップレベルに置くと、トップレベルのコンポーネントがMVCでいうModelに相当するようになる。トップレベル以下はstateは持たず、propsで反映されるだけ。これはこれで良い。

コンポーネントごとであれば、コンポーネントの責任範囲が明確になってこれもこれで良い。

はてさて

# JSX構文

renderは一つのコンポーネントしか返せないという言い回しを聞くことがあるが、一つのJSX文が返せるのも一つのコンポーネントのようだ。

renderで最終的に一つのコンポーネントになるようにしたとしても、途中の関数で複数のコンポーネントを返すようなJSXを書くと変換エラーになる。

その辺はちょっと柔軟性がない。

# ES6

jsxのharmonyオプションっつーのが面白そうだったので使ってみた。

連想配列でメソッドを定義するのが楽ちん。

```
hoge = {
    method1() {...},
    method2() {...},
}
```

無名関数も

    (arg) => {...}

と書けて、全般的にfunctionをタイプしなくて良いみたい。

実際忘れてるところ以外はタイプしてないし、今消したのでfunctionという単語がゼロですよゼロ。

JavaScriptだとめっちゃ書く単語なのにね。

# 感想

だいたいやり方は分かってきた。

Viewのみの薄いフレームワークなので、基本はまぁそんな難しくはないなー

でもいろいろ組み合わせていくといろいろなことができるので、一朝一夕というわけにはいかなさそう。
AngularJSでデータが入力されている場合に要素を表示する方法

# ng-showの利用

ng-showを使ってHTML要素の表示を制御していきます。

```html
<!DOCTYPE html>
<html ng-app>
<head>
    <meta charset="utf-8">
    <title>practice Angular.js</title>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.3/angular.min.js"></script>
</head>
<body>
    <div>
        <label>Name:</label>
        <input type="text" ng-model="yourName" placeholder="Enter a name here">
        <hr>
        <h1 ng-show="!!yourName">Hello, {{yourName}}!</h1>
    </div>
</body>
</html>
```

まず、テキストボックスに入力したテキストは、yourNameという変数に入ります。

次に、ng-show="!!yourName"の部分で、yourNameが空ではない場合に当該の要素を表示するようにしています。これでテキストボックスに何かしらのテキストが入力されると、Hello, {{yourName}}!が表示されるようになります。

また、一度入力した文字をすべて消去すると、再度表示されなくなります。
vim使用時の日本語入力を選択状態で、escapeキーもしくはcontrol+[の実行時に英数キーを同時に実行する - Karabiner(旧KeyRemap4MacBook)使用


挿入モードから抜ける場合に日本語入力から英数へ同時に変更するためのKarabinerの設定ファイルの作成(iTerm2,MacVim,Terminalに対応)

`/Users/usename/Application Support/Karabiner/private.xml`を下記に編集

```
<?xml version="1.0"?>
<root>
    <appdef>
        <appname>MacVIM</appname>
        <equal>org.vim.MacVim</equal>
    </appdef>
    <appdef>
        <appname>TERMINAL</appname>
        <equal>com.apple.Terminal</equal>
    </appdef>
    <appdef>
        <appname>ITERM2</appname>
        <equal>com.googlecode.iterm2</equal>
    </appdef>
    <windownamedef>
        <name>VIM</name>
        <regex>.* - VIM.*</regex>
    </windownamedef>
    <item>
        <name>Private Mapping</name>
        <item>
            <name>Custom Vim Change CONTROL_L+BRACKET_RIGHT+EISUU</name>
            <identifier>private.control_bracket_plus_eisuu</identifier>
            <only>MacVIM,TERMINAL,ITERM2</only>
            <windowname_only>VIM</windowname_only>
            <autogen>
                __KeyToKey__
                KeyCode::BRACKET_RIGHT, ModifierFlag::CONTROL_L,
                KeyCode::JIS_EISUU, KeyCode::BRACKET_RIGHT, ModifierFlag::CONTROL_L
            </autogen>
        </item>
        <item>
            <name>Custom Vim Change ESC+EISUU</name>
            <identifier>private.escape_plus_eisuu</identifier>
            <only>MacVIM,TERMINAL,ITERM2</only>
            <windowname_only>VIM</windowname_only>
            <autogen>
                __KeyToKey__
                KeyCode::ESCAPE,
                KeyCode::JIS_EISUU, KeyCode::ESCAPE
            </autogen>
        </item>
    </item>
</root>
```

Karabinerの環境設定画面 > Change Key 内の右上ReloadXMLを実行すると一番上にPrivateMappingが表示されます。

参考リンク
https://pqrs.org/osx/karabiner/index.html.en
https://pqrs.org/osx/karabiner/document.html#privatexml
https://pqrs.org/osx/karabiner/xml.html.en
JavaScriptを使ってSlackのチャンネルに投稿してみる

最近よくSlackを使っているのですが、JavaScript&SlackAPIを使って簡単にSlackにメッセージを投稿する事ができます。

# Slackアカウントを作成する

まずは[Slack](https://slack.com/)でアカウントを作成します。
下の画面が表示されたらOKです。

![slack-chathome-1024x542.png](https://qiita-image-store.s3.amazonaws.com/0/57442/5e2cf6ef-99ed-db4e-dc54-8af15e16135b.png)

# SlackAPIを使用するためのトークン情報を取得する

SlackAPIを使用するためにトークンと言われる認証情報を取得します。
トークンは[SlackAPI](https://api.slack.com/web)のサイトから取得する事ができます。

![slack-webapi-1024x546.png](https://qiita-image-store.s3.amazonaws.com/0/57442/d1c3f4f2-02d9-7b34-3744-90bdf18480b1.png)

# SlackAPIを使って実装する

今回はSlackAPIのpostMessageメソッドを使用して、特定のチャンネルに投稿してみます。

```sample.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>Slack Sample</title>
</head>
<body>
    <a href="#" class="slack-submit">Post to Slack!</a>
 
    <script src="https://code.jquery.com/jquery-1.11.3.min.js"></script>
    <script src="sample.js"></script>
</body>
</html>
```
```sample.js
$(function () {
    $('.slack-submit').on('click', function () {
    var url = 'https://slack.com/api/chat.postMessage';
        var data = {
            token: 'あなたのトークン',
            channel: '#general',
            username: 'oreno-bot',
            text: 'Hello Slack!'
        };
 
        $.ajax({
            type: 'GET',
            url: url,
            data: data,
            success: function (data) {
                alert( 'Can I post to Slack? :' + data.ok );
            }
        });
    });
});
```

上記のHTMLを表示して、「Post to Slack!」リンクをクリックすると、Slackにメッセージが投稿されるはずです。ぜひお試しあれ！
[元ネタの記事はこちら](http://blog.hellopeople.jp/archives/396)です。この記事よりちょっと詳しく書いてあります。
10進数の桁数を求める

符号なし10進整数の桁数を求める関数 `unsigned GetDigit(unsigned)` を作る。
ただし、**引数として0が与えられることはないものとする**。

# 10で割る
整数引数を、0になるまで10で割り続ける。割った回数が桁数。

```c
unsigned GetDigit(unsigned num){
	unsigned digit = 0;
	while(num != 0){
		num /= 10;
		digit++;
	}
	return digit;
}
```

# 常用対数を使う
**自然数** $a$ について、$\\mathrm{floor}(\\mathrm{log}_{10}({a})+1)$ は $a$ の10進桁数である。

```c
unsigned GetDigit(unsigned num){
	return log10(num)+1;
}
```

# 文字列操作を利用して数える
人間の数え方に近い方法。
## C
(`/dev/null`みたいなものはCにないのかなあ...)

```c
#define BUFSIZE 100
unsigned GetDigit(unsigned num){
	char buf[BUFSIZE];
	return sprintf(buf, "%u", num);
	//sprintfは出力に成功した場合、出力した文字数を返す
}
```

## C++

```cpp
unsigned GetDigit(unsigned num){
	return std::to_string(num).length();
}
```
JUnit : private methodsの引数nullの時の例外テストのやり方

JUnitでprivate methodsのnullテストをする際に詰まったので、紹介します。
ついでに、それまでの過程を順を追って説明します。
説明は、コメント文で行います。

## JUnitでのprivate methodのテスト

これは有名ですね。

```java:privateTest.java
public class PrivateTest {
	@Test
	public void test() {
		// Methodを取得します
		// getMethodではなく, getDeclaredMethod
		Method method = Sample.class.getDeclaredMethod("privateMethod", String.class);
		// private methodにアクセスできるようにする。
		method.setAccessible(true);
		Sample sample = new Sample();
		// メソッドを呼び出し、テストする。
		assertEquals(Integer.valueOf(1), (Integer)method.invoke(sample, "A"));
	}
}
```

## JUnitでのprivate methodの例外テスト

調べたら出てきます。

```java:privateTest.java
public class PrivateTest {
	@Test(expected = IllegalArgumentException.class)
	public void test() {
		Method method = Sample.class.getDeclaredMethod("privateMethod", String.class);
		method.setAccessible(true);
		Sample sample = new Sample();
		// メソッドを呼び出し、例外を検知する。
		try {
			method.invoke(sample, ""));
			// invokeで例外が出たらInvocationTargetExceptionをなげる。
		} catch (final InvocationTargetException e) {
			// 投げられた本来の例外を取得する。
			final Throwable throwable = e.getCause();
			// 他の例外ではないかをチェックする。
			if (throwable instanceof IllegalArgumentException) {
				// キャストをして、なげる。
				throw (IllegalArgumentException) throwable;
			} else {
				Assert.fail();
			}
		}
		Assert.fail();
	}
}
```

## JUnitでのprivate methodへの引数nullテスト

本題です。

```java:privateTest.java
public class PrivateTest {
	@Test(expected = NullPointerException.class)
	public void test() {
		Method method = Sample.class.getDeclaredMethod("privateMethod", String.class);
		method.setAccessible(true);
		Sample sample = new Sample();
		try {
			// invoke(Object, Object...)
			// メソッドへ渡す引数が、Object...なので
			// new Object[]{null}として渡す。
			method.invoke(sample, new Object[]{ null }));
		} catch (final InvocationTargetException e) {
			final Throwable throwable = e.getCause();
			if (throwable instanceof NullPointerException) {
				throw (NullPointerException) throwable;
			} else {
				Assert.fail();
			}
		}
		Assert.fail();
	}
}
```
gitのブランチを利用して秘密のフォルダを作る


みなさん、人に見られたくない秘密のファイルはどこに隠してますか？

「決算関連資料_第3四半期」フォルダですか？
「TEMP_20120820」フォルダですか？
それともやはりクラウドでしょうか？

いくらバレにくいフォルダ名をつけてもうっかり開かれるかもしれない・・・。
クラウドに保存するのはさすがにちょっと気が引ける・・・。
zip圧縮して拡張子を変えるのもめんどくさい・・・。
隠しファイル用の専用ソフトを入れるのも、そのソフトを入れた時点で疑われる・・・。

なかなかベストな方法とは言えないですよね。
そこで、gitで秘密ファイルを管理する方法を考えてみました。

gitならインストールされていても不自然ではないですし、
さりげなくスマートにヒミツのファイルを隠すことができます。

## 方法

方法はこんな感じです。

![zukai.png](https://qiita-image-store.s3.amazonaws.com/0/33890/b9e96881-4687-111a-34f6-e1722d4b8ab3.png "無題プレゼンテーション (1).png")

【下準備】
①Gitのリポジトリを作る。
②秘密のファイルを突っ込む。

【PCを人に使わせる時】
③秘密のファイルを秘密のブランチに全部コミットする。
④人に見せる用のブランチにチェックアウトする。

【秘密のファイルを使う時】
⑤人に見せる用のファイルを人に見せる用ブランチにコミットする。
⑥秘密のブランチにチェックアウトする。



うわーめんどくさいですね。
聞いて損しましたね。

## 便利なスクリプト
いちいちリポジトリを作ってcommitだとかcheckoutだとか面倒くさいですよね。
というわけでそこら辺をまとめてやってくれるスクリプトを作りました。
Mac用です。たぶんlinuxでも動きます。


```Bash:make_script.sh

git init

git add .
git commit -m "-"
git checkout -b public

echo "git add .
git commit -m \"-\"
git checkout master
">switch_branch.sh

chmod +x switch_branch.sh

git add .
git commit -m "-"
git checkout master

echo "git add .
git commit -m \"-\"
git checkout public
">switch_branch.sh

chmod +x switch_branch.sh


```

## 使い方

まず先ほどのスクリプトを秘密のフォルダにおきます。

![スクリーンショット 2015-07-24 23.21.05.png](https://qiita-image-store.s3.amazonaws.com/0/33890/7bcf17cf-7f90-5fd7-91cf-16faba8acce8.png "スクリーンショット 2015-07-24 23.21.05.png")

そしてコンソールでそのフォルダに移動し、スクリプトを実行します。

```
$chmod +x make_script.sh
$./make_script.sh
```

すると、以下の処理が行われます。

* リポジトリの作成
* 秘密ブランチにaddしてcommitして公開ブランチにcheckoutするスクリプトの作成
* 公開ブランチの作成
* 公開ブランチにaddしてcommitして秘密ブランチにcheckoutするスクリプトの作成

新しいスクリプトファイルが増えているはずです。
とにかく、これにて下準備は完了です。
ここまでの手順は一度だけやればOKです。


![スクリーンショット 2015-07-24 23.21.38.png](https://qiita-image-store.s3.amazonaws.com/0/33890/633fb065-336e-5604-0792-a0e485c5b65d.png "スクリーンショット 2015-07-24 23.21.38.png")

ではでは秘密のファイルを追加していきましょう。

![スクリーンショット 2015-07-24 23.22.10.png](https://qiita-image-store.s3.amazonaws.com/0/33890/e3e7035d-81fc-6f9e-066a-1534e06bb4bc.png "スクリーンショット 2015-07-24 23.22.10.png")

秘密のファイルを追加し終わったら、社交モードに切り替えます。

```
$./switch_branch.sh
```

消えた!?

![スクリーンショット 2015-07-24 23.22.37.png](https://qiita-image-store.s3.amazonaws.com/0/33890/2c2609fa-c057-1a0b-ddf3-51ffa201229b.png "スクリーンショット 2015-07-24 23.22.37.png")

社交モードに切り替わりました。
これで誰も自分のことを猫好きだとは気が付かないでしょう。
世間体を整えるために適当に当たり障りのないファイルを追加しましょう。
これで対外的には自分はただの犬好きです。

![スクリーンショット 2015-07-24 23.22.49.png](https://qiita-image-store.s3.amazonaws.com/0/33890/f3346762-636b-3713-24b7-f68f7445a83d.png "スクリーンショット 2015-07-24 23.22.49.png")

猫画像に癒されたくなったらまた同じスクリプトを実行すれば・・・

```
$./switch_branch.sh
```

いつでも癒されることができます。
スクリプトを実行するたびにモードが切り替わります。

![スクリーンショット 2015-07-24 23.23.03.png](https://qiita-image-store.s3.amazonaws.com/0/33890/08aff6eb-8d8c-580f-c88c-40c4f5cafa03.png "スクリーンショット 2015-07-24 23.23.03.png")

## 終わりに

うっかりgithubに公開しないようにしましょう。

![zukai.png](https://qiita-image-store.s3.amazonaws.com/0/33890/b9e96881-4687-111a-34f6-e1722d4b8ab3.png "無題プレゼンテーション (1).png")
文字を入力したらカーソルの前の文字が上書きされてしまう(mac)

Macで起こっていますが、Windowsでは確認できていません。

AndroidStudioに変えてからというもの、
かなりイライラしていた問題がありました。

それは… **文字を入力したら直前の文字が上書きして消える！！**
例えば「テストコメント」と入力しているときに、
「です」と入力すると「テストコメンです」となってしまう具合。

超不便で超腹たってました。
しかしこれも今日でオサラバ！！

快適コーディング生活がカムバックしましたひゃっほい！

## x.解決法

レジストリの値をひとつ書き換えると解決するようです。
AndroidStudioを立ち上げて、以下操作を行います。

>ヘルプ > Find Action > Registry > [ide.mac.pressAndHold.workaround] のチェックを外す

以下のような画面

![スクリーンショット 2015-07-24 23.46.52.png](https://qiita-image-store.s3.amazonaws.com/0/85214/1d640ac9-2413-12cc-ec4a-7b19623fca7c.png "スクリーンショット 2015-07-24 23.46.52.png")




## x.参考

[IntelliJ IDEA(mac)で全角入力に切り替えたら文字が消える現象](http://www.crossl.net/blog/intellij_mac_ime/)
RECRUIT Challenge @ kaggle

こんなモノが開催されているので、ちょっと参加してみています。

https://www.kaggle.com/c/coupon-purchase-prediction
http://www.recruit.jp/news_data/release/2015/0716_15946.html

#Kaggleって？

Kaggleというのは、"The world's largest community of data scientists compete to solve your most valuable problems." だそうです。簡単に言えば「データ解析コンペティションを簡単に行うことができる」場所です。きっとネット調べるともっとちゃんと説明してくれている人がいると思うけれど。

一人で作業をするよりも、100倍くらい競争するのは楽しいわけで、十分な結果がたくさん出たりするわけですね。そんなわけで、結構にぎわってます。

データ解析コンペティション？ということは？そうです。賞金が出ます。これが、5桁ドルとか、結構な大金だったりします。
まあ相手は世界のプロ、なかなか勝つのは容易ではありませんが。。。

#RECRUIT Challenge?
最初にも書いちゃったんですが、RECRUIT HoldingsがKaggleに問題を出しまして、それがRECRUIT Challengeです。
内容はクーポンサイト「ポンパレ」の購入予測ですね。過去1年くらいの閲覧・購入クーポン情報から次の1週間の購入を予測します。

他の問題と同様に賞金がでかいです。（ https://www.kaggle.com/c/coupon-purchase-prediction/details/prizes ）

- 1位 30,000ドル
- 2位 10,000ドル
- 3位  5,000ドル

しかも、学生だと追加でお金と権利がもらえます。（ http://challenge.recruit.ai/studentAward.html ）
こっちは応募が日本語だから、事実上日本人学生間での勝負になりますかね。

- 1位 100,000円
- 2位 50,000円
- 3位 30,000円
- + AI分野の著名な先生とお話ができる 

という。

#え、お金ほしい！
じゃあ調べましょう。
ただ取っ掛かりで躓いても悲しいので（4回フォーマットエラーしたのは秘密）、pandasを利用してランダムに10個の予測を出力するコードを書いてみました。
あ、csvファイルはdatフォルダの中にあると仮定します。

```python:random_prediciton.py
# -*- coding: utf-8 -*-

import pandas as pd
import numpy as np


ul = pd.read_csv('./dat/user_list.csv')
cl_test = pd.read_csv('./dat/coupon_list_test.csv')

sampler = np.random.permutation(len(cl_test)) #cl_testの順番を入れ替えるものを生成
cids = cl_test.take(sampler[:10]).COUPON_ID_hash #ランダム順番に10個を取得し、そのCOUPON_ID_hashをとる
cids = " ".join(cids) #とったIDを半角スペース区切りでまとめる(求められている出力形式がこれ)
output = pd.DataFrame({"USER_ID_hash":ul.USER_ID_hash, "PURCHASED_COUPONS":cids}, columns=["USER_ID_hash", "PURCHASED_COUPONS"]) #出力用DataFrameを作成する
output.to_csv("./output_random.csv", index=False) 
```

#どんな情報があるの？
一応どんな情報があるかの情報は提供されていますが、簡単にpptxで書いてみたものをぺたっと。
![recruit.png](https://qiita-image-store.s3.amazonaws.com/0/84317/8670269c-0225-1dc8-799e-772d4be63618.png)
ElasticBeanstalkにrpmを入れる

ElasticBeanstalkは、ミドルウエアまで組んだものを提供してくれる便利なサービスですが、それでもさらに追加したくなることがあります。ここでは、wkhtmltopdfを例として、rpm形式で配布されているソフトウェアをElasticBeanstalk（長いので、以下では「EB」と略します）に組み込む方法を考えていきます。

# wkhtmltopdfって？
本題とはあまり関係ありませんが、wkhtmltopdfについても軽く触れておきます。

[wkhtmltopdf](http://wkhtmltopdf.org/)は、WebKitのブラウザエンジンを使って、HTMLをPDFに変換するツールです。WebKitを利用していることもあって、JavaScriptまで実行できるなど、かなりの高性能を誇っています。もちろん、日本語もフォントがあれば表示できます。

# 事前調査
## まずは、インストール条件をチェック
EBを作成した時に、サーバ接続用の秘密鍵を得ていると思いますので、それでSSH接続して、手作業でrpmのインストールを行い、動作するまで確認してみましょう。今回のwkhtmltopdfの場合、以下のようなことがわかりました。

* rpmとしては、CentOS6の64ビット用が適切[^1]
* `xorg-x11-fonts-75dpi`に依存している（yumでインストール可能）
* 日本語表示には日本語フォントが必要（AWSリポジトリに`ipa-mincho-fonts`、`ipa-gothic-fonts`があるので利用可能）

# 設定手順
EBの設定には、`eb init`したルートフォルダに`.ebextensions`というサブディレクトリを掘って、そこにyaml形式の設定ファイルを入れます。シェルスクリプトを作るなど、およそ何でも実行可能なのですが、rpmを入れるくらいならそこまで複雑にしなくても実行はできます。

## インストールの場合の書式
rpm、yum、rubygems、python（pipやeasy_install）のパッケージマネージャはEB標準で対応しているので、必要なパッケージさえ書けば動きます。

```yaml:.ebextensions/10-packages.config
packages:
  yum:
    some-yum-package: []
  rubygems:
    some-gem: '1.2.3'
```

## 優先順位とファイル名
ファイル名が数字始まりになっていますが、これは**ファイル名順に処理される**ので、その管理をしやすくするためです。また、同じファイルの`packages`内では、rpm、yum、（rubyとpython）という順で実行されます。ということで、同じ設定ファイル内でepelのrpmを入れて、その後にepel経由でyumを行うことはできますが、yumに依存するrpmを入れることはできません（一度これで失敗しました）。

## ファイルを分ける
今回の場合、2ファイルに分けて、先にyumで依存関係を整えてからrpmを入れることにしました。

```yaml:.ebextensions/10-wkhtmltopdf-deps.config
packages:
  yum:
    xorg-x11-fonts-75dpi: []
    ipa-mincho-fonts: []
    ipa-gothic-fonts: []
```

```yaml:.ebextensions/11-wkhtmltopdf.config
packages:
  rpm:
    wkhtmltox: http://download.gna.org/wkhtmltopdf/0.12/0.12.2.1/wkhtmltox-0.12.2.1_linux-centos6-amd64.rpm
```

なお、rpmはインターネット上からアドレスを拾ってきてこのように直接指定することもできますが、安定して置かれなさそうな場合には、自前サーバなりS3なりにコピーして、そちらを指定することも可能です。

# 動作確認
このように自動インストールを行うよう設定した場合、確認を兼ねて**サーバの再構築**をしておきましょう（再起動では不足です）。とりわけ、開発環境などでインスタンスが1台しかない場合、手動でインストールしたものが残っていて、自動インストールの失敗に気づかないこともありえます。

# 参考リンク
* [AWSのマニュアル](http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/customize-containers-ec2.html#customize-containers-format-packages)
* [Qiitaの関連投稿](http://qiita.com/kakipo/items/37cac238c1934f473960)


[^1]: カーネルのバージョンなどを見てCentOS 7用を先に入れてみたら、ライブラリのバージョン不一致で失敗しました。
コマンドラインからPullRequest発行（テンプレートメンテナンスを楽にしたい）

## :dvd:Hubコマンドインストール

```bash:console
$ brew install hub
```
## :banana:alias作成

```bash:.zshrcとかに
alias git=hub
```
## :scroll:pull request テンプレートファイル作成
気になったら随時メンテナンス

```text:~/.pullreqbody.txt
## :checkered_flag:目的

## :construction:変更点

## :flashlight:確認URL
<a href="http://qiita.com" target="_blank">qiita</a>

## :camera:スクリーンショット
#### 変更前

#### 変更後

## :white_check_mark:TODO
- [ ]
- [ ]
- [ ]

```

## :banana:gitconfigにailias追加
uri-encodeにperlを利用している、動作環境が無ければそこを変えて下さい。
macなら動くはず!

```git:.gitconfig
[alias]
  pr = !hub browse -- compare/$(git symbolic-ref --short HEAD)'?'expand=1'&'body=$(cat ~/.pullreqbody.txt | perl -pe 'encode_utf8' | perl -pe 's/([^ 0-9a-zA-Z])/\"%\".uc(unpack(\"H2\",$1))/eg' | perl -pe 's/ /+/g')

```
titleも含めたければ、'&'title=
で追記出来たはず（未確認）

準備完了

pull request 作成

```bash:console
#対象ブランチのところで
$ git pr
```

![image](https://qiita-image-store.s3.amazonaws.com/0/31015/dd491ab2-04c4-c7eb-3048-dd63e4356ed7.png)


##参考
http://qiita.com/kasaharu/items/3ead40e6838fbb44d4cd
http://qiita.com/yoshimikeisui/items/0719b0c9994f8d635356
http://unicus.jp/skmk/archives/315
rails adminを導入する

Railsアプリに管理画面を導入する必要があったので、
管理画面を簡単に作成できるrails adminをherokuに導入した。
rails adminの他にdevise（認証管理）とcancan（権限管理）も利用する。

# 環境

```
$ ruby -v; rails -v
ruby 2.2.1p85 (2015-02-26 revision 49769) [x86_64-darwin14]
Rails 4.2.1
```

# devise設定
Gemfileに追記

```
gem 'devise'
```

インストール

```
$ rails g devise:install
$ rails g devise user
```

設定追記。
必要であればproduction.rbにも記載する。

```
$ vim config/environments/development.rb
config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }
```

# rails_admin設定
Gemfileに追記

```
gem 'rails_admin'
```

インストール

```
$ rails g rails_admin:install
           ?  Where do you want to mount rails_admin? Press <enter> for [admin] > 
       route  mount RailsAdmin::Engine => '/admin', as: 'rails_admin'
      create  config/initializers/rails_admin.rb
```

以下のコメントアウトを外す

```
$ vim config/initializers/rails_admin.rb
  ## == Devise ==
  # config.authenticate_with do
  #   warden.authenticate! scope: :user
  # end 
  # config.current_user_method(&:current_user)
```

# cancan設定
Gemfileに追記

```
gem 'cancan'
```

インストール

```
$ rails g cancan:ability
```

管理権限を以下のファイルで設定する

```
$ vim app/models/ability.rb
class Ability
  include CanCan::Ability

  def initialize(user)
    if user && user.admin?
      can :access, :rails_admin   # grant access to rails_admin
      can :manage, :all           # allow superadmins to do anything
    end 
  end
end
```

adminユーザーを識別するためにadminカラムを追加する

```
$ rails g migration AddAdminToUser admin
$ bundle exec rake db:migrate
```

consoleでadminをtrueに設定する

```
$ rails c
> user = User.find(1)
> user.update_attribute(:admin, "true")
```

以下のコメントアウトを外すことで、
adminに設定したユーザーのみが管理画面にアクセスすることができる。

```
$ vim config/initializers/rails_admin.rb
  ## == Cancan ==
  # config.authorize_with :cancan
```

# herokuデプロイ
特に躓く箇所はないが、
手動でmigrationコマンドを打つ必要があった。

```
$ heroku run rake db:migrate --app ***
```

# 参考資料
[sferik/rails_admin](https://github.com/sferik/rails_admin)
[devise、cancanと連携して管理者ユーザーにのみRailsAdminを公開するには | hrendoh's memo](http://blog.hrendoh.com/how-to-use-rails-admin/#.VbD_YOjtmko)