OmniAICreator/Qiita-1.07M huggingface dataset:
PowerShellでスタートアップフォルダにアクセスする

Windowsのバージョンごとに異なるスタートアップフォルダの位置。いずれも結構深いところにあってなかなか覚えづらいもの。

## explorer.exeなら簡単
[yuba](http://qiita.com/yuba)さんの[WindowsのあのフォルダはUNIX/Linuxで言えばあそこだ](http://qiita.com/yuba/items/669f718fe6e62dbaab19)によると、エクスプローラーのアドレスバーに`shell:startup`と入力することでスタートアップフォルダに移動できるようです。

![Kobito.FIdnyb.png](https://qiita-image-store.s3.amazonaws.com/0/32983/d97c74c7-2d83-3992-67ca-db6d7313d809.png "Kobito.FIdnyb.png")


これを応用してPowerShell上で`explorer.exe shell:startup`と入力するとスタートアップフォルダに移動した状態のエクスプローラーが立ち上がります。

というかexplorer.exeは外部コマンドなのでcmd.exe上でも同じようにエクスプローラーを立ち上げることができます。

あるいはコマンドレット`Start-Process shell:startup`でもエクスプローラーが立ち上がります。

…が、いずれにしてもエクスプローラーはGUIプログラムなので、その結果を利用しづらい。

## レジストリを読む
エクスプローラーがCUIモードで動かせないか調べてみたんですが見つけられませんでしたので、アプローチを変えてみます。

エクスプローラーの`shell:startup`コマンドはレジストリの内容からディレクトリ情報を得ているようです。レジストリであれば`Get-ItemProperty`コマンドレットで扱えますね。

対象ユーザーによってレジストリが異なります。

| 対象ユーザー | レジストリエントリ | キー |
| --- | --- | --- |
| 個別ユーザー | HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders | Startup |
| 個別ユーザー（バックアップ） | HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders | Startup |
| 全ユーザー | HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders | Common Startup |
| 全ユーザー（バックアップ） | HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders | Common Startup |

※それぞれバックアップはバックアップでないレジストリキーに値がない場合にバックアップとして参照されるエントリ

## レジストリエントリには情報がいっぱい
今回はスタートアップフォルダだけわかればいいんですが、上記レジストリエントリには他にもいろいろな情報が詰まっています。（他のスタートメニュー関連やドキュメントフォルダ、デスクトップ等）

なので、`$profile`で次のようにレジストリエントリのプロパティをコピーしておき、適宜キー名を指定してアクセスするとフォルダ名を参照することができます。

```$profile
$UserProperty = $(Get-ItemProperty 'HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders')
$SystemProperty = $(Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders')
```

そのうえで例えばスタートアップフォルダを得たいのであれば、次のようにしましょう。

```PowerShell
(*'-') >> $UserProperty.Startup
C:\Users\Home\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
(*'-') >> $SystemProperty.'Common Startup'
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup
```

これで解決！
Javascriptだけで言葉を認識させてみた

※ JavaScript for Robotics or Hardware Advent Calendar 2015 12/3用　
http://qiita.com/advent-calendar/2015/jsrobotics

ロボットなどでコミュニケーションを取る場合には、人間との会話が必要になることが多いです。
前回は言葉を発する部分を説明しましたが、今回は声を認識させてみます。
→ [JavaScriptだけで言葉をしゃべらせてみた](http://qiita.com/wks/items/a5dfae0909956a3002bd)
通常ですと、声の認識は難しく専用のライブラリや、専用のシステムに認識をかけるためにいろいろ組み込む必要があります。
ですが、実はこの合成音声のためのものがW3Cで仕様が策定されています。
[Web Speech API Specification](https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html)
ということは・・・ブラウザで実装されています。
なので、もちろんJavaScriptのみで利用可能です！
現段階ではブラウザのChromeなどが対応しています。
http://caniuse.com/#search=speech-recognition

ということは・・Androidだとほぼ対応してるという事です。

使い方は簡単！以下のコードだけでOK

```javascript:speech.js
window.SpeechRecognition = window.SpeechRecognition || webkitSpeechRecognition;
var recognition = new webkitSpeechRecognition();
recognition.lang = 'ja';
recognition.addEventListener('result', function(event){
    var text = event.results.item(0).item(0).transcript;
    alert(text);
}, false);
recognition.start();
```
※実行すると右上などにマイクへのアクセス許可が出ますので許可してください。

実際に動作してるのはこちら。
http://jsdo.it/wakasamasao/webspeachapi2

このように簡単にブラウザを経由することで音声認識をすることができます。
ですが、単に文章で帰ってきてしまうため、言葉のゆれや応答をどう返すか？が次の段階で必要になります。
私はブラウザで動くリアルロボットを作った時には単語で命令するようなものを作りました。
もっとちゃんとやると人工知能などの分野になり、昨今の機械学習などのものとの組み合わせになってきます。実際AzureやWatsonなどが話題になっていますが、このあたりを利用してJSONで返すなどの実装が必要かとは思います。
このあたりはネットワークに強いブラウザならではですね。

Web MIDI APIを使えばブラウザ単体でArduino等のハードウェアも連携できますので、反応を動作で表す事もできます。

そう、ブラウザなら。
CS-Cartでデバッグモードを有効にする

config.local.phpにデバッグモードを有効にする定数を定義する方法がある。

```php:config.local.php
define('DEBUG_MODE', true);
```

また、URLに、`?debug`パラメータをつけても、デバッグモードになる。

また、`var_dump`的なものとして、`fn_print_r`がデバッグに使うことができる。
Zaif取引所(Bitcoin/Monacoin)のAPIをGolangから使う

この記事は、2015年のGo Advent Calendarの3日目の記事です。

# はじめに
- zaifが提供しているAPIを使用しています(一部APIには[API-Key](https://corp.zaif.jp/api-docs/trade-api/)が必要となります)
- ソースはgithub上([コチラ](https://github.com/yanakend/zaif-api))でも公開しています
- 特に悪いことはしていないので安心してご使用ください

# 事前準備
実際に取引をしたい場合はZaifアカウントを作成後、[API-Key](https://corp.zaif.jp/api-docs/trade-api/)を作成しましょう

```bash
# zaif-api本体のインストール
go get github.com/yanakend/zaif
# 依存パッケージのインストール
go get github.com/google/go-querystring/query
```

# 使用例
```go
package main

import (
	"github.com/yanakend/zaif"
	"log"
)

func main() {

    // PublicAPIはAPI-Key不要
    price := zaif.PublicAPI.LastPrice("btc_jpy")
    log.Println(price)

    // PrivateAPI(取引API)を使用する場合API-Keyが必要
    zaifPrivateAPI := zaif.NewPrivateAPI(
        "Key",
        "Secret-Key",
    )
    history := zaifPrivateAPI.DepositHistory(zaif_api.BodyDepositHistory{Currency: "jpy", Order: "ASC"})
    log.Println(history)
}

```
※その他ドキュメントはgo docで確認できます(便利！)

# TODO
- websocket-API作成中
- private-APIのテスト(Mock)
- Bot作って一儲けする

# 免責事項
- いかなる損害やトラブルの責任は一切負いかねますので予めご了承ください

# まとめ
- この程度ならエラーハンドリングにtry-catchなくて不便とか思えず、むしろ無いほうが読みやすい
- go言語仕様自体はシンプルだが提供しているツール群はかなり強力(run, test, doc, fmt, get, install)
- API作ったしBotも作りたいけど投資ノウハウないので困ってる。誰か教えてください
- 今月-2万くらい負けてるので誰かBitcoin/Monacoinください(切実)
Go言語で緯度経度差から2地点間の距離を計算する

## ヒュベニの公式

必要に迫られたため簡便な公式で実装。

機会があればより高精度な計算式でも実装してみたい
http://vldb.gsi.go.jp/sokuchi/surveycalc/surveycalc/algorithm/bl2st/bl2st.htm

```go
/*
   参考にしたサイト：
   http://www.kashmir3d.com/kash/manual/std_siki.htm
   http://yamadarake.jp/trdi/report000001.html
*/

package main

import (
	"fmt"
	"math"
	"strconv"
)

const (
	EQUATORIAL_RADIUS    = 6378137.0            // 赤道半径 GRS80
	POLAR_RADIUS         = 6356752.314          // 極半径 GRS80
	ECCENTRICITY         = 0.081819191042815790 // 第一離心率 GRS80
)

type Coodinate struct {
	Latitude  float64
	Longitude float64
}

func main() {
	a := Coodinate{35.65500, 139.74472} // 東京
	b := Coodinate{36.10056, 140.09111} // 筑波

	hd := hubenyDistance(a, b)
	distance := strconv.FormatFloat(math.Floor(hd), 'f', 0, 64)

	fmt.Printf("距離: " + distance + " m\n")
}

func hubenyDistance(src Coodinate, dst Coodinate) float64 {
	dx := degree2radian(dst.Longitude - src.Longitude)
	dy := degree2radian(dst.Latitude - src.Latitude)
	my := degree2radian((src.Latitude + dst.Latitude) / 2)

	W := math.Sqrt(1 - (Power2(ECCENTRICITY) * Power2(math.Sin(my)))) // 卯酉線曲率半径の分母
	m_numer := EQUATORIAL_RADIUS * (1 - Power2(ECCENTRICITY))         // 子午線曲率半径の分子

	M := m_numer / math.Pow(W, 3) // 子午線曲率半径
	N := EQUATORIAL_RADIUS / W    // 卯酉線曲率半径

	d := math.Sqrt(Power2(dy*M) + Power2(dx*N*math.Cos(my)))

	return d
}

func degree2radian(x float64) float64 {
	return x * math.Pi / 180
}

func Power2(x float64) float64 {
	return math.Pow(x, 2)
}
```
Groonga族のHomebrewの変遷を振り返る

# Groonga族とHomebrew

[Groonga Advent Calendar 2015](http://qiita.com/advent-calendar/2015/groonga)の4日目の記事です。

## はじめに

Groonga族はOS Xでも動かすことが出来るものもあり、Homebrewでもインストールすることができるものもあります。
特に、GroongaはHomebrew本体に取り込まれているため、以下のコマンドでインストールすることが出来ます。

```bash
$ brew install groonga
```

また、MroongaはFormulaが複雑なため、[homebrew-mroonga | GitHub](https://github.com/mroonga/homebrew-mroonga)をTapすることでインストールすることができます。

今年はGroonga族に新たに[PGroonga | pgroonga GitHub pages](http://pgroonga.github.io) が増えました。こちらも現在ではHomebrew本体に取り込まれているため、

```bash
$ brew install pgroonga
```

でインストールすることができます。

## Homebrewの今年の大きな変更点

* サンドボックスの機能が導入された
* testブロックの強制
* audit機能の強化

が導入されました。さて、PGroongaを導入するにあたり、サンドボックスの機能がかなりの障害となりました。 

### 最初の壁

まず、サンドボックスの機能を知らなかった頃のPull Requestについたコメントを見てみましょう。
https://github.com/Homebrew/homebrew/pull/41174#issuecomment-119891498

おや？何か不穏ですね。

新しく追加しようとした diffの中で https://github.com/Homebrew/homebrew/pull/41174/files#diff-c5d7671658e19815af8d05dabe4d7515R20 としてしまっており、これだとなんとPGroongaではなくPostgreSQLのCellarにインストールしようとしてしまいます！
これではサンドボックスの保護下にある他のFormulaのCellarにインストールしようとしてしまうため、取り込んでくれそうにありません。

### Mega Formula化？

では、先のPull Requestでのhttps://github.com/Homebrew/homebrew/pull/41174#discussion_r34240474 にある `optional resources` とは一体何を意味していたのでしょうか。

その回答は、こちら https://github.com/Homebrew/homebrew/pull/44739 でした。これはPostgreSQLのFormulaへresourceを追加して、`--with-pgroonga` オプションを追加したものです。これで、サンドボックス問題は解決できた、ヨカッタヨカッタ。。。…と胸を撫で下ろしていると、次の問題が起こります。

### --with-pgroongaがbrew upgradeでハンドルされない

ある日のこと、 `brew upgrade postgresql` を行った際に、なんとPGroongaがPostgreSQLから消え去ってしまいました。これはイカン。。

そうこうしているうちに、次のIssueが立ちました。[Possible way to handle sandbox issues for Postgres's plugins | Homebrew Issue in GitHub](https://github.com/Homebrew/homebrew/issues/45607)

このIssueでは、PostgreSQLのプラグインがサンドボックス環境下で壊れていることを問題にしています。

そうして、このIssueを解決するようにしたPull Requestが[こちら](https://github.com/Homebrew/homebrew/pull/45611)。

このPull Requestのキモとなる箇所は[この部分](https://github.com/Homebrew/homebrew/pull/45611/files#diff-c5d7671658e19815af8d05dabe4d7515R16)で、stageへ一旦インストールしてから、必要なファイルだけインストールする動作となっています。同時に、PostgreSQLのCellarでハードリンクをし、PostgreSQLから正常にプラグインが見えるようにしています。

そうして、PostgreSQLのFormulaの`--with-pgroonga` オプションは無事pgroonga.rbとして分離されたのでした。

### testブロックの強制

こちらはGroonga 5.0.5への更新のプルリクエスト: https://github.com/Homebrew/homebrew/pull/41185/files で指摘されてしまいました。後日このテストは宜しくないと思ったので https://github.com/Homebrew/homebrew/pull/46451/files#diff-ae999bc11356b00a9a7b143428fe540dR67 にてより実際に近いテストケースにしておきました。

### audit機能の強化

これはHomebrewのCIでこれまでは`brew audit formula-name` となっていたものが、 `brew audit --strict --online formula-name` に変わりました。これにより、より整ったFormulaで無いと取り込まれなくなりました。また、homepageがHomebrewのCI環境からアクセス可能でないと本家に取り込んでくれなくなりました。

## おまけ

実はサンドボックスの機能の影響を `groonga-normalizer-mysql` のFormulaも受けることになってしまいました。こちらも既に[このプルリクエスト](https://github.com/Homebrew/homebrew/pull/45889)により修正済みです。

## おわりに

この記事はGroonga周り、特にPGroongaのFormulaのインストール方法が `brew install postgresql --with-pgroonga` から `brew install pgroonga` に変わった経緯を文章化していないなぁと思い、それを解説するために~~半ば勢いで~~書き上げられました。

新たなGroonga族が加わったことでより使い道が広がったGroonga族で良い全文検索を！

Let's full-text search with Groonga family!
Objective-CのLightweight Genericsに使われる__kindofとは何か


最近のObjecitive-CにもSwiftに併せて細かな変更や機能追加がされており、NSArrayやNSDictionaryなどコンテナが保持する型を指定する`Lightweight Generics`が追加されたことも記憶に新しいですが、その他にも`__kindof`を型に指定するアノテーションが追加されていました。

2016年、Objective-Cのコードをまだまだ保守していく皆さんのために、今回はこの__kindofについて軽くまとめておきます。

# はじめに結論

まず結論から書いておきます。今北産業です。

```objc
NSArray *array1;                   // 何が入ってるかわからん
NSArray<_kindof UIView *> *array2; // UIViewとそのサブクラス入ってる
NSArray<UIView *> *array3;         // UIViewしか入ってないもんね
```

- add/setは何でもできるが「取り出すときにどうすべきか」で警告される。
- `__kindof`を使わずに`<UIView *>`の場合はサブクラスでさえ入ってないという解釈のコードである
- 戻り値にも`__kindof`が指定できるので、UITableViewCellやUIViewControllerなど継承して利用することが頻繁に行われるクラスには指定してインターフェースをより細かく作りこむことが出来る

# Lightweight Genericsに__kindofを使うとどうなる?

そもそも`__kindof`がないと何が問題なのかを明確にするため、まず`__kindof`を使わずにArrayを作る

```
NSMutableArray<UIView *> *array = @[].mutableCopy;
```

それに対して要素を次のように2つ追加する。UIViewとUIImageView

```
[array addObject:[[UIView alloc] init]];
[array addObject:[[UIImageView alloc] init]];
```

これらをそれぞれ次のように取り出す

```
UIView *first = array[0];       // もちろんこれは何も問題ない
UIImageView *second = array[1]; // 警告される
```

ここでarray[1]をUIImageViewに代入しようとすると警告される。

以上をわざわざスクリーンキャプチャで見せると次のような感じ


![スクリーンショット 2015-11-22 10.19.24.png](https://qiita-image-store.s3.amazonaws.com/0/16400/0824193b-eeef-40d3-999c-b7564536c9e9.png "スクリーンショット 2015-11-22 10.19.24.png")


`Lightweight Generics`を使ってコンテナに何が入っているかを明確にしたいが、実際はサブクラスが含まれている場合に警告されるようになっている。当然、キャストすれば警告はなくなるが、__kindofはサブクラスが入っていることを許可するために使われる。

```
NSMutableArray<__kindof UIView *> *array = @[].mutableCopy;
[array addObject:[[UIView alloc] init]];
[array addObject:[[UIImageView alloc] init]];
UIView *first = array[0];       // もちろんこれは何も問題ない
UIImageView *second = array[1]; // 警告されなくなる!!
```

**しかし、まだ、__kindofの魅力はこんなもんじゃない**

# 戻り値に__kindofを使うとどうなる?

もちろんメソッドの戻り値に__kindofを使うことも出来る。具体的にはUITableViewで頻繁に使う次のメソッドの戻り値にはすでに `__kindof` が使われている（Xcode7.1.1で確認）。

```objc
- (__kindof UITableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifier
                                                   forIndexPath:(NSIndexPath *)indexPath;
```

**（そう、つまりみなさんはすでに__kindofを使っていたのだ！！ΩΩΩ<な、なんだってー）**

このインターフェースを見ると、再利用キューに保持されていた様々なUITableViewCellの派生クラスを取り出せるということが分かるし、実際にキャストする必要性がないということも分かりやすい（idを戻り値とするよりずっと分かりやすい）。

# 参考URL

https://developer.apple.com/videos/play/wwdc2015-401/
http://stackoverflow.com/questions/31399208/ios-kindof-nsarray
Ryuを動かそう！ 第ニ回 mininetのコマンドについて

# はじめに
今回はmininetのコマンドについて[前回](http://qiita.com/kojisato118/items/bc61f3bcd93211df300a)出てきた分に関して説明します。

# mininetコマンド
`$sudo mn --topo single,3 --mac --switch ovsk --controller remote -x`
## 1. --topo
仮想ネットワークのトポロジーを変更します。
今回は、switch一つに対して、3つのhostがついている仮想ネットワークを示しています。
`--topo linear,3`とするとswitchが3つあり、それぞれに一つずつhostがついているネットワークとなります。
[参考](http://mininet.org/walkthrough/#changing-topology-size-and-type)

## 2. --mac
デフォルトだと、各hostのMacアドレスがランダムに割り当てられてしまいデバッグが大変です。
このオプションをつけることで、各hostのIPアドレスとMacアドレスを使いやすいユニークな値に設定して下れます。
[参考](http://mininet.org/walkthrough/#id--mac)

## 3. --switch
仮想Switchの種類を指定します。今回はOpen vSwitchを指定しています。
[参考](http://mininet.org/walkthrough/#other-switch-types)

## 4. --controller
※注意) たぶん
おそらく、switchのコントロールプレーンを切り離す(remote)かの指定だと思われます。
∵`$sudo mn --topo single,3 --mac --switch ovsk -x`とした時に、SimpleSwitchが起動しない && 何もしなくてもhost同士がpingで繋がるため
[参考](http://mininet.org/walkthrough/#using-a-remote-controller)

## 5.  -x
switch, host, controllerのxtermが自動で表示されます。
[参考](http://mininet.org/walkthrough/#xterm-display)
Windows 7環境でのVirtualBox（vagrant）の共有フォルダーのトラブル2つ

問題：Windows 7環境のVirtualBoxにて共有フォルダーに設定しているディレクトリ下にて

- シンボリックリンクが作れない。
- read-onlyファイルが削除できない。


#環境
Windows 7 Professional
VirtualBox 5.0.10
Vagrant 1.7.4


#ひとつめの問題
Windows 7環境のVirtualBoxにて共有フォルダーに設定しているディレクトリ下にて
シンボリックリンクが作れない。

##VirtualBoxでの解決方法

###１、コマンドプロンプトで、以下のコマンドを実行。

```:コマンドプロンプト
> VBoxManage.exe setextradata 仮想マシン名 VBoxInternal2/SharedFoldersEnableSymlinksCreate/共有フォルダ名 1
```

※共有フォルダ名はVirtualBox マネージャーの、仮想マシン＞設定＞共有フォルダー のところで確認可能です。

###２、管理者権限でコマンドプロンプトを立ち上げ、以下のコマンドを実行。

```:コマンドプロンプト
> cd C:\Windows\system32

> fsutil behavior set SymlinkEvaluation L2L:1 R2R:1 L2R:1 R2L:1
```

###３、VirtualBox マネージャーを**管理者権限で立ち上げて**仮想マシン起動
※管理者権限で立ち上げないと、２のコマンドが無意味となります。

##vagrantの場合

###１、Vagrantfileを編集
VirtualBoxでの１のコマンドは、Vagrantfileに以下のように書いておくと上手いようにやってくれます。

```:Vagrantfile
config.vm.provider "virtualbox" do |vb|
    vb.customize ["setextradata", :id, "VBoxInternal2/SharedFoldersEnableSymlinksCreate/共有フォルダ名", "1"]
end
```

###２、管理者権限でコマンドプロンプトを立ち上げ、以下のコマンドを実行。

```:コマンドプロンプト
> cd C:\Windows\system32

> fsutil behavior set SymlinkEvaluation L2L:1 R2R:1 L2R:1 R2L:1
```

###３、仮想マシン起動（vagrant up）
仮想マシン起動は、**管理者権限で立ち上げたコマンドプロンプト**から `vagrant up`
※管理者権限で仮想マシンを起動しなくてはいけないところがハマりどころです。


#もうひとつの問題
Windows 7環境のVirtualBoxにて共有フォルダーに設定しているディレクトリ下にて
read-onlyファイルが削除できない。

こちらはWindows側からも、仮想サーバー側からも削除できません。
ファイルに書き込み権限を付ければ削除できるようになります。

海外のサイトもたくさん見てまわり、この問題が報告されているのを目にしましたが解決方法が見つからず。
こうなると、普段は共有フォルダを使わないようにしたほうが楽かな。
Rails + React + Browserify の環境構築

Rails で Sprockets を使いつつ Browserify で React を使えるような環境を構築したメモです。

## 前準備

- Browserify を使用するために `nodejs`, `npm` をインストールしておく必要があります。

### Gem

- `react-rails`, `browserify-rails` をインストールします。

```rb:Gemfile
gem 'react-rails'
gem 'browserify-rails'
```

### .gitignore

- node_modules を gitignore に追加します。


```gitignore:.gitignore
node_modules/
```


### Npmパッケージのインストール

```bash
$ npm init
$ npm install --save-dev browserify browserify-incremental react react-dom reactify
```

### Configの設定

- application.rb で browserify のコマンドラインオプションに reactify を設定。

```rb:application.rb
config.browserify_rails.commandline_options = "--transform reactify"
```

## 環境設定

`react-rails` のジェネレータでReactの環境を構築する。

```bash
$ rails g react:install
```

```bash
      create  app/assets/javascripts/components
      create  app/assets/javascripts/components/.gitkeep
      insert  app/assets/javascripts/application.js
      insert  app/assets/javascripts/application.js
      insert  app/assets/javascripts/application.js
      create  app/assets/javascripts/components.js
```

application.js, components.js の内容を以下のように修正する。

- application.js から `components` を読み込み、`react`, `react_ujs` を削除する。

```js:application.js
//= require jquery
//= require jquery_ujs
//= require turbolinks
//= require components
//= require_tree .
```

- components.js で `require_self` の後に `react_ujs` を読み込む。
- React 本体は browserify で require する。

```js:components.js
//= require_self
//= require react_ujs

window.React = require('react');
window.ReactDOM = require('react-dom');
```

## コンポーネントを追加する

`app/assets/javascripts/components` に JSX ファイルを作成する。


```app/assets/javascripts/components/widgets.jsx
var React = require('react');

var Widgets = React.createClass({

  render: function() {
    return <div>Hello React</div>;
  }
});

module.exports = Widgets;
```

- `components.js` で追加した JSX を読み込む。

```js:app/assets/javascripts/components.js
window.Widgets = require('./components/Widgets.jsx');
```

### View にコンポーネントを設置

```erb
<%= react_component 'Widgets' %>
```

## Herokuにデプロイ

ビルドパックで nodejs の後に ruby をビルドするように設定するだけ。

```bash
$ heroku buildpacks:add https://github.com/heroku/heroku-buildpack-nodejs.git
$ heroku buildpacks:add https://github.com/heroku/heroku-buildpack-ruby.git
```
任意桁の整数クラス

32bitのintはunsignedで約42億までの数値を扱えるので、桁数に困ることは少ないのですが、それでも収まらない場合があります。
そういう場合でもlong longを使うことで、64bit整数になりより大きな数が扱えます。

しかし、もっと大きな数を扱う場合はどうでしょうか。
そういう用途として、[boost::multiprecision::cpp_int](http://boostjp.github.io/tips/multiprec-int.html) があります。

ただ、boostが使えないWebコンパイラを使わせる某サイトとかで困ります。
Y城先生とかの問題とか大体過去問見ても64bitすら収まらない解答を要求するし…困った困った…。

ということで、さくっと使える任意桁整数クラスを作りました。
自然数の足し算だけ出来ます。
まぁ、boost使える環境だとこんなものを使う必要はありません。

```cpp:infinity.cpp
#include <iostream>
#include <vector>

class InfinityNumber{
	enum{SEPARATE = 1000000000, DEGIT = 9};
	std::vector<int> num;
	
	friend InfinityNumber operator+(const InfinityNumber &l, const InfinityNumber &r){
		InfinityNumber result;
		int overflow = 0;
		for(size_t i = 0;; i++){
			if (l.num.size() <= i && r.num.size() <= i) break;
			int lnum = i < l.num.size() ? l.num[i] : 0;
			int rnum = i < r.num.size() ? r.num[i] : 0;
			int add = lnum + rnum + overflow;
			result.num.push_back(add % SEPARATE);
			overflow = add / SEPARATE;
		}
		if (overflow) result.num.push_back(overflow);
		return result;
	}
	friend InfinityNumber operator+=(InfinityNumber &l, const InfinityNumber &r){
        return l = l + r;
    }

    static int getdigit(int n){
        return (n < 10) ? 1 : getdigit(n / 10) + 1;
    }

    friend std::ostream& operator<<(std::ostream& o, const InfinityNumber&i){
		if (i.num.empty()){
			o << 0;
		}else{
			for (std::vector<int>::const_reverse_iterator it = i.num.rbegin(); it != i.num.rend(); ++it){
				if (it != i.num.rbegin()){
					int len = InfinityNumber::getdigit(*it);
					for (int i = len; i < DEGIT; i++){ o << '0';}
				}
				o << *it;
			}
		}
		return o;
	}
public:
	InfinityNumber(int n){
		num.push_back(n % SEPARATE);
		int overflow = n / SEPARATE;
		if (overflow) num.push_back(overflow);
	}
	InfinityNumber(){}
};

```
[Jekyll+Prose.io+Github Pages]でhttp://USERNAME.github.ioへアクセスできるブログを作る。端的に。


この先の内容はこちらの抜粋のようなものですのでこちらの方が良いと思います。
[Jekyll+Github PagesなブログをWebで管理できるProse.ioが便利… - atskimura-memo](http://atskimura.hatenablog.com/entry/2014/02/11/170600)
以下、自分向けのメモという形で。

## リポジトリ作成
GithubでUSERNAME.github.ioという名前でリポジトリを作成します。

## ローカルに環境を作ってGithubへあげる
jekyll-bootstrapを利用します。

```
git clone https://github.com/plusjade/jekyll-bootstrap.git USERNAME.github.io
cd USERNAME.github.io/
git remote set-url origin git@github.com:USERNAME/USERNAME.github.io.git
git push origin master
```

## Prose.ioで編集
Prose.ioはブラウザからGithub上のファイルを編集するもの。
[http://prose.io](http://prose.io)にログインする。
Github認証をしてUSERNAME.github.ioリポジトリの```_config.yml```の末尾に下記を追加。

```
prose:
#  rooturl: '_posts' # コメントを外すとこのディレクトリ以外はProse.ioで編集できなくなるらしい。
  siteurl: 'http://USERNAME.github.io/'
  media: 'media'
  metadata:
    _posts:
      - name: "layout"
        field:
          element: "hidden"
          value: "blog"
      - name: "title"
        field:
          element: "text"
          value: ""
```

[http://USERNAME.github.io](http://USERNAME.github.io)へアクセスすれば見れるようになっています。

## 投稿する
Prose.ioで```_posts```ディレクトリへ移動しNEW FILE。

内容書いてSave、Commitメッセージ記入。画面に従えばOK。
再読み込みするかもう一度このファイルを閲覧するとUnpublishedと出ているのでここを変更すると公開状態に。


あとは見た目を変えたりページ構成を変えたりして自分オリジナルページに。
さぁて何に使おう。

-----
作ってから時間を空けてこのメモ書いたので記憶違いがあるかも。すぐ書かないと忘れますね。
[3D] 回転行列の意味


回転行列はこんな感じの行列です。
3Dをやっている人ならよく見るやつですね。

```math
\begin{equation}
\begin{vmatrix}
X' \\
Y' \\
Z' \\
W'
\end{vmatrix}
=
\begin{vmatrix}
\cos\theta z &-\sin\theta z &0 &0 \\
\sin\theta z &\cos\theta z &0 &0 \\
0 &0 &1 &0 \\
0 &0 &0 &1
\end{vmatrix}
\times
\begin{vmatrix}
X \\
Y \\
Z \\
1
\end{vmatrix}
\end{equation}
```

さて、なぜこういう行列になるのでしょうか。
その答えがこの図です↓
![回転行列の意味](https://qiita-image-store.s3.amazonaws.com/0/5616/8fbacfe8-69f2-0888-50e3-bd882da816be.png "回転行列の意味")
この図は[実例で学ぶゲーム3D数学](http://www.amazon.co.jp/gp/product/4873113776/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=4873113776&linkCode=as2&tag=edom18-22)の中で紹介されているものから引用させていただきました。

$p$ と $q$ の値がどう変化しているか注目してください。
回転行列で出てくる値がありますね。

$p$ がX軸の点を表していて、$q$ がY軸の点を表しています。
X軸の点 $[1, 0]$ を $θ$ だけ回転するとその座標は $[cos θ, sin θ]$ となるのは分かると思います。

そして問題はY軸。
Y軸の場合はちょっと発想を転換して、Y軸をX軸とおいて考えるとわかります。
つまり、Y軸「から」$θ$ だけ回転した位置の座標を求めればいいわけです。

ただ、考え方を転換しただけで座標空間は変わらないので、結果として $[0, 1]$ の点を移動する場合、X軸マイナス方向に移動することになるため、最終的に $[-sin θ, cos θ]$ 移動すれば目的の座標が求まる、というわけです。

結局のところ、X, Yともにこれらの値を掛けてあげれば望みの回転が得られる、というわけです。

シェーダを書いていると、この回転行列に似た処理をしたい場合があったりします。
そのときにはこれを思い出して、適切にコードを書いてやればわざわざ行列を作らなくても望みの回転を得ることができます。

（というか、まさにそれがあって備忘録として書いたのは内緒ですｗ）
Flashの思い出、書き殴り


-学生時代

![fmx.jpg](https://qiita-image-store.s3.amazonaws.com/0/103928/a1f451e1-df39-9f6d-2137-e7397f67f032.jpeg)



Flash MXを学校で触る。
回転寿司のイラストを押すと
自身がrotationして画面外へ飛んで行く、という謎のアニメーションを作る。

![f8.png](https://qiita-image-store.s3.amazonaws.com/0/103928/50c50112-a4a3-1806-8691-06a9822971c3.png)



とあるオフィスビルのフロア案内マップをチームで作成。
タッチパネル式のでかい液晶に映しだされ、実際に動かしている光景に感動しFlashにハマる。



とある学生コンテストのFlash広告部門で優勝し、賞金をもらう。

Flash8で5分間くらいのFlashアニメーションを作る。
タイポグラフィー、花が咲くアニメーション、壁画っぽい表現、撮った映像を使った表現、延々と増えて回り続ける文字・・・
Flash8で出来ることをふんだんに盛り込んだ（つもり）。
3D表現が難しく、AfterEffectsに浮気しそうになる。(→挫折)


-社会人

![fcs3.jpg](https://qiita-image-store.s3.amazonaws.com/0/103928/e885e806-c816-9d36-06da-4ecb8f061f9c.jpeg)



CS3：デザイナ志望だったがほぼFlasherとして制作会社に入社。
某珈琲店のキービジュアルと特集ページを作成。
特集ページの要望に四苦八苦し、
ASの師匠を付けてもらい毎晩演習をする。（楽しかった）
フラッシャーって言わないほうがいいのよと言われ意味を確認し、
以後Flashデベロッパーと名乗るようになる。ﾄﾞﾔ

フルフラッシュのコンテンツを作成。
3Dっぽい表現まで頭が追いつかなかったので
師匠にライブラリを作ってもらい、なんとか完成。
Flashサイトは依頼ごとに要望が見事にばらばらだったので
過去の財産はあまり活かせず、
毎回もうFlashやりたくない..と思っていた。


CS4のあたりでFlashコンテンツが少なくなる。
案件としては代理店のバナー作成をひたすらやるようになる。
たまに、オリジナルのスクリーンセーバーや、
プレゼン用の動画依頼が来る。モーションを自由に作成。

----

![fcs6.jpg](https://qiita-image-store.s3.amazonaws.com/0/103928/39a2f59d-ceb0-e783-7f7a-b41e1b4163ed.jpeg)



....制作会社を退職して数年。今は全く触らず。。


たまたまこのカレンダーを見つけたので、思いつきで投稿してみました。（初投稿）
思い起こせばFlashを起点に色々やってきたなあと。。。

ありがとう、楽しかったよFlash。

Animateになってもお元気で・・・
エンジニア向け情報収集手段的な何か

社内で何で情報収集してるの？って聞かれたのでかるーくまとめてみる

## [Feedly](https://feedly.com)
GoogleReaderが死んでからずっと使っている。
お気に入りのブログとかも昔から登録したやつを入れている。
過去にジャンルでニュースとかITとかで分けてたけど、★の数で分けることでいい感じに管理できた。

  - ★
  - ★★
  - ★★★

みたいな感じ。
★が多ければ多いほど気にしてタイトルに目を通すようにしている。

はてブのホットエントリーもここで見ている。
    
PCではショートカットで`Shift + a`で全部既読にするとか`j`で次の記事に移動とかいろいろついてるのでPCで操作するほうが便利だが、iPhoneでも記事を読むことがある。

iPhoneアプリでは`Reader`ってのを使っている。移動中は基本はスター(Save?)されている記事を読む事が多い。


## [HBFav2- Hatena-Bookmark Reader for iOS](http://hbfav.bloghackers.net/)
[@naoya_itoさん](https://twitter.com/naoya_ito)が作ったiPhoneアプリ。

```
(上記リンクより引用)
HBFavは、はてなブックマークをタイムライン形式で読むための iOS アプリです。

はてなブックマーク上で気に入ったユーザーを「お気に入り」に追加しておいて、HBFav を使ってみてください。お気に入りユーザーが集めた新着ブックマークがTwitterストリームのように流れてくるでしょう。
```

リリース初期からずっと使っている。
Facebookとかと違って広告系の記事が流れてくることが少ないし、単純にその人がブックマークした記事だけ見れるので気に入っている。

<blockquote class="twitter-tweet" lang="ja"><p lang="ja" dir="ltr">HBFav のレビューに「Twitter だとドラクエ廃人がどうこうとかいう投稿がいっぱいあるけど HBFav ならそういう無駄を省いてブックマークだけを見られるのでお勧めです」という★5のレビューをいただきました。本当に、ありがとうございます</p>&mdash; Naoya Ito (@naoya_ito) <a href="https://twitter.com/naoya_ito/status/408131442212732928">2013, 12月 4</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

ってレビューをオレが書いてネタにされた…

唯一めんどくさいのが、はてブのお気に入りするユーザーを探すところ。
最初は全然いないが、フォローした人から芋づる式に適当に増やしていった。
この人興味ないなーと思ったら外せばいいし、自分だけのリストを管理できるのでストレスなく使っています。

## [Qiita](http://qiita.com/)
もちろんこのサイトも使ってます。
気になっているタグは片っ端から登録しているので、不定期に眺めています。

[メールアドレスだけ登録すれば誰でもQiitaニュースが読めるようになりました！ - Qiita Blog](http://blog.qiita.com/post/72953667833/qiita-news)

メアドを登録していると毎週ストックTop20が送られてくるのでそこから読むことのほうが多いかもしれない。

## その他
- [Hacker News](https://news.ycombinator.com/news)
    - どっかでメアド登録したら毎週メール飛んでくるので頑張って読む。
- [まなめはうす](http://homepage1.nifty.com/maname/)
    - ほぼ毎日、15-20個ぐらいの記事を厳選して更新しているブログ。
    - [Amazon.co.jp: カリスマニュースサイト管理人が15年続けたシンプルな情報収集術](http://www.amazon.co.jp//dp/B009M2QRO0)という本を出版している
        - それによるとはてブが3個ついた記事のタイトルには全部目を通すみたいなこと書いてて尊敬した
- Github mail
    - [Subscribe to GitHub’s Explore Email](https://github.com/explore/subscribe)
    - Githubでホットなリポジトリと自分がフォローしていて作られたリポジトリがメールで送られてくる。
- [Rebuild - Podcast by Tatsuhiko Miyagawa](http://rebuild.fm/)
    - [@miyagawaさん](https://twitter.com/miyagawa)がやっているPodcast。
    - 最近はシュタゲとSHIROBAKOとFateの話をしているPodcast。真偽は聞いて確認してみてください。

## まとめ
Twitterみたいにガンガンタイムラインが流れるタイプのツールよりもストックもしくは1日1回見るだけで情報が得られるツールに落ち着いた。

皆さん、他にもこういうのあるよとかありましたら、コメントくださいませ
[Android:java]strings.xmlから文字列を取得する方法（string、string-array）

必要にかられてAndroid開発してます。初歩的な内容ですが絶対使用します。
すぐわすれるのでまとめます。


## string
```xml:
<string name="hoge">ほげ</string>

<string-array name="hoge_array">
    <item>ほげ1</item>
    <item>ほげ2</item>
</string-array>
```


## string
```java:
getString(R.string.hoge);
```

## string-array
```java:
getResources().getStringArray(R.array.hoge_array)
```
## まとめ

とくにまとめはいらないですね。
言いたいことはAndroid難しいということです。
入門 統計学 - 第二章確率分布の問題を解いてみた

オーム社から発売されている[入門統計学 -検定から多変量解析・実験計画法まで](https://estore.ohmsha.co.jp/titles/978427406855P)が非常に良い本なので、これを勉強してます

ここではその中で練習問題にあげられている内容をRで解き、備忘がてら記載していきます

## 問一 表計算ソフトを使って、第１章の章末問題で使用した２０戸の農家のデータを標準化しなさい。

表計算ソフト使わずRでやってみました

```r:question1
> menseki <- c(60,30,365,190,136,15,37,100,170,70,783,560,50,35,595,200,300,356,155,250)
> money <- c(400,15,480,993,600,150,115,50,0,130,3000,500,200,55,2200,1,900,1000,450,400)
> nouka <- data.frame(menseki, money)
#標準化
> z_nouka <- scale(nouka)
#値表示
> z_nouka
         menseki       money
 [1,] -0.7600871 -0.23568327
 [2,] -0.9001093 -0.73438104
 [3,]  0.6634718 -0.13205776
 [4,] -0.1533243  0.53244083
 [5,] -0.4053642  0.02338051
 [6,] -0.9701204 -0.55951299
 [7,] -0.8674374 -0.60484915
 [8,] -0.5733908 -0.68904488
 [9,] -0.2466724 -0.75381083
[10,] -0.7134130 -0.58541937
[11,]  2.6144476  3.13214584
[12,]  1.5736160 -0.10615138
[13,] -0.8067612 -0.49474705
[14,] -0.8767722 -0.68256829
[15,]  1.7369752  2.09589073
[16,] -0.1066502 -0.75251551
[17,]  0.3600904  0.41197617
[18,]  0.6214651  0.54150806
[19,] -0.3166835 -0.17091733
[20,]  0.1267201 -0.23568327
attr(,"scaled:center")
menseki   money 
 222.85  581.95 
attr(,"scaled:scale")
 menseki    money 
214.2518 772.0107 
```

面積とお金という違う値が、比較できる数値に変換されている事がわかります

## 問二 同様に、２０戸の農家データの尖度と歪度を求めなさい

お金の尖度、歪度を求めてみます

```r:question2
> install.packages("moments")
> library(moments)
#尖度
> kurtosis(money)
[1] 6.511234
#歪度
> skewness(money)
[1] 2.033882
```

尖度、歪度ともに０が基準 => まったく正規分布ではない
まあヒストグラムもかなり左寄りなので納得の結果です

## 問三 あなたの得点は８０点でした。クラスの平均が６０点、標準偏差が１０点の正規分布の場合、あなとの得点の標準化した値と偏差値を求めなさい

```r:question3
# 標準化した値((値-平均) /  標準偏差)
> (80 - 60) /  10
[1] 2
# 偏差値(１０を掛け、５０を足す)
> ((80 - 60) * 10) /  10 + 50
[1] 70
```

偏差値70なのでかなり頭の良い方のようです

## 問四 問三で標準化した値が2.00だとすると上位何パーセントくらいの位置にいると考えられるか
標準化した値とありますが、ズルをして元の値を使います
（まあ実際は元の値を使うことがほとんどでしょうし、、、）

```r:question4
> 1 - pnorm(80,60,10)
[1] 0.02275013
```

問三で偏差値70だとわかっていますが、そこから推測される値とも一致する値ですね
偏差値70になるには100人中TOP2,3に入らなければならないということですね

## 問五 日本では過去五年で平均20,204人の食中毒が発生しています。千葉県松戸市(484,600人)において食中毒が一人も発生しない日の確率をポアソン分布を使って求めなさい。なお日本人口は127,370,000人とする

```r:question5
# 一人が一日に食中毒なる確率 * 松戸市民
> dis <- 20204 / 365 / 127370000 * 484600
# ポアソン分布の確率密度関数にあてはめる 発生しない日なので発生回数=0
> ppois(0, lambda = dis)
[1] 0.8100971
```

81%ということなので、食中毒って以外と発生しない日が多いということでしょうか

ただ(20204 / 365)という式ってどうなんでしょうね
食中毒って結構集団でなるイメージがあったりしますが
Nginxでbotからのアクセス時にBasic認証を外す

公開前で認証かけときたいけどOGPのチェックはしたいときに

```nginx
server {
  set $auth "Restricted";
  if ($http_user_agent ~ (Twitterbot|facebookexternalhit)) {
    set $auth off;
  }

  location / {
    auth_basic $auth;
    auth_basic_user_file /etc/nginx/.htpasswd;
  }
}
```
星座判定(Java)

作るきっかけとなったのは、Yahoo!知恵袋に投稿されていた[この質問](http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10153221800)でした。
ただ、ありえない日付が入力できるようになってたので、そんなことができないようにしました。

```java:Main.java
import java.util.Calendar;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Main {
	public static void main(String[] args) throws IOException{
		CmdLineInput cmd = new CmdLineInput();
		Calendar cal = Calendar.getInstance();
		cal.set(Calendar.YEAR, 2012);
		
		int month = cmd.getnum("誕生日の月を入力してください:", 12, 1);
		cal.set(Calendar.MONTH, month - 1);
		int day = cmd.getnum("誕生日の日を入力してください:", cal.getActualMaximum(Calendar.DATE), 1);
		cal.set(Calendar.DATE, day);
		Seiza seiza = new Seiza(cal);
		System.out.println("あなたの星座は" + seiza.getSeiza() + "です。");
	}
}
class Seiza {
	Calendar cal;
	Seiza (Calendar cal){
		this.cal = cal;
	}
	public String getSeiza(){
		if(this.checkInSeizaDateRange(1, 21, 2, 18)) return "水瓶座";
		else if(this.checkInSeizaDateRange(2, 19, 3, 20)) return "魚座";
		else if(this.checkInSeizaDateRange(3, 21, 4, 19)) return "牡羊座";
		else if(this.checkInSeizaDateRange(4, 20, 5, 20)) return "牡牛座";
		else if(this.checkInSeizaDateRange(5, 21, 6, 21)) return "双子座";
		else if(this.checkInSeizaDateRange(6, 22, 7, 22)) return "蟹座";
		else if(this.checkInSeizaDateRange(7, 23, 8, 22)) return "獅子座";
		else if(this.checkInSeizaDateRange(8, 23, 9, 22)) return "乙女座";
		else if(this.checkInSeizaDateRange(9, 23, 10, 23)) return "天秤座";
		else if(this.checkInSeizaDateRange(10, 24, 11, 22)) return "蠍座";
		else if(this.checkInSeizaDateRange(11, 23, 12, 21)) return "射手座";
		else return "山羊座";
	}
	private Calendar calFirst = Calendar.getInstance(), calLast = Calendar.getInstance();
	private boolean checkInSeizaDateRange(int firstDateMonth, int firstDateDay, int lastDateMonth, int lastDateDay){
		this.calFirst.set(2012, firstDateMonth - 1, firstDateDay);
		this.calLast.set(2012, lastDateMonth - 1, lastDateDay);
		return cal.get(Calendar.DAY_OF_YEAR) >= calFirst.get(Calendar.DAY_OF_YEAR) 
				&& cal.get(Calendar.DAY_OF_YEAR) <= calLast.get(Calendar.DAY_OF_YEAR);
	}
}
class CmdLineInput {
	BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
	public int getnum(String echo, int max, int min) throws IOException{
		if(max < min) return getnum(echo, min, max);
		System.out.print(echo);
		try{
			int i = Integer.parseInt(input.readLine());
			if(i > max || i < min) return getnum(echo, max, min);
			else return i;
		}catch(NumberFormatException e){
			return getnum(echo, max, min);
		}
	}
}
```
結構しょうもないミスかましてて作るのに１時間近くかかっちゃいましたが、なんとか完成しました。
Google App Engineのリージョン別レイテンシ

アジアリージョンがなく、日本からだと遅めな印象があったので[GoでHello, World!を返すやつ](https://github.com/GoogleCloudPlatform/appengine-guestbook-go/blob/part1-helloworld/hello.go)を立てて測定してみました。バラつきが気になりますが、us-centralは日本からでも一般的なAPIサーバとして十分つかえる感じに思えます。
各リージョンの300リクエスト時の平均、95%タイル値、ワースト値をまとめました。

|リージョン  |平均|95%タイル|ワースト|
|:---------|:---|:------|:-----|
|us-central|154ms|180ms |546ms |
|us-east1  |372ms|615ms |652ms |
|europe    |341ms|614ms |927ms |

直前に何回か叩いた後に測定しているので、ワースト値にはスピンアップとは無関係に何らかの原因があるかと思います。詳しい方がいたらご教授ください！

以下、abコマンドのログ抜粋です。

**us-central**

```
Time per request:       154.326 [ms] (mean)
Percentage of the requests served within a certain time (ms)
  50%    146
  66%    148
  75%    151
  80%    152
  90%    159
  95%    180
  98%    225
  99%    479
 100%    546 (longest request)
```

**us-east1**

```
Time per request:       372.252 [ms] (mean)
Percentage of the requests served within a certain time (ms)
  50%    308
  66%    321
  75%    348
  80%    484
  90%    614
  95%    615
  98%    627
  99%    643
 100%    652 (longest request)
```

**europe**

```
Time per request:       341.761 [ms] (mean)
Percentage of the requests served within a certain time (ms)
  50%    307
  66%    308
  75%    310
  80%    362
  90%    557
  95%    614
  98%    615
  99%    922
 100%    927 (longest request)
```
printf "%n"


断捨離

```
$ perldoc -f sprintf | grep '%n'
               %n    special: *stores* the number of characters output so far
```

シェルでも Perl でも[^1]。

[^1]: と言うか、シェルでは `man 3 printf` で C の library の説明なわけだから、基本的には C なのだろうけど。

リストのフォーマット対象の直後に与えられた変数に、「そこまでの」長さを格納する[^2]。

[^2]: ruby では、[ここ](http://docs.ruby-lang.org/ja/2.1.0/method/Kernel/m/sprintf.html)の指示子にリストされてないから出来ないのだろう。python では別の機能に振られている様だ。

```pl:perl
$ perl -le 'printf "%s%n\n", q{scalar}, my $c ; print $c '
scalar
6
```

```shell-session:shell
$ printf "%s%n\n" scalar c && echo $c
scalar
6
```

### 「そこまでの」

```pl:perl
$ perl -le 'printf "%n %s %n\n", my $z, q{scalar}, my $c ; print $z ; print $c '
 scalar 
0
8
```

```shell-session:shell
$ printf "%n %s %n\n" z scalar c && echo $z && echo $c
 scalar 
0
8
```
Vueで後から読み込んだHTMLをコンポーネントにしたい

こんにちは。また新卒エンジニアの@nekobatoです。

Vueと闇の話します。
Vueが闇ってことじゃなくて、Vueで闇を作る話です。

## テンプレートではなく、HTMLを読み込んでVueに繋ぎたい

用意するHTMLに`v-**`みたいなdirectiveは用意できるが、`<script type="x-template">`では囲えない。
なぜならそのHTML自体は他で使っていて、見た目に影響を出したくないから。

SPAにしろよという話でもあるのですが、今すぐ既にあるSPAに他所のHTMLを適用させたい、という場合に手っ取り早い方法を考えた所、こういうことになりました。

前提条件

- JSファイルは一つ
- コンテンツはXHRでHTMLを受け取る
- さもSPAのように振る舞わせたい
- 読み込んだHTMLはVueで操作するのでbindingが効いている必要がある

## できないこと

Vueのcomponent内へ単純に後からinnerHTMLやappendChildなどで

``` html
<p>{{greatText}}</p>
```

みたいなものを突っ込んでも、当然ながら変換されません。
Vueのcomponentが生成されるタイミングでバインディングは作られるので、後からHTMLを追加してもbindingは効きません。

参考：http://jp.vuejs.org/guide/instance.html#ライフサイクルダイアグラム

「Vueにbiningをし直せる機能が入って無いかな？」と思って探しましたが、無かったので力技を使いました。

ちなみに`vm.$mount`というものがありますが、これは待機させておいたインスタンスを非同期で生成するための関数なので、そのまま「もう一度」には使えません。

## Vue componentの再生成

### 用意

最初にこんな構造を作ります

- root Vue
 - component1

単純ですね。そしたらcomponent側の設定はこうなります

``` js
component1Object = {
  template: '<p>{{hoge}}</p>',
  replace: false

Vue.component('component1', Vue.extend(component1Object));
```

そしてhtml側はこうなります

``` html
<script id="hoge_template" type="x-template">
  <!-- 初期表示のなにか -->
</script>

<div id="#vue_root">
  <div id="component1"></div>
</div>
```

### HTMLを持ってくる

XHRでもあらかじめ用意されたものでもよいので、バインディングしたいHTMLをObjectに突っ込みます

``` js
component1.template = '<p>{{greatText}}</p>'
```

そしてcomponent1を消し去ります

``` js
this.$children[0].$destroy()
```

そしてまた生成します

``` js
Recomponent1 = Vue.extend(component1);
new Recomponent1().$mount('#component1');
```

そうすると、新しいtemplateで新たなcomponent1が生成されるわけですね。
簡単です。
こうしてまた一つ闇が生まれたのです。

## $destroyが力技に便利

$destroyで完全にVueインスタンスを消しされるのと、中身が単なるObjectであるVueならではの力技でした。
これ以上にスマートな方法があったら教えてほしいです。

次は@masasuzuさんです。よろしくお願いします。
モジュールリスト


断捨離

### 基本

```
$ corelist ExtUtils::Installed

Data for 2014-10-01
ExtUtils::Installed was first released with perl 5.005

$ perl -MExtUtils::Installed -e 'print for ExtUtils::Installed->new->modules' | less 
```

### 基本を知る前

```
$ perldoc -tT perllocal | perl -lane 'next if !/"Module"/ ; print $F[-1]' | sort | uniq
```

## モジュールの一括移行

```
$ cpanm < module.txt
```

まあ、実際にはトラブった奴を手動で入れたりするのだけれど。


#### 苔生した情報


```
# perl -MCPAN -e 'CPAN::Shell->install(CPAN::Shell->r)'
```

これは、少なくとも cpan-1.57 の時点では、モジュールの一括更新

https://metacpan.org/pod/release/ANDK/CPAN-1.57/lib/CPAN.pm

現在の `cpan` では `-r` は recompile に割り当てられてしまって、機能しない。

まあ、今時、素の `cpan` 打つ人居ないけど。

```
$ perl -MCPAN -e 'upgrade /(.\*)/'
```
浮動小数点丸め問題


```pl:test.pl
use POSIX qw(ceil floor) ;
my $code = sub {
    my $mode = shift ;
    sub {
        my $in = $mode eq 's' ? ('' . shift ): shift ;
        sub {
            shift eq 'c' ? (ceil $in) : (floor $in) ;
        }
    }
} ;

for ( 1 .. 100 ){
    my $o1 = $code->('i')->( $_/100 * 100 ) ;
    next if $o1->('c') == $o1->('f') ;
    my $o2 = $code->('s')->( $_/100 * 100 ) ;
    printf "%s\n", join "\t",
        $_,
        $o1->('f'),
        $o1->('c'),
        $o2->('f'),
        $o2->('c'),
        ;
}
```

数値を ceil/floor するのと、文字列に変換した数値を ceil/floor するのと。

- `100 * $_ / 100` にしたら事態は一変するのは承知の上。
- 数値から文字列への変換は、 `'' . shift`
- クロージャは二段重ね。リファレンスなので普通に `->()->()` などと重ねられる。


```
$ perl test.pl
7       7       8       7       7
14      14      15      14      14
28      28      29      28      28
29      28      29      29      29
55      55      56      55      55
56      56      57      56      56
57      56      57      57      57
58      57      58      58      58
```

- 割るのは最後にするか、文字列型保持を常に心掛けるか。
- （直接は関係ないけど）偶捨奇入も。

##### 型について

```
$ perl -MDevel::Peek -le 'print q{#num} ; Dump 1/10*10 ; print q{#str} ; Dump "" . 1/10*10 ;'
#num
SV = NV(0x7fdc508323e0) at 0x7fdc5082a040
  REFCNT = 1
  FLAGS = (NOK,READONLY,pNOK)
  NV = 1
#str
SV = PV(0x7fdc50805680) at 0x7fdc5082a088
  REFCNT = 1
  FLAGS = (POK,READONLY,pPOK)
  PV = 0x7fdc5040e9b0 "1"\0
  CUR = 1
  LEN = 16
```
react−nativeの最初につまずいたところメモφ(｡_｡ )

## nvm経由でnode入れた場合、react−nativeのiOSビルドが失敗する

nvm経由でnode入れた場合、

```
Command /bin/sh failed with exit code 127
react-native: command not found
```

というエラーでiOSビルドに失敗します。

https://github.com/facebook/react-native/issues/3974
を参考に、

../node_modules/react-native/packager/react-native-xcode.sh
の

```
react-native bundle
```

の前に

```
source ~/.bash_profile
```

を追加したら治りました。


## 複数のreact−nativeのリポジトリを行き来してビルドしていると、 Invariant Violation エラーが出る

```
Error: Invariant Violation: Application SampleApp has not been registered. This is either due to a require() error during initialization or failure to call AppRegistry.registerComponent.
 stack: 
```

こんなエラーが出ます。

http://stackoverflow.com/questions/29287987/invariant-violation-application-awesomeproject-has-not-been-registered-when-b
を参考に、ターミナルで

```
ps aux | grep react
```

でreactのプロセスが残っていたらkillする。
で、ビルドしなおしたら治りました。
Xcode7でApp Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. と怒られたときの対処法

##動作環境
Xcode 7.1.1
Mac OS X Yosemite 10.10.5

##現象
通信を行うアプリをビルドすると、下記のように怒られてしまう。

```
App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app's Info.plist file.
```

自分の場合、ローカルで立ち上げていたAPI
http://localhost:3000/hogehogeapi/
を叩きにいったとき、上記エラーとなりました。

##原因
どうやらiOS9からhttps通信推奨となり、http通信でのリクエストがはじかれてしまう模様。

##対処法
info.plistを編集し、App Transport Security(APS)を無効にする。

- NSAppTransportSecurityをDictionaryで追加
- その下位にNSAllowsArbitraryLoads をBooleanで追加
- NSAllowsArbitraryLoadsのvalueをYESに設定

下記参考サイトで図解されていますので、参考にしてください。

参考：http://d.hatena.ne.jp/kazukingband/20150910/1441875442
データ分析業務に使えるPythonの可視化ツール


データコンサル仕事してると、DBからテキトウに取ってきた値とかを、Jupyterの中でPandasでサマって客の目の前で可視化とかする事多いので、最終段の可視化周りをまとめる。


ここに上げたやつ使ってればまぁ大体の業務はカタつくとおもう。使い方はそれぞれTutorialを参考。そんな難しくない。

# matplotlib

- http://matplotlib.org/
  - Gallery
    - http://matplotlib.org/gallery.html

基本のライブラリ。みんな使ってる


# seaborn

- http://stanford.edu/~mwaskom/software/seaborn/
  - Gallery
    - http://stanford.edu/~mwaskom/software/seaborn/examples/index.html

matplotlibをベースに、統計解析結果を見た目よく可視化をしてくれるライブラリ。デンドログラムとかも書ける。pandasと連携可。

# bokhe

- http://bokeh.pydata.org/en/latest/
  - Gallery
    - http://bokeh.pydata.org/en/latest/docs/gallery.html

フルスクラッチでJSで書かれている可視化ライブラリ。matplotlibをそのまま使うと、Jupyter上では画像が生成されてしまうのが、bokheを使うと拡大縮小等インタラクティブな操作が出来るようになる。客先デモで結構便利に使える。アニメーションとかも作れるけどダルい。


# ggplot

- http://ggplot.yhathq.com/
  - Gallery
    - http://ggplot.yhathq.com/gallery.html

Rのggplot2のPython版。pandasのDataFrameとstatsmodelの結果を可視化するのに便利。まだこなれてない感あるので、当面はseaborn使っとけという感がある。


# plotly

- https://plot.ly/python/

pythonからもAPI経由で使えるクラウドベースの可視化ツール。PandasとJupyterの連携がある。Web上にグラフとかを公開できる。やたらと高機能で、3Dプロットとかもヌルヌル動く。公開せずにJupyter上で使うだけなら制限なさそうなので今後使っていきたい。(https://plot.ly/python/offline/)


# MLPD3

- http://mpld3.github.io/

matplotlibのインターフェイスで、そのままD3.jsで可視化してくれる物。Jupyterでこねこねした結果をそのままダッシュボートのWebアプリに載せる場合とかに便利。
[iOS 9] SFSafariViewControllerお試し

# WebViewとSafariのCookie共有問題
解決方法として、**ios9ならSFSafariViewController** で実現できるらしい。
実際に組み込んで動作検証してみました。
##準備
1.Xcode7をインストール
2.プロジェクトを作成し、Deployment Targetを9に設定
<img width="781" alt="スクリーンショット 2015-12-03 19.11.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/103632/d141b14d-7823-5f5b-fd7e-b412597bb657.png">
##webview組み込み
3.storyboardでViewControllerにButtonを配置
4.ViewController.swiftに、SFSafariViewControllerが開くように実装

```swift:ViewController.swift
import UIKit
import SafariServices // ★追加

// ★SFSafariViewControllerDelegate追加
class ViewController: UIViewController, SFSafariViewControllerDelegate {

    // ★Button押した場合のメソッド
    @IBAction func openBtn(sender: AnyObject) {
        // ★開くURL
        let _url:NSURL = NSURL(string: "https://www.google.co.jp/")!
        // ★待ちに待った作成
        let _brow = SFSafariViewController(URL: _url, entersReaderIfAvailable: true)
        _brow.delegate = self
        // ★ほぼSafariを開く
        presentViewController(_brow, animated: true, completion: nil)
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    // ★SFSafariViewControllerを閉じた際の処理
    func safariViewControllerDidFinish(controller: SFSafariViewController) {
        print("close")
    }
}
```
5.ボタンのタップイベントとのひもづけ
storyboard開いて、ButtonのTouch Downの+をViewControllerへピーッと
![ios_tap.png](https://qiita-image-store.s3.amazonaws.com/0/103632/a77b5856-d666-a927-65b1-fba53d33c965.png)
定義したメソッドがでてくるので、選択
![ios_tap2.png](https://qiita-image-store.s3.amazonaws.com/0/103632/e4f00814-0ebb-e023-a28e-bcd6921e6428.png)

６．Githubに置きました
[SFSafariViewControllerお試し](https://github.com/spnvmori/ios-practice)

##実行結果
今回はGoogleのページを開き、ログイン状態を比較することで、共有状態を検証
- Safari未ログイン状態。アプリ起動し、ほぼSafariのWebViewを起動。
---> Google未ログイン状態で表示
- Safariログイン状態。アプリ起動し、WebView表示。
---> Googleログイン状態で表示
- Safari未ログイン状態。WebViewで、ログイン。Safari開く。
---> Googleログイン状態で表示
- Safariログイン状態。WebViewで、ログアウト。Safari開く。
---> Google未ログイン状態で表示
Safari未ログイン状態。WebViewで、未ログイン。Safariでログイン。WebView見る
---> Googleページのどこかのリンクを押せば、Googleログイン状態に切り替わる

ちょっと、最後は意地悪な検証をしましたが、共有できていることがわかりました。
他の完全にCookie使っているサイトで試したいですね。
いまどき、Web Storageに保持してますかね。

##P.S.
ios初心者なので、Qiitaに投稿しながら、腕を上げます。
見やすいマークダウンとか。。。

以上
SSHの基礎知識

[インフラエンジニアじゃなくても押さえておきたいSSHの基礎知識](http://qiita.com/tag1216/items/5d06bad7468f731f590e)を読んで自分で咀嚼したもの。ほとんど劣化版。

#認証方式は二通り
##パスワード認証方式
OSのID/パスワードでログイン。

##公開鍵認証方式
手元に秘密鍵、リモートに公開鍵を置くことでID/パスワードなしでログイン。

###鍵を作って登録
```
#秘密鍵/公開鍵作成
#秘密鍵のファイル名、パスフレーズ、パスフレーズ確認の順で聞かれる。特になければ全部EnterでOK。
ssh-keygen

#公開鍵を登録
ssh-copy-id node2
```

#sshコマンド
ログインしたりコマンド発行したり。

```ssh:ssh
ssh [option] [user@]hostname [command]
```

* ユーザー名を省略するとクライアントの現在のユーザーが使用される。
* コマンドを指定するとリモートホストに接続したあと指定のコマンドだけ実行してログアウトする。
* コマンドを省略した場合はリモートホストにログインした状態でコマンドプロンプトが表示されるので、任意のコマンドを実行できる。ログアウトしたい時はexit。


**-i identity_file**
公開鍵認証で使用する秘密鍵ファイルを指定する。デフォルトでは~/.ssh/id_rsaなどが使用される。

```ssh:ssh
ssh -i ~/.ssh/id_rsa [user@]hostname [command]
```

**-F configfile**
設定ファイルを指定する。デフォルトでは`~/.ssh/config`が使用される。

```ssh:ssh
ssh -F ~/.ssh/config [user@]hostname [command]
```

**-p**
ポート番号を指定する。

```ssh:ssh
ssh -p 56789 [user@]hostname [command]
```
[WIP] お寿司屋マッピング


クラウドワークス Advent Calendar 2015 3 日目！
前 2 日は真面目な内容だったので、ここいら辺で **え？誰得？** なものをご紹介したいと思います。

# 作ったもの

その名も **[sushi_map](https://sushi-map.herokuapp.com/)** !!
（コードは [こちら](https://github.com/toku345/sushi_map)）

Retty さんの [築地のおすすめ寿司屋１５選](http://retty.me/area/PRE13/ARE2/SUB204/LCAT2/CAT30/topic/178/)で紹介されているお寿司屋さんの住所を Google Map 上にマッピングするというシンプルなアプリです。

# モチベーション

今週の日曜日に、知人（女性）と築地にお鮨を食べに行くことになる
↓
お昼は結構混んでいるという情報を入手（& 閉まっているお店も多いらしい、、、）
↓
美味しいお鮨を、なるべく並ばずに食べたい（相手の機嫌を損ねたくない！）
↓
超オイシイお店でもかなり並んでる場合は、近くの次に美味しそうなお店に素早く移動できるようにしよう！
↓
iPad mini でも確認できるものにしたい
↓
**エンジニアらしいところを見せて、次につなげたい**😆
（最悪、話のネタにでもなればよい）

# 所感

開始前は、一晩で片手間でできるだろうと高を括っていたのですが、~~下心のせいか~~ 細かい点でけっこう躓いてしまった。
（特に複数件の住所 → 緯度経度に変換した後にマップを表示させる箇所）

また実際に使ってみると、ちょっと微妙だなぁと。。。
（こんなんじゃ、話のネタにもならないかも 😩）

でも、X デーまでには若干猶予があるので、もうちょっといじってみます！

# 改善したい点

- [x] 店舗名を表示させる
- [x] 現在地をわかるようにする
- [ ] Retty 上の他のページのものをマッピングできるようにする
- [ ] 営業しているお店だけを表示させる
- [ ] 10 店舗以上マーカーを置けるようにする
      ※ 10 件を同タイミングで取得しにいこうとすると Google Maps Geocoding API の OVER_LIMIT_QUERY に引っかかってしまう

# 最後に

つっこみや、Google Maps Geocoding の制限に関してご教授頂けると涙がでるほど嬉しいです 😂
Docker KitematicでWordPress環境を構築する(Windows版)


## kitematic とは
Docker 使っていますか？
開発環境の構築や、ちょっとしたアプリの稼働確認など、簡単に環境構築が出来て非常に便利ですよね。今回の記事では、Dockerのインストール方法は明記していませんので、他記事を参考にインストールしてください。

Dockerを使うためには、CUIのコマンドライン画面で敬遠していた方も多いかと思いますが、Kitematicを使えば専用のGUI画面からDockerコンテナを簡単に立ち上げることが出来ます。

KitematicはElectronベースで作られており、Mac版とWindows版があります。
以前はアルファ版としての提供でしたが、現在はDocker Toolboxとして他のDockerツール(Docker cli)とセットで提供されています。

以下からダウンロードしてインストールしてください。
https://kitematic.com/

今回はWindowsのDockerコンテナでWordPress環境を構築します。

## MySQLコンテナの作成

WordPressオフィシャルのDockerイメージには、データベースが含まれていませんので、別途MySQLのコンテナを作成する必要があります。

基本的にDockerは1コンテナ1プロセスで扱うことが主流となっていますので、アプリケーションで1コンテナ、データベースで1コンテナというような使い方になっています。

kitematicの左ウィンドの「＋NEW」をクリックしてください。

検索ボックスに「MySQL」を打ち込んで、オフィシャルのMySQLイメージを取得して立ち上げましょう。

MySQLコンテナの初期状態では、rootのパスワードが未設定となっているため、コンテナの起動に失敗します。

kitematicのsettingのGeneralタブをクリックし、以下の情報を追加してください。
KEY：MYSQL_ROOT_PASSWORD
VALUE：(設定したいパスワード)

この状態で「SAVE」することでMySQLコンテナが正常に起動します。

## WordPressコンテナの作成

再度、kitematicの左ウィンドの「＋NEW」をクリックしてください。

今度は検索ボックスに「WordPress」と打ち込んで、オフィシャルのWordPressイメージを取得して立ち上げましょう。

MySQLのホスト指定が未設定状態のため、起動に失敗します。

kitematicのsettingのGeneralタブをクリックし、以下の情報を追加してください。

KEY：WORDPRESS_DB_HOST
VALUE：mysql ← MySQLコンテナ名

KEY：WORDPRESS_DB_PASSWORD
VALUE：(先ほど設定したパスワード)

この状態でWordPressコンテナが正常に起動します。

起動が正常に行われれば、サイトにアクセスして、いつも通りのWordPressのセッティング作業となります。

## WordPressファイルの設定変更

カスタマイズなどでWordPressファイルの変更を行いたい場合は、
kitematicのWordPressコンテナのHomeタブのVOLUME欄の「/var/www/html」をクリックしますと、Exploerが立ち上がりWindowsのローカル環境上でファイルの更新が可能となります。
FuelPHPでAjax通信した内容をmodalで表示させる。メモ。

##view側
```html:html
<!-- button -->
<button display-id="1" class="btn btn-sm modal-btn btn-primary" type="button">モーダル</button>
      
<!-- Modal -->
      <div class="modal fade" id="my-modal">
          <div class="modal-dialog" >
              <div class="modal-content">
                  <div class="modal-header">
                      <h4 class="modal-title" id="modal-label" />
                  </div>
                  <div class="modal-body" id="modal-body">
                  </div>
                  <div class="modal-footer">
                      <button type="button" class="btn btn-default" data-dismiss="modal">閉じる</button>
                  </div>
              </div>
          </div>
      </div>
```

```js:javascript
    $(document).on('click','.modal-btn', function() {
        $.ajax({ type: 'GET',
            url: 'path_to_find.json',
            data: {
            id: $(this).attr('display-id')
        },
        success: function(data) {
            $('#modal-label').html(data['title']);
            $('#modal-body').html(data['content']);
            $('#my-modal').modal('show');
        },
        error: function(data) {
            alert('error');
        }});
    });
```
##controller
簡単のためコントローラーでデータ処理

```php:controllerのファイル
    public function action_path_to_find()
    {
        $result = DB::find(Input::get('id'));
        $this->response(array('title' => 'タイトル', 'content' => $result['field']) 
        );
    }
```
Xcode「Plain Style unsupported in a Navigation Item」のWarningが出た時の対応

storyboardでいろいろとパーツを配置していると、このWarningが出るようになりました。

<img width="374" alt="スクリーンショット 2015-12-03 19.12.10.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/40009/a8407d54-997f-36a3-32fd-f818af2faf63.jpeg">

> **Unsupported Configuration**
> Plain Style unsupported in a Navigation Item

和訳としては"Navigation ItemのPlainスタイルはサポートしていません"（そのままですが…）ということ。

UIBarButtonItemには3つの種類があります。

- **UIBarButtonItemStylePlain**：枠線が無いボタン
- **UIBarButtonItemStyleBordered**：枠線があるボタン
- **UBarButtonItemStyleDone**：青いボタン

元々iOS7以前ではこの設定でボタンの種類で切り替えていました。
ですが、iOS7以降ではデザインが刷新されて、「UBarButtonItemStyleDone」一択になりました。

なので、BarButtonItemのところでこうなっているのを…

<img width="260" alt="スクリーンショット 2015-12-03 19.12.26.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/40009/208c8837-826f-726d-095b-b5baa10ad4ff.jpeg">

こうします。

<img width="260" alt="スクリーンショット 2015-12-03 19.12.55.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/40009/a4974bf9-7117-a2be-7db6-c45e52b91285.jpeg">

すると、Warningが解消されます。

動作的には同じで、特に問題ないんですがWarningが出ていて解消されないままはむずむずするので、これで解消。

UIBarButtonItemStylePlainがサポートされないなら、デフォルト値を変えてくれればいいのに…と思うのですが、、、