OmniAICreator/Qiita-1.07M huggingface dataset:
8/9 本日の共有

### ライブラリ
UIViewController.viewWillAppear()をmethod swizzlingしてクラス名を表示するラベルを追加している
…でもremoveFromSuperviewしてないからviewWillAppearが呼ばれるごとにラベルが増えるような
[UIViewController+ClassNameOverlay](https://gist.github.com/laiso/fe754ecbfdcae276b02a)
![画像](https://gist.githubusercontent.com/laiso/fe754ecbfdcae276b02a/raw/9f577dac48aa6f1ae02410eab75d96593e2971a2/example1.png)

[SwiftでシンプルにPOST/GET/PUT/DELETEするライブラリ - Qiita](http://qiita.com/yukihamada/items/7bf7a68e8418835a54d6)

### ツール
画面共有ソフト。相手の画面の操作も可能。
これを見つける前はMacOS標準のiChatにAOLのアカウントを入れてなんやかやしなければいけなかったけど、TeamViewerはすぐ使えてすごく便利。
[TeamViewer - ネット経由のパソコン遠隔操作（リモートコントロール）ソフト](http://www.teamviewer.com/ja/)


GitHub Gistについて
[GitHubについてもう少し知ってみる。その5（Gistでお手軽コード管理） | Alpac@labo](http://www.paka3.net/github05/)

### 本
東大の池上先生の、人工生命を考えることによって生命を理解しようという本。
人工生命を作るときになぜ中間層を設定しなければいけないのか、Conway's game of lifeが人工生命の基盤に適さないのはなぜか〜とか
人工生命を体系的に書いてるものってこの本くらい（他に知ってる方いたらぜひ教えてください）
[動きが生命をつくる―生命と意識への構成論的アプローチ: 池上 高志: 本](http://www.amazon.co.jp/dp/4791763513)
LinuxサーバのRuby on Rails設定

#### Railsを使うのに必要なライブラリをあらかじめインストール
```
$ sudo yum install zlib zlib-devel openssl-devel sqlite-devel gcc-c++ glibc-headers libyaml-devel readline readline-devel zlib-devel
```

## 1. Ruby インストール
```bash
$ sudo yum install git # git をインストール
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv # rbenv をインストール
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile # rbenv のパス設定
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile  # 同上
$ source ~/.bash_profile # 設定読み込み
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build # ruby-build のインストール

$ rbenv install --list # インストールできるRubyのバージョン表示
$ rbenv install バージョン # 指定したバージョンをインストール
$ rbenv rehash # 再読み込み
$ rbenv versions # インストールされているバージョン表示
$ rbenv global バージョン # 使用するバージョンを指定
$ ruby -v # 現在のバージョン確認
```

## 2. Ruby on Rails インストール

```bash
$ gem install rails --no-ri --no-rdoc # ドキュメントなしの方が速い
$ rails -v # rails コマンドがない旨のメッセージが出たら、シェルを再起動してもう一度実行してみる
```

## 3. 開発で使うポート(3000)を開ける
```bash
$ sudo vim /etc/sysconfig/iptables

-A SERVICES -p tcp --dport 3000 -j ACCEPT # 設定は別ページ「Linuxサーバの初期設定」の 6.ファイアーウォールの設定 を参照
$ sudo service iptables restart
```
## 4. JavaScript Runtime のインストール
以下のページにCentOSへのインストール方法が記載されています。
https://github.com/joyent/node/wiki/Installing-Node.js-via-package-manager

## 5. Railsアプリ作成
```bash
$ rails new myapp
$ cd myapp
$ rails s
```
ポート番号3000にアクセスすると、railsのデフォルトページが表示される。

## 補足: Rails コンソールを使うには
`Gemfile`に以下の行を追加して、`bundle install`を実行

```
gem 'rb-readline', '~> 0.4.2'
```
[状態マシン図] doアクティビティ とは 何か 

#doアクティビティ

状態に入ったところで実行されるのが入場時アクション。状態から出るときに実行されるのが退場時アクション。それに対してdoアクティビティは、その状態にはいったあと、その状態にいる間、実行されるもの、である。

![61_state.png](https://qiita-image-store.s3.amazonaws.com/0/11188/4ce59693-3e1c-8d77-abbf-acdc98050ac6.png)

この状態マシン図の場合、２通りの動き方がある。

1. 状態１に入場すると、まず入場時アクション１を実行し、それに続いてdoアクティビティ１が実行される。それが終わると状態１のままそこに留まっていて、イベント２が起きると、退場時アクション１が実行されて、状態２に遷移する。
1. 状態１に入場すると、まず入場時アクション１を実行し、それに続いてdoアクティビティ１が実行される。それが終わる前に、イベント２が起きると、doアクティビティが中断されたあと、退場時アクション１が実行されて、状態２に遷移する。

![62_pot_state.png](https://qiita-image-store.s3.amazonaws.com/0/11188/e47b7240-d285-9fc7-362c-bee65cf9f446.png)


例を使って説明する。湯沸し中状態に入ったところで、入場時アクションとして「湯沸しランプを点灯」したあと、「湯を沸かす」を開始する。それが終わると、左側のヌル遷移（完了遷移）があるので、退場時アクションとして「湯沸しランプを消灯」したあと、ヌル遷移をたどって保温中になる。また、湯沸し状態では、保温ボタンを押すことができ、「湯を沸かす」を中断して「湯沸しランプを消灯」したあと保温中に遷移する。

いっぽう、保温中に入ると、「保温ランプを点灯」したあと、「保温する」を開始する。保温するは終わりがなく、ヌル遷移（完了遷移）が設定されていない。中断することはでき、湯沸しボタンが押されれば、湯沸し中状態に遷移する。

この例のように、doアクティビティで実行することは、しばらく時間がかかるもので、中断できるものである。「湯を沸かす」のように終わりがあるものもあれば、「保温する」のように終わりがないものもある。

UMLで決められているアクションやイフェクトなどの振る舞いの中で、中断できると決められているのは、このdoアクティビティだけである。

doアクティビティは実装依存であり、ハードウェアで実行されたり、別タスクで実行されたり、さまざまな実装が考えられる。状態マシン的には、doアクティビティ実行中もイベントが到着したら直ちに状態遷移がおきることを想定しており、doアクティビティの中断は一瞬でできるよう実装されることが望まれる。

もし、いつでも時間遅れなく確実に中断することが難しい環境の場合は、doアクティビティを使わずに状態マシン図を設計したほうが良いだろう。

#完了遷移

状態を起点とする遷移で、明示的なイベントが指定されていないものを、完了遷移と呼ぶ。完了遷移は完了イベントで発火し、完了イベントは単純状態の場合、次のときに起きる。

1. 入場時アクションもdoアクティビティもない場合は、その状態に入ったとき
1. 入場時アクションがあってdoアクティビティがない場合は、入場時アクションが終わったとき
1. doアクティビティがある場合は、doアクティビティが終わったとき

#まとめ
アクションは、同期実行される関数呼び出しや文の実行です。その関数や文の実行が終わるまでは次のイベントは取り出されず、イベントキューに積まれたままです。アクションの実行に時間がかかりすぎると、イベントキューにたまったイベントの取り出しが遅れてしまうため、お客様から見て、応答性が悪いと思われたりする可能性があります。また、イベントを取りこぼさないよう、イベントキューをそれなりに深くしておく必要もあります。

それに対し、アクティビティは、非同期実行されるものです。UMLではアクティビティを表現するのにアクティビティ図というフローチャートの進化形みたいなものを使って表現します。状態マシン側から見ると、アクティビティをキックするだけで、アクティビティの終了は待ちません。なので、すぐ次のイベント待ちに入ります。お湯を沸かし始めても、すぐ次のイベント待ちに入るので、保温ボタンが押されてもすぐに処理できます。

アクティビティは、一般には、他のタスクや他のプロセッサやタイマ割り込みやハードウェアで実現されるもので、状態マシンを実行しているコンテキスト（タスク）とは違うもので実装されることが多いです。そして、他のコンテキストで実行されるアクティビティが終わると、それがなんらかのしくみで、もとの状態マシンに知らされるようになっていたりします。

UMLでは状態マシンをどう実装するかは何も決められておらず、それと同じくアクティビティもどう実装するかは何も決められておらず、当然、状態マシンからアクティビティをどうキックするか、アクティビティの終了をどう状態マシンに伝えるか、どう実装されているか何も決められていません。

同じタスクでやっても、複数のタスクでやっても、割り込みを使っても、他のプロセッサを使っても、ハードウェアがやっても、なにをどうやってもOKです。

わたしのいる職場では、他のコンテキストのことを考えたくない、また、どう実装するかの議論を避けたい、という理由で、doアクティビティを使わないで状態マシン図を描くルールになっていて、doアクティビティの終了通知に相当するものも、イベントで届くように描いています。

いっぽう、営業や企画のひとにとっては、その状態にいる間はずっと保温しつづける、とかその状態にはいると、ずっと水を加熱しつづけていて、お湯が沸いたら、湯沸かし中の状態を出てくる、という表現はとてもわかりやすいため（ソフトでどう実装するかなんてそういう人たちは考えないから）分析フェーズであれば、doアクティビティを使っても良いかな、という感じもします。
アーカイブのフォーマット変換

```bash:7z2zip.sh
#!/bin/sh
set -eu

FILENAME_7Z=$1
FILENAME_ZIP=${FILENAME_7Z/.7z/.zip}

mkdir tmp
cd tmp
7z x ../${FILENAME_7Z} > /dev/null
zip -q ../${FILENAME_7Z}.zip *
cd ..
rm -rf tmp
mv ${FILENAME_7Z}.zip ${FILENAME_ZIP}
ls -lh ${FILENAME_ZIP}
```

# 使い方

```bash:
7z2zip.sh filename.7z
```

filename.zipが生成される。
Swiftで有限オートマトン（ステートマシン）を作る

Swiftのcustom operatorを使って何かネタを書きたいなぁ・・と思っていたら、ふとステートマシン(`A => B`に遷移、みたいな)が浮かんだので、試しにライブラリを作ってみました。

- https://github.com/inamiy/SwiftState

![SwiftState](https://raw.githubusercontent.com/inamiy/SwiftState/master/Screenshots/logo.png)

状態をenumで定義して、いろいろこねくり回せます。

## コード例

```swift

enum MyState: StateType {
    case State0, State1, State2
    case AnyState   // create case=Any

    static func convertFromNilLiteral() -> MyState { return AnyState }
}
```

```swift
let machine = StateMachine<MyState, MyEvent>(state: .State0) { machine in

    machine.addRoute(.State0 => .State1)
    machine.addRoute(nil => .State2) { context in println("Any => 2, msg=\(context.userInfo!)") }
    machine.addRoute(.State2 => nil) { context in println("2 => Any, msg=\(context.userInfo!)") }

    // add handler (handlerContext = (event, transition, order, userInfo))
    machine.addHandler(.State0 => .State1) { context in
        println("0 => 1")
    }

    // add errorHandler
    machine.addErrorHandler { (event, transition, order, userInfo) in
        println("[ERROR] \(transition.fromState) => \(transition.toState)")
    }
}

// tryState 0 => 1 => 2 => 1 => 0
machine <- .State1
machine <- (.State2, "Hello")
machine <- (.State1, "Bye")
machine <- .State0  // fail: no 1 => 0

println("machine.state = \(machine.state)")
```

出力:

```swift
0 => 1
Any => 2, msg=Hello
2 => Any, msg=Bye
[ERROR] 1 => 0
machine.state = 1
```


## トランジションの連鎖

パスコード入力の簡易版。

```swift
enum InputKey: StateType
{
    case None
    // associated valueを使わないのは、それなりにワケあり
    case Key0, Key1, Key2, Key3, Key4, Key5, Key6, Key7, Key8, Key9
    case Any

    static func convertFromNilLiteral() -> InputKey { return Any }
}
```

```swift
var success = false

let machine = StateMachine<InputKey, String>(state: .None) { machine in
    
    // connect all states
    machine.addRoute(nil => nil)
    
    // success = true only when transitionChain 2 => 3 => 5 => 7 is fulfilled
    machine.addRouteChain(.Key2 => .Key3 => .Key5 => .Key7) { context in
        success = true
        return
    }
}

// tryState
machine <- .Key2
machine <- .Key3
machine <- .Key4
machine <- .Key5
machine <- .Key6
machine <- .Key7

XCTAssertFalse(success)

machine <- .Key2
machine <- .Key3
machine <- .Key5
machine <- .Key7

XCTAssertTrue(success)
```

その他、transition登録の解除や、Event(Name)ベースのトリガーにも対応しています。

OSXやiOSのような、UI寄りのアプリ（=無限の状態）にどれだけ使えるか分かりませんが、何か良い活用法などあればご一報 or Pull Requestを下さい！
Java入門 パッケージ管理

Java入門
パッケージ

前回はソースコードの分割をやりました。コード自体はスッキリとして保守性は高くなりますが、プロジェクトによってはクラスの数が膨大になり、かえって保守性が悪くなることがあります。それを防ぐために、Javaにはクラスをパッケージというグループに分けて管理できる仕様になっています。
クラスをパッケージに所属させるにはソースコードの先頭部分にpackage文を記入します。

```
package 所属させるパッケージ名;
```

前回のソースコードを編集してみます。

```java:sample.java
// calcurator.mainパッケージに所属させる
package calculator.main;

public class Sample {
	public static void main(String[] args) {
		int a = 5;
		int b = 2;

		int subAnswer = calculator.method.Calculator.subtraction(a, b);
		int addAnswer = calculator.method.Calculator.add(a, b);

		System.out.println("5 + 2 = " + addAnswer);
		System.out.println("5 -  2 = " + subAnswer);
	}
}
```

```java:calculator.java
// calculator.methodパッケージに所属させる
package calculator.method;
// 計算するクラス
public class Calculator {
	// 引き算メソッド
	public static int subtraction(int x, int y) {
		int answer = x - y;

		return answer;
	}
	// 足し算メソッド
	public static int add(int x, int y) {
		int answer = x + y;

		return answer;
	}
}
```

mainメソッドがあるクラスをcalculator.mainパッケージ
calculatorメソッドがあるクラスをcalculator.methodパッケージに所属させました。

パッケージ名は自由に指定できますが、小文字が基本です。

また、mainメソッドの各メソッドの呼び出しにも変更を加えました。呼び出すメソッドのパッケージ名もドット演算子で指定して上げる必要があります。
このように、クラス名を指定することを完全限定名【FQCN】といいます。


##パッケージを使う理由
最初の方に、パッケージはクラスを管理するのに便利と書きましたが、他にも使うメリットはあるんです。
唐突ですがクラス名の重複はダメです。たとえ処理が違っていたとしても許されません。一人で開発する分には恐らくそのような問題は起きないと思いますが、これが大人数で開発するとなると被る可能性は大です。
しかし、**パッケージが異なればクラス名が被ってもいいんです！**FQCNが異なれば、クラスの区別は可能だからです。

例えば、同じ学校に同姓同名が何人か居たとしても、学年と組で区別できますよね？それと同じです。

さて、ここで新しい問題が出てきました。パッケージ名が被る可能性だってあるじゃないか！
しかし、それを防ぐためにパッケージ名はあるルールが推奨されています。
それが、**保有するインターネットドメインを前後逆順にしたものから始める**ことです。

例えば、**http://oukokumin.jp**というドメインを持っていたら。

```lang:推奨されるパッケージ名
jp.oukokumin
```
　

これから始まるパッケージ名を使えばいいのです。

```
jp.oukokumin.main;
jp.oukokumin.calculator;
```

などです。


##FQCNの省略
ここまで部分化したソースをパッケージに所属させるという効率的なことをやってきました。
ただ毎回FQCNで指定するのはめんどくさくないですか？
なんだか本末転倒な気がしないでもないです。

実はこれ省略することができるんです。それがimportです！
これはあくまで省略機能なので、C言語でつかうincludeとは意味合いが違ってきます。

```java:sample.java
// calcurator.mainパッケージに所属させる
package calculator.main;
import calculator.method.Calculator;

public class Sample {
	public static void main(String[] args) {
		int a = 5;
		int b = 2;

		int subAnswer = Calculator.subtraction(a, b);
		int addAnswer = calculator.method.Calculator.add(a, b);

		System.out.println("5 + 2 = " + addAnswer);
		System.out.println("5 -  2 = " + subAnswer);
	}
}
```

calculator.method.Calculator;をimportしました。subtractionを見て下さい。FQCNが省略されています。addは比較のためにあえてFQCNを記述しています。

ここで注意なのですが**import文はpackage文の下に書いて下さい。**上に書くとエラーが出ます。
今回は、calculator.methodパッケージ内のCalculatorクラスをimportしていますが
パッケージに所属するすべてのクラスをimportするには

```
import calculator.method.*;
```

これでcalculator.methodパッケージに所属するすべてのクラスをimportします。
Syntastic を使って Rails プロジェクト内でだけ RuboCop に --rails オプションをつける

**追記：** Syntastic でどうにかするより Rails プロジェクトの `.rubocop.yml` で設定したほうがいい→[コメント参照](http://qiita.com/uasi/items/1e31fcd57c82b008bd81#comment-b76dca77d37f7fd1d0cd)

[Syntastic](https://github.com/scrooloose/syntastic) は Vim でファイルを保存した時点でシンタックスチェッカーを実行し、結果をバッファに表示してくれるプラグイン。 Syntastic は Ruby の静的コード解析器 [RuboCop](https://github.com/bbatsov/rubocop) にも対応している。

RuboCop に `--rails` オプションを渡すと Ruby on Rails に特化したモードで解析してくれる。これを Rails プロジェクト内でだけ有効にするには、 [rails.vim](https://github.com/tpope/vim-rails) と組み合わせて以下のように設定する。

```vim
" Ruby ファイルに対し RuboCop を実行する
let g:syntastic_ruby_checkers = ['rubocop']

" カレントディレクトリが Rails プロジェクトのディレクトリ以下であれば、
" rails.vim によって b:rails_root がセットされる
" これがセットされているときだけ RuboCop に --rails オプションを渡す
au FileType ruby if exists('b:rails_root') |
  \ let b:syntastic_ruby_rubocop_options = '--rails' | endif
```

# 課題

Rails プロジェクトに含まれるが Rails とは関係しない Ruby スクリプト（たとえば `my_rails_app/script/foo.rb`）にも `--rails` オプションが適用される。これを防ぐには autocmd の条件式でカレントファイルのパスに `/app/` または `/spec/` が含まれているかどうかをチェックすればよいだろう。
冪等性を考慮してファイルに文字列を追加するシェルスクリプト


* /home/vagrant/.bashrc に環境構築`PHP_IDE_CONFIG`を設定したい
* Vagrant で実行するプロビジョニングに記載するので、冪等性を持ちたい

grep して値が無ければ、追記する。

```bash
$ grep -q PHP_IDE_CONFIG /home/vagrant/.bashrc || echo 'export PHP_IDE_CONFIG="serverName=xxx.xxx.xxx.xxx"' >> /home/vagrant/.bashrc
```
ブラウザのストレージを使ってみる

HTML5 WebStorageを使うと、Key-Valueペアで、ブラウザ（ローカル環境）にデータが保存できる。

#Cookie vs WebStorage

WebStorageは、sessionStorage・localStorageの2種類ある。


|   | 別ウィンドウでのデータ共有  |データの有効期限  |
|:-----------:|:------------:|:------------:|
| クッキー        |        ○  |     指定期限まで有効     |
| sessionStorage |        ×  |     ウィンドウやタブを閉じるまで有効      |
| localStorage   |        ○  |     永続的に有効  |

各ストレージのデータ量上限は、ブラウザによって異なる。
下記に詳しく解説されている。

- 参考：[モダンブラウザのストレージ容量まとめ](http://www.html5rocks.com/ja/tutorials/offline/quota-research/)

#実装

localStorageを用いて実装してみた。
cacheHandler.jsでキャッシュを扱う処理を用意。
main.jsで、キャッシュにデータがなければ、取得し、キャッシュに保存する。

```js:cacheHandler.js
/**
 * コンストラクタです。
 * @constructor
 */
function CacheHandler() {
}
 
/**
 * HTML5 localStorage からキーに対応するデータを取得します。
 * @param storageKey キー
 * @returns {*} JSON
 */
CacheHandler.prototype.getCache = function (storageKey) {
    return angular.fromJson(sessionStorage.getItem(storageKey));
};
 
/**
 * HTML5 localStorage にデータを格納します。
 * @param storageKey キー
 * @param data JSON
 */
CacheHandler.prototype.setCache = function (storageKey, data) {
    sessionStorage.setItem(storageKey, angular.toJson(data));
};
 
/**
 * HTML5 localStorage のデータを削除します。
 * @param storageKey キー
 */
CacheHandler.prototype.removeCache = function (storageKey) {
    sessionStorage.removeItem(storageKey);
};
```

```js:main.js
// ページ読み込み時に実行したい処理
$().ready(function () {
    var key = &quot;dataKey&quot;;
    var cacheHandler = new CacheHandler();
 
    // キャッシュからデータを取得する
    var data = cacheHandler.getCache(key);
 
    // キャッシュがあればそれを返す
    if (!data) {
        // データを取得する処理
        data = <どこかから取得したデータ>;
        // キャッシュに格納する
        cacheHandler.setCache(key, data);
    }
 
    return data;
});
```

これだけの実装だとキャッシュが最新状態かどうか判断できないので、
キャッシュ元データが最新版か確認し、そうでなければ再び取得などの処理が必要。
また、キャッシュの削除処理もどこかに組み込みたい。
SalesforceにExt JSを適用する際のcssの上書きを(多少)防ぐ


Salesforceのヘッダを表示させつつ、VisualforcePage内でExt JSを使おうとしたときに、Ext JSのbuttonとかwindowのcssがSalesforce側のcssで上書きされて、見た目が変わってしまいます。

例えば、Salesforceの`extended.css`に定義されている`.x-btn`がExt JSアプリをビルドしてできたcssを上書きしている模様です。

Ext JSの画面内のコンポーネントが参照するcssのprefixを変更して、cssが上書きされないようにしたい…と思って少し調べてみました。

※1 でも、`font-size`はExt JS側のcssで上書きされちゃう模様なので、これも何とかしたい…

※2 [Sencha Forum](https://extjs.co.jp/forum/showthread.php?265307-ExtJS-CSS-conflict-with-x-btn-class&p=973419&viewfull=1&langid=14) を参考にしました。ありがとうございます！

- - -

#### 設定すること

1. component.scss の追記
1. Ext.baseCSSPrefix の変更

- - -
#### [1] component.scss への追記

`$prefix`に上書きしたい文字列を指定します。
例えば`abc-x-`を指定したい場合は以下の通りです。

```
$prefix: "abc-x-";
```

追記した後は、Ext JSをビルドして静的リソースとしてSalesforceにアップします。

- - -
#### [2] Ext.baseCSSPrefix の変更

Ext JSを使用するVisualforcePageで、ビルドしたjsファイルをロードする前に

```
<script type="text/javascript">

var Ext = Ext || {};
Ext.buildSettings = {
  baseCSSPrefix: 'abc-x-'
};

</script>
```

を追記しておきます。

こうすると、`Ext.baseCSSPrefix`に`'abc-x-'`がセットされて、ボタンやウィンドウなどのコンポーネントがExt JSの見た目になりました。

- - -
#### 追記..

そもそも、

1. VisualforcePageで、`showHeader="true"`としない
1. iframeで呼び出す

といったことをすれば、もっと良いかもしれません。。（試してないですが）
[JavaScript] Object.definePropertyのラッパー

#### `Object.defineProperty` ([MDN](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty)) が使いづらいのでラッパー関数作ってみました。

```js:defProp
function defProp(targets, key, value, descriptorMask){
  if(typeof descriptorMask === 'undefined') descriptorMask = 7
  Object.defineProperty(targets, key, {
    value:        value,
    enumerable:   descriptorMask & 1, // 列挙可能か
    configurable: descriptorMask & 2, // 削除可能か
    writable:     descriptorMask & 4, // 変更可能か
  });
  return targets;
}
```

`descriptorMask` は descriptor をビットマスクで指定します。（指定しないとすべて `true` になります）

#### こんな感じで使う。
`Object.keys` をprototypeに持ってくる例

```js
defProp(Object.prototype, 'keys', function(){
  return Object.keys(this);
}, 6); //=> Object.prototype

({ foo: 9, bar: 8 }).keys() //=> ['foo','bar']
```

#### 定数作成用に `defProp` のラッパー関数を作ってもいいかもしれない

```js:constant
function constant(key, value){
  defProp(window, key, value, 1);
  return value;
}

constant('FOO_BAR', 'foo bar') //=> 'foo bar'
FOO_BAR //=> 'foo bar'
FOO_BAR = 'baz' //=> 'baz'
FOO_BAR //=> 'foo bar'
(function(){ 'use strict'; FOO_BAR = 'baz' })() //~> TypeError: "FOO_BAR" is read-only
FOO_BAR //=> 'foo bar'
```

終わり。
Java入門 ソースコードの分割

Java入門
ソースコードの分割

数十行のソースコードならいいのですが、数百行、数千行のソースコードはメンテナンス性も悪く、第一そんなソースコードは見るだけでSAN値が下がってしまいます。

JavaもC言語などと同様、複数のソースファイルに分割することが可能です。1つのプログラムを複数に分けることを部品化といいます。


簡単に計算するプログラムを作ってみましょう。
部品化前

```java:sample.java
public class Sample {
	// 引き算メソッド
	public static int subtraction(int x, int y) {
		int answer = x - y;

		return answer;
	}
	// 足し算メソッド
	public static int add(int x, int y) {
		int answer = x + y;

		return answer;
	}
	public static void main(String[] args) {
		int a = 5;
		int b = 2;

		int subAnswer = subtraction(a, b);
		int addAnswer = add(a, b);

		System.out.println("5 + 2 = " + addAnswer);
		System.out.println("5 - 2 = " + subAnswer);
	}
}
```
　

これを計算するメソッドとmainメソッドの2つに分けてみましょう

```java:sample.java
public class Sample {
	public static void main(String[] args) {
		int a = 5;
		int b = 2;

		int subAnswer = Calculator.subtraction(a, b);
		int addAnswer = Calculator.add(a, b);

		System.out.println("5 + 2 = " + addAnswer);
		System.out.println("5 -  2 = " + subAnswer);
	}
}
```

```java:Calculator
// 計算するクラス
public class Calculator {
	// 引き算メソッド
	public static int subtraction(int x, int y) {
		int answer = x - y;

		return answer;
	}
	// 足し算メソッド
	public static int add(int x, int y) {
		int answer = x + y;

		return answer;
	}
}
```

計算するクラス名をCalculatorとしましたが、ソースファイル名とクラス名は同一でなくてはならないというルールがあるので間違えないようにして下さい。パッケージのなかにSample.javaとCalculator.javaの2つのファイルがあるイメージです。

mainメソッド側で、例えば引き算をするメソッドを呼び出す際には、そのままsubtraction(a, b)では使えません。同一のファイル内にそのようなメソッドは無いので当然エラーが出ます。
違うクラスのメソッドを使用する際には**ドット演算子「.」**を使います。

```
// 基本形
クラス名.メソッド名(実引数)

// 今回のsubtractionメソッドの呼び出し
Calculator.subtraction(a, b);
```

このようにしてメソッドを呼び出します。いうなれば
**Caluculatorクラスのsubtractionメソッド**という意味になります。
Windows8.1でCordovaの環境を整える

Windows8.1上でcordovaの開発環境を整えたときのメモです。
(検証してないからわからないけど、Windows8とかでも可能かも)

# Chocolateyのインスト

Chocolatey(https://chocolatey.org/)はWindowsのパッケージ管理システム
(Macでいうところのhomebrew)

コマンドプロンプトで以下のようにコマンドを打ってインストール

````shell
> @powershell -NoProfile -ExecutionPolicy unrestricted -Command "iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))" && SET PATH=%PATH%;%systemdrive%\chocolatey\bin
````

ちなみに僕のようなPowerShell派はこっち

````shell
PS> iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))
````

上記で ``スクリプトの実行がシステムで無効になっているため``とエラーが出る場合は、管理者権限で以下を実行してください。

````shell
PS> Set-ExecutionPolicy RemoteSigned
````

# GitとPythonのインストール

chocolateyでGitとPythonをインストール

````shell
> cinst git
> cinst python
````


# nvmwのインストール

nvmw はWindows用のversion管理マネージャー(nodebrewみたいなもの)
以下のようにインストールする

````shell
> git clone git://github.com/hakobera/nvmw.git "%HOMEDRIVE%%HOMEPATH%\.nvmw"
````

(PowerShellの場合、％XXX%で環境変数は参照できず、$Env:XXXという形になるので注意する)

nvmwをダウンロードしたら、PATHを通すこと

````shell
> set "PATH=%HOMEDRIVE%%HOMEPATH%\.nvmw;%PATH%"
````

PowserShellの場合、PATHの通し方は、

```shell-session
PS> $path = [Environment]::GetEnvironmentVariable('PATH', 'User')
PS> $path += $Env:HOMEDRIVE + $ENV:HOMEPATH + "\.nvmw;"
PS>  [Environment]::SetEnvironmentVariable('PATH', $path, 'User')
```

となる。

そして、nodeの適当なバージョンをインストール

````shell
> nvmw install v0.10.21
> nvmw use v0.10.21
````

ちなみにPowerShellだとnvmw useをしてもCurrentが設定されず、nodeが使えるようになりませんでした。
不具合かしら？

# cordovaのインストール

Node.jsを入れたらnpmも使えるので、cordovaを-gつきでインストールしましょう

````shell
> npm install -g cordova
````

これでcordovaが使えるはず

# Visual Studio Express 2013 for Windows のインストール

Cordovaのアプリをビルドするには
Visual Studioが必要です。
~~製品をつくるにはProfessionalが必要になると思いますが~~
Visual Studio Express 2013 for Windowsをインストールしましょう。

下記からインストールできます。
http://www.visualstudio.com/downloads/download-visual-studio-vs#d-express-windows-8

# エディタ

開発に必要なお好きなエディタをインストールしてください

````shell
> cinst vim
> cinst emacs
> cinst SublimeText3
````

---
以上で開発環境は整ったので、
あとはWindows8.1上で素敵なCordovaライフを楽しんでください。
catやlessをシンタックスハイライト+行番号表示してコードを見やすくする


pygmentize使うと、ブログとかでいい感じにコードをシンタックスハイライトしてくれる。ついでに、ターミナル上でもいい感じにしたいというわけで、pygmentizeコマンドをエイリアスかけるようにしたら、幸せになった。

# 設定

## pygmentizeのインストール

easy_installは入っている前提。

```bash
$ sudo apt-get install
```

## エイリアスの設定

zshを使っている前提だけど、bashでも大丈夫。

```bash
$ vi ~/.zshrc
```

```shell:.zshrc
alias c='pygmentize -O style=monokai -f console256 -g'
function cl() {
	c $1 | nl -n ln -b a
}
alias cl=cl
export LESS='-R'
export LESSOPEN='|lessfilter %s'
```

ホームディレクトリのApplicationsにPATHが通っていること前提で、lessfilterというファイルを作成し、実行権限を与える。

```bash
$ vi ~/Applications/lessfilter
$ chmod 755 ~/Applications/lessfilter
```

```shell:lessfilter
#!/bin/sh
case "$1" in
    *.awk|*.groff|*.java|*.js|*.m4|*.php|*.pl|*.pm|*.pod|*.sh|\
    *.ad[asb]|*.asm|*.inc|*.[ch]|*.[ch]pp|*.[ch]xx|*.cc|*.hh|\
    *.lsp|*.l|*.pas|*.p|*.xml|*.xps|*.xsl|*.axp|*.ppd|*.pov|\
    *.diff|*.patch|*.py|*.rb|*.sql|*.ebuild|*.eclass)
        pygmentize -O encoding=utf-8 -O style=monokai -f console256 -g "$1";;
    .bashrc|.bash_aliases|.bash_environment)
        pygmentize -f 256 -l sh "$1"
        ;;
    *)
        grep "#\!/bin/bash" "$1" > /dev/null
        if [ "$?" -eq "0" ]; then
            pygmentize -f 256 -l sh "$1"
        else
            exit 1
        fi
esac

exit 0
```

これであとは、ターミナルに入り直すか、下記sourceコマンドを実行してすぐ適用すれば設定は完了。

```bash
$ source ~/.zshrc
```

# 使い方

普通のcatコマンドを使いたい場合もあるだろうから、cにエイリアスかけている。

```bash
# catのシンタックスハイライト
$ c hoge.js

# cat + 行番号表示
$ cl hoge.js

# lessのシンタックスハイライト
$ less hoge.js
```

![スクリーンショット 2014-08-10 10.30.14.png](https://qiita-image-store.s3.amazonaws.com/0/2152/6303a0c9-97a8-efee-e67f-675a12deea40.png "スクリーンショット 2014-08-10 10.30.14.png")

![スクリーンショット 2014-08-10 10.52.59.png](https://qiita-image-store.s3.amazonaws.com/0/2152/0c72190b-5d9f-940c-a721-3bb64892f54d.png "スクリーンショット 2014-08-10 10.52.59.png")

これで、ソースコードをサッと確認したいとき見やすくなって便利。行番号もあることで、該当行をすぐ見つけられるし幸せ。

## 参考

- http://pygments.org/docs/cmdline/
- http://superuser.com/questions/117841/get-colors-in-less-command
TypeScript - module内でexportを付ける／付けない場合を比較



【結論】
・module内でexportをつけると、出力されるJSではオブジェクトのプロパティに追加されて外部からの利用が可能。
・exportをつけないと内部利用のみ（プロパティーに追加されない）


【コード】
##### Typescript

	module X {
		//外部へ公開
		export function func_exported(){
			alert("test");
			func_inner();
		}
	
		//内部利用
		function func_inner(){
			alert("inner test");
		}
	}

	X.func_exported();


##### Javascript

	var X;
	(function (X) {
	    //外部へ公開
	    function func_exported() {
	        alert("test");
	        func_inner();
	    }
	    X.func_exported = func_exported;//ここでプロパティに追加している!!!!
	
	    //内部利用
		//Typescriptでexportをつけていないfunc_innerはプロパティ追加コードが無い
	    function func_inner() {
	        alert("inner test");
	    }
	})(X || (X = {}));
	
	X.func_exported();
Vimのバックアップファイルをlsで表示させないようにする


vimを使い出してから勝手に作られるバックアップファイルが気になるので、lsコマンドを叩いた時に見えなくする。

調べてみると、macのlsとLinuxのlsとは挙動が違うらしいので、`coreutils`をインストール

```
brew install coreutils
```

```
meganii-air:controllers meganii$ brew install coreutils
==> Downloading https://downloads.sf.net/project/machomebrew/Bottles/coreutils-8.23.mavericks.bottle.tar.gz
######################################################################## 100.0%
==> Pouring coreutils-8.23.mavericks.bottle.tar.gz
==> Caveats
All commands have been installed with the prefix 'g'.

If you really need to use these commands with their normal names, you
can add a "gnubin" directory to your PATH from your bashrc like:

    PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"

Additionally, you can access their man pages with normal names if you add
the "gnuman" directory to your MANPATH from your bashrc as well:

    MANPATH="/usr/local/opt/coreutils/libexec/gnuman:$MANPATH"

==> Summary
?  /usr/local/Cellar/coreutils/8.23: 214 files, 10M
```

coreutilsのlsを使う場合は、`gls`のようにプレフィックスにgを付ける。
`gls -B`とかやれば、バックアップファイルを非表示に出来る。

-aオプションとかをつけたときにはバックアップファイルも表示したい場合は、以下のようにする。

```
alias ls="/usr/local/bin/gls --hide='*~'"
```


## 参考
[lsでVimのバックアップファイルを非表示にする](http://blog.ishkawa.org/2013/01/20/ls-hide-vim-backup-file/)
ターミナルで動くansi-vncをDockerで試した

# ansi-vncとは

黒い画面で動くVNCクライアントというか、ビューアー。
[ansi-canvas]()という、[node-canvas]()をベースにターミナルで動く、キャラクタベースの描画ライブラリを元に作られている。

# VNCサーバーの用意

随分前にDocker始めた頃に、firefoxのDockerイメージの存在を知り、これが、Xvncサーバーを使っていた事を思い出した。

Qiitaでも[Docker で X11 アプリを動かす. - Qiita](http://qiita.com/syoyo/items/b795370ff94ae7249c77)という記事に、このイメージの紹介がありました。

## vncサーバー側のパスワードの変更

[ansi-vnc](https://github.com/sidorares/ansi-vnc)はパスワード付きのVNCサーバーとの通信にももちろん対応しているのですが、現状パスワードが数字のみの場合、内部的にJavaScriptの文字列として扱えず、認証でコケます。

ansi-vncを治しても良いのですが、パスワードで数字のみのほうが昨今のセキュリティ事情的には如何なものか？ということで、Dockerfileのパスワードを変更してこれに対応しました。

```
git clone https://github.com/creack/docker-firefox.git
cd docker-firefox
```

Ubuntuのバージョン指定が12.04となっており、現時点でこのままだとビルドでエラーが起きたので、このバージョンも14.04に変更し、
Dockerfileを以下のように編集しました。

```txt
# Firefox over VNC
#
# VERSION               0.1
# DOCKER-VERSION        0.2

from    ubuntu:14.04
# make sure the package repository is up to date
#run    echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list
run     apt-get update

# Install vnc, xvfb in order to create a 'fake' display and firefox
run     apt-get install -y x11vnc xvfb firefox
run     mkdir /.vnc
# Setup a password
run     x11vnc -storepasswd a1234 ~/.vnc/passwd
# Autostart firefox (might not be the best way to do it, but it does the trick)
run     bash -c 'echo "firefox" >> /.bashrc'
```

```bash
docker build -t kjunichi/firefox-vnc .
```

# VNCサーバーの起動

ansi-vncは入力は出来ないようなので、VNCサーバー側で複数のセッションを共有出来るようにsharedオプション付きで起動します。

```bash
docker run -p 5900:5900 kjunichi/firefox-vnc x11vnc -forever -usepw -create -shared
```

# VNCクライアントでの接続

OSXであれば、Finderからコマンド+Kで表示されたダイアログに

```txt
vnc://192.168.59.103:5900
```
といった様に、boot2docker ipで表示されたIPアドレスとポート番号5900を指定します。


# ansi-vncのビルド

OSXでHomebrew環境の場合、以下の様にPKG_CONFIG_PATHの追加が必要でした。

```bash
export PKG_CONFIG_PATH=/opt/X11/lib/pkgconfig
```

```bash
npm install -g ansi-vnc
```

# ansi-vncの接続

OSXの以外は--hostにはlocalhostでOKのはず。

```bash
ansi-vnc --host $(boot2docker ip 2>/dev/null) --port 5900 --password a1234
```

# 関連記事

ansi-vncを最近話題のGoで書かれたttygifで動画にしたサンプルを以下で見ることが出来ます。

- [JavaScriptをDockerを使って黒い画面に表示する](http://abrakatabura.hatenablog.com/entry/2014/08/09/224138)
- [Go言語でコマンドプロンプトに画像を表示するコマンドを作って、Vimの:terminalで表示させた](http://abrakatabura.hatenablog.com/entry/2017/08/19/093906)
- [TypeError: Image or Canvas expectedで半日近くが溶けた件](http://abrakatabura.hatenablog.com/entry/2017/11/17/070924)
- [RustでWebカメラの映像をコマンドプロンプトに出すコマンドを作った](http://abrakatabura.hatenablog.com/entry/2017/09/21/064630)
Chatworkの相手への通知（To）を簡単に入力するChromeユーザスクリプト書いた


# 前提

Chatworkさん、とても便利で会社の開発チームとかで使っているんですが、参加人数が多いと、相手への通知（To）を活用しないとイミフ状態になりがち。そこで、[TO]ボタンを押すわけなんですが、いちいちマウスで選択するの面倒くさい…。

というわけで、キーボードショートカットで操作できるChromeのユーザスクリプトを作ってみました。さらっと書いたので、なんか不具合あるかもだけど。

動作確認は、MacのChromeのみです。

# 使い方

## ユーザスクリプトのインストール

- 下記スクリプトを「chatwork.user.js」みたいな名前で保存
- Chromeの設定アイコンから、拡張機能画面を表示
- 拡張機能画面に先ほど保存したJSファイルをドラッグアンドドロップ

## ショートカット

- Ctrl + t で、選択ダイアログ表示
- Ctrl + 1 ~ 9 で、表示順に相手を選択（最大9名まで）
- Esc で、選択ダイアログ非表示（これは元々の機能）

# スクリプト

```chatwork.user.js
(function() {
	if (location.hostname == 'www.chatwork.com') {
		document.onkeydown = function(e) {
			if (e.ctrlKey && e.keyCode == 84) {
				document.getElementById('_to').click();
			}
			if (e.ctrlKey && (e.keyCode >= 49 || e.keyCode <= 57)) {
				var toList = document.getElementById('_toList');
				var tId = e.keyCode - 49;
				var t = toList.getElementsByTagName('ul')[0].getElementsByTagName('li')[tId];
				if (t) {
					t.click();
				}
				document.getElementById('_chatText').focus();
			}
		};
	}
})();
```

これを使えば、キーボードのみで話しかけたい相手を選択することが可能です。便利。

ソースは、GitHubにあげてます。
https://github.com/zaru/chatwork_helper
未初期化のBOOL値とif文の省略

謎の現象に遭遇したのでどういう理屈か教えてください。

例えば

    BOOL test;
    
    if (test == YES) NSLog(@"1");
    if (test) NSLog(@"2");
    
    
    BOOL question;
    
    if (question) NSLog(@"3");
    if (question == YES) NSLog(@"4");
   
    //おまけ
    question = !question;
    
    if (question) NSLog(@"5");
    if (question == NO) NSLog(@"6");
    if (question == YES) NSLog(@"7");

をXcodeで実行した時に

1
2
3
6

が出力されます。


なぜ、1　は出力され　4　は出力されないのでしょうか？
これは初期化してあるはずのものでも同様の事がおこりました。

if (test)
と
if (test == YES)
に違いがあるのでしょうか？

もしかしたら情報科学の方達には当たり前のことかも知れないですが、どなたか教えてください。
謎過ぎて眠れません。
LXCゲスト環境からwebdavがマウントできないので、LXCホストからbindしてアクセスする

#LXCゲストからwebdavフォルダをマウント
LXCゲストからwebdavフォルダ(ReadyNAS)をマウントしようとすると、以下のエラーメッセージが出力される。

```bash
mount -t davfs https://path/to/webdav /mnt/webdav/
Username:
Password:
Accept certificate for this session? [y,N]
/sbin/mount.davfs: can't open fuse device
/sbin/mount.davfs: trying coda kernel file system
/sbin/mount.davfs: no free coda device to mount
```
ゲスト、ホストともにfuseはサポート済みだが解決策が不明。
ホスト側では問題なくマウント可能のため、
ホスト側のマウントしたディレクトリをゲストへbindしてアクセスさせる。

#ホスト側設定
上記の手順でwebdavフォルダをマウントした後、
LXCゲストのfstabに以下を追加

```bash:/var/lib/lxc/guest/fstab
/path/to/hostdir path/to/guestdir none bind,create=dir
```
ゲスト側(path/to/guestdir)は相対パスであることに注意する。

参考：[LXC 1.0: コンテナーの高度な使い方 [3/10]](http://qiita.com/m-shibata/items/0bfef9f8be86b375b428)

#ゲスト側確認
LXCを再起動するとマウントされている。

```bash
lxc-guest:/path/to# df
ファイルシステム                  1K-ブロック     使用    使用可 使用% マウント位置
https://path/to/webdav          26666664 13333332  13333332   50% /path/to/guestdir
```
bundle install で エラーが起きたとき…

```
bundle install
Don't run Bundler as root. Bundler can ask for sudo if it is needed, and installing your bundle
as root will break this application for all non-root users on this machine.
Fetching gem metadata from https://rubygems.org/..........
Fetching additional metadata from https://rubygems.org/..
Resolving dependencies...
Installing i18n 0.6.11
Using json 1.8.1
Installing minitest 5.4.0
Installing thread_safe 0.3.4
Installing tzinfo 1.2.2
Installing activesupport 4.1.4
Installing builder 3.2.2
Installing activemodel 4.1.4
Installing arel 5.0.1.20140414130214
Installing activerecord 4.1.4
Using coderay 1.1.0
Using method_source 0.8.2
Using slop 3.6.0
Using pry 0.10.0
Using rack 1.5.2
Using rack-protection 1.5.3
Using tilt 1.4.1
Using sinatra 1.4.5

Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    /usr/local/rbenv/versions/2.1.2/bin/ruby extconf.rb 
checking for sqlite3.h... no
sqlite3.h is missing. Try 'port install sqlite3 +universal',
'yum install sqlite-devel' or 'apt-get install libsqlite3-dev'
and check your shared library search path (the
location where your sqlite3 shared library is located).
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

Provided configuration options:
	--with-opt-dir
	--without-opt-dir
	--with-opt-include
	--without-opt-include=${opt-dir}/include
	--with-opt-lib
	--without-opt-lib=${opt-dir}/lib
	--with-make-prog
	--without-make-prog
	--srcdir=.
	--curdir
	--ruby=/usr/local/rbenv/versions/2.1.2/bin/ruby
	--with-sqlite3-dir
	--without-sqlite3-dir
	--with-sqlite3-include
	--without-sqlite3-include=${sqlite3-dir}/include
	--with-sqlite3-lib
	--without-sqlite3-lib=${sqlite3-dir}/lib
	--enable-local
	--disable-local

extconf failed, exit code 1

Gem files will remain installed in /usr/local/rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/sqlite3-1.3.9 for inspection.
Results logged to /usr/local/rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/extensions/x86_64-linux/2.1.0-static/sqlite3-1.3.9/gem_make.out
An error occurred while installing sqlite3 (1.3.9), and Bundler cannot continue.
Make sure that `gem install sqlite3 -v '1.3.9'` succeeds before bundling.
```

```
cd /usr/bin 
ls | grep sqlite
sqlite3
```

sqlite３がインストールしてあるのにgemでsqliteがインストールするさいにエラーが起きるのはなぜだろうと調べたらどうやら

```
sqlite-devel
```

をインストールしていないらしいことがわかったので

```
yum install sqlite-devel
```

をインストールしたら

```
gem install sqlite3
```

をインストールできました。

gemでのインストール関連はどうやら結構エラーが起きることが多いみたい。
VimからQuickrunでMarkedを起動してmarkdownとtextileを快適プレビュー

# VimからQuickrunでMarkedを起動してmarkdownとtextileを快適プレビュー

Vimに慣れてくると、Vim以外のテキストエディタは使いたくなくなるものです。
Markdownを書くときにももちろんVim、プレビューにはMac App Storeから入手できるMarkedを使います。
テキストを更新するとリアルタイムでMarkedのプレビュー画面に反映されるため重宝しています。
また、タスク管理にRedmine等を使っていると、 textile記法を使わざるを得ないことがあります。
まさか、テキストボックスにそのまま書くわけにもいかないので、これもVimで書きます。
問題はプレビューですが、これにもMarkedを使うことができます。

## Marked 入手、インストール

まずは、http://marked2app.com/ からMarkedを入手します。1400円です。高くなってます。
ここでは、 Version 2.2 (825) を使っています。

## vimのMarkdown設定

vim-quickrunからMarkedを起動するように設定します。ここではNeoBundleを使っています。
下記のようにしておくと、markdownを開いた状態で、Ctrl+@ を押すと Marked が起動してプレビューできます。
ついでにvim-markdownも入れます。
Markdownだけならここまでで大丈夫です。

```
NeoBundle 'thinca/vim-quickrun'
NeoBundle 'tpope/vim-markdown'
let g:quickrun_config = {}
let g:quickrun_config.markdown = {
      \ 'outputter' : 'null',
      \ 'command'   : 'open',
      \ 'cmdopt'    : '-a',
      \ 'args'      : 'Marked',
      \ 'exec'      : '%c %o %a %s',
      \ }
nnoremap <silent> <C-@> :QuickRun<CR>
```

## vim を textile に対応させる

下記の行を追加します。拡張子textileのファイルを開いて Ctrl+@ を押すとMarkedが起動します。

```
NeoBundle NeoBundle 'timcharper/textile.vim'
let g:quickrun_config = {}
let g:quickrun_config.textile = {
      \ 'outputter' : 'null',
      \ 'command'   : 'open',
      \ 'cmdopt'    : '-a',
      \ 'args'      : 'Marked',
      \ 'exec'      : '%c %o %a %s',
      \ }
nnoremap <silent> <C-@> :QuickRun<CR>
```

## Marked をtextileにも対応させる

textileパーサーには、RedClothを使います。
なぜか、ruby 2系だとうまくいかないので、rbenvで1.8.7-p375を入れます。
```
brew install rbenv ruby-build
rbenv install 1.8.7-p375
rbenv local 1.8.7-p375
gem install RedCloth
```

~/bin/marked.sh を作成 (chmodで実行権限を忘れずに)

```shell-session
#!/bin/sh
# 拡張子textileのときはredclothにまかせる。
# 何も返さないとMarkedのMarkdownパーサーが使われる模様
if [ "$MARKED_EXT" = "textile" ]
then
   # 1.8.7 じゃないとなぜかうまく変換できない
    ~/.rbenv/versions/1.8.7-p375/bin/redcloth $MARKED_PATH
fi
```

作成したmarked.shをMarkedのCustom Processorに設定
```
Preferences > Behaivior > Custom Processor
"Enable Custom Processor" をチェック
"Path"に "~/bin/marked.sh"
```

以上
LinuxサーバのMySQL設定

## 1. インストール

```
# yum install mysql-server
```

## 2. 文字コード設定
```
# cp /etc/my.cnf /etc/my.cnf.org # バックアップ
# vim /etc/my.cnf

【以下の行を追加する】
character_set_server=utf8
default-storage-engine=InnoDB
innodb_file_per_table
[mysql]
default-character-set=utf8
[mysqldump]
default-character-set=utf8
```

## 3. 起動
```
# service mysqld start
```

## 4. DB設定

```
# mysql_secure_installation # rootユーザのパスワード設定など、MySQLの安全性を高める設定を行う
# chkconfig mysqld on # 再起動時に自動的にMySQLを起動
```

## 5. MySQLログイン
```
# mysql -u root -p
```
rootパスワードはデフォルトでは設定されていないのでそのままEnterでログインできる。ただし、セキュリティ的にお勧めしないので 4. の設定は必ずやっておくこと。

## ツール

`MySQL Workbench`
テーブルの作成やステータス分析など、基本的に何でもできる。MySQL定番のツール。

`Sequel Pro`
データベースを手軽に扱える。GUIでのテーブル操作は勝手にコミットされる。開発環境で使うのにおすすめ。
Webサーバの設定

## 1. パッケージのインストール
```
# yum install httpd
# chkconfig httpd on # 再起動時に自動的に起動
```

## 2. Webサーバの設定
```
# cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.org
# vim /etc/httpd/conf/httpd.conf
ServerTokens Prod
ServerSignature off

<Directory "/var/www/html">
...
Options -Indexe FollowSymLinks # -を追加

# service httpd configtest # シンタックスチェック
# service httpd start # Webサーバ起動
```
ブラウザでサーバURLにアクセスすると、設定ファイルの`DocumentRoot`に設定されているファイルが表示される。

## 3. デプロイの設定
`/var/www/html/`にファイルを配置する場合

```
# chmod -R ユーザ名 /var/www/html/ # 一般ユーザでデプロイできるように
```
あとはファイル転送ソフトなどでhtmlディレクトリ以下にファイルを置くだけ。

## 4. Virtual Host の設定
1つのサーバで複数のドメインを使用する

例: virtualtest.com -> `/var/www/virtualtest/html`に転送

```
# mkdir -p /var/www/virtualtest/html # ディレクトリ作成
# chown -R ユーザ名 /var/www/virtualtest/html/ # 一般ユーザでデプロイできるように
# vim /etc/httpd/conf/httpd.conf # バーチャルホストを有効 
NameVirtualHost *:80 # コメントアウト除去

# vim /etc/httpd/conf.d/virtualtest.conf # 設定ファイルの作成。.conf となっていれば、起動時に自動的に読み込まれるので、設定するバーチャルホストごとに作成するとわかりやすい
<VirtualHost *:80>
 ServerName virtualtest.com
 DocumentRoot /var/www/virtualtest/html
 DirectoryIndex index.html
 ErrorLog /var/log/httpd/virtualtest_error
 AddDefaultCharset UTF-8
 <Directory "/var/www/virtualtest/html">
  AllowOverride All
 </Directory>
</VirtualHost>

# service httpd restart # Webサーバ再起動
```
あとは"/var/www/virtualtest/html/index.html"を作成し、`virtualtest.com`でアクセスして確認。(ドメインを取得していない場合は、hostsファイルで転送してあげて確認)
sinatraでどのURLにアクセスするかの定義

今更sinatra、rubyかよって感じですが、最近Webでのアプリ開発のために勉強し始めたのでちょこちょこメモっていきます。

rubyのフレームワークでHTTPでアクセス先を指定する方法

```
app/AppName.rb
```

の中で

```
require 'sinatra/base'

Class App
  get '/' do
     erb;index
  end
end
```

と書いた場合

```
get '/' do
```

でHTTPでアクセスURLを設定できる。
複数ブラウザ/端末を同期してくれるBrowserSyncが便利

gulpで使えるライブリロード環境を探していたら、[BrowserSync](http://www.browsersync.io/)というツールを見つけまして、試しに使ってみたらかなり便利だったので紹介します。

<br />

## BrowserSyncの特徴

* node.js上で動作
* 単体での実行やGrunt/gulpのプラグインとして利用可能
* 専用のWebサーバを構築して利用
* **同じURLを開いている複数のブラウザに対して、スクロールやページ遷移、フォーム入力などを同期**
* **ファイルが更新されたら同期している全てのブラウザをリロード**
* ブラウザにプラグインをインストールする必要なし
* タブレット/スマートフォンなどの実機からの閲覧も可能
* 主要なブラウザ/端末をサポート<br />
　→　[公式サイト](http://www.browsersync.io/)の中段辺りに書かれています<br />
　→　IEは7からみたいです

<br />

## サンプル動画
少し適当ではありますがサンプル動画を作ったのでご覧頂ければと思います。

[https://www.facebook.com/photo.php?v=672202716190390&l=4929985753082648928](https://www.facebook.com/photo.php?v=672202716190390&l=4929985753082648928)
※Facebookの動画アップロードになります、HDボタンで高解像度にしてからの閲覧をおすすめします。

### サンプル動画でやっていること

* Chrome/Firefox/IE11の3つのブラウザを同期
* スクロールやページ遷移、フォーム入力の操作を同期
* HTMLやCSSファイルを監視して更新されたらリロード<br />
→　CSSは.scssファイル(Sass)を編集して.cssファイルに変換しています

この動画には出てきませんが、タブレット/スマートフォンのブラウザでも同じようなことができました。

<br />

## BrowserSync単体でのセットアップ手順
自分が最初に試したのはgulpのプラグインとしてでしたが、gulpなしでもnode.jsさえあれば単体でも動作します。
なので、**タスクランナーが苦手な人でも気軽に使えると思います。**

そんなわけで、**node.jsがインストール済みの前提としてWindows版でのセットアップ手順**を説明します。

<br />

### BrowserSyncのグローバルインストール

```
npm install -g browser-sync
```
npmでBrowserSyncをグローバルインストールします。
成功すれば `browser-sync -V` (大文字Vなので注意)でパスが通っていることが確認できると思います。

<br />

### とりあえずWebサーバを立ててみる

```
browser-sync start --server html
```
Webサーバーのルートディレクトリを `--server` オプションで指定して実行します。
ルートディレクトリはカレントディレクトリからの相対パスになるので、適当なプロジェクトフォルダに移動してから実行してください。
上記の例では、カレントディレクトリ内の `html` というディレクトリをルートにしています。

これでブラウザが立ち上がり、 `http://localhost:3000/` のURLが表示されます。
先ほどの `html` というディレクトリに `index.html` があればその内容が表示されていると思います。

**このURLをコピペしてもうひとつのブラウザで表示すると、2つのブラウザのスクロールやページ遷移、フォーム入力などが同期されるようになります。**

<br />

### ファイルが更新されたらリロードするようにする

```
browser-sync start --server html --files "html/**/*"
```

監視対象としたいフォルダを `--files` オプションで指定して実行します。
こちらもカレントディレクトリからの相対パスになります。

今回は手っ取り早く、Webサーバのルートディレクトリに指定したフォルダ内の全ファイルを監視対象にしました。
これで、**ファイルを更新する度に同期している全ブラウザがリロードされるようになります。**

監視する対象ファイルをちゃんと定義したい場合は、globパターンで適宜設定してもらえればと思います。

<br />

### その他のオプション
その他のコマンドラインのオプション一覧は[BrowserSync Command Line Usage](http://www.browsersync.io/docs/command-line/)で確認できます。
まだ試してはいないですが、BrowserSyncをプロクシサーバにして、別で立てたApacheなどのWebサーバを利用することもできるみたいですね。
VBAでWindows認証のODBC接続文字列の作り方

AccessでWindows認証のパススルークエリの接続文字列の作り方について。
（※SQL認証についても以下の方法で作成可能）

1. データベース ウィンドウで [オブジェクト] の下の [クエリ] をクリックし、[新規作成] をクリックします。
2. [新しいクエリ] ダイアログ ボックスで [デザイン ビュー] をクリックし、[OK] をクリックします。
3. [テーブルの表示] ダイアログ ボックスで、テーブルもクエリも追加せずに [閉じる] をクリックします。
4. [クエリ] メニューの [SQL] をポイントし、[パススルー] をクリックします。
5. ツール バーで [プロパティ] をクリックし、クエリのプロパティ シートを表示します。
6. クエリ プロパティ シートで、マウス ポインタを [ODBC 接続文字列] に置き、ビルド ボタン (...) をクリックします。"ODBC 接続文字列" プロパティで、接続するデータベースについての情報を指定します。接続情報を入力するか、またはビルド ボタン (...) をクリックして、接続するサーバーについての情報を入力します。
7. 接続文字列のパスワードを保存するかどうかを確認するダイアログ ボックスが表示されます。接続文字列情報にパスワードとログオン名を保存する場合は、[はい] をクリックします。
クエリがレコードを返す種類ではない場合、レコード表示プロパティを [いいえ] に設定します。
8. 作成された接続文字列をコピーしVBAの接続文字列コードに貼り付ける。
Rails で認証後にセッションIDをリセットする

## reset_session

[Ruby on Rails Security Guide](http://guides.rubyonrails.org/security.html#session-fixation) では __Session Fixation - Countermeasures__ の項目で紹介されています。

- [Ruby On Rails Security Guideの訳 : 2.Sessions 2.8 - FLATz](http://www.flatz.jp/archives/2457)
- [Railsのセキュリティ セッション固定化の対策 - Ruby STUDIO](http://ruby.studio-kingdom.com/rails/guides/security)

### 調べながら気になった記事

- [Rails アプリのセキュリティ対策入門 - Rubyist Magazine](http://magazine.rubyist.net/?0044-OkayamaRubyKaigi02Report)

> またセッション ID はログイン後に reset_session でリセットすることが望ましいそうです。

## 認証後にリセットする方法のサンプル

そもそも認証が最初の画面なのであれば（ログイン画面が最初とか） `SessionController#create` の before で `reset_session` してしまっても良いと思います。

ただ、認証前の画面があった上で、途中から認証するような場合（認証前から買い物カートには追加できて、支払い前にログインを求めるような時）には、既にセッションに入っている情報を引き継ぐ必要があります。

- [Daily Ruby Tips #99 – Use reset_session() before authentication - Software Habit](http://brettu.com/rails-daily-ruby-tips-99-use-reset_session-before-authentication/)

リンク先そのままで恐縮ですが、以下のように一度複製して、リセットをするという方法になりそうです。

```rb
# 認証成功後
temp_sess = session.dup
reset_session
session.replace(temp_sess)
```
Linuxサーバの初期設定

**前提**

```
サーバ側：Linux(CentOS 6)
クライアント側：Mac
```

## 1. rootパスワードの変更

```bash
$ passwd
# 新しいパスワードを入力
```

## 2. 一般ユーザ作成

```bash
$ useradd ユーザ名
$ passwd ユーザ名 # パスワードを設定
$ usermod -G wheel ユーザ名 # sudoコマンドが使えるように
$ visudo # wheel グループがsudoを使えるように
%wheel ALL=(ALL) ALL # 先頭のコメントアウト(%)を外す
```

sshでログインできるか確認。コマンドプロンプトの最後が`#`(rootユーザを表す)じゃなくて`$`(一般ユーザ)になっているはず。

## 3. 公開鍵の設定

### サーバ側
```
$ mkdir ~/.ssh # クライアントの公開鍵の保存場所
$ chmod 700 ~/.ssh
```

### クライアント側
```bash
$ ssh-keygen -t rsa -v # パスワード設定は任意。基本的にEnter押すだけ
$ chmod 600 ~/.ssh/id_rsa.pub
$ ls -la
-rw-------   1 *****  staff  1766 12 12  2013 id_rsa
-rw-------   1 *****  staff   412 12 12  2013 id_rsa.pub

$ scp ~/.ssh/id_rsa.pub ユーザ名@転送先ホスト:~/.ssh/authorized_keys
```

sshでログインすると、パスワードを入力せずにログインできる。
パスワードログインを禁止する場合は`4.SSHの設定`を参照

## 4. SSHの設定

```
$ sudo -s # root権限が必要な設定が続くので、rootになっておく
# cp /etc/ssh/sshd_config /etc/ssh/sshd_config.org # 設定ファイルのバックアップを作成
# vim /etc/ssh/sshd_config
Port 任意のポート # デフォルトのポートでsshできないようにする
PasswordAuthentication no # パスワード認証を禁止(鍵認証のみ使用する場合)
PermitRootLogin no # rootでのログインを禁止する

# /etc/rc.d/init.d/sshd reload # 編集した設定を反映
```

ssh で変更前のポートでログインしようとしても、ログインできない。また、rootでもログインできない。

## 5. yum のアップデート
```
# yum update # セキュリティ的に最新の状態にしておく
```

## 6. 日本語化
```
# vim /etc/sysconfig/i18n
LANG="ja_JP.UTF-8"

# date # 日本語になるか確認
```

## 7. ファイアーウォールの設定

```
# iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
# iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
# iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
# iptables -A INPUT -i lo -j ACCEPT 
# iptables -A INPUT -p icmp -j ACCEPT 
# iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
# iptables -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
# iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
# iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# iptables -P INPUT DROP
# iptables -P OUTPUT ACCEPT
```

```
# service iptables save # 設定を反映
# iptables -L # 設定を確認
```
jQueryのAjaxでPHPのパラメータをデータベース(mySQL)に書き込む

# phpの値をバックグラウンドでデータベースに書き込みたい

そんなことを思っていたときに何かの記事を見ながら作りました。備忘録として残したいと思います。

形としては
onClick　→　Ajaxで別ファイルにパラメータを飛ばす　→　データベースに書き込む
といった感じで、onClickの所をいろいろ工夫すればなかなか使えるんじゃないかなと思います。

詳しくは、
onClickでindex.phpからpost.phpにAjaxで値を飛ばす。
次に、post.phpでindex.phpから飛ばされた値を受け取る。
そして、データベースに書き込む。
という流れです。



```lang:index.php
<?php
$name = "super2baba";
$phone = "090-0000-0000"
?>
<!doctype html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
</head>
<body>
  <form>
  <input type="button" value="submit" onclick="ajaxPost('<?php echo $name ?>','<?php echo $phone ?>');">
  </form>
</body>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<script>
  function ajaxPost(param1, param2){
    $.post("post.php", {
      input1:param1, input2:param2
    },function(json){
      alert("パラメータを2つをPOSTしました");
    });
  }
</script>
</html>
```

```lang:post.php
<?php

  //xxxはそれぞれに合ったものに変更
  $con = mysqli_connect('localhost', 'xxx', 'xxx') or die(mysqli_error());
  mysqli_select_db($con,'xxx');
  mysqli_query($con,'SET NAMES UTF8');

  // index.phpからPOSTされたパラメータを受け取る
  $name = $_POST["input1"];
  $phone = $_POST["input2"];

  mysqli_query($con,"lock tables xxx write");
  $sql = "UPDATE xxx SET name = '". $name ."' ";
  $res = mysqli_query($con,$sql);
  mysqli_query($con,"unlock tables");

```
xhprofを使ってみた（インストール編）

会社で運営しているサイトのパフォーマンスチェックする仕事をする機会があり
処理の各ステップにログを仕込んでパフォーマンスが悪いところを洗い出すのはつらいなーと思っていたところ
google先生がxhprofを教えてくれました。
パフォーマンスが悪い箇所をグラフ表示してくれるCallgraphも素敵！ということで、早速使ってみることにした。

まずはインストールから

#環境
CentOS 6.5
PHP 5.5.15

#インストール

###**1.peclでxhprofをインストール**

gccが入ってなかったので入れる

```
# yum -y install gcc
```

xhprofをインストール

```
# pecl install channel://pecl.php.net/xhprof-0.9.4
downloading xhprof-0.9.4.tgz ...
Starting to download xhprof-0.9.4.tgz (842,077 bytes)
・
・
・
Build process completed successfully
Installing '/usr/lib64/php/modules/xhprof.so'
install ok: channel://pecl.php.net/xhprof-0.9.4
configuration option "php_ini" is not set to php.ini location
You should add "extension=xhprof.so" to php.ini
```

###2.**php.iniを編集**

```
# vi /etc/php.ini

[xhprof]
extension=xhprof.so
xhprof.output_dir="/var/log/xhprof/"

```

###3.**ログディレクトリを作成**

```
# mkdir /var/log/xhprof/
# chmod 777 /var/log/xhpof/
```

###4.**Apache再起動**

```
# service httpd restart
```

###5.**phpinfo()で確認**
![xhprof.jpg](https://qiita-image-store.s3.amazonaws.com/0/37644/6d14320f-c3a4-1a57-72ac-223644111fe0.jpeg)

インストール完了
capistranoデプロイメモ

ほとんど[unicorn + rails 用 Capistrano 3 の設定ファイル](http://qiita.com/satococoa/items/9b0cc416ffc042680b9b)で動いたんだけど、もう少しいじらないと動かないので、自分用メモ。

## unicornいれる

```rb:Gemfile
gem 'unicorn'

group :development, :test do
  gem 'capistrano', require: false
  gem 'capistrano-rails', require: false
  gem 'capistrano-rbenv', require: false
  gem 'capistrano-bundler', require: false
end
```

当たり前だけどunicornいれないと動かない

## unicorn設定ファイル
[これ](https://github.com/tablexi/capistrano3-unicorn/blob/master/examples/unicorn.rb)を拝借してきた

```rb:config/unicorn/production.rb
# paths
app_path = "/var/www/app"
working_directory "#{app_path}/current"
pid               "#{app_path}/current/tmp/pids/unicorn.pid"

# listen
listen "/tmp/unicorn-app.sock"

# logging
stderr_path "log/unicorn.stderr.log"
stdout_path "log/unicorn.stdout.log"

# workers
worker_processes 3

# use correct Gemfile on restarts
before_exec do |server|
  ENV['BUNDLE_GEMFILE'] = "#{app_path}/current/Gemfile"
end

# preload
preload_app true

before_fork do |server, worker|
  # the following is highly recomended for Rails + "preload_app true"
  # as there's no need for the master process to hold a connection
  if defined?(ActiveRecord::Base)
    ActiveRecord::Base.connection.disconnect!
  end

  # Before forking, kill the master process that belongs to the .oldbin PID.
  # This enables 0 downtime deploys.
  old_pid = "#{server.config[:pid]}.oldbin"
  if File.exists?(old_pid) && server.pid != old_pid
    begin
      Process.kill("QUIT", File.read(old_pid).to_i)
    rescue Errno::ENOENT, Errno::ESRCH
      # someone else did our job for us
    end
  end
end

after_fork do |server, worker|
  if defined?(ActiveRecord::Base)
    ActiveRecord::Base.establish_connection
  end
end
```

## production用設定
元qiitaはstagingになっている

```rb:config/deploy/production.rb
set :stage, :production
set :branch, 'master'
set :rails_env, 'production'
set :migration_role, 'db'

server 'foo', user: 'bar', roles: %w{web app db}
```

## database.yml
これをいじらないとrake db:migrateが落ちる
Java入門 値渡しと参照渡し

Java入門
値渡しと参照渡し


##値渡し


```lang:sample.java
メソッド名(変数名)
```

この場合、変数そのものが渡されるのではなく、実引数が仮引数にコピーされます。
値そのものが渡されることを***値渡し***と呼びます。
渡される値はあくまでコピーなので、呼び出し先の引数の中身を書き換えても、呼び出し元の値は変化しません。

##参照渡し
変数を指定すると値ではなく、そのコピーが渡されました。
しかし、配列では値のコピーではなく、配列の先頭のアドレスが渡されます。

```java:sample.java
public class Sample {
	// 配列の要素すべてに1を加えて返すメソッド
	public static void incArray(int[] array) {
		for (int i = 0; i < array.length; i++) {
			array[i] ++;
		}
	}
	public static void main(String[] args) {
		int[] array = {1, 2, 3};
		incArray(array);
		
		for (int value : array) {
			System.out.println(value);
		}
	}
}
```

実行結果

```lang:sample.java
2
3
4
```

return文を使って、結果をmainメソッドに返さなくても、配列の中身は変更されました。


##戻り値に配列を使う
戻り値は変数だけでなく、配列も可能

```java:sample.java
public class Sample {
	// int型の配列を作成して返す。
	// sizeは要素数を受け取る。
	public static int[] makeArray(int size) {
		int[] newArray = new int[size];

		for (int i = 0; i < newArray.length; i++) {
			newArray[i] = i;
		}
		// 配列そのものではなく、配列の先頭アドレスを返している。
		return newArray;
	}
	public static void main(String[] args) {
		int[] array = makeArray(5);

		for (int value : array) {
			System.out.println(value);
		}
	}
}
```

実行結果

```lang:sample
0
1
2
3
4
```

着目すべきところはmakeArrayメソッドです。これは配列を制作して返す。つまり仮引数として配列を受け取るわけではないので、仮引数には[]を付けずに、***public static int[]***とする。

プログラムの流れは
1.mainメソッドの int[] array = makeArray(5) で作りたい配列の要素数を実引数として指定する。
2.makeArrayで要素数をint sizeとして受け取り、arrayという配列を制作する。
3.繰り返し文で配列を初期化処理(この処理がなければすべて0で初期化される)
4.mainメソッドに配列の先頭のアドレスを返す。
5.arrayにmakeArray配列の先頭のアドレスを格納する。
6.配列の数だけ繰り返し処理して画面に出力する。

変数ではなく配列を返すのでmakeArrayメソッドはint[]型であり、returnは不要となる。


2014/08/10
参照渡しについて幾つかコメントを頂きました。
どうもJavaは正確には「参照の値渡し」であり、いわゆる参照渡しは存在しないとのことでした。

C言語から入った人間だからでしょうか、参考書を読み、「参照渡し・・・あぁ、ポインタね！」と勝手に思い込んでいたようです。