OmniAICreator/Qiita-1.07M huggingface dataset:
Faster R-CNN + cudnn5.1.5 が動かない場合の対処法

# 症状
2016/12/25現在， Faster R-CNNをコンパイルし，動かす際に，以下の問題が生じる．

1. caffe-fast-rcnnのコンパイル時に下記のエラーがでてコンパイルできない

    ```type "int" is incompatible with parameter of type "cudnnNanPropagation_t"```
2. 上記エラーになんとか対処しても、実行時に下記のエラーがでて停止する

    ```
  File "/mnt/mqs02/home/ahashimoto/py-faster-rcnn/tools/../lib/rpn/proposal_target_layer.py", line 167, in _sample_rois
    fg_inds = npr.choice(fg_inds, size=fg_rois_per_this_image, replace=False)
  File "mtrand.pyx", line 1070, in mtrand.RandomState.choice (numpy/random/mtrand/mtrand.c:8044)
TypeError: 'numpy.float64' object cannot be interpreted as an index
```

# 症状1の原因
- おそらく，まだfast-rcnnが最新のcudnn (cudnn5.1.5)に対応していないため，型の不一致によるエラーが起きている．

# 症状1への対処方法
- 最新のcaffeは対応しているので，それをマージする．
- 参考にしたページ: https://github.com/rbgirshick/py-faster-rcnn/issues/237

- 手順(faster-rcnnのルートディレクトリで実行)
　1. 最新のpy-faster-rcnnのリポジトリで以下を実行し，最新のcaffeとfast-rcnnをマージする．　

    ```
　cd caffe-fast-rcnn  
　git remote add caffe https://github.com/BVLC/caffe.git  
　git fetch caffe  
　git merge caffe/master
```
　2. include/caffe/layers/python_layer.hppを開き，下記の記述を消去

    ```self_.attr("phase") = static_cast<int>(this->phase_)```

　3. caffe-fast-rcnnをコンパイルする．

# 症状2の原因
同じタイミングでnumpyのバージョンアップにも対応が必要になっている??
# 症状2への対処方法
- エラーを起こしているpythonのコードを手動で修正する
- 参考にしたページ:https://github.com/rbgirshick/py-faster-rcnn/issues/13

- 手順(faster-rcnnのルートディレクトリで実行)
    1. 該当ファイルを開く
    ```vim lib/rpn/proposal_target_layer.py```
    2. 1箇所目(167行目付近)の修正する．
        - 変更前
        
            ```
if fg_inds.size > 0:
　　　　　　　　　　　　　　　　fg_inds = npr.choice(fg_inds, size=fg_rois_per_this_image, replace=False)
```
        - 変更後

            ```
if fg_inds.size > 0:
　　　　　　　　　　　　　　　　fg_inds = [int(v) for v in fg_inds]
　　　　　　　　　　　　　　　　fg_inds = npr.choice(fg_inds, size=int(fg_rois_per_this_image), replace=False)
```
    2. 2箇所目(1７８行目付近)の修正する．
        - 変更前
        
            ```
if bg_inds.size > 0:
　　　　　　　　　　　　　　　　bg_inds = npr.choice(bg_inds, size=bg_rois_per_this_image, replace=False)
```
        - 変更後

            ```
if bg_inds.size > 0:
　　　　　　　　　　　　　　　　bg_inds = [int(v) for v in bg_inds]
　　　　　　　　　　　　　　　　bg_inds = npr.choice(bg_inds, size=int(bg_rois_per_this_image), replace=False)
```
C++ Builder XE4, 10.2 Tokyo > TMemo > 指定の行が見えるように行を移動する

```txt:動作環境
C++ Builder XE4
RAD Studio 10.2 Tokyo Update 2 (追記: 2017/12/28)
```

TMemoにて指定の行に移動したい。
delphi実装は見つかった。

https://www.experts-exchange.com/questions/20102061/Move-to-Memo-line-number.html
>Expert Commentby:DMN
>ID: 5989403・2001-04-05
>Another one: works for TMemo, TRichEdit and any other TCustomEdit >descendant...
>
>procedure GotoLineNo(Control:TCustomEdit;LineNo:integer);
>begin
>  Control.SelStart := Control.Perform(EM_LINEINDEX,LineNo,0);
>  Control.Perform(EM_SCROLLCARET,0,0);
>end;
>
>Enjoy! :)

C++ Builder実装にした。

```Unit1.cpp
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	int moveTo = 10; // 移動先のインデックス (0始まり)

	Memo1->SelStart = Memo1->Perform(EM_LINEINDEX, moveTo, 0);
	Memo1->Perform(EM_SCROLLCARET,0,0);
}
```

以下において、スクロール付きのTMemoはMemo1というnameプロパティ。

Memo1のLinesは以下としてみた。

```
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
```

### 実行手順1

1. 「15」が見えるところまでスクロールする
2. Button1を押下

以上により「10」が見える行に移動する。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/91f1e400-0273-b690-33a6-faef03e88325.png)

### 実行手順2

「0」が見える行に移動してからButton1を押した場合は以下となる。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/9b9f1f7b-2142-fe87-bf51-55906ceac7b8.png)

つまりは、例では「10が見えるように移動する」だけであり、「10という行が一番上に来るように移動する」**ではない**。
Apple PushのトークンをFirebase Cloud Messagingのトークンへ変換する

[Firebase Cloud Messaging](https://firebase.google.com/docs/cloud-messaging/?hl=ja) は iOS と Android の両方に、単一のAPIでプッシュ通知を送信できます。

各OS への SDK 組み込み:
https://firebase.google.com/docs/cloud-messaging/ios/client
https://firebase.google.com/docs/cloud-messaging/android/client

サーバからプッシュ通知を送信する API:
https://firebase.google.com/docs/cloud-messaging/downstream

もちろん、各OSでプッシュ通知の機能が少し違うので、それぞれに向けたパラメータも用意されています:
https://firebase.google.com/docs/cloud-messaging/http-server-ref#header

Go で Firebase Cloud Messaging でプッシュ通知を送信するクライアントも作ってみました [github.com/najeira/fcm](https://github.com/najeira/fcm) 。

## iOSの従来トークンからの変換

さて、Firebase の SDK を組み込むことでアプリから Firebase Cloud Messaging のトークンを取得できますが、いままで取得した APNs のトークンを活用したい場合は以下の API で変換できます。

https://developers.google.com/instance-id/reference/server#create_registration_tokens_for_apns_tokens

これは Google Cloud Messaging の API ですが、Firebase Cloud Messaging と統合されたので、この API で得られたトークンをそのまま使うことができます。`Authorization` ヘッダーに入れる API Key も Firebase のもので OK です。

Go 用の変換処理は [github.com/najeira/convert_apns_to_fcm](https://github.com/najeira/convert_apns_to_fcm) こちらに書いてみました。

見ればわかりますが、単純な JSON API なので、他の言語で実装するのも簡単だと思います。

----

いままで iOS と Android で別に管理していた処理をひとつの API に統合できるので、実装も運用もシンプルになりますね！
Siv3D のちょっとした便利機能

[Siv3D Advent Calendar 2016](http://qiita.com/advent-calendar/2016/siv3d) 25 日目の記事です。
Siv3D のあまり知られていない便利機能を紹介します。

## 1. ログに画像を出力
`LOG( )` で出力できるのは文字列や数値だけではありません。

```cpp
# include <Siv3D.hpp>

void Main()
{
	while (System::Update())
	{
		if (Dragdrop::HasItems())
		{
			if (const Image image{ Dragdrop::GetFilePaths()[0] })
			{
				LOG(image);
			}
		}
	}
}
```
![25-1.png](https://qiita-image-store.s3.amazonaws.com/0/30255/4e4ca19a-b8ef-fd67-8f77-0fd4863f39e9.png)

自分のプログラムで実行時に画像がちゃんと生成されているかをデバッグウィンドウから確認したいときに使えます。
同時に HTML ログには縮小された画像が出力されます。`Logger::SetMaxImageSize()` や `Logger::SetImageQuality()` を使うと、HTML 出力時の画質や画像サイズを設定できます。

## 2. 標準入出力
`Console::Open()` を使うとコンソールウィンドウが開き、C++ 標準入出力の `std::cout`, `std::cin` が使えます。

```cpp
# include <Siv3D.hpp>

void Main()
{
	Console::Open();

	std::cout << "数を入力してください > ";

	int32 n;

	std::cin >> n;

	Console::Close();

	const Font font(80);
	
	while (System::Update())
	{
		font(n).drawAt(Window::Center());
	}
}
```

`String` の入出力には `std::wcout`, `std::wcin` を使います。

```cpp
# include <Siv3D.hpp>

void Main()
{
	Console::Open();

	std::wcout << L"名前を入力してください >";

	String name;

	std::wcin >> name;

	Console::Close();

	const Font font(80);
	
	while (System::Update())
	{
		font(name).drawAt(Window::Center());
	}
}
```

## 3. コマンドライン引数を受け取る
エクスプローラ上でアプリに別のファイルをドロップして起動した場合、2 番目のコマンドライン引数以降にそれらのファイルパスが格納されます。
アプリのアイコンに画像をドロップするとそれが表示されるプログラムは次のように作れます。

```cpp
# include <Siv3D.hpp>

void Main()
{
	const Array<FilePath> args = CommandLine::Get();
	
	Texture texture;

	if (args.size() >= 2)
	{
		texture = Texture(args[1]);
	}

	while (System::Update())
	{
		if (texture)
		{
			texture.draw();
		}
	}
}
```
![25-3.gif](https://qiita-image-store.s3.amazonaws.com/0/30255/ea244380-55cd-1116-72ce-e0be2a6220f3.gif)

## 4. 日付と時刻のフォーマット
`Date::format()` や `DateTime::format()` は、日付や時刻をいい感じに文字列化してくれます。
現在時刻にもとづいて、ユニークなテキストファイルを作りたい場合は次のようにします。
`yyyy` 等のフォーマットルールはヘッダのドキュメントを参照してください。

```cpp
# include <Siv3D.hpp>

void Main()
{
	const FilePath path = L"Save/"
		+ DateTime::Now().format(L"yyyy-MM-dd_HHmmss_SSS")
		+ L".txt";

	TextWriter writer(path);
}
```

![25-4.png](https://qiita-image-store.s3.amazonaws.com/0/30255/6d0d5d58-f8f2-4814-aa30-f45271a40536.png)

今年も Siv3D Advent Calendar が完走できました。
皆様、良いお年をお迎えください。
UITableViewCellでAutoLayoutを使ったときに出る警告

UITableViewでAutoLayoutを使う時は、`UITableViewAutomaticDimension`を使い高さ計算を自動でやると思います。
その時に一覧画面でよくあるようなこのようなCellを作ると
@3x端末のみ警告が出る場合があります。

![スクリーンショット 2016-12-25 12.47.23.png](https://qiita-image-store.s3.amazonaws.com/0/107427/4b1ff2fa-c591-bbd2-9afc-8776fc97499f.png)

```
class CustomCell: UITableViewCell {
    let iv: UIImageView = {
        let iv = UIImageView()
        //初期化処理
        return iv
    }()
    
    let label: UILabel = {
        let label = UILabel()
        //初期化処理
        return label
    }()
    
    override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        
        contentView.addSubview(iv)
        contentView.addSubview(label)
    }
    
    func setupConstraints() {
        let margin = 10
        
        iv.snp.makeConstraints { (make) in
            make.top.left.bottom.equalToSuperview().inset(margin)
            make.size.equalTo(50)
        }
        label.snp.makeConstraints { (make) in
            make.top.right.equalToSuperview().inset(margin)
            make.left.equalTo(iv.snp.right).offset(margin)
            make.bottom.equalTo(iv)
        }
    }
}
```

```警告
[LayoutConstraints] Unable to simultaneously satisfy constraints.
Will attempt to recover by breaking constraint 
<SnapKit.LayoutConstraint:0x6080000a8f40@ViewController.swift#79 UIImageView:0x7fdd23604d70.height == 50.0>
```
※snapkitを使っているためStoryBoardの時とは微妙に警告は違います。

## 原因
Cellの`layoutSubviews()`にてframeのサイズを見ればわかりますが、TableViewが罫線を追加するところで値がおかしなっているため制約を満たせなくなってるためです。
本来罫線は1pxなので0.3333333333にになるはずだけど、
小数点第6位からおかしくなってるのは内部的な数値の扱いは32bit？

```
// 1回目(制約通りにサイズが大きくなってるのでエラーなし)
self:(0.0, 0.0, 414.0, 70.3333333333333)
contentView:(0.0, 0.0, 414.0, 70.0)

// 2回目(微妙に小数点がずれているため制約を満たせなくなる)
self:(0.0, 0.0, 414.0, 70.3333358764648)
contentView:(0.0, 0.0, 414.0, 70.0000025431315)
```

## 対処法
微妙に数値がおかしくなるので、どこか一つのPriorityを下げておくだけです。

```
1:どこか一つのpriorityを下げる
iv.snp.remakeConstraints { (make) in
    make.top.left.equalToSuperview().inset(margin)    
    make.bottom.equalToSuperview().inset(margin).priority(UILayoutPriorityDefaultHigh)
    make.size.equalTo(50)
}

2:どこか一つをequalToSuperviewの代わりにlessThanOrEqualToSuperviewを使う
iv.snp.remakeConstraints { (make) in
    make.top.left.equalToSuperview().inset(margin)
    make.bottom.lessThanOrEqualToSuperview().inset(margin)
    make.size.equalTo(50)
}
```
C++ Builder XE4, 10.2 Tokyo > A,B,C,D / 1,2,3,4 をA,1[改行]B,2[改行]C,3[改行]D,4[改行]に変換する実装

```txt:動作環境
C++ Builder XE4
RAD Studio 10.2 Tokyo Update 2 (追記: 2017/12/28)
```

```
String line1 = L"A,B,C,D";
String line2 = L"1,2,3,4";
```

上記の文字列を与えられた時に以下のようにdstPtr(:TStringList)に取得したい。

```
A,1
B,2
C,3
D,4
```

`#include <memory>`を追加して、以下を足す。

```cpp
//---------------------------------------------------------------------------
// ファイルスコープstatic関数
//
static void __fastcall matrixTranspose(String srcStr1, String srcStr2, TStringList *dstPtr)
{
	// 以下のように変換する
	//
	// 入力例
	//   srcStr1: A,B,C,D
	//   srcStr2: 1,2,3,4
	// 出力例 (dstPtr)
	//  A,1
	//  B,2
	//  C,3
	//  D,4

	if (dstPtr == NULL) {
		return; // error
	}
	if (srcStr1.Length() == 0 || srcStr2.Length() == 0) {
		return; // error
	}

	std::unique_ptr<TStringList> srcSL1(new TStringList);
	srcSL1->StrictDelimiter = true;
	srcSL1->Delimiter = L',';
	srcSL1->DelimitedText = srcStr1;

	std::unique_ptr<TStringList> srcSL2(new TStringList);
	srcSL2->StrictDelimiter = true;
	srcSL2->Delimiter = L',';
	srcSL2->DelimitedText = srcStr2;

	if (srcSL1->Count != srcSL2->Count) {
		return; // error
	}

	String line;
	for(int idx=0; idx < srcSL1->Count; idx++) {
		line = srcSL1->Strings[idx] + L"," + srcSL2->Strings[idx];
		dstPtr->Add(line);
	}
}
```

**注意: 綺麗な実装ではない。
優秀なエンジニアになるためのオススメ学習方法

# 結論
**教えてもらう ＜ 自分で学ぶ ＜ 自分の手を動かす ＜＜＜ 教える**

命短し精進せよ技術者達。チョロっと本を読んで勉強した気になっている場合ではないのです。
「ちゃんと勉強してますか？」って聞かれたら何と答えますか？
「してます」と答えようものなら「どんな勉強をしていますか？」と聞かれてシドロモドロするのがオチなのです。
それでは参りましょう、効率別「学習手法」のまとめです。

## 授業を受ける
**効率：★☆☆☆☆**
まったく知らない分野を学ぶ時は有効な学習方法ですが、復習もせずに放置すると３日経ったら忘れてしまいます。
学校教育でよく採用されているスタイルですが、浅く広い知識を興味もない人に教えるには効率的な手法なので採用されているだけです。
社会人技術者で授業形式のセミナーを受けている時点で、興味もあるし深い知識を必要としているはずです。１度受けて概要を掴めたらさっさと次のステップに進みましょう。

## 本を読む
**効率：★★☆☆☆**
技術書は「知識を得る」ためのものではなく「自分が知らなかったことを発見する」ためのものです。
一見、自発的、能動的に見えて、実はだいぶ受動的な作業です。これだけだと学習効率はたいして高くありません。本で「勉強」したあとは「訓練」までしっかりやっておきましょう。
また、書店で平積みされているような本はだいたい入門者向けです。読むなら棚に縦置きされている中級者以上向けのちょっと高い本を狙って読みましょう。

## 自分で動作環境を構築して試す
**効率：★★★☆☆**
自分の手を動かして成果がでるところまでやりきると、しっかりと身に付きます。兎にも角にもやってみましょう。
とりあえず動作させるまででも様々な派生知識が必要になり、実際に動作させることでその技術の特性を知ることができます。

## 完成を作り客観的に評価してもらう
**効率：★★★★☆**
ここまでくると実績として認められます。悪いところがあれば指摘してもらえるようになります。
もしかしたらどこかから斧が飛んでくるかもしれませんが、うまく避けて経験値を獲得しましょう。

## 教える
**効率：★★★★★**
さすがに間違ったことを教えるわけにはいきません。必然的に必死に勉強して裏を取ることになります。
業務として教えることになると、さらに輪をかけて難易度が跳ね上がります。本当に必要なことだけ抽出、厳選し、60分で終わる量になるよう調整までしなければいけません。しかし、これができるようになればお賃金アップ間違いナシです。

# 意識高い系エンジニアにならないために必要なこと

「意識高い系」とは、「意識高い」人の外面だけ真似して中身が伴わない人のことです。
そうならないためのたった一つの方法がこちら。

**「金を賭けて学ぶ」**

リピートアフターミー。

**「金を賭けて学ぶ」**

アンダースターン？
「掛ける」ではなく「賭ける」となっているところがポイントですよ。学習とは投資ですからね。
別に自分の金でなくてもいいのです。会社の金でもいいのです。むしろ会社の金でやりましょう。
意識高い人と意識高い系の差は、自分の学習成果に対して責任を負っているかどうかなのです。
お金をたくさん賭けてスキルアップを重ね、社運を賭けたプロダクトを任されるエンジニアを目指しましょう。

それではよいお年を。
Linuxよく分からないけど、ラズベリーパイが好き

Raspberry Pi Advent Calendar 2016の12月25日を担当します！
http://www.adventar.org/calendars/1341

今年、はじめて何も知らないままラズパイを買ってみました。
ラズパイ3です。Bluetoothも使えるようになったので、マウスもキーボードも配線なしでつなげて助かります。

ラズパイの魅力は、私が語るまでもないのですが、本当、教育用と言われてるだけあって、Linuxもpythonも勉強できるという、この手のひらのARMプロセッサを搭載したシングルボードPCにIOTへの未来さえも感じます。

19歳の時、チップを見て涙を流した孫社長みたいに、
http://logmi.jp/153432
ラズベリーパイを手にしてるだけで幸せを感じます。

2016年は、ラズベリーパイを触ることで、Linuxの勉強をはじめるきっかけにもなってよかったです。もっと、ターミナルと仲良くなりたいです。黒い画面怖いから少しずつ卒業できたかなぁと思うこの頃ですが、まだまだ分からないことだらけであります。
コマンドを入力することで、そのとおりの処理をしてくれる、ラズパイがかわいくて、調子にのって、もしかしたら、これを使えば、人工知能とか作れるんじゃないのとか、ふとぼんやりと思ったりもしながら、pythonの勉強もはじめてます！（オライリーさんのゼロから作るDeepLearningを読み始めてただいま挫折中）

2017年は読み上げロボットとかを、ラズベリーパイで自作できたらいいなぁとか思う、
2016年12月クリスマスです♪

![ラズパイ.jpg](https://qiita-image-store.s3.amazonaws.com/0/131990/d0bd834c-920c-9dd2-d9b0-e1f205d2f955.jpeg)
決めにくいことに決断を出していく方法

決めにくいことをある段階で決断しなくてはいけないことは日常的にあります。 

例えば以下のような事柄です。

- 友人・職場の人・お客さんと1, 2ヶ月先に何か約束する場合
  - (´-`).｡ｏO(約束してもいいけど、後にもっと大事な予定が入ったらどうしようかな
- 職場を変えるべきか否か
  - (´-`).｡ｏO(今の職場もいいけど何か物足りないから転職しようかな
- A と B があってどっちも甲乙つけがたいけどどっちかに決める
  - (´-`).｡ｏO(どっちでもいいんだけどどうしよっかな...

決断する要素にかけて踏ん切りが付きにくいような状況では特に決めにくいと思います。

一つ一つの決断に対して大量の脳のリソースを使用してどっちがよりよい選択なのかを考えていると疲れてしまいます。

そのような疲れた状態ではいざという時によりよい選択ができずに楽な方、あるいはいつもの同じ選択を行ってしまいがちです(大変な方、いつもと違う方法が良い選択になりがちと言うのは色々なところで聞いたことがあると思います)。

そのような疲れを回避しながら決断をしていく秘訣を紹介します。

## 秘訣

1. 別の分かりやすいことに置き換える
2. 脳裏に浮かんだことを観測する

1 はなんとなく分かると思います。難しい問題に直面したときは別の事柄に置き換えて考えてみる方法です。

2 は難しいのですが、あることをした時に自分がそれに対してどのような反応を示したかを自分自身で観測する手法です ([この記事で紹介されているファストとして紹介されている感覚を観測します](http://qiita.com/ryohey/items/d86e51d45c8c7846c8a10))。 

以下では、先に挙げた各シチュエーションに対してどのようなテクニックが使えるか紹介したいと思います。

## 1, 2ヶ月先に何か約束する場合

1,2 ヶ月先の予定のは開いているから安易に約束しがちですが、その時になると忙しくて後悔するみたいな経験があると思います。 あるいは後からもっと重要な予定が入ってしまうなど。

どのように優先順位を付けて約束すればよいのかを紹介します。

### テク: 来週だったらどうするか？

1,2 ヶ月先は来週と同じぐらい忙しい可能性が高いので、来週だったらその予定を受け入れられるかどうか問題を置き換えてみるテクニックです。

### テク: もしも既に予定が入っていたらどう思う？

「約束の日に既に予定が入っていたら？」 と想像したときに脳裏に浮かんだことを観測します。

嬉しいと思ったら断る、残念と思ったら約束するという簡単な判断材料にできます。

### テク: キャンセルエレーション

先の方法に似ていますが、一度約束をしてそのあとに相手が予定をキャンセルしてきた場面を想像して、脳裏に浮かんだことを観測します(実際に約束する前にやってくださいね)。

これも嬉しいと思ったら断る、残念と思ったら約束するという簡単な判断材料にできます。

## 職場を変えるべきか否か

今の職場に不満があって、転職したい。 or 別の領域に興味があって転職したいなどなど考えることがあると思います。

(特に初めての場合)転職は非常にハードルが高くて決断が難しいと思います。

そんな場合、少しパワフルですが以下のようなテクニックが使えます。

- `1ヶ月程度、転職してみたい領域にボランティアでとして働いてみる` と想像します
- 脳裏に浮かんだことを観測します
- ポジティブな印象だったら、実際にボランティアでもなんでも良いので行動に移す
- ネガティブな印象だったら恐らく転職してもうまくいかないので現状維持の方がいいかも

## A と B のどっちかに決める

甲乙つけがたい A, B の場合、１週間でも1ヶ月でも悩んでしまうと思います。

高価な買い物をする場合にありがちです。

そのように悩んでる状況をとても楽しく過ごせるのならいいのですが、頭痛の種になるほど悩んでしまうと脳が疲弊してしまうので決断を急ぐべきです。

そんな場合に使えるのが "コイントス" というテクニックです。

表なら A、 裏なら B という風に予め決めておきます。

決断が揺れないようにするためにきちんと紙に書いておくと更に良いです。

そして実際にコイントスをします。

コインが着地する直前にどちらが良いか脳裏に浮かぶのでそれを観測します。

## まとめ

決めにくいことを決断していく方法を幾つか紹介しました。

他人に意見を求めるのも重要な手なのですが、最後は自分自身で決断する必要があるので今回はあえて個人で完結する方法についてのみ取り扱いました(友達と約束するかどうか毎回他人に相談していたら迷惑ですよね)。

１つ注意なのですが、今回の方法は正しい決断をする方法ではなく、決断を行う方法ですのでその辺はご注意ください。


## 参考文献

> [アリエリー教授の人生相談室　行動経済学で解決する100の不合理](http://amzn.to/2iqqexj)
最低限の知識で gitbook を利用する

さて [gitbook](https://www.gitbook.com) である。

2014年くらいの流行りネタな気もするが、使ってみて便利だったので自分向けのメモを残しておくことにする。

gitbook は markdown 形式で保存したテキストから下のような体裁のコンテンツを生成するサービスである。

![スクリーンショット 2016-12-25 13.13.34.png](https://qiita-image-store.s3.amazonaws.com/0/17911/2bf01207-771a-3bc2-f487-fee73ddee0dc.png "スクリーンショット 2016-12-25 13.13.34.png")

Webサービスなのだがコマンドラインツールも提供されている。ここで扱うのはコマンドラインツールの方だ。

[ドワンゴさんのScala研修テキストがこれで作成されている](https://dwango.github.io/scala_text/)のをきっかけに関心を持ったもの。

# インストール

gitbook-cliをインストールする。

```
$ npm install -g gitbook-cli
```

出力先としてPDFとかepubを利用したい場合、calibreもインストールする必要がある。

```
$ brew cask install calibre
```

# プロジェクトの作成

プロジェクトディレクトリを作成して初期設定する。

```
$ mkdir my-book; cd my-book
$ gitbook init
```

これで SUMMARY.mdとREADME.md の二つのファイルが生成される。

設定ファイルの book.json を新しく作成する。以下では言語設定を ja にしているのと、SNS/GitHubでのシェアボタンを非表示にしている。

```book.json
{
    "plugins": ["-sharing","hide-published-with"],
    "language": "ja"
}
```

book.json を作成したらプラグインのインストールを実行する。

```
$ gitbook install
```

# 動作確認

以下のようにすると localhost:4000 にサーバが起動し、ブラウザが起動してgitbookが表示される。

```bash
$ gitbook serve --open
```

最初はREADME.mdの内容(Introduction)しかないので、見るべきものは別にない。

気が済んだら Ctrl + C しておく。


# 最低限の設定
## SUMMARY.mdに構成を書いていく

SUMMARY.mdを開き、作りたいファイル構成を想定して目次を修正する。

README.mdとSUMMARY.mdの場所は変更可能だけど、変更しない方が `gitbook init` した際の動作がわかりやすいので、この二つのファイル以外のいわゆる本文を適当なディレクトリに分けるととして、SUMMARY.mdを例えば以下のようにする。

```SUMMARY.md
# Summary

## 序文

* [この資料について](README.md)
  * [対象読者](README.md#対象読者)
  * [免責](README.md#免責)

## 本文

* [1. ほげほげ](contents/body-1.md)
* [2. ほげほげ](contents/body-2.md)
* [3. ほげほげ](contents/body-3.md)

## 結文

* [おわりに](contents/postscript.md)
```

SUMMARY.mdを編集したら、もう一度 `gitbook init` を実行する。そうすると、SUMMARY.md に記述されているファイルで存在しないものを自動的に作成してくれる。

```
$ gitbook init
info: create contents/body-1.md 
info: create contents/body-2.md 
info: create contents/body-3.md 
info: create contents/postscript.md 
info: create SUMMARY.md 
info: initialization is finished 
```

## h1が見づらいのでCSSを置く

デフォルトのCSSだとh1とh2のスタイルが区別しづらいため、h1を少し目立たせることにする。

stylesディレクトリを作成し、website.cssとpdf.css、epub.cssを作成する。

```
$ mkdir styles/
$ echo "h1 { border-bottom: 2px solid #000; padding-bottom:3px;}" > styles/website.css
$ echo "h1 { border-bottom: 2px solid #000; padding-bottom:3px;}" > styles/pdf.css
$ echo "h1 { border-bottom: 2px solid #000; padding-bottom:3px;}" > styles/epub.css
```


# HTMLの生成

以下コマンドで静的な html が生成される。出力先はデフォルトでは _book/ である。

```
$ gitbook build
```

`gitbook serve` で利用できるものと同等のものっぽい。静的なファイルへのビルドなのでS3とかに置いておけば動く。便利だ!!

# 念のためにPDFの生成を試す

```
$ gitbook pdf
```

出力先は book.pdf がデフォルトである。このあたりはオプションで変更できる。ちなみにpdfはかなりサイズが大きくなり、この例でいえばだいたい10MBくらいになる。

![スクリーンショット 2016-12-25 13.14.28.png](https://qiita-image-store.s3.amazonaws.com/0/17911/c3b23127-b632-30e0-b63e-5b31b7828d59.png "スクリーンショット 2016-12-25 13.14.28.png")


# まとめ

とりあえず手元で書き始めるにはこのくらいで十分そう。

SUMMARY.md ではレベル1見出しが無視されるとか、箇条書きだけが目次として機能して地の文は無視されるとか、まあまあ癖のある挙動だけど慣れの範囲かな。

プラグインやカスタマイズがいろいろ可能なのだけど、凝り始めると肝心のドキュメントの記述に手が回らなくなってしまうので余暇でやっていこう。
とあるFlasherが見てきたツールや作るものの変遷

## flash黎明期
・flashでhtmlかけなくてもサイトを作れた！
・flashは2d表現を一生懸命開拓した！
・GoogleMAPでajaxがもてはやされる。
・誰かがflashの作り手をflasherと言い始める。

## Flash真っ盛り時代
・Microsoftがflashっぽい、silverlightをリリースするものの流行らなかった。
・先端表現が算数必要な感じになってくる。
・windows vistaでwpf公開、xamlというマークアップで画面リソースを管理できるのは画期的だった。
・デスクトップガジェットはいまいち流行らなかった。
・blogパーツをみんな一生懸命作っていた。
・imodeでflashが動くようになった。
・flexで業務アプリっぽい仕事が降ってくるようになった。
・player9でas3になりパフォーマンスが上がりビットマップ系の処理を書かなきゃいけなくなった。
・papervistionで3d表現、でもそこにはflashらしさがあった

## flashがジョブズに振られた！
・flashの仕事激減衰退の道をたどる
・気がついたら、デザイナーの姿があまり見えなくなってきた。
・ジョブズのおかげでアプリを慣れない言語で書く羽目になった。

## マウス・キーボード・モニタの外に出てメディアアートの味わい
・openframeworks登場。openGLとか身近になる
・kinnect現る
・AR
・センサー
・ドローン

## ソシャゲがすごいことに
・みんなでunityでC#にお引越し
・unrealEngineが安くなった
・cocos2Dとかあるよ

## awsとかクラウドがすごい流行る
・すごい世界だなーとか見てた
・devOps

## js界隈が一気に動き出す
・googleからflexっぽい、anglerJSがリリースされた！
・フロントエンドエンジニアなる職種が出現
・sassやlessなどcssのトランスパイラが増殖
・altJSがやたらと増殖
・facebookからflexを進化させたようなreactがリリースされた！
・npmの登録数がすごいことに
・devOpsの流れでフロントでもビルドツール花盛り
・jsがもはやアセンブラ化する

## プロトタイピングブーム来たる
・気がつくと昔は山ほどいたデザイナーのレア度上がっている
・アプリ作るのが大変ということでプロトタイピングがもてはやされるようになった。
・facebookがorigamiをリリースした
・SketchAppがflashでこれ欲しかった的なアップデートした！


## まとめ
flashは便利でしたね。
[かんたん連携]kintoneとWordPressを連携させてみる

# はじめに
kintoneを触り始めるエンジニアの方から<strong><font color="#ff0000">「具体的にkintoneと外部サービスとの連携ってどうやるの？」</font></strong>と聞かれることが多々あります。
外部サービスとの連携はAPIを利用しますが、比較的に簡単でイメージしやすいWordPressとの連携についてご紹介します。

## WordPress to kintone 
WordPressで作成した入力フォームを簡単にkintoneと連携できるプラグインです。

### プラグインのダウンロードURL
[WordPress to kintone](https://wordpress.org/plugins-wp/cybozu-wp-to-kintone/)

## 利用方法
入力フォームはkintoneアプリで作成。
WordPressにはkintoneで作成したアプリの設計情報を定義します。
WordPressの入力フォームから登録されたデータがkintoneに保存されます。

## 事前準備 - WordPressのセットアップ＆kintoneアプリ作成
WordPressのセットアップと、[WordPress to kintone](https://wordpress.org/plugins-wp/cybozu-wp-to-kintone/)を入れておきます。
（ちなみに今回はAMIMOTOでさくっとデプロイしてます）
WordPressをもともと利用してサイト運営してる場合はプラグイン追加だけでおｋ。

kintoneのアプリはこんな感じのアンケートアプリを作成。
（各フィールドコードもデフォルトから変更済み）
![wp-to-kintone3.png](https://qiita-image-store.s3.amazonaws.com/0/73604/6af311f1-e549-ebfd-de13-1449ba35a58c.png)

アプリを作成したら**WP to kintone**で利用するためのAPIトークンを発行します。
WordPressからkintoneにレコードを書き込むため**「レコード追加」**にチェックを入れておきます。
![wp-to-kintone2.png](https://qiita-image-store.s3.amazonaws.com/0/73604/e4bf7c8b-cee7-073c-f0e9-4dd63fd8393a.png)

## 定義できること
* フィールドの表示/非表示
* フィールドの並び順
* BASIC認証

## ショートコードのフォーマット
```js
[
	kintone app="app id" 
	token="api token" 
	sub_domain="subdomain name" 
	exclude="field1, field2" 
	orderby="code" 
	order="asc"
]
```
### 各パラメータの説明
* kintone app: kintone の**appid**
* token: kintone で発行した**APIトークン**
* sub_domain: kintone の**サブドメイン**
* basic_auth_user: BASIC認証のユーザー名
* basic_auth_pass: BASIC認証のパスワード
* exclude: kintoneに設置したフィールドで、<strong><font color="#FF0000">WordPressでは非表示にしたいフィールド</font></strong>を指定
* orderby: kintoneのフィールドの表示順でWordPress上でも表示させたい時に "code" を指定（指定しなかった場合はkintoneで作成したフィールド順になります）
* order: 昇順（asc）か降順（desc）を指定

最低限定義が必須なパラメータは<strong><font color="#0000FF">"kintone app", "token", "sub_domain"</font></strong> です。




## ショートコードの記述例
視覚的な見やすさのためインデントを入れてます。

```js
[
	kintone app="136"
	token="bEYHnMhYrfB7zxNx5PIXGzlnj6hKtBibVttwhWrc"
	sub_domain="example"
	exclude="creationDate,sales"
	orderby="code"
	order="asc"
]
```

kintoneのappidとサブドメインはkintoneのURLから確認しておきます。
![wp-to-kintone1.png](https://qiita-image-store.s3.amazonaws.com/0/73604/0a3e802f-997f-7aa6-9f14-2a585b6cbba6.png)

## WordPressでアンケート用のページを作成
今回は記事の新規投稿から作成します。
このようにショートコードを記述してページを公開すると…
![wp-to-kintone4.png](https://qiita-image-store.s3.amazonaws.com/0/73604/9ca64ebe-821d-179f-c78f-a10fb7b547e5.png)

kintoneで作成したフォーム通りのページができました！
![wp-to-kintone5.png](https://qiita-image-store.s3.amazonaws.com/0/73604/c18f5965-c36d-126d-5d71-7e8deb8973a7.png)

このページからアンケートを入力すると、kintoneで作成したアプリにもレコードが登録されます。
![wp-to-kintone6.png](https://qiita-image-store.s3.amazonaws.com/0/73604/7b70c1b0-c2e5-9708-23a5-b7f0ede14f5f.png)

kintoneのレコードの詳細画面を開くと、**exclude**で指定したフィールドが。
このフィールドはWordPress上からは見えていないフィールドです。
![wp-to-kintone7.png](https://qiita-image-store.s3.amazonaws.com/0/73604/ecdf4fcc-0fc4-2cfb-6bd5-ad1cf5700634.png)

蓄積されたデータを利用してkintoneの機能で簡単に集計を取ることも出来るので便利です。
是非みなさまお試しあれ。
newtxを導入するとき

newtxパッケージをインストールしても，dvipdfmxでエラーになって困っていました．

依存関係として`kastrup`と`tex-gyre`のパッケージが必要なようです．
http://oku.edu.mie-u.ac.jp/tex/mod/forum/discuss.php?d=2053


従って以下の様にインストールすれば動きました．

```console
$ tlmgr install kastrup tex-gyre newtx
```
ubuntu15.04 15.10 16.04 16.10 にマインクラフトをインストールしてみた。

＃ubuntu16.04 gnomeを対象にしています。普通のubuntuでも問題ないと思われます。
＃対応バージョン
＃ubuntu desktop 15.04 / 15.10 / 16.04 / 16.10
＃ubuntu server 15.04 / 15.10 / 16.04 / 16.10
＃minecraft　1.7.10 / 1.8 以降
＃普通のインストールなのでインストールは割愛させていただきます。
＃端末をひらきます。
＃/home/ユーザー名と仮定

#１．端末を開く　またはSSHにてログイン中と仮定

#１－１．マインクラフト用のユーザーを作成する場合　しない場合は２へ
`sudo addtest` ユーザー名
      sudoが出来ないと色々不便な人はUSERをsudoできるようにします。
`sudo nano sudo nano /etc/sudoers`

`USER名    ALL=(ALL:ALL) ALL` を

＃ User privilege specification
root    ALL=(ALL:ALL) ALL
の後ろに追加する。
保存して終了。

#１－２.
`su ユーザー名`


#２.マインクラフト用のフォルダを作ります

`mkdir mc`


#３.マインクラフトのフォルダへ移動します

`cd mc`


#４.マインクラフトのサーバーファイルをダウンロードします。

`wget https://s3.amazonaws.com/Minecraft.Download/versions/1.7.10/minecraft_server.1.7.10.jar`
　　　1.7.2とかの場合は　`wget https://s3.amazonaws.com/Minecraft.Download/versions/1.7.2/minecraft_server.1.7.2.jar`


#５.起動スクリプトを書きます。

`nano mi`
＃GEDITでもemacsでもvimでもおすきなのをどうぞ　nanoの場合は保存するときはCTRL+o
＃nanoEDITERを終わらせる場合は　ctrl + x になります。

```
 #!/bin/bash
 #マインクラフト起動スクリプト
 java -Xmx1024M -Xms1024M -jar minecraft_server.1.7.10.jar
```


#６.　miに実行権限を与えます。

`chmod +x mi`


#７.念のためmc内のファイルのアクセス権を自分に設定します。

`chown -R ユーザー名:ユーザー名　/home/ユーザー名/mc`

#８.JAVAインストール

sudo add-apt-repository ppa:webupd8team/java && sudo apt-get update && sudo apt-get install oracle-jdk7-installer
・リポジトリの追加にENTERをする
・そのあとに出るライセンスに同意する



#７の(おまけ)複数JAVAが入っている場合の対処

```
sudo update-alternatives --config java
/usr/lib/jvm/java-7-oracle/bin/java の番号を選択する
sudo update-alternatives --config javaws
　　　　　/usr/lib/jvm/java-7-oracle/bin/javaws の番号を選択する
sudo update-alternatives --config javac
/usr/lib/jvm/java-7-oracle/bin/javac の番号を選択する`
```

#９.javaのバージョン確認

`java -version`


#１０．マインクラフトの「　EULA.txt　」に同意する。
以下のような文章があるのでeula=false を　eula=true　に書き換える。

```
#By changing the setting below to TRUE you are indicating your agreement to our EULA (https://account.mojang.com/documents/minecraft_eula).
#Mon Dec 19 14:41:51 JST 2016
eula=false`
```

に書き換える
`eula=true`


※同意しない場合は
`[12:42:57] [Server thread/INFO]: You need to agree to the EULA in order to run the server. Go to eula.txt for more info.`
というようなlogが出てマインクラフトが起動しません。



#１１.マインクラフトの起動

`./mi`


#１２.ファイアウォールの設定　必要な人だけ

`sudo ufw allow 25565/tcp`
`sudo ufw reload`
`sudo ufw enable`

※マインクラフトのポートを変更している場合は　25565/tcp　を変更してあげてください
※ufwをいれてないひとは　sudo apt-get install ufw
※ufw が手に負えなくなった人は　sudo apt-get remove ufw
※ufw を一時的に無効にしたい　sudo ufw disable

　　
　　
注意）フォージを入れる場合おそらくインストーラーの関係でデスクトップ環境からのほうが楽なので
　　　初心者の方はubuntudesktopをおすすめします。
　　　ubuntuserverにフォージを入れる場合私はubuntudesktop
　　　の場所からサーバーへ接続を選択　"ssh://username@192.168.xxx.xxx"
　　　としてデスクトップにマウントしてからフォージインストーラーを使っています。
　　　ヘッドレスのサーバーの人はSambaでファイル共有してWindowsまたは
　　　Ubuntuデスクトップ側などからインストールをすると良いかもしれません。

注意）sudoでマインクラフトを起動して新しいファイルができたりすると勝手にrootのファイルができてたりして
　　　sudoなしでは起動できなくなる場合がありますのでその時は７番をやってみてください。

注意）変にサービス化スクリプトをいれたりして詰んでしまった人は ps -u(起動したユーザー名)　などで
　　　マイクラのプロセスがないか確認してみてください


サービス化したいひとはこちらを参考にどうぞ
`http://minecraft.gamepedia.com/Tutorials/Server_startup_script`

それでは皆様よいマインクラフトライフを～
Riot.js触ってみた

# はじめに
Riot.js勉強のため、[Live demo](http://riotjs.com/play/)のコードを参考にまとめてみました。

# Riot.jsとは？
![riot480x.png](https://qiita-image-store.s3.amazonaws.com/0/151720/56f2e172-5640-818a-774e-b037be67dad9.png)
>[Riot](http://riotjs.com/)は、公式ページに

>>A REACT- LIKE, 2.5KB USER INTERFACE LIBRARY

>とあるように、Reactを意識して作られた超軽量のUIライブラリで、ビュー部分(コンポー>ネント)に特化しているのが特長です。Vue.jsとかとも同類です。Riot 1.0も「超軽量」という点で、一時注目を集めました。

>そのRiotが、2.0で趣向を変えてJSX的なプリコンパイルの仕組みを取り入れて、>ReactとPolymerのいいとこ取りのような感じになっています。ただし、次のような大きな違いがあります。

>React: JavaScript(JSX)の中に、HTMLを書く
>Riot: HTMLの中に、JavaScriptやCSSを書く
>スクリプトサイズは24分の1。Reactが優に100KBを越えるのに対して、Riotはたった>5.7KB。gzip圧縮かければ2.5KB。ちなみに、Riotの開発元のMUUTは既存サイトにエンベッドして使う、フォーラムツールを作っているチームです。(Disqusみたいなやつ)

[こちら](http://qiita.com/cognitom/items/fb1295f3f93911e9e92d)より引用

# Live demoのコードを理解する

## サンプルコード

```html:index.html
<html>
  <head>
    <title>Hello Riot.</title>
  </head>
  <body>

    <sample></sample>
    
    <script type="riot/tag" src="sample.tag"></script>
    <script src="https://cdn.jsdelivr.net/riot/3.0/riot+compiler.min.js"></script>
    
    <script>riot.mount('sample')</script>
  </body>
</html>
```
```html:sample.tag
<sample>
  <h3>{ message }</h3>
  <ul>
    <li each={ techs }>{ name }</li>
  </ul>

  <script>
    this.message = 'Hello, Riot!'
    this.techs = [
      { name: 'HTML' },
      { name: 'JavaScript' },
      { name: 'CSS' }
    ]
  </script>

  <style>
    :scope { font-size: 2rem }
    h3 { color: #444 }
    ul { color: #999 }
  </style>
</sample>

```

## 表示
![スクリーンショット 2016-12-25 10.47.31.png](https://qiita-image-store.s3.amazonaws.com/0/151720/4fddc065-9e46-dc15-81d7-4ba986759d11.png)

## サンプルコードについて
Riot.jsでは、部品（カスタムタグ）を組み合わせて、ページを作成しています。
サンプルコードでは、作成したsampleタグをindex.htmlで呼び出しています。

### index.html

1.sampleタグを配置する

```html
<sample></sample>
```

2.sampleタグを読み込む

```html
<script type="riot/tag" src="sample.tag"></script>
```

3.sampleタグを（ブラウザで）コンパイルする

```html
<script src="https://cdn.jsdelivr.net/riot/3.0/riot+compiler.min.js"></script>
```

4.sampleタグをマウントする

```html
<script>riot.mount('sample')</script>
```

また、下記のようにすると、ページ上すべてのカスタムタグをマウントできます。

```html
<script>riot.mount('*')</script>
```

### sample.tag
次に、sample.tagを見ていきます。

1.タグを定義する

```html
<sample>
   ~
</sample>
```

2.html

```html
<h3>{ message }</h3>
<ul>
  <li each={ techs }>{ name }</li>
</ul>
```

{}は、jsで定義している変数を参照しに行く。
eachは、techsの中身を回してる。

3.script

```js
<script>
  this.message = 'Hello, Riot!'
  this.techs = [
    { name: 'HTML' },
    { name: 'JavaScript' },
    { name: 'CSS' }
  ]
</script>
```

4.style

```css
<style>
  :scope { font-size: 2rem }
  h3 { color: #444 }
  ul { color: #999 }
</style>
```
[Scoped CSS](http://qiita.com/cognitom/items/34170b78b4183e68aa5c)を使用している。

# その他
- [Riotでカスタムタグを作るやり方](http://panda-noir.hatenablog.jp/entry/2016/07/22/132131)
- [Riot.js入門と、compile・precompileのはなし](http://qiita.com/fnobi/items/ce05e76a87b12c946581)
- [ChromeでRiot.jsを実行した時、Javascriptコンソールに「Fetching scripts with an invalid type/language attributes is deprecated...」と表示される場合の対処法](http://qiita.com/makopo/items/e77d6091e40508700db9)
- [【解説付き】chromeでXMLHttpRequestをローカルのファイルで行う方法](http://qiita.com/growsic/items/a919a7e2a665557d9cf4)
RStudioを操る

RStudioユーザーのみなさんこんにちは。RStudioユーザーでない方もこんばんは。メリークリスマス🎄🎅！！！

RStudioユーザーであれば誰しも**RStudioを意のままに操ってみたい**、そういう気持ちを抱くことがあると思いますが、実はその願望、**とあるパッケージを使うと簡単に実現できます**、という話をします。よろしくお願いします。

勿体ぶっても仕方がないので、早速件のパッケージを読み込みます。**`{rstudioapi}`**パッケージは、RStudioの情報やRStudio内部の処理を操作するための関数を備えています。開発メンバーはRStudio社をはじめ、Hadley WickhamやJJ Allaire、Kevin Usheyと安心の面子です。

```{r}
library(rstudioapi)
```

ちなみに、このパッケージの概要や一部の関数についてはyutannihilationさんが[ブログで紹介してくれています](http://notchained.hatenablog.com/entry/2015/12/27/095131)。そちらもご覧ください。

## 何ができるのか

肝心な話です。有益なものとそうでもないものあります。価値を見いだすのは人それぞれの価値観です。私が有益〜っと思ったものだけを紹介するので、きちんと知りたい人は[GitHubのリポジトリ](https://github.com/rstudio/rstudioapi)から探してください。それでは。

### Rの関数をRStudioで実行する関数

任意のRコードを引数に渡して、コードを実行する（しないという選択もできる）関数です。何かに役立ちそうですが、いいアイデアがないですね。

```{r}
sendToConsole(code = "print('hello')")
```

### エディタ情報

`editor-information()`という関数を使って、エディタおよびコンソールに関する情報を得ることができます。RStudio内部で使われているファイルのIDや、ファイルサイズが表示されます。そういえばこの機能を利用して[パッケージを作った](http://uribo.hatenablog.com/entry/2016/01/30/073000)のですが、開発を放置していました。来年になったらメンテナンスしたいと思います。

```{r, eval = FALSE, echo = TRUE}
# 現在アクティブ（カーソルが有効）なエディタあるいはコンソールの情報を返す
getActiveDocumentContext()
# Document Context: 
# - id:        '8F71A52B'
# - path:      '~/Desktop/Untitled.Rmd'
# - contents:  <60 rows>
# Document Selection:
# - [34, 1] -- [34, 1]: ''

# ソースの情報
getSourceEditorContext()
# Document Context: 
# - id:        '8F71A52B'
# - path:      '~/Desktop/Untitled.Rmd'
# - contents:  <60 rows>
# Document Selection:
# - [37, 1] -- [37, 1]: ''

# コンソールの情報
getConsoleEditorContext()
# Document Context: 
# - id:        '#console'
# - path:      ''
# - contents:  <1 rows>
# Document Selection:
# - [1, 1] -- [1, 1]: ''
```

「ソースコードはどこに書いてあるの？」
「RStudioのUntitled4タブだよ！」
[というやりとり](https://twitter.com/thomasp85/status/809903740723544064)があった時も、IDさえあれば安心（？）ですね。

### Rプロジェクトのパス

RStudioの右上にあるやつですね。プロジェクトを使っていないと、[Rプロジェクト警察](http://qiita.com/wakuteka/items/9599bb0a8985d98928d7)の取り締まりに合うので気をつけましょう。

```{r}
getActiveProject()
# NULL
getActiveProject()
# [1] "/Users/uri/git/rpkg_showcase"
```

### RStudioのバージョン

あれ、これ最新版だっけ？メニューバーからバージョンを表示するよりもあるいは楽にバージョンを表示できます。

```{r}
getVersion()
# [1] ‘1.1.20’
```

### 任意のファイルを任意の位置で開く

*file*引数に与えたファイルを開きます。*line*引数や*column*引数を使って、ファイル中の特定の箇所にカーソルを置いた状態にすることもできます。

```{r, eval = FALSE, echo = TRUE}
navigateToFile()
```

### おー、ってなるやつ（パスワードの入力画面）

~~でっていう。~~

```{r}
askForPassword("パスワードを入力してください")
```

## 関連

Macユーザーの人はこれを使うとRStudio外部からRStudioにコードを送れるので便利です

http://uribo.hatenablog.com/entry/2016/01/08/184252
WBSとアクティビティのイメージ

WBSとアクティビティの関連がいまいちよくわからなったので、自分なりに図示してみました
![image](https://qiita-image-store.s3.amazonaws.com/0/136860/b7b7a7f0-d97b-fddb-4f2a-cec234738557.png)
OpenIPMIをインストールする(ソースからコンパイル） for CentOS7.3

Zabbixで利用される、OpenIPMIのインストール方法（ソースからコンパイル）を紹介。

##バージョン情報

| プログラム名 | バージョン |
|:-:|:-:|
|  OpenSSL |  1.0.2j |
|  Perl | 5.24.0  |
|  Python |  2.7.13 |
|  popt | 1.16  |
|  ncurses | 6.0  |
|  termcap |  1.3.1 |
|  OpenIPMI | 2.0.23-RC2 |
| CentOS | 7.3(7.2も確認済み) |

##あらかじめ必要なもの
あらかじめOpenSSL、Python2.xとPerlのインストールが必要です。
インストール方法は以下を参考にしてください。
[Python2.xをインストール（ソースからコンパイル）for CentOS7.2](http://qiita.com/shadowhat/items/4bffc6852a1a1d3c5f61)
[Perl5.8をインストールする（ソースからコンパイル） for CentOS7.2](http://qiita.com/shadowhat/items/012238aae671924a1f15)
[OpenSSL(1.0.x)をインストールする（ソースからコンパイル）for CentOS 7.2](http://qiita.com/shadowhat/items/68fd55b532c04b13acf5)
##インストール手順

###1.poptのインストール

```bash:
cd /usr/local/src
wget http://rpm5.org/files/popt/popt-1.16.tar.gz
tar xvzf popt-1.16.tar.gz
cd popt-1.16
./configure
make
make install
```

###2.ncursesのインストール

```bash:
cd /usr/local/src
wget https://ftp.gnu.org/gnu/ncurses/ncurses-6.0.tar.gz
tar xvzf ncurses-6.0.tar.gz
cd ncurses-6.0
./configure
make
make install
```

###3.termcapのインストール

```bash:
cd /usr/local/src
wget https://ftp.gnu.org/gnu/termcap/termcap-1.3.1.tar.gz
tar xvzf termcap-1.3.1.tar.gz
cd termcap-1.3.1
./configure
make
make install
```


###4.Swigのインストール

```bash:
cd /usr/local/src
wget http://prdownloads.sourceforge.net/swig/swig-3.0.12.tar.gz
tar xvzf swig-3.0.12.tar.gz
cd swig-3.0.12
./configure \
--with-python=/usr/local \
--with-perl5=/usr/local
make
make install
```

###5.OpenIPMIのインストール

```bash:
cd /usr/local/src
wget --trust-server-names https://downloads.sourceforge.net/project/openipmi/OpenIPMI%202.0%20Library/OpenIPMI-2.0.23-rc2.tar.gz?r=https%3A%2F%2Fsourceforge.net%2Fprojects%2Fopenipmi%2Ffiles%2FOpenIPMI%25202.0%2520Library%2F&ts=1491199909&use_mirror=jaist
tar xvzf OpenIPMI-2.0.23-rc2.tar.gz
cd OpenIPMI-2.0.23-rc2
./configure \
--with-openssl=/usr/local/ssl \
--with-python=yes \
--with-pythoninstall=/usr/local
make
make install
```

##確認
libOpenIPMI.so.2のライブラリリンクがきちんと見えているかを確認する

```bash:
cd /usr/local/lib
ldd libOpenIPMI.so.0
        linux-vdso.so.1 =>  (0x00007fff63b72000)
        libm.so.6 => /lib64/libm.so.6 (0x00007fd524456000)
        libOpenIPMIutils.so.0 => / not found
        libc.so.6 => /lib64/libc.so.6 (0x00007fd523e8b000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fd524a73000)
```

not foundとなっている場合、/etc/ld.so.confに「/usr/local/lib」を追加するか、/lib64に"not found"なライブラリのシンボリックリンクを作成するとよい

例）

```bash:
ln -s /usr/local/lib/libOpenIPMIutils.so.0 /lib64/libOpenIPMIutils.so.0
``` 

意外といろいろなライブラリとの関連性があるので、事前にインストールしておくプログラムに注意をしておくことが必要です。
英語苦手だけど、翻訳してみたい。

MDNやB2G OSのドキュメントをみんなで編集！翻訳！ Advent Calendar 2016の12月25日を担当します！
http://www.adventar.org/calendars/1646

私が、翻訳してみたいと思ったきっかけは、
OSC東京　【初心者向け】MDN編集ハンズオンに
参加したことです。

私は、英語が苦手なのですが、単語が分かれば、なんとなく翻訳はできるので
ハンズオンはとても楽しかったです。

開発者になりたい私にとって、やっぱり英語はとても大事だって思うので、
最近は、英語の勉強もはじめました。
英語で読む村上春樹おすすめです。

ハンズオンに参加してはじめて知ったのですが、
Mozillaの開発者向けドキュメントというのがあります。
https://developer.mozilla.org/ja/

そちらには、学習というコンテンツがあって、
ウェブ開発について学ぶこともできます。

今後は、大好きなフォクすけのためにも、オープンウェブの知識を身に着けたいです。
翻訳をすることによって、英語もウェブ開発の知識にも詳しくなれると思うので、
次のステップへ進んでもっとMDN に参加してゆきたいと思う2016年12月クリスマスの今ここです。

Merry Christmas!
グラフを描画しようとすると大量のwarningが出る


mac版のRでグラフを描画しようとするとwarningが大量に出る. グラフは描画されるけど気持ち悪いので原因調査.

```R
> screeplot(maker.pca)
 28 件の警告がありました (警告を見るには warnings() を使って下さい) 
> warnings()
 警告メッセージ: 
1: In doTryCatch(return(expr), name, parentenv, handler) :
   フォントファミリー "Arial" に対してフォントが見つかりません 
2: In doTryCatch(return(expr), name, parentenv, handler) :
   フォントファミリー "Arial" に対してフォントが見つかりません 
...以下省略
```

フォントファミリーが足りていない.

mac版のRでグラフを描画するときはQuartzという描画エンジンが使われるらしい. 使えるフォントセットを確認してみる.

```R
> quartzFonts()
$serif
[1] "Times-Roman" "Times-Bold"     "Times-Italic"      "Times-BoldItalic"

$sans
[1] "Helvetica"   "Helvetica-Bold" "Helvetica-Oblique" "Helvetica-BoldOblique"

$mono
[1] "Courier"     "Courier-Bold"   "Courier-Oblique"   "Courier-BoldOblique"
```
"Arial"が無い! 代わりにここにあるフォントセットを使えばwaringは消えるはず!

```R
> screeplot(maker.pca, family="mono")
```
waring消えた！すっきり！

ついでに新しいフォントファミリーを定義する方法. フォント名は"Font Book.app"で各フォントのPostScript名を調べれば良い.

```R
## 新しいフォントファミリー optima を作る. 
## フォントファミリー名とレギュラー、ボールド、イタリック、ボールドイタリックの4つの書体を指定する
> quartzFonts(optima = c("Optima-Regular", "Optima-Bold", "Optima-Italic", "Optima-BoldItalic")) 
```

Optimaだと日本語が表示されないのでヒラギノにしてみた. イタリックはナシ！

```R
> quartzFonts(hiragino = c("HiraginoSans-W0", "HiraginoSans-W5", "HiraginoSans-W0", "HiraginoSans-W5"))
```
さよならセキュリティ

最近kindleで「沈黙の艦隊」と「聲の形」という漫画を読み始めて止まらなくなりました。


[VAddy Adventカレンダー1日目](http://qiita.com/ichikaway/items/30c01700d0ca569deeea)を勢いで書いてみたものの、これを25日まで続けるのは無理かもと思っていましたが、VAddyチームのメンバーの協力もあってなんとか完走しました。

さて、今日は最終日ですので私がこのプロジェクトを始めて一番感動した日を書きたいと思います。


## はじまりの、はじまり

ビットフォレストCTOの佐藤（[金床さん](https://twitter.com/kinyuka)）と会ったのは、私が大学時代にIRCチャットにずっといた1999年ごろでした。
彼は社会人でしたが、23時の[テレホーダイタイム](https://ja.wikipedia.org/wiki/%E3%83%86%E3%83%AC%E3%83%9B%E3%83%BC%E3%83%80%E3%82%A4)になると毎日入ってきて、いつも私の話し相手になってくれました。私がJavaで音声通話アプリを作った時は一緒に使ってくれて、なんちゃってインターネット電話もしました。懐かしい。

お互いハンドルネームで呼び合う仲から、いつしか一緒に仕事をしていることになるとは、不思議なものですね。

## はじまり

VAddyの最初の着想は2013年です。
2000年ごろから始まったテスト文化・ツールが普及したこと、CI/CDの流れ、E2Eテスト、自動化、エンジニア向けサービスの勃興、いろいろな要素が絡み合って、少しタイミングは早い気もしましたが継続的なセキュリティテスト（脆弱性検査）を自動化して開発現場を助けたいというコンセプトでVAddyを作りました。

私はどちらかというとセキュリティ業界よりはWebアプリケーション開発の業界にいて、カンファレンスや勉強会によく参加していました。
同じような立場の開発者の人たちと話していると、

- セキュリティは不安だがどうしたらよいかわからない
- 検査は高そうだしどこに発注して良いか見当もつかない
- セキュリティ製品は高いし、扱いが難しそう
- そもそもよく分からない。面倒そう


という状況でした。
皆セキュリティのことは気になりつつも、あまりにも業界のギャップがあって現場の開発者の人たちに届くものがなかったのです。
ここにVAddyを届けられれば、より安全なWebアプリケーションが増え、私たちも、開発者や経営者たち、エンドユーザも、皆幸せになれるはずです。そうしなければいけない。

そこで、現場の開発者の人たちが安心して使えて、自動化もでき、現場の開発フローに浸透していくような開発者フレンドリーなサービスを立ち上げたいと思ったのです。それも圧倒的な低価格で。


## VAddyが動いた日、心が躍った日

VAddyの検査エンジンは金床さんがJavaでフルスクラッチで書いています。
フロントは私が実装していて、APIを定義して疎結合している形です。

2014年4月から開発に着手して2ヶ月ほどで、Web画面から脆弱性検査を開始して結果を受け取るところまでできた状態でした。頭で理解していた内容が、そのまま動いていました。（当たり前ですね・・）

それからすぐに、VAddy Jenkinsプラグインを作り、CI連携もできるようになりました。
git pushして、Jenkinsが動き、ユニットテストをパスしてステージングにデプロイ、そしてVAddyの検査が開始するという一連の流れが出来上がり、動かしてみました。

ほんとうに、本当に、今目の前でpushしたコードから脆弱性検査まで終わっている状況を見て震えました。西野カナとは明らかに違う震え方でした。

脆弱性検査まで自動化してCI連携する、このコンセプトは頭では理解してましたが実際に眼の前で動くとインパクトがまったく違いました。
これは・・素晴らしい！ 世の中の動きもこの方向になるはずだと確信しました。


## CIと連携できる脆弱性検査

VAddyは最初から、CI連携できるように、開発者フレンドリーになるように、現場の開発フローに馴染むように、設計して開発しています。
これらのコンセプトを後付けでやると、ちぐはぐな製品になります。最初からこのコンセプトでいかないといけないのです。

そのために必要な要件（ハードル）は、

- 検査が短時間で終わること（pushして検査終了まで5時間待ちとかしたくない、数分以内に終わりたい）
- APIを公開して誰でもCI連携できること
- 設定項目を無くして簡単に使える・導入できるようにすること
- それでいて検査の精度は高いこと

です。これらを満たしていくのは大きなチャレンジでしたが形になりました。
そしてより短時間に、検査精度を高くするために、私たちのチャレンジは続いていきます。


## さよならセキュリティ

私もWebアプリケーションの開発に長く携わっており本当の理想を言うと、言語やフレームワークが全て脆弱性を吸収して無くしてしまうことです。そうなれば、開発者はセキュリティのことを考えずにビジネスの開発に集中できます。

本当の理想の未来は、VAddyすら必要なくなる世界なのです。
「さよならセキュリティ」、この業界には大事なことだと思います。


## さいごに
完璧な製品を目指すと、高価格になったり、複雑になり現場で運用するのが大変になってきます。ですのでVAddyはベストよりはベターなセキュリティサービスを目指しています。
Webアプリケーション開発のセキュリティで何をしたら良いか分からない時や迷った時は、是非VAddyを試してみてください。無料プランもあるのでお気軽に。
https://vaddy.net/ja/


今日は書きたいことをたくさん書きました。
VAddy Adventカレンダーは今日で終わりますが、普段から[Twitter @vaddynet](https://twitter.com/vaddynet)で情報発信していますので、興味ある方は是非フォローしてみてください。定期的にVAddyミートアップという勉強会と懇親会を合わせたようなこともしてますので、興味があるかたは[是非ご参加ください](https://vaddy.doorkeeper.jp/)！

今回カスタマーサポートでAdventで書いた記事と同じような質問があり、それがそのまま役に立ったことが嬉しかったです。書いてて良かった！


### ビールネタ

私が最初にクラフトビールを知ったのは、2008年頃にアメリカに行った時です。
その時は、サンフランシスコにあるアンカー社が作ってる[「アンカースチーム」](https://mitsuifoods.co.jp/mfp/import/anchor/)を飲んだと思います。
あぁ、エールって素晴らしいと思ったのでした。
でもクリスマスはやはりBrewDog [ホッピークリスマスIPA](http://goodbeer.jp/scb/shop/shop.cgi?No=1316)でしょう。
Ubuntu 16.10 設定

## Download

* [Ubuntu Desktop 日本語 Remixのダウンロード | Ubuntu Japanese Team](https://ubuntulinux.jp/download/ja-remix)にリンクがかったが、トップページ右にリンクがあった。

* [Ubuntu 16.10 日本語 Remix リリース | Ubuntu Japanese Team](https://ubuntulinux.jp/News/ubuntu1610-ja-remix)
* [xubuntu 16.10 iso mirror](http://ubuntutym2.u-toyama.ac.jp/xubuntu/16.10/release/)


## 画面の明るさ

* [Ubuntuの画面の明るさの調整を有効にする - ’s blog](http://tkyma.hatenablog.jp/entry/2015/10/24/012902)

```diff:/etc/default/grub
- GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
+ GRUB_CMDLINE_LINUX_DEFAULT="quiet splash acpi_backlight=vendor acpi_osi="
```

```bash:
sudo update-grub
```

## 警告音をミュート

* 「ポロロン」という打楽器の音が再生されなくなったことを確認した。

![sound.png](https://qiita-image-store.s3.amazonaws.com/0/25728/962d2fb4-018e-bd03-0dda-d997e8dd2716.png)


## memo

```bash:settings.sh
LANG=C xdg-user-dirs-gtk-update

# enable brightness keys
ORG='GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"'
MOD='GRUB_CMDLINE_LINUX_DEFAULT="quiet splash acpi_backlight=vendor acpi_osi="'
grep "$ORG" /etc/default/grub \
&& sudo sed -i -e "s/$ORG/$MOD/" /etc/default/grub \
&& sudo update-grub

sudo apt install -y \
  expect tig nkf w3m autossh sshfs \
  rdesktop xtightvncviewer vim-gtk freerdp-x11 \
  pinta
```
GrimoireJS-Coreの最適化を頑張る

(この記事は[GrimoireJSアドベントカレンダー](http://qiita.com/advent-calendar/2016/grimoire)16日目の記事です。)

こんにちは。鼻血を流しながらGrimoireJS-Coreの最適化をしているmoajoです。

前回、最適化をやってるとか書きましたが、この作業が予想以上につらかったのでどんなことをしているのか衝動書きします。

#まずはプロファイリング
パフォーマンスを最適化するならまずはボトルネックを把握することからですね。
`Chrome Developer Tool`のプロファイラを使いましょう。
僕は`mac`使いなので、`alt + command + i`でデベロッパーツールを起動して、`Profiles`タブを選ぶだけです。
<img width="1273" alt="スクリーンショット 2016-12-25 10.10.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/116979/d39af74b-105e-3994-516d-7181a88dd772.png">
(スクショ撮り忘れてたので、最適化**後**の画像です。参考程度に。)
とりあえず**CPU時間のプロファイル**を取ってみるとこんな感じです。かなり便利。
ちなみに最初の時点で30fpsくらいしかでてません。重いです。
**[`GrimoireJS-Fundamental`](https://github.com/GrimoireGL/grimoirejs-fundamental)**で普通のレンダリング処理をしているので、所要時間の大半は`$renderViewPort`の呼び出しにかかってるのがわかります。この辺は[5日目の記事](http://qiita.com/kyasbal_1994/items/3cd082c7f21503746f0e)で詳細が書いてました。
ほかにも、メモリ確保のプロファイリングもできるようです。素晴らしい。

#ゴリゴリ削る
まず一番重いのは、_broadCastMessage()でした。
まぁ、毎フレームシーン上のすべてのノードに`$update`が送られるので、このあたりの最適化はかなり効果出そうですね。
## メッセージレシーバのバインド
レシーバの中では`this`がコンポーネントのインスタンスにバインドされます。
そのために呼び出しのたびに、[bind](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Function/bind)していましたが、結構重そうです。僕の環境では
コンポーネントのインスタンス生成時にバインドしておき、呼び出すだけに修正しました。
3fpsくらいあがりました。

## ノード中のメッセージ送信先の探索
ノードはsendメッセージするときに、すべてのコンポーネントを線形探索して呼び出していましたが、
これも無駄なので、一度探索したら2回目以降は前回送信できたコンポーネントにのみ送信するよにしました。
（ちなみにこれに伴って、コンポーネントのインスタンスに動的にレシーバを追加したりしても呼ばれなくなる場合があります。その場合、そのノードの`_messageCache={}`としてください。ただし**非推奨です**。）これも3fpsくらい。

##GomlNode\#isActive
毎回呼ばれるのたびに先祖を辿って確認していました。これも無駄なのでキャッシュします。
早くはなったはずですが**ほぼ誤差**でした。

##Dictionary
名前空間の解決に使う辞書の実装を、Mapクラスからただのオブジェクトと配列に変更しました。
結構早くなったはずです。(忘れたけど、3fpsくらい？)

##NSIdentity
名前空間を表すクラスですが、インスタンスがあまりにも大量に生成されてGCが走りまくっていたようです。
シングルトンっぽい実装にしたらインスタンスの数が100分の１くらいになりました。GCも軽減しました。

##SendMessage
メッセージを送るとき、**先頭に$がついているか確認するのが重かった**です。
あまりにも大量に呼ばれるとこんなところまで重いんですね。
すべてのノードで確認していたのを最初の一回だけに修正しました。
2fpsくらいあがりました。

##配列操作
[map](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/map)とか[reduce](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce)とかを多用していたのですが、普通に重いのと、新しい配列のインスタンスが作られるのでメモリ的にも負荷でした。アロー関数のインスタンス確保も重かったかもしれません。
`for`で書き直してはやくなりました。もう`for`とか書きたくなかったんですけどね。辛いです。


#まとめ
なんだかんだ言って45fpsとかはでるようになりました。
これ以上のCoreでの最適化は僕の技量では厳しそうです。
ここからはfundamentalの方も最適化して行く予定です。
（というかこっちのほうが最適化の余地がある。）
Visual Studio Code用カラーテーマの作り方


## カラーテーマの作成

あらかじめ、カラーテーマを作成しておきます。

カラーテーマの作成は、[TmTheme Editor](http://tmtheme-editor.herokuapp.com/#!/editor/theme/Monokai)を使うと簡単です。
好みの配色ができたら「ダウンロード」ボタンで適当なファイル名をつけて保存しておきます（拡張子は.tmTheme）。

## テンプレート作成

[Yo Code - Extension Generator](https://code.visualstudio.com/docs/tools/yocode)をインストールします。

```
$ npm install -g yo generator-code
```

インストールができたら、

```
$ yo code
```

とすると、どの拡張機能を作成するか訊かれますので、"New Color Theme"を選びます。

![スクリーンショット 2016-12-25 10.08.15.png](https://qiita-image-store.s3.amazonaws.com/0/20722/9fc5dc7d-4695-15e8-6207-dc5bff1dbeb2.png "スクリーンショット 2016-12-25 10.08.15.png")

次に、カラーテーマのファイル名を訊かれるので、さきほど保存しておいたファイルを指定します。

![スクリーンショット 2016-12-25 10.09.16.png](https://qiita-image-store.s3.amazonaws.com/0/20722/a0228389-5079-54e5-7e78-deb24e772c84.png "スクリーンショット 2016-12-25 10.09.16.png")


その後もextensionの名前などを訊かれますので適当に入力します。
"publisher name"はMarketPlaceに公開するときにはMicrosoftのアカウント名が必要になりますが、そうでなければ適当でよいでしょう。

## ローカルにインストール

テーマが出来たら、```~/.vscode/extensions/```にフォルダごとコピーするだけです。

あとはVisual Studio Codeを再起動すれば、「Codeメニュー」 -> 「基本設定」 -> 「配色テーマ」で作成したテーマを選択可能になります。

![スクリーンショット 2016-12-24 23.41.07.png](https://qiita-image-store.s3.amazonaws.com/0/20722/17b72a90-df86-e002-c68f-6f0804e11579.png "スクリーンショット 2016-12-24 23.41.07.png")





## Market Placeに公開


Extension Marketplaceに公開したいときは、[vsce - Publishing Tool Reference](https://code.visualstudio.com/docs/tools/vscecli)を参考にすればできるかと…。
Alfred呼び出し時にInputMethod(IME)を英語にする

## 概要
macOS Sierraに変えてから？
Alfredの設定でキー入力指定を「ABC」にしていても遅延して変更されるのでストレス！

__AppleScriptでメニューバーの操作を実現していたが、即座に反映したり、UIがちらちら見えたりで気持ち悪かったためShellScript+OSSで対処に変更しました。__

## 変更履歴
* AppleScript使用からShellScriptでOSSを使うことにした

## 対処
* Alfredの呼び出しにBetterTouchTool(以下BTT)を経由していた
* 呼び出し直前にShellScriptで入力を変更してしまおうという感じ
    * BTTでは複数のアクションをワンアクションで行う機能がある
    * AttatchAdditionActionで追加できる
* ShellScript ~~AppleScript~~ はBTT内アクションに直接書きます

## インストールするOSS
[xkbswitch-macosx](https://github.com/myshov/xkbswitch-macosx)
インストール方法はGithubに書いてますので省略。

## 呼び出すShellScriptはこれ

```ShellScript
/usr/local/bin/xkbswitch -se ABC
```

## カスタム
コード内の"ABC"をお好みのものに変更してください

## つかってみて
~~めっさ快適になったよ！~~
本当にめっさ快適なったよ！
はてなブログで自動的に目次を作成するjs

最近のWebメディアでは、記事の頭に目次を持ってきているメディアが見かけられます。
記事内容をはじめの段階で読み取れるので、非常に重宝します。
なので、自分のはてなブログに目次をつけたいと思いますが、今までに書いた記事にいちいち追加するのは面倒。

[記事中の見出しから目次を自動的に作成する「目次記法」を追加しました](http://staff.hatenablog.com/entry/2015/09/09/152158)

はてなの公式目次がありますが、まさにその方法で設置しなくてはいけません。なので、少し足りない頭を使って自動で目次を作ってくれるJSを作りました。

##jQueryの読み込み
まずはブログにjQueryを読み込せる必要があります。
ブログの管理画面から「設定」→「詳細設定」→「head要素の追加」に次のタグを埋め込みます。

```HTML
<script
  src="https://code.jquery.com/jquery-3.1.1.slim.min.js"
  integrity="sha256-/SIrNqv8h6QGKDuNoLGA4iret+kyesCkHGzVUUV0shc="
  crossorigin="anonymous"></script>
```
こちらは、jQuery3.1.1のバージョンでslim minになり、CDN（コンテンツ・デリバリ・ネットワーク）を利用してサイトに埋め込んでいます。（[ＣＤＮ の 仕組み：キャッシュ屋blog](http://blog.redbox.ne.jp/what-is-cdn.html)）他のバージョンをお求めの場合は[jQueryの公式サイトから埋め込み用のタグ](https://code.jquery.com/)できます。

##JSの設定

これでjQueryを読み込む事ができたので、今度はJSの設定を行います。
下記のソースを「デザイン」→「カスタマイズ」→「記事」の「記事の上」にコピペします。

```JavaScript
<script type="text/javascript">
$(document).ready(function(){
        var hc = $('h4').length;

        //h4の要素を取得して配列に入れる
        var hedarry = [];

        $('h4').each(function(i){
          var text = $(this).text();
          hedarry.push(text);
          $(this).attr('id', 'headline' + i);
        });

        // ulタグを生成してinsertに追加
        var insert = $('<ul>').addClass('list');
        var newLi = "";
        for(var j = 0; j < hedarry.length; j++) {
            // liタグを生成してテキスト追加
            newLi += '<li><a href="#headline'+j+'">'+hedarry[j]+'</a></li>';
            // insertに生成したliタグを追加
            insert.append(newLi);
        }

        //divを生成してulを囲む
        var divinsert = $('<div>').addClass('index-list');
        divinsert.append(newLi);

     $('.entry-content p:nth-child(2)').after(divinsert);

     //h2（目次タイトル）の作成
     var h2title = $('<h2>').text("この記事のINDEX");
     $('.index-list').prepend(h2title);

});
</script>
```

これで、自動的に記事中に使われているh4（中見出し）を読み取り、記事中2つ目の<p>タグ直後にタグが吐き出されます。私は中身だしを見出しにしようしているので、h4の設定にしていますが、もし別の見出しをつけている方は、このh4を変更して読み込みを変える事ができます。
吐き出されるHTMLは下記になります。

```HTML
<div class="index-list"> 
   <h2>この記事のINDEX</h2>
   <ul class="list">
      <li><a href="#headline1">***記事内のh4見出し***</a></li>
   </ul>
</div>
```
liタグの数は記事中のh4の数に相当します。さらに、h4にはidが振られページ内リンクのターゲットになります。

[実装サンプル](http://noriyasu-katano.hatenablog.com/entry/2016/12/17/110234)

### より簡単設定
次のタグを「設定」＞「詳細設定」＞「head要素に追加」部分に記述すれば、外部ファイルから読み込みが行えます。

```HTML
<script src="https://noriyasukatano.github.io/hatanajs/hatena_indexmake.js?data=20161229">
```
※ただし、こちらのファイルは個人のGithubアカウント上で公開されているので、連絡なしに削除・変更などが行われます。
※また、アップデートなどのサポートなどは不定期になります。

## CSSの設定
CSSは吐き出されたタグに対して記述しました。[実装サンプル](http://noriyasu-katano.hatenablog.com/entry/2016/12/17/110234)の見た目は次のスタイルで設定しています。

```CSS
.index-list{
   background-color: #f3f3f3;
   border-radius: 8px;        /* CSS3草案 */
   -webkit-border-radius: 8px;    /* Safari,Google Chrome用 */
   -moz-border-radius: 8px;   /* Firefox用 */
   padding:16px;
 }
.index-list h2{
  font-size:80%;
  line-height:0;
  padding: 0 0 1em 0;
}
```

今度は、これを外部ファイルにして、headの読み込みだけで処理できるようにしたいと思います。