OmniAICreator/Qiita-1.07M huggingface dataset:
Visioでマスターシェイプを作ってみた

# 概要
FPGAの回路設計のときにデータの流れの図を書こうと思ったらいい感じの図形がなかったので作ってみましたが、忘れるといけないのでマスターシェイプを作るときの手順をまとめました。

# ステンシルを開く
まずは図形を保存するステンシルというものを開くか作成します。
![1.PNG](https://qiita-image-store.s3.amazonaws.com/0/140084/4a94eb70-95de-1477-5cd5-93a48f47fa37.png)
「その他の図形」から「新しいステンシル」で新規作成するか、「ステンシルを開く」か「個人用図形」から既存のものを選びます。


開いたステンシルを右クリックし、ステンシルの編集を選択します。
![2.PNG](https://qiita-image-store.s3.amazonaws.com/0/140084/2a6abe7f-8d3f-da38-d94e-5b63e792fd68.png)

これでステンシルに図形をつかしたり編集したりできます。

# マスターシェープを作成する
図形が並んでいるところを右クリックし、「新しいマスターシェイプ」を選択して新規作成します。
![3.PNG](https://qiita-image-store.s3.amazonaws.com/0/140084/8b1a61bb-df22-e469-2ed1-f8af18ed59f9.png)

出てきたダイアログに名前とか適当に埋めてOKを押します。
![4.PNG](https://qiita-image-store.s3.amazonaws.com/0/140084/a42ec7c2-5af5-eced-e633-3c28415c6b4c.png)

# マスターシェープを編集する
編集したい図形を右クリックして「マスターシェープの編集」から「マスターシェープの編集」を選びます。
![5.PNG](https://qiita-image-store.s3.amazonaws.com/0/140084/fb736ff8-952e-5fd6-62eb-62eec444399f.png)

新しい画面が開きますのでここで適当に図形を描きます。
マルチプレクッサーなので適当に台形を書きます（あとで微調整します）
![6.PNG](https://qiita-image-store.s3.amazonaws.com/0/140084/2c877da7-63b6-3978-8085-0982868107e4.png)

それからコネクタを接続するポイントを追加します。
「ホーム」タブの「ツール」から「接続ポイント」を選択（ショートカットキーShift+Ctrl+1）し
![7.PNG](https://qiita-image-store.s3.amazonaws.com/0/140084/7414460d-67e1-0b48-b0f0-81dbd70d1e0f.png)


追加したい点をCtrlを押しながらクリックします。
![8.PNG](https://qiita-image-store.s3.amazonaws.com/0/140084/471dc6a4-d932-6832-7a45-ac5242a3bdb6.png)

追加できると黒い小さな四角形が表示されます（位置はあとで微調整します）
3入力のマルチプレクッサーなので上側に3箇所、下側が出力なので1箇所、左側にセレクター用で1箇所追加です。

# シェイプシートを編集
マウスで微調整をしてもいいのですが正確に真ん中とかが難しいのでシェイプシートというものを編集します。

図形右クリックで「シェイプシートの表示」を選択します。
![9.PNG](https://qiita-image-store.s3.amazonaws.com/0/140084/b69047e1-617d-ecf8-2a99-b373676582db.png)

すると幅とか座標とか接続ポイントの座標なんかが編集できます。
![10.PNG](https://qiita-image-store.s3.amazonaws.com/0/140084/e5e6a1e8-e7e7-5012-6336-b2e8fe9eaf96.png)

接続ポイントや描いた線などは幅や高さを使って指定できるので3頭分とか真ん中とかは簡単にできます。

Geometoryが図形のパスの座標、Connection Pointsが接続点のパラメーターです

こんな感じにしてみました。
![11.PNG](https://qiita-image-store.s3.amazonaws.com/0/140084/d32e0152-29ea-1d71-84c7-9a0a5a95298b.png)

編集して閉じると図形に反映されます。
![12.PNG](https://qiita-image-store.s3.amazonaws.com/0/140084/061f3a96-36a1-2760-6a1e-719fa00f6f74.png)

最後にマスターシェープを閉じれば保存されます。

# 使ってみる

他の図形と同じようにドラッグ・アンド・ドロップで追加できます。

コネクタでつなげようとするとちゃんと追加した接続ポイントにつなげてくれます
![14.PNG](https://qiita-image-store.s3.amazonaws.com/0/140084/60fa55f8-e7df-2939-74d0-e7b1031bf9f5.png)

たくさんつなげてみた
![15.PNG](https://qiita-image-store.s3.amazonaws.com/0/140084/f0ab4b9f-b0e6-6c7e-5650-b9e1277fe927.png)

# 終わりに
まだシェイプシートは使いこなせていませんが、適当に図形を書いて接続点を追加するだけでかなり使えるのではと思います。
Android Studioで「the number of method references cannot exceed 64k」が表示された時の対処法

## はじめに

Android Studioでビルドを実行時に以下のようなエラーが表示され、ビルドが通らなく問題が発生しました。

```text:errorメッセージ
the number of method references cannot exceed 64k
```

今回のエントリではこの問題を解決する方法を説明していきます。

## 1. multiDexEnabled true を追加

私の場合、app/build.gradle に multiDexEnabled true を追加しただけで解決しました。
詳しい解説は、[公式サイト](https://developer.android.com/studio/build/multidex.html?hl=ja)や[こちらのサイト](http://onlineconsultant.jp/pukiwiki/?Gradle%20DSL%20method%20not%20found%20%20multiDexEnabled())に書いていましたので確認してみてください。
私も時間があるときにもう少し詳細を調べてまとめてみたいと思います。
具体的に追加する内容は以下の通りです。

```text:app/build.gradle
    .
    .
    .
    defaultConfig {
        applicationId "org.example.samplecode"
        minSdkVersion 21
        targetSdkVersion 23
        versionCode 10001
        versionName "1.0.1"
        multiDexEnabled true  // ここを追加
    }
    .
    .
    .
```

## 参考文献
1. Configure Apps with Over 64K Methods _ Android Studio, https://developer.android.com/studio/build/multidex.html?hl=ja, Online; accessed 5-December-2016.
2. Gradle DSL method not found multiDexEnabled() -でじうぃき, http://onlineconsultant.jp/pukiwiki/?Gradle%20DSL%20method%20not%20found%20%20multiDexEnabled(), Online; accessed 5-December-2016.
VR開発でよく使う（であろう）照準の実装とRayについて

![スクリーンショット 2016-12-04 23.29.06.png](https://qiita-image-store.s3.amazonaws.com/0/72204/57152cf3-5435-b9ec-300f-053f29b77766.png)

上の画像のような照準(reticle)を実装する方法です。
コントローラーが使えないスマホ用VRアプリ開発などでよく使われるかと思います。

銃の位置は適宜合わせてください。

#前提
- 照準の画像がある（なくても良いがその場合は適宜やってください）
- カメラがある

#実装
Hierarchyビューで`Empty Object`を作り、それにScript(ここでは`RayScript`)をアタッチする。

```C#:RayScript.cs
void Update () {
    Ray ray = new Ray (camera.transform.position, camera.transform.forward);
    RaycastHit hit;

    if (Physics.Raycast (ray, out hit)) {
        reticle.transform.position = hit.point;
    }
}
```

Rayを使ってカメラの位置から前に向かって見えない光線のようなものを飛ばしています。
Rayが当たったオブジェクトの情報を`RayCastHit`型の変数で受け取っていて、`hit.point`で衝突したオブジェクトの位置が取れます。
それを、reticle(照準)の位置に更新しているわけです。

#Rayについて
上述した通り、ある位置からある位置へ見えない光線のようなものを飛ばし、光線が衝突したオブジェクトの情報を取得できます。
今回はカメラの向いている方向にRayを飛ばしましたが、他にもたくさん便利な使い方があって、
`Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);`
のようにすると、クリックした座標に向けて、カメラからRayを飛ばすことができます。

#Rayを使って敵を倒す
Rayを使えば光線の当たったオブジェクトの情報を取得できると上述しましたが、それを使っていろんな事ができます。
以前作ったアプリで敵を倒すのに使った方法の一つを紹介します。

```C#:RayScript.cs
void Update () {
    Ray ray = new Ray (diveCamera.transform.position, diveCamera.transform.forward);
	RaycastHit hit;

	if (Physics.Raycast (ray, out hit)) {
            reticle.transform.position = hit.point;

        //もしRayが衝突したオブジェクトのタグが"Monsterだったら"
	    if (hit.collider.tag == "Monster") {

            //Rayが当たっている時間をincrease
	        gazedTime += Time.deltaTime;

	        // 発射してリセット
		    if (gazedTime >= 1.4f) {
		        Destroy(hit.collider.gameObject);
			    gazedTime = 0;
		    }
	    }
	}
}
```

hitをRaycastHit型だとしたときに

- `hit.collider.gameobject`でRayの衝突したゲームオブジェクトが、
- `hit.collider.tag`でそのゲームオブジェクトのタグが

取得できます。
照準が当たった瞬間に敵が破壊されてはつまらないので、ここではgazedTimeを定義し、1.4秒間当て続けないといけないようにしました。

#おまけ

単にDestroyするだけだとつまらないので、その下でparticleなどを使って演出すると良いかもしれません。
僕はこんな感じでやってます。

`Instantiate (explosion, monster.transform.position, Quaternion.identity);`

explosionには、爆発っぽいparticleをアタッチしておいてます。
DXライブラリをBorlandC++Compilerでバッチコンパイルする

#はじめに
DXライブラリでコンパイルするだけのためにIDEを起動するのは面倒くさいので
バッチを起動するだけでコンパイルできるようにしました

#準備
1. Borland C++ Complier をインストール
2. DXライブラリのホームページよりBCC版のライブラリをダウンロード
3. 解凍して「プロジェクトに追加すべきファイル_BCC用」を「DxLib_BCC」に書き換えて保存
4. "C:\borland\bcc55\Bin"に以下の二つのファイルを作って入れてください

```ilink32.cfg
-L"c:\Borland\Bcc55\lib"
```
```bcc32.cfg
-I"c:\Borland\Bcc55\include";"c:\DxLib_BCC"
-L"c:\borland\bcc55\Lib;c:\borland\bcc55\Lib\PSDK";"c:\DxLib_BCC"
```

これで準備は完了です

#コンパイルとか
ワークディレクトリを作ってその中に
**DXCmp.bat**と**sourceというフォルダ**を作って
sourceのフォルダに作ったソースファイルを入れてください
DXCmp.batは以下のように記述してください

```DXCmp.bat
set EXE_NAME="DXOutput"
set path=%path%;c:\borland\bcc55\bin
cd /d %~dp0

bcc32 -e"%EXE_NAME%.exe" -w-8094 -tW sources/*.cpp
%EXE_NAME%.exe
```

EXE_NAME="DXOutput"のDXOutputはお好みの出力exe名にすれば
batをダブルクリックするだけでコンパイルしてくれます
Farraday MiddlewareによるOAuth認証について

#はじめに
Faraday Middlewareのoauthやoauth2についての記事が少なかったので，ソースコードを読んで分かったことを備忘録として残しておく．

#環境
macOS Sierra (10.12.1)
ruby 2.0.0p648 (2015-12-16 revision 53162) [universal.x86_64-darwin16]
faraday (0.10.0)
faraday_middleware (0.10.1)

#Faradayについて
まずFaradayについて．
`gem install faraday` でインストールできる．HTTPクライアントの一つ．Rubyで単にGETやPOSTしたかったら標準ライブラリのNet::HTTPを使えばよいが，少し複雑になるとFaradayのほうがスッキリと書ける．また，Faraday Middlewareを使うことで，json形式のレスポンスのパースやOAuth認証，URLエンコードなどが楽にできるようになる．

以下，Faraday Middlewareを使わない場合の，基本的な使い方．

```ruby
conn = Faraday.new(:url => 'https://hoge') do |faraday|
  faraday.request :url_encoded
  faraday.adapter Faraday.default_adapter
end

#https://hoge/fugaにGETリクエストを送る
conn.get('/fuga')

#?foo1=bar1&foo2=bar2というクエリパラメータを付けて送る
#方法１
conn.get('/fuga', { :foo1 => bar1, :foo2 => bar2 } )

#方法２
conn.get do |req|
  req.url '/fuga'
  req.params[foo1] = bar1
  req.params[foo2] = bar2
end
```

`get`や`post`のブロックに`req.headers['foo'] = bar`や`req.body = %({ "foo": "bar" })`などとすればヘッダやボディも記述できる．

Faraday Middlewareを使う場合，`Faraday.new`のブロック内に明記する．例えば，

```ruby
Faraday.new(:url => 'https://hoge') do |faraday|
  faraday.request :oauth, options
  faraday.request :url_encoded
  faraday.response :json
  faraday.adapter Faraday.default_adapter
end
```

とする．request，response，adapterの順番．requestは重要な順，responseは重要でない順に並べる．default adapterはNet::HTTP．

インストールは`gem install faraday_middleware`でできる．

#FaradayMiddleware::OAuthについて
Faradayで簡単にOAuth1認証を行うためのmiddleware．

```ruby
faraday.request :oauth, options
```

とする．この中身はSimple OAuthを用いた単純なものだが，optionsを指定するだけでよいので楽である．

optionsには`:consumer_key`，`:consumer_secret`，`:token`，`:token_secret`をHashで与える．このHashがそのままSimpleOAuth::Header#newへ渡され，アクセストークンや署名などを必要な形式に整えてリクエストのAuthorizationヘッダへ返す．Authorizationヘッダがすでに設定されているときは上書きされない．

#FaradayMiddleware::OAuth2について
Faradayで簡単にOAuth2認証を行うためのmiddleware．

```ruby
faraday.request :oauth2, token, options
```

とする．tokenはString，optionsはHashで指定する．tokenにはアクセストークンを与える．省略可（省略したら，リクエストする際に手動で指定する）．デフォルトはnil．optionsも省略可．

リクエストごとに，クエリパラメータのaccess_tokenとAuthorizationヘッダの両方にtokenを加える．すでに値が存在する場合は上書きしない．

`options[:param_name]`を指定したときは，クエリパラメータのaccess_tokenがその値（に`#to_s`したもの）に代わる（例: `options[:param_name] = my_access_token`としたら`?my_access_token=token`となる）．`options[:param_name]`が存在しないとき（デフォルト）はaccess_tokenである．

#まとめ
```ruby
def connection
  Faraday.new(:url => url) do |faraday|
    faraday.request :oauth, options
    faraday.request :url_encoded
    faraday.adapter Faraday.default_adapter
  end
end
```
のようにしておけば，手軽に認証ができる．TwitterであればRubyGemsを使ったほうが便利なのだが，汎用性は高いと思う．
VulsのログをElasticSearchに取り込んで可視化する

この記事は、[Vuls Advent Calendar 2016](http://qiita.com/advent-calendar/2016/vuls)の4日目の記事です。

# はじめに
前回はEXCELを使ってレポートを作成しましたが、システムの規模が大きいとVulsが出力するログの量も膨大になり、EXCELで処理することができません。
またVuls以外で管理している構成情報と組み合わせたり、ドリルダウンしながらインタラクティブに分析したい場合、ログデータの可視化ツールを使うと良いと思います。

今回は、ElasticSearchとKibanaを使ってVulsのログを可視化したいと思います。


# Vuls JSON→ElasticSearchへBulkインサート
前回、「[VulsのログをCSVにしてExcelで可視化する](http://qiita.com/usiusi360/items/b5f19346f3276a963eef)」にて使用したnode.jsのスクリプトを使います。

GitHub：https://github.com/usiusi360/vuls-log-converter

インストール方法は[そちら](http://qiita.com/usiusi360/items/b5f19346f3276a963eef)を見てください。

# ElasticSearchの準備

今回は時間短縮のために[Amazon Elasticsearch Service](https://aws.amazon.com/jp/elasticsearch-service/)を使いました。作成時のパラメータは以下のような感じの最小構成で。

> Elasticsearch version：2.3
> Instance count：1
> Instance type：t2.micro.elasticsearch
> Storage type：EBS
> EBS volume type：General Purpose(SSD)
> EBS volume size：10GB
> access policy：「Allow access to the domain from specific IP(s)」

ちなみに今回はIPアドレスによるフィルタだけです。
時間がなかったのでvuls-log-converterではIAM認証はしていません。その辺は今後気が向いたらってことで。

# 実行

「-i」でVulsが出力したJSONファイルが入っているフォルダを指定し、「-e」でElasticSearchのエンドポイントを指定します。入力元にフォルダを指定すると中に入っているJSONファイルを変換しつつ、ElasticSearchへ直接Bulk insertします。

```
$ node ./vuls-log-converter.js -t els -i /opt/vuls/results/current/ -e https://search-vuls-hogehoge.ap-northeast-1.es.amazonaws.com/
```

# Kibana

- ElasticSearchにデータをインポートできたら、kibanaでインデックスを指定します。
    - index name or pattern：vuls_index
    - Time-field name：ScannedAT
![image](https://qiita-image-store.s3.amazonaws.com/0/54952/e121a2a3-ddf9-8930-8c1b-2b119ba1a4a7.png)

- 今回はやってませんが、インポート前にマッピング定義しておいた方が良いかも。CveIDがハイフンで分離されてしまうのでnot_analyzedにしておきます。
![image](https://qiita-image-store.s3.amazonaws.com/0/54952/4f46f636-52fc-f606-1d8a-28711be26d4e.png)

- あとはKibanaで好きなようにダッシュボードを作成します。
![image](https://qiita-image-store.s3.amazonaws.com/0/54952/02c48995-7931-1373-7060-dcbfa2ca09f6.png)

# さいごに
ElasticSearchにVulsのデータをインポートしてダッシュボードを作成することができました。ダッシュボードにすることでシステム全体の状態を一目で俯瞰することができるようになり、毎日のチェックが楽になるのでオススメです。

Vuls Advent Calendar 5日目はjkudoさんです。よろしくお願いします。
Pythonの軽量なwebフレームワークFalconでテストまで書く 

# Falconとは

PythonのWebフレームワーク
https://falconframework.org/

仕事で簡単なAPIサーバをPythonでつくる必要があったので、高速で余計な機能のないFalconを選んでみた

# Install

PythonとPyPyがインストールされている前提

```
pip install falcon
```
簡単。現在(2016/12)はv1.1

Macに入れる時は少し異なる？ 詳細は公式で。
https://falcon.readthedocs.io/en/stable/user/install.html


# 簡単なjsonを返すAPIサンプル

以下は /hoge/{id} にgetでアクセスした時にjsonを返すAPIのサンプル

```py

# api.py

import falcon
import json

class HogeResource(object):
    def on_get(self, req, resp, id):
        """Handles GET requests"""
        resp.status = falcon.HTTP_200
        resp.body = json.dumps({ 
                      "result": true, 
                      "message": "success!",
                    })

api = falcon.API()
hoge = HogeResource()

api.add_route('/hoge/{id}', hoge)
```

falcon.API()のインスタンスにadd_routeで, urlとon_get(またはon_post,on_put等)を定義したクラスのインスタンスを渡すだけでOK。簡単！

@falcon.beforeとか使ってバリデーションも行える

```py

def validate(req, resp, resource, params):
    try:
        params['id'] = int(params['id'])
    except ValueError:
        raise falcon.HTTPBadRequest('Invalid ID',
                                    'ID was not valid.')
class HogeResource(object):

    @falcon.before(validate)
    def on_get(self, req, resp, id):
        #..略..
```

# 動作確認
WSGIサーバとして今回はgunicornを使う

api.pyというファイル名で上のコードを書いた時は

```
pip install gunicorn
gunicorn api:main

curl localhost:8000/hoge/12345
```

## テスト

テストもサポートされているので書いてみた
http://falcon.readthedocs.io/en/stable/api/testing.html

```py


#api_test.py

import falcon
import falcon.testing as testing

from api import api

class TestHogeResource(testing.TestCase):

    def setUp(self):
        super(testing.TestCase, self).setUp()
        self.api = api

    def test_hoge(self):
        result = self.simulate_get("/hoge/12345")
        self.assertEqual(result.status, falcon.HTTP_200)

    def test_hoge_error(self):
        result = self.simulate_get("/hoge/moge")
        self.assertEqual(result.status, falcon.HTTP_400)

```

## テストの実行

testtoolsをインストールして使う

```
pip install testtools
python -m testtools.run api_test.py

> Ran 2 tests in 0.001s
> OK
```
画面描画時に searchBar にフォーカスを当てキーボードを表示する

画面描画時に UISearchController の searchBar にフォーカスが当たりキーボードが表示されている状態になってほしい。

`viewDidLoad` とかで `searchController.searchBar.becomeFirstResponder()` を呼べばいけるかな〜と思ったけどちょっと頑張らないといけなかったのでメモ。

## 前提

すでに画面に searchBar が表示されるくらいのコードはできていること。

## searchController.isActive = true

`viewDidAppear` で `searchController.isActive = true` にする。
Active になると SearchBar のキャンセルボタンが表示される状態になる。

```swift
    override func viewDidAppear(_ animated: Bool) {
        searchController.isActive = true
    }
```

## UISearchControllerDelegate

`UISearchControllerDelegate` にある `didPresentSearchController` 内で `becomeFirstResponder` を呼ぶ。

delegate を使うということは、 `viewDidLoad` などで `searchController.delegate = self` などしておく必要がある。

```swift
extension MyViewController: UISearchControllerDelegate {
    func didPresentSearchController(_ searchController: UISearchController) {
        searchController.searchBar.becomeFirstResponder()
    }
}
```

これで画面描画時に自動で searchBar にフォーカスが当たり、キーボードが出るはず！
searchController のロードが完了しないと `becomeFirstResponder()` が利かないらしく、表示を待つ必要があるとのこと。

## 全体

実際のコードが必要なところを削ぎ落としたので、もしかしたらエラー出て動かないかもです。。
全体としてこんな感じで実装できますという、雰囲気を掴んでいただければ。

```swift
import UIKit

class MyViewController: UIViewController {
    @IBOutlet weak var tableView: UITableView!
    var searchController = UISearchController(searchResultsController: nil)

    override func viewDidLoad() {
        super.viewDidLoad()
        searchController.delegate = self
        tableView.tableHeaderView = searchController.searchBar
    }

    override func viewDidAppear(_ animated: Bool) {
        searchController.isActive = true
    }
}

extension MyViewController: UISearchControllerDelegate {
    func didPresentSearchController(_ searchController: UISearchController) {
        searchController.searchBar.becomeFirstResponder()
    }
}
```

## 参考

[ios \- Cannot set searchBar as firstResponder \- Stack Overflow](http://stackoverflow.com/questions/27951965/cannot-set-searchbar-as-firstresponder)
【初心者向け】Rails のRoutesの書き方

## rails におけるルーターの役割とは
Railsのルーターは受け取ったURLを認識し、それを適切なコントローラー内のアクションに割り当てるために存在する。ルーターではここで定義されるパスやURLをビューで直接ハードコードすることを避けるためのパスやURLを生成することも出来る。

## 基本的なURLをroutesのコードに割り振る書き方
以下のHTTPリクエストをrailsアプリケーションで受け取れるようにするならば、

```
GET /user/14
```

それにマッチするroutesの書き方は以下となる。

```
get 'user/edit/:id' to: 'user#edit'
```

このリクエストはuserコントローラーのeditアクションに割り当てられ、paramsにはid:１４がはいる。

パラメータで渡すidを数値のみしたいときなどは正規表現でしているすることが出来る。
```
get 'user/:id' to: 'user#show', id: /\d+/
```

また、以下のように書くことで、viewなどでルーティングヘルパーを使用することが出来る。
```
get 'user/:id' to: 'user#show', as: 'user_show'
```

viewではこのようにして書くことが出来る。
```
<%= link_to '編集', user_show_path(@user) %>
```

## リソースベースのRailsのデフォルトの書き方
リソースフルな書き方を適用することで、コントローラーに対応する、index、show、new、edit、create、update、destryアクションを個別に宣言しなくても一行で定義できる。
そして、ブラウザがRailsに対してリクエストを送信する際に使用するGET、POST、PATCH、PUT、DELETEなどHTTPメソッドをそれぞれのアクションに割り当ててくれる。

例えば
```
DELETE　/user/13
```
というリクエストに対して

```
resource :users
```
をroutesに定義しておけば、勝手にUserコントローラー内のdestroyアクションに割り当ててくれる。
上記一つを定義するだけで、以下のroutesが自動的に作成される。

```
GET /users users#index
GET /users/new users#new
POST /users users#create
GET /users/:id users#show
GET /users/:id/edit users#edit
PATCH/PUT /users/:id users#update
DELETE /users/:id users#destroy
```

デフォルトで作成される７つのルーティングに他のアクションを追加するには以下の用に定義する。

```
resources :user do
   get 'preview' on: :member
end
```

## その他
- routesは上に定義されたものから優先的に読まれていく
- namespaceの定義 
    - コントローラーを名前空間によってグループ化出来る。
    
```
namespace :mobile do
  resouces :users
end
```

- resourcesは以下のようにネストすること複数のオブジェクトを扱える。
※ネストすることでルーティングが扱いづらくなってしまうので、二回以上は推奨されていない。

```
resources :user do
  resouces :article 
end
```
リトライ処理を設計段階から明文化していこう！

# はじめに
これは、[システムエンジニア Advent Calendar 2016](http://qiita.com/advent-calendar/2016/se) の5日の記事です。

みなさーん、リトライ処理を書いてますか？
え、書いたことすらないって。私も10数年SEをやっていて幾つものプロジェクトを経験していますが、リトライ処理を書いたのは数回程度です。
もしかしたら、ライブラリー側にリトライ処理が書かれていて意識されてないってこともありえますけどね。

その数回のリトライ処理も改善対応による後付けのもので、設計段階からリトライ処理を組み入れたことはありません。

# リトライ処理とは
リトライ処理は、ある処理で何らかのエラーが発生した際、処理が成功するまで無条件かリトライ回数だけ、一定秒数待機するなどしてから繰り返す。
また、エラーに特定のコードや文字列が含まれていた場合のみリトライすることもある。
リトライ処理されたらログ出力し、リトライさせた原因が分かるようにしておくとよい。

# 臭い物に蓋をするな
とあるお客さまからリトライ処理で解決しようとしたら「臭い物に蓋をするな」と言われました。
これまでの経緯で何かあると安易にリトライ処理で解決させようとして、エラーが発生する原因を特定せずにいるという姿勢を正された形です。
この言葉は非常に印象に残っており、今回この記事を書く理由になっています。

確かに原因が特定できることが一番いいわけですが、複雑化した現在のコンピューターではエラー内容を見ても原因を特定すら出来ないこともあるわけで、調査するコストもばかにならなく、頻度が多く業務に支障が出ては意味はないのでリトライ処理は入れさせて頂き、調査は追い追いで対応となることも。

# 調査中の案件
現在、CreateProcessを使用して外部プロセスを起動している処理があり、何かのプログラムが外部プロセスを掴んでいるためエラーが発生しており、再度繰り返せば処理が正常に動作することが分かっています。
リトライ処理を組み込めばいいのですが、何が外部プロセスを掴んでいるのか調査してからということになり、エラーが発生したら開いているプロセスを特定する「[Handleツール](https://technet.microsoft.com/ja-jp/sysinternals/bb896655.aspx)」をバッチ実行するようにしています。

マーフィーの法則では無いですが、調査しようとするとエラーが出なくなるということで、数ヶ月してもまだ1回しか発生していません。
その1回では「System pid 4」という結果が出て、密かにウィルス駆除ソフトを疑っていたわけですが、プロセスIDの4番はNT kernel & Systemであり調査難航確実で、これはこれで困ったものです。

# リトライ処理が出来ない
サーバー管理している30拠点に対して、Windows Server 2003がサポート終了に伴いWindows Server 2008R2にサーバーバージョンアップしたわけですが、レガシーASP＋Oracle11gを使用しているシステムにて、月に数回は30拠点あるどこかのサーバーでセッション切れが発生するようになりました。

発生したサーバーでも数ヶ月期間が開くこともあり、アクセス多いことが原因でもなく、作業していない時間帯でも発生することもあり、原因の特定が難航していました。
セッション切れが発生するのは「oracore10.dll」のクラッシュが原因で、IIS内のプロセスがクラッシュすることでアプリケーションプール単位で再起動され、その際にワーカープロセスがもう1つ起動してアプリケーションプールを引き継ぐ仕組みとなっている。ただ引き継いだらプロセスは切れるため、前のプロセスに紐付いていたセッション情報が消えてしまう。
セッション情報が消えてしまうと、このシステムではリトライ処理しても意味がない状態になってしまい、場合によってはデータに不整合が生じてしまう。そのため、セッション切れが発生するとデータに不整合が発生していないか確認する必要がありました。

「oracore10.dll」がクラッシュが原因が何か分からないですが、Oracleのlistener.logには「TNS-12547: TNS: 接続を失いました。64-bit Windows Error: 54: Unknown error」が残っています。
Oracleサポート側から提案されたのは、sqlnet.ora 内を(NTS)から(NONE)にしてはどうかで、設定変更後から半年ほど経過しましたがセッション切れが発生しなくなりました。ただ、listener.logをみると「Windows Error: 54: Unknown error」はたまに発生しているようです。
sqlnet.ora を(NTS)にしていたのではデフォルトの設定だからです。

```bat:sqlnet.ora
SQLNET.AUTHENTICATION_SERVICES=(NONE)
```

# 最後に
リトライ処理について書いたのですが、後半は皆さんにはあまり関係ない記事になってしまいましたがどうしても書きたかったのです、すみません。

コンピューターの性能向上やHDD容量とメモリの増加、ネットが普及したことにより、セキュリティ面がより強化されてOSやデータベースでも監視という名目でいろいろな処理が裏側で動作するようになりました。またウィルス駆除ソフトが導入されていることが前提になったりとコンピューターの処理内部はより複雑化してきています。

有能な開発者であればプログラム作成で暗黙の了解でリトライ処理がされているようになっているかも知れませんが、もはやシステム設計の段階からリトライ処理を考慮して明文化するようにしていきましょう。
また、リトライ処理されたらログ出力し、リトライさせた原因が分かるようにしておくといいですね。
kobitoでも```mathで数式を入力できるようにしてほしい


Qiitaでは ```mathで数式の入力ができますが、kobitoではその方法で数式の入力ができません。

kobitoを使ってQiitaに投稿することが多いので、kobitoでも```mathで数式を入力できるようにしてほしいです。

数式機能もそうですが、他の機能についてもkobitoはQiitaのwebエディタよりも機能が貧弱な気がします・・・

# kobito
![スクリーンショット 2016-12-04 12.34.54.png](https://qiita-image-store.s3.amazonaws.com/0/74551/4bd0f5e4-607d-dab8-76f7-3824168b34fd.png "スクリーンショット 2016-12-04 12.34.54.png")

# Qiita
![スクリーンショット 2016-12-04 12.31.58.png](https://qiita-image-store.s3.amazonaws.com/0/74551/5e82958e-76b0-ce38-95e8-5832ea6bdca7.png "スクリーンショット 2016-12-04 12.31.58.png")
文系・未経験から新卒でエンジニアになってみて思うこと

この記事は[フロムスクラッチ Advent Calendar 2016](http://qiita.com/advent-calendar/2016/fromscratch)の4日目の記事です。

# 想定読者
* 未経験でエンジニアをやっている人
* エンジニアになろうかぼんやりと考えている人
* エンジニアってなんだろうって考えたい人

# 自己紹介
今年の3月に大学を卒業した新人エンジニアです。
大学は文系（経済学部）でプログラミングも未経験でしたが、現在はフロムスクラッチというベンチャー企業で曲がりなりにも開発の部署に所属し、エンジニアとして働いています。
タイトルにある通りのテーマで普段考えていること・感じていることを自由に書いてみたいと思います。

# エンジニアとしての経緯を少し詳しく

筆者のバックグラウンドを紹介します。

* 就職活動を通じてエンジニアという職業に興味を持つ
* 2015年3月に現在働いているフロムスクラッチから内定を頂き、インターンを開始
* 2015年秋期の応用情報技術者試験に合格
* 2016年2月にTECH::CAMPというRuby on Rails合宿に参加
* 2016年4月フロムスクラッチ入社、ベトナム拠点のマネジメントを担当
* 2016年10月保守運用部から新規開発部に異動し、現在は要件定義やインフラなど幅広く担当

内定直後からエンジニアとして働いていたわけではないので、エンジニア歴は1年半ほどとなります。
言語としてはJavaScriptを触っていた時間が最も長く、UI/UXデザインにも興味があるのでJavaScriptという言語は個人的には好きです。
あとは業務でRubyを使うので、Rubyの勉強も継続してやっています。

就職活動を通じてエンジニアという職業に興味を持ったとありますが、これはもうほぼ憧れに近いものでした。ここ数十年で最も世界を変えてきた、また、これからも世界をどんどん面白いものに変えていきそうなITというものに直に触れ合っている職業で、世界の最先端を走っている職業だというイメージを持っていたからです。

# エンジニアという職業の良いところ
実際にエンジニアになってみて、この職業の良いところだなと思う点について書きます。

* ####ITというものに触れ合える職業であること
これはそんなこと当たり前だろと思われるかも知れませんが、普通に文系就職していたらこんな経験はできなかったなぁと大学の同期を見ていて強く思います。
やはり現代で新たに生み出されるサービスにはITが絡んでいることが多く、その仕組みを詳しく知ることができるのはこの職業の強みです。もちろん他のサービスの仕組みを知るだけでなく自分のITスキルを活かして自分でサービスを作れるようになるというのも大きな利点だと思います。

* ####ヨコの繋がりが強いこと
Qiitaのようなサービスも含め、勉強会やセミナーなど、エンジニア同士の繋がりが非常に強いと感じます。自分はいくつか興味がある勉強会に参加したことはあるのですが、他の職種だとこんな機会はなかったのかなと思います。
そういう意味では未経験の初心者にも優しいと感じます。

* ####色々なものから自由になるチャンスがあること
[フロムスクラッチ Advent Calendar 2016の2日目の記事](http://qiita.com/MasahiroSato/items/bf1a0f69e6ecc6a04f8a)とも関連しますが、他の職業よりは個人の自由度が高いように思います。
うちの会社は勤怠はしっかりしている方だと思いますが、服装は自由ですし、スーツ毎日着るのもなぁ...と思っていた自分にはとてもありがたいです（笑）
服装は些細な事ではありますが、極論PC1つあれば働くことができるので場所というものからは解放されます。
また、これは個人的には非常に大きいのですが、業種からも解放されます。今はIT×◯◯という時代なので、◯◯に何を選択するかはある程度自分で選択できるかなと思います。
ぶっちゃけ自分が今後どういった分野に興味が出てくるかわからない新卒1年目としてはありがたいです。

# エンジニアという職業の悪いところ

実際にエンジニアになってみて、この職業の難しいところだなと思う点について書きます。

* ####常に勉強し続けなければならないこと
もちろんどの職業でも新卒1年目は勉強というかインプットは大切だろうなと思うのですが、エンジニアは新しい技術が登場し続け、そのスピードも早いという点で特に大変かなと思います。
自分はコンピュータサイエンス的な分野の知識もないまま働いているので、ベースとなる知識＋業務で必要な分野＋興味を惹かれる最新技術という3本立てで勉強していく必要があります。僕自身は楽しんでやっているので問題ないのですが、苦痛に感じる人にはかなり大変かと思います。

* ####コミュニケーションに癖がある人が一定数いること
なんとなく入社前のイメージとして、エンジニアには気難しい人や扱いづらい人が多そうというイメージを持っていましたが、これは実際にそうかなと思います。
めちゃくちゃ多いかと言うとそんなことはありませんが、少なくとも学生時代までに関わったことがあるタイプとは全く違うタイプの人間がいるな、とは思います。
とはいえチームワークが非常に重要なので、人を動かす力が鍛えられます。

* ####ビジネススキルが蔑ろにされがちなこと
なんとなく技術的なスキルが最優先とされ、ビジネスパーソンとしてのスキルが下に見られる風潮はあるかなと感じます。プレゼン力がある人を口だけとか見せ方がうまいだけと言ってみたりとかはあるかな、と。
すごいエンジニアってビジネスパーソンとしても優れている方が多いと思いますが、そういった側面はメディアでもあまりフィーチャーされていないかな〜と思います。
また技術に関してはしっかりキャッチアップしていてもビジネス書は毛嫌いして読まない人も多いような印象があります。
逆に言えばそういったスキルも含めて身につけていけば希少価値の高い人材になれるように思います。


# エンジニアという職業に向いている（と思う）人
上記を踏まえて、僕が思うエンジニアに向いているの要素は以下の3つです。

* ####新しいことを学ぶことが好きな人
→新しいことを学び続けるとそれが仕事になります。

* ####論理的思考能力に優れている人
→記事中では特に触れていませんが、やはり必要です。

* ####チームワークを重視できる人
→[Team Geek](http://amzn.asia/hfmtE1A)などにもありますが、最重要だと思います。

特に追加で説明することはないかなと思うので、これで終わりたいと思います。

# 余談
会社のアドベントカレンダーということで、文系・未経験からエンジニアになってみて感じたことを書いてみました。
ベンチャー企業という環境なのである程度特殊な部分はあるかと思いますが、自分にとってはエンジニアという仕事は非常にやりがいがあって面白いので、文系が抱きがちな謎のハードルを越えてもっと多くの人にチャレンジしてもらいたいなと思います。

では、明日はアドベントカレンダー言い出しっぺの[ddddbirdさん](http://qiita.com/ddddbird)、よろしくお願いします！
Gitのブランチモデルについて

# はじめに
5日目は、[スマートテック・ベンチャーズ](https://www.wantedly.com/projects/72590?ql=gaJpZM4AKYPb)の奥寺(@okuderap )が担当いたします。

今回はGitのブランチモデルについてです。
私はGitを使い始めたばかりの頃、masterブランチ1本で開発進めてしまったり
どのようにブランチを使い分ければ良いのか全然わかりませんでした。

私が経験した好ましくないケースをいくつか挙げて
最後に、それらの問題点を解消したブランチモデルをご紹介いたします。

※**iOS開発において、Gitを使った経験を記載します。**
製品やサービスの開発に利用する場合は通じることがあると思いますが、
プロジェクトによって変わる部分もございます。

#Case1: masterブランチ1本
私がGitを触り始めたばかりの頃はこの使い方でした。

【開発作業の流れ】
1. なんでもかんでもmasterブランチにコミットする

【登場するブランチ】
master:
　開発を進めたら全てこのブランチにコミットされる

イメージ
![Case1.JPG](https://qiita-image-store.s3.amazonaws.com/0/103695/ecc708c0-8389-e7d2-03eb-88befbd95d4a.jpeg)


【問題点】
・リリースした時点などの安定バージョンを残すことができない。
などなど。

#Case2: master&developブランチ
Case1から半歩進んだ？ぐらいです。

【開発作業の流れ】
1. 開発開始時点でmasterブランチからdevelopブランチを作成
2. 開発作業中は全てdevelopにコミット
3. リリース時点でdevelop → masterマージ

【登場するブランチ】
master: 
　リリースした時点のソースコードを管理するブランチ
develop (masterから派生):
　開発作業用のブランチ

イメージ
![Case2.JPG](https://qiita-image-store.s3.amazonaws.com/0/103695/69d1c6b6-5366-412c-f82a-dcad49602e51.jpeg)




【問題点】
・実装済みの特定の機能に仕様変更が発生した場合、対応が困難
などなど。

#Case3: master&develop&featureブランチ

【開発作業の流れ】
1. masterブランチからdevelopブランチを作成
2. developブランチから実装する機能毎にfeatureブランチを作成
3. featureブランチで実装完了した機能はdevelopブランチにマージ
4. リリース時点でdevelop → masterマージ

【登場するブランチ】
master: 
　リリースした時点のソースコードを管理するブランチ
develop (masterから派生):
　開発作業の主軸となるブランチ
feature (developから派生):
　実装する機能毎のブランチ (feature/◯◯, feature/xxなど)

イメージ
![case3.JPG](https://qiita-image-store.s3.amazonaws.com/0/103695/d9d0f01e-f1e5-20b9-3daa-be5ad8890cd6.jpeg)


【問題点】
・リリース作業時の調整もdevelopブランチに依存している
・リリース後に致命的な不具合が発覚した場合に対応するブランチがない
などなど。

#現在使用しているブランチモデル
諸々の問題を解決できる現在運用しているブランチ設計をご紹介します。

【開発作業の流れ】
1. masterブランチからdevelopブランチを作成
2. developブランチから実装する機能毎にfeatureブランチを作成
3. featureブランチで実装完了した機能はdevelopブランチにマージ
4. リリース作業開始時点で、developからreleaseブランチを作成
5. リリース作業完了時点で、releaseからdevelop, masterブランチにマージ

【リリース後の障害対応の流れ】
1. masterブランチからhotfixブランチを作成
2. hotfixブランチで障害対応が完了した時点で、develop, masterブランチにマージ

【登場するブランチ】
master:
　リリースした時点のソースコードを管理するブランチ

develop (masterから派生):
　開発作業の主軸となるブランチ

feature (developから派生):
　実装する機能毎のブランチ (feature/◯◯, feature/xxなど)

release (developから派生):
　developでの開発作業完了後、リリース時の微調整を行うブランチ
　(バージョン番号の変更などで使いました。)

hotfix (masterから派生):
　リリースされた製品に致命的なバグ(クラッシュなど)があった場合に緊急対応をするためのブランチ

イメージ
![now.JPG](https://qiita-image-store.s3.amazonaws.com/0/103695/30bd6f5a-f443-e193-6ba2-7541bb27eb0d.jpeg)

#参考
A successful Git branching model
http://nvie.com/posts/a-successful-git-branching-model/

## 最後に
スマートテック・ベンチャーズでは、未経験だけどiOSの開発をやりたい！という人を募集しています。
Advent Calendarのスマートテック・ベンチャーズページに会社およびWantedlyのURLをのせていますので、興味のある方は是非ご覧ください。
http://qiita.com/advent-calendar/2016/stv

明日は@EnoMtさんです。
お楽しみに！
VMware製品上でBitVisorは動作するか?

VMware製品上でBitVisorは動くのでしょうか。実はBitVisor 1.4の変更点に以下のものがあります:

> - vt: EFER のセーブ/ロード機能があれば使うようにした。これによって、VMware 製品の仮想マシン上で VMM が動作するようになった。

というわけで、動作するようになっています。最新版でも動作するのか気になるところですが、試してくださった方がいるようです。動いているみたいですね。

https://twitter.com/ntddk/status/805103499688243200

# で

これだけでは面白くないので、「EFERのセーブ/ロード機能があれば使うようにした」という話について簡単に紹介しておきます。

EFERというのはもともとAMD K6で登場したというMSRで、SYSCALL命令、ロングモード (64ビット) やNX (実行禁止) ビットの有効化などに使用されるものです。Intel VT-xにおいては、仮想マシンのロングモードについてはVMCSのVM-Entry Controlsで設定しますが、SYSCALL命令等についてはEFERで設定する必要があります。

BitVisor 1.3までは、このEFERを反映するために、VM-exit MSR-store countおよびVM-exit MSR-store addressなどを使用していました。VM-entry用もあり、任意のMSRの内容を切り替えるために使用することができます。初期のVT-xではGuest IA32_EFERなどのフィールドは存在していなかったので、この方法しかありませんでした。ところが、VMware製品ではこんな使われ方は想定されていなかったようで、問題が発生しました。そこで、Guest IA32_EFERなどのフィールドが使用可能であれば使用する、という風にすることになりました。

## その後

BitVisor Summit 3の発表「The Current Status of BitVisor 1.5(仮)」をお聞きになった方はご存知の通り、実はこの任意のMSRの内容を切り替える機能というのが、VM entry/exitにかかる時間をめちゃくちゃ長くしてしまうことが判明しました。

http://bitvisor.org/summit3/

資料の32ページにあるように、ひとつのMSRに300サイクル程度もの時間がかかることが判明したため、現在は同機能はなるべく使わないようになっています。おそらく、Guest IA32_EFERなどのフィールドを使う分にはそこまでのオーバーヘッドは無いものと考えられるので、性能面でもこの修正は必要だったということになりそうです。
ググり方の作法

「検索ワード」の横の [:mag:](https://www.google.co.jp/search?q=%E6%A4%9C%E7%B4%A2%E3%83%AF%E3%83%BC%E3%83%89)をクリックするとGoogleで検索します。

どうも。ヤギちゃんです。

'15の春キャンのことでした。僕はBirthDateBaseというWebサービスを開発していました。（今は休止中。「休止」だよ！「終了」じゃないよ！）

アニメキャラや芸能人、さらには歴史上の人物までもの誕生日を投稿し、共有したり保存した人やキャラの誕生日には通知をだすという（予定の）SNSだったのですが、その人やキャラにタグ付けする機能（例えば高槻やよいちゃんだったら「THE IDOLM@STER」、「765プロダクション」など）をつけようと思い、闇に~~呑まれよ！~~ハマりました。

Webサービス開発コース（当時はWebプログラミングコース）では`Sinatra`というフレームワークを使っていたので、

「Sinatra activerecord タグ機能」 [:mag:](https://www.google.co.jp/search?q=Sinatra+activerecord+%E3%82%BF%E3%82%B0%E6%A9%9F%E8%83%BD)

などとググっていました。

しかし、僕が求めているような情報は全くありませんでした。

そして、キャンプが終わり、落ち着いてからあることに気づきました。

タグってことは他対他のリレーショナルを実装せればいいわけだ、と。

そこで、

「Sinatra activerecord 他対他」 [:mag:](https://www.google.co.jp/search?q=Sinatra+activerecord+%E4%BB%96%E5%AF%BE%E4%BB%96)

とググると…

[Rails4で多対多のリレーションをモデルに実装する - Rails Webook](http://ruby-rails.hatenadiary.com/entry/20141204/1417688260)

一発で出てきました。

`has_and_belongs_to_many` を使うのがキーだったようです。

## 何が言いたいか
プログラミングの初心者がつまづくのはググり方もあると思います（初心者でもないのにハマることもありますが…）。

そこで、ググる時のコツは

- 根本的に何をしたいかを考える（タグ機能 -> 他対他、 HTMLエスケープ -> 置換　など）
- 何のことを調べたいかを考える（言語なのか？フレームワークなのか？IDEなのか？フロントエンドなのか？）

なのじゃないかなぁと思います。

こういうのも気をつけよう！というのがあったら教えてください。

さて明日、６日は[@KawakawaRitsuki](http://qiita.com/KawakawaRitsuki)（ごっちゃん！！）の[Crashlyticsを活用しよう](http://qiita.com/KawakawaRitsuki/items/d93e3c5add172b2dd4ae)です！
Android...ですかね？僕はWebにしか明るくないのですが楽しみです！

お楽しみに！
失われしD言語くん書の復元

これはD言語くんAdvent Calendar5日目の記事です。
D言語くんによる世界の創造と人類との契約についての失われた聖書を復元するプロジェクトの紹介です。
[GitHubレポジトリ](https://github.com/namachan10777/Dman_Bible)
 ~~大分前にノリで作って以来放置していました。~~
# 目的
このプロジェクトではD言語くんとの契約に関するD言語くん書の復元をしています。
# 内容
第一章の書いた所までです。

```
神ははじめにD言語くんを作られた。以降神はD言語くんを神とした。
始めにD言語くんは天と地を創造された。地に形は無く、闇が世界を覆っていた。
D言語くんはまず「GC」と言われた。世界にGCが生まれ、安心して世界を作れるようになった。
 D言語君は「new 光;」を言われた。すると光が生まれた。D言語君はその光をみて良しとされた。
第一日である。
 D言語君はその光を闇を分けられた。D言語くんは光を「alias 昼 = 光;」とされ、「alias 夜 = 闇;」とされた。
第二日である。
 D言語くんはまた言われた。「auto sea = chaos.filter!(a => is_water(a)).array;auto land = world.filter!(a => !is_water(a)).array;chaos = null;」
世界は陸と海に分けられた。
どこからも参照されなくなったchaosはGCに回収された。
第三日である。
```
# 現状
創世記3日めまで書きました。
あと謎の4章があります。
# 参加する方法
GitHubでforkしていただいてpull request飛ばして貰えればマージします。今書かれている部分は暫定的なものなのでそれを変更して頂いても問題ありません。

# あとがき
実は明日は一般科目のテストがあったりします。さらに電気の実験レポートにまだ殆ど手を付けていません。また、D言語Adcのネタもまだ完成していません。
つらい
豆知識：security.debian.orgのアジア担当はさくらインターネットにある

ドーモ。さくらインターネットの１ユーザーによる[さくらインターネット（その２） Advent Calendar 2016](http://qiita.com/advent-calendar/2016/sakura2)への投稿です。

先に結論。
**さくらインターネットさん、いつもDebianを始めとしたOSSコミュニティを支援してくださってありがとうございます**。
コンゴトモ　ヨロシク。


# 豆知識：security.debian.orgのアジア担当はさくらインターネットにある

<blockquote class="twitter-tweet" lang="ja"><p>#Debian has a new Asian #security mirror in Sakura, Japan sponsored by Sakura Internet. ありがとう! http://www.sakura.ad.jp/ </p>&mdash; The Debian Project (@debian) <a href="https://twitter.com/debian/status/540451300203589632">2014年12月4日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

## 背景

Linuxディストリビューション老舗「[Debian](http://www.debian.org)」のパッケージリポジトリは世界各所にミラーされています。しかし、サポート対象である安定版（この記事の時点では Debian8　コードネーム"Jessie"）のセキュリティアップデートは、Debianシステム管理チームが管理する security.debian.org サーバー以外には配信されません。security.debian.org サーバーおよびそのミラーは北米とヨーロッパにあり、そのため安定版を使ってセキュリティアップデートを適用しようとすると「遅いぃぃー！」となっていました。２年前までは。

### なんとかしたい

日本に居るDebian関係者（特に私）は当然この事を知っていて「なんとかしたいなー」「なんとかしたいなー」と常々思っておりました。具体的には「security.debian.org ミラーサーバーを日本に置きたい」と。で、関係者に「securityミラー、日本に置けないかな？」と言っていたら、システム管理チームも乗り気になり、「じゃぁ機材探してよ」と言ってくれることに。これが2013年、３年前のこと。ただ、[要件がなかなか厳しい](http://lists.debian.or.jp/archives/debian-announce/201304/msg00002.html)。

* x86_64サーバー（400GB 以上のディスク容量、4GB 以上のメモリ容量）
* **仮想マシン不可**、OS は Debian の利用可
* 潤沢なネットワーク接続(1Gbps以上推奨、トラフィック制限なし)
* IPv4 アドレス x 2 (IPv6 もあればなお可)
* Debianシステム管理チームがrootとして管理可能な事
* **SSH 以外のシリアルコンソール** (HP iLO など) のアクセス提供
* ファイアウォールによるアクセス制限無し
* 電源／ディスクなどの冗長構成（ハードウェア保守付）

ディスクやメモリ容量はまぁ良いにしても「仮想マシンはダメ」「シリアルコンソール」あたりは結構面倒な要件で、VPSなどは不可。一台占有の専用サーバーじゃないとダメなわけです。専用サーバー借りるとなると、結構なお値段もしちゃうのですけど、Debianは完全にボランティアベースで運用しているディストリビューションで、しかも寄付の集め方はド下手。開発者の中心は欧米で、彼らは遠い日本・アジア地域にセキュリティミラーが無くたって別に困らない。うーん。

### なんとかなるかも

セキュリティミラーの機材募集はしてはみたものの、要件に見合う形での応募はなく時は流れ...。
そしてある時、コミュニティのメンバーが参加した[関西オープンソース（k-of）](https://k-of.jp/)で、さくらインターネットの[田中さん](https://twitter.com/kunihirotanaka)がいらっしゃったので機材の話を相談したところポジティブな反応を頂けた、との話を聞き「これはおねだりチャンス！」と打診メールを送付。

結果、OKもらえて機材を借用させていただくことになりました。フットワーク軽いなぁ。

（この後、機材のIPMIコンソールのJavaアプレットがLinuxではうまく動かずWindowsを必要としたものの、Debianシステム管理チームの誰もWindows持ってなくて...と、時間を要したのはまた別の話）

### ありがとう、さくらインターネット

ということで、無事に[プレスリリースも打ち](https://www.debian.org/News/2015/20150206)、今日もさくらインターネットの専用サーバーからアジア地域向けのDebianユーザーはセキュリティアップデートを受け取れているのです。もしあなたがDebianを利用していて、何かのイベントでさくらインターネットの関係者の方に会ったら、お礼しましょう。感謝の言葉は重要と古事記にも書いてある。

あ、さくらインターネットの方も、[openSUSEだけじゃなくて](http://qiita.com/metakoma/items/276f4d94a42989954279) **Debianも推していただけると**幸いです。さくらインターネット内にセキュリティミラーだけじゃなくて、[通常パッケージの公式ミラーも置かせていただいています](http://debian-mirror.sakura.ne.jp/)ので、快適に利用できますよ。
Clang on VisualStudio 2017と日本語

これは，[VisualStudio AdventCalender](http://qiita.com/advent-calendar/2016/vs)の5日目の記事です．

VisualStudio の AdventCalender に空きがあって，丁度誰もVisualStudio 2017 RCのClangについて書いていなかったので，参加してみました．下手な文章ですが，読んでいただけると幸いです．
****
`#include <Windows.h>` をするとコケるという VisualStudio 2015 時代ではあんまりよくなかった Clang with Microsoft CodeGen でしたが，VisualStudio 2017 で **`#include <Windows.h>`をしてもこけなくなりました**  

この記事では，VisualStudio 2017 RC上で Clang を用いてコンパイルする方法を書きます．また，それでは内容スカスカな記事になるので，初心者がずっこけそうな日本語関係をすこーしまとめます．（C++であまり文字列を扱うプログラムを書かないので，間違いがあれば指摘していただけるとありがたいです．）

**注意事項**
2016/12現在（VisualStudio 2017 RC）の内容ですので，気を付けてください

# インストール
![VisualStudio Installerで「変更」ボタンの場所](https://qiita-image-store.s3.amazonaws.com/0/56125/1b5d59ef-6929-8264-4166-11faf9e1eed3.jpeg)
VisualStudio Installer を起動して インストール済み VS の 変更 ボタンを押します．  
![クリップボード01.jpg](https://qiita-image-store.s3.amazonaws.com/0/56125/b144e095-8170-6200-6449-759631c3a8b3.jpeg)
個別のコンポーネントタブを開き， Clang with Microsoft CodeGen を選択，右下の 変更 ボタンを押して，数分程度昼寝してれば，インストールは終了です．
# ソリューションの準備
とりあえず，コンソールアプリケーションを作りたいので，普通に Visual C++ → Win32 → Win32 コンソールアプリケーションとたどってソリューションを作ります．  
![クリップボード01.jpg](https://qiita-image-store.s3.amazonaws.com/0/56125/fac1c268-06e8-853f-524e-3deed10dcac6.jpeg)  
そして，上の画像のように，「プラットフォーム ツールセット」を VisualStudio 2017 - Clang with Microsoft CodeGen なんちゃら にしてやればおｋです．  

# 日本語は大丈夫なのか？
ちゃんと書けば，大丈夫です．

```cpp:ClangTest.cpp
#include <iostream>
#include <string>

int main()
{
	std::string str = "お前は誰だ？";
	std::cout << str << "\n";
	std::wstring wstr = L"お前は誰だ？";
	std::wcout << wstr << L"\n";
    return 0;
}
```
？？？「ここに **Shift JIS** で保存した，クソコードがあるじゃろ？」
MSVC, Clang「はい」
？？？「これをおぬしらにコンパイルさせると…」
MSVC「
>1\>------ ビルド開始: プロジェクト:ClangTest, 構成:Debug Win32 ------
========== ビルド: 1 正常終了、0 失敗、0 更新不要、0 スキップ ==========

」
Clang「
>1\>------ ビルド開始: プロジェクト:ClangTest, 構成:Debug Win32 ------
1\>ClangTest.cpp
1\>ClangTest.cpp(6,21): warning : illegal character encoding in string literal [-Winvalid-source-encoding]
1\>        std::string str = "<92>N<82><BE><82><A8><91>O";
1\>                           ^~~~ ~~~~~~~~~~~~~~~~~~~~
1\>ClangTest.cpp(8,24): error : illegal character encoding in string literal
1\>        std::wstring wstr = L"<92>N<82><BE><82><A8><91>O";
1\>                              ^~~~ ~~~~~~~~~~~~~~~~~~~~
1\>1 warning and 1 error generated.
1\>プロジェクト "ClangTest.vcxproj" のビルドが終了しました -- 失敗。
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========

」

そう，Clangは Shift JIS をちゃんと認識せずにコンパイルしているのです．
一個目は，マルチバイト文字をそのままソースコードから抜き出して機械語にぶち込めばいい（ワーニングだけで大丈夫）のですが，二個目は， Unicode に変換しなければなりません．よって，エラーになります．まあ，日本語とかをソースコードに含めるときは，Unicode で保存しましょっていう話です．（あと，charの型も統一しよう）
## エンコーディング対応表
二つのコンパイラは，対応するエンコーディングの種類が異なるので，以下に記します．

|  | MSVC 2017 | Clang with VS |
|:-:|:-:|:-:|
| Shift JIS | ◎ | △ (ASCIIとして読み込み，L""リテラルは使えない) |
| UTF-8 | × | 〇（char型がぐちゃぐちゃ） |
| UTF-8(with BOM) | ◎ | 〇（char型がぐちゃぐちゃ） |
| UTF-16 LE&BE | ◎ | × |

（文字列関係が一番萎えるんですよね…C++って…）

# 〆
あんまり利用場面はありませんが，MSVCやgccよりもピュアなC++が書けるので，初心者には最適だと思います．読んでいただきありがとうございました．
Rubyで作っていたプログラムをCrystal Langに置き換えてみた

というお話です。

## tr;dl
* 担当してるプロジェクトのRailsアプリがメモリ肥大化してるしレスポンス遅くて大変
* メンバーでどうしようかと話が出ている中で、「一部切り出して別プログラムにしてみては？」と提案されたよ
* そのときCrystalを推している人がいて、Rubyからコンバートしやすいんじゃね？という話からとりあえずやってみたよ
* やってみたらやはり厳しい箇所はある、がモノを選べば意外と苦戦はしなかった
* いろいろあって本番投入は見送ったけど、考え方としてはありだと思う

## 経緯
わたくし、[ここ](http://qiita.com/organizations/mmj)でお仕事しておりますが、現在担当しているプロジェクトにおいて開発・保守をしているRailsアプリにおいて、以下のような問題がありまして、それはそれはメンバーを悩ませていました。

* レスポンスが遅い。
    * 特にこのRailsアプリは数多くの帳票を出力することが求められていて、特に大量データ出すやつがつらい
* メモリめっちゃ食う
    * 一回でかい帳票を作ると肥大化したままになって大変

上に書いた問題から誘発されてさらに問題が起こったりして、運用で非常に手のかかる子になっていたのでした。

そこでいくつか改善していく方策をうっていきました。そのうちの一つに、「帳票を作る箇所を別プロセスにすりゃいいのでは？」という提案があり、そこでメンバーでCrystalを推していた人がいたのでとりあえず使ってみましょう、という話になったのでした。やっぱり型がほしいのです。

ちなみに自分が担当したのは、Crystalは自分も興味があってちょっと触っていたので、そこで手を上げたというのが経緯です。

## 実際やってみたどうだったか
手を上げてみて取りかかったはよいものの、基本的にそのまま動くことはありえないと思っていて実際にその通りでした。ActiveRecordがバリバリ使われている箇所は非常に厳しい。こんがらがったscopeをひもといてCrystalで扱えるようなかたちに落とし込む必要がありました。

そのため、今回はSQLで直接データを取り出すかたちで作られていたRubyのコードをCrystalにコンバートするようにしました。さらにライブラリとしては[waterlink/crystal-mysql](https://github.com/waterlink/crystal-mysql/tree/master/src/mysql)を使用しています。

元コードの設計としては```SqlLoader```クラスをベースクラスとして、それを継承した```ExsampleLoader```クラスを実装してそこでSQLでデータ取得、データの加工を行うようにしてたが、Crystalではデータ取得と加工を別クラスにわけました。おおよそで書くとこんな感じです。Rubyから簡単にConvertしたので型が書かれてなくて寂しい感じですね。

```rb
# coding: utf-8
require "mysql"

module Loader
  class SqlLoader
    def initialize
      @conn = MySQL.connect("exsample.com", "user", "password", "db_name", 3306_u16, nil)
      @conn.set_option(LibMySQL::MySQLOption::MYSQL_SET_CHARSET_NAME, "utf8")
      @conn.query(%{SET NAMES utf8})
    end

    def datas
      datas = @conn.query(sql)
      if datas
        datas
      else
        nil
      end
    end

    private def sql
    end
  end

  class ExsampleLoader
    private def sql
      # この中でSQLを書く、大変………
    end
  end
end

class Exsample
  def initialize(loader)
    @loader = loader
  end
 
  # この下に加工するメソッド書いたりする
end
```

上記Crystalで書いたものは一つのバイナリにして、Rails側から呼び出すかたちにしました。全体の実装自体はそれほど複雑ではなかったのですが、crystal-mysqlの挙動に悩まされたりして意図した動きになるのに2日ほどかかりました。

## 見送り理由
という感じで一通り実装してみたものの、2016/12/03時点では本番に投入していません。理由いくつかありますが、技術的な面で行くと

* Crystal自体がどんどん開発進んでいて、そこに追従していくコストが今は厳しい
    * 現状は外部ライブラリの安定感とかそういうところが、プロダクションでは若干つらい
* 今はcapistranoでデプロイしてるけど、ビルドとかもどうせなら自動化したいしそういうことも考える必要があるけど、今はあんまり暇がない

というところですね。とはいえそこらあたりのコストを払えるのであれば、Ruby知ってる人は違いを押さえられれば他の言語覚えるより楽な感じもするし、投資する先の選択肢としてありな感じはします。
shell を fish に変えてみた

# はじめに
この記事は [Sansanアドベントカレンダー](http://qiita.com/advent-calendar/2016/sansan) 5日目です。

# 今日のお話

shell は、かれこれ 10 年くらい zsh を使っているのですが、今年の夏くらいに [fish](http://fishshell.com/) にしてみました。
3 ヶ月程で結局 zsh に戻ってしまったのですが(理由は後述)、今回は備忘録を兼ねてやってみたことをまとめてみようと思います。

# oh-my-fish

いきなりですが [oh-my-fish](https://github.com/oh-my-fish/oh-my-fish) というのがあるので入れてみます。

こいつを入れると `omf` というコマンドが使え、プラグインを管理することができます。

`omf install XXX` でプラグインをインストールすることができます。テーマは `omf theme YYY`。
また、`omf list` とするとインストールしたプラグインが確認できます。

私は以下のプラグインをインストールしてみました。

```
⋊> ~ omf list
Plugins
brew				omf
bundler				osx
fish-peco_select_ghq_repository	pbcopy
fish-peco_select_zsh_history	peco
fish-spec			rbenv
gem

Themes
default	yimmy
```

# fish_config
あと面白いのは、以下のコマンドでブラウザが立ち上がりそこで設定とかができることです。

```
⋊> ~ fish_config
```

こんな画面で設定することができます。

![スクリーンショット 2016-12-04 0.21.08.png](https://qiita-image-store.s3.amazonaws.com/0/3969/8abad8ac-9fe4-ae31-b96b-a524c8433482.png)

Theme の変更や設定している function の確認など色々できます。

# 引っ掛かりポイント

bash や zsh と違って、例えば以下のように環境変数を与えてコマンドを実行する場合は `env` が必要です。

```
⋊> ~ env RAILS_ENV=test bin/rake db:create
```

# 設定

ここまで設定すれば他には特になにもしなくても十分使えましたが、CTRL-j を押したときに ls と git status を表示するようにしたかったので、それは以前 [こちらの記事](http://qiita.com/marcy_o/items/d51773cdd110d77cfdd8) にまとめています。

また `bundle show` を `peco` に食わせて `bundle open` できるようにしたかったので、以下の function を定義しました。

```functions/peco_bundle_open.fish
function peco_bundle_open
  set -l query (commandline)

  if test -n $query
    set peco_flags --query "$query"
  end

  bundle show 2> /dev/null | sed -e '/^  \*/!d; s/^  \* \([^ ]*\) .*/\1/' | peco $peco_flags | read line

  if test -n $line
    echo $line
    commandline "bundle open $line"
  end
end
```

config.fish はこんな感じになりました。

```config.fish
# Path to Oh My Fish install.
set -q XDG_DATA_HOME
  and set -gx OMF_PATH "$XDG_DATA_HOME/omf"
  or set -gx OMF_PATH "$HOME/.local/share/omf"

# Customize Oh My Fish configuration path.
set -gx OMF_CONFIG "$HOME/.config/omf"

# Load oh-my-fish configuration.
source $OMF_PATH/init.fish

set -Ux GOPATH $HOME/workspace/go

set -U fish_user_paths $fish_user_paths $GOPATH/bin

set -Ux LC_ALL ja_JP.UTF-8

set -Ux EDITOR 'emacsclient -n'

alias mv 'mv -i'
alias cp 'cp -i'
alias rm 'rm -i'

alias g git

eval (hub alias -s)

function fish_user_key_bindings
  bind \c] peco_select_ghq_repository
  bind \ct peco_select_zsh_history
  bind \cr peco_select_history
  bind \cj do_enter
  bind \co peco_bundle_open
end
```

# 使ってみて

3 ヶ月程使ってみたのですが、zsh だと `SAVEHIST` で履歴の件数が指定できたのですが、fish でどうやるかよくわからず zsh に戻ってしまいました :cry: 

てな感じで結局使わなくなってしまったわけですが、fish は特に設定しなくても補完機能など強力な機能があり、乗り換えは結構すんなりできるんじゃないかと思いました :star:
Office-Saas 連携No.1 ~ Microsoft Access リンクテーブルからSalesforce データを更新

#はじめに#
[CData ODBC Drivers](http://www.cdata.com/jp/odbc/) は、Open Database Connectivity (ODBC) をサポートするあらゆるデータベース管理ツールにデータを接続します。多くのプロダクティビティツールにおいて、ドキュメントの共有やコラボレーション機能を新たに追加します。
本来はWe API を使ってデータ連携する必要があるSalesforce ですが、[CData ODBC driver for Salesforce](http://www.cdata.com/jp/drivers/salesforce/odbc/) を使って、Microsoft Access からWeb API を書くことなくデータ連携し、Salesforce データをライブ更新できます。

#Salesforce DSN を作成#
接続プロパティが未設定の場合には、ODBC データソース名の設定を行います。Microsoft ODBC データソースアドミニストレーターを使ってDSN を作成および設定できます。

一般的な接続文字列は次のとおりです：

User=username;Password=password;SecurityToken=Your_Security_Token;

ODBC データソースアドミニストレーターで必要なプロパティを設定する方法は、ヘルプドキュメントの[はじめに](http://cdn.cdata.com/help/GFB/odbc/pg_connectiono.htm)を参照してください。
![ｄｓｎ.png](https://qiita-image-store.s3.amazonaws.com/0/152422/bffe2eb7-6c12-b3b8-5f1c-4e781e6669c1.png)

#Account データにリンクテーブルを作成#
1. Access の［外部データソース］タブで［ODBC データベース］をクリックします。
![20161205-3.png](https://qiita-image-store.s3.amazonaws.com/0/152422/f2b62e68-2a9f-5c79-6e02-dca6dd067b7c.png)

2. オプションを選択してデータソースにリンクします。リンクテーブルでは、Lead テーブルへのデータの読み出しおよび書き込みを可能にします。
3. ［コンピューターデータソース］タブからCData Salesforce データソースを選択します。
![20161205-5.png](https://qiita-image-store.s3.amazonaws.com/0/152422/5c6cb8ee-13ba-ff86-1b7f-bc0b467140b4.png)

4. Lead テーブルを選択します。このテーブルについての詳細は、ヘルプドキュメントの「データモデル」を参照してください。
![20161205-6.png](https://qiita-image-store.s3.amazonaws.com/0/152422/7ad72918-8cb2-248f-ba39-270b0acde58c.png)

5. リンクテーブルをダブルクリックで編集 リンクテーブルは常に最新のデータを持ち、Access 上で加えられたすべての変更は元となるSalesforce に反映されます。
![20161205-7.png](https://qiita-image-store.s3.amazonaws.com/0/152422/64b0cd1b-c52f-f162-1ca3-217b44e62efa.png)

#ほかにODBC で繋げるツール#
Excel, PowerBI, Qlik, Magic Xpi, Cognos, Crystal Reports, FileMaker, MicroStrategy, Forguncy, CELF, Spotfire など多数。
CData ODBC Driver の便利な点は、ODBCやJDBC などの一般的に広く使われている仕様となっており、既存で利用しているツールから各種SaaS へのリアルタイム連携が可能なことです。
Go!プリンセスプリキュアのGo言語実装「GoPrecure」

5日目なのでGo!プリンセスプリキュアのGo言語実装についての紹介です。[^Go]

[^Go]: 余談ですが僕の名前もGoです

# GoPrecureとは？
Go!プリンセスプリキュア [^go_princess] のGo言語実装です。

https://github.com/sue445/goprecure

[^go_princess]: http://www.asahi.co.jp/precure/princess/

* 以下の資料は [Go Conference 2015 Winter](https://eventdots.jp/event/573121) の発表資料を元にしています。
* 当時のスライド https://sue445.github.io/gocon2015-winter/

# 使い方
## go getしてimport
```bash
go get github.com/sue445/goprecure
```

```go
import github.com/sue445/goprecure
```

## プリキュアのインスタンスを作成
```go
// キュアフローラ
flora := goprecure.NewCureFlora()

// キュアマーメイド
mermaid := goprecure.NewCureMermaid()

// キュアトゥインクル
twinkle := goprecure.NewCureTwinkle()

// キュアスカーレット
scarlett := goprecure.NewCureScarlett()
```

## Name で名前を取得
```go
flora := goprecure.NewCureFlora()

flora.Name()
// 春野はるか
```

## Transform で変身
```go
flora.Name()
// 春野はるか

flora.Transform()

flora.Name()
// キュアフローラ
```

## 実際にはこんな感じ
![flora_transform.gif](https://qiita-image-store.s3.amazonaws.com/0/8059/a29f12cf-c655-586b-6853-3d052ee44bb3.gif)

## GoPrecureではフォームチェンジを忠実に再現
![flora_exchange.gif](https://qiita-image-store.s3.amazonaws.com/0/8059/838c461f-78f2-fb4c-e0ca-6c53746a176d.gif)

---
### 各プリキュアに対応するドレスアップキー
```go
// キュアフローラ
g.DressupKeys = []DressupKey{Flora, Rose, Lily, Sakura, Royal}

// キュアマーメイド
g.DressupKeys = []DressupKey{Mermaid, Ice, Bobble, Sango, Royal}

// キュアトゥインクル
g.DressupKeys = []DressupKey{Twinkle, Luna, ShootingStar, Ginga, Royal}

// キュアスカーレット
g.DressupKeys = []DressupKey{Scarlett, Hanabi, Phoenix, Sun, Royal}
```

# 苦労したこと
* GoPrecureに適したREPLがない
  * 4〜5種類くらい使って総合的に [gore](https://github.com/motemen/gore) が一番よかったが、直前までの入力を全部実行しているので標準出力に出力するメソッドとの相性が悪い

## 例
![gore1.png](https://qiita-image-store.s3.amazonaws.com/0/8059/bdf71a5e-4750-13ce-32ad-a73738ce63ae.png)

![gore2.png](https://qiita-image-store.s3.amazonaws.com/0/8059/01f47d6b-91f6-e89d-215f-3d5baf64e0a3.png)

* `Transform` の後に `Exchange` すると `Exchange` の標準出力だけ出してほしいのに直前の `Transform` のも一緒に出るので邪魔
* この資料の大元は1年前に作ったものですが、念のため最新版で試したところこの挙動は同じでした

# rubicureとGoPrecureの設計思想の違い
## rubicureの設計思想
* Rubyの柔軟性を利用してメタプロを大活用
  * クラスにメソッドはほとんど定義せずに `method_missing` でymlに飛ばすとか
* `transform!`（変身） や `attack!`（必殺技） など破壊的メソッドには `!` をつけるRubyの慣習に則った
* 基本的にプリキュア全員対応するため特定のシリーズに特化させない汎用的な設計
* rubicureのおかげでRubyの勉強になった

## GoPrecureの設計思想
* 静的型付けを意識した設計
  * `DresupKey` という型を `const` で定義することにより `Exchange` に未知のドレスアップキーが引数がわたらないようにした（コンパイルエラーになる）
* Go!プリンセスプリキュアだけに特化させることでドレスアップキーとモードチェンジを関連付けた実装が実現した
* GoPrecureのおかげでgolangの勉強になった

# まとめ
新しい言語を学ぶ時はプリキュアを実装するといいと思います。
コンソールで動くエディタを作る(5日目) 設計・用語を決める

本稿は[自作エディタをつくる Advent Calendar 2016](http://qiita.com/advent-calendar/2016/make_editor)の5日目です、レポジトリは[こちら](https://github.com/tinyco/tiny_code_editor)

このアドベントカレンダーは、コンソール上で動くエディタを25日間で1から自作することを目標としています。

> 前回までで、自分の中で全体像が見えてきたので、今日は設計を考えます


# コンソールの幅・高さを取得する

できなかったら詰むな・・・、と思って調べたら[ここ](http://qiita.com/hidetzu/items/2978f63e6d9b1848d8fe)にそのものズバリのことが書いてありました。

できそうでよかった。

# 設計を考える

コンソールに何を出力したかを覚えて置いて差分だけ更新していく方針も考えたのですが、
いまどきprintfするコストは十分小さいだろうということで、何か変更があれば全部出力しなおす方針にします。

iOS/AndroidアプリやWebアプリと違って、view自体からのフィードバックは来ないので、ある意味単純なモデルにできそうです。

なんとなくFluxっぽい設計にしたいですが、Pub-Subでイベントを処理したり、Web-APIを考慮したり、といった部分を省くと

1. ファイル読み込み、を内部モデルに変換する
1. キーボードから入力を受け取る
1. 入力キーによって「カーソルを動かす」「文字Aをカーソル位置に追加する」などの内部DSLのようなものに変換する
1. 内部DSLによって内部モデルを更新する
1. 内部モデルからコンソールに出力する文字列を生成する
1. 文字列を丸ごと更新(必要があれば差分更新)する
1. キーボード入力待ちに戻る

こんな感じの流れになるかなぁ、と思います。

# 用語集を作る

まず、上の設計からコード上の変数名を決めていきます

1. ファイル読み込み、を内部モデルに変換する -> モデル名をContextとします
1. キーボードから入力を受け取る -> 関数名をkey_scan、戻り値をinput_keyとします
1. 入力キーによって「カーソルを動かす」「文字Aをカーソル位置に追加する」などの内部DSLのようなものに変換する -> 内部DSLをcommandとします
1. 内部DSLによって内部モデルを更新する -> update_contextとします
1. 内部モデルからコンソールに出力する文字列を生成する -> renderとします
1. 文字列を丸ごと更新(必要があれば差分更新)する -> render内にあるprinterとします
1. キーボード入力待ちに戻る

次に、マルチバイト文字、行の扱い等の用語を決めていきます。
マルチバイト文字の扱いで辛いところは、以下の例です。

- 「あ」は3バイトだが、カーソル移動で見ると1文字であり、表示上は(日本人がよく使う等幅フォントにおいて)半角2文字分である

それぞれの概念に、用語を決めていきます

- 文字のバイトに着目した処理は、bytesと呼ぶ
- カーソル移動用の文字数に着目した処理は、position_xとよぶ
- 表示上の幅に着目した処理は、view_widthとよぶ

次に、行の扱いについて考えます。

emacsでは行について、論理行と物理行と呼ばれる概念があるようです。

- 長い行について、見た目には2行に折り返しているが、実際は1行である。

ということを表しているようですが、どちらが論理行でどちらが物理行かわかりにくい気がします。
今回は、見た目の行が2行であることをview_height=2、実際には1行であることをposition_y=1と呼ぶことにします。

# ざっくりmainループを書く

```main.c
void render(context context){
  str = rendering_text(context);
  printer(str);
}

int main(int argc, char *argv[]) {
  char* filename = get_args(argc, argv);
  context context = file_read(filename);
  while(1)
  {
    input_key key = key_scan();
    command = key_parse(key);
    context = update_context(context, command);
    render(context);
  }
  return EXIT_SUCCESS;
}
```

こんな感じの関数にちまちま実装を当てはめていけば完成しそうな気がします。

# 今日のまとめ

- ざっくりとした設計をした
- 用語を整理した

後はもくもくと実装して行けばよさそうですね。

最近寒いですが、今日はたまたま暖かかった気がします。

(過去分の読みづらかったところを少し直しました。内容はそのままです)
無料JupyterサービスのBinderの紹介

# これなに
[Binder](http://mybinder.org/)という無料サービスの紹介をします。
github上のJupyter notebook のリポジトリから、実行可能なサービスを簡単に試せます。

つまり、ブラウザだけでいろいろな実行環境を作ることができます。


# サンプルで試してみる
サンプルとして、私の公開しているパズルを解く[SaitoTsutomu/OptForPuzzle](https://github.com/SaitoTsutomu/OptForPuzzle)を試してみましょう。

## 手順
- http://mybinder.org/ を開いてください。
- Build a repositoryに「SaitoTsutomu/OptForPuzzle」と入力して、submitボタンを押してください。
  - 自動的にdockerのイメージが作成され[状態](http://mybinder.org/status/saitotsutomu/optforpuzzle)が更新されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/13955/85f485e0-c91f-e238-079c-ab196476a188.png)


---
- completedが緑になったら、右上の[launchボタン](http://mybinder.org/repo/saitotsutomu/optforpuzzle)を押してください。
![image](https://qiita-image-store.s3.amazonaws.com/0/13955/ba742893-9cae-bf86-ced2-facb84918199.png)

---
- Jupyter notebookが起動するので、適当に開いて実行してみましょう。
![image](https://qiita-image-store.s3.amazonaws.com/0/13955/9b889bbf-cac4-aaa3-785d-9183fd1b2a18.png)

# GitHubリポジトリに必要なもの
- 1つ以上の拡張子が「.ipynb」のファイル
- requirements.txt (追加で必要なライブラリ)

以上