OmniAICreator/Qiita-1.07M huggingface dataset:
SNSサービスのまとめ

みなさん、SNS使ってますか？

私はなかなか続かないながらも、
色々手を出してみています。

そんなSNSサービスを自分目線でまとめてみました。

# [Facebook](https://www.facebook.com/)
Meta社(旧Facebook)が作った泣く子も黙る実名SNS。実名だけあって誰もはっちゃけてない。
「いいね」を集めれる程良い投稿らしい。

# [X (旧: Twitter)](https://twitter.com/)
短文投稿型SNS。IPAとかフォローするとセキュリティ周りの情報が流れてくる。便利。「リツイート」を集めれる程良い投稿らしい。

# Google+
Google先生が提供するSNS。程よく情報が集まる。
Go言語・猫画像の収集用として利用されると言うかしてる。
「+1」を集めれる程良い投稿らしい。
すでにサービス終了。

# tsū
お金がもらえるSNS。みんなお金が欲しいので投稿は画像ばっかりが多い。
「&hearts;」を集めれる程良い投稿らしい。
すでにサービス終了。

# [Imgur](https://imgur.com/)
画像投稿SNS。たまに面白いGIFに会える。
「&hearts;」を集めれる程良い投稿らしい。

# [Tumblr](https://www.tumblr.com/)
リッチな投稿が出来るSNS。
「&hearts;」を集めれる程良い投稿らしい。

# [Pinterest](https://www.pinterest.jp/)
画像投稿SNS。トップへの行き方も含めてなかなか難解。
使いこなせれば面白そうなのに残念。
「ピン」を集めれる程良い投稿らしい。

# [reddit](https://www.reddit.com/)
とにかく情報量が多いSNS。情報量が多すぎて使い方が分からない。
SNSなのかコレ？何かリンククリックすると他のSNSに飛ぶ。
何を集めれると良い投稿なのかはいまだによく分からない。

# [LinkedIn](https://www.linkedin.com)
おそらく転職用実名SNS。いまいち使い方が分からない。

# VK
HなSNS。ロシアだけあってロシア語が多い。


# [アルファベット順に並べ替えます](https://www.abjjad.com/)
謎が謎を呼ぶ読書系SNS。当たって砕けるのもまた一興。


# [Foursquare](https://ja.foursquare.com/)
お店などのおすすめスポット共有SNS。
"フォロー"と言う文言があるので、Twitterみたいな使い方もできるのかもしれない。
(確認中)

# [hamster pad](https://www.hamsterpad.com/)
slackを利用したチャットスタイルのSNS。
何かと最近はやりのslack。勇気を出して、Let's "Get My INVITE"!!
(当たり前なんだろうけど、英語のチャットルームばっかり・・・。)


# [Instagram](https://www.instagram.com/)
写真・動画投稿型SNS。若者多め。
「&hearts;」を集めれる程良い投稿らしい。

# [Threads](https://www.threads.net/)
Meta(旧: Facebook)が作ったXよりのSNS。
「&hearts;」を集めれる程良い投稿らしい。
個人的に猫の投稿しか&hearts;つけてないので、ほぼ猫の投稿しか上がってこない。

# まとめ

いかがだったでしょうか。
まだまだ知らないSNSがあると思います。

新しいSNSは発見次第手を出していきたいものですね。
Mac でIME(日本語入力)の状態を表示するソフトウェア



IME切り替えの表示がされる。 
以下の2つが見つかった。


## YouType(有料?)


日本では見られないと怒られた。AppStoreを海外にしたらいけるかも?
有料だそう。

*[MacのIMEの英数/かなの状態をカーソルのそばに表示してくれる「YouType」（フルスクリーン時も可）](http://sawayakatrip.com/mac-youtype)



## ImageUp(無料)


* Mac OS X 10.5辺りで更新が止まっているが、動く。
* CPUを結構食うのがなぜなのかが、気になる。
* フルスクリーンで表示されないらしい。

[ImageUp](http://software.cockscomb.info/imageup/)



## ShowyEdge


@Nunocky さんによる情報提供! (感謝!)

* 多言語対応
* 上端のカラーバーを変える
* 入力しているところの近くに表示というのはできない様子


[ShowyEdge - OS X用のソフトウェア](https://pqrs.org/osx/ShowyEdge/index.html.ja)
イラレから書き出す方法

## Fit to Selected Art

アートボードを対象オブジェクトに合わせてWeb及びデバイス用に保存。
このときオブジェクトを画像としてブラウザで表示し、さらにブラウザから印刷することまで想定しているのであれば、オブジェクトが小さい場合、3倍くらいの大きさを書き出しのタイミングで指定して上げてCSSでちょうどいい小さめの値を設定しないと、印刷したときに文字がつぶれるなどの減少が起こる。

```
対象を選択＞アートボードツールをダブルクリック＞
プリセットで「アートボードを選択したアートに合せる」を選択＞
OK＞ファイル＞Web及びデバイス用に保存
```

## Export
Exportでやると、アートボードの大きさで切り取れたように見えて、何故か透明ななぞの隙間が入っている。

## MacのPreview.appで透過確認
MacのPreview.appで

```
View > Show Image Background
```
で透過確認できるので、必ずチェックすること。
youtube > j: 巻き戻し / k: 停止と再生 / l: 早送り / m: ミュート / f / [1-9] / 0 / "/" / Shift + N / Shift + P

```txt:動作環境
Youtube on Chrome on MacOS X 10.8.5
```

vmware上のCentOSでviコマンドを叩こうとして、jを押すと違和感が。

傍らでyoutubeでBGMを流していたが、音が飛んだ。

もう一回 j を押すと、再生が巻き戻された。

ちょっといじっていて、以下が分かった。

- j : 巻き戻し
- k : 停止と再生
- l : 早送り
- m : ミュート

他には

- f : フルサイズに
- [1-9] : チャプターに飛ぶ
- 0 : 一番最初に戻る
- / : 検索ボックスにフォーカスが移る
- Shift + N : 次の動画に
- Shift + P : 前の動画に
- 右矢印 : 少し進む
- 左矢印 : 少し戻る
    - 環境による? (2017/12/22)
- 上矢印 : 音量上げる
- 下矢印 : 音量下げる

~~j,k,lはviから来ているのだろうか?~~


## OS依存でもなさそう

- firefox on CentOS 6.5 on vmware on MacOS X 10.8.5 : 上記コマンド使えた

### OS依存の部分もある
(2018/06/09) 

Ubuntu 16.04 LTSでは少なくとも以下が機能しなかった。

- Shift + N : 次の動画に
- Shift + P : 前の動画に

### 参考情報
(2018-09-30追記)

@cmplstofB さんの情報で以下のリンク先を知りました。
https://support.google.com/youtube/answer/7631406?hl=ja&ref_topic=3014328

情報感謝です。
ffmpgでDVDの中身を取り出す

RipItでHDDに落とす

DVD Player Media Documentを右クリックで開くとVIDEO_TSがある。
この中のVTS_01_1~9.VOD
が対象になる。 1から４の場合、

ffmpeg -i "concat:VTS_01_0.VOB|VTS_01_1.VOB|VTS_01_2.VOB|VTS_01_3.VOB|VTS_01_4.VOB" -c copy ~/Movies/hogehoge.ts
とすると結合したtsファイルができる。
あとは
ffmpeg -i hogehoge.ts -vcodec libx264 -preset veryfast -acodec ac3 hogehoge.mp4
として圧縮する。
git / python > git log analysis (v0.1, v0.2) > calculate total working time in minutes from git log

Something suddenly occurred to me that we can calculate total working time from git log by and large.

To do so, and to study python, I tried to make a python script.

## Program
[v0.1 @ github](https://github.com/yasokada/python-151226-gitloganalysis/releases/tag/v0.1)
[v0.2 @ github](https://github.com/yasokada/python-151226-gitloganalysis/releases/tag/v0.2)

## How to use

~~Firstly, you need to create `tmp.log` file by git log command at the repository you want to investigate.~~

<font color=brown>In version v0.2 and later, you do not need to run git log command. Instead, the script automatically make tmp.log file.</font>

```bash
$ git log --pretty=format:'%h %ad %s' --date=iso > tmp.log
```

Then, you can obtain the total working time by the script:

```bash
$ ./git_log_analysis.py
```

The output is as follows. The last line includes the total working time in minutes (e.g. 764).

```bash
...
2015-11-13 21:11:06 801 750 # sec, min
2015-11-13 12:53:26 29860 750 # sec, min
2015-11-13 12:44:36 530 758 # sec, min
2015-11-13 12:37:53 403 764 # sec, min
2015-11-13 07:12:08 19545 764 # sec, min
```

## Uncertainty in the calculation

The script takes the elapsing time more than and equal to 4 hours as zero. This is for my case. The user can modify according to their commiting style.

```py
def calcElapsedTimeInMinutes(diff_sec):
    diff_min = diff_sec / 60
    diff_hr = diff_min / 60
    if diff_hr >= 4:
        return 0
    else:
        return diff_min
```

The script only takes the two datetime difference. Therefore, there might have the various uncertainties including:

- the commit message does not show any other activities you might spent (SNS, mail, etc) during each two datetime difference
- the commit message does not show any switching between multiple repositries



### Link
Related (in Japanese)
http://qiita.com/7of9/items/e1e151794f80fb9c24fc
git / python > git log analysis (v0.1, v0.2) > git のログから作業時間を見積もる実装

http://qiita.com/7of9/items/e1e151794f80fb9c24fc
でふと思った作業時間の積算見積もりをpythonの勉強もかねて実装してみた。

## プログラム

[v0.1 @ github](https://github.com/yasokada/python-151226-gitloganalysis/releases/tag/v0.1)


## 使い方

まず調査したいgitリポジトリにおいて tmp.log ファイルを作成する。

```bash
$ git log --pretty=format:'%h %ad %s' --date=iso > tmp.log
```

あとはスクリプトを実行すれば、tmp.logを読み取って、積算時間が表示される

```bash
$ ./git_log_analysis.py
```

表示の形式は以下のようなもので、最後の行の764が積算時間(分)

```
...
2015-11-13 21:11:06 801 750 # sec, min
2015-11-13 12:53:26 29860 750 # sec, min
2015-11-13 12:44:36 530 758 # sec, min
2015-11-13 12:37:53 403 764 # sec, min
2015-11-13 07:12:08 19545 764 # sec, min
```

linemonitorのpython実装（コア部分）はトータル(少なくとも)12時間かかったようだ。

## 見積もれない時間

積算時間計算においては4時間以上は作業がなかったとみなしている。僕の場合、４時間以上あいてコミットしないというため。このあたりは使用者が適宜変更すればいいだろう。

```py
def calcElapsedTimeInMinutes(diff_sec):
	diff_min = diff_sec / 60
	diff_hr = diff_min / 60
	if diff_hr >= 4:
		return 0
	else:
		return diff_min
```

基本的に２つの日時の差をとっているだけなので、少なくとも以下の不確定要素は入ってくる

- その時間差全てを実装についやしていない
- 複数リポジトリで切替ながら作業していると見積が乖離する


## v0.2

git logコマンドをいちいち打つのが面倒に思えた。

shutdownButtonを実装した時にコマンド実行をしていたのを思い出したのでv0.2では自動的にtmp.logを作成するようにした。
すでにtmp.logがあれば上書きされるので注意。

[v0.2 @ github](https://github.com/yasokada/python-151226-gitloganalysis/releases/tag/v0.2)
2015-12-26 python2 > datetime > 2つのISOフォーマット日時文字列から秒での差を取る実装 > .seconds()使用

http://qiita.com/7of9/items/ceed758eaa49bc421c72
の続きで、差を秒として取りたい。

参考 http://stackoverflow.com/questions/2788871/python-date-difference-in-minutes

実装
http://ideone.com/H42MLS

```py
from datetime import datetime as dt
from datetime import timedelta

strdt1 = "2015-12-09 12:40:08"
strdt2 = "2015-12-09 12:35:08"
tdt1 = dt.strptime(strdt1, "%Y-%m-%d %H:%M:%S")
tdt2 = dt.strptime(strdt2, "%Y-%m-%d %H:%M:%S")

print tdt1 - tdt2

diff_sec = (tdt1 - tdt2).seconds
print diff_sec
```

```txt:結果
Success	time: 0.01 memory: 9176 signal:0
0:05:00
300
```
python > datetime > 日付の文字列(ISO format: 2015-12-09 12:40:08)からdatetime型にする

`2015-12-09 12:40:08`というような形式(ISO formatというらしい)からdatetimeへの変換をしたい。

参考 http://qiita.com/shibainurou/items/0b0f8b0233c45fc163cd


以下のように実装した。

http://ideone.com/IaAbuS

```py
from datetime import datetime as dt

strdt1 = "2015-12-09 12:40:08"
strdt2 = "2015-12-09 12:35:08"
tdt1 = dt.strptime(strdt1, "%Y-%m-%d %H:%M:%S")
tdt2 = dt.strptime(strdt2, "%Y-%m-%d %H:%M:%S")

print tdt1
print tdt2

print tdt1 - tdt2
```

```txt:結果
Success	time: 0.02 memory: 9184 signal:0
2015-12-09 12:40:08
2015-12-09 12:35:08
0:05:00
```
UIButton のサブクラスを作る

独自の初期化をするつもりがなくても ``init:frame:`` と ``init:coder`` はoverride必須らしい。

```swift
// これだけ必要
class MyButton : UIButton{

    override init(frame: CGRect) {
        super.init(frame: frame)
    }
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }
}
```

イニシャライザの定義には何か制限があるみたい?

ダメな例

```swift
init(title: String){
    super.init(type: .System)
}
//これは下記のエラーになる
// Must call a designated initializer of the superclass 'UIButton'
```

OKな例

```swift
init(frame:CGRect, title: String){
    super.init(frame:frame)
    self.setTitle(title, forState: .Normal)
}

//あるいは
init(title: String){
    super.init(frame: CGRectZero)
    self.setTitle(title, forState: .Normal)
}
```

UIView のサブクラスは ``init:frame`` を呼ばなくてはいけない的な制限があるようです。

ちなみに [iOS View
プログラミングガイド](https://developer.apple.com/jp/documentation/ViewPG_iPhoneOS.pdf) の **「ビューのサブクラスの初期化」** には下記の記述があります。

> ##カスタムビューの初期化
新規に定義するビューオブジェクトには、それぞれカスタムのinitWithFrame:初期化メソッドを含 める必要があります。このメソッドは、作成時にクラスを初期化し、ビューオブジェクトを既知の状 態に設定します。ビューのインスタンスをコード内でプログラムによって作成する場合は、このメ ソッドを使用します。
git > 日時付きのログを1行で取得する > git log --pretty=format:'%h %ad %s' --date=iso

```txt:動作確認
CentOS 6.5
```


git logを１行、日時付きで取得したい。

参考1. [SO](http://stackoverflow.com/questions/1441010/the-shortest-possible-output-from-git-log-containing-author-and-date)
参考2. http://qiita.com/harukasan/items/9149542584385e8dea75

以下で取得できた。

```bash
git log --pretty=format:'%h %ad %s' --date=iso
```

```txt:結果
7e64dc5 2015-12-09 12:40:08 +0900 update version comment
c37b62c 2015-12-09 12:39:18 +0900 add LF if str does not have
57c205a 2015-12-09 07:11:53 +0900 comrelay() takes \r also as new line
7c78970 2015-12-05 09:39:19 +0900 show concrete error message
591b8c3 2015-12-05 09:34:00 +0900 avoid udp send error when the network is not a
290838a 2015-12-03 12:33:31 +0900 add x access mode to Log/
7981543 2015-12-03 07:15:59 +0900 WIP
d72cea4 2015-12-03 07:12:48 +0900 utilLogger: chmod Log/ also
7a31ed1 2015-12-03 07:07:48 +0900 utilLogger: add S_IWGRP also
b07925f 2015-12-03 06:58:56 +0900 utilLogger: chmod of the file to make other wr
10e8ace 2015-12-03 06:56:42 +0900 change access mode
de4975e 2015-12-02 21:45:28 +0900 show os.uname
1adab1f 2015-12-02 07:15:03 +0900 add todo
d254200 2015-12-02 07:10:40 +0900 add todo
bfed68f 2015-12-02 07:06:01 +0900 utilLogger: add msec to the timestamp
82c8252 2015-12-02 06:59:07 +0900 Merge branch 'master' of https://github.com/ya
2abdcab 2015-12-02 06:58:49 +0900 get current msec
c0851be 2015-12-02 06:54:33 +0900 change prefix string from 1: to rcvd1, for csv
d77d3cd 2015-12-01 21:40:16 +0900 add Log feature
892f97b 2015-12-01 21:39:34 +0900 remove CRLF at the end of the line
153ce73 2015-12-01 21:22:31 +0900 update version comment
abfb757 2015-12-01 21:20:36 +0900 ignore Log/
3846eee 2015-12-01 21:20:12 +0900 save to Log/ Folder
```
技術英語 > painstakingly slow / It takes forever.

Windows Updateがバックグラウンドで中途半端にかかって処理が重くなったときに、ふと思い出したフレーズ

> painstakingly slow

http://stackoverflow.com/search?q=painstakingly+slow

http://stackoverflow.com/questions/18232652/why-is-mongorestore-painfully-slow

>  much to my surprise, the process was painstakingly slow.

実際には painstakingly ほど重くはないが、「更新して再起動」が出て適用できる状況なら適用するほうが軽くなる。

<hr>

関連して思い出したのは

> It takes forever.

ドラマ(フルハウス)でミシェルが友達と遊んでいるときに、ジェシーおじさんが言っていたセリフだったような気がする。
細かい作業をちょっとずつやっていく場面。

エピソード番号などは失念。

インフォーマルな場面で時間がかかることを誇張したいときには使えそう。
何かの処理が劇的に速くなった、というのを軽い雰囲気でのプレゼンで使うのはどうだろう。
addTarget:action:forControlEvents した時に引数も渡す

UIButton などを押した時のアクション設定で addTarget:action:forControlEvents した時に一緒に引数を渡したい。

引数は選ぶことができないが、SenderとEventを渡すことができる。

```swift
// 引数なしの場合
button.addTarget(button, action: "touchedMe", forControlEvents: .TouchUpInside)

// Senderを渡す場合 : をセレクタの最後につける。イベントを発生させたオブジェクトになるので、この場合 button が送られる。
button.addTarget(button, action: "touchedMe:", forControlEvents: .TouchUpInside)

// Eventも渡す場合 :event: をつける
button.addTarget(button, action: "touchedMe:event:", forControlEvents: .TouchUpInside)

```

[Passing parameters to addTarget:action:forControlEvents](http://stackoverflow.com/questions/3988485/passing-parameters-to-addtargetactionforcontrolevents)
[Python]フォルダ内のファイルを取得する方法

python でフォルダ内のファイルを取得するにはglobを使用する

test1フォルダ内に下記のファイルがあるとき

>test1.log
>test2.log
>test3.log
>test1.txt
>test2.txt
>test3.txt
>test4.txt
>test10.txt
>test20.txt
>test30.txt

## すべてのファイルを取得する
```python
In [1]: import glob

In [2]: glob.glob('./test1/*')
Out[2]: 
['./test1/test2.log',
 './test1/test20.txt',
 './test1/test1.txt',
 './test1/test2.txt',
 './test1/test10.txt',
 './test1/test30.txt',
 './test1/test3.log',
 './test1/test3.txt',
 './test1/test4.txt',
 './test1/test1.log']
```

## 拡張子txtだけを取得する
```python
In [3]: glob.glob('./test1/*.txt')
Out[3]: 
['./test1/test20.txt',
 './test1/test1.txt',
 './test1/test2.txt',
 './test1/test10.txt',
 './test1/test30.txt',
 './test1/test3.txt',
 './test1/test4.txt']
```

## testのあとの数字が２桁のファイルを取得する
```python
In [4]: glob.glob('./test1/test[0-9][0-9].*')
Out[4]: ['./test1/test20.txt', './test1/test10.txt', './test1/test30.txt']
```
Unityでローカルサーバーと接続を試みるも接続拒否られ困った話

**場面**
・Unity側に「新規登録」、「ガチャ」、「ランキング」等サーバーとの連携で成せるであろう機能を付けたい。
・ローカルサーバー側（Laravel5）
・Unityとローカルサーバーの連携を図る

**実行**
自分:「よっしゃ、んじゃとりあえず軽くログインからやってみるか」

※コードを一部抜粋


```lang:SignUp.c
string url = "http://localhost:8000/hoge/hoge";
WWW www = new WWw();
yield return www;

if(www.error != null){
    Debug.Log(www.error);//残念ながらこっちに引っかかり悩むことに
}else{
    Debug.Log(www.text);//こっちに引っかかってほしい
}
```
Unityさん:「Failed to connect to localhost port 8000: Connection refused」
自分:「すいません・・・」

**解決策まで**

こんな感じでなぜかlocalhostのポート8000は接続させませーんとUnityさんが不機嫌になり
ログインできたのかどうかのAPIをサーバーが返す前にUnityさんに進捗を拒まれ2日間悩んでしまいました。

PHPのビルトインサーバーを起動を起動する際に
これまでは`php artisan serve`でサーバーを起動していたところを
解決策の決め手となったのは`sudo php artisan serve --host 127.0.0.1  --port=8080`に変更してからは見事サーバーへ接続させていただきました（Unityさんありがとう）

**今後**

今回の記事ではなぜ接続拒否から接続させてあげましょうになったのかの根拠を書いていません。
とりあえず接続させてもらった話ですので時間に余裕ができ次第なんで動いたのか等を調べていこうかと思います。

/etc/hostsの設定とかこれまで色々いじって変になっていたのかも？

**次回予告**
来年度からは、初めての試みでもあるUnity+laravel5で開発していた際の新しい発見（閲覧者からするとそうでもないかもしれません）をコツコツと投稿していくとともにここら辺の知見を広げていこうと思います！
Flaskで<input type="date">を使う

Flaskでフォームを使うために，wtformsを使うが，HTML5から追加された `<input type="date">`が使えなかったので，調べてみた．

これではダメで，

```py:model.py
from wtforms import DateField

date = DateField()
```

こうするとよい．

```py:model.py
from wtforms.fields.html5 import DateField
```

参考：http://stackoverflow.com/questions/19588393/datefield-is-not-rendered-as-type-date
kotlinによるvert.xラッパー(vertx3-lang-kotlin)を更にラップしてみるYO!

Kotlinのウェブフレームワークを探しているのですが、[vertx3-lang-kotlin](https://github.com/cy6erGn0m/vertx3-lang-kotlin)がなかなか良さそうです。
Vert.xのラッパーのようなので安定性やパフォーマンス面でも問題ないでしょう。

#vertx3-lang-kotlinによるHTTP処理
```kotlin
import io.vertx.kotlin.lang.*

fun main(args: Array<String>) {
    DefaultVertx {
        httpServer(8084, "0.0.0.0", Route {
            GET("/path") { request ->
                bodyJson {
                    "field1" to "test me not"
                }
            }

            otherwise {
                setStatus(404, "Resource not found")
                body {
                    write("The requested resource was not found\n")
                }
            }
        })
    }
}
```

簡潔ですしなかなかよいのですが、ルーター周りが分割もできなさそうだしあまり好みではない感じです。(主観)
僕は一般的なMVCフレームワークみたいに、コントローラクラスがルーター的な定義をあるていど内包する形式が好みです。

そこで、vertx3-lang-kotlinを更にラップして好みな感じにしてみました。
（vertxのオブジェクトも露出する前提なので、ラップしたというよりルーター部分を取り替えたという方が近いかも）
そのラップしたフレームワークを使ってコントローラの定義とサービスの実行などをする例がこちら。

```kotlin
package net.devneko.birdx

import io.vertx.core.Vertx
import io.vertx.kotlin.lang.json.object_

class MyController(handler: RequestHandler) : RequestHandler by handler {

    companion object Router {
        fun new(v:RequestHandler) = MyController(v)
        fun router() = BirdxRouter.new {
            get("/controller", { new(this).index() })
        }
    }

    fun index() {
        replyText("controller index")
    }
}

class MyAppService(val vertx:Vertx) {
    fun execute(param:String, resultHandler:(String)->Unit) {
        // 時間のかかる処理を非同期で実行
        vertx.executeBlocking<String>({ h ->
            Thread.sleep(1000);
            val result = param + param
            h.complete(result)
        },{ asyncResult ->
            // 結果をコントローラに返す
            resultHandler(asyncResult.result())
        })
    }
}

fun main(args : Array<String>) {

    val birdx = Birdx {
        router {
            get("/") {
                // パラメータを渡してサービスを実行
                MyAppService(vertx).execute(param("msg")) { result ->
                    replyText(result)
                }
            }
        }
    }

    // コントローラを追加できる
    val r1 = BirdxRouter()
    r1.get("/add",{
        replyJson {
            object_("a" to "b")
        }
    })
    birdx.addRouter(r1)

    // よくあるコントローラクラスみたいのも使える
    birdx.addRouter(MyController.router())

    // サーバー起動
    birdx.start(8080)
}
```

すっきりしない部分はあるものの、ルーター・コントローラー周りは分割しやすくなりました。

それにしてもKotlin,Vert.xの組み合わせはなかなか可能性を感じますので、これで小さなサービスでも作ってみたいですね。

一応GitHubにおいておきます。

[GitHub:dotneet/birdx](https://github.com/dotneet/birdx)

来年はKotlin飛躍の年となりますように。
ルート・パワー問題の高速化


[riverplus氏のルート・パワー問題](https://codeiq.jp/q/1563)。
`(1+sqrt(2)+sqrt(3)+sqrt(5))**n`を展開した時の整数項を答える問題。
log(n)ステップ必要で、行列解法だと(3つの素数が登場するので2\*\*3をTとすると)1ステップごとに、O(T**3)が必要である。これをO(T\*\*2)にすることができる。

以下、第n項と書く時、0-indexであるとする。

`(1+sqrt(2)+sqrt(3)+sqrt(5))**n`を展開した時に、`A+Bsqrt(2)+Csqrt(3)+Dsqrt(6)+Esqrt(5)+Fsqrt(10)+Gsqrt(15)+Hsqrt(30)`と表すことにする。
ここで、sqrt(5)の項をあえて第4項、すなわち2の冪番目に置いていることに注意。

第n項において、nの各ビットが立っていればその素数を因数に持つことを示す。
sqrt(10)は第5項なので、1+4。10は第1項の2と第4項の5の積ということ。
素因数分解の結果得られた集合を2進数にマッピングしているとも言える。第n項の値の素因数の個数は`popcnt(n)`個。

例えばFsqrt(10)とGsqrt(15)の積は、`5FGsqrt(6)`となる。
sqrt(10)は第5項すなわち集合`(2,5)`、sqrt(15)は第6項すなわち集合`(3,5)`である。
5FGsqrt(6)の5は(2,5)と(3,5)の共通集合を表すので第`5 and 6`項、6は集合(2,3)すなわち和集合から共通集合を除いたものなので第`5 xor 6`項の値ということができる。

これは一般化できるので、乗算は次のように定義できる。

```
T=[1,2,3,6,5,10,15,30]
M=10000000

def mult(x,y)
	a=[0]*T.size
	T.size.times{|i|T.size.times{|j|
		a[i^j]=(a[i^j]+T[i&j]*x[i]*y[j])%M
	}}
	a
end
```

あとは繰り返し二乗法を用いれば良い。

[Ruby 初版](https://github.com/cielavenir/codeiq_solutions/blob/master/kawazoe/tyama_codeiq1563.rb)
[Ruby 素数一覧からTを自動計算する版](https://github.com/cielavenir/codeiq_solutions/blob/master/kawazoe/tyama_codeiq1563_auto.rb)
[C++ 素数一覧からTを自動計算する版](https://github.com/cielavenir/codeiq_solutions/blob/master/kawazoe/tyama_codeiq1563_auto.cpp)

Rubyの自動計算版でA=[2,3,5,7];N=11とした結果が[WolframAlpha](http://www.wolframalpha.com/input/?i=%281%2Bsqrt%282%29%2Bsqrt%283%29%2Bsqrt%285%29%2Bsqrt%287%29%29**11)と一致したので大丈夫だと思います。。

### 追伸
1. 素数以外の平方根が問題に登場する場合にこの乗算が定義できるかどうかはまだ確かめていません。
1. [neko_the_shadowさんの答案](http://qiita.com/neko_the_shadow/items/5f44222639f44d55310a)はmult()を書き下したものです。
1. 平方根の性質から考えてビット演算に行き着くのは自然な流れだと思うのですが、違うのでしょうか…。実は行列を持ち出す考えには至ってないです。行列の第1列は私のプログラムで言うeに一致するのですが、理由がよくわかっていません。
1. `(a&b)+(a^b)==(a|b)`であることにいまさら気が付きました。
KickAssGUI - ArnoldをGUI上からkickする

#これはなに？
こちらの記事の続編的な内容です。
>Anorld Renderer でコマンドラインからレンダリング
>http://qiita.com/it_ks/items/8df11d56225512c79a57

Maya等を立ち上げずとも、コマンドライン上からArnoldにレンダリングしてもらうのが**kick**でした。
GUIからkickできるようにしたのが、今回試した**KickAssGUI**です。
Mayaとかを立ち上げたくはないけど、レンダリング時に設定は変えて試行錯誤したい、でも黒窓は怖い・文字ベースめんどい。
というとき向け(?)です。

#KickAssGUI 
Githubで公開されています。
Apache License。
Qt製。
実はダウンロードするまで**PySide製**だと思い込んでました(笑
制作者は crewshin さん。
アイコンが恐ろしいほどの存在感です。
![kickassGUI_icon.png](https://qiita-image-store.s3.amazonaws.com/0/102581/a487c1a6-3d32-e84a-a839-ce0b5b40e1df.png)

URL > https://github.com/crewshin/KickAssGUI

##使ってみた
![kickassGUI_screen.png](https://qiita-image-store.s3.amazonaws.com/0/102581/af5a82dc-6c27-8782-0816-b90e8c6775ed.png)
起動したところ。
Arnoldのインストール場所と、シェーダの場所を指定してから使います（図 左下の小窓がPreference）。

最上部のリストに **.ass ファイルを登録**して「Render」します。
最下部にはログがずらずら出力されます。
中間部が、kick時のオプションを指定する欄。出力解像度（画像サイズ）やサンプル数、レイトレの深度、レンダリング中にウィンドウを表示するかどうか、ガンマ、レンダリング時に無視する項目（テクスチャやシェーダを外す、ディスプレイスメントしない、など）、等の項目を指定してからkickできます。
ここで調整できるオプションはkickのオプションと同様で、それらは冒頭に挙げた先行記事に載せてます。

今回も、SolidAngle提供の.assファイルサンプルを使用しました（最下部）が
Mayaのシーンデータを.assに書き出して食べさせることも可能です。


#備考
##既知の疑問

とりあえずざっと触っただけというところなのですが、分からないことがいくつか。

- レンダリング結果をファイル出力できない？
- 「Clear on render」のチェックを外しても、レンダリング終了後にレンダリングウィンドウが閉じられてしまう？
- assリストに複数登録していても、ひとつしかレンダリングされない？

どこかに書いてありそうですが。
それかソースを見ればいいんですが(笑

##リンク

- **crewshin/KickAssGUI** : 
KickAssGUI is an open-source front end to the amazing Arnold Renderer from www.solidangle.com.
https://github.com/crewshin/KickAssGUI
- **.ass File Examples** : 
These files can be rendered using Arnold's command line renderer 'kick'. More information can be found here.
https://support.solidangle.com/display/ARP/.ass+File+Examples
[Cocoa]Cocoaの概念

<h1>クラスクラスタ</h1>

<p>複数の非公開具象クラスをまとめた公開抽象クラス。例を挙げるとNSNumberクラス。内部には、整数や浮動小数毎に実装されたクラスを用意しているが、インタフェーストして公開しているのは数値に対応したNSNumberクラス。</p>

<p>クラスクラスタの欠点を挙げるとすれば、公開抽象クラスのサブクラスを定義することが困難。</p>

<h1>クラスファクトリメソッド</h1>

<p>クラスファクトリメソッドの名前は、「+ (type)className...」となる。例を挙げると、例えば、NSDateクラスの場合は以下の通り。</p>

<pre><code>+ (id)dateWithTimeIntervalSinceNow:(NSTimeInterval)secs;
+ (id)dateWithTimeIntervalSinceReferenceDate:(NSTimeInterval)secs;
+ (id)dateWithTimeIntervalSince1970:(NSTimeInterval)secs;
</code></pre>

<p>ARCが広く使われるようになった現状では、allocとinitの二つのメソッドを呼ばないといけないので楽という利点しか感じられなくなったが、このメソッドの呼び出し側はオブジェクトを所有しない。つまり、autoreleaseされたインスタンスを返すという意味のメソッドだ。</p>

<h1>デリゲートとデータソース</h1>

<p>デリゲート（委譲）は、サブクラスを作成しないで、あるオブジェクトの処理を外に出す実装方法。</p>

<p>データソースは、デリゲートと似ていて、デリゲートがインタフェースの制御を委譲するものだが、データソースはデータの制御を委譲するものだ。</p>

<h1>イントロスペクション</h1>

<p>イントロスペクションは、オブジェクトの内容を調べる機能のことで、例えば、あるクラスのサブクラスなのかだとか、あるメソッドを実装しているか、あるプロトコルに純処しているか等だ。</p>

<p>ちょっと、純粋なオブジェクト指向言語に反する部分があると思うのだが、実用主義らしい、これによって柔軟な実装ができる便利な機能だと思う。</p>

<h1>オブジェクトの割り当て</h1>

<p>他の純粋なオブジェクト指向言語と異なり、インスタンスの生成などが言語でなくフレームワークで定義されているというのが、Cocoaの面白いところだ。</p>

<h1>オブジェクトの初期化</h1>

<p>「オブジェクトの割り当て」と重複するが、C++でコンストラクタ（構築子）と呼ばれるものは、NSObjectの実装ルールとなっている。</p>

<h1>Model-View-Controllerパターン</h1>

<p>Lisa Toolkitから受け継がれているAppleのクラスライブラリで重要視しているデザインパターン。著者がCocoaを始めた時は、具体的にどうするのかがピンとこなかったが、現在では、対応するクラスがフレームワークで用意されているなどで、このデザインパターンに沿いやすくなったと思う。</p>

<h1>オブジェクトモデリング</h1>

<p>初期のCocoaではモデルに対応するクラスがなかったが、CocoaバインディングやCoreDataが出た頃から、モデルの実装をサポートする機能が充実してきた。</p>

<h1>オブジェクトの可変性</h1>

<p>MutableとMutableでないクラスが用意されていることだ。</p>

<h1>アウトレット</h1>

<p>Interface Builderで接続される、他のオブジェクトの参照。インスタンス変数のことだ。</p>

<h1>Receptionistパターン</h1>

<p>キー値監視（KVO）などを使った、あるイベントに対応した処理を呼び出すようなもののこと。</p>

<h1>ターゲット-アクション機構</h1>

<p>対象となるオブジェクトのメソッドを呼び出す仕組み。例を挙げるとInterface Builderでコントローラでイベントが発生すると、接続したインスタンスのメソッドを呼び出すことだ。</p>

<h1>フレームワークの相互乗り入れについて</h1>

<p>Core FoundationとFoundationで、相互にデータを利用出来る仕組みで、Toll-Free Bridgingと呼ばれている。</p>

関連情報
<a href="http://qiita.com/advent-calendar/2015/cocoa/">Cocoa Advent Calendar 2015</a><br />
<a href="https://developer.apple.com/jp/documentation/CodingGuidelines.pdf">Cocoa向け コーディングガイドライン</a><br />
<a href="https://developer.apple.com/jp/documentation/CocoaEncyclopedia.pdf">Objective-Cプログラミングの概念</a><br />

【Cocoa練習帳】
<a href="http://www.bitz.co.jp/weblog/">http://www.bitz.co.jp/weblog/</a><br />
<a href="http://ameblo.jp/bitz/">http://ameblo.jp/bitz/</a>（ミラー・サイト）<br />
<a href="https://t.co/6P3h2jtbRk</a>note<br />
Vimのtermios制御におけるCBREAK modeの導入

この記事はVim Advent Calendar 2015の25日目の記事です。

今日は地味な話ですが、Vimのtermios制御において、CBREAK modeを導入したい、という主張をさせて下さい。

みなさんは、POSIX端末版のVimを起動した際に、例えば下図のような変な出力が画面に出てきてしまって嫌な思いをしたことがありませんか？

![xterm](https://cloud.githubusercontent.com/assets/1162739/6369447/d0fba520-bd29-11e4-9e9f-49b850953db3.png)

こういう現象がなぜ起きるかというと、Vimの[termios](https://linuxjm.osdn.jp/html/LDP_man-pages/man3/termios.3.html)制御(TTYドライバに対する制御)がヘボいからです。

Vimは基本的にRAW Mode(端末は制御文字でシグナルを生成せず、入力はエコーバックされず、バッファリングされない)で動作しているのですが、たまにCOOKED Mode(\<C-c\>等の制御文字でシグナルを生成し、入力はエコーバックし、バッファリングされる)で動くことがあります。
例えば、サスペンド時やvim scriptのsystem()をコールした時などです。
Vimはこの2つの端末モードを巧妙に切り変えているのですが、端末モードが2つだけしかないことで、ちょっと無理が生じています。

たとえば、vim scriptでsystem()関数が呼ばれると同時に、キー入力を受け取ってしまうと端末にゴミが表示される、という問題があります。(それを隠すために無駄にRedrawする処理を入れることがあったりして、美しくありません)

そこで、RAWとCOOKEDの中間の[CBREAK Mode](http://pubs.opengroup.org/onlinepubs/7908799/xcurses/cbreak.html)(端末はシグナル生成し、入力はエコーバックせず、バッファリングされない)を導入することを提案してみました。
詳細は、[vim_dev](https://groups.google.com/forum/#!msg/vim_dev/8ciQGDB-0Og/NiaJYwQHKF8J)へ投稿した[パッチ](https://gist.github.com/saitoha/9819c355445e269f87ff)をご欄頂きたいのですが、地味なパッチのせいかなかなか試してくれる方が現れず、しばらく進展がありません。

普段、入力のエコーバックを微妙なタイミング制御で回避するなどの工夫をされているプラグイン作者の方に、是非お試し頂きたいパッチです。
また、たとえば[tcap query](http://qiita.com/kefir_/items/384d83dfbbe8403a93be#%E3%83%95%E3%82%A7%E3%83%BC%E3%82%BA-3-%E5%BF%9C%E7%AD%94%E3%83%99%E3%83%BC%E3%82%B9%E3%81%AEtermcap%E8%A6%81%E6%B1%82)をせっかく真面目に実装した端末があるのに、そのユーザが不具合に遭遇して損をするという状況になっていますので、早めに改善をして頂きたい案件だと思っています。
[python] pypyで遊んでみる

#pypy
pypyはpythonを早く実行できるすごいやつ。
今回はpyenvでインストールしたpypy3を使ってみます。

#インストール
とりあえずインストールしてみる。

```pypy.install
$ pyenv install pypy3-2.4.0
$ pyenv shell pypy3-2.4.0
$ $ pypy
Python 3.2.5 (b2091e973da6, Oct 19 2014, 18:30:58)
[PyPy 2.4.0 with GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.51)] on darwin
```
入りました、pypy3-2.4.0のpythonのバージョンは3.2.5のようです。

#簡単な速度テスト
pypy3-2.4.0とpython3.2.5の速度をとりあえず比較してみます。
###簡単なコード、シンプルに$10^{10}$回イテレーションを回してみる

```simple_speed_test.py
import time
def time_test(func):
    def _time_test():
        a = time.time()
        func()
        return time.time() - a
    return _time_test

@time_test
def speed_test():
    for _ in range(10**10):
        pass

if __name__ == "__main__":
    print(speed_test())
```

まず、python3.2.5から

```test-1-python3.2.5
$ python --version
Python 3.2.5
$ python speed_test.py 
228.04035305976868 
```
普通におそいです。
次にpypy3-2.4.0で実行してみます。

```test-1-pypy3-2.4.0
$ pypy --version
Python 3.2.5 (b2091e973da6, Oct 19 2014, 18:30:58)
[PyPy 2.4.0 with GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.51)]
$ pypy speed_test.py 
8.809449911117554
```
すごく早いです。


###次に、ファイル読み込みをしてみます。
単純に、csvファイルを一行づつ読みこむだけの作業してみます。
1600000行、200MBのものを読み込んでみます。

```speed_test-2.py
@time_test
def load_text():
    for line in open('sample.csv'):
        pass 

if __name__ == '__main__':
  print(load_text())
```

まず、python3.2.5から、

```test-2-python3.2.5
$ python --version
Python 3.2.5
$ python speed_test.py 
0.9221069812774658
```
結構早いです。。。
次にpypyで実行してみます。

```test-2-pypy3-2.4.0
$ pypy --version
Python 3.2.5 (b2091e973da6, Oct 19 2014, 18:30:58)
[PyPy 2.4.0 with GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.51)]
$ pypy speed_test.py 
2.5766420364379883
```
今度はpypyの方が遅いですね。
こういった処理は苦手なようですね。

#まとめ

pypyは単純な計算をするときは早いようです。
自分よりちゃんとテストしてる人がいるので気になる人がいれば参考に
[\[Python\]\[PyPy\]PyPy3 2.4.0を使ってみた](http://d.hatena.ne.jp/nullpobug/20151031/1446283009)

しかし、モジュールが使えない場合があります。
numpy等はこのバージョンでは使えないっぽいです。
2系のpypyではnumpyも使えるようですが、試していません。

頑張れる人は、Cythonで書くのが良いと思います。
VS code + node.js でインテリセンスなコーディング


インテリセンス（IntelliSense）は、ドットを打ったらメソッドの候補などを表示するあれです。
開発効率がすごくあがるので、VS Codeで使えるといいなと思いました。

### node.js
https://nodejs.org/en/
### VS Code (VisualStudio code)



### Expressの導入
node.js環境のアプリケーションフレームワークとして有名なやつです。
これで、簡単なWebアプリケーションのテンプレートを作ります。

```
npm install -g express-generator
express myExpressApp
cd myExpressApp
npm install

```


### VS Codeで開く
fileメニューから、Openで myExpressApp ディレクトリを選択します。フォルダをドラッグ＆ドロップでも開けます。
この時点で基本的なIntelliSense機能は使えます。

`conso` までタイプすると、候補に console が出てくるし、ここでドットを打てば、 `console.log()`がすぐに出てきます。

とはいえ、expressのメンバー変数・関数をみたいなと思って`express` とタイプしても何も起きません。
プリミティブな型や、同一ファイルにだけ有効です。



### TSDの導入

TSD(TypeScript Definition manager) は、TypeScript(AltJSとして知られる）の定義ファイルを導入するツールです。

```
npm install tsd -g
```

TSDから、該当モジュールの定義ファイルを取得します。

```
tsd query node --action install
tsd query express --action install
```


これで表示されますよ！！

### 定義ファイルは十分あんの？

http://definitelytyped.org/tsd/ ここに掲載されてるのに


### 定義ファイルがないので困る・自作ライブラリなんだけど

webstormを使いましょう。 https://www.jetbrains.com/webstorm/
自分で解析してくれるので、定義ファイル不要です。
Fabric・Crashlytics の設定をレポジトリにコミットしないでJSONから読み込む


Fabric・Crashlytics は大変便利ですが、Fabric Mac app を使ってしまうと勝手にInfo.plistなどにapi keyなどの情報が書き込まれてしまいます。
このままだとパブリックなレポジトリにはコミットできませんし、開発用と本番用で使い分けたい時にも好ましくありません。

ですので、自分は

1. api key, build secretをjsonファイル書いておく
2. そのjson自体は.gitignoreに追加してレポジトリにはコミットしない
3. Build phaseのスクリプト、アプリ起動時にjsonファイルからapi key, build secretを読み込むようにする。



今回はFabric・CrashlyticsはCocoaPods を経由で利用していることとします。

```Podfile
...
pod 'Fabric'
pod 'Crashlytics'
```


```json:config/fabric.json
{
    "api_key": "api_key",
    "build_secret": "build_secret"
}
```

みたいなファイルを用意しておいて、xcodeプロジェクトにも追加しておきます。ただ、先述した通りgitレポジトリにはコミットしないようにしておきます。


その上で

起動時にfabric.jsonを読み込んで、Crashlytics.startWithAPIKey() にapi keyをセットします。

```swift:FabricConfig.swift
import UIKit
import SwiftyJSON

public class FabricConfig {
    private static let defaultApiKey = "api_key"
    public let apiKey:      String
    public let buildSecret: String
    public init(filePath: String) {
        let data                   = NSData(contentsOfFile: filePath)
        let jsonObject: AnyObject? = try? NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers)
        let json                   = JSON(jsonObject!)
        apiKey                     = json["api_key"].stringValue
        buildSecret                = json["build_secret"].stringValue
    }
```

```swift:AppDelegate.swift
let fabricConfig = FabricConfig(filePath: mainBundle.pathForResource("fabric", ofType: "json")!)
Crashlytics.startWithAPIKey(fabricConfig.apiKey)

```


次に、Build Phase -> Run scriptで`./Pods/Fabric/run`を実行してビルド情報をFabric・Crashlyticsのサーバに送信にします。

jsonから読み込んだapi key, build secretを`./Pods/Fabric/run`の引数に渡せばいいのですが、jsonをパースするのがだるいのでrubyで書きました。

```shell:RunScript
if [ -e config/fabric.json ]; then
    ruby scripts/fabric.rb
else
    echo "Running config/fabric.json is not found, do nothing."
fi
```

```ruby:scripts/fabric.rb

require 'json'

config = ""
open("config/fabric.json") do |io|
  config = JSON.load(io)
end

if config["api_key"] == "api_key" || config["build_secret"] == "build_secret"
  puts "Skip fabric script because the fabric.json is not set correctly."
  exit
end
run_command = "./Pods/Fabric/run"
success = system("#{run_command} #{config["api_key"]} #{config["build_secret"]}")
if success
  puts "Succeeded in running fabric script"
else
  puts "Failed to run fabric script"
end

```

これで、Fabric Mac appを使わなくてもCrashlyticsが利用できるようになりました。
また同様に、他の外部WebサービスのためのAPI Keyも同様にjsonから読み込むようにして、レポジトリにコミットしないようにしています。

開発用と本番用のapi keyをスクリプトからサクッと切り替えられるようにすることもできるのでいい感じです。

パブリックなレポジトリにコードを置いている方、
開発用と本番用でapi keyを分けたい方などは参考にしてみてください。

https://github.com/kumabook/MusicFav/
https://github.com/kumabook/MusicFav/blob/master/scripts/make.swift
https://github.com/kumabook/MusicFav/tree/master/config
マルチプロセスでもカジュアルにデータを共有したい - Test::SharedObject

こんにちは！
Perl5 Advent Calender無事に完走することができたようです。ありがとうございます！

拙作のモジュールの紹介をしたいと思います。

マルチプロセスでテストを行いたいケースがときどきあると思います。
たとえば、forkを管理するモジュールをテストしたい場合などです。
そのような場合、結果をプロセス間で共有したい場合があると思います。
そのようなケースで簡単かつアトミックに情報をプロセス間で共有できるのがTest::SharedObjectです。

具体的にはこんな具合で使うことができます。

```pl
use strict;
use warnings;

use Test::More tests => 2;
use Test::SharedFork;
use Test::SharedObject;

my $shared = Test::SharedObject->new(0);
is $shared->get, 0;

my $pid = fork;
die $! unless defined $pid;
if ($pid == 0) {# child
    $shared->txn(sub {
        my $counter = shift;
        $counter++;
        return $counter;
    });
    exit;
}
wait;

is $shared->get, 1;
```

`$shared` がコンテナになり、データを共有します。（実体はテンポラリファイルです。）
txnメソッドのコールバックの中はプロセス間でアトミックです。
コールバックの第一引数にコンテナのデータが来ます。returnした値でコンテナが更新されます。

このような具合にアトミックにデータの編集ができるとマルチプロセスのテストが楽に書けます。
ぜひご活用ください！
faviconもsvgにしようか！

![favicon.png](https://qiita-image-store.s3.amazonaws.com/0/66832/c839bcf1-877a-ebee-6c35-c5df02345d70.png)

この繊細さ、心地よいですね〜
( ´・ω・)つ旦

```html:IE&#32;フォールバック
<link rel="icon shortcut" href="./favicon.ico" type="image/x-icon">
```

```html:Firefox
<link rel="icon" sizes="any" href="./favicon.svg" type="image/svg+xml">
```

```html:Safari&#32;pintab&#32;&&#32;Chrome
<link rel="mask-icon" href="./favicon.svg" color="black">
```

svgでやらないか？
(๑•̀ㅂ•́)و✧
ビジネスサイドでやるにあたって引っかかるかなと思うSQLポイント

どうも、僕はwantedlyビジネスインターンをやらせていただいています。
wantedlyでは、ビジネスサイドのインターンでも検証環境DBへのアクセス権をもらえるので、
たまにクエリをうつことがあります。またRに繋いで解析したりもします。

とりあえずエンジニアではないですが、
そういう環境にいる人がクエリを打地帯と思った時に、段階的に引っかかるかなと思ったまとめです。
これらを越えればまあ一応知りたいことを知れるケースが多いのではと思います。

## JOIN
取りたい情報が一つのテーブルへのアクセスで済むケースは少ないです。
別れたテーブルの情報を統合するため、JOINすることが多いです。


## GROUP BY
テーブルをLEFT JOINなので連結した場合、そのままでは解析に使えることが少ないです。
GROUP BYで目的の項目ごとにリストをまとめ、SUMやCOUNTで集計することが多いです。

## サブクエリ
クエリの出力は、テーブルと同じように考えることができます（超大雑把ですごめんなさい）
サブクエリでテーブルの項目を絞ったり、目的の結果だけを元にまたクエリを打つ感じです。

## CASE WHEN ~
SQLにおいて、条件分岐はCASE WHENで行うことができます。
これのイメージがちょっとつくと、できることが広がると思います。

## まとめ
抽象的な話になりましたが、
逆に言うとここを乗り越えればエンジニアでなくても、
ある程度のことができるのではと思います。

僕自身初学者ですが、ポイントは上ぐらいだというつもりで、
取り組んでくれる人がいれば嬉しいです。
ガルーンのリンクについて

[脆弱性"&'<<>\ Advent Calendar 2015](http://www.adventar.org/calendars/811) 最終日の記事です。今年も無事全て埋まりました。ご協力ありがとうございました。

最終日だからといって特に面白いネタがあるわけでもないので、普通に書く。

一般的に、HTML中に外部から与えられる文字列を埋め込む場合は、`<`, `>`, `"`, `'`, `&`をエスケープすれば良い。このうち`&`については、エスケープしないと不具合になるが、脆弱性とはならない。ユーザーが`paste&copy`と入力すると`paste©`になってしまうが、これを悪用して何かができるわけではない。

`<a href=url>`の`url`の部分にユーザーの入力を埋め込む場合がこれの例外となる。`javascript:alert(location)`というURLを指定され、ページの閲覧者がこのリンクをクリックすると、サイトのオリジンでスクリプトが動作する。ブラックリストで`javascript:`を弾くという対処をしていた場合、`&`のエスケープを忘れていると、`j&#x61;vascript:`というように文字参照を利用することで回避されてしまう。

ガルーンのリンクがこれに近い状態だった。`&`のエスケープがなされておらず、`http:`と`https:`以外でコロンが含まれていればリンクが削除されるようだった。ただし、ちゃんと文字参照を解釈していたので、単純に`javascript&#x3a;alert(location)`を指定するだけでは弾かれた。しかし、ガルーンのリンクは空白を削除するという処理が行われていて、例えば、`http:// example .com`は`http://example.com`となる。この空白の削除が、悪意のあるリンク先を弾く処理の後というのが脆弱性だった。

POC: `javascript& #x3a;alert(location)`

<a target="_blank" href="https://qiita-image-store.s3.amazonaws.com/0/25276/cf0ee3a4-38af-c794-b495-a50c14f1254a.png"><img src="https://qiita-image-store.s3.amazonaws.com/0/25276/cf0ee3a4-38af-c794-b495-a50c14f1254a.png" width="320"></a> <a target="_blank" href="https://qiita-image-store.s3.amazonaws.com/0/25276/1a020135-46b1-a4c8-7850-d1366bc3b8a5.png"><img src="https://qiita-image-store.s3.amazonaws.com/0/25276/1a020135-46b1-a4c8-7850-d1366bc3b8a5.png" width="320"></a>

[安全なWebアプリケーションの作り方](http://www.amazon.co.jp/dp/4797361190)によると、URLに指定する文字列を`http://`, `https://`, `/`のいずれかから始まるもののみに限定して、HTMLエスケープをすれば良いらしい。このように実装するのが確実だが、ガルーンの場合は今でも`&`がエスケープされていないし、（`:`が含まれていなければ）`http://`から始まらないURLを設定することもできる。理由は推測するしかないけれども、`&`をエスケープすると古いブラウザで不具合があるとか、ガルーン内への相対リンクを指定できると便利だったりとかだろうか？

この状態でこの脆弱性を防ぐのはとても大変。`&#x3a;`を弾くだけではもちろんダメで、`&#58;`のように10進数にしたり、`&#x000000003a;`のように0を追加したりするという手がある。もしかしたら、`&#b111010;`のような2進数を解釈したり、`&colon;`のような実体参照が使えるブラウザがあるかもしれない。でも、脆弱性報奨金制度でさんざん突っつかれているだろうから、今さらこのような穴は残っていないはず。そう考えると、危険だけれども便利という方法を取れるのは、脆弱性報奨金制度を実施しているからこそかもしれない。

ちなみに、この脆弱性で他人を攻撃できる私が見つけた経路は、管理者しか追加できない共有リンクと、RSSリーダー機能で読み込ませる必要があるRSS中のリンク。さらに、ページを開くだけではなく、リンクをクリックさせないと発動しない。攻撃が難しいというのも危うい対策を取れる理由なのかもしれない。
apacheでhttp2を使う(h2c妥協版) 

apacheでhttp2を試してみようとして、
httpでは動いたものの、httpsでは上手くいかず
やむなく妥協したときの備忘録的メモです。

#事前準備
コンパイルにgccが必要なため、入れておく。

```
# yum install gcc
```

apacheのmod_http2を動かすためにはnghttp2が必要なので、インストール。

```
# tar zxvf nghttp2-1.5.0.tar.gz
# cd nghttp2-1.5.0
# ./configure
# make
# make install
```

確認用にhttp2対応したcurlもインストールしておく。

```
# tar zxvf curl-7.46.0.tar.gz
# cd curl-7.46.0
# ./configure
# make
# make install
```


#apacheのインストール
aprとapr-utilが必要になるので、先にインストールしておく。
(何なのかは良くわからない)

```
# tar zxvf apr-1.5.2.tar.gz
# cd apr-1.5.2
# ./configure
# make
# make install
```

```
# tar zxvf apr-util-1.5.4
# cd apr-util-1.5.4
# ./configure --with-apr=/usr/local/apr/
# make
# make install
```

pcreとopensslも必要なので、インストール。
(develの方)

```
# yum install pcre-devel
# yum install openssl-devel
```

apacheをインストール。

```
# tar zxvf httpd-2.4.17.tar.gz
# cd httpd-2.4.17
# ./configure --enable-http2 --enable-ssl
# make
# make install
```

configure時に、http2が有効になっていることを確認しておくこと。
(重要)

```
HTTP2 support:    enabled (nghttp2)
```

#http2を使うための設定

mod_http2を有効にするための設定(httpd.conf)

```
# vi /usr/local/apache2/conf/httpd.conf
```


```
## mod_http2のLoadModuleをアンコメント
LoadModule http2_module modules/mod_http2.so

## mod_http2を有効にするための設定(h2c)
<IfModule http2_module>
        Protocols h2c http/1.1
</IfModule>
```

apacheを再起動する。

```
# /usr/local/apache2/bin/apachectl restart
```

#動作確認

プロトコルにhttp2を指定して、curlでアクセスしてみると。。

```
# /usr/local/bin/curl -v --http2 http://localhost
```

以下のレスポンスヘッダが返ってきた。

```
* Rebuilt URL to: http://localhost/
*   Trying ::1...
* Connected to localhost (::1) port 80 (#0)
> GET / HTTP/1.1
> Host: localhost
> User-Agent: curl/7.46.0
> Accept: */*
> Connection: Upgrade, HTTP2-Settings
> Upgrade: h2c
> HTTP2-Settings: AAMAAABkAAQAAP__
>
< HTTP/1.1 101 Switching Protocols
< Upgrade: h2c
< Connection: Upgrade
* Received 101
* Using HTTP2, server supports multi-use
* Connection state changed (HTTP/2 confirmed)
* TCP_NODELAY set
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=27
< HTTP/2.0 200
< date:Fri, 25 Dec 2015 13:37:14 GMT
< server:Apache/2.4.17 (Unix)
< last-modified:Mon, 11 Jun 2007 18:53:14 GMT
< etag:"2d-432a5e4a73a80"
< accept-ranges:bytes
< content-length:45
< content-type:text/html
<
<html><body><h1>It works!</h1></body></html>
```

細かく見てみると。。

```
< HTTP/1.1 101 Switching Protocols
< Upgrade: h2c
・・・
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=27
< HTTP/2.0 200
```

確かに、HTTP2.0でレスポンスが返ってきている。
mod_http2では、HTTP1.1をHTTP2.0に
プロトコル変換するような動きになるようだ。

h2cの設定ではhttpがhttp2に変換されるとのこと。

http2ってssl必須だったような気がするが、
mod_http2はhttpでも使えるということなのだろうか。

httpsで動かすには別途sslの設定が必要だが、
なぜか上手く動かなかったので、
また再挑戦しよう。

以上m(_ _)m
Wantedly のサイト高速化開発合宿で得られた知見を公開！！！！

この記事は、Advent Calendar 24日目の記事です。
イブですねイブ！！

## Introduction
僕ら Wantedly のエンジニアは、12/21日、12/22日に開発合宿をしてきました！
今回の合宿の目標は「Wantedly 全体を20%スピードアップ」する事で、当初はかなり厳しい目標だと感じましたが、午前 6:00 までの不眠不休での頑張りにより、 28% のスピードアップに成功しました！！

## アプローチ
アプローチはシンプルで、NewRelic でサイト全体のパフォーマンスを確認して、ボトルネックを徹底的に潰しました。
Wantedly においては、募集を閲覧する画面である `projects/:project_id` へのリクエストが圧倒的に多く、サイト全体の 58% の時間が募集閲覧画面で使われていました。そこでまずは `projects/:project_id` に狙いを定めて、徹底的な高速化をおこなしました。

## 募集閲覧画面の高速化
募集閲覧画面を見たときに、まず気になったのはロードする JavaScript のサイズでした。Wantedly では共通で使われる JavaScript コードは出来るだけ結合して1つのファイルにして、ページを遷移した際にも同じ JavaScript を使う事でキャッシュにヒットさせる事を狙っていました。
しかし、 `projects/:project_id` のページ単体で見ると不要な JavaScript コードも多く含まれていた事、さらには `projects/:project_id` に関しては Facebook へのシェアなどで直接訪問するユーザーも多かった事から、必要な JavaScript コードに絞って読み込む事で、JavaScript の読み込みや実行にかかる時間を極力抑えるようにしました。
また、一部のコードにおいて `script` タグが html の途中で読み込まれて DOM の render がブロックされている箇所があったので、それも `最後に JavaScript を読み込む` ベストプラクティスに全てのページが強制的に従う仕組みを作りました。

## 募集ウィジェットの高速化
NewRelic でパフォーマンスを見ていて気付いたのが、「募集ウィジェットへのリクエスト」が極めて多い事でした。様々な箇所で募集ウィジェットの読み込みが行われている為、1つ1つの response は早いものの積み重なってサイト全体に対して大きな影響を持っていました。
募集ウィジェットについては、リソースを出来るだけ削除するアプローチをとりました。もともとは JavaScript で表現していた AutoLayout を css だけで表現する様に書き換えて、さらに css もサーバーサイドでレンダリングする html 内に style タグとして直接書き込むことで、css のリクエストを減らしました。
結果、元々高速なページでありながら、3分の1以下に DOMContentsLoaded time を削減する事が出来ました。

## まとめ
ボトルネックをきちんと把握してパフォーマンス向上対象を狙い撃ちする事で、劇的な高速化を達成できました。
アプローチ自体はありきたりなシンプルなものであるものの、きちんとボトルネックを捉える事の重要性を感じた 2日間でした。
[FPGA]"No Nios II target connection paths were located."のガイドライン[Cyclone III]

勘違いして勝手に泥沼にはまって、解決に時間がかかった場合は、備忘録を残すのがエンジニアの掟。

## 概要

+ [Altera社](https://www.altera.co.jp/)の[Cyclone III](https://www.altera.co.jp/products/fpga/cyclone-series/cyclone-iii/overview.html)というFPGAが載っているスターターキット「[DE0](http://solitonwave.shop-pro.jp/?pid=15835753)」でFPGAの修行中
+ Nios II EDSというEclipseベースの統合環境から、プログラムをFPGAに入れようとするも、"No Nios II target connection paths were located. Check connections and that a Nios II .sof is downloaded."というエラーが出て先に進めない。
+ 試したバージョンは、[Quartus II ウェブ・エディション v12.0 サービスパック 2](https://wl.altera.com/download/software/quartus-ii-we/12.0sp2/ja)

## 用語

+ ダウンロード ：　FPGA側に書き込むこと

## 確認事項

+ とりあえず再起動してみる
+ デバイスマネージャーでドライバ(Altera USB-Blaster)が最新かどうか確認
  +  FPGA側の電源が入っていない場合は表示されないので注意
  +  更新して「デバイス用のドライバーソフトウェアが最新であることが確認されました」と出れば最新。
+ 管理ツール→サービスで「Altera JTAG Server」が「開始」されているか確認
  + サービスが立ち上がっていない場合、"System Console: Error while discovering JTAG connections"というエラーになる。
  + そもそもサービス一覧に「Altera JTAG Server」がない場合、サービスの再インストールが必要
  + Quartus12については、Windows7 64bit環境でうまくサービスがインストールされない問題があるらしい [参考](http://www.alteraforum.com/forum/showthread.php?t=36775)
  + パッチを当てないといけないバージョン(Quartus12.0 sp1)があるが、パッチがダウンロードできないのでこのバージョンは使わない方がいい。[Quartus12.0 サービスパック 1 をご利用の方は、サービスパック 1をダウンロード後、パッチをダウンロードしてください。](https://wl.altera.com/download/software/quartus-ii-se/12.0/ja)（ここでのダウンロードは、インターネットからファイルを落とすの意味）
+ System ID Checksは無視する（Ignoreにチェックを入れる）
  + 無視しない場合でチェックに失敗すると、"Connected system ID hash not found on target at expected base address."というエラーになる。
+ 困ったときのgoogle先生
  + エラーと解決１[NiosII Software Builder Tools for Eclipse で以下のエラーが出る場合。](http://d.hatena.ne.jp/softsama/20150315/1426389695)
  + エラーと解決２[エラーが起きてNios2へのダウンロードができなかったため原因を探して解決](http://yound.hatenablog.com/entry/20120811/1344699021)
  + エラー事例１[USB-Blaster II 動作検証](http://www.elsena.co.jp/elspear/verification/veri12_3.html)
  + エラー事例２[Qsysを使ってみた](http://blog.goo.ne.jp/sim00/e/236d685cc29873571051270075449cac)

## 上記の確認事項全部確認したけど解決しない場合

+ Nios II EDSからのダウンロードをあきらめて、[NiosII Command Shellを使ったダウンロード](http://www.digitalfilter.com/devken/neekpro/logiana/logiana01.html)を試してみる
+ QuartusIIのProgrammerからはちゃんとUSB-Blaster見えてるしダウンロードできるが、Nios II EDSからは"No Nios II target～"のエラーメッセージが出て何も出来ない場合、勘違いしている可能性
  + QuartusIIのProgrammerから.sofファイルをダウンロード、その後「FPGA側の電源を落とさずに」Nios II EDS上から、プログラムを実行（Run/Debug）すると、FPGAに.elfファイルがダウンロードされ、動作が始まる。
  + 毎回、QuartusIIのProgrammerでダウンロードした後、電源を入れなおして、Nios II EDS上からプログラムをRunしていてエラーになってた。←これが大きな勘違い

## 何を勘違いしていたのか

+ Nios II EDSから、.sofファイル含めて一式全部FPGA側にダウンロードされるものだと思っていた。
+ 「何らかの理由でシステムが死んでいたり、programmerがJTAGをつかんでいて通信できなかったりといったときはRefresh Connectionsボタンを押しても復活しない」「Nios II EDSの再起動、パソコンのリブートで直るかも」というような文章があったので、再起動した後すぐにNios II EDSを立ち上げて、繋がらないエラーが出る、なんでかなーというのを繰り返していた。
+ 「NiosIIがFPGA内に無いと、ソフトウェアは実行できない」という文章をスルーしていた。意味をよく理解していなかった。

## まとめ

+ 「"No Nios II target connection～"が出るんです、助けて！」っていう書き込みがあって、その後反応がない掲示板をちらほら見かけるので、世界で数人は同じ勘違いで悩んでいるかもしれない。参考になれば。
Apache Sparkを勉強して分散処理できますよ！って言えるようになる その３


# 前回は[こちら](http://qiita.com/rtoya/items/ebafc8fbe5cdbdee6413)

# はじめに
本日は、実際にsparkの分散処理の手順を追いたいと思います。

# 準備
#### Virtual Boxの[インストール](https://www.virtualbox.org/)をする
#### Vagrantの[インストール](https://www.vagrantup.com/)をする
#### 仮想環境を構築する

```
$ mkdir vagrant_test
$ cd vagrant_test
$ vagrant init
```

#### Vagrantfileの編集をする
こんなんでいいはず。

```
Vagrant.configure(2) do |config|
 config.vm.box = "opscode-centos-6.6"
end
```

#### 動かしてみる
エラーがでなければおｋ。

```
$ vagrant up
```

#### 仮想サーバにssh接続してみる

```
$ vagrant ssh
```

その他の細かいことは[vagrantタグ](http://qiita.com/tags/vagrant)で調べると良い。
基本的なことは[この記事](http://ruby-rails.hatenadiary.com/entry/20150719/1437249020)を参考にした。

#### OSの設定を変更
この辺はプロビジョニングツールを使ったので説明を省略します。
`yum update`したり、ツール入れたりしました。
いいようにやってください。


# Spark環境をを仮想環境下に導入
 
#### Java JDKのインストール
- [ここ](http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html)から`jdk-8u65-linux-x64.rpm`ってやつをダウンロードする

- ダウンロードしたファイルを`Vagrantfile`のディレクトリに移動

```
$ mv Downloads/jdk-8u65-linux-x64.rpm vagrant_test
```

- `vagrant ssh`をして、仮想環境下にJava JDKをインストール

```
$ sudo yum localinstall /vagrant/jdk-8u65-linux-x64.rpm
```

#### Python

- pythonは既にインストールされてるのでそのまま使用

```
python --version
```

- pipだけいれとけば便利かも（僕は今回入れてないです＞＜）

#### Sparkをインストール

- Java JDKと同様にダウンロードしたファイルをVagrantfileと同じディレクトリに移動
- あとは[これ](http://qiita.com/rtoya/items/d80e59371832877fbbb1)と同じように解凍して使えばよい。

- 解凍したら適当な場所に移動

```
$ sudo mv spark-1.5.2/ /etc/spark
```

- 必要に応じてSparkの設定を調整する

# Sparkを動かしてみる
動かし方はSparkドキュメントの[Spark Standalone Mode](https://spark.apache.org/docs/latest/spark-standalone.html)を参照する.
今回は、localを`master`、vmを`slave`として動かしてみる



- masterサーバを動かす

```
$ sudo ./sbin/start-master.sh
```

- slaveを動かす
引数にはmasterのURLを渡す。

```
$ ./sbin/start-slave.sh <master-spark-URL>
```

- http://localhost:8080/ に接続すると色々情報は見れる。

masterのURLや現在のslaveの状況などが見れる。
ここに接続してslaveが動いていることを確認する

![スクリーンショット 2015-12-25 23.10.28.png](https://qiita-image-store.s3.amazonaws.com/0/18932/4a54f0e9-9284-ee77-47e1-ce54bc43c32d.png "スクリーンショット 2015-12-25 23.10.28.png")

- あとは普通に`spark-shell`などを実行し、処理をコマンドで叩けば良い。
その時に引数としてmasterのURLを渡す

```
$ ./bin/spark-shell --master <master-spark-URL>
```
Kami - process monitor. inspired by god.rb

[Go その3 Advent Calendar 2015 - Qiita](http://qiita.com/advent-calendar/2015/go3)の最終日25日目の記事になります。かなり遅いぎりぎりの時間ですみません。

* [erukiti/kami](https://github.com/erukiti/kami)

## God.rb -> Kami

Rubyに [God](http://godrb.com/) というプロセスモニタリングツールがあります。DSLで書いた設定に応じてプロセスを起動・監視し、対象が落ちていたら、立ち上げ直すような機能を持っています。Rubyも良い言語ではありますが、Goはプロセスモニタリングツールを記述するのに適した言語だと思います。

ということでGodのアイデアを元にGoでKamiというアプリケーションを作り始めました。[Electronを探す日常 - Qiita](http://qiita.com/erukiti/items/ce0e023e988b04b51d4b)という、別のアドベントカレンダーの記事を書いていたなぜか20日目の記事のはずが5日遅れという恐ろしい事態になっていたため、まだ作り始めたところです。

## どうやってKamiを作るのか

Goはワンバイナリのポータブルなアプリケーションを作成できるので、プロセスモニターに最適だと思うんですが、標準ライブラリはあまりOSに踏み込んだ機能は実装されていません。たとえばDaemon化機能なんかは望まれているものの標準にはありません。今回は時間の都合でDaemon化は棚上げにしておきます。

子プロセスの起動・制御などを見ていきましょう。

### exec.Command

細かく制御可能な子プロセス起動方法となると`os/exec`パッケージの`exec.Command`を使うことになります。

```go
	c := exec.Command("ls", "-al")
```

見ての通り、コマンドと引数を渡す形のインターフェースになります。戻り値は*Cmdで、Path, Args, Env, Dirなどのメンバーを持ちます。

#### c.Env

`Env`メンバーを操作することで任意の環境変数を持った状態で子プロセスが起動します。

```go
	c.Env = []string("HOGE=FUGA")

	c.Env = os.Environ()

	c.Env = append(os.Environ(), "HOGE=FUGA")
```

注意しなければならないのは従来の環境変数を維持するためには明示的に`os.Environ()`をたたき、現時点の環境変数を取得しておく必要があります。そこに追加なり修正なりする形で"NAME=VALUE"形式の文字列で指定する必要があります。

#### c.Dir

`Dir`メンバーをいじることで、実行時ディレクトリを変更することができます。未指定の場合はカレントは変わらず、そして相対指定の場合は親プロセス(つまり自分自身)のカレントからの相対になります。

```go
	c.Dir = "/"
```

#### 実行する

exec.Command()を実行するだけではただ初期化しただけに過ぎず、プロセスはまだ起動していません。`Run()`をする必要があります。

```go
	c.Run()
```

実は*Cmdには、`Process`というメンバーもあるんですが、`run`実行後じゃないと初期化されません。

```go
	fmt.Println(c.Process.Pid)
```

`Process`は、さらに`Pid`というメンバーを持っていてPIDを取得することができます。

#### 終了待ちをする

`Process`にはもう一つ重要な役割があります。`Process.Wait()`で、子プロセスの終了待ちを行います。ブロッキングをするのでGoRoutinで動かすのがよいかもしれません。

```go
	state, err := c.Process.Wait()
	if err != nil {
		fmt.Fprintf(os.Stderr, "? process wait error: %s\n", err)
		return
	} else {
		// 終了した
	}
```

stateはProcessStateで、終了したかを判定する`Exited()`なんかを持ちますが、Wait()でブロッキングをしているため意味があるのかは疑問です。ほかにいくつかあるメソッドにより終了時ステータス、実行時間などの情報を取得できます。

### pty

UNIXのプロセスはTTYと密着しすぎているため、PTY([擬似端末 - Wikipedia](https://ja.wikipedia.org/wiki/%E6%93%AC%E4%BC%BC%E7%AB%AF%E6%9C%AB))という仕組みを使って引きはがすことにします。GoでPTYを使うには、[kr/pty](https://github.com/kr/pty)が良さそうなのですが、一つだけ問題があって、stdoutもstderrもごちゃまぜにしてしまっているので、forkしてその点を修正してみたものが[erukiti/pty](https://github.com/erukiti/pty)になります。今回はこれを使います。

```go
    f, e, err := pty.Start2(c)
```

c.Run()の代わりにpty.Start2(c)をたたきます。fが標準入出力、eが標準エラー出力になります。プロセスモニタとしては出力内容はさほど気にすることはないのですが、godなんかは出力結果をファイルに出してくれるような機能があるので、Kamiにも実装してみたいと思います。

```go
	outfile, err := os.Create("cocoa.txt")
	if err != nil {
		panic(err)
	}
	defer outfile.Close()

	writer := bufio.NewWriter(outfile)
	defer writer.Flush()

	go io.Copy(writer, f)
```

## そんなわけで作成中です

[erukiti/kami](https://github.com/erukiti/kami)で、God.rbに変わるツールを作り上げたい、またその過程で子プロセス管理用のライブラリを作ってみたいと思っています。

それではごきげんよう。
ConohaVPSをレンタルしたので、Redmine初期をやってみた

#概要
VPSを選んで初期設定からRedmineを使えるようにするまでの手順メモ

#きっかけ
クラウドをうまく使ってRedmineをどこからでも見れるようにするにはどうしたらいいかなーと考えたところ、サーバレンタルよりもVPS使ってやるほうが自由度高いし、色々出来るところにしようと決めた感じ。

#VPS選び
用途はいろいろあるので、下記の記事を参考に。

[実際さくらのVPSとConoHaのVPSってどっちがおすすめなの？」さくらとConoHaあわせて累計200万円以上使っている僕が説明してみる](http://blog.tohuya.com/entry/2015/06/28/085518)

色々考えた結果、Redmine以外にサービス公開とかをしたいと考えたら後でプラン変更が柔軟なConohaVPSにしようと決め。

#初期設定
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/51580/3f26c401-569a-1d01-a622-863e34484f53.png)
イメージ選択でOSではなくアプリケーションにして、アプリケーションもその他からRedmineを選ぶだけ。簡単。
rootパスワードは入れておきましょう。
構築されるサーバのOSはCentOS 6.7でした。
redmineのインストールディレクトリは```/var/lib/redmine```でした。

##サーバ側の設定
rootでログインしてユーザ1つ作っておくといいでしょう。
作業者用にね。

```
adduser worker
passwd worker
gpasswd -a worker wheel  ←　管理者権限が必要な場合
```

##redmineを見てみる
ConoHaのコントロールパネルからサーバを選んで、VPS設定を見ると逆引きホスト名があるのでコピーしてブラウザに貼るだけ。

![redmine.PNG](https://qiita-image-store.s3.amazonaws.com/0/51580/b5e4d73a-1ce6-58b1-e0af-b7728419aa28.png)

ちゃんと表示できてる！

##redmineの管理者権限でログイン
初期設定状態で```admin/admin```でログイン出来る。

後はこの辺りを見ながら初期設定していく。
[Redmineを使い始めるための初期設定](http://redmine.jp/tech_note/first-step/admin/)

#何も考えないでもすぐ構築
後はやりたいことに合わせて、プロジェクトを作ったりしていけば自然と使えるはず。
DBへのアクセスの仕方とかまだ調べる必要があるけど、これでRedmineでタスク、TODO管理ができる！