OmniAICreator/Qiita-1.07M huggingface dataset:
知ってるようで知らないClassクラス(基本編)

**■前置き**
JavaにClassクラスが存在することを大抵のJava技術者はご存知だと思いますが、実際、Classクラスとは何なのか、いつ、どうやって生成されるかなど、知らない人がほとんどではないでしょうか？

多分、使ったことがあるのは、主に以下の２パターン
１．DB接続時にドライバクラスをforName()する。
２．インスタンスからクラス情報を取得する

１は多分、みんな、おまじないのように使ってる。
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
って感じで、よくわからないけど、上記のようにドライバクラスを指定してからじゃないとDB接続できないから、おまじないとして使ってる。という人が多いと思います。

２は用途はいろいろですが、インスタンスからgetClass().getName()してクラス名を取得して、ログに出したり、なんちゃらしたりだと思います。

**■Classクラス**
すべてのクラスのスーパークラスである java.lang.Object クラスにgetClass()というメソッドが実装されており、サブクラスのインスタンス生成時に該当のサブクラスのClass情報をClassクラスのインスタンスとして生成し、保持します。
また、同時にObjectクラスにはclassというpublic static finalフィールド(メンバ変数)が存在し、クラスロード時に生成され、String.classという様にすることで、対象のクラスのClassクラスを取得することができる。
※更に詳細に話すと、ClassLoaderクラスとリフレクションの話をしなければなりませんが、そこを話すと長くなりますので、今回は割愛します。

**■Class.forName(”DBドライバクラス”)**
ちょっと余談になりますが、前置きで書いたDBドライバをforName()する理由について説明します。
このforName()メソッドは、引数に文字列で指定したクラスのClassクラスを取得するのが、本来の使い方です。ですので、DBドライバクラスをforNameすると、返り値として、DBドライバクラスのClassクラスを取得できます。しかし、DBドライバクラスをforName()する理由はClassクラスを取得するためではありません。
forName()することにより、DBドライバクラスがロードされ、staticイニシャライザが実行されます。DBドライバクラスは全て、java.sql.Driverを実装しており、各DBドライバクラスでは、staticイニシャライザでDriverManagerクラスというドライバを管理するクラスにDBドライバクラス自身を登録しに行くという処理を実施しています。
こうすることにより、後続処理で各DBドライバを利用しての、DB接続処理を実施することができるようになる。

※誤りございましたら、申し訳ありませんが、ご指摘願います。
nyagosスクリプト解説 - ezoe.lua「コマンドではない。」

catalog.d\ に格納されている[お遊びスクリプトの一つ](https://github.com/zetamatta/nyagos/blob/master/catalog.d/ezoe.lua)。コマンドが無い時にフック `nyagos.on_command_not_found` に関数が登録されていると、その関数が呼ばれる機能を利用している（**というか、このために作った**）。

```ezoe.lua
nyagos.on_command_not_found = function(args)
    nyagos.writerr(args[0]..": コマンドではない。\n")
    return true
end
```

また、cd で存在しないディレクトリに移動した時にも「ディレクトリではない。」と出すようにした。これは cd をエイリアス定義することで実現している。

```lua
local cd = nyagos.alias.cd
```

**cd は実は結構多重にエイリアス定義されている**。なので、先に定義されているエイリアスをローカル変数に退避しておく。

```lua
nyagos.alias.cd = function(args)
    local success=true
    for i=1,#args do
        local dir=args[i]
        if dir:sub(1,1) ~= "-" and
            not dir:match("%.[lL][nN][kK]$") and
            not dir:match("^[a-zA-Z]:[/\\]$") and
            not dir:match("^[/\\]$") and
            dir ~= ".." and
            dir ~= "." then

            local stat = nyagos.stat(dir)
            if not stat or not stat.isdir  then
                nyagos.writerr(dir..": ディレクトリではない。\n")
                success = false
            end
        end
    end
```

引数を一つずつ吟味している。基本は nyagos.stat でディレクトリでない場合に「ディレクトリではない。」と出せばよいのだが、以下の例外があるので、それらに関してはスルーさせている。

- マイナスで始まるものはオプション
- 拡張子が .lnk（別のスクリプト cdlnk.lua ではショートカットの先に cd できるので）
- ルートディレクトリ (nyagos.stat がエラーになるので）
- 「..」「.」(示している先がルートディレクトリだったりすると nyagos.stat がエラーになる）

吟味した結果特にエラーがない場合は、元の cd を呼び出す。

```lua
    if success then
        if cd then
            cd(args)
        else
            args[0] = "__cd__"
            nyagos.exec(args)
        end
    end
end
-- vim:set fenc=utf8 --
```

変数「cd」は先に退避しておいた、オリジナルのエイリアスを格納したローカル変数。非nilなら、その関数をそのまま呼び出せばよし。nil なら、実際にディレクトリを変えればよろしい。が、`nyagos.exec('cd')`とかやると無限ループになる。かといって「`cd.exe`」などというものは存在しない。だが、**こんなこともあろうかと** `__cd__` などという内蔵コマンドの別名を…
総称型（ジェネリクス） ワイルドカード指定とObject指定との違い

javaでコード書いてて、
　ここはワイルドカード（?指定）にすべきだよな。
　ん？Objectか？あれ？どっちだっけ？
っとよくわからなくなったのでまとめることにしました。

先に結論書くと下記のような感じです。

* ワイルドカード指定だと、それ自体はジェネリクス何指定でも代入できる。
* Object指定だと、Object指定されたものしか代入できない。
* (MapやListは)ワイルドカード指定だと、扱いはほぼ参照専用になる。（例外もある）

functionなどで汎用的に受け取って、中で編集せず参照だけするなら
引数のMapやらListのジェネリクスはワイルドカード使ったほうが便利です。


以下は試してみたコードです。

Map

```java
		{
			Map<String, ?> wmap = new HashMap<String, String>();//OK
			Map<String, Object> omap = new HashMap<String, String>();//コンパイルエラー
		}
		{
			Map<String, ?> wmap = new HashMap<String, Object>();//OK
			Map<String, Object> omap = new HashMap<String, Object>();//OK
		}
		Map<String, ?> wmap = new HashMap<String, Object>();
		Map<String, Object> omap = new HashMap<String, Object>();

		Map<String, String> smap = new HashMap<String, String>();
		Map<String, ?> wmap2 = new HashMap<String, Object>();
		Map<String, Object> omap2 = new HashMap<String, Object>();

		wmap = smap;//OK
		omap = smap;//コンパイルエラー

		wmap = wmap2;//OK
		omap = wmap2;//コンパイルエラー

		wmap = omap2;//OK
		omap = omap2;//OK

		wmap.put("A", Integer.valueOf(1));//コンパイルエラー
		omap.put("A", Integer.valueOf(1));//OK

		wmap.put("A", new Object());//コンパイルエラー　もちろんObjectでもだめ

		wmap.putAll(omap2);//コンパイルエラー
		omap.putAll(omap2);//OK

		wmap.putAll(wmap2);//コンパイルエラー
		omap.putAll(wmap2);//OK

		{
			Object o1 = wmap.get("A");//OK
			Object o2 = omap.get("A");//OK
		}
		for (Object o : wmap.values()) {//OK
			//
		}
		for (Object o : omap.values()) {//OK
			//
		}
		{
			Object o1 = wmap.getOrDefault("A", "S");//コンパイルエラー
			Object o2 = omap.getOrDefault("A", "S");//OK
		}
		{
			Object o1 = wmap.computeIfAbsent("A", k -> "S");//コンパイルエラー
			Object o2 = omap.computeIfAbsent("A", k -> "S");//OK
		}
```

List

```java
		{
			List<?> wlist = new ArrayList<String>();//OK
			List<Object> olist = new ArrayList<String>();//コンパイルエラー
		}
		{
			List<?> wlist = new ArrayList<Object>();//OK
			List<Object> olist = new ArrayList<Object>();//OK
		}
		List<?> wlist = new ArrayList<Object>();
		List<Object> olist = new ArrayList<Object>();

		List<String> slist = new ArrayList<String>();
		List<?> wlist2 = new ArrayList<Object>();
		List<Object> olist2 = new ArrayList<Object>();

		wlist = slist;//OK
		olist = slist;//コンパイルエラー

		wlist = wlist2;//OK
		olist = wlist2;//コンパイルエラー

		wlist = olist2;//OK
		olist = olist2;//OK

		wlist.add("A");//コンパイルエラー
		olist.add("A");//OK

		wlist.add(new Object());//コンパイルエラー　もちろんObjectでもだめ

		wlist.addAll(olist2);//コンパイルエラー
		olist.addAll(olist2);//OK

		wlist.addAll(wlist2);//コンパイルエラー
		olist.addAll(wlist2);//OK

		Object o1 = wlist.get(0);//OK
		Object o2 = olist.get(0);//OK
		
		for (Object o : wlist) {//OK
			//
		}
		for (Object o : olist) {//OK
			//
		}
		wlist.remove("A");//OK
		olist.remove("A");//OK

		wlist.sort((a, b) -> (Integer) a - (Integer) b);//OK
		olist.sort((a, b) -> (Integer) a - (Integer) b);//OK
```
48時間でSchemeを書こう/REPLの作成

# 参考URL
[48時間でSchemeを書こう/REPLの作成](https://ja.wikibooks.org/wiki/48時間でSchemeを書こう/REPLの作成)

#ソース
https://github.com/0zawa/scheme_in_48_hours/blob/master/building_repl.hs

#REPL
REPLとはRead-Eval-Print-Loopの略です。
その名の通り、読んで、評価して、表示、を繰り返すプログラムです。

まず、「読む」部分を作っていきます。

#Read

```hs
flushStr :: String -> IO ()
flushStr str = putStr str >> hFlush stdout

readPrompt :: String -> IO String
readPrompt prompt = flushStr prompt >> getLine
```

flushStrは文字列をputStrで表示した後、
バッファに残っている文字列を標準出力に書き出します。

readPromptはpromptをflushStrで表示させた後、
getLineで標準入力から一行読み込みます。

promptには"Lisp>>> "のような入力を促すための
文字列が渡されます。

#Eval
次に評価部分を作ります。

```hs
evalString :: String -> IO String
evalString expr = return $ extractValue $ trapError (liftM show $ readExpr expr >>= eval)
```

evalString関数は複雑なので少しずつみていきます。

```hs
readExpr expr >>= eval
```

まず引数で渡された文字列をreadExprで
ThrowsError LispValに変換します。
続いてevalで評価して、結果のThrowsError LispValを得ます。

```hs
liftM show $ readExpr expr >>= eval
```
evalの結果に対しliftM showを適用し、
ThrowsError Stringを得ます。
liftMはThrowsErrorの中身に対して、与えられた
関数を適用します。


```hs
trapError (liftM show $ readExpr expr >>= eval)
```

trapErrorはエラーを文字列に変換するために適用します。
この結果必ずRight値を持ったThrowsErrror Stringになります。

```hs
extractValue $ trapError (liftM show $ readExpr expr >>= eval)
```

extractValueはThrowsErrorのRight値を取り出す関数です。
trapErrorの結果のThrowsError Stringから
Stringを取り出します。

```hs
evalString :: String -> IO String
return $ extractValue $ trapError (liftM show $ readExpr expr >>= eval)
```

最後に結果の文字列をreturnでIOに包んで返却します。

#Print

次にこの結果を表示する関数を定義します。

```hs
evalAndPrint :: String -> IO ()
evalAndPrint expr = evalString expr >>= putStrLn
```

#Loop
最後に、これまで作った処理をループさせてREPLを完成させます。

```hs
until_ :: Monad m => (a -> Bool) -> m a -> (a -> m ()) -> m ()
until_ pred prompt action = do 
    result <- prompt
    if pred result 
       then return ()
       else action result >> until_ pred prompt action
```

until_関数はまず、promptで渡されたアクションを実行して、
結果をactionに格納します。

promptには先ほど定義したreadPrompt関数が渡されます。

```hs
readPrompt "Lisp>>> " 
```

actionにはreadPromptの実行結果が格納されるので、
標準入力から一行読み込んだ文字列が格納されることになります。

続いて、結果をpredに渡して真偽値を判定します。
predには

```hs
== "quit"
```
が渡されます。

読み込んだ文字列が"quit"だった際はreturn ()で
REPLを抜けます。
それ以外の場合は結果をactionに渡して、その後
until_を再帰的に呼び出します。

actionには

```hs
evalAndPrint
```
が渡されます。
evalAndPrintに標準入力から取得した文字列が渡され、
その文字列が評価されて、最後に結果が表示されます。

until_を呼び出す関数も定義します。

```hs
runRepl :: IO ()
runRepl = until_ (== "quit") (readPrompt "Lisp>>> ") evalAndPrint
```

最後にrunRepl関数をmainから呼び出すようにして完成です。

```hs
main :: IO ()
main = do args <- getArgs
          case length args of
              0 -> runRepl
              1 -> evalAndPrint $ args !! 0
              otherwise -> putStrLn "Program takes only 0 or 1 argument"
```

プログラムに引数が渡された場合は、その文字列を評価、表示し、
渡されなかった場合は、REPLを実行します。
引数が２つ以上渡されていた場合はエラーにして終了させます。
Selenium RCでいろいろ

# Selenium RCでいろんなことをやってみる
「Selenium Remote Control」 が正式名称です。または、「Selenium1.0」です。

※2024年、現在ほぼ使われておりません。。きっと。

**「Selenium RC」** でちょこっと作成。
**「Selenium IDE」** だけでは、Firefox以外のブラウザに対応していないため。
今は　**「Selenium WebDriver」** の方が主流かも。しれないですがあえて「Selenium 1.0」で対応することに。

`これは何？`
ローカルPC上で　**「Selenium Server」** サーバーを起動。中継サーバーがJavaScriptのブラウザ操作ロジックをWebページに埋め込み、Webサーバー上へのスクリプトの配置は不要

`最新のSeleniumのJarファイルはここです。`
http://www.seleniumhq.org/download/

Jarファイル：selenium-server-standalone-3.0.1.jar
起動ブラウザ：firefox

「SeleniumIDE」とは違い、Firefox限定ではなく「Internet Explorer」「Google　Chrome」「Safari」「Opera」ブラウザも対象となります。幅広くブラウザテストをするには、おすすめですね。

```lang:コマンドラインで指定する
java -jar selenium-server-standalone-3.0.1.jar
```

```java:Batファイル

①firefoxブラウザ
java -jar selenium-server-standalone-3.0.1.jar -htmlSuite "*firefox" "http://www.google.com" "C:\Users\junjun\Downloads\Selenium.html" "C:\Users\junjun\Downloads\test.html"

②Chromeブラウザ
java -jar selenium-server-standalone-3.0.1.jar -htmlSuite "*googlechrome" "http://www.google.com" "C:\Users\junjun\Downloads\Selenium.html" "C:\Users\junjun\Downloads\test.html"

③Internet Explorerブラウザ
java -jar selenium-server-standalone-3.0.1.jar -htmlSuite "*iexplore" "http://www.google.com" "C:\Users\junjun\Downloads\Selenium.html" "C:\Users\junjun\Downloads\test.html"

htmlSuiteで「使用するブラウザ：*firefox」と「開くURL：http://www.google.com」と「使用するスクリプト：C:\Users\junjun\Downloads\Selenium.html」、最後に「テスト結果：C:\Users\junjun\Downloads\test.html」を指定します。
```
![cmd.jpg](https://qiita-image-store.s3.amazonaws.com/0/55160/6d885f91-ceaf-007e-34be-23cd17e10e5c.jpeg)

SeleniumRCのTestRunnerが起動し、テストがはじまります。

![RC.jpg](https://qiita-image-store.s3.amazonaws.com/0/55160/191baa6a-830f-31a4-44a3-cb8eb13d0a47.jpeg)

合わせて、指定した画面も確認。作成したスクリプトが走ります。

![yahoo.jpg](https://qiita-image-store.s3.amazonaws.com/0/55160/acd4cf98-073e-cd0a-d667-c00882ebc8ca.jpeg)

テスト結果になります。


![result.jpg](https://qiita-image-store.s3.amazonaws.com/0/55160/d356d24f-3274-f645-fb76-ae98f862b6f8.jpeg)

# スクリプト
今までは、「Firefox」での動作確認でしたが「Internet Explorer」でそのままスクリプトを使用するとエラーが起こってしまいます。しかも、バージョンで動かなくなることが多いので常に調査です。
タブがバックグラウンドになったかどうかチェックしたい


Page Visibility APIというものを使うと、タブが表示・非表示になった際にイベント発火できます。

対応ブラウザはこちら
http://caniuse.com/#feat=pagevisibility
もう大体大丈夫そうですね

Javascriptでこんな感じで書くといいらしいです。

```js
document.addEventListener('webkitvisibilitychange', function(){
  if ( document.webkitHidden ) {
    // 非表示状態になった時の動作
  } else {
    // 表示状態になった時の動作
  }
}, false);
```

**webkitvisibilitychange**
の部分はプリフェックスが不要なブラウザの場合は
**visibilitychange**
でいいようですが、こちらに対応しているブラウザについては追って調査します。

#どんな時に使うの？
タブを開いている際にだけ動画を再生するデモ（PC）
http://www.samdutton.com/pageVisibility/
別タブにすると一時停止して、戻ると再生が始まるのがわかると思います。
階層構造オブジェクトの値を取る（JavaScript）

こんにちは。
「[. ドットつなぎのプロパティへのアクセス](http://qiita.com/exabugs/items/e3cc79b69ddeb6856d3e)」（```getValue()```； 存在しないキーへのアクセスにも対応）を読んで、なるほどと思いました。
> 階層構造のオブジェクトのプロパティに、文字列で指定してアクセスしたい場合ありますよね。

これのごく簡易版を自分でも書いてみました。


```javascript
var obj = {user: {name: 'hoge'}};
getValue(obj, 'user.name');  // ==> obj.user.name すなわち obj['user']['name'] (従って ='hoge')
```

```javascript
function getValue(obj, key, undefinedValue) {
    var k = key.split('.');
    for (var i = 0, v = obj; i < k.length; i++) {
        if (!(k[i] in v)) {return undefinedValue;}
        v = v[k[i]];
    }
    return v;
}
// ２引数で使うと、関数内部では undefinedValue は「undefined」値にセットされる。
```

コメントを頂き、恥ずかしいミスを修正しています。
nyagosスクリプト解説 - svn のサブコマンドを勝手に拡張する

そう、nyagos ならね！

```lua:%USERPROFILE%\.nyagos
nyagos.alias.svn = function(args)
    if args[1] == "amdc" then
        return "svn.exe status | findstr ^[AMDC]"
    end
    args[0] = "svn.exe"
    if args[1] == "exclude" then
        args[1] = "update"
        table.insert(args,2,"--set-depth=exclude")
    elseif args[1] == "emptyup" then
        args[1] = "update"
        table.insert(args,2,"--depth=empty")
    elseif args[1] == "emptyadd" then
        args[1] = "add"
        table.insert(args,2,"--depth=empty")
    end
    return args
end
```

- `svn amdc` … `svn status | findstr ^[AMDC]` と同じ。つまり、改変があったファイルの一覧のみを表示して、？なファイルは表示しない
- `svn exclude` … `svn update` で出て来たファイルを出てこなかったことにする（レポジトリからは消さないが、ローカルからは消す）
- `svn emptyup` … ディレクトリを `svn update` するが、その中のファイルは`svn update`しない
- `svn emptyadd` … ディレクトリを `svn add` するが、その中のファイルは`svn add`しない

### 解説

- エイリアス定義はいろいろな書き方が出来るが、4.0.9 では「`nyagos.alias.エイリアス名`」に関数なり文字列なりを直接代入できるようになった（nyagos.exe 自体に組み込まれた機能）
- エイリアス関数では関数自体で処理を記述せずとも、戻り値に新たなコマンドラインを返すという方法もとれるようになった。
       - 値としては、文字列、もしくはテーブルのどちらでもよい。テーブルの場合、実行ファイル名はテーブルの要素０でも１のどちらでもよい。これはエイリアス関数の引数のテーブルが１から始まり、かつエイリアス名そのものが含まれていないので、テーブルをシフトする手間がかからないように…という配慮だが、まぁ、**いきあたりばったり感は否定できない**
- 戻り値に含めるコマンド名は、元のコマンド名と同じにすると、無限ループになりかねないので、ここでは「svn.exe」と拡張子を付けて回避している。
       - 戻り値ではなく、`nyagos.exec` / `nyagos.eval` を使う場合でも無限ループが発生しないよう同様の工夫が必要だが、これとは別に `nyagos.rawexec` / `nyagos.raweval` という関数を使うという方法もある。これらはエイリアスとか内蔵コマンドと解釈されない。Lua側の標準関数にも os.execute というものがあるが、こちらは文字列を UTF8 ではなく、現在のコードページの文字列として解釈されるので、文字化けが発生する場合がある

### 追記（gogit.lua について）

4.0.9_6 には「[gogit.lua](https://github.com/zetamatta/nyagos/blob/master/catalog.d/gogit.lua)」というスクリプトを catalog.d\ に置いてある（catalog.d\ は標準で読み込まれない任意スクリプトを置くディレクトリ）。これはサブコマンド名を見て、「go」と「git」を書き間違えを補正するというフィルターである。こちらは作りがよりシンプルなので、よろしければ参考にしていただきたい。
Raspberry PiでWifi/SSH/GUIリモートログイン/ファイル共有設定メモ


# Wifi USBアダプタを手にいれる

IO-DATAのWifiアダプタ WN-G150UMK を買う
http://www.amazon.co.jp/DATA-IEEE802-11n-150Mbps-小型無線LANアダプター-WN-G150UMK/dp/B007P9IX8A

店頭にて1,000円ぐらいで購入。
パッケージ裏に消費電力最大200mAとの記載。USBポートの電圧5[V]とすると1[W]。
横に並んでた別の商品は2.5[W]。今回はできる限り低消費電力のものをチョイス。


# Wifi/SSHの設定

* Wifiで接続はこちらに書いてる通りに設定。SSHでリモート操作できるようになる  
 http://denshikousaku.net/raspberry-pi-wifi-lan-usb
* PiのIPアドレス：192.168.1.111 に設定。

SSH接続したのち、しばらく操作しないと接続が切れるので、
```/etc/ssh/sshd_config```
の末尾に
```ClientAliveInterval 10```
を追加。

参考
http://qiita.com/JO3QMA/items/b0892ce38f9220abea29
"9.SSHが切れる"節


# GUIリモートログインの設定

* VNCを導入。 
  http://usicolog.nomaki.jp/engineering/raspberryPi/raspberryPi_SSH.html
  
* ~/.bashrc にVNCサーバーの起動コマンドを仕込んでおく。 
 ```vncserver :1 -geometry 1824x984 -depth 24```

* ここで、現在設定していた解像度と違う解像度にすると起動できなかった。例えば、現在の解像度1824x984のとき、1024*768でVNC起動しようとしたらダメだった。
 
* まずSSHでログイン、次にVNCで接続するとGUIでリモートできるようになる。


# ファイル共有の設定

* NetatalkをRaspberryPiにインストールするだけでMacとファイル共有できるようになる
http://imagewriteriij.blogspot.jp/2013/12/raspberry-pi-4-mac.html
接続するときは”別名で接続...”を選んで、SSHで接続したユーザーなどでログインする。
するとホームフォルダがMacから見れるようになる。


* Windowsと共有するならSambaをインストール（SambaはMacからもアクセスできる）
http://denshikousaku.net/raspberry-pi-file-server-part1-basic-samba


# 所感など
配線はえらいすっきりした。
VNCはすごいが、思ったより画面が汚い上やはり遅い。またMACからテキストのコピペができなかった。VirtualBoxみたいな感覚で使うと不満を感じると思う。
unity > アプリのライセンス

http://japan.unity3d.com/company/contact/faq

> ライセンスと料金について
> Unity を使って開発したアプリケーションを販売するとロイヤリティ(利用料)が発生しますか？

>いいえ！ Unity はあなたが開発したアプリケーションについて、ロイヤリティやレベニューシェアといった追加の費用を要求しません。これは有料版のUnity Proに限った話ではなく、無料版の Unity でも同様です！
JsonWorldを利用してJSON SchemaとJSONを生成してみる

@r7kamuraさん作のJsonWorldでJSON Schemaを生成できるモデルを作成します。
## <i class="fa fa-check-circle" style="font-size:1em;"></i> 準備
JsonWorldについては@r7kamuraさん本人による下記のエントリをチェック

<i class="fa fa-external-link" style="font-size:1em;"></i> [JsonWorldでモデルからJSON Schemaを生成する](http://qiita.com/r7kamura/items/722c5c612e432b2c4246)
## <i class="fa fa-flask" style="font-size:1em;"></i> サンプル
### <i class="fa fa-file-text-o" style="font-size:1em;"></i> 仕様
Railsのscaffoldで以下のモデルを作成しました。

|attr|type|
|:--|:--|
|People#name|String|
|People#age|Integer|
### <i class="fa fa-cloud" style="font-size:1em;"></i> Web キャプチャ
![people_list.png](https://qiita-image-store.s3.amazonaws.com/0/43480/78f8b1a5-3460-031a-8801-fd794829e7de.png)

### <i class="fa fa-database" style="font-size:1em;"></i> Resourceクラス作成
~~~ruby
class PersonResource
  include JsonWorld::DSL

  property(
    :id,
    description: 'person id',
    example: 1,
    type: Integer,
  )

  property(
    :name,
    example: "tanaka",
    type: String,
  )

  property(
    :age,
    example: 34,
    type: Integer,
  )

  attr_reader :id, :name, :age

  # @param [Person] person
  def initialize(person)
    @id = person.id
    @name = person.name
    @age = person.age
  end
end
~~~
### <i class="fa fa-rss" style="font-size:1em;"></i> Controllerの修正
show を変更してみます

* Before

scaffold直後の状態は下記です。

~~~ruby
  # GET /people/1
  # GET /people/1.json
  def show
  end
~~~

* After

Resourceクラスを呼び出すように変更します。

~~~ruby
  # GET /people/1
  # GET /people/1.json
  def show
    respond_to do |format|
      format.html
      format.json { render json: PersonResource.new(Person.find(params[:id])) }
    end
  end
~~~

### <i class="fa fa-child" style="font-size:1em;"></i> 動作確認
* curl で呼び出し

~~~bash
% curl http://172.16.33.100:3000/people/1.json
{"id":1,"name":"tanaka","age":23}
% curl GET http://172.16.33.100:3000/people/2.json
{"id":2,"name":"suzuki","age":42}
~~~

* rails console でJSON-Schemaを確認

~~~ruby
> puts PersonResource.to_json_schema
{
  "properties": {
    "id": {
      "description": "person id",
      "example": 1,
      "type": "integer"
    },
    "name": {
      "example": "tanaka",
      "type": "string"
    },
    "age": {
      "example": 34,
      "type": "integer"
    }
  },
  "required": [
    "id",
    "name",
    "age"
  ]
}
~~~

## <i class="fa fa-book" style="font-size:1em;"></i> 外部資料
* <i class="fa fa-external-link" style="font-size:1em;"></i> [JsonWorld - GitHub](https://github.com/r7kamura/json_world)
* <i class="fa fa-external-link" style="font-size:1em;"></i> [JsonWorldでモデルからJSON Schemaを生成する](http://qiita.com/r7kamura/items/722c5c612e432b2c4246)
YouTubeの特定のチャンネルに紐付く動画を取得する。（YouTube Data API (v3) Search）

～2018.08.30追記～
久しぶりに使ったら挙動が安定せず、対象とするチャンネルによっては何かおかしな挙動をする場合があるようで、途中をちょこちょこ修正しつつ最後に注意点として追記しました。


## やりたいこと
公式チャンネルの動画のURL一覧が欲しいと思うことがあります。
が、数年分もあると心と時間を犠牲にしてスクロール（＆クリック）し続けなくてはいけません。



## 解決策
Youtube Data API(v3)のSearchAPIを利用することで、特定のチャンネルの動画一覧を取得できます。
https://developers.google.com/youtube/v3/docs/search?hl=ja


```lang:パラメータ例
part=snippet
key=(Google API Consoleから発行したキー)
channelId=（チャンネルID）
maxResults=50
order=date
pageToken=
```
part=snippetだと様々な情報が返ってきます。
ついでにタイトルを取りたい場合が多いと思いますので、snippetが良いでしょう。

チャンネルID は動画からチャンネルのリンクを遷移した先のURLで~~(2015.07現在)~~(2018.08現在)
https://www.youtube.com/channel/XXXXXXXXXXX
のXXXの部分がIDとなるようです。


あとは投げるだけですが・・・

## 立ちはだかる問題1
maxResultsは最大50なので、一度に取れるのは50件までです。
当然、51件以上紐付くチャンネルは沢山あります。

### *解決方法*
紐付く動画の数よりも低い数でmaxResultsを投げた場合レスポンスのnextPageTokenに文字列が入ります。
この取得したnextPageTokenをリクエストパラメータpageTokenに格納すると次のページが取得されます。

これを利用して、再帰的にpageTokenを入れ替えれば51件以上自動的に取得することが可能です。


## 立ちはだかる問題2
上記の方法で取得していくと、nextPageTokenは~~500件~~※ あたりで止まります。
ええっ・・・。
※**注意：最後の追記参照**

### *解決方法*
以下のパラメータを追加します。

```lang:追加パラメータ
publishedAfter
publishedBefore
```

上記のパラメータにより、取得期間の指定が可能です。
本パラメータを指定後の期間内の動画数が500件に収まれば取得できるようなので、
紐付く動画が501件以上の場合は何回かに分けて取得すればOKです。
**注意：最後の追記参照**

## その他
レスポンスパラメータ totalResults には、取得可能な数ではなく実際の動画の数が格納されるので、
この辺の値から判定すれば汎用化された取得ロジックとなりそうです。


##そして3年後（追記）
久しぶりに触ったら以下の事象を確認しました。ご注意ください

### publishedAfterとpublishedBeforeの期間を長くすると一部の動画が取得できない場合がある。
たとえば、とあるチャンネルで以下のパラメータで取得をしようとします。

```lang:パラメータ
publishedAfter：2017-01-01T00:00:00Z , publishedBefore:2018-09-01T00:00:00Z
```
結果は240件となりました。

なんか結果に違和感あるなーと思い、以下のようにしてみます。

```lang:パラメータ
publishedAfter：2018-08-01T00:00:00Z , publishedBefore:2018-09-01T00:00:00Z
publishedAfter：2018-07-01T00:00:00Z , publishedBefore:2018-08-01T00:00:00Z
publishedAfter：2018-06-01T00:00:00Z , publishedBefore:2018-07-01T00:00:00Z
...
publishedAfter：2017-01-01T00:00:00Z , publishedBefore:2017-02-01T00:00:00Z
```

同期間に対して1ヵ月ずつ実行すると、結果は518件でした。
\*おおっと\*


### 一定以上昔の動画がpublishedBeforeも一定以上昔にしないと取得出来ない場合がある。

こちらも例として、とあるチャンネルでのことです。

```lang:パラメータ
publishedAfter：2017-04-25T00:00:00Z , publishedBefore:2017-08-08T00:00:00Z
```
↑取得できた一番古い動画は2017年4月28日のものになりました。


```lang:パラメータ
publishedAfter：2017-04-25T00:00:00Z , publishedBefore:2017-08-07T00:00:00Z
```
↑取得できた一番古い動画は2017年4月25日のものになりました。
\*おおっと\*


動画数が多いチャンネルの場合、一気に一覧を取得していくのであれば小刻みに実行していった方が良さそうです。
npm install での警告を抑制する

READMEがないなどの状態で`npm install`すると、警告が出力されます。

OSSの場合には警告が出ないようにしたほうが良いのですが、privateなプロジェクトの場合は特に必要ないことも多いです。

そんなときには、`package.json`に`"private": true`とすると、警告が出力されなくなります。

http://stackoverflow.com/questions/16827858/npm-warn-package-json-no-repository-field
unity > 自作 > ラベル付きテキストフィールド

TextFieldを使う時、ラベルを付けたい。

```csharp
private string LabeledText(int labelLeft, string aLabel, int top, int height, int txtRectWidth, int txtLen, string aText) {
	int labelWidth = aLabel.Length * 8; // 8: arbitrary
	GUI.Label ( new Rect(labelLeft, top, labelWidth , height), aLabel);

	int leftPos = labelLeft + labelWidth + 5; // 5: arbitrary
	Rect rect1 = new Rect (leftPos , top, txtRectWidth, height);
	return GUI.TextField (rect1, aText, txtLen);
}

private string ipadr = "";
private string netmask = "";

void OnGUI() {
	ipadr   = LabeledText (30, "IP address", 10, 30, 120, 16, ipadr);
	netmask = LabeledText (30, "   netmask", 50, 30, 120, 16, netmask);

	if (GUI.Button (new Rect (10, /*top*/100, 100, 40), "Debug.Log")) {
		string msg = "IP:" + ipadr + " mask:" + netmask;
		Debug.Log (msg);
	} 
			 
	if (GUI.Button (new Rect (120, /*top*/100, 100, 40), "Quit")) {
		Application.Quit ();
	} 
}
```

![Untitled_-_150712_udpclient_-_PC__Mac___Linux_Standalone__Personal_.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/c0ecdc1f-74a3-1fa1-2638-6dfde6be697d.jpeg)



LabeledText()の引数が多い。もっとスマートなやり方やライブラリがあるのかもしれない。
unity > MonoDevelop-Unity > 定義されていない変数は赤色になる

MonoDevelop-Unity を使って気づいたこと。
定義されていない変数は赤色に表示される。

int width; として定義していたところを int height; に変更した所、 width を使っている部分が赤色に表示されるようになった。

こういう点はデバッグしやすそう。
Gitの覚えるべきコマンド

覚えるべきGitコマンドをまとめてみます。

`git revert <commit>`
\<commit>を取り消す為のコミットを作成

`git reset`
作業ディレクトリには変更も加えずステージエリアをリセット

`git reset --hard`
作業ディレクトリ及びステージエリアをリセット

`git reset --hard <commit>`
\<commit>まで戻す

`git clean -n`
追跡対象外の削除されようとするファイルを表示

`git clean -f`
追跡対象外のファイルを削除

`git merge --no-ff <branch>`
早送りマージ可能でも三方向マージ

`git stash`
追跡しているファイルの現在の作業を退避

`git stash -u`
追跡していないファイルも退避

`git stash list`
stash一覧を表示

`git stash pop`
最新のstashを適用して削除
unity > テキストボックス > GUI.TextField (rect1, text, 16);

テキストボックスの作成と読み込み。

http://www.wisdomsoft.jp/316.html

> ユーザーによるキー入力で編集された文字列は TextField() メソッドの結果として得られます。これをフィールドなどに一時保存し、次の OnGUI() メソッドで反映させるとで、編集可能なテキストボックスになります。


```csharp
private string text = "";

void OnGUI() {
	if (GUI.Button (new Rect (10, 10, 100, 40), "Debug.Log")) {
		Debug.Log (text);
	} 
	Rect rect1 = new Rect (10, 100, 400, 30);
	text = GUI.TextField (rect1, text, 16);
}
```

Debug.Logというボタンを押したら、テキストボックスに入力した文字列をデバッグ出力する。
E2D3基盤制作部資料一覧

## 定例会資料

[E2D3基盤制作部定例会 (2015/07/15)](http://qiita.com/chimerast/items/178d37fb109b005de344)
[E2D3基盤制作部もくもく会@UZABASE (2015/07/21)](http://qiita.com/chimerast/items/443aad1d467bd17fe5ea)

## 技術資料

[e2d3-server ソースコード概説](http://qiita.com/chimerast/items/6a761041108b4813bc28)
SublimeText3でTypeScriptの自動補完とエラーチェック

# SublimeTextでTypeScriptが書きたい

SublimeTextでTypeScriptのシンタックスハイライトと強力な自動補完、リアルタイムエラーチェックが欲しかった。

Atomで仕方なく書いてたけど、Atomは重すぎて使っていられない。

それでどうにかならないものかと再び探してみたら見つかった。

SublimeText3のみサポート。

https://github.com/Phaiax/ArcticTypescript

![スクリーンショット 2015-07-21 20.49.17.png](https://qiita-image-store.s3.amazonaws.com/0/14939/5053ecb1-e05b-1d6d-44f4-a268bebba282.png)

ちゃんと補完されるけど、結構遅め。エラーチェックも問題なし。

[atom-typescript](https://github.com/TypeStrong/atom-typescript)にインスパイアされているみたい。でもビジュアライズ面では圧倒的にAtomの方が優れている。

あとT3Sを使ってた人はクリーニングが必要。
parted で非インタラクティブにパーティションを切る


Linux でディスクのパーティションを切るときは、いつも fdisk を使っていました。

```
fdisk /dev/sdb

Command (m for help):n
Command (m for help):p
Command (m for help):1
Command (m for help):<enter>
Command (m for help):<enter>
Command (m for help):w
```

もちろん、インタラクティブになるので自動化とかできません。

本当に自動化したければパーティションは Kickstart で切るのであまり困ってはいなかったのですが・・・fdifk だと 2TB の制限があるらしいし、たまに後からディスクを追加したときに fdisk だと面倒だし、なんとなくださいので、よくある作業なら parted でソラでワンライナーでできるように必要なことだけ覚えました。


## コマンドラインオプション

`parted` も `fdisk` と同じように、基本的にはインタラクティブに使うもののようなのですが、以下のオプションを使うことで非インタラクティブにバッチ的に実行できます。

`-l` でディスクとパーティションの一覧を表示します。`fdisk -l` の代わりに使うとよいでしょう。

```
parted -l
```

もちろんデバイス名も指定できます。

```
parted -l /dev/sdb
```

`-m` を付けると **machine parseable outpu** な出力になります（スクリプトとかで処理しやすい形式）。

```
parted -lm /dev/sdb
```

`-s` で非インタラクティブに処理が実行できます。後続の引数で parted のコマンド（後述）を指定します。

```
parted -s /dev/sdb command
```

`-a` でパーティションを切るときのアライメントの調整方法を指定できます。たぶん optimal で良さそうです。

非インタラクティブに実行するなら `-s` と `-a` を指定しておけば良さそうです。

```
parted -s -a optimal /dev/sdb command
```

command の部分には、この後説明する mklabel などのコマンドとその引数が入ります。

`-a optimal` は無くてもいい？ のかな？

## パーティションテーブルの作成

mklabel でパーティションテーブルを作ります。

```
mklabel label-type
```

パーティションテーブル（label-type）には MS-DOS/MBR と GPT(GUID Partition Table) とがあります。
（他にもいろいろあるけど Linux で使う分にはこの２つのどちらかしか使わないと思う）

MS-DOS/MBR だと 2TB を超えるパーティションが切れないらしいです。

e.g.)

```
parted -s -a optimal /dev/sdb mklabel gpt   # GPT(GUID Partition Table)
parted -s -a optimal /dev/sdb mklabel msdos # MS-DOS/MBR
```

## パーティションの作成

mkpart でパーティションを切ります。

```
mkpart part-type [fs-type] start end
```

part-type は MS-DOS/MBR と GPT(GUID Partition Table) で若干意味が違うようです。

MS-DOS/MBR の場合は primary/extended のどちらかです、意味は省略します。わからない人はとりあえず primary にしとけばいいです（今日日は LVM とかあるので４つ以上パーティション切ることは無いと思う）。

GPT(GUID Partition Table) の場合は Partition name というものを指定するようなんですが・・任意の文字が通ります。
どういう意味があるのかは・・わかりません。primary と指定しても害はなさそうなのでとりあえず primary でいいでしょう。

fs-type にはファイルシステムの名前を指定します。が、そのファイルシステムでフォーマットされるわけではなく、ファイルシステムの名前から [パーティションタイプ][] が導出されて設定されるようです。

fs-type を省略すると Linux (83) になるようです。

start と end には、パーティションの開始位置と終了位置を指定します。デフォルトはメガバイト単位ですが、GB とか % とか s とか c とかの単位も付けられます。s と c はたぶんセクタとシリンダです。

負数を指定するとディスクの終端からの位置になります。なので -1s でディスクの最終セクタを意味します。ただし、次のようには指定できません。

```
parted -s -a optimal /dev/sdb mkpart primary xfs 1 -1
```

`-1` がオプションだと認識されてしまうためです。

次のように `--` を使って、以降の引数がオプションではないことを明示する必要があります。

e.g.)

```
parted -s -a optimal /dev/sdb -- mkpart primary xfs 1 -1
```

## LVM

LVM に使うときは、パーティションを切った後に LVM のフラグを設定する必要があるらしいです。

```
set partition flag state
```

partition にはパーティション番号を指定します。先頭のパーティションなら 1 です。

flag には lvm を、state には on を指定します。

e.g.)

```
parted -s -a optimal /dev/sdb set 1 lvm on
```

## コマンドを繋げる

コマンドは繋げて書くことが出来ます。例えば、次のように書けます。

e.g.)

```
parted -s -a optimal /dev/sdb -- mklabel gpt mkpart primary 1 -1 set 1 lvm on
```



[パーティションタイプ]: http://www.wdic.org/w/TECH/%E3%83%91%E3%83%BC%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%BF%E3%82%A4%E3%83%97 "パーティションタイプ ‐ 通信用語の基礎知識"
neobundleの指定には絶対パスを使う


## 最初の設定
[Neobundle - vim入門](http://kaworu.jpn.org/vim/NeoBundle)や[github](https://github.com/Shougo/neobundle.vim)を参考に.vimrcを書いた。
NeoBundleは複数端末にvimrcを同期する時、毎回cloneするのが嫌だったのでサブモジュール化した。

```.vimrc
if has('vim_starting')
    set compatible
endif
set rtp+=./neobundle.vim/
endif
"Required
call neobundle#begin(expand('~/dotfiles/'))
NeoBundleFetch 'Shougo/neobundle.vim'
```
これを作成している間はどんどんインストールがされていってワクワクして寝た。

## 朝起きたら動かない
さーRubyの勉強するかーっと思って`~/sandbox/ruby-getting-start/`内のRubyファイルをvimで開くと、

```
Error detected while processing /Users/Ox9n/.vimrc:
line   16:
E117: Unknown function: neobundle#begin
line   17:
E492: Not...
```
vimrcやneobundle.vimがあるディレクトリでは開けて、それ以外のディレクトリでは開けない…ってことは…

```.vimrc
if has('vim_starting')
    if &compatible
        set compatible
    endif
    set rtp+=~/dotfiles/neobundle.vim/
endif
"Required
call neobundle#begin(expand('~/dotfiles/'))
NeoBundleFetch 'Shougo/neobundle.vim'
```
絶対パス指定にしたら動いた。失礼しました。
FluentdのFilterが効かなくて困ったら書く順番だった

Fluentdで「とあるログを受け取ってある条件を満たしたものをhipchatに投げる」というのを書いている時に、Filterが効かなくて(正規表現がうまく効かなくて？)丸一日くらいうがーーーーーーってなってたら、書く順番が違ったという話。


```:td-agent.conf
<source>
  type http
  port 8888
</source>

<match sakaimo.**>
  type file
  path /var/log/td-agent/sakaimo.log
</match>

<filter sakaimo.**>
  type grep
  regexp1 message ^2015
</filter>
```

↑こう書いていて、

```
# curl -X POST -d 'json={"message":"2015-07-21 for test"}' http://localhost:8888/sakaimo.test
```

を実行したら sakaimo.log に出力されたのでウハハハよゆーだなて思ってたです。

念のため条件に合わないパターンも試してみようと思って、

```
# curl -X POST -d 'json={"message":"test"}' http://localhost:8888/sakaimo.test
```

でやってみたら、これも出力されちゃったのです。( ゜Д゜；)！？
Filter効いてない！正規表現できてない！って思ったです。



～ ここから丸一日悩む ～

こうしたらちゃんと動きました。

```
<source>
  type http
  port 8888
</source>

<filter sakaimo.**>
  type grep
  regexp1 message ^2015
</filter>

<match sakaimo.**>
  type file
  path /var/log/td-agent/sakaimo.log
</match>
```

# 結論

**filterディレクティブはmatchディレクティブより前に書くこと！！絶対だぞ！**

ちなみに

filter
match
source

の順番で書いてもfilterが効いて動作しましたとさ。
「進捗・どう・です・か」をランダムに表示し「進捗どうですか」が完成したら煽ってくるSQL


## 概要
流行ってたみたいなので、ループ処理が得意でないSQLで挑んでみたらおもしろかった。
リズムパターンの自動生成などに応用してもおもしろそう。


## 結果
まるで筒井康隆。

![貼り付けた画像_2015_07_21_18_48.png](https://qiita-image-store.s3.amazonaws.com/0/15117/52cf9c38-3448-6249-c625-c5796b4541c0.png "貼り付けた画像_2015_07_21_18_48.png")




## Demo
http://sqlfiddle.com/#!15/9eecb7db59d16c80417c72d1e1f4fbf1/1880/0

## SQL

```sql
with recursive
  s (v) as (values ('進捗'),('どう'),('です'),('か')),
  t (i, p) as (
    select
      1,
      r.v as p
    from
      (
        select v from s order by random() limit 1
      ) r
    union all
    select
      t.i + 1,
      t.p || r.v as p
    from
      t,
      (
        select v from s order by random() limit 1
      ) r
    where
      t.p || r.v not like '%進捗どうですか%' or
      t.p || r.v like '%進捗どうですか'
  )
select
  i || '回で煽られました' as "回数",
  p || '？？？' as "進捗どうですか"
from
  t
order by
  i desc limit 1
```

## 解説

* 共通表式（CTE）による再帰SQL（with recursive）を使って、条件付き無限ループをシミュレートする。
* サブクエリrによって、リストからランダムな文字列を取得する。（random()はサブクエリごとに実行してくれる）
* 手続き的な考え方だと無限ループの終了条件のように```t.p || r.v like '%進捗どうですか'```だけでよさそうに思えるけど、それではうまくいかない（そこに至るまでの文字列連結がされない）
* この再帰SQLはOracleのconnect byほど高機能ではないけど、SQL99標準なのがいい。

## 他に煽られてる人々

- [reactjs - 「進捗・どう・です・か」をランダムに表示し「進捗どうですか」が完成したら煽ってくるReactコンポーネント - Qiita](http://qiita.com/suin/items/af3e770784be87377077)
- [「進捗・どう・です・か」をランダムに表示し「進捗どうですか」が完成したら煽ってくるClojure - Qiita](http://qiita.com/esehara@github/items/c57cafa57aa92dc1e3c2)
- [「進捗・どう・です・か」をランダムに表示し「進捗どうですか」が完成したら煽ってくるプログラム | ぞうさんの何でもノート](http://elephnote.com/blog/archives/936)
- [「進捗・どう・です・か」をHaskellで書いてみた - Qiita](http://qiita.com/lotz/items/b47913cb27052cf9e127)
- [golang の進捗どうですか - Qiita](http://qiita.com/mattn/items/4b4ce89396d660a155a9)
- [Elixir - 進捗どうですか？ - Qiita](http://qiita.com/A-gen/items/6a8974d4dc7e3f4695f7)
- [進捗どうですかブーム?にrubyでのっかってみる - Qiita](http://qiita.com/kataware/items/edc8d0f02a16a21c47dc)
- [進捗どうですかブーム??にPythonでのりかかってみる - Qiita](http://qiita.com/hisatoshi/items/0ccca55168d58a940661)
- [進捗どうですかブーム???にShellScriptで挑むフリしてExpectに逃げる - Qiita](http://qiita.com/mpyw/items/e5a93e7195d8a8284a1f)
- [進捗どうですかブーム???に Perl でのりかかる - Qiita](http://qiita.com/b_wind/items/06c56c898a988c2463fe)
- [「進捗・どう・です・か」をPHPで書いてみた - Qiita](http://qiita.com/kiimiiis/items/2f98e19d00616d95d0ce)
- [bat - 「進捗・どう・です・か」をランダムに表示し「進捗どうですか」が完成したら煽ってくるバッチ - Qiita](http://qiita.com/sawa_tsuka/items/d8d43d4b1f8e7865ad5c)
- [「進捗・どう・です・か」をランダムに表示し「進捗どうですか」が完成したら煽ってくるプログラム（C#で挑戦） - Qiita](http://qiita.com/moto_pipedo/items/e7f924585c762b0da4a7)
- [「進捗・どう・です・か」をランダムに表示し「進捗どうですか」が完成したら煽ってくるプログラム（C#/LINQ） - Qiita](http://qiita.com/shoooo/items/ec84418c37f08ecf7576)
- [「進捗どうですか」プログラムにおける形態素解析エンジンMeCabの適用 - Qiita](http://qiita.com/giiko_/items/c233a93a26fec79b1710)


## 参考
- [新しい業界標準「SQL99」詳細解説](http://www.atmarkit.co.jp/fnetwork/tokusyuu/01sql99/sql99_1b.html)
- [WITH問い合わせ（共通テーブル式）](https://www.postgresql.jp/document/9.3/html/queries-with.html)
- [PostgreSQLの再帰SQLの使用例](http://www.geocities.jp/oraclesqlpuzzle/postgresql-rec-with.html#2)
three.jsとGoogle CardboardでVRを体験するまで

会社のブログ([ICS LAB](http://ics-web.jp/lab/))にてVR記事をかきました。
[必要なのはスマホと1,000円のGoogle Cardboardだけ！ WebGLではじめるお手軽VR入門](http://ics-web.jp/lab/archives/7712)
思っていた以上にVRコンテンツが簡単に作れたので共有しますね。

# Google Cardboard
Cardboardを和訳すると「ダンボール」。ダンボールでできたVRビューワーのことです。Amazonで1,000円で買えます。

# とにかく楽ちんだった
両目視差立体視を実現するライブラリがすでに公開されていて、すでにあるthree.jsのコンテンツをライブラリを通すことで簡単にVR化出来ました。

[Chrome Experiments for Virtual Reality](https://vr.chromeexperiments.com/)

# 感想
ダンボールなので1,000円と安いので買うまではそんなに期待していなかったんですが、スマホのジャイロセンサーと連携したら思っていた以上にVRを表現できていて驚きました。もうちょっとGoogle Cardboard触りつつ、次はOculus Riftとか触っていきたいなと。
Dead な Docker コンテナを起動・削除可能にするワンライナー

Docker のデーモンがストーンと落ちてしまうと、走っていたコンテナが Dead 状態に陥ることがあります。

こうなると、デーモンを再起動して該当コンテナを起動・削除したくても、失敗することになります。

```shell-session
$ docker rm c39206003c7a
Error: Cannot destroy container c39206003c7a: Driver devicemapper failed to remove root filesystem c39206003c7ae8992a554a9ac2ea130327fc4af1b2c389656c34baf9a56c84b5: Error running removeDevice
2014/05/08 19:15:15 Error: failed to remove one or more containers
```

今のところ根本的な解決策はなく、とりあえず復旧するためのワンライナー（Docker 1.6.1）。

```shell-session
# awk '/mapper\/docker/ { print $2 }' /proc/mounts | xargs -r umount -f
```

ただし、最新の Docker ではこれが効かないという報告もあり、Docker の発展途上をまざまざと実感している次第です。

# 参考

[ After stopping docker, previously running containers cannot be started or removed #5684](https://github.com/docker/docker/issues/5684#issuecomment-69052334)
Math.sqrt(2**1024) < 2**1024はfalse?

大きな数値の平方根を求めようとしたときにつまづいたことをメモ．
数学的には次の不等式は成り立つ(trueである)はずです．

``` math
\sqrt{2^{1024}} < 2^{1024} \ ･･･ \ (1)
```

しかし，Rubyでこの式を実行すると，結果はfalseになります．

```rb:sample1.rb
Math.sqrt(2**1024) < 2**1024
# => false
```

これはどういうことでしょうか．
実は，[RubyのDoc](http://ruby-doc.org/core-2.0.0/Math.html#method-c-sqrt)を読んでみると，Math::sqrt内部でRFLOAT_VALUEという<b>数値をdouble型に変換するマクロ</b>が使われていることが分かります．
そして，double型はIEEE754方式で$2^{1013}$までしか表現できないわけですから（詳しくは参考文献３，４を参照のこと），それ以上の数値は+∞に丸め込まれるわけです．
よって Math::sqrt内部では，2**1024はFloat::INFINYと等価となり，sample1.rbは次のように書き換えることができます．

```rb:sample2.rb
Math.sqrt(Float::INFINITY) < 2**1024
# => false
```

これで，Ruby上では不等式(1)が成り立たない謎が解けました．
この問題を回避するには，sqrt関数を独自にコーディングするしかなさそうです（他の回避方法をご存知の方はコメントをお願いいたします）．

# 参考文献
1. [Module: Math (Ruby 2.0.0)，Ruby Doc](http://ruby-doc.org/core-2.0.0/Math.html#method-c-sqrt)
1. [Rubyのソース，The Ruby Cross Reference](http://rxr.whitequark.org/mri/source/include/ruby/ruby.h?v=2.1.2#814)
1. [浮動小数点数，MathWorks](http://jp.mathworks.com/help/matlab/matlab_prog/floating-point-numbers.html)
1. [まつもと直伝　プログラミングのオキテ 第15回　浮動小数点数の謎に満ちた世界，ITpro](http://itpro.nikkeibp.co.jp/article/COLUMN/20071019/285010/)
Rails 勉強メモ２

redirect_to 
アクションから実行

render 
アクション先のビューを実行

ExecJS::RuntimeError
CoffeeScriptファイルの記述ミス

ヘルパーメソッドのform_forは対象オブジェクトをpersisted?メソッドで確認している。
データベースに保存されている（真）であればPATCH,保存されていない（偽）であればPOSTになる。

capybara
within('#(HTMLのid属性を指定)')
指定したid内の要素の内側が操作対象になる。

```
HTML = <div class="links">
capybaraでの指定 = first('div.links')
```

map(&:name)とmap { |x| x.name }は同じ。
Android Volley


## Android Volley による通信処理
Android Volley は、Android用の 通信ライブラリです。
Android の通信処理の Request / Response をとても簡単に実装することが可能です。
Volley でキーとなる Class を簡単に紹介します。

ソースコードは、[Google Git Volley](https://android.googlesource.com/platform/frameworks/volley)にて参照することが可能です。

# Volley.class
BasicNetwork, HurlStack, RequestQueue を作成する処理をまとめられている

## newRequestQueue

RequestQueue を作成する

```
public static RequestQueue newRequestQueue(Context context, HttpStack stack)

```

* Context context : キャッシュディレクトリ作成の為に利用する
* HttpStack stack : HttpStack の独自実装が必要な時は指定する、Null でも可

# RequestQueue.class
Request\<T> の要求をスレッドプールし順次 BaseNetwork へ登録する処理などがまとめられている。
いわゆる、 Request の管理クラス？のようなもの。

## add
Request\<T> を、Queueに追加する。
追加されたRequestは内部で適切にリクエスト送信される

```
public <T> Request<T> add(Request<T> request)
```

* Request\<T> request : サービスへのリクエストを指定する

# Request\<T>.class
ネットワークのリクエストの基本情報を格納している。

* \<T> : レスポンスをどのような形にパースするのかを決める値（ジェネリクス）

## Method
HTTP Request Method の列挙

```
/**
 * Supported request methods.
 */
public interface Method {
    int DEPRECATED_GET_OR_POST = -1;
    int GET = 0;
    int POST = 1;
    int PUT = 2;
    int DELETE = 3;
    int HEAD = 4;
    int OPTIONS = 5;
    int TRACE = 6;
    int PATCH = 7;
}
```


## Request (コンストラクタ)
リクエスト情報を基本的な形で作成する

```
public Request(int method, String url, Response.ErrorListener listener)
```

* int method : HTTP Request Method を指定する
* String url : HTTP Request URL を指定する
* Response.ErrorListener listener : Error の時に呼ばれるハンドラー

# Response\<T>.class
ネットワークのレスポンスの基本的な内容を格納している。

* \<T> : レスポンスをどのような形にパースするのかを決める値

# Response\<T>.Listener\<T>.interface
レスポンスの値をパースした結果を返す為のコールバックインターフェイス

* \<T> : レスポンスをどのような形にパースするのかを決める値

## onResponse
レスポンスが正常に終了した時に呼ばれる

```
public void onResponse(T response)
```

* T response : レスポンスのコンテンツデーターを\<T>でパースした値が入ってくる


# Response\<T>.ErrorListener.interface
レスポンス処理が失敗した時に結果を返す為のコールバックインターフェース

* \<T> : レスポンスをどのような形にパースするのかを決める値

## onErrorResponse
レスポンスが不正終了した時に呼ばれる

```
public void onErrorResponse(VolleyError error)
```

* VolleyError error : Volley がエラーハンドリングしてくれたエラー値が入ってくる


## 使用例
```
Response.Listener<String> stringListener = new Response.Listener<String>() {
    @Override
    public void onResponse(String response) {
        // レスポンスが正常に処理された場合のコンテンツ情報が文字列で取得できる
    }
};

Response.ErrorListener errorListener = new Response.ErrorListener() {
    @Override
    public void onErrorResponse(VolleyError error) {
        // レスポンスがエラーだった場合のエラー情報が取得できる
    }
};

StringRequest stringRequest = new StringRequest(Request.Method.GET, "https://www.google.co.jp/", stringListener, errorListener);

RequestQueue requestQueue = Volley.newRequestQueue(this);
requestQueue.add(stringRequest);
```
E2D3基盤制作部もくもく会@UZABASE (2015/07/21)

## 参加者

山本、村上、竹内

## 前回の資料 (インストール方法等参照)

http://qiita.com/chimerast/items/178d37fb109b005de344

## Wi-Fiへのつなぎ方

ホワイトボードの通り。

まさかのGuest用Wi-FiだとSSHで外に出られないという事態になっているため、 ~~GitHubにSSHでアクセスしたり、npm installが出来ない。~~ httpsポート経由でGitHubにSSH接続する設定と、npmのために、gitの設定をいじり、git://プロトコルをhttps://に変換するようにする。

.ssh/configに以下を追加

```
Host github.com
  Hostname ssh.github.com
  Port 443
```

コンソールで実行

```bash
git config --global url."https://".insteadOf git://
```

https://help.github.com/articles/using-ssh-over-the-https-port/
https://github.com/npm/npm/issues/5257

## e2d3-serverについての共有事項

週末に大規模なディレクトリ階層の移動を行ったため、コードを読んだり作業をする場合は、最新版をpullしてからにしてください。

モジュールの追加も行っているので、npm install も同時に行ってください。

## e2d3-serverの開発時にブラウザでのアクセスのしかた

`/etc/hosts`に

```
127.0.0.1	ad.e2d3.org
127.0.0.1	sd.e2d3.org
```

を記述した後、

http://ad.e2d3.org:8000 (Excelから叩かれるAPI src/app/api)
http://sd.e2d3.org:8000 (FacebookやTwitterシェア用 src/app/share)

にそれぞれアクセスする。

## e2d3-sererソースコード解説

http://qiita.com/chimerast/items/6a761041108b4813bc28
C#のコードがvisual studio 2015だとコンパイルエラーになる

同じプロジェクト、ソリューションをVisualStudio2013で開くとコンパイルは成功する。

shift-jisの.csファイルに"文字列"、識別子に日本語があるとコンパイルエラーになる。

CS1056  予期しない文字 '文字' です。
CS1009  認識できないエスケープ シーケンスです。
ほか

ファイルエンコーディングをutf-8にすれば解決する。

***
ファイルエンコーディングの変更方法の一例
Visual Studioのエディタで対象のファイルを開く
メニュー「ファイル」ー「保存オプションの詳細設定」でutf-8を選択して保存すれば変換される。

***
.NET2のときに作られたC#のライブラリプロジェクトを現在はVisualStudio2013を使って.NET3.5のプロジェクトとしてビルドしていた。
そのプロジェクトをVisualStudio2015で開いてビルドしたらCS1009などのコンパイルエラーが発生した。エラー箇所はどこも日本語が書かれていたが、日本語が書かれていてもエラーになっていないファイルもあった。このライブラリプロジェクトの.csファイルはshift-jisのものとutf-8のものが混在しているのは知っていた。エラーがあるファイルのエンコーディングを確認したらshift-jisだった。utf-8に変換したらコンパイルエラーが発生しなくなった。

***
それと、識別子に"・"、"･"を使っている場合はファイルがutf-8であってもVisualStudio2015が使用するcscではコンパイルエラーになる。
参考 [[雑記] C# ソースコードと Unicode - C# によるプログラミング入門 | ++C++; // 未確認飛行 C](http://ufcpp.net/study/csharp/misc_unicode.html?sec=katakana-middle-dot#katakana-middle-dot)

***
メニュー「オプション」
プロジェクトおよびソリューション - ビルド/実行
"MSBuildプロジェクトビルドの出力の詳細"を"診断"にして確認した。

VisualStudio2015
C:\Program Files (x86)\MSBuild\14.0\bin\csc.exe
Microsoft (R) Visual C# Compiler バージョン 1.0.0.50618

VisualStudio2013
C:\Program Files (x86)\MSBuild\12.0\bin\Csc.exe
Microsoft (R) Visual C# Compiler version 12.0.40629.0
for C# 5

パラメーターは2015に”ruleset”が追加されている以外は同じ。
CakePHP、PaginatorでfindTypeを使う

## System

CakePHP 2.x

## Code

Model/Foo.php

```php
<?php
App::uses('AppModel', 'Model');
/**
 * Foo Model
 *
 */
class Foo extends AppModel {
/**
 * @var array
 */
        public $findMethods = array(
                'customFindType' => true,
        );
/**
 * @param $state
 * @param $query
 * @param array $results
 * @return array
 */
        public function _findCustomFindType($state, $query, $results = array()) {
                if ($state === 'before') {
                        // Custom find type
                        return $query;
                }
                return $results;
        }

}
```

Controller/FoosController.php

```php
<?php
App::uses('AppController', 'Controller');
/**
 * Foos Controller
 *
 * @property Foo $Foo
 * @property PaginatorComponent $Paginator
 * @property SessionComponent $Session
 */
class FoosController extends AppController {

/**
 * Components
 *
 * @var array
 */
        public $components = array('Paginator', 'Session');

/**
 * index method
 *
 * @param null $findType
 * @return void
 */
        public function index() {
                $this->Foo->recursive = 1;
                $this->Paginator->settings = array(
                        'Foo' => array(
                                'findType' => 'customFindType'
                        )
                );
                $foos = $this->Paginator->paginate('Foo');
                $this->set(compact('foos'));
        }
```
bashとzshで.*の展開結果が異なる件

#bash
親ディレクトリとカレントディレクトリも含まれる。

```
$ bash --version
GNU bash, バージョン 4.2.37(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2011 Free Software Foundation, Inc.
ライセンス GPLv3+: GNU GPL バージョン 3 またはそれ以降 <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
$ bash --norc
$ ls -a
.  ..  .b
$ ls -a .*
.b

.:
.  ..  .b

..:
.  ..  b
```

#zsh
親ディレクトリとカレントディレクトリは含まれない。

```
$ zsh --version
zsh 4.3.17 (x86_64-unknown-linux-gnu)
$ zsh -f
% ls -a
.       ..      .b
% ls -a .*
.b
```
swiftでTTTAttributedLabelを使ったときにlinkAttributesが反映されない場合の対処法

Swift版が無かったので。
ついでにアンダーラインも入れるように。

```swift

myLabel.linkAttributes = [ kCTForegroundColorAttributeName : UIColor.blueColor(),  NSUnderlineStyleAttributeName : NSNumber(long: NSUnderlineStyle.StyleSingle.rawValue) ]

```

関連リンク
<a href="http://qiita.com/katsuhisaishii/items/f4513eb916a88566550f">iOS8でTTTAttributedLabelを使ったときにlinkAttributesが反映されない場合の対処法</a>
Markdownでテーブルがうまく表示できない!?

なにを今更と言われるかもしれませんが、Markdownでテーブルを書こうと思ったらうまくいかなかったので簡単にルールを

##テーブルの書き方

```
(1行開ける)
|名前|番号|得点|
|-|-|-|
|suzuki|23|56|
|yamada|78|98|
|togashi|34|45|
```

結果:

|名前|番号|得点|
|-|-|-|
|suzuki|23|56|
|yamada|78|98|
|togashi|34|45|

```
(1行開ける)
|名前|番号|得点|
|---|---|---| (ハイフンを3つ以上に）
|suzuki|23|56|
|yamada|78|98|
|togashi|34|45|
```

結果:

|名前|番号|得点|
|---|---|---|
|suzuki|23|56|
|yamada|78|98|
|togashi|34|45|
##ちなみに
上に1行あけるのも大事
XCode6.4でAlcatrazが仕事しなくなったときのメモ

XCodeを6.4にしたときに、Alcatrazを復旧するのにはまったので、記録しておきます。

## 症状

- メニュー Window > Package Manager が表示されない
- 最新のAlcatrazを再インストールしても、メニューが復活しない
- 参考1 で示されている `Info.plist`のキー`DVTPlugInCompatibilityUUIDs`には対応するバージョンのUUIDが含まれている

## 復旧手順

1. 参考2に記載された、プラグインのリストをリセットするコマンドを実行 
   `defaults delete com.apple.dt.Xcode DVTPlugInManagerNonApplePlugIns-Xcode-6.4`
2. XCodeを再起動する
3. Bundleをロードするか聞かれる→`Load Bundle`を選択

参考1: ISSUE XCode6.4でメニューに表示されない問題について
https://github.com/supermarin/Alcatraz/issues/294

参考2: XCode6.4からのプラグイン関連の変更点について
http://buegling.com/blog/2015/5/2/xcode-64-plugins-and-you
sbtでhosted nexusにjarをuploadして、hosted nexusからjarを取得してsbtで利用する

あるあるですが、表題の作業を行ったので備忘録として残します。

## 1. jarを作成したい側のbuild.sbtの設定

```scala
organization := "jp.co.fugafuga.erdrepo.tools"

name := "命名中"

version := "0.0.1-SNAPSHOT"

scalaVersion := "2.11.7"

libraryDependencies ++= Seq(
  "org.scalikejdbc"  %% "scalikejdbc"  % "2.2.+",
  "org.scalikejdbc" %% "scalikejdbc-config"  % "2.2.7",
  "org.slf4j"        %  "slf4j-simple" % "1.7.+",
  "commons-configuration" % "commons-configuration" % "1.10",
  "com.oracle" % "ojdbc6" % "11.1.0.6",
  "org.specs2"       %% "specs2-core"  % "2.4.9" % "test",
  "org.scalikejdbc" % "scalikejdbc-test_2.11" % "2.2.+" % "test",
  "junit"            %  "junit"        % "4.10",
  "net.databinder.dispatch" %% "dispatch-core" % "0.11.0",
  "org.dbunit" % "dbunit" % "2.5.1",
  "org.apache.poi" % "poi" % "3.10-FINAL" % "test"
)

//Nexus用設定
publishTo := {
  val nexus = "http://hosted nexusのアドレス/"
  if (version.value.trim.endsWith("SNAPSHOT"))
    Some("snapshots" at nexus + "content/repositories/hosted-hogehoge-snapshot")
  else
    Some("releases"  at nexus + "content/repositories/hosted-hogehoge")
}

//Nexus用設定
credentials += Credentials("Sonatype Nexus Repository Manager","hosted nexusのアドレス", "ネクサスのユーザ", "ネクサスのパスワード")

//Nexus用設定
resolvers += "Nexus" at "http://hosted nexusのアドレス/content/groups/group-hogehoge"

scalikejdbcSettings
```

上記のように設定することで、hostedのnexusにorganization, name, versionの情報がmaven風で言うところのgroup, name, versionのようにnexusにjarがuploadされていきます。


uploadについては、sbtのコンソールから以下を実施するのみです

```scala
publish
```


## 2. sbtプロジェクトでhosted nexusのjarを利用して、jarのmainメソッドを実行する


build.sbtは以下のように用意します。

```scala
name := "命名中"

version := "1.0"

scalaVersion := "2.11.7"

libraryDependencies ++= Seq(
  "jp.co.fugafuga.erdrepo.tools" % "命名中_2.11" % "0.0.1-SNAPSHOT",
  "com.oracle" % "ojdbc6" % "11.1.0.6"
)

resolvers += "Nexus" at "http://hosted nexusのアドレス/nexus/content/groups/group-hogehoge"

credentials += Credentials("Sonatype Nexus Repository Manager","hosted nexusのアドレス", "ネクサスのユーザ", "ネクサスのパスワード")

run in Compile <<= Defaults.runTask(fullClasspath in Compile, mainClass in (Compile, run), runner in (Compile, run))

runMain in Compile <<= Defaults.runMainTask(fullClasspath in Compile, runner in (Compile, run))
```

このような形でbuild.sbtを用意することで、インタラクティブモードで

```scala

run "jp.co.fugafuga.erdrepo.tools.命名中.メインメソッドを持つオブジェクト名"
```

ノン・インタラクティブモードで

```scala

sbt "run-main jp.co.fugafuga.erdrepo.tools.命名中.メインメソッドを持つオブジェクト名"
```

のように実行することが可能になります。

お手軽ですね。
nyagosでbower searchを便利につかいたかった


# はじめに
[bower](http://bower.io/)でパッケージ探すの面倒だな・・・

~~~ 
bower search
~~~
ってコマンドがあるらしいじゃないか！
もっと便利に使えないものか…せめてインストールしたい…

## コード
~~~ lua
alias{
    pbow = function (...)
        local str = ...
        local cmd = str[2]
        local result
        str = str[1]
        if str then
            result = nyagos.eval("bower search "..str.." | peco")
            if result then
                result = string.gsub(result, 'git:*[%a|%p]*[\r\n]*', '')
                result = string.gsub(result, 'Search results:[\r\n]*', '')
            end
            if cmd then
                nyagos.exec("bower install "..result.." "..cmd)
            else
                nyagos.exec("bower install "..result)
            end
        else
            print("pbow is bower search wrapper")
            print("pbow [search word] [cmd]")
            print("cmd:")
            print("    --save save dependencies bower.json")
            print("    --save-dev save devDependencies bower.json")
        end
    end
}
~~~


## 使い方
nyagos.dに上記を記述したpbow.luaを放り込むか、.nyagosに記述します。

~~~
C:>pbow [search] [cmd]
~~~
pecoでbower searchの結果を表示してくれます。
名前がうろ覚えでも、探せます便利！

#謝辞
[nyagos](https://github.com/zetamatta/nyagos)
[peco](https://github.com/peco/peco)
面白そうだったのでチンチロのコードを書いてみた件

Rubyでチンチロのプログラムを考えたときのメモ
http://qiita.com/woogy/items/4f402706f033f6911039

というのがあったのでやってみた｡

```rb
class DiceGame
  attr_reader :dice_array, :unique_dice_array_len

  def initialize
    @dice_array = Array.new(3){rand(1..6)}
    @unique_dice_array_len =  @dice_array.uniq.length
  end

  def return_hand
    hand = [self.zoro, self.num, self.none]
    if hand.detect.nil?
      p "ERROR UNABLE TO DETECT HAND"
    else
      hand.detect
    end
  end

  def return_duplicated
    dice_array.detect{ |e| dice_array.count(e) > 1 }
  end

  def zoro
    if unique_dice_array_len == 1
      p "ゾロ"
    else
      nil
    end
  end

  def num
    if !return_duplicated.nil? && unique_dice_array_len > 1
      p "#{return_duplicated} の目"
    else
      nil
    end
  end

  def none
    if unique_dice_array_len == 3
      p "ナシ"
    else
      nil
    end
  end

end

dice = DiceGame.new
p dice.dice_array
p dice.return_hand
```

* 111でピンゾロ
* "の目"を一番でた数が多い目を返す(複数も可)としてさいころを10とか20とか100とかに増やす｡

とかやると大変カオスになって楽しめると思います｡(やりたくないけど)
【IE9】box-shadowが効かない

#原因
tableの中だとbox-shadowが効かない時がある

#解決

```
boxshadowEle {
	border-collapse: separate;
}
```

参考：[IE9でドロップシャドウ（box-shadow）が効かない | ダリの雑記：WEBプログラム版](http://www.nandani.sakura.ne.jp/web_all/css/3692/)