OmniAICreator/Qiita-1.07M huggingface dataset:
PowerShellでGoogle APIに使うOAuth 2.0トークンを取得する

Google OAuth2.0のリフレッシュトークンには有効期限がない。
どの認証フローであってもリフレッシュトークンを取得できればアクセストークンを取得できる。

参考: [Using OAuth 2.0 to Access Google APIs](https://developers.google.com/identity/protocols/OAuth2)

デバイス認証フローでトークンを取得する。

コンソールで認証フローを開始する
`verification_url`と`user_code`を取得する。

ブラウザで`verification_url`にアクセスする。
許可リクエストを承認して`user_code`を入力する。

コンソールで`device_code`を指定してトークンを取得する。

```ps1
$client_id = ""
$client_secret = ""
$scope = ""

$data = Invoke-RestMethod `
    -Uri 'https://accounts.google.com/o/oauth2/device/code' `
    -Method Post `
    -ContentType "application/x-www-form-urlencoded" `
    -Body @{
        client_id=$client_id;
        scope=$scope
    }

$data.user_code

# ブラウザを起動
start $data.verification_url

do
{

  Read-Host '?'

  $result = Invoke-RestMethod `
      -Uri "https://accounts.google.com/o/oauth2/token" `
      -Method Post `
      -ContentType "application/x-www-form-urlencoded" `
      -Body @{
          client_id = $client_id;
          client_secret = $client_secret ;
          code=$data.device_code;
          grant_type='http://oauth.net/grant_type/device/1.0';
      }

  $result

} while($result.error)

# 結果
$result.access_token
$result.refresh_token
$result.expires_in
$result.token_type
$result

```
FlynnをHerokuの代替に使おうとしてはまったのでメモ


#はじめに
[Flynn](https://flynn.io/ "Flynn")

Open PaaSとしてHerokuに似たものを探していて、FlynnとDeisというものがあることを知った。
FlynnでもDeisでもどちらもでもよかったのだけど、FlynnにDokkuの作者が関わっており、Dokkuの名前は聞いたことがあったのでFlynnの環境を一つ作ってみた。

Flynnの環境作成はわりと簡単にできたけど、手持ちのRailsアプリをデプロイするのに一苦労したので、メモ代わりにQiitaに投稿してみる。

#目次
+ SSH公開鍵の登録
+ アプリケーションの作成
+ PostgreSQL用の設定が必要
+ 環境変数
+ rails_12factor
+ flynnへのデプロイ
+ rake db:migrate

# SSH公開鍵の登録
gitでアプリをpushする所謂Herokuスタイルを実現するために、まずはSSH公開鍵の登録が必要。
`flynn key add [<public-key-file>]`

# アプリケーションの作成
`flynn create <app_name>`

# PostgreSQL用の設定が必要
Herokuを使っているとDB周りは自動で設定してくれるので気付かなかったけど、Flynnを使う場合はPostgreSQLの設定が必要。
FlynnにはPostgreSQLのインスタンスを作るコマンドがあるのでそれを使用する。

`flynn resource add postgres` を実行して以下を編集

```config/database.yml
production:
  adapter: postgresql
  encoding: unicode
  pool: 5
  url: <%= ENV['DATABASE_URL'] %>
```

DATABASE_URLは以下のコマンドを実行して環境変数にセットする。

```bash
flynn env set DATABASE_URL=$(export $(flynn env | xargs); echo "postgres://$PGUSER:$PGPASSWORD@$PGHOST:5432/$PGDATABASE")
```
(実際は一行)

# 環境変数
前節のDATABASE_URLもそうだけど、環境変数の設定が必要。

+ RAILS_ENV=production
+ SECRET_KEY_BASE=`rake secret`で得られる値

あたりが必須であろうか。以下のように設定する。
`flynn env set RAILS_ENV=production`

# rails_12factor
これもHeorkuの場合は自動でGemを追加してくれるので気付かなかったのだが、Flynnの場合は手動でGemfileに記載する必要がある。
rails_12factorをGemfileに記載していない場合Warningが出る。そしておそらくAsset Pipelineがうまく動かない。

# flynnへのデプロイ
`git push flynn master`

# rake db:migrate
これもHerokuの場合は自動ででやってくれるので気付かなかったのだが、Flynnの場合は手動で行う必要がある。といっても簡単にできる。

`flynn run rake db:migrate`
Selenium Builderでいろいろ

# Selenium Builderでいろいろやってみる

そもそも**Selenium IDE**と何が違うのか？
記録して、動かす。基本は同じ。しかし**Selenium WebDriver用**にコマンドをコンバートできる。
これも、調査しながら書いていきます。ん。。。。**SeleniumIDE**で十分と言えば、そうかもしれない。
[開発は進んでる？？更新がないな。。大丈夫だろうか。](https://github.com/SeleniumBuilder/se-builder/network)

[Firefoxでインストール](http://seleniumbuilder.github.io/se-builder/
)

![Selenium.jpg](https://qiita-image-store.s3.amazonaws.com/0/55160/baf9d5dd-5e6b-092d-ef61-eb534588a22a.jpeg)

#使われてはいないかな。
Amazon API Gateway & Lambda & S3 で放置可能なサービスを作ってみた

1年半ほど前に書いたこちらの記事、タイミングが良かったのか naoya 砲なのか分かりませんが、色んな方に読んで頂けたようです。

しかし、「放置可能なサービス」というタイトルに反し、この記事で作成した楷書体サービス、とうとうメンテを行うことになりました。
理由は、node v0.10 のサポートを Lambda が打ち切るためです。
コードそのまま node v6 で動かせるとは思いますが、それでも放置できなかったことには変わりありません。謹んでお詫び申し上げます。

~~いやまぁ1年半もメンテナンスせずに動いてたんだからすごいじゃんと思う。今クリックしたら普通に動いてびっくりした~~

また、近年 serverless や microservices の流れがあったり、 GCP も Azure も対抗サービス出したりして、Lambda と API Gateway を取り巻く環境は大きく変わりました。自分の会社でも既に実戦投入してますし、そもそもその記事の構成は、今となってはもっといいやり方があります。今から読む方は、昔はこんなだったんだなーと思いながら読んで下さい。

---

先日発表された API Gateway に、話題の Lambda、S3 と、どれもリクエスト数が少なければタダ同然のサービスなので、組み合わせれば放置可能なサービスが作れるかな？　と思って試してみました。

## 作ったもの

http://kaisho.s3-website-us-east-1.amazonaws.com/

入力された文字列を楷書体の画像にして返すサービスです。
子供の命名書に筆入れするための見本のために作りました。

## 構成

![Kaisho.png](https://qiita-image-store.s3.amazonaws.com/0/17722/5450b3ce-adce-c384-3fa4-db2ee843463c.png)

1. S3 に置かれた HTML を取りに行って
2. HTML に書かれた JS が API Gateway を叩きにいって
3. API Gateway が Lambda を発火して
4. Lambda が楷書体の画像を作って S3 に配置して
5. API Gateway からのレスポンスで画像のURLが帰ってくるから、その画像を JS で img タグ作って取りに行く

と、こんな感じです。

## ソースコード

https://github.com/macoshita/kaisho

- Lambda ディレクトリに Lambda 用のコードが入ってます
- site ディレクトリに S3 に上げてるコードが入ってます

## 知っておくと嬉しいかもな Lambda 知識

- node_module ごとまとめる必要がある
    - つまり、ビルドが必要なライブラリは動かない可能性がある
- index.js に export.handler と書いてそこに実装したら、AWS Console の方では index.hander と設定する。 app.js だったら app.handler
- ImageMagick が入ってる [ここ参照](http://docs.aws.amazon.com/lambda/latest/dg/current-supported-versions.html)
    - ImageMagick に依存したライブラリは普通に利用できる。公式ドキュメントでも gm というライブラリを使ってる
- Node は v0.10.36 が入ってる [ここ参照](http://docs.aws.amazon.com/lambda/latest/dg/current-supported-versions.html)

## 知っておくと嬉しいかもな API Gateway 知識

- API Gateway はユーザーからのリクエストをLambdaが読むのに都合いい感じに変換して、Lambdaからのレスポンスをアプリで処理しやすいように変換する　という部分を担当してる
- ~~CORS 対応がめんどい。公式ドキュメントにちゃんとやり方載ってるけど、[classmethod さんの記事](http://dev.classmethod.jp/cloud/aws/amazon-api-gateway-cors/) の方が画像付きでわかりやすいと思う~~
    - めちゃんこ楽になりました https://aws.amazon.com/jp/about-aws/whats-new/2015/11/enable-cors-in-amazon-api-gateway/

## できなかったこと

- API Gateway が画像を返せればなーと思ったけどできなかった
    - これは現状いけなさそう
- API Gateway が画像へのリダイレクトを返せればなーと思ったけどできなかった
    - これは頑張ればいけそう
- API Gateway にクエリパラメータで日本語を渡したらうまく動かなかった。最初 Path パラメータでも動かなかったけど、1日たったら直ってた。多分中の人が修正したんだと思う。
    - ともかく現状(2015/07/28時点)は日本語の扱いが若干あやしいので注意。

## まとめ

- ImageMagick でいけるレベルの画像ジェネレータは割と簡単に作れます。
- Lambda はガッツリ使うならデプロイが面倒そうです。素直に package.json 書いて npm start で起動してほしいなーと。それ以外はそんなに文句ないけど、java のほうがもしかして現時点では使いやすいかもしれないです（使わずにいってる）。
- API Gateway のほうがさすがにまだプレビュー版な雰囲気。特に CORS 対応はそのうちもっと楽になると思います。
- 趣味サービスにはとてもいいと思います。

## 2015/08/27 追記 : 料金について

8/27までにAPI Gatewayに1,358リクエストがありました。
※S3ロギングぐらいONにしとくべきでした；　こんなにストックして頂けるとは……。

私はAWS登録後1年以上経過しているので、API Gateway に1円、S3リクエストで1円、S3容量で1円、データ転送に1円かかりました。lambdaは毎月の無料枠があるので0です。1年経ってないアカウントだと年間無料枠のおかげでデータ転送の1円のみで済むのかな？

ということで、このサービスを維持するには年間4x12=48円ほど必要になることがわかりました。タダじゃないじゃないか！訴訟！
……アカウントが事故らない限りは運用する気がします笑
RからQiitaに記事を投稿する

（残念ながらこの記事はRから投稿したわけじゃないです）

dichikaさんに教えていただいたおかげでやり方なんとなく分かりました。

`test.Rmd`というファイルをknitしてQiitaにアップするとすると、こんな感じ。ただし、APIからはファイルアップロードはできないので、今のところそこは手動でやる必要があります。

```R
library(rmarkdown)
library(httr)
library(jsonlite)

rmd_file <- "test.Rmd"
md_file <- "test.md"

# markdownファイルを生成
render(input = rmd_file, output_file = md_file,
       output_format = md_document(variant = "markdown_github"), encoding = "UTF-8")

# markdownファイルを読み取り、JSONをつくる
body <- paste(readLines(md_file, encoding = "UTF-8"), collapse = "\n")
b <- toJSON(
  list(body = body,
       tags = list(
         list(name = "R")
         ),
       title = "RからQiitaに投稿するテスト"),
  auto_unbox = TRUE)

# 個人用アクセストークンを入力
qiita_token <- paste("Bearer", .rs.askForPassword("Enter token here:"))

# 投稿
res <- POST("https://qiita.com", path = "/api/v2/items",
            config = add_headers(`Content-Type`='application/json',
                                 `Authorization`=qiita_token),
            body = b)
# 確認
status_code(res)
> [1] 201
```

結果：http://qiita.com/yutannihilation/items/3b02596ed82b88760519
複数のフラグからマッチするEnumオブジェクトを取得する（ビット演算とEnumSet）

## やりたいこと
こんなかんじのフラグのセットを受け取って

```java
boolean useSaba = true;
boolean useTori = false;
boolean useNira = false;
boolean isOomori = true; 
```

マッチするEnumオブジェクトを取得したい。
（上のフラグの場合は `LunchSet.SABA_DAI` ）

```java
enum LunchSet {
	GOHAN("ご飯セット"),
	SABA("サバ味噌定食"),
	TORI("トリ唐揚定食"),
	NIRA("ニラ炒め定食"),
	GOHAN_DAI("ご飯セット大盛り"),
	SABA_DAI("サバ味噌定食大盛り"),
	TORI_DAI("トリ唐揚定食大盛り"),
	NIRA_DAI("ニラ炒め定食大盛り");

	private final String name;
	private LunchSet(String name) {
		this.name = name;
	}
	public String getName() {
		return name;
	}
}
```

## 方法1 ビット演算
- Enumのコンストラクタにビット演算用の数値を追加する。
- 数値を元にマッチするEnumオブジェクトを返すメソッドを定義する。

```java
enum LunchSet {
	GOHAN("ご飯セット", 0),
	SABA("サバ味噌定食", 1),
	TORI("トリ唐揚定食", 2),
	NIRA("ニラ炒め定食", 4),
	GOHAN_DAI("ご飯セット大盛り", 8),
	SABA_DAI("サバ味噌定食大盛り", 9),
	TORI_DAI("トリ唐揚定食大盛り", 10),
	NIRA_DAI("ニラ炒め定食大盛り", 12);

	private final String name;
	private final int flag;
	private LunchSet(String name, int flag) {
		this.name = name;
		this.flag = flag;
	}
	public String getName() {
		return name;
	}
	public int getFlag() {
		return flag;
	}
	public static LunchSet getByFlag(int flag) {
		return Arrays.stream(values())
				.filter(s -> s.getFlag() == flag)
				.findFirst()
				.orElse(LunchSet.GOHAN);
	}
}
```

こんなふうにフラグからビットの論理和を求めて取得できる。

```java
		int flag = 0;
		if (useSaba) { flag += 1; }
		if (useTori) { flag += 2; }
		if (useNira) { flag += 4; }
		if (isOomori) { flag += 8; }
		LunchSet lunchSet = LunchSet.getByFlag(flag);
```

でもビット演算はちょっとわかりづらい。

## 方法2 EnumSet
Effective Javaで有名なビット演算の置き換え。

```java
enum Menu {
	SABA,
	TORI,
	NIRA,
	OOMORI;
}

enum LunchSet {
	GOHAN("ご飯セット", EnumSet.noneOf(Menu.class)),
	SABA("サバ味噌定食", EnumSet.of(Menu.SABA)),
	TORI("トリ唐揚定食", EnumSet.of(Menu.TORI)),
	NIRA("ニラ炒め定食", EnumSet.of(Menu.NIRA)),
	GOHAN_DAI("ご飯セット大盛り", EnumSet.of(Menu.OOMORI)),
	SABA_DAI("サバ味噌定食大盛り", EnumSet.of(Menu.SABA, Menu.OOMORI)),
	TORI_DAI("トリ唐揚定食大盛り", EnumSet.of(Menu.TORI, Menu.OOMORI)),
	NIRA_DAI("ニラ炒め定食大盛り", EnumSet.of(Menu.NIRA, Menu.OOMORI));

	private final String name;
	private final EnumSet<Menu> flag;
	private LunchSet(String name, EnumSet<Menu> flag) {
		this.name = name;
		this.flag = flag;
	}
	public String getName() {
		return name;
	}
	public EnumSet<Menu> getFlag() {
		return flag;
	}
	public static LunchSet getByFlag(EnumSet<Menu> flag) {
		return Arrays.stream(values())
				.filter(s -> s.getFlag().equals(flag))
				.findFirst()
				.orElse(LunchSet.GOHAN);
	}
}
```

こんなふうにEnumSetのフラグから取得できる。

```java
		EnumSet<Menu> flag = EnumSet.noneOf(Menu.class);
		if (useSaba) { flag.add(Menu.SABA); }
		if (useTori) { flag.add(Menu.TORI); }
		if (useNira) { flag.add(Menu.NIRA); }
		if (isOomori) { flag.add(Menu.OOMORI); }
		LunchSet lunchSet = LunchSet.getByFlag(flag);
```

コード量が増えるのが難点だけど、ビット演算よりは何をしているのかわかるようになり、Enumからフラグのセットを求める逆の操作もやりやすい。
hubotでgithubのプルリクのコメントがslackに流れた時のコメントを拾う


[hubotでbotの発言を拾う](http://mapyo.hatenablog.com/entry/2015/07/28/090826)

この辺でgithubのプルリクのコメントが拾えるー。やったー！と思っていたら多少修正が必要であった。


参考にさせていただいた、

http://shoya.io/blog/hubot_listens_webhook/


こちらの書き方にそった形で拾えるように修正するには、以下のようになおせばOK。

```coffee
module.exports = (robot) ->
  robot.catchAll (msg) ->
    r = new RegExp "(.*)(どーなつ|ドーナツ)(.*)", "i"
    if msg.message.rawMessage.attachments?
      matches = msg.message.rawMessage.attachments[0].text.match(r)
    else
      matches = msg.message.text.match(r)

    if matches == null or matches.length == 0
      return
    msg.send "どーんといこう！"
```

基本はconsole.logでいろいろ値を見ていったり、

https://api.slack.com/docs/attachments

この辺を見てイメージを掴んだ。

これで、slackの発言も拾えるし、githubのプルリクのコメントも拾えるようになったので、
僕がやりたかったプルリクのコメントを拾って、レビュー担当さんを呼び出す事も出来るようになったわけだ。

めでたしめでたし。
Windows Server 2012 R2にSUAをインストールする

LinuxのユーザとADをうまく連携させたいとき、あると嬉しいのがADのUNIX属性のタブ.　で、それを設定するときに検索して引っかかるのがSUA.
SUA = Subsystem for Unix Application.

SUAを入れなくても、UNIX属性は設定できるけれど、拡張属性を1つ1つ確認していれるのは大変.

具体的な属性は
http://08thse.blog87.fc2.com/blog-entry-363.html

で、とりあえずSUAを入れてみよう、と思い、インストール手順で検索しても、2008ばっかり。だって、2012では「非推奨機能」になってしまったから。
そんなの関係ないよ、ということで、インストールしたいんだけど、GUIでは入れられません。

で、2012では、コマンドどうやって入れるのか。下記の3つをPowerShellで実行して下さい. UNIX属性のタブを出すにはNISだけ入っていれば大丈夫です。

```
Dism.exe /online /enable-feature /featurename:adminui /all
Dism.exe /online /enable-feature /featurename:nis /all
Dism.exe /online /enable-feature /featurename:psync /all
```
1行実行するたびに再起動を求めてくるのがWindowsらしいところ。

ADを入れてからでも、入れる前でもどちらでも、問題ないです。

このUNIX属性が重要。groupのUNIX属性を適切に設定して、userをそのグループに所属させると、Linux側でサブグループとして認識させることができる。「グループに所属」はNISドメインではなく、通常通り「グループに追加」でOK。サブグループ単位でsudoの設定も可能で、sudo認識もグループ毎でまとめて出来るようになる。この辺の話も自分用にどこかでまとめて書きたい。

インストール手順参考：(uninstallの手順も載っています)。
https://msdn.microsoft.com/en-us/library/cc731178.aspx#BKMK_command


悩みどころは「非推奨機能」というところ。
おそらく次のバージョンでは削除されてしまうので、バージョンアップしたときには、属性を1つずつ埋めるしかない..。あるいはPowershellでやる。
break文


break文は現在のループを強制的に中断する命令文
if文を合わせて使うのが一般的。


変数iが5より大きくなるとfor文を抜ける。これは微妙にFizzBuzz問題だな、

```
for i in 1..10 do
  if i > 5
    break
  end
  puts i 
end    
  
```

next文　

next文hは指定の周だけスキップしループそのものは継続して実行します。

iが3の倍数の時にその周のループを終了する

```
   for i in 1..10 do
     if i %3 == 0
       next
     end
     puts i
   end    

```

演習とコードに理解に努める。

```

n = 0

while true do
  n += 1
  puts "好きな文字列を入力してください。(stopで終了)"
  answer = gets.chomp
  puts "#(n)回 繰り返しました"
  
  if answer == "stop"　#answerと等しい時にループ処理を行っているブロックから抜け出す。
    break
  end  
end  

メソッドとif文に関して、内容の理解に。

def max(num1, num2)
  if num1 > num2
    return num1 #num1の方が大きいとき戻り値となりここで処理が止まる
  end
  num2　#num1の方が小さいとき戻り値となる。(最後の評価された値、返り値として扱う)
end    

puts max(5,1)

```  

while true doに関して

while文で無限ループを行う場合、trueを条件として記述します。
「条件式がtrueである限り」while文は処理を行い続けるので、ループのたびにn += 1(nに対して1が加算され続けます。)=無限ループ

この時、無限ループから抜け出す=条件式がfalseになる記述を行う必要があります。
そして方法の一つとして、そのループを強制的に中断するのが"break文"です。

この繰り返しから抜け出す条件式、answer == "stop"はanswerという変数に対してgetsメソッドによってユーザーから"stop"という入力が行われた時に、ループ処理から抜け出す命令を与えます。

簡単にいえば、break文を用いて、"stop"という文字列が入力されたら繰り返しを抜けるようにしている。と言えます。ただgetsメソッドを理解していないとイマイチわからないですよね。


***

ここからは後学の為にさらにブロックのについて学習します。
注意
理解は完璧ではなく、かつ引用です。

>
>引用サイトURL
http://qiita.com/kidach1/items/15cfee9ec66804c3afd2


「Rubyのブロック・proc」

ブロック do~end(もしくは{~})で囲まれた引数となる為の"カタマリ"
・yield　「ブロックを呼び出すもの」
・proc 　「　ブロックをオブジェクト化したもの」

ブロックの性質
・それ単体では存在できず、メソッドの引数にしかなれない (「do~endのカタマリ」がその辺に単体でころがっていることはない
・引数として渡されたブロックは、yieldによって実行される。

これ以上は現在だと理解しきれない為、後に回す。
EC2インスタンスが自殺するワンライナー


色々な事情があって、たまにこういうのが欲しくなるので自分用にメモ。要AWSCLI。
/etc/rc.localとか、user-dataに渡してあげると起動した直後に消える。

```
$ aws ec2 terminate-instances --instance-ids `curl http://169.254.169.254/latest/meta-data/instance-id` --region `curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone | sed -e 's/[a-z]$//g'`
```
AWS S3とGCP GCSで特定のディレクトリの仕様容量を調べる方法

## `AWS`の`cli`を使って、`S3`内のディレクトリ容量を調べる方法 

```
aws s3 ls s3://bucket_name/path/to/search/ --recursive | grep -v -E "(Bucket: |Prefix: |LastWriteTime|^$|--)" | awk 'BEGIN {total=0}{total+=$3}END{print total/1024/1024/1024" GB"}'
```

## `GoogleCloudStorage`（GCS）の`gsutil`を使って、`GoogleCloudStorage`内のディレクトリ容量を調べる方法 

GCSは、`du`コマンドが使えるので、それを利用する。

```
gsutil du -ch gs://bucket_name/path/to/search/
```

### オプションの意味
`-c`: 全体の合計を表示
`-h`: 人間の読み取りやすいフォーマットでファイルサイズの合計を表示
Laravelの日付バリデーションで現在日時との比較

# 今日以降の日付のみOK

```php:
class HogeRequest extends Request
{
    // ...

    public function rules()
    {
        return [
            'start_date' => 'after:yesterday',
        ];
    }
}
```

yesterdayの他にtomorrow等も使える。

# 現在時刻以降の日時のみOK

```php:
class HogeRequest extends Request
{
    // ...

    public function rules()
    {
        return [
            'start_datetime' => 'after:"now"',
        ];
    }
}
```

"now + 1 day"で明日の現在時刻以降のみOKとかもできる。

# 参考
http://laravel.com/docs/5.0/validation
http://laravel-tricks.com/tricks/validation-and-behavior-of-date-date-format-before-and-after-rules
http://stackoverflow.com/questions/29327916/laravel-4-2-date-validation
http://laravel.io/forum/07-21-2014-validating-dates-in-non-us-formats
RailsのXSS対策との付き合い方

Rails 4では、普通に書けば意識しなくていい程度にXSS対策のエスケープが施されています。ただし、複雑なことをやろうとすれば引っかかる場面も出てきます。

# TL;DR
* 全般
 * できる限り、HTMLのコード生成にはヘルパーを使う 
 * `SafeBuffer`を左辺に置く
 * `SafeBuffer`を文字列中に展開しない 
* モデル・ヘルパー内で
 * HTML出力するものは`html_safe`しておく
* ビュー内で
 *  `raw`や`<%==`は原則使わない
 *  `html_safe`は純粋リテラルだけに使う

# 2つの文字列型
Railsでは、ビューの出力側で特に工夫しなくても、HTMLを出力すべきものとエスケープしてから出力されるものが区別されています。

```erb:view.erb
<!-- こっちはエスケープ処理が入る -->
<%= 'a < b & c > d' %>

<!-- こっちはそのまま出力 -->
<%= link_to 'Qiita', 'http://qiita.com/' %>
```

こんな機能を実現するために、Railsでは通常の`String`型以外に、`String`を継承した`ActiveSupport::SafeBuffer`という型があって、後者ではHTMLエスケープなしで出力していいかを記録する機能が付いています[^1]。ERBの出力では通常の文字列ならエスケープをかけて、`SafeBuffer`はそのまま通す、ということをしています。

## SafeBufferの生成
もちろん`new`で作れなくもないのですが、通常は以下の2つのどちらかの方法で生成します。

* `'文字列'.html_safe`というように`html_safe`メソッドを呼び出す
* `html_escape('文字列')`、あるいは短縮形の`h('文字列')`でエスケープする

前者については、`html_safe`だと**マークする**だけですので、中身が何であろうとそのまま出力することになります。タグを生成するにはこちらが必要ですが、下手にユーザー入力などの素性がわからない文字列に適用すればXSSを作りこんでしまいます。変数代入のない純粋なリテラルに適用するのならともかく、それ以外のものにビューで`html_safe`を乱発するのは避けたいものです。

なお、`link_to`や`content_tag`といったHTML用のヘルパーがありますが、これらは`SafeBuffer`を生成しています。基本的には、HTMLタグはこういったヘルパーで生成しましょう。

```rb:actionview/lib/action_view/helpers/tag_helper.rb
def content_tag_string(name, content, options, escape = true)
  tag_options = tag_options(options, escape) if options
  content     = ERB::Util.unwrapped_html_escape(content) if escape
  "<#{name}#{tag_options}>#{PRE_CONTENT_STRINGS[name.to_sym]}#{content}</#{name}>".html_safe
end
```

## SafeBufferの演算
文字列は連結したりもよくしますが、SafeBufferを連結するとどうなるのでしょうか。

* `SafeBuffer + SafeBuffer`…そのまま連結される（`SafeBuffer`）
* `SafeBuffer + String`…String側をエスケープした上で連結（`SafeBuffer`）
* `String + SafeBuffer`…**単なるStringとして**両者を連結

最後のパターンでは、一度付いた`html_safe`が外れる結果、出力時に**エスケープされて**、HTMLタグがそのまま表示される結果となります。この形は避けるようにしましょう（`SafeBuffer`を二重引用符の中で変数展開してしまっても同様なことになります）。ヘルパーなどでは、以下のような書き方も見られます。

```rb:HTML生成コード
def hoge
  str = ''.html_safe # バッファとして宣言
  str << foo
  str << bar(42)
  str
end
```

# 最後に
どうしてもうまく整わなければ、最後にビューで `raw`出力してしまう手段もなくはないのですが、まさにそれは**最後の手段**です。きちっとHTMLと文字列を意識してデータを生成すれば、ビューでの制御の必要はほぼなくなるでしょう。

# 外部リンク
* [SafeBufferなどのソース ＠ GitHub](https://github.com/rails/rails/blob/72ffeb9fe58c46bd556a85bed5214d8f482737a5/activesupport/lib/active_support/core_ext/string/output_safety.rb)

[^1]: 破壊的変更を加えた場合など、`SafeBuffer`でも`html_safe`でなくなることもあります。ただし、以下では特に断らない限り`html_safe`な場合についてを考えます。
exeファイルをエクスプローラーでダブルクリックしてからプロセスが作られ、プログラムのエントリポイントまで移動するまでの過程（2015年7月28日版）

木村屋です。この記事は私のブログからの転載です。
現在、Windowsでexeファイルからプロセスが作られるまでの過程を調査しています。
今回はAPI Monitorというツールを使って、プロセスが生成されてから、どういったネイティブAPIが呼び出されているかを調査しましたので、今回、改めて記事を書かせていただきます。
調査中である為、間違いや勘違いも含まれていると思われます。予めご了承ください。正確性を期した積もりですが誤りがあった場合は文責はすべて私にあります。
検証を行った環境はWindows 7 Ultimate（x64）です。exeファイルはx64の物でテストを行いました。

1. 親プロセスからexeファイルが起動される（普通のユーザーがexeファイルを起動する場合、親プロセスはエクスプローラーやコマンドプロンプトである場合が多いと思います。エクスプローラーから起動した場合、エクスプローラーが親プロセスになります）
2. 関数CreateProcessがexeファイル（イメージファイル）を開き、セッションオブジェクトを作成（関数NtOpenFileと関数NtCreateUserProcessが実行可能ファイルを開き、関数NtCreateSectionがセッションオブジェクトを作成する。詳細は不明だがexeファイルによって、関数NtCreateSectionが呼び出される順序が異なる模様。3で紹介するの関数NtOpenProcessが関数NtCreateSectionよりも先に呼ばれる事もある。原因については不明）
3. 関数CreateProcessがプロセスオブジェクトを作成（ntdll.dll内にある関数NtOpenProcessが呼び出され、新しいプロセスが仮想アドレス空間に作られる。参考資料では、ntdll.dll内にある関数NtCreateProcessExが呼び出されると書かれていたが、実際に呼び出されているのは関数NtOpenProcessだった。未確認だが参考にした資料は2003年に作られた物なので、Windows XPの時には関数NtCreateProcessExが使われていた可能性がある。Windows XPからWindows Vista, Windows 7にバージョンアップする際に呼び出される関数が変更されたのではないかと推測する。これはあくまでも私の憶測であり、未確認である）
4. 関数CreateProcessがスレッドオブジェクトを作成（インサイドWindows 第6版 上では、ntdll.dll内にある関数NtCreateThreadがプロセスの最初のスレッドを作成すると書かれているが起動した所を確認できなかった。詳細と原因については不明。関数PspCreateThreadを何らかの形で呼び出している筈だが、この関数についてはAPI Monitorではブレークポイントを貼ることが出来ず、確認できなかった）
5. Windowsサブシステムがプロセスを初期化する（kernel32.dllがWindowsサブシステムにメッセージを送信）
6. 最初のスレッドの実行を開始。関数KiThreadStartupを呼び出し、スレッドを初期化する（この関数についてはAPI Monitorではブレークポイントを貼ることが出来ず、確認できなかった）
7. イメージローダー（ntdll.dll内にあるLdrからはじまる関数群）に制御を移す
8. イメージローダーが最初のヒープの作成などのプロセスの初期化処理を行う
9. イメージローダーがexeのインポートテーブルの解析を行い、必要なDLLをすべて洗い出す。
10. イメージローダーが実行時、必要に応じてDLLをロード、アンロードする。ロードされているモジュールのリスト（モジュールデータベース）を管理する。ロードされているモジュールのリストにはDLLとメインの実行ファイルが含まれる
11. イメージローダーによりすべてのDLLがロードされた後、IAT（インポートアドレステーブル）を解析し、インポートされた関数を調べる（この処理で.textセクションにある外部のDLLにある関数呼び出しとメモリに呼び出されたDLL内部にある関数呼び出しの名前とアドレスの解決を行うものと思われる。詳細は未調査）
12. イメージローダーが依存関係を解決した後、インポート後の初期化処理が行われる（.NETアプリケーションかどうかの確認、静的なインポートのすべてのロードの処理等）
13. エントリポイントからプログラムの実行を開始

以上です。今後も調査を実施し、追記があれば記事の訂正、追加等を行います。

**使用したツール**
API Monitor http://www.rohitab.com/apimonitor

**引用文献**
Mark E. Russinovich、David A. Solomon、Alex Ionescu 2012 3.10 イメージローダー インサイドWindows 第6版 上 265
Mark E. Russinovich、David A. Solomon、Alex Ionescu 2012 実習：イメージローダーを監視する インサイドWindows 第6版 上 266
Mark E. Russinovich、David A. Solomon、Alex Ionescu 2012 5.3 CreateProcessの処理の流れ インサイドWindows 第6版 上 411
Mark E. Russinovich、David A. Solomon、Alex Ionescu 2012 実習：プロセスの起動をトレースする インサイドWindows 第6版 上 431
平成15 年度夏学期集中講義　コンピュータ科学特別講義III (戦略ソフトウェア特論II) http://i-web.i.u-tokyo.ac.jp/edu/training/ss/lecture/new-documents/Lectures/13-Processes/Processes.pdf

**転載元**
南関東開発機構 : exeファイルをエクスプローラーでダブルクリックしてからプロセスが作られ、プログラムのエントリポイントまで移動するまでの過程（2015年7月28日版）
http://blog.livedoor.jp/south_kanto_dm/archives/52101117.html
Windows環境でPostgreSQL

## サーバー側
### インストール
PostgreSQL 9.4 をインストールする。

1. http://www.enterprisedb.com/products-services-training/pgdownload から Version 9.4 の Win x86-64 のインストーラをダウンロード
1. postgresql-9.4.*-windows-x64.exe を実行
1. Installation Directory: `D:\PostgreSQL\9.4`
1. Data Directory: `D:\PostgreSQL\9.4\data`
1. Password: パスワードを設定（ユーザー「postgres」のパスワードになる）
1. Port: そのまま（`5432`だった）
1. Advanced Options
  - Locale: `C`
1. 「Stack Builder ...」のチェックを外して Finish

### 別の端末からの接続を許可
[pg_hba.conf](https://www.postgresql.jp/document/9.4/html/auth-pg-hba-conf.html) に許可したい端末のアドレスを設定。

```
# TYPE  DATABASE        USER            ADDRESS                 METHOD
host    all             all             <アドレス>                 md5
```

サービス「postgresql-x64-9.4」を再起動

## クライアント側

1. Visual Studio でプロジェクトを作成
  - テンプレート: C#/Windowsフォームアプリケーション
  - プロジェクト名: PostgresTest
- パッケージマネージャコンソールで以下を実行
  - `Install-Package Npgsql -Version 2.2.5` (latest stable を使用)
  - `Install-Package Dapper`
- Form1 にボタンを追加して、クリックするとサーバ側の現在時を取得するようにする

```csharp
using System;
using System.Linq;
using System.Windows.Forms;
using Npgsql;
using Dapper;

namespace PostgresTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            DateTime resultDate;
            using (var conn = new NpgsqlConnection("Server=<サーバー名>;Database=postgres;Uid=postgres;Pwd=<パスワード>"))
            {
                conn.Open();
                resultDate = conn.Query<DateTime>("SELECT NOW();").Single();
            }

            MessageBox.Show(resultDate.ToString());
        }
    }
}
```

## 参考

- [WindowsでPostgreSQLを使ってみよう](http://lets.postgresql.jp/documents/tutorial/windows/)
二重起動チェック(bashスクリプト)

時々必要になるシェルスクリプトの二重起動チェック処理のメモ

ロック機構としてディレクトリを使用する方式。
ディレクトリが作成できたプロセスのみが処理を継続する。
ただし、ディレクトリが不正に残った場合を考えて、ディレクトリを作ったプロセスが居なければ不正なロックとして処理を継続する。

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

lockdir=/tmp/lock_$(basename $0)
pidfile=$lockdir/pid

function delete_lock() {
    rm -r $lockdir
}

trap 'delete_lock' INT TERM

# 二重起動チェック
mkdir $lockdir
if [ $? != 0 ]; then
    other_cmd_pid=$(cat $pidfile)
    kill -0 $other_cmd_pid
    if [ $? = 0 ]; then
        echo "other process started."
        exit 1
    fi
fi
echo $$ > $pidfile

# スクリプトの主処理

delete_lock
```
Scalaのobjectの型

Scalaの型システムがいまいちぴんとこない・・・

Scalaでobject宣言したものはシングルトンオブジェクトといわれる。
これを引数にとりたいなと思ったけど・・・

```scala:
object X
def f(x: X): Unit = {}
```

これはコンパイルエラー、Xの型が見つからないといわれる。
一応、X.getClass().getName()とやるとインナークラス(?)としてコンパイルされてるっぽいのはわかる。

でも、以下のやつはコンパイル通る。

```scala:
class Parent()
object X extends Parent

def f(x: Parent): Unit = {}

f(X)
```
クラスを継承してやると型を持つようになる。
型を後付してあげてるような感じ。
Aspera connect


高速ファイル転送ソフトウェア。
bioinformatics の世界では、 NCBI が採用しているので有名


20150728 現在

## インストール
### mac

[ここ](http://downloads.asperasoft.com/connect2/)からダウンロード。

そこの pdf にある "Connectの機能"の[転送サーバ](http://demo.asperasoft.com/aspera/user)にログインして[^1]、適当なサンプルで動作確認。

[^1]: ユーザーとパスワードは、pdf に書いてある。

safari では普通に動作するが、最近の Google Chrome では以下のセッティングをする。

[ここ](https://support.asperasoft.com/entries/92926978-Workaround-for-use-of-Aspera-Connect-with-Google-Chrome-version-42-0-2311-90)の説明通り、

```
chrome://flags/#enable-npapi
```
にアクセスして、有効に。


### CentOS

[ここ](http://downloads.asperasoft.com/en/downloads/8?list)からLinux用をダウンロード

```
$ tar zxf aspera-connect-3.6.0.106805-linux-64.tar.gz
$ sh aspera-connect-3.6.0.106805-linux-64.sh 
                                                                                  
Installing Aspera Connect                                                         
                                                                                  
Deploying Aspera Connect (${HOME}/.aspera/connect) for the current user only.
Restart firefox manually to load the Aspera Connect plug-in                       
                                                                                  
Install complete.                                                                 

```

`${HOME}/.aspera/connect/bin`  に `ascp` が出来るので、パスを通す。

## NCBI

`nr` `nt` などのデータベースを落すのに[^2]。

[^2]: 個人的には、 `.sra` にアクセスする必要は無い。

```
$ ascp -qT -l 200M -i ${HOME}/.aspera/connect/etc/asperaweb_id_dsa.openssh anonftp@ftp.ncbi.nlm.nih.gov:blast/db/nt.01.tar.gz.md5 ~/
```

* -i はフルパス。

動作確認が取れたら、一週間に一回などのペースで md5 ファイルのチェックして、更新されたものを自動的にダウンロードして云々。

NCBI はアクセス過多だと遠慮無くアク禁登録する。心証を良くする意味も込めて、スクリプトは適度に sleep させるのを忘れずに、、、

### 速度チェック

hgc 倍近くかかるじゃん、、、

#### aspera

NCBI nt.01 820M


```
$ time ascp -qT -l 200M -i ${HOME}/.aspera/connect/etc/asperaweb_id_dsa.openssh anonftp@ftp.ncbi.nlm.nih.gov:blast/db/nt.01.tar.gz ~/blastdb
nt.01.tar.gz                                                                                                                                                                                                  100%  820MB 27.4Mb/s    04:11    
Completed: 839762K bytes transferred in 252 seconds
 (27264K bits/sec), in 1 file.
ascp -qT -l 200M -i    0.93s user 3.60s system 1% cpu 4:16.22 total
```

#### wget（hgc）

NCBI nt.01 820M[^3]

[^3]: NCBI の現行データと同一ではなかった。が、サイズはほぼ同じ。

```
$ time wget ftp://ftp.hgc.jp/pub/mirror/ncbi/blast/db/nt.01.tar.gz
1.74s user 9.32s system 2% cpu 8:01.22 total 
```

#### wget（NCBI）

NCBI nt.29 811M[^4]

```
$ time wget ftp://ftp.ncbi.nlm.nih.gov/blast/db/nt.29.tar.gz
1.96s user 8.90s system 0% cpu 43:24.23 total
```

[^4]: 全く同じ物をダウンロードするのは何だか偲びなく、どうせ断トツで遅いのだからと、似たサイズのものでテスト。
Linux bluetooth LE 6lowpan その２


[前回](http://qiita.com/kwi/items/b94d2b149be2397cb528)の続き。

実験環境は、RAでIPv6のアドレスが来る環境。6lowpan で繋がるデバイスには [nRF51 IoT SDK](https://developer.nordicsemi.com/nRF51_IoT_SDK/doc/iot/html/a00061.html) でもやっているように radvd でアドレスを渡してみたい。お約束のように `eth0` が上位回線側につながっている。Linux kernel 4.0.9。

radvd は上位から渡された RA と同じ空間を、そのまま 6lowpan 側に与えてアドレスを採番して、nexthop/neighbor で経路制御する方向。

router 側と host 側の二つにパートが分かれる。bluetooth のアドレスは、例として host 側 `88:77:66:55:44:33` と router 側 `00:11:22:33:44:55` を使っている。

host 側
-------
素朴に bluetooth の準備をしておく。

```
modprobe bluetooth_6lowpan
echo 1 > /sys/kernel/debug/bluetooth/6lowpan_enable
hciconfig hci0 up leadv
```

router 側
---------
```bash
echo 2 > /proc/sys/net/ipv6/conf/eth0/accept_ra
```

ipv6 の forwarding を 1 にすると ::/0 の経路が毎回消えて、困っていたのだけれど、実は [accept_ra に 2 を設定できる](http://strugglers.net/~andy/blog/2011/09/04/linux-ipv6-router-advertisements-and-forwarding/)らしい。そうすると上位から来たRAの経路がそのまま使える。ちゃんとドキュメントにも書いてあるけど、最初気が付かない。

```bash
echo 1 > /proc/sys/net/ipv6/conf/default/forwarding
echo 1 > /proc/sys/net/ipv6/conf/all/forwarding
```

forwarding は all に対して有効にして、forwarding したくないものは個別に netfilter で設定しろ、という記事も見かけたけど、本当かなぁ。とりあえず攻撃を受けるような環境ではないので、そのまま。

```bash
echo 1 > /proc/sys/net/ipv6/conf/default/proxy_ndp
echo 1 > /proc/sys/net/ipv6/conf/all/proxy_ndp
```

上位ルータから host 側の戻りパケットを router 側が吸い込めるように proxy_ndp を使う。(*2)

`/etc/radvd.conf` はとりあえず [nRF51 IoT SDK](https://developer.nordicsemi.com/nRF51_IoT_SDK/doc/iot/html/a00061.html) と同じで、prefix だけ与えられたものに変更しておく。

```bash
systemctl start radvd
```

そして bluetooth 6lowpan の接続。

```
modprobe bluetooth_6lowpan
echo 1 > /sys/kernel/debug/bluetooth/6lowpan_enable
hciconfig hci0 up
hcitool lescan # address 確認
echo "connect 88:77:66:55:44:33 1" > /sys/kernel/debug/bluetooth/6lowpan_control
ip link
```

接続できたら `bt0` という netdev が見えるようになっているはず。

host 側
-----
こちら側にも `bt0` というインターフェースができていて、アドレスが付いていることを確認する。アドレスは link local である `fe80::8a77:66ff:fe55:4433` と、global scope の `<some_prefix>:8a77:66ff:fe55:4433` の両方がついているはず。

link local での疎通を確認しておく。

```bash
ping6 -I bt0 fe80::211:22ff:fe33:4455
```

router 側
---------
まだこの辺は自動化する方法がよく分かっていない…。(*1)

`bt0` には global アドレスが振られていないので、手作業で与えておく（無くてもよい）。与えるべきアドレスは `fe80::` を読み替えたもの、と考えれば簡単。EUI-64 （= `ff:fe` を差し込んで、mac address 7 bit 目の global/local のフラグを立てる）が下 64 bit になる。

```bash
ip -6 addr add <some_prefix>:211:22ff:fe33:4455 dev bt0
```

経路情報を手作業で入れる。

```bash
route -A inet6 add <some_prefix>:211:22ff:fe33:4455 dev bt0
ip -6 neigh add proxy <some_prefix>:211:22ff:fe33:4455 dev eth0
```

注意点としては、`ip neigh` は `proxy` とそうじゃないものの二つがあるという点。

```bash
ip neigh show
ip neigh show proxy
```

host 側
-----
どこか外のホストに対して `ping6` が通るか確認。

メモ
===
`route -A inet6 add <some_prefix>:211:22ff:fe33:4455 dev bt0` の代わりに、
`ip -6 neigh add <some_prefix>:211:22ff:fe33:4455 lladdr 02:11:22:ff:fe:33:44:55 dev bt0` で行けそうな気がしたけど、ダメだった。理由は不明。


追記
----
(*1)について。今の Linux の実装だと 6lowpan 用のオプションが未実装の様子。RFC 6775 ND Optimization for 6LoWPAN にある NS message の ARO(Address Registration Option)で自動化するということのようだ。

(*2)について。`eth0` だけでよい。
What is attr_accessor in Ruby



attr_accessorsってなんなんだ、と思いstackoverflowにで探してみた、、そして説明で使われるコードが美しい！！と感じた為、後学の為に残します、かつアクセサメソッドは使えません。。。）

まずは説明だけ。

アクセサメソッド
attr_accessorメソッドは、クラスやモジュールにインスタンス変数を読み書きするためのアクセサメソッドを定義します。引数には、インスタンス変数名をシンボルか文字列で指定します（複数指定できます）。戻り値はnilです。

参照URL
http://fujitaiju.com/blog/%E5%88%9D%E5%BF%83%E8%80%85/ruby%E3%81%AE%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B5%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%EF%BC%88attr_%E3%81%A3%E3%81%A6%E3%82%84%E3%81%A4%E3%81%AD%EF%BC%89/

stackoverflow
参照URL

http://stackoverflow.com/questions/4370960/what-is-attr-accessor-in-ruby/4371458#4371458
Scalaの文字列補間

他の言語だと式展開とか変数展開とかいうやつ。
要は文字列中に変数の値を埋め込むやり方。

```scala
val age = 20
println(s"I am $age years old.")
println(f"I am $age%3d years old.")
```

実行結果

```
I am 20 years old.
I am  20 years old.
```

上がs補間子で、文字列中に変数の値を埋め込む、下がf補間子で他の言語の文字列フォーマットみたいなことができる。
他にも補間子あるようですが、とりあえず使いそうなのはこの2つだったのでメモ・・・
停止問題の決定不能性について

停止問題が計算できない = 停止問題を解くプログラムが作れないということ = 不完全性定理
これを,停止問題の決定不能性という.
***
どんなチューリング・マシンでも「無限ループするか/しないか」が分かる,
というチューリング・マシンA(x)をプログラムできたとする.

xは,判定したいチューリング・マシンのことで,A(x)のテープに,xのプログラムとして入力するという意味.

このとき,
A(x):{xが無限ループしないなら1を出力し,無限ループするなら0を出力する}
とする.

次に,A(x)を組み込んで,わざと無限ループするチューリング・マシンB(x)を設計する.
B(x):{A(x) = 1なら無限ループし,A(x) = 0 なら無限ループしない}

B(x)にB(x)を入力すると
B(B(x)) = {A(B(x)) = 1 なら無限ループし, A(B(x)) = 0 なら無限ループしない}

## では,チューリング・マシンB(B(x))は,無限ループするか,しないか?

* B(x)が無限ループしないなら,A(B(x) = 0.
* しかし, A(B(x)) = 0 ということは, B(x)は無限ループしている.
* B(x)が無限ループするということは,どんなチューリング・マシンxをB(x)に入力しても無限ループするので, B(B(x))も無限ループする.
* 矛盾

## 逆に

* B(B(x))が無限ループするなら,A(B(x)) = 1.
* しかし, A(B(x)) = 1 ということは, B(x)は無限ループしていない.
* B(x)が無限ループしないということは,どんなチューリング・マシンxをB(x)に入力しても無限ループしないので, B(B(x))も無限ループしない.
* 矛盾

## よって, B(B(x))という自己言及的なチューリング・マシンは,計算結果を決定できない.
参考文献
[量子コンピューターが本当にすごい](http://amzn.to/1SKLZi8)
for文 繰り返し文


inの前に変数、inの後に繰り返す範囲を指定するとその範囲の数値が順に変数に代入され、処理が繰り返し実行されます。

```
   for i in 1..100 do
     puts i
   end
   
   #=> 1,,,100  

```

while文 繰り返し文

条件式がtrueの間、処理が繰り返し実行されます。
for文の時のように変数は自動的に増えていかないので、ループのたびに「 i += 1」を行います。

```
i = 1

while i <= 100 do
puts i
i += 1

end

```

無限ループ 条件式が何周してもtrueの為、永遠に終了しないループ

```
i = 1
while i <= 100 do
  put i 
end

```

演習 1から100を足す

```
i = 1
sum = 0

while i <= 100 do
sum += i
i += 1
end

puts sum

#=> 5050

```
Apache Jena ARQ で CSV2RDF その1

# はじめに

[Apache Jena ARQ](http://jena.apache.org/documentation/query/) は SPARQL プロセッサですが、 Turtle や RDF/XML などのファイルだけでなく CSV を読み込む機能がついています。この機能を使って CSV を RDF に変換する方法を紹介します。

# 準備

* Apache Jena ARQ をインストールしておく 

# 手順

１）以下の **mapping.rq** ファイルを作成、 **UTF-8** で保存する

```text:mapping.rq
BASE <https://gist.githubusercontent.com/frogcat/a8fdbf19a55c2f717d30/raw/3cc12c692f3ee8e17a4743b97802ee17747128fc/20150728.csv>
PREFIX	:	 	<#>
PREFIX	xsd:	<http://www.w3.org/2001/XMLSchema#>
PREFIX	schema:	<http://schema.org/>

CONSTRUCT {
	?subject
		a	schema:Place ;
		schema:name	?name_ja ;
		schema:geo	[
			schema:longitude	?lng ;
			schema:latitude		?lat
		] 
}
FROM <>
WHERE {
	?s	:名称 ?name ; :X ?lng ; :Y ?lat ; :施設ID ?id
	BIND (STRLANG(?name,"ja") as ?name_ja)
	BIND (IRI(CONCAT("http://example.org/",STR(?id))) as ?subject)
} 
```

２）つぎのコマンドを実行する

```
$ arq --query mapping.rq > result.ttl
```

３）**result.ttl** に変換結果が保存される

```text:result.ttl
@prefix :      <https://gist.githubusercontent.com/frogcat/a8fdbf19a55c2f717d30/raw/3cc12c692f3ee8e17a4743b97802ee17747128fc/20150728.csv#> .
@prefix schema: <http://schema.org/> .
@prefix xsd:   <http://www.w3.org/2001/XMLSchema#> .

<http://example.org/30204>
        a            schema:Place ;
        schema:geo   [ schema:latitude   "34.6348221388889"^^xsd:double ;
                       schema:longitude  "135.50539225"^^xsd:double
                     ] ;
        schema:name  "松虫中学校"@ja .

<http://example.org/30198>
        a            schema:Place ;
        schema:geo   [ schema:latitude   "34.6322356666667"^^xsd:double ;
                       schema:longitude  "135.512972861111"^^xsd:double
                     ] ;
        schema:name  "阿倍野小学校"@ja .

(以下省略)
```

# 解説

## CSV から RDF へのマッピング

Apache Jena ARQ は独自の [CSV-RDF マッピングルール](http://jena.apache.org/documentation/csv/) を用意しており、入力として指定された URL が CSV っぽいときには CSV を RDF に変換して読み込んでくれます。

## SPARQL CONSTRUCT

SPARQL Endpoint に SELECT を投げる使い方が一般的ですが、既存のデータを適切な RDF に整形する目的であれば SPARQL CONSTRUCT はとても便利です。IBM Developer Works [既存のデータをセマンティック Web で利用する](http://www.ibm.com/developerworks/jp/xml/library/x-semweb.html) などをご覧ください。

# 課題

* CSV-RDF マッピングは ARQ の独自仕様 ※
* ARQ では UTF-8 以外の CSV を読むことができない ＞ 日本で主流の Shift_JIS CSV をどうする？
* CSV の一行目が項目ラベルとして使われる、というルールを守れるかどうか？


※ [W3C : Generating RDF from Tabular Data on the Web](http://www.w3.org/TR/csv2rdf/) として標準化が進められているので、将来的には各種の SPARQL プロセッサに同様の機能が実装されるかもしれません。なお ARQ の CSV-RDF マッピングルールは ARQ の独自仕様ですが、 [minimal mode](http://www.w3.org/TR/csv2rdf/#intro) とだいたい同じなので、この点はあまり心配しなくてもいいかもしれません。

(その2につづくかも)
Swift 1.2でobj-cのクラスメソッドの呼び方

気が向いたのでプロジェクトにSwiftを混ぜてみた。
ら、obj-cのクラスメソッドをうまく呼べなかった。
documentにも何も書いてない。


現象
===

```objc
@interface someClass:NSObject
+ (instancetype)classMethodObject;
@end
```
みたいなのを

```swift
let x = someClass.classMethodObject()
```
とやろうとすると、エラーってくれる。
なにがunavailableだ！　どう見てもあるだろ！


結論
====
面倒くさいので結論だけ書くと、obj-c = swift間のブリッジの実装が非常にクソで、メソッド名を拾って適当にごまかしてやがるようで、`sharedObject`とか`singleton`とか、そういう感じの**それっぽい名前**にしてやるとなんか認識される。
それか、あるいは、クラスメソッドを引数付きにするのでもいいらしい。


```objc
+ (instancetype)singleton{
    return [self classMethodObject];
}
```

とかを付け加えてやると

```swift
let x = someClass.singleton()
```
は何故か通る。



参考
===
[Swift's Objective-C bridging and initializers](http://justinmiller.io/posts/2015/01/28/swift-objc-initializers/)
[How to call an Objective-C singleton from Swift? - Stack Overflow](http://stackoverflow.com/questions/24148464/how-to-call-an-objective-c-singleton-from-swift)
Laravel5で"Hello, world"


# 目的：Homestead環境でLalavelを動かす & デバッグ補助ツールを導入する
VagrantでLaravel5を簡単に試せるHomestead環境を構築する。基本的に手順は[公式ページ](http://laravel.com/docs/5.1/homestead#installation-and-setup)に従う。

# プロジェクトの作成
```
composer create-project laravel/laravel [ディレクトリ名]
```

# 問題：Homestead.yamlの設定が反映されない
Homestead.yamlは、ホストとの共有フォルダの設定や、NginXの設定を記述するファイル。このファイルの設定を書き直した際に、うまく反映できなかったことがあった。
場所: /Homestead/src/stubs/Homestead.yaml

## 無意味だった対策
`$ bash init.sh`や`$ vagrant reload`をしても反映されなかった。

## 解決策
`vagrant provision`を行った。破壊的操作なので注意。
参考：[Laravel Homestead - Laravel - The PHP Framework For Web Artisans](http://laravel.com/docs/5.1/homestead#adding-additional-sites)



# laravel-debugbarの導入
Laravelを使ったデバッグを容易にする[barryvdh/laravel-debugbar](https://github.com/barryvdh/laravel-debugbar)を導入する。
## 手順
プロジェクトのディレクトリ内で以下を実行

```
composer require barryvdh/laravel-debugbar
```

すると`./composer.json`が更新される。


## デバッグバーの追加
場所：config/app.php
Autoloaded Service Providersの`providers`に以下を追加

```
Barryvdh\Debugbar\ServiceProvider::class
```

## laravel-debugbarの独自メソッドを使えるように設定
場所：config/app.php
Class Aliasesの`aliases`に以下を追加することで`Debugbar::`のfacadeをログメッセージに使うことができる

```
'Debugbar' => Barryvdh\Debugbar\Facade::class,
```


# 蛇足：やらかしたこと
途中でVagrant内でのファイルを共有フォルダに設定したら、中に収められているファイルが全て消滅した。（試行錯誤している際に`vagrant destroy`したからかも）

## 教訓
はじめに設定しておくかバックアップをとる
配列オブジェクト・ハッシュオブジェクト


#配列
 「配列名 = [データ1, データ2,]」のように作る。
配列のデータには、先頭から0、1、2、、のように順にインデックス番号が振られている。

```rb
names = ["tom", "mot", "yamada"]
puts names[1]
```
result

```rb
mot
```

##便利メソッド
- sizeメソッド　配列の要素数を取得する

```rb
lessons = ["HTML", "PHP", "JQuery"]
puts lesson.size
```
result

```rb
3
```

- pushメソッド 配列の末尾に要素を追加する

```rb
lessons.push("Ruby")
puts lesson
```
result

```rb
["HTML", "PHP", "JQuery", "Ruby"]

```

#ハッシュオブジェクト

複数のデータをキーと呼ばれる文字列などの値を指定することが出来る、
ハッシュ名 = {"キー1" => "値1", "キー2" => "値2"}

```
user = {"name" => "わんこ"}
```

##ハッシュオブジェクトwordsを作ろう

```rb

word = {"apple" => "りんご", "dog" => "犬"}
   
#キー[apple]をもつ値をputsしてください。
puts word["apple"]
```
result 

```rb
りんご
```

##シンボル

文字列を`""`や`''`で囲む代わりに`:`をつけたものをシンボルという。

```rb

   puts "ruby"

   puts :ruby 
   
   words = ["apple", "dog", "book"]
   
   symbols = [:apple. :dog, :book]
```
PHP7.0.0β3でscandirのバグが修正される

これまで[scandir](http://php.net/manual/ja/function.scandir.php)にはバグがありました。

[Windows環境下で、1ディレクトリに置いてあるファイル数が65535を越えると、scandir()で同じファイルが重複して出てきてしまう](https://bugs.php.net/bug.php?id=36365)というものです。
こんなの気付く方もどうかしてる。

原因は[READDIR構造体](https://github.com/php/php-src/blob/65f79451244c6c94cd86668c188a44650a5cce62/win32/readdir.h)のオフセットを[short型](https://msdn.microsoft.com/ja-jp/library/s3f49ktz(v=vs.120).aspx)で定義していたからという、わりかし残念なものですが、
よく見てみたらこのバグが報告されたのは2006/02/11です。

で、2015/07/23に、超今さらPHP7にこの修正が[マージされました](https://github.com/php/php-src/commit/4e8f01cb6e75e09ad7ffa5201c42d1bea2a61264)。
おそらくβ3でリリースされると思います。

修正方法は単にshort型をint型になおしただけという暴挙。
これじゃあファイル数が4294967295以上で同じバグが発生しちゃうぞ！
まあそのまえにWindowsが死ぬか。

というか何故こんな1行の修正で済むバグが9年間も埋もれてて、そして何故今さらのタイミングで修正されたのか、果てしなく謎だ。
C++でフリープラットフォームな時間計測

c++で処理時間等を計測する際，clock()やtimeGetTime(), GetTickCount()等を用いていたものの，
clock()は精度が10msec程度(処理系依存)なため使い勝手があまり良くなく，GetTickCountは精度は良いもののwinmm.lib(windows系)で用意されている関数のためxcode等で使えない．

## std::chrono

一方std::choronoはプラットフォームに依存せず，使い勝手もよい（精度は1msec程度の模様）．
使い方は

```cpp

#include <iostream>
#include <chrono>

int main(){
 std::chrono::system_clock::time_point  start, end; // 型は auto で可
 start = std::chrono::system_clock::now(); // 計測開始時間
// 処理
 end = std::chrono::system_clock::now();  // 計測終了時間
 double elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(end-start).count(); //処理に要した時間をミリ秒に変換

}
```

となっている．
std::chrono::duration_cast<変換型>(duration)の変換型には，ナノ秒（nanoseconds），マイクロ秒（microseconds），ミリ秒（microseconds），秒（seconds） を指定できる．
RHEL7.1でoverlayfsをためす方法

##RHEL7.1でoverlayfs

`overlayfs`はLinuxカーネル3.18から公式に採用された、Union Filesystemの一種です。（aufsとかの仲間）

そいつをちょっと試してみようと思ったら、少しトラブったので手順を載せておきます。

`overlayfs`の詳しい内容は他のところにお任せします。

* [第18回　Linuxカーネルのコンテナ機能 [7] ─ overlayfs](http://gihyo.jp/admin/serial/01/linux_containers/0018)

##コマンド

```
[root@ ~]# mkdir lower  new  upper  work

[root@ ~]# mount -t overlay -o lowerdir=lower,upperdir=upper,workdir=work overlay new

[root@ ~]# mount -l | grep overlay
overlay on /root/test/new type overlay (rw,relatime,lowerdir=lower,upperdir=upper,workdir=work)
```

OSによって微妙にコマンドが違うようなので、気をつけて下さい。

なお、自分のOSが`overlayfs`に対応しているかどうかは、`cat /proc/filesystems`コマンドを実行して`overlay`がいることを確認してみてください。
KotlinでFragment書くときのテンプレート

ただのメモ。

1) Android Studio > Preferences > File and Code Templates で+ボタンを押して作る。

![kotlin_fragment_template.png](https://qiita-image-store.s3.amazonaws.com/0/15000/d67d64d8-8663-84be-f34f-46955660a27e.png)

2) 下記をコピペ

```kotlin
#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME}

import android.os.Bundle
import android.support.v4.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup

#end
#parse("File Header.java")
public class ${NAME} : Fragment() {
    companion object {
        fun getInstance() : ${NAME} {
            return ${NAME}()
        }
    }
    
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?) : View {
        return inflater.inflate(R.layout.something, container, false)
    }
}
```

3) ContextMenuにTemplateがでて楽だ・・

![shortcut.png](https://qiita-image-store.s3.amazonaws.com/0/15000/3d052ec5-149a-cc35-6e51-6ed9ac757d97.png)
case文

caseの値= whenの値の時、そのブロックが実行される。
whenのどれも一致しない時、elseのブロックが実行される。

randメソッド rubyでランダムな数値を得るメソッド
randメソッドに与えた整数値の0から整数値未満の整数を返す。

```rb
num = rand(2)

case num
when 0
  puts "大吉です"
when 1 
  puts "中吉です"
when 2
  puts "小吉です" 
else 
  puts "エラー"
end
```

How to get a random number in ruby?

```rb
  r = Random.new
  r.rand(42)
  
  case r.rand(42)
  when 32
    puts "Great"
  when 3
    puts "SoSo"
  else
    puts "Not Bad"
  end  
```
  
  result
  
```
  $ Not Bad or something else
```

参考サイト
>http://stackoverflow.com/questions/198460/how-to-get-a-random-number-in-ruby/2773866#2773866
IntelliJでPythonパッケージ管理

PyCharmはよく見つかるけど、IntelliJ + Pythonプラグインの場合がさらっと探した感じ見つからなかったので。

環境
Mac 10.10.4、IntelliJ 14.1.4

Python Pluginがインストールされているとして、
`Tools`→`Manage Python Packages...`

どこかPreferencesにあるのかな…。
ES6 class の動的継承を使った mixin


# 概要

ES6 の class は、構文レベルで mixin をサポートしていないので、mixin を実現するにはプログラム的にclassを操作する必要がある。
やり方は色々あると思うのだが、 **動的に継承元を変えられるクラスを作ることでmixinを実現する** というわりととシンプルな方法を思いついた。

## できること

* 任意のクラス間で共通の`constructor`、メソッド等を共有
* `super` 呼び出し
* 複数mixinの組み合わせ


## できないこと

* `instanceof`


# やりかた

## 基本


```js:
// baseが無いときは何も継承しない
function mixin(base = null) {
  class Mixin extends base {
    method() {
      console.log("Mixin method");
    }
  }
  return Mixin;
}

class Base {
}

class Derived extends mixin(Base) {
}

const derived = new Derived();
derived.method();
// Mixin method
```


## `super` を使う

```js:
function mixin(base = null) {
  class Mixin extends base {
    constructor() {
      super();
      console.log("init Mixin");
    }
    method() {
      super.method();
      console.log("Mixin method");
    }
  }
  return Mixin;
}

class Base {
  constructor() {
    console.log("init Base");
  }
  method() {
    console.log("Base method");
  }
}

class Derived extends mixin(Base) {
  constructor() {
    super();
    console.log("init Derived");
  }
}

const derived = new Derived();
// init Base
// init Mixin
// init Derived

derived.method();
// Base method
// Mixin method
```

## 複数mixin

```js:
function mixin1(base = null) {
  class Mixin1 extends base {
    method1() {
      console.log("method1");
    }
  }
  return Mixin1;
}

function mixin2(base = null) {
  class Mixin2 extends base {
    method2() {
      console.log("method2");
    }
  }
  return Mixin2;
}

class Base {
}

class Derived extends mixin2(mixin1(Base)) {
}

const derived = new Derived();
derived.method1();
derived.method2();
// method1
// method2
```

## ほかのmixinをmixinしたmixin

```js:
function mixin1(base) {
  class Mixin1 extends base {
    method1() {
      console.log("method1");
    }
  }
  return Mixin1;
}

function mixin2(base) {
  class Mixin2 extends mixin1(base) {
    method2() {
      console.log("method2");
    }
  }
  return Mixin2;
}

class Base {
}

class Derived extends mixin2(Base) {
}

const derived = new Derived();
derived.method1();
derived.method2();
// method1
// method2
```
アセットバンドル　LoadAssetのTypeとファイル拡張子対応　メモ


ファイルとTypeの対応がいまいっちょわからんのでメモ

# ●アセットバンドルのロード方法
■Unityエディター上

```
　AssetDatabase.LoadAssetAtPath(アセットのパス *Assets以下のパス, ロードする型)
```

■実機上

```
　AssetBundleCreateRequest assetBundleCreateRequest =
            AssetBundle.CreateFromMemory(バイトデータ);
  
  yield assetBundleCreateRequestでバンドル生成完了を待つ

　AssetBundle assetBundle = assetBundleCreateRequest.assetBundle;
　assetBundle.LoadAsset(AssetList[0],BundleType);
```

# ●ファイルと型の対応表(マークダウンで表にしたいなあ・・)

拡張子　　　　　　　　　LoadAssetの型
*.prefab　　　　　　　　GameObject
*.mat　　　　　　　　　　Material
*.png　　　　　　　　　　Texture2D(3Dもあるからケースバイケース？？)
*.asset　　　　　　　　　Mesh(ケースバイケース？？)
*.shader　　　　　　　　Shader
*.fbx　　　　　　　　　　GameObject
*.controller　　　　　　RuntimeAnimatorController
*.tga　　　　　　　　　　Texture2D
*.tif　　　　　　　　　　Texture2D
*.anim　　　　　　　　　AnimationClip
*.mp3　　　　　　　　　　AudioClip(AudioSourceをシーンに追加しましょう)
*.wav　　　　　　　　　　AudioClip(AudioSourceをシーンに追加しましょう)






下記、コガネブログさんにもあったのでメモ
http://baba-s.hatenablog.com/entry/2015/08/13/100000

【Unity】各拡張子におけるアセットタイプ一覧
 Unity Unity5 Unity5.1
拡張子	アセットタイプ
anim	AnimationClip
wav	AudioClip
mp3	AudioClip
ogg	AudioClip
aif	AudioClip
aiff	AudioClip
xm	AudioClip
mod	AudioClip
it	AudioClip
s3m	AudioClip
hdr	Cubemap
cubemap	Cubemap
ttf	Font
otf	Font
dfont	Font
prefab	GameObject
mat	Material
material	Material
fbx	Mesh
obj	Mesh
max	Mesh
blend	Mesh
mov	MovieTexture
mpg	MovieTexture
mpeg	MovieTexture
mp4	MovieTexture
avi	MovieTexture
asf	MovieTexture
physicmaterial	PhysicMaterial
shader	Shader
txt	TextAsset
html	TextAsset
htm	TextAsset
xml	TextAsset
bytes	TextAsset
json	TextAsset
csv	TextAsset
yaml	TextAsset
fnt	TextAsset
exr	Texture
psd	Texture2D
tif	Texture2D
tiff	Texture2D
jpg	Texture2D
tga	Texture2D
png	Texture2D
gif	Texture2D
bmp	Texture2D
iff	Texture2D
pict	Texture2D
【解答例】Haskell 例外処理 超入門

[Haskell 例外処理 超入門](http://qiita.com/7shi/items/73e534c47bbebc71b37e)の解答例です。

# エラーの理由

【問1】次のコードで脱出の理由（`out of range`, `not xxx: 'X'`）を返すように修正してください。

```hs
import Data.Char
import Control.Monad

getch s n
    | n < length s = Right $ s !! n
    | otherwise    = Left "out of range"

test s = do
    ch0 <- getch s 0
    ch1 <- getch s 1
    ch2 <- getch s 2
    unless (isUpper ch0) $ Left $ "not upper: " ++ show ch0
    unless (isLower ch1) $ Left $ "not lower: " ++ show ch1
    unless (isDigit ch2) $ Left $ "not digit: " ++ show ch2
    return [ch0, ch1, ch2]

main = do
    print $ test "Aa0"
    print $ test "A"
    print $ test "aa0"
    print $ test "AA0"
    print $ test "Aaa"
```
```text:実行結果
Right "Aa0"
Left "out of range"
Left "not upper: 'a'"
Left "not lower: 'A'"
Left "not digit: 'a'"
```

# Fizz Buzz

【問2】次のJavaScriptのコードを移植してください。Eitherモナドを使ってなるべく同じ構造にしてください。

```hs
import Control.Monad
import Data.Either

fizzBuzz x = either id id $ do
    when (x `mod` 3 == 0 && x `mod` 5 == 0) $ Left "FizzBuzz"
    when (x `mod` 3 == 0) $ Left "Fizz"
    when (x `mod` 5 == 0) $ Left "Buzz"
    return $ show x

main = do
    forM_ [1..15] $ \i ->
        putStrLn $ fizzBuzz i
```
```text:実行結果
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
```

# 例外

【問3】次のコードは例外が発生して途中で止まってしまいます。例外が発生したら元の文字列を表示して続行するように修正してください。

```hs
import Control.Monad
import Control.Exception

main =
    forM_ ["1", "a", "3"] $ \s ->
        print (read s :: Int)
        `catch` \(SomeException _) ->
            print s
```
```text:実行結果
1
"a"
3
```

# try

【問4】`try`は例外を`Left`に変換する関数です。次のコードはうまく動きませんが、`try`の動作を確認できるように修正してください。

```hs
import Control.Exception
import Control.Monad

main = do
    forM_ [0..3] $ \i -> do
        a <- try $ evaluate $ 6 `div` i
        print (a :: Either SomeException Int)
```
```text:実行結果
Left divide by zero
Right 6
Right 3
Right 2
```

# モナド変換子

【問5】問1の解答をStateTモナド変換子を使って書き直してください。

```hs
import Data.Char
import Control.Monad.State

getch f s = StateT getch where
    getch (x:xs)
        | f x       = Right (x, xs)
        | otherwise = Left $ "not " ++ s ++ ": " ++ show x
    getch _         = Left "out of range"

test = evalStateT $ do
    ch0 <- getch isUpper "upper"
    ch1 <- getch isLower "lower"
    ch2 <- getch isDigit "digit"
    return [ch0, ch1, ch2]

main = do
    print $ test "Aa0"
    print $ test "A"
    print $ test "aa0"
    print $ test "AA0"
    print $ test "Aaa"
```
```text:実行結果
Right "Aa0"
Left "out of range"
Left "not upper: 'a'"
Left "not lower: 'A'"
Left "not digit: 'a'"
```
Mac への wordpress install 練習

Mac上で手動でwordpressインストールする、
webサーバはphpのサーバ使用する想定。


## 準備

brew install mysql
mysql.server start

## 練習開始

http://tsuchikazu.net/aws_amazon_ec2_rds_wordpress/

$ sudo cp /etc/php.ini /etc/php.ini.org

$ sudo vim /etc/php.ini

```
error_log = /var/log/php_errors.log
mbstring.language = Japanese
mbstring.internal_encoding = UTF-8
mbstring.http_input = auto
mbstring.detect_order = auto
expose_php = Off
date.timezone = Asia/Tokyo
```

http://qiita.com/himitech/items/342235828a4c2513dd4d

mysql -uroot
create user 'ユーザ名'@'localhost' identified by 'パスワード';
create database データベース名;
grant all privileges on データベース名.* to 'ユーザ名'@'localhost';

mysql プロンプト上で
$ status;
UNIX socket:        /tmp/mysql.sock
これを記録し、反映。

php.ini
mysql.default_socket = /tmp/mysql.sock

---

wget http://ja.wordpress.org/latest-ja.tar.gz
tar zxvf latest-ja.tar.gz -C ./wptest/wordpress/

php -S localhost:9393
これで
http://localhost/ でインストール画面が起動した


### テーマの作り方参考

固定ページとブログページ分けたい。

http://wp-principle.net/make-theme/
http://webdesignrecipes.com/wordpress-corporate-website/