OmniAICreator/Qiita-1.07M huggingface dataset:
GoでQiita API v2をつついてみる

自鯖でmarkdownで書いていくブログ？をGoで作ろうとしてます
素直に[Hugo](http://gohugo.io/)使えというツッコミは当然ありますが、Goの勉強という意味合いであえて自作で地雷を踏んでみようと

- 「どうせmarkdownで書くならせっかくならQiitaに今まで書いたやつもエントリとして載せたい」
- 「今後のQiita記事はWebhook使ってブログ側にエントリとして載せられるとして、既存の記事は引っ張れるのかな？」

とQiita APIを眺めてこんな感じになりました
これで自分の過去記事を引っ張ってきます

習作中なのでエラー処理ガバガバ、prettyPrint()は車輪の再発明の予感がするというアレなサンプルですが

```go:main.go
package main;

import (
    "fmt"
    "bytes"
    "encoding/json"
    "net/http"
    "io/ioutil"
    "log"
)

func main() {
    request, _ := http.NewRequest("GET", "https://qiita.com/api/v2/authenticated_user/items", nil)
    request.Header.Set("Authorization", "Bearer 個人用アクセストークン")

    client := new(http.Client)
    response, err := client.Do(request)
    if err != nil{
        log.Fatal(err)
    }
    defer response.Body.Close()

    contents, err := ioutil.ReadAll(response.Body)
    if err != nil{
        log.Fatal(err)
    }

    data, err := prettyPrint(contents)

    fmt.Println(string(data))
}

func prettyPrint(b []byte) ([]byte, error){
    var out bytes.Buffer
    err := json.Indent(&out, b, "", "\t")
    return out.Bytes(), err
}
```

これで

```json
{
    "id": "記事ID",
    "url": "記事URL",
    "title": "タイトル",
    "body": "Markdownの記事データ",
    "rendered_body": "HTMLに変換された記事データ",
    "created_at": "作成日時",
    "updated_at": "更新日時",
    "tags": [
        {"icon_url": "", "name": "タグ", "versions": []}
    ]
}
```

というところは引っぱれたので満足
iOSデバッグ時のモジュールインポート


iOSデバッグ時にたまに直面する問題

```
(lldb) p self.view.window.bounds
error: property 'bounds' not found on object of type 'id'
error: 1 errors parsing expression
```

これは型情報がなくて発生するようで以下のようにすれば表示できる

```
(lldb) p (CGRect)[self.view.window bounds]
(CGRect) $0 = (origin = (x = 0, y = 0), size = (width = 320, height = 568))
```

でもXcode6.3からはモジュールのインポートでも解決できる

```
(lldb) p @import UIKit
(lldb) p self.view.window.bounds
(CGRect) $1 = (origin = (x = 0, y = 0), size = (width = 320, height = 568))
```

参考：http://furbo.org/2015/05/11/an-import-ant-change-in-xcode/
yum->dnfのメリット


何が良くて移行するのか、イマイチ見えてこなかったので調べてみた。利用者視点では一番最後だけかも。

* 依存性解決に、より効率的な SuSE libsolv ベースの hawkey (C, Python wrapper) を使う。
* API ドキュメントの整備。yum の kozumplik にある関数は、公開・非公開の区別がなかった。テストしやすくする。
* python に依存しすぎだったのを C に。他言語からも扱いやすくする。
* メモリ消費量低減やメタデータ同期の効率化
バイオインフォマティクス-ゲノム配列から機能解析へ-第５章多重配列アラインメント(5.4まで)-

#イントロダクション-多重配列アラインメントとは-
・３つ以上の配列に対して、同じ文字が１つの列にできるだけ多く集まる最適な並べ方を探る

・アラインメントの難しさは**配列間の類似度によって変わる**（類似度が低いと難しい）

#5.1,5.2 多重配列アラインメントの利用
多重配列アラインメントによって配列のアラインメントの関連性を明らかにし、それによって機能的・進化的な関係があるかどうかを調べることが可能

また、多重配列アラインメントにより判明した似た配列同士を並べ、それを調べることで系統解析を行うこともできる

#5.3大域的および局所的多重配列アラインメン卜
・多重配列アラインメントには配列の全域を含む**大域的アラインメント**と一部領域からなる**局所的アラインメント**が存在

・保守的な配列は進化の過程で保存されることが多いので大域を用いると良い

・一方大事なところのみ保存され、その他の領域は別の新しい機能に変化するケースは局所的を利用すると良い
#5.4大域的多重配列アラインメン卜-近似法の種類-
ペアワイズアラインメントでのアラインメント方法をそのまま用いると計算量が多いので、近似法と組み合わせてアラインメントを行うと良い。以下に主な近似法を示す

**累進法**: 最も似た配列どうしのアラインメントから始めて， あまり似ていない配列を順に加えていく方法

**反復改善法**: まず初期アラインメントを求め、その結果を用いて徐々に改良を繰り返す方法
#5.4.2　MSAプログラム
２つの配列におけるダイナミックプログラミング法は、その時点までの最適のアラインメントに対応するスコアを要素とする２次元行列を作成することでアラインメントを行っていたが、それを多重配列アラインメント用に拡張したものがMSAプログラムである
しかしながらこれは近似法を導入していないため**計算量が多く、限られた数の配列しか一度にアラインメントできない**

これを改良した**改良版MSA**は、多重配列アラインメントは各１対の配列問のペアワイズアラインメントを内包するという事から多重配列アラインメントの最適解の取りうる範囲を予想し、それ以外の部分は計算を行わないことで計算量を抑える仕組みになっている
#5.4.2　MSAでのアラインメント評価方法
・多重配列アラインメントから導けるペアワイズアラインメントのスコアの和を全体のスコアとする（SPスコア）

・タンパク質配列での重み付けはPAM250配列とギャップペナルティで行う

・ある2 配列の組が全体のアラインメントにどの程度寄与したかを測る目安として ε値を用いる
 　→ε値は大きいほど多重配列アラインメントへの寄与が小さい

・δ はεの総和として定義され、配列間の相異の程度を表す。よく似た配列ではεもδも小さくなる
#5.4.3多重配列アラインメントのよさを測る尺度
SPスコアを算出する際に、多重配列アラインメントに向いていないオッズ表（BLOSSUM62等）が存在する
**評価尺度を算出する方法は多く存在するので、各アラインメントにあったものを選ぶことが重要**
#5.4.4累進法による多重配列アラインメント
累進法とは、DP法を計算の核とし，最も類縁性の高い配列の組から始め， より遠縁の配列または配列のグループを次々にこれにつけ加えていくことにより多重配列アラインメントを完成させる方法

累進法を用いたプログラムの代表例
・CLUSTALW
実際の進化の様子を反映した現実的なアラインメントを得られる。系統樹の作成・表示もできる。
・PILEUP
広く利用されているが、CLUSTALWに比べ見劣りする面あり
・T-COFFEE
CLUSTALWより既知アラインメントを再現するのに優れるが、遅い。
#5.4.4　累進法の問題点
・最終結果が初期のペアワイズアラインメントに決定的に依存する
→最初のアラインメントが遠いと間違いが増え、それがその後のアラインメントに伝搬

・ある配列の集合にふさわしい置換行列やギャップペナルティをどう選択すればよいか
#5.4.5反復演算を用いた多重配列アラインメント
**反復改善法**とは、配列をグループに分割し再び大域的アラインメントとして再構築する過程を繰り返すことにより， 累進法の問題点を回避しようとする方法

#5.4.7多重配列アラインメントのためのその他のプログラム
配列間の間の類似性を求めた後、配列を類縁性の高いグループに分割したり、系統樹として分類する際にいろいろなやり方が存在する
以下に４つのおおまかな方法と、それを用いたプログラムを示す

1.グループへの分割を行う際にグループごとにコンセンサスを作成し、次にグループ間のアラインメントを実行
→MULTAL

2.系統樹を用いる際は配列をその間の距離に従って順序付ける
→CLUSTALW,MS-DOS

3.すべての組み合わせの配列対間で一連のドッドマトリックスを作成し、それを掛けあわせることでノイズを減らし配列アラインメントの基点のモチーフを見つけ出す

4.多重配列アラインメントと系統樹作成を同時に行う。これによって系統分析を用いて多重配列アラインメントを改良できる
→TREEALIGN

#5.4.8大域的多重配列アラインメントプログラムの性能
・最近のプログラム比較によると**T-COFFEEが反復改善法を若干上回った**

・配列の一致度が低い場合は**DIALIGN**の制度が高く、一致度が高い場合は**T-COFFEE**が最良

・CLUSTALWは配列の一致度が高い大域的アラインメントのときのみ他のプログラムと同等の精度

#まとめ
・多重配列アラインメントはペアワイズアラインメントよりも計算量が大幅に増える
→**近似法を組み合わせることで計算量を減らす**

・近似法をどれにするかによって実行性能が異なり、**アラインメントする配列に合ったプログラムを選ぶことが重要**
Ubuntu 15.04 Redmine

Ubuntu を 14.10 から 15.04 にアップグレードしたらまた Redmine が動かなくなった。
と言うか、Redmine のパッケージが削除されていたので、apt でインストールしなおしたが
動かない。トップページで Internal Server Error が出た。
/var/log/redmine/default/production.log を見ると

```
NoMemoryError (failed to allocate memory):
  app/models/user.rb:327:in `time_zone'
```

メモリが確保できなくてエラーになっているようだ。
/usr/share/redmine/app/models/user.rb を下記の様に修正

```
diff -u user.rb.orig user.rb
--- user.rb.orig        2015-04-30 07:48:39.804301992 +0900
+++ user.rb     2015-04-30 07:49:08.397988334 +0900
@@ -324,7 +324,7 @@
   end
 
   def time_zone
-    @time_zone ||= (self.pref.time_zone.blank? ? nil : ActiveSupport::TimeZone[self.pref.time_zone])
+    @time_zone = nil
   end
 
   def force_default_language?
```

とりあえずこれで動くようになったけども、今度は個人設定の所でもやはりタイムゾーン絡みで
NoMemoryError を出していた。今の所個人設定を変更する予定は無いので、暇な時にきちんと原因を探す事にして、当面このままかな。

おまけのメモ。Redmine をデバッグするには /usr/share/redmine/config/environments/production.rb の中身を書き換えて、Apache を再起動するとブラウザ側にもエラーが出てくる。
もっと良い方法有ったら教えて下さい。
Oracle Master Goldの取得条件とコスト

Oracle Master Goldの資格取得には以下の3点が条件。

①Oracle Master Silver 11gを保持していること。
②Oracle Master Gold DBA 11g 試験に合格
③要履修コース（1 class）

①は取得済なので、コストの実績を書くと、
時間：20～30時間
金額：試験費用（約22,000円）＋参考書（約4,000円）で26,000円くらい
→時間は習熟度によって違うけど、あえて受けようと思う人の平均はこんなものではないかと思う。（業務で全くOracleに触らない or　ベテランはあえてうけない気がする）

②は推定で。
時間：50~60時間
金額：試験費用（約22,000円）＋参考書（約5,000円）

③
時間：3days
金額：19万～38万円くらい
取説英語 > origin > 基準日時  

IBM Informix 12.10の説明

http://www-01.ibm.com/support/knowledgecenter/SSGU8G_12.1.0/com.ibm.json.doc/ids_json_062.htm

> Table 1. Time series properties used in this example
>...
> Origin	2014-01-01 00:00:00.00000

時刻ごとにある処理をする上の基準となる日時のようだ。

<hr>
http://www.okstate.edu/sas/v8/saspdf/ets/chap3.pdf

> The arbitrary reference time of midnight on January 1, 1960, is used as the origin for nonshifted intervals,
線分ABと線分CDが交差しているか判定する。

# 判定に使用する情報
点A, 点B, 点C, 点D の座標(x,y)は全て数値で分かっていることにする。
それらの座標から交差しているかを判定するプログラムをjavascriptで書く。


# 考え方
[前回の記事（ベクトル）](http://qiita.com/akifo/items/72fc4565e066ed28b83f)を基礎として使用します。


![IMG_1274.JPG](https://qiita-image-store.s3.amazonaws.com/0/62259/90702189-5ed2-f793-ce23-c0e781fd2df2.jpeg)


ベクトルCA + ベクトルCB の第一象限に点Dが存在し、
かつ、三角形CABの外側に点Dがある場合に、線分ABと線分CDが交差していると言える。

と、思う。

# javascript で判定

[デモ](https://jsfiddle.net/akiho/8s6wu689/1/)

```js:
// 判定に使う点A B C D
var A = [0, 0],
    B = [5, 0],
    C = [1, 0.1],
    D = [12, 1];

// ４つの頂点を与えると、そこから判定をし、trueかfalseを返してくれる関数。
function check(params){
    var OPx = params.d[0] - params.c[0],
        OPy = params.d[1] - params.c[1],
        OAx = params.a[0] - params.c[0],
        OAy = params.a[1] - params.c[1],
        OBx = params.b[0] - params.c[0],
        OBy = params.b[1] - params.c[1];            
    
    // 連立方程式を計算。
    s = ( (OPx * OBy) - (OBx * OPy) ) / ( (OAx * OBy) - (OBx * OAy) );
    t = ( (OPy * OAx) - (OPx * OAy) ) / ( (OAx * OBy) - (OAy * OBx) );

    // 交差していたら trueを返す。
    if( s>0 && t>0 && s+t>=1) return true;

    // 交差していなければ falseを返す。
    else return false;
}

// チェック開始
var test = check({
    a: A,
    b: B,
    c: C,
    d: D
});

console.log(test);  // true or false が出力される。

```

# まとめ
自分で考えた方法なので、間違っているかもしれません。。
他にも方法があると思うので、メモ的な感じで投稿です。
Atomでgitが使えない (windows)

そもそもWindowsでしかもCygwinとか入れてない環境でatomを使ってる人が稀と思いますが、普通ならハマらないところを二点ほど。

ちゃんとgithubをインストールしてgithubのGUI、CUIからgitのコントロールができるのにatomでgit plusをインストールしても全然動かない時の対処法の覚書。
（そもそもコマンドラインからgitが出来ないって話です）

- 環境変数でgitのパスを通す  
コントロールパネルのシステムから【システムの詳細設定】  
ユーザ環境変数の【Path】の最後に以下を付け足す  

```
C:\Program Files (x86)\Git\bin"
```

これで、コマンドラインから「 git」って打っても怒られなくなります。

- 環境変数にホームを教えてあげる
ユーザ環境変数に以下を追加

```
変数名: HOME
変数値:　%USERPROFILE%
```

これで【C:\Users\ユーザ名】をホームディレクトリと認識しますので、そこにあるsshがそこにある.sshのコンフィグとか見に行きます。
（.ssh/configの書き方はいろんな人が書いてあるので割愛）
PHP: composerコマンドでパッケージをダウンロードし、composer.jsonに追加したい

* composerコマンドでパッケージを追加でダウンロードする
* composer.jsonに追記したい
* ダウンロードしたコードはgitにステージして管理したい

これを満たすコマンドをいつも忘れてしまうのでメモ。

```
composer require <パッケージ名> --prefer-dist
```

`require`サブコマンドでインストールすると、パッケージがダウンロードされ、composer.jsonに追記されます。また、`--prefer-dist`にすると、ソースコードがgitにステージできるような形で配置されます。
【JS】数値に関連する様々な計算処理メモ

たまには簡単でタメになるJSの小ネタを


#<i class="fa fa-calculator" style="font-size:1em;"></i> 数値の桁数を表示する関数
数値に length は使えないので、もし length を使って桁数を調べたい場合には数値を文字列に変換する必要がありますが、ここでは数値のままで桁数を調べます。
数値を10で割っていき、その値が「0」になるまで繰り返し処理を行うと桁数を調べることができます。

```js

/* 数値の桁数を表示 */

var Count = function(e){
  var num = e,
      digit = 0;
  if(num == 0){
    return 1;
  }else{
    while(num !== 0){
      num = (num/10) << 0;
      digit++;
    }
    num = digit;
    return num;
  }
}

console.log(Count(293892));

```
結果

```
6

```

#<i class="fa fa-calculator" style="font-size:1em;"></i> 整数を逆順に並べ替える関数

整数を逆順に並べ替える処理を行います。
整数を一桁ずつ処理し、逆順に並べ替える。
例）「1234」の場合、「4321」と並び替え


```js

/* 整数を逆順に並べ替え */

var Reverse = function(e){
  var num = e,
      digit = 0;
  if(num < 0){
    return -1;
  }else if(num == 0){
    return 1;
  }else{
    while(num > 0){
      digit = digit * 10 + num % 10;
      num = (num/10) << 0;
    }
    num = digit;
    return num;
  }
}

console.log(Reverse(9450356));

```

結果

```
6530549

```

#<i class="fa fa-calculator" style="font-size:1em;"></i> 整数の階乗計算

数値nの階乗は 1 * 2 * 3 *... n の乗算で計算できます。
whileループを使用して値を計算する代わりに```Factorial```を再度呼び出して、次の最小値を渡すことができます。値が1になると再帰は停止します。

```js

/* 整数を逆順に並べ替え */

var Factorial = function(e){
    var num = e;
    if(num < 0){
        return -1;
    }else if(num == 0){
        return 1;
    }else{
        return (num * Factorial(num - 1));
    }
}

console.log(Factorial(10));

```

結果

```
3628800

```




#まとめ

小数点切り捨ては `Math.floor()` を使わずにビット演算を使った。
TCPの空きポートをListenする

# はじめに

サーバを起動する時にポートは何でもよいので空きポートをListenしたい事がありました。
ウェルノウンポート以外を順に調べるしかないのかと思っていたのですが、
そんな面倒はなくポート0をListenすると空きポートが割り当てられます。

# サンプル

以下はGoで書いた検証コードです。

```go:main.go
package main

import (
	"fmt"
	"net"
)

func main() {
	l, err := net.Listen("tcp", "localhost:0")
	if err == nil {
		defer l.Close()

		addr := l.Addr().String()
		_, port, err := net.SplitHostPort(addr)

		if err == nil {
			fmt.Printf("    listen port: %s\n", port)
		} else {
			fmt.Printf("    %s\n", addr)
		}
	} else {
		fmt.Println("can't listen")
	}
}
```

実行する度に異なるポートが割り当てられています。

```txt:実行結果
% go run main.go
    listen port: 64522
% go run main.go
    listen port: 64830
% go run main.go
    listen port: 64835
% go run main.go
    listen port: 64838
```


# 参考リンク

* [Javaで空いているポート番号を取ってきたい](http://moznion.hatenadiary.com/entry/2014/11/29/222221)
* [Well-known ports](http://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers#Well-known_ports)
取説英語 > Browse... / Choose / Select

http://docs.oracle.com/cd/E19050-01/sun.cluster30/816-1958/x-417c2/index.html

> 「Browse」ボタンをクリックしてディレクトリ構造をブラウズし、ファイルまたはディレクトリを選択することも可能なフィールドがあります。

日本語ソフトでいうところの「参照」に対応する。

Browseの部分はSelectではダメなのだろうか?


<hr>
他の例。「...」ともしている。

https://aectechtalk.wordpress.com/2013/07/09/understanding-the-autodesk-content-browser-part-4/


<hr>
[What's a better label for the traditional “Browse…” button for selecting files to upload?](http://ux.stackexchange.com/questions/39555/whats-a-better-label-for-the-traditional-browse-button-for-selecting-files)

>  I'm working on primarily supports drag-drop for upload, with a "browse" button as a secondary option
...
> There are a lot of custom labels I've seen used for this button, and each browser has their own default as well.
- Browse... [ Firefox 1.5 ]
- Choose... [ Opera 9 ]
- Browse... [ Explorer 7b3 ]
- Choose File [ Safari 1.3.2 ]
- Select Files [ Wordpress ]
- Choose Files [ Dropbox ]
React.js + Flux ソースレビューのポイント

オレオレFluxではなくFacebook公式に出来るだけ寄せる方針。

#React.js
![react-js.png](https://qiita-image-store.s3.amazonaws.com/0/49543/4c30bed4-51a7-8a80-fdef-76111a3db0a5.png)

## propとstate
* stateは最低限の利用にできているか？stateが必要以上に使われていないか？propで置き換えはできないか？
* stateをsetStateを使わず直接代入していないか（バグ）（listとか弄る時注意）
* componentのなかでpropの書き換えを行っていないか？（バグ）
* 適切にpropTypesを利用して型付けできているか
* ref,getDOMNodeを使っているか？使うべき理由があるか確認する。
* getInitialStateの中でpropsを使っていないか？使われている場合同期されないことを正しく認識して実装しているか？
[Props in getInitialState Is an Anti-Pattern]
(https://facebook.github.io/react/tips/props-in-getInitialState-as-anti-pattern.html)

## component
* JSXで記載されているか？
* renderは複数回呼ばれても問題を起こさないか（冪等性）
* Componentは正しく階層化されているか
* formはLinkedStateMixin使って短く書く

#Flux
![flux-diagram-white-background.png](https://qiita-image-store.s3.amazonaws.com/0/49543/09995574-9670-a49c-6d53-59a9d828bb9b.png)
* Componentにビジネスロジックを書かない
* StoreにViewのロジックを書かない
* Storeのテストコードを書きましょう
* Dispatcher <-> Component はお互いを知らないはず
* Store <-> Action はお互いを知らないはず
* 通信処理はActionに寄せて通信終了の通知をDispatcherに伝えるべき
Gitで編集したファイルにだけrubocopする

もうシェル書いちゃう

```bash
ARRAY=(`git status -s | sed -e "s/^.\{3\}//"`)
echo ${ARRAY[@]}

rubocop ${ARRAY[@]}
```

ただし.rubocop.ymlでExcludesしているファイルもチェックされてしまう。
yml指定しても反映されないから、これは仕方ないかなぁ。。。
[iOS8] UITableViewの罫線を左まで伸ばす


```objc

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{
    
    if ([tableView respondsToSelector:@selector(setSeparatorInset:)]) {
        [tableView setSeparatorInset:UIEdgeInsetsZero];
    }
    
    if ([tableView respondsToSelector:@selector(setLayoutMargins:)]) {
        [tableView setLayoutMargins:UIEdgeInsetsZero];
    }
    
    if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
        [cell setLayoutMargins:UIEdgeInsetsZero];
    }
}

```
Vagrantによる仮想マシンの構築

Step1. VirtualBoxのダウンロード&インストール https://www.virtualbox.org/wiki/Downloads

Step2. Vagrantのダウンロード&インストール http://www.vagrantup.com/downloads.html

Step3. 仮想マシン用のディレクトリをつくる。

```
$ mkdir vagrant_getting_started
  
$ cd vagrant_getting_started

$ vagrant init
```

Step4. Boxイメージを選択し設定する。その際、https://atlas.hashicorp.com/boxes/search?utm_source=vagrantcloud.com&vagrantcloud=1 
を利用する。

```
vagrant box add ボックス名
```

Step5. 仮想マシンの起動

```
vagrant up
```

Step6. 仮想マシンへのリモートログイン

```
vagrant ssh
```


補足1
詳細は https://docs.vagrantup.com/v2/getting-started/index.html に
書いてあります。


補足2
ホストの`vagrant init`したディレクトリ(Vagrantfileがあるディレクトリ)
とゲストの`/vagrant`は同期しているので、ゲスト上で`rm -rf /`をすると、
ホスト上のVagrantfileがあるディレクトリも削除されます。
Phalconでテーブル一覧を取得


管理画面用にテーブル一覧が欲しかったのでメモ
(ryomojpさん情報ありがとうございます)

```php:AnyController.php
$results = $this->db->listTables();
```

ちなみに、指定したテーブルのdescを取得するのも調べてみました。

```php:AnyController.php
$this->db->describeColumns($tableName);
```

これで、Phalcon\Db\Columnの配列が返ってきます。

***

念のために過去記載分を残しておきます。

```php:AnyController.php
// コネクションが欲しいだけなので、適当なモデルをnew
$model = new HogeModel();
// コネクションを取得
$connection = $model->getReadConnection();
// コネクションのlistTable()を使って取得(配列で返ってきます)
$result = $connection->listTables();
```
leafletで地図以外の画像を扱う場合

leafletを使ってメルカトル図法の地図以外のものを表示する場合、緯度経度の座標系は使いにくいので、座標系を変更します。

これにはL.mapのオプションに、`crs:L.CRS.Simple`を指定します。

```
var map = L.map('map',{
  crs:L.CRS.Simple
})
```

これだけだとタイルレイヤがうまく表示されないので、タイルレイヤのオプションに、`continuousWorld:true` を指定する必要があります。

```
var canvasTiles = L.tileLayer.canvas(
  {continuousWorld:true}
);
```

この場合緯度経度の座標は、Zoom0のタイルのピクセルサイズに一致し、デフォルトタイルでは右下が(255,-255)になります。LatLng値を(0,0)-(1.0,1.0)に正規化すると使いやすいでしょう。

```
map.on('click', function(e) {
    var c = e.latlng;
    console.log(c.lng/256+"/"+(-c.lat)/256);
});
```

以上を踏まえて、canvasタイルレイヤを使って、タイル座標と正規化した緯度経度座標を表示するサンプルです。

```
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title> leaflet tile sample</title>
<link rel="stylesheet" href="http://cdn.leafletjs.com/leaflet-0.7.3/leaflet.css" />
<script src="http://cdn.leafletjs.com/leaflet-0.7.3/leaflet.js"></script>
</head>
<style>
html, body {
    width: 100%;
    height: 100%;
    margin:0 ;
}
#map {
    width: 100%;
    height: 100%;
}
</style>
<script>
onload = function() {
	var map = L.map('map',{
		center:[0,0],
		zoom:1,
		crs:L.CRS.Simple,
	});

	var canvasTiles = L.tileLayer.canvas({async:false,continuousWorld:true});
	canvasTiles.drawTile = function(canvas, tilePoint, zoom) {
		var w = Math.pow(2,zoom) ;
		if(tilePoint.x<0 || tilePoint.y<0 || tilePoint.x>=w || tilePoint.y>=w) return ;
		var ctx = canvas.getContext('2d');
		ctx.font = "bold 20px 'Arial'";
		ctx.fillRect(0,0,255,255) ;
		ctx.fillStyle = '#fff';
		ctx.fillText(zoom+"/"+tilePoint.x/w+","+tilePoint.y/w,10,20) ;
		ctx.fillText(zoom+"-"+tilePoint.x+"-"+tilePoint.y,10,50) ;	
	}
	canvasTiles.addTo(map);
	map.on('click', function(e) {
	    var c = e.latlng;
	    console.log(c.lng/256+"/"+(-c.lat)/256);
	});
}
</script>
<body>
<div id="map"></div>
</body>
</html>
```

[実働ページ](http://wakufactory.jp/map/leaflet/tile0.html)
C#でキーワード(予約語)を変数名として使うには

(あまり役に立たないChipsです。)
推奨されていませんが可能です。ただし、予約語そのものを使うことはできません。予約語の前に @ を付けると変数とみなされます。コンテキストキーワード (*1) は @ を付けずに変数名として使える場合があります。

(参考) VB.NET では [ ] で囲むと予約語を変数とみなします。

```csharp

using System;

public class EscapedName
{
  public static void Main()
  {
    var @if = 0;
    var @else = 1;
    var @switch = 2;
    var value = 3;
    var set = 4;
    var get = 5;
    
    Console.WriteLine(@if);
    Console.WriteLine(@else);
    Console.WriteLine(@switch);
    Console.WriteLine(value);
    Console.WriteLine(set);
    Console.WriteLine(get);
  }
}
```

    *1 コンテキストキーワードとはプログラムの文脈内で特別な意味を持つキーワードです。例えば、value はプロパティの set メソッド内だけで特別な意味を持ちます。コンテキストキーワードには以下のようなものがあります (C# 4.0 の場合)。

        add
        alias
        ascending
        async
        await
        descending
        dynamic
        From
        get
        global
        group
        into
        join
        let
        orderby
        partial (型)
        partial (メソッド)
        remove
        Select
        Set
        value
        var
        where (ジェネリック型制約)
        where (クエリ句)
        yield

@ はメソッド名とかにも使用できるようです。次のサンプルは @if というメソッドを定義して使っています。

```csharp
using System;

public class IIf
{
  // Ruby や Perl の "文 if 条件" のようなメソッド
  public static void @if(bool b, Action act)
  {
     if (b) { act(); }
  }

  public static void Main()
  {
     for (int i = 0; i < 5; i++)
     {
        @if(i % 2 == 0, ()=>{ Console.WriteLine(i); });
     }
  }
}
```
PhalconのVoltでAngularJSのタグを使う


PhalconのVoltとAngularJSのタグが両方とも{{}}なので困りました。

解決策としては、とりあえず以下のいずれかの方法かと思います。

# AngularJSのタグを[[]]に変更する

```javascript
var ngModule = angular.module('HHF', ['ngResource', 'ui'])
    .config(function($interpolateProvider) {
        $interpolateProvider.startSymbol('[[');
        $interpolateProvider.endSymbol(']]');
    })
);
```

# VoltでAngularJSタグ出力用関数を作る

{{ng("Model.prop")}}でAngularJSのタグを出力

```php:service.php
// DIにviewをセットするところ
$volt->getCompiler()->addFunction('ng', function($input) {
  return '"{{".' . $input . '."}}"';
});
```
Headerdocでソースコードを記述する

HeaderDocを使ってコメント内にソースコード片を記述する方法がAppleのドキュメントには載っていなかったので、メモとして残しておきます。

コメント内にコードを記述するには、```@code```と```@endcode```とを使います。

```objc
/**
 コード片をコメントに書くには\@codeと\@endcodeで区切って記述します。

 @code
 BOOL result = [myObject foo];
 @endcode
 */
- (BOOL)foo;
 :
```

この２つに囲まれた範囲がソースコードとして認識され、バルーンヘルプにもそれらしく表示されるようになります。

![バルーンヘルプにも分かりやすく表示される](https://qiita-image-store.s3.amazonaws.com/0/5210/44fb8862-da38-1bc4-408a-44879c127452.png)

# 参考サイト
stackoverflowの以下の記事が参考になります。

- [What are the new documentation commands available in Xcode 5?](http://stackoverflow.com/questions/19168423/what-are-the-new-documentation-commands-available-in-xcode-5/19169271#19169271)
IntelliJ IDEA + Lombok でコンパイルが通らない場合（オマケでGradle）

Lombok 1.16.4
IntelliJ IDEA 14.1.3

## IntellJ の設定

[ドキュメント](https://projectlombok.org/download.html)通り、IntellJ 用の Lombok プラグインを入れるんですが、現時点では Google Code にリンクされてるので、[GitHub の方](https://github.com/mplushnikov/lombok-intellij-plugin) の README を読んだほうがよいと思います。

それでもコンパイルが通らない場合、IntellJ の設定開いて Build... → Compiler → Annotation Processers で Enable annotation processing のチェックを入れる必要があります。

![スクリーンショット 2015-05-18 10.53.57.png](https://qiita-image-store.s3.amazonaws.com/0/17722/df8e3a97-ffaa-41b2-9bdb-ad757516433e.png)

## オマケ: Gradle の設定

Gradle 2.3

[ドキュメント通り](https://projectlombok.org/mavenrepo/index.html)でほぼ行けますが、provided 構文は無くなってるので下記の通り providedCompile を使って書きます。

```groovy
providedCompile "org.projectlombok:lombok:1.16.4"
```

以上です。
OSごとのおすすめエディタまとめ

Windows

notepad++ https://notepad-plus-plus.org/

Visual Studio https://www.microsoft.com/ja-jp/dev/default.aspx

Macintosh

Atom https://atom.io/

Xcode https://developer.apple.com/jp/xcode/

Linux

Emacs http://www.gnu.org/software/emacs/

Vim http://www.vim.org/

マルチプラットフォーム

Android Studio https://developer.android.com/sdk/index.html

Sublime Text http://www.sublimetext.com/
久しぶりにcgiを作ったら，Internal Server Errorとなった

久しぶりにcgiを作ったら，Internal Server Errorとなった


その解決を行った記録


コマンドラインからテストすると，cgiが動作した．
（入力した文字を単に返すcgi）

$ ruby hoge.cgi
(offline mode: enter name=value pairs on standard input)
textdata=aaa
Content-Type: text/html

start
aaa
end



これを,プログラム(ruby)から呼び出すと，「Internal Server Error」になった．

あれ？

下記の文字がタグ付きで返されてきた．

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator, you@example.com and inform them of the time the error occurred, and anything you might have done that may have caused the error.

More information about this error may be available in the server error log.



最後に「server error logに詳しく書いてあるよ」とあったので，見てみたら
 [error] [client ::1] malformed header from script. Bad header=start: hoge.cgi

とあった．

「malformed header from script」で調べたら，HTTP ヘッダーを加えなければいけないことを
思い出して，
print "Content-Type: text/html\n\n"
を最初のprintの前に追加して，解決です．


「Please contact the server administrator」って言われても，テスト環境だから，
それって自分なわけで，一瞬くじけそうになった．
とにかく，まずはログを見るが基本と再認識しました．
React.js + Fluxの参考リンクまとめ


React.js + fluxの勉強するのに参考になったリンクのまとめ。

## 公式
[React]
(https://facebook.github.io/react/)

[Flux]
(https://facebook.github.io/flux/)

##解説
日本語で大変わかりやすい良記事。ひと通り目を通せば概要をつかめます。
[一人React.js Advent Calendar 2014]
(http://qiita.com/advent-calendar/2014/reactjs)

## ライブラリ
###画面遷移
画面遷移はreact-routerがデファクトらしいので。
[React初心者のためのreact-routerの使い方]
(http://beck23.hatenablog.com/entry/2015/02/20/054900)

###isomorphic
yahooのライブラリfluxibleを使ったisomorphicのサンプル
[yahoo/flux-examples]
(https://github.com/yahoo/flux-examples)

###通信
JQueryは使いたくなかったので通信はこちらを。
[JavaScript - jQuery.ajaxの代わりにSuperAgentを使う]
(http://qiita.com/hashrock/items/3113690bb3de5bba639b)


##ツールやサンプル
facebookがまとめてるツールとかサンプルコードまとめ
[Complementary Tools · facebook/react Wiki]
(https://github.com/facebook/react/wiki/Complementary-Tools)


GUIでJSX作れるやつ。仮のページ作るならこれで十分
[react-ui-builder]
(https://www.npmjs.com/package/react-ui-builder)

JSX->Javascriptの変換確認
[JSX Compiler Service]
(http://facebook.github.io/react/jsx-compiler.html)

HTML->JSXの変換確認
[HTML to JSX]
(http://facebook.github.io/react/html-jsx.html)

Componentのサンプル群
[React Components]
(http://react-components.com/)

## npm
Gulpでもろもろ効率化
[Gulp.js入門 - コーディングを10倍速くする環境を作る方法まとめ]
(http://liginc.co.jp/web/tutorial/117900)

Gulpのコマンドはnpmでラップする感じで
[npm で依存もタスクも一元化する]
(http://qiita.com/Jxck_/items/efaff21b977ddc782971)

## インフラ
Isomorphoc的に使う場合はバックエンドの前にjs/proxyサーバを立てる感じらしい。
クラウドのオートスケール前提ですよねーこれ。AWSとかで。
[Isomorphic Survival Guide // Speaker Deck]
(https://speakerdeck.com/koichik/isomorphic-survival-guide?slide=43)
aws cliをつかって全リージョンにssh公開鍵をimportする

EC2にログインするときにsshの鍵を使う。通常はAWSに鍵をつくらせて、秘密鍵をダウンロードする。この方法は楽な方法ではあるのだが、**全リージョン別の鍵になってしまうので時に面倒**という問題がある。そんなときに楽なのは手元にある鍵をimportしてしまう方法。

##鍵の作成とJSONの準備

1. ssh-keygenつかって公開鍵と秘密鍵を作成
2. 作成した鍵を含むJSONを作成

```json:sshkey.json
{
    "DryRun": true, 
    "KeyName": "mykey", 
    "PublicKeyMaterial": "ssh-rsa AAAA.....(略) user@local"
}
```
という具合になる。```PublicKeyMaterial```には、作成した公開鍵をそのままcatかなんかでいれればOK.

##いざ登録

```aws ec2 import-key-pair --cli-input-json file://sshkey.json --no-dry-run```
という具合で登録すればOK.

##全リージョンまとめて登録
まとめて登録するために楽をすることにして、```aws ec2 describe-regions```をつかったスクリプトがこんな具合

```bash:aws-ssh-import.sh
#!/bin/bash
aws ec2 describe-regions |jq '.Regions | .[].RegionName' | while read line
do
    hoge=`echo $line | cut -d"\"" -f2 | cut -d"\"" -f1`
    aws ec2 import-key-pair --cli-input-json file://sshkey.json --no-dry-run --region $hoge
done
```
YAMAHAルータでDHCPサーバー設定と、固定IPアドレスの割当

## 参考

* [RTX DHCP固定IPアドレスの割当 - 八雲の技術メモ](http://d.hatena.ne.jp/marqut/20110807/1383674768)
* [15.1.5 DHCP 予約アドレスの設定](http://www.rtpro.yamaha.co.jp/RT/manual/rt-common/dhcp/dhcp_scope_bind.html)

## 設定例

```bash:
dhcp service server
dhcp server rfc2131 compliant except remain-silent

# IPの範囲
dhcp scope 1 192.168.11.11-192.168.11.200/24
# 固定IP
dhcp scope bind 1 192.168.11.190 00:a0:de:01:23:45
# DNSサーバーを指定
dhcp scope option 1 dns=176.103.130.132,176.103.130.134
```


## 設定

* `00:a0:de:01:23:45` の端末に `192.168.11.190`を割り振りたい場合

```bash:
dhcp scope bind 1 192.168.11.190 00:a0:de:01:23:45
```

`bind 1`はDHCPのスコープ番号。


なおDHCPサーバの配布範囲外の場合以下エラーが出て設定ができない。

> Error: IP address is not in the scope range
Effective C++ (3rd) > 31項 > インタフェースクラス > 派生クラスのインタフェースを特定 / データメンバ、コンストラクタを持たず、仮想デストラクタと純粋仮想関数を持つ

引用: Effective C++ 第3版

> ハンドルクラスの方法ではなく、Personをインタフェースクラスとよばれる特別な抽象クラスにする方法もあります。インタフェースクラスの目的は、派生クラスのインタフェースを特定することにあります。そのため、典型的なインタフェースクラスは、データメンバ、コンストラクタを持たず、仮想デストラクタと純粋仮想関数を持つことになります。

<hr>
http://promamo.com/?p=481
> インタフェースとは何か
...
インタフェースのルール
...
インタフェースの記述

上記のリンクではjavaでの例が紹介されている。

<hr>
[More C++ Idioms/インタフェースクラス](http://ja.wikibooks.org/wiki/More_C%2B%2B_Idioms/%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%95%E3%82%A7%E3%83%BC%E3%82%B9%E3%82%AF%E3%83%A9%E3%82%B9(Interface_Class))
> 意図
> - クラスのインタフェースをその実装から分離する。
> - 実行時多態的に抽象/クラスの実装を呼び出す。
AWS EC2のセキュリティグループ同士の依存関係を確認する

セキュリティグループのうち、「使っていないセキュリティグループはどれか」を発見するためのツールを作ったので公開してみました。
[sg-dependency-viewer](https://github.com/armaniacs/sg-dependency-viewer)なる名前をつけてみたけれども、要はIngressとEgressのIP制限もしくは、セキュリティグループを使った制限を簡単に表示させるもの。

意図しているSGはいいのだが、EMRやELBがつくったSGはわからなくなってしまうのでつくりました。

`$ aws ec2 describe-security-groups |ruby sg-dv.rb -a`
とすると、`sg-dv.rb`は、

        sg-59a6dbxx
                Tags:
                Descritption: Slave group for Elastic MapReduce
                IpPermissions: #3
                IpPermissionsEgress: #0
                [Group] referred by sg-57a6dbyy ((ElasticMapReduce-master))
                [Group] self reference

という具合で、ずらずらと表示をする。ついでにgraphvizに食わせるdotファイルもoutput.dotという名前で作成される。

![sample-output.png](https://qiita-image-store.s3.amazonaws.com/0/35274/0112d46d-92a0-44b6-1d07-ddffc12a00ab.png)


IP制限については、みんな大好き松井さんの、
[VPCのsubnetをgraphizを使って可視化してみた](http://d.hatena.ne.jp/j3tm0t0/20120504/1336096619)という素晴らしい記事を読んでもらいたい。
技術英語 > We have no other option but to ...

http://www.spiceworks.com/it-articles/help-desk-system/

> they have no other option but to pay for expensive help desk software.

選択肢が限られていて「これしかできない」という時に使う。

さらに「何もできない」という時
There's nothing we can do.
など使ったりする。
Star trek voyagerで何度か使用されていた。

いっぱい選択肢があるなら
We have many options to ...
のように言える。
mysqlimportでTSVファイルからインポートする

## 大前提

**どのRDBでもTSV・CSVからのインポートは何かと面倒くさいので、TSVをインサートSQLに変換するスクリプトを自作しておいてSQLでインポートすることをお勧めする。** ただし、同じインポートを何回も行うことになり、かつデータが大量の場合は、調べる手間をかけても出来合いのツールで設定を組んでおくメリットがある。


## 基本

```
mysqlimport -u ユーザー名 --password=パスワード --local データベース名 テーブル名.txt
```

## 設定ファイル

~/.my.cnfにオプションを書いておけばmysqlimportコマンドを実行するときに省略できる。

```my.cnf
[mysqlimport]
user=ユーザー名
password=パスワード
default-character-set=utf8
local
```

```
mysqlimport データベース名 テーブル名.txt
```
**以降の説明では~/.my.cnfに書かれていることを前提にする。**

## インポートするファイル
* インポートするファイルの名前は`テーブル名.txt`になっていること
* タブ区切り（TSV）になっていること（区切り文字の変更方法は後述）

例：

```
use d1;
CREATE TABLE t1 (
  id int(11) primary key auto_increment,
  name varchar(250)
);
```

```t1.txt
NULL     あいうえお
NULL     かきくけこ
NULL     さしすせそ
```


## 既存レコードはそのままにレコードを追加する場合

```
mysqlimport データベース名 テーブル名.txt
```

## 既存レコードを削除してからインポートする場合

```
mysqlimport -d データベース名 テーブル名.txt
```

## 制約を無視してインポートするには

primary keyやuniqueの制約を無視してインポートするには
（重複する行がある場合、既にある行が削除される）

```
mysqlimport -r データベース名 テーブル名.txt
```


## CSVファイルをインポートするには
フィールド区切り文字を変更するには`--fields-terminated-by=`を使う。
他に
`--fields-enclosed-by=...`, `--fields-optionally-enclosed-by=...`, `--fields-escaped-by=...`というオプションがある。


## auto_incrementなidをつけるのが面倒な場合

`NULL`と書いておけば自動的に採番される。

そうでなく固定で番号をつけておきたいときはvimで

```
%!cat -n
```

または

```
%!nl
```

idを1でない値から始めたい場合は（下記は50から）

```
%!nl -v 50
```

または


```
%!ruby -ne 'print ($. + 50).to_s + "\t" +  $_'
```
cargo test で 標準出力をコンソールに流す

`cargo test` を行う際は、`println!("{:?}", hoge};` などを行った際に、標準出力には流れません。

この場合の対処方法として

```rust
use std::io::Write;

#[test]
fn test_escape() {

    let a = "ab'cd
    e'rf";
    writeln!(&mut std::io::stderr(), "{}", a.escape()).unwrap();

}
```

このようにすることで、標準エラー出力を行う事ができます。
しかし、テストなのにこんなめんどくさいことしていられません。

その場合は下記のようにすることで標準出力をコンソールに流すことができます。

```
cargo test -- --nocapture
```

黒魔術感ありますが、一応これでできます！


参考: 
[stackoverflow: println! doesn't work in rust unit tests?](http://stackoverflow.com/questions/25106554/println-doesnt-work-in-rust-unit-tests)
DrawerToggleとToolbar(appCompat.v7)を組み合わせると、onOptionItemClick(id=android.R.id.home)が呼ばれない？

```
AppCompatをv22.2.0くらいにあげると、

* ActionBarActivityはDeprecatedになっていたり
* NavigationViewというのがDesign Libraryにあったり

なので、この記事は若干古くなってしまっている可能性があります。
```

![Slice 1.png](https://qiita-image-store.s3.amazonaws.com/0/74571/52c3f1d6-e2d4-c697-5524-203c98ac428e.png "Slice 1.png")

こんなかんじの画面遷移をつくろうとしたところ、

* [←]のキーが出てくれない
* [←]のキーは出たけれど、onItemClickが呼ばれない

などなど、ハマりどころがあったので、解決方法（になっているのかはわからないけど）メモ。

### 前提

左から2番めの画面で、左スワイプによるNavigationDrawerは有効にしたかったので、一番左の画面を継承する形で、作りました。
https://github.com/YusukeIwaki/ToolbarNavigationSample/blob/qiita-8fa427af2d2c0d23b46b/app/src/main/java/jp/co/crowdworks/toolbarnavigationsample/Main2Activity.java

(この方針がよろしくない、という可能性が非常に高いが)

### 解決コード

```java:DrawerToggleでUpナビゲーションを有効にするには…
        mDrawerToggle.setDrawerIndicatorEnabled(false); //ハンバーガーアイコンは無効化
        mDrawerToggle.setToolbarNavigationClickListener(new View.OnClickListener() {
            // [←] をおした時のリスナーは手動で仕掛ける
            @Override
            public void onClick(View v) {
                Main2Activity.this.onBackPressed();
            }
        });
        getSupportActionBar().setDisplayHomeAsUpEnabled(true); // [←] アイコンを有効にする
```


### 補足

* DrawerToggleを、 **Toolbarをセットしない方のコンストラクタ** で初期化すれば、onItemClick(android.R.id.home)は呼ばれる
* 何らかの事情で、DrawerToggleを、Toolbarをセットする方のコンストラクタで初期化する場合は、上記のコードのように手動でリスナーを仕掛ける必要がありそう
waifu2xで作成した画像をssimで比較してみた


# 概要
[waifu2x](http://waifu2x.udp.jp/ )を使用して、拡大した画像をssimで比較してみた

# 注意
簡単な調査しかしていないので、参考記録程度です。
テストの使用した画像が今回の調査に適していないんじゃないかって思ったりもしている。

# 元ネタ
[waifu2x](http://waifu2x.udp.jp/ )
[二次元画像を拡大したいと思ったことはありませんか？](http://ultraist.hatenablog.com/entry/2015/05/17/183436)

# SSIMってなに？
画質の評価に使われる指標
>SSIMの値が0.95以上あればオリジナルと同じぐらいの品質

# 前準備
## SSIM環境作成
[参考サイト](http://ameblo.jp/principia-ca/entry-11642522183.html)

# 調査内容
[元画像] 
(https://github.com/masayukioguni/waifu2x_ssim/blob/master/lena.jpg)(91814バイト)と元画像を1/2にした画像を[waifu2x](http://waifu2x.udp.jp/)で2倍にした画像と比較する。

# 結果
> SSIM	R:0.865914	G:0.889266	B:0.835076	AVG:0.863419

# 画像
|元画像|waifu2x|
|:-:|:-:|
|![代替テキスト](https://github.com/masayukioguni/waifu2x_ssim/blob/master/lena.jpg?raw=true "元画像")|![代替テキスト](https://github.com/masayukioguni/waifu2x_ssim/blob/master/lena2x.jpg?raw=true "waifu2x画像")|


# まとめ
+ 画像の縮小方法や設定値で結果は色々変わるかもしれないので、今後も色々試したい
+ 奇麗に出る画像とかがあるのかが気になる。
+ 二次元画像のlena.pgっぽいのがあるならそれを使いたい
cybozu.comのクラウド版ガルーンでサテライトオフィス・シングルサインオン for Google AppsのSAML2.0を利用してログインする。

* Google Appsで利用しているシングルサインオンとcybozu.comが別々の認証でユーザー側も管理者側も面倒くさい。
連携ソリューション | サイボウズ製品サイト cybozu.com https://www.cybozu.com/jp/service/solution/
↑上記では複数のシングルサインオンが紹介されているが、利用中のサービスは載ってない(ダメなの？)

* サテライトオフィス・シングルサインオンはSAML2.0のIdentity Providerを提供している。→これは使えるの？
https://sites.google.com/a/sateraito.jp/sateraito-dounyuu/Home/sso

* 出来た！


* 確認したドキュメント
**このページを公開した後にサテライト・オフィス側で最適化されて、マニュアルも出来て
簡単に導入完了する様になりました。**

> サイボウズ（Cybozu Garoon）とのシングルサインオン連携
https://sites.google.com/a/sateraito.jp/sateraito-dounyuu/Home/sso/cybozugaroon

> SAML認証を使用したシングルサインオンを設定する | cybozu.com共通管理 ヘルプ https://goo.gl/Ru9fWq
SAML認証のトラブルシューティング | cybozu.com共通管理 ヘルプ https://goo.gl/UV459k
シングルサインオン＋ログイン制限機能 - 【社外向け】サテライト導入支援ユーザー様向け https://goo.gl/PcYA6H


* 覚えておくと便利→認証設定を変更するので失敗するとログイン出来なくなるので回避方法


> SAML認証が正しく行われない場合、次のURLにアクセスするとcybozu.comのアカウントでログインし、問題を調査できます。 https://（サブドメイン名）.cybozu.com/login?saml=off
Ansibleを動かしてみる


# 目的

* Virtual Box上に構築したCentOSからさくらVPS上に構築したCentOSへのSSH接続の設定を行う
* Virtual Box上に構築したCentOSのAnsibleを動かす
* さくらVPS上に構築したCentOSに対してAnsibleで疎通確認をする

# 関連サイト

## 公式サイト

* [Ansible](http://www.ansible.com/home)

## 参考サイト

* [Ansible Tutorial](http://yteraoka.github.io/ansible-tutorial/#install-ansible)

# ダウンロードソフトウェア

* なし

# 環境

## ホストマシン

* Windows 7 Home Premium
 * Vagrant 1.7.2
 * VirtualBox 4.3.26-98988

## ゲストマシン

* CentOS7
  * Python 2.7.5
  * Ansible 1.9.1

## ターゲットマシン

* さくらVPS
 * CentOS7

# 手順

* ターゲットマシンにvagrantユーザを追加する
* ゲストマシンで秘密鍵・公開鍵を作成する
* ターゲットマシンに公開鍵を配置する
* ゲストマシンでAnsibleのhostsファイルを作成する
* Ansibleコマンドでゲストマシンからターゲットマシンの疎通を確認する

## ターゲットマシンにvagrantユーザを追加する

ゲストマシンからターゲットマシンに接続し、Ansibleで処理をする際のユーザとして`vagrant`ユーザを作成する。
ターゲットマシンで以下のコマンドを実行する。

```bash
# useradd vagrant
# passwd vagrant
Changing passwd for user vagrant.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
#
```

## ゲストマシンで秘密鍵・公開鍵を作成する

ゲストマシンからターゲットマシンにSSH接続する際に公開鍵認証方式で実行するために、秘密鍵・公開鍵を作成する。
ゲストマシンで以下のコマンドを実行する。

```bash
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/vagrant/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/vagrant/.ssh/id_rsa.
Your public key has been saved in /home/vagrant/.ssh/id_rsa.pub.
The key fingerprint is:
:
$
```

## ターゲットマシンに公開鍵を配置する

先の手順で作成した秘密鍵・公開鍵のうち、公開鍵をターゲットマシンに配置する。これには`ssh-copy-id`コマンドを使用する。以下のとおり実行する。
途中、ターゲットマシンの`vagrant`ユーザのパスワードを求められるので入力する。
`-i`の後には配置する公開鍵のパスを、その後にはターゲットマシンのユーザ名とIPアドレスを`@`で結合した文字列となる。

```bash
$ ssh-copy-id -i .ssh/id_rsa.pub vagrant@XXX.XXX.XXX.XXX
The authenticity of host 'XXX.XXX.XXX.XXX (XXX.XXX.XXX.XXX)' can't be established.
ECDSA key fingerprint is ZZ:ZZ:ZZ:ZZ:ZZ:ZZ:ZZ:ZZ:ZZ:ZZ:ZZ:ZZ:ZZ:ZZ:ZZ:ZZ.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
vagrant@XXX.XXX.XXX.XXX's password:

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'vagrant@XXX.XXX.XXX.XXX'"
and check to make sure that only the key(s) you wanted were added.

$
```

## ゲストマシンでAnsibleのインベントリファイルを作成する

Ansibleは接続先の情報を記載したファイル、インベントリファイルを参照する。これはデフォルトで`/etc/ansible/hosts`となる。
ゲストマシンにて`/etc/ansible/hosts`ファイルを作成する。記載するのはターゲットマシンのIPアドレスである。

```bash
# mkdir /etc/ansible
# vi /etc/ansible/hosts
XXX.XXX.XXX.XXX
```

## Ansibleコマンドでゲストマシンからターゲットマシンの疎通を確認する

Ansibleはコマンドに対してモジュールと呼ばれる機能を付与することで、様々な処理を行う。ここでは、疎通確認を行うために`ping`モジュールを使用する。以下のコマンドを実行し、疎通を確認する。

```bash
$ ansible XXX.XXX.XXX.XXX -m ping
Enter passphrase for key '/home/vagrant/.ssh/id_rsa':
XXX.XXX.XXX.XXX | success >> {
    "changed": false,
    "ping": "pong"
}
```

以上
jQuery DOM操作-ターゲット末尾にコンテンツを挿入-

<p>jQueryでDOM操作においてあるDOM要素に別のDOM要素を挿入したい場合には以下のメソッドが使える</p>

<ul>
<li>append()-ターゲット末尾にコンテンツを挿入</li>
<li>prepend()-ターゲット先頭にコンテンツを挿入</li>
<li>after()-ターゲットの後にコンテンツを挿入</li>
<li>before()-ターゲットの前にコンテンツを挿入</li>
<li>replaceWith()-ターゲットのコンテンツを置き換え</li>
</ul>

<p>ここでまず言葉の説明<br>
ターゲット：操作の対象となる要素<br>
コンテンツ：ターゲット末尾・先頭または前後に挿入される要素</p>

<p>上記5つのメソッドは以下のようにも書き換えられる</p>
<ul>
<li>appendTo()-ターゲット末尾にコンテンツを挿入</li>
<li>prependTo()-ターゲット先頭にコンテンツを挿入</li>
<li>afterTo()-ターゲットの後にコンテンツを挿入</li>
<li>beforeTo()-ターゲットの前にコンテンツを挿入</li>
<li>replaceAll()-ターゲットのコンテンツを置き換え</li>
</ul>

今回はappend()およびappendTo()について説明する。とはいえ、他のメソッドについても考え方は同じで、動作が異なるだけだ。

<h2>append/appendTo</h2>
<p>appendとappendToは目的に違いはないが、書き方が異なるし、動作も異なる時がある。意図する動作に合わせて使い分けなければならない。</p>
<h3>書き方</h3>
<h4>append</h4>
<p>$(target).append(content)<br>
例えば以下のHTML文章では、</p>
<pre>
&lt;div id="content">アリッサ・ホワイト・グラズ&lt;/div>
&lt;div>アーチ・エネミーのボーカル&lt;/div> 
&lt;div id="target">&lt;/div>
</pre>
<p>では<pre>$('#target').append($('#content'))</pre>と書く。</p>
<p>ちなみにこのスクリプトが実行されると、ブラウザでは</p>
<pre>アーチ・エネミーのボーカル
アリッサ・ホワイト・グラズ
</pre>
<p>表示される。</p>
<p>HTML文章はスクリプトなしでは先頭に「アリッサ・ホワイト・グラズ」とブラウザに表示していたのが、スクリプトを実行すると、「アリッサ・ホワイト・グラズ」が文章末尾に移動される。移動ではなく、コピーするなら</p>
<p><pre>$('#target').append($('#content').html())</pre>と書く。</p>

<h4>appendTo</h4>
<p>$(content).appendTo(target)</p>
<p>appendとは逆にメソッドの引数にはtargetを指定する。ちなみに引数にはappendとは違い、関数を指定できない。またこのメソッドでは<pre>$('#target').append($('#content').html())</pre>と同じ動作を再現できない。あくまで僕が試した範囲内での話であり、再現できる方法を見つけてくれた人や知っている人はコメントで教えてほしい。</p>
spanタグにデータ属性を持たせる

railsでhtmlに値をもたせたいと思ってhidden_field_tagを利用して実装しようとしたが、<span>タグにdata属性として渡したほうがいいというアドバイスをもらったのだが、data属性ってなに？どうやるの？？ってなったのでメモします。
やりたかったこととしては、HTMLに値をもたせておいて、それをJavaScriptでとってきて、cookieに保存すること。

## data属性って？
以下のようにhtmlタグの中に書く。
``` data-* ```
data属性：適切な属性や要素がない場合にページやアプリケーションに固有の独自データを格納する。全ての HTMLにたいして独自のデータ属性をいくつでも、どんな値でも作れる。[参考](http://www.html5.jp/tag/attributes/data.html)
つまり、ザックリ言うと
###### オールマイティーな属性
と、私は納得しました（全然わかってないかもw）

## じゃあどう書けばいいの？
初めは
``` <%= hidden_field_tag '' , VALUE, { :class => hoge } %> ```
という感じで書いていました。
しかし、こんな面倒なことしなくてもよいという指摘をうけ、
``` <span class="hoge" data-sample="<% VALUE %>" ```・・・①
と書きました。railsのhiddenタグにdataオプションないよ・・・VALUEの値はコントローラーで渡されたものいれてeachでまわしたいんだよ・・・と思っていたら考えすぎていましたが、上記のように簡単にかけました。
（新卒あるある）

## じゃあJavaScriptでdata属性としてもたせたものを使うには？
そして次なる壁はJSで使うこと。JQueryを利用すると
```
id属性の時：$('#sample')
class属性の時：$('.sample')
data属性の時：$('.sample').data('sample')
```
というような対応でかけます。上記のdata属性の部分は①と対応しています。
data属性の場合は、「どこどこclassのdataを持ってきてね」と書く感じかな。

## まとめ
HTMLにdata属性を使う時は
``` <span class="CLASS-NAME" data-DATANAME="<% VALUE %>" ```
data属性をJSで使う時は
``` $('.CLASS-NAME').data('DATANAME') ```
Microsoft SQLServer 2014 で sa でのログインを有効化

毎度毎度のsa有効化だよ。誰かのためにわかりやすい資料を残しておくね

![スクリーンショット 2015-05-18 0.14.18.png](https://qiita-image-store.s3.amazonaws.com/0/9988/8473a309-2db7-32f9-42ff-570ff7c31219.png)

# サーバーのプロパティからサーバー認証を変更する

オブジェクトエクスプローラーのルートを右クリックし、プロパティを開く

![スクリーンショット 2015-05-18 0.22.37.png](https://qiita-image-store.s3.amazonaws.com/0/9988/fd54a837-777a-105a-bd3e-e744863ce95a.png)

![スクリーンショット 2015-05-18 0.24.31.png](https://qiita-image-store.s3.amazonaws.com/0/9988/2d6ad2d7-18a3-e756-6f37-d8a656b8f79e.png)


「ページの選択」から「セキュリティ」を開き、「サーバー認証」のセクションの「SQL Server 認証モードと Windows 認証モード(S)」を選択する。

![スクリーンショット 2015-05-18 0.09.30.png](https://qiita-image-store.s3.amazonaws.com/0/9988/434ada18-0038-e190-3a0c-4beab2b8f10b.png)


# sa のログインを有効化する

オブジェクトエクスプローラーから、「セキュリティ -> ログイン」をクリックして展開し、sa を右クリックしてプロパティを開く


![スクリーンショット 2015-05-18 0.27.42.png](https://qiita-image-store.s3.amazonaws.com/0/9988/3517f3ef-ed94-6e5f-eb68-f5c35d3a7d38.png)

![スクリーンショット 2015-05-18 0.28.59.png](https://qiita-image-store.s3.amazonaws.com/0/9988/b436ad1f-eb0a-958b-1068-5f7a39997c65.png)

「ページの選択」から「状態」を選び「ログイン」のセクションで「有効」を選択


![スクリーンショット 2015-05-18 0.30.40.png](https://qiita-image-store.s3.amazonaws.com/0/9988/f80b6fc8-2286-80d1-c420-ded0de290df7.png)


次に、「ページの選択」から「全般」を選び、パスワードを再設定する

![スクリーンショット 2015-05-18 0.32.19.png](https://qiita-image-store.s3.amazonaws.com/0/9988/b0320b10-d2a2-28ea-596c-2f7ac6c22c12.png)

# 再起動して設定を有効化

オブジェクトエクスプローラーからルートを右クリックし「再起動」をする

![スクリーンショット 2015-05-18 0.33.36.png](https://qiita-image-store.s3.amazonaws.com/0/9988/d504ee28-887e-fca2-0434-5508f3d4159e.png)

これで sa は有効化されます
Selenium関連で最新版のFirefox 38に不具合がある件

#不具合
最新版のFirefoxを使用しSelenium Builderでエクスポートをしようとしたらエラーが出ます。
また、WebDriverから最新版のFirefoxを起動することは出来ますがその後ページに飛ぶ事が出来ませんので動いていない同然です。

#対処方法
Firefoxのバージョンの問題のようですので下げましょう。
Selenium Builderしか使っていない方向けでお勧めは37以下のポータブルバージョンをインストールする事です。

37.0.2を下記よりダウンロードできます。
FirefoxPortable_37.0.2_Japanese.paf.exe (43,531,512 バイト/MD5: 8ba528c3eee1bed1fadaad5b9d4a4b6c)のダウンロードが開始されます。
http://osdn.jp/projects/sfnet_portableapps/downloads/Mozilla%20Firefox,%20Portable%20Ed./Mozilla%20Firefox,%20Portable%20Edition%2037.0.2/FirefoxPortable_37.0.2_Japanese.paf.exe/

WebDriverから立ち上げる方はバージョンダウンを試みてください。
アンインストールを行い、37をインストールしましょう。

以前のバージョンの Firefox をインストールするには
https://support.mozilla.org/ja/kb/install-older-version-of-firefox

Firefox 37.0.2 (日本語版)
https://download-installer.cdn.mozilla.net/pub/firefox/releases/37.0.2/win32/ja/Firefox%20Setup%2037.0.2.exe

#参照
Selenium Builderが最新版の狐（Firefox 38.0.1）で不具合がある件
http://hotuta.hatenablog.com/entry/2015/05/17/233809

Selenium WebDriver　"Unable to connect to host" エラー
http://qiita.com/Sankame/items/ac347a83f45f7fddf7cb

#追記
2.46.0が登場しFirefox 38のサポートが始まったようなのでそろそろ解決されそうですが6/7現時点ではやはりFirefoxが起動するだけでほかの動作をする事が出来ません。
今後もFirefoxがバージョンアップをする毎にこのようなことが起こると思われますので日ごろからChromeなどでテストするように心がけてみてはいかがでしょうか。
Oracle Master Silver 11g 合格記

先日、Oracle Master Silver 11g DBA を受験して、合格したので勉強方法と内容をメモ。

目的：
自分はITコンサル会社の新卒入社3年目。
最初に入ったチームで1年半ぐらい、DBAしてました。
メインでずっとOracleを使っていたので、業務上得た知識は結構あるが、プロジェクトもそろそろ終わるので次のプロジェクトに移る前に体系的に勉強して、資格として形に残しておきたかった。

結果：
83％で1発合格。（合格ラインは66％）

勉強期間：
1ヶ月
※時間にすると、20時間〜30時間くらい。
インプット時期の毎日1章ずつ解くときは、30分〜45分ぐらい。わからないところに下手に突っこまない。（公式ドキュメントとか読みだすと、きりがないｗ）

勉強方法：
使ったのは、いわゆる白本のみ。これを何遍もあきるまで（飽きても）繰り返す感じ。
http://www.amazon.co.jp/dp/4797361867

* 1日1章、参考書部分を読んで問題を解く。間違えたところに印付ける。（この時点では模擬試験には手を付けない）
* 2周目、問題の間違えたところだけを4日ぐらいでざっと解きなおす。また間違えたところに印付ける。
* 模擬試験（2回分）を時間を測って解く。この時点で、だいたい50〜55％ぐらいで、合格ラインには達していない。
* 3週目、練習問題・模擬試験すべて間違えたところを通して解く。間違えたところは印。
* 4週目、練習問題の間違えたところを解いて、まだ間違えたところは問題に答えをつけてしまう（答えを丸暗記してしまうため）
* 模擬試験を全問解きなおす。これは試験前日で87％。間違えたところは問題に答えを書いてしまう。
* 試験開始2時間前ぐらいにテストセンター近くの喫茶店で、書き込んだ答えをすべて読む。を2週やる。ついでに各章末のチェックポイントを全部チェック。

感想：
勉強開始時点では、UNDO管理やメモリ管理のあたりとか自分のいままで知識がすごく表面的だったことがわかりショックを受けつつも楽しく勉強できた。
OracleはDBAの業務が楽になるために、いろんな仕組みをいれているが、うちのプロジェクトでは案外そこにはのっからないことが多い。例えば、11gから使える自動メモリ管理ではなく、共有メモリ管理にしている。構築した人の意図を考えつつ勉強したので、身についた事が多かった。
うちのプロジェクトは実は、ASMもRACも使っているがこれはGoldの範囲なので、受けてみようと思った。問題は高額のセミナー料をどうするかだなー。
mongooseでupsert(レコードあればupdate、なければinsert)


最初に触れたのがmonkだったのでmonk使ってましたがupsertが分からずmongooseデビューしました。。

```
〜スキーマ定義などなど〜

article = mongoose.model('article', schema);
mongoose.connect('mongodb://localhost:27017/hogetable', function(err) {});
	  
article.update({id: XXX}, item, {upsert: true}, function(err) {});

※引数1：updateするレコードの条件
※引数2：更新or挿入するレコード
※引数3：{upsert: true}の指定をする！
※引数4：コールバック
```
mongooseならこれでいけます。
proftpdで特定ユーザからは見えないディレクトリを設定する

↓こんな風な設定書いておくと user1 さんだけに見えない /foo/bar ってディレクトリが作れる。

```
DefaultRoot /data/ROOT

<Directory /data/ROOT/foo/bar>
  <Limit ALL>
    IgnoreHidden on
    DenyUser user1
  </Limit>
</Directory>
```

- ※DefaultRootは特に必要なわけじゃなく、単にDefaultRootを使ってる場合の設定例を書きたかっただけです。
- Directoryで指定するのはchrootされた後のパス(/foo/bar)ではなく、chroot前のディレクトリで指定する。
- 設定の要は `IgnoreHidden on` です。
    - off な場合（デフォルト）、`ls /foo` で /foo/bar の存在は見えて、でも `cd /foo/bar` はAccessDeniedで失敗する感じになる。
    - on な場合、`ls /foo` で /foo/bar の存在自体が見えなくなって、`cd /foo/bar` はNotFoundで失敗する感じになる。
- DenyUserじゃなくDenyGroupとか他の方法でDenyしても良い。
- DenyUserで指定するのは認証に使ったユーザ名です（uidに対するサーバ上の実ユーザ名ではない）。
    - 例えば user1,user2,user3 が全員同じuid,gidが設定された仮想ユーザだった場合でも、 user1,user2,user3はユーザ名で区別されます。
C++の標準ライブラリを一行で一括でインクルードする

```c++
#include <bits/stdc++.h>
```

このヘッダファイルはgccを入れると一緒についてくる。中身は次を参照のこと。
https://gcc.gnu.org/onlinedocs/gcc-4.9.2/libstdc++/api/a01220_source.html

標準ライブラリを一発でインクルードできるので、競技プログラミングなどの場面では面倒が省けてよい。

## OSXやVC++では使えない？
OSXのCommand Line Toolsで手に入る`gcc`コマンドは、実は`clang`にオプションをつけたエイリアスになっている。`gcc`が入っていないので、上記のヘッダファイルも提供されていない。

VisualStudioのVC++でもやはり提供されていないので、デフォルトでは使用することができない。

だが、便利なものは使いたい。なんとかしよう。

## 対処する
### 1. gccを手に入れる
gccに付属しているのでこれが一番手っ取り早い。
homebrew等のパッケージマネージャを用いる場合は、パスの参照順に影響を受けがちである。`gcc -v`や`which gcc`により自分が使っている`gcc`が今インストールしたものかどうか確かめること。

### 2. bits/stdc++.h を作ってインクルードパスに含める
いくつか実現方法がある。

#### 2.1 親ディレクトリに置く
親ディレクトリにディレクトリ`bits`を作り、その中に`stdc++.h`を配置する方法がある。この方法の場合、

```c++
#include "bits/stdc++.h"
```

のように、ダブルクォートで囲う必要がある。

ダブルクォートと山括弧の間には、`#include`を記載したファイルの親ディレクトリを起点とした検索をするかしないかの違いがある。つまり、`gcc`でコンパイルするようなジャッジサーバにこの記法で`bits/stdc++.h`をインクルードしたコードを送っても問題ない。

しかし、コードを書く場所が異なればそのたびに配置しなければならず、面倒である。
また上述の理由から、山括弧で`bits/stdc++.h`を参照している他者のコードがそのままでは動かない。面倒である。

#### 2.2 インクルードパスを増やす
適当な場所に`bits/stdc++.h`を配置し、そのディレクトリをインクルードパスとして指定することで、山括弧でも参照できるようになる。
`/path/to/parent/dir/bits/stdc++.h`に配置したとしよう。

##### 2.2.1 コンパイルするときにオプションで指定する
```
$ g++ -I/path/to/parent/dir main.cpp
```

と書けば、

```c++
#include <bits/stdc++.h>
```

と書くことができる。

##### 2.2.2 環境変数に書いておく
`CPLUS_INCLUDE_PATH`環境変数に書いておくと、インクルードパスに含めてコンパイルしてくれる。オプションで指定するよりもっと楽だろう。既に値が入っている場合は、`PATH`と同様の記法で複数のパスを書くことができる。

.bash_profileあたりに次のように書くことになる。

```
export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/path/to/parent/dir
```

#### 注意すべきこと
先進的な機能に関するライブラリのインクルードが含まれている場合があるので、自分が今使っているコンパイラがそれらの機能に対応しているかを確かめておく必要がある。
2015年時点では&lt;future&gt;や&lt;atomic&gt;が該当するだろう。未対応のコンパイラでこういった項目をインクルードしているとコンパイルエラー等の問題が発生する。

## 参考
clang(1) - Linux man page
http://linux.die.net/man/1/clang

C/C++の#includeディレクティブの" "と< >の違い - HIDARI日記（右）
http://hidari-lab.hatenablog.com/entry/2013/03/20/235242

Useful C++ "library" - Codeforces"
http://codeforces.com/blog/entry/8387

homebrewでgcc4.9を入れたお話 - ぱーぽーのぷろぐらみんぐ記
http://purple-jwl.hatenablog.com/entry/20140706/1404655974

VisualStudioでもbits/stdc++.hでC++のヘッダファイルを一括インクルードしたい！
http://qiita.com/tosaka2/items/a52e065fb23613f70c63
Ansibleで標準パス以外にインストールされたPythonを利用するには

pyenvを入れたMACに対してAnsibleを実行しようとしたらエラーが出たのでその回避方法をメモ

+ 利用しているpythonのパスを確認

```bash
$ which python
/Users/username/.pyenv/shims/python
```


+ 確認したパスをinventoryファイルに記載する

```ini:hosts
[localhost]
localhost
[localhost:vars]
ansible_python_interpreter=/Users/username/.pyenv/shims/python
```
Electron + CoffeeScript

CoffeeScript を使って Electron アプリケーションを書く方法を試してみました。[reactjs - electronでbabel + reactを直接使えるようにするまで - Qiita](http://qiita.com/suisho/items/a3822167604e5ad6c19b) を参考にしました。

たぶん、TypeScript なんかも同じように typescript-register とか使えばいけると思います。

ポイント
--------

* メインプロセスではまだ CoffeeScript 化は成功していない
* レンダリングプロセスで coffee-script/register を require する

ソース
------

* package.json

```json
{
  "name": "testelectron",
  "main": "app.js",
  "scripts": {
    "run": "./node_modules/.bin/electron app.js"
  },
  "dependencies": {
    "coffee-script": "^1.9.2",
    "electron-prebuilt": "^0.26.0"
  }
}
```

* app.js

```js
var app = require('app');
var BrowserWindow = require('browser-window');
var mainWindow = null;

app.on('window-all-closed', function() {
    app.quit();
});

app.on('ready', function() {
  mainWindow = new BrowserWindow({width: 800, height: 600});
  mainWindow.loadUrl('file://' + __dirname + '/index.html');
  mainWindow.on('closed', function() {
    mainWindow = null;
  });
});
```

* index.html

```html
<!DOCTYPE html>
<html lang="ja">
  <title>greetings</title>
  <div id="greetings"></div>
  <script>
    require('coffee-script/register');
    require('./renderer.coffee')
  </script>
</html>
```

* renderer.coffee

```coffeescript
greetings = document.getElementById 'greetings'
greetings.innerHTML = "hello, world."
```

実行
----

```
$ npm install
$ ./node_modules/.bin/electron app.js
```