OmniAICreator/Qiita-1.07M huggingface dataset:
【Swift】 protocolを利用して、抽象クラスの振る舞いをさせる方法

基底クラスに処理の流れを記述し、実際の処理は派生クラスで記述したい事があると思います。
C++などの言語にはこの要求に応える為 **抽象クラス(abstract class)** という概念が用意されているのですが、Swiftには残念ながら抽象クラスは存在しません。
抽象クラスと同じ振る舞いをさせたい場合、protocolを利用することになります。

サンプルは次の要件で実装します。
1. 基底クラス `BaseClass` に処理の流れを定義する
2. 基底クラスはインスタンス化を禁止する
3. 処理の流れに使うメソッドはプロトコル `ClassFrameworkProtocol` に定義する
4. 派生クラス `SubClass` に実際の処理を記述する
5. 派生クラスは `ClassFrameworkProtocol` プロトコルを採用することを義務付ける

---
### ClassFrameworkProtocol プロトコルの実装
```
protocol ClassFrameworkProtocol: class {
	func a()
	func b()
	func c()
}
```
派生クラスで実装してもらいたいメソッド群を定義します。

---
### 基底クラスの実装
```
class BaseClass {
	required init() {
		assert(type(of: self) != BaseClass.self, "BaseClassはインスタンス化に対応していません")
		assert(self is ClassFrameworkProtocol, "ClassFrameworkProtocolを採用する必用があります")
		
		self.work()
	}
	
	func work() {
		if let obj = self as? ClassFrameworkProtocol {
			obj.a()
			obj.b()
			obj.c()
		}
	}
}
```

`init()` に要件2と5を満たす為のチェックを記述しています。
`work()` に処理の流れを記述しています。

---
### 派生クラスの実装
```
class SubClass: BaseClass {}

extension SubClass: ClassFrameworkProtocol {
	func a() {
		debugPrint(#function)
	}
	
	func b() {
		debugPrint(#function)
	}
	
	func c() {
		debugPrint(#function)
	}
}
```

プロトコロル `ClassFrameworkProtocol` を採用し、各メソッドの処理を記述しています。

---
### 実行結果
```
let obj = SubClass()
```
```
"a()"
"b()"
"c()"
```

---
### 要件2の検証
```
let baseObj = BaseClass()
```
```
assertion failed: BaseClassはインスタンス化に対応していません
```

---
### 要件5の検証
```
class NotAdoptedSubClass: BaseClass {}
let obj = NotAdoptedSubClass()
```
```
assertion failed: ClassFrameworkProtocolを採用する必用があります
```
nginx.conf【自分用】proxy_set_header：proxy_pass

【結論】
~~proxy_set_header : proxy_pass => currentレベル合わせる~~
=> 別に合わせなくても良かったという・・・なんでだ？

【結果】

```ruby:nginx.conf

          proxy_set_header X-Real-IP              $remote_addr;

          location / {
              proxy_set_header Host                   $host;
              proxy_set_header X-Forwarded-Host       $host;
              proxy_set_header X-Forwarded-Server     $host;
              proxy_set_header X-Forwarded-For        $proxy_add_x_forwarded_for;
 
              proxy_pass http://localhost:8181;
          }

```

  ["HTTP_HOST"]=>
  string(9) "localhost"
  ["HTTP_X_FORWARDED_HOST"]=>
  string(9) "localhost"
  ["HTTP_X_FORWARDED_SERVER"]=>
  string(9) "localhost"
  ["HTTP_X_FORWARDED_FOR"]=>
  string(9) "127.0.0.1"
=> X-Real-IP無し

【参考】
<<https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_set_header>>
google vision apiで文字検出

Text Detection using the Vision API
https://github.com/GoogleCloudPlatform/cloud-vision/tree/master/python/text

![machine-intelligence-14.png](https://qiita-image-store.s3.amazonaws.com/0/64334/7965cbd1-e3d7-f006-0b81-fcd93c53397e.png)

#vision apiのわかりやすい記事
http://qiita.com/t-fujiwara/items/7e1f7c52a73887519ac1

#初期設定


```
git clone https://github.com/GoogleCloudPlatform/cloud-vision.git

cd cloud-vision/python/text
pip install -r requirements.txt
python -m nltk.downloader stopwords
python -m nltk.downloader punkt

```

###Set Up a Service Accountで認証キー（サービスアカウント）を作成
→JSON（Key file）はローカルに保持しておく
https://cloud.google.com/speech/docs/common/auth#set_up_a_service_account

###取得したapi keyのファイルを指定

```
export GOOGLE_APPLICATION_CREDENTIALS=/path/to/your/credentials-key.json
```

この認証がされてないと、こんな感じのエラーになる
```HttpError 403 when requesting https://vision.googleapis.com/v1/images:annotate?alt=json returned "Project has not activated the vision.googleapis.com API. Please enable the API for project ..."```


###redis起動
redis入ってない場合は入れとく。

```
redis-server /usr/local/etc/redis.conf
```

#実行
ディレクトリを指定して実行するとredisに登録される

```
./textindex.py <path-to-image-directory>
```


#DBの内容確認

nodeのredis-commanderで見て見る

```
npm install -g redis-commander
```

起動


```
redis-commander
```

ブラウザで確認
http://localhost:8081/

<img width="538" alt="スクリーンショット 2017-02-22 3.46.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/64334/a4e85829-1df6-4cb1-eb51-3fc62c1eb06c.png">


文字は入ってるねと。

今回は座標を見た方ので、jsonのフォーマットを確認
https://cloud.google.com/vision/docs/detecting-text#vision-text-detection-gcs-protocol

```
{
  "responses": [
    {
      "textAnnotations": [
        {
          "locale": "en",
          "description": "Wake up human!\n",
          "boundingPoly": {
            "vertices": [
              {
                "x": 29,
                "y": 394
              },
              {
                "x": 570,
                "y": 394
              },
              {
                "x": 570,
                "y": 466
              },
              {
                "x": 29,
                "y": 466
              }
            ]
          }
        },
```

コードを見るとdef detect_text(self, input_filenames, num_retries=3, max_results=6):メソッドの中でif 'textAnnotations' in response:ってやってtextAnnotationsのドキュメントを取得してはります。
よってboundingPolyを取得する関数を追加。


```
def extract_bounding_poly(texts):
    for text in texts:
        try:
            print(text['boundingPoly'])   #座標取得
        except KeyError as e:
            print('KeyError: %s\n%s' % (e, text))
```


```
{'vertices': [{'x': 45, 'y': 18}, {'x': 769, 'y': 18}, {'x': 769, 'y': 1087}, {'x': 45, 'y': 1087}]}
{'vertices': [{'x': 47, 'y': 18}, {'x': 66, 'y': 18}, {'x': 66, 'y': 28}, {'x': 47, 'y': 28}]}
{'vertices': [{'x': 68, 'y': 18}, {'x': 88, 'y': 18}, {'x': 88, 'y': 28}, {'x': 68, 'y': 28}]}
{'vertices': [{'x': 106, 'y': 19}, {'x': 108, 'y': 19}, {'x': 108, 'y': 26}, {'x': 106, 'y': 26}]}
{'vertices': [{'x': 117, 'y': 20}, {'x': 167, 'y': 20}, {'x': 167, 'y': 29}, {'x': 117, 'y': 29}]}
...
```

座標がとれました。

あとはapiを無効にして終わりにします。



#参考
http://qiita.com/tsuchi83/items/c5e40de0201136e8c5ff
yum,wgetのproxy設定(centOS 7)

proxy経由でyumやwgetを実行するには事前にproxyを指定しておく必要があったので、centOS 7で実際に行った設定方法を以下にまとめた。

#    yumのproxy
viで/etc/yum.confにプロキシサーバのIPアドレスを記述する。

    vi /etc/yum.conf
適当に最後の行に以下のように記述した。

    proxy=http://proxy.xxx.xxx:pp
-    xxx.xxx = 指定するIPアドレス
-    pp = ポート番号

#    wgetのproxy
/etc/wgetrcに記述する。

    vi /etc/wgetrc
wgetでは最後の行ではなく

    # http_proxy=http://...
    # https_proxy=http://...
    # ftp_proxy=http://...
のような記述があったため"#"を消してコメント扱いを解除し、それぞれに同じIPアドレスを指定した。　

```.wget
http_proxy=http://proxy.xxx.xxx:pp/
https_proxy=http://proxy.xxx.xxx:pp/
ftp_proxy=http://proxy.xxx.xxx:pp/
```
-    xxx.xxx = 指定するIPアドレス
-    pp = ポート番号
Windows PowerShell でカレントディレクトリのパスを Linux 形式で取得する

Linux 形式のパスっていってもいろいろあると思うのですが、ここでは `docker run` の `-v` オプションに渡せる形式のパス (「/c/path/to/directory」 のような形式) を作ります。

* 参考 : [Manage data in containers](https://docs.docker.com/engine/tutorials/dockervolumes/#/mount-a-host-directory-as-a-data-volume) (ホストディレクトリをデータボリュームとしてマウントする方法)

# PowerShell で Linux 形式のパスを取得する

PowerShell では、[`Get-Location` コマンドレット](https://technet.microsoft.com/ja-jp/library/ee176853.aspx)で現在のディレクトリを取得できます。 戻り値の型は [`PathInfo`](https://msdn.microsoft.com/en-us/library/system.management.automation.pathinfo(v=vs.85).aspx) です。 この値から、ドライブ名を取得して、パスの区切りをスラッシュにすることで、Linux 形式のパスを生成できます。

```ps1
# Linux 形式のパスを文字列として取得。
$pwd = "/$((pwd).Drive.Name.ToLowerInvariant())/$((pwd).Path.Replace('\', '/').Substring(3))"
```

ちなみに、`Get-Location` コマンドのエイリアスとして `pwd` が使えるので、`pwd` を使っています。

以下のように、Linux 形式のパスを取得する関数を用意してもいいですね。
 
```ps1
# Windows で Linux 形式のパスを作る (docker run 時の -v オプションに渡すにはこの形式が必要)
function pwd_as_linux {
  "/$((pwd).Drive.Name.ToLowerInvariant())/$((pwd).Path.Replace('\', '/').Substring(3))"
}
```

# Docker コマンドで使う

上記の関数を用意しておけば、`docker` コマンドを呼び出すときに、データボリュームとしてマウントするホストディレクトリを相対パスで指定 (?) できます。

```ps1
docker run --workdir /app -v "$(pwd_as_linux)/resources:/app/resources" ubuntu bash
```

## Compose ファイルなら相対パスを使用できる

`docker run` の `-v` オプションに渡すにはホストディレクトリの絶対パスを指定する必要がありますが、Compose ファイルでボリュームを指定する場合は相対パスで指定できます。

特定のプロジェクトで使用する Docker コンテナで、プロジェクトのディレクトリ内の特定のディレクトリをデータボリュームとしてマウントしたい、というような場合は Compose ファイルを使う方が便利そうです。

* 参考 : [Compose file version 3 reference - Docker](https://docs.docker.com/compose/compose-file/)

# 関連ページ

* [PowerShell (Windows) で Docker コンテナにホストディレクトリをデータボリュームとしてマウントする際に pwd 相当のことをしたい](http://vividcode.hatenablog.com/entry/mount-host-directory-as-data-volume-on-power-shell-with-pwd) : 投稿してから、前に同じことをブログに書いてたことに気づいた……。
AndroidをLINE Simple Beaconにする


はじめまして。
LINE Simple Beaconの仕様が公開されたので、早速やってみました。

ラズベリーパイでLINE Beaconが作成可能に！「LINE Simple Beacon」仕様を公開しました
https://engineering.linecorp.com/ja/blog/detail/117

# 必要なもの
いずれかが必要とのこと。

* Raspberry Pi 3
* Raspberry Pi 2以前 + Bluetoothドングル
* Mac（Bluetooth LEを搭載している機種限定）

# 手元の機材

* Raspberry Pi（初代）
* Bluetoothドングル（Bluetooth 3.1まで対応）
* Macbook Pro（Bluetooth LE未対応）

だめだ。試せない。


試行錯誤の結果、Androidタブレット（Fire HD 8）をLINE Simple Beaconにできましたので紹介します。

# AndroidをLINE Simple Beaconにする
アプリをインストールして設定するだけです。

1. nRF Connect for Mobileをインストール  
  https://play.google.com/store/apps/details?id=no.nordicsemi.android.mcp&hl=ja
2. 起動する 
3. 「ADVERTISER」タブに切り替えて、右下の「＋」FABをタップ
4. Display nameに適当な名前をつける
5. 「Advertising data」の下の「ADD RECORD」をタップして「Service UUID」を選択
6. 「UUID or ...」欄に「FE6F」と入力して、OK
※一度保存して再度ダイアログを表示するとUUIDが変換されちゃいますがこんなもんなんでしょう。
![Screenshot_2017-02-22-00-40-26.png](https://qiita-image-store.s3.amazonaws.com/0/41574/6d95639c-8f68-617b-0ca8-a50d72f85c3c.png)
7. もう一度「Advertising data」の下の「ADD RECORD」をタップして今度は「Service Data」を選択
8. 「UUID or...」欄は先程と同じ「FE6F」を、「Data(HEX)」欄には「02[発行したHWID]7F00」を入力して、OK
※こちらも一度保存して再度ダイアログを表示するとUUIDが変換されちゃいます。
![Screenshot_2017-02-22-00-40-21.png](https://qiita-image-store.s3.amazonaws.com/0/41574/4fe09017-2ddb-eab5-7edc-5a880f195537.png)
9. 「Edit advertising packet」ダイアログをOKで閉じる
![Screenshot_2017-02-22-00-40-02.png](https://qiita-image-store.s3.amazonaws.com/0/41574/b5117c0e-5317-6b90-c2cd-fe4585a2e751.png)
10. 追加された設定の右側にあるスイッチをオンにして、「Advertisement timeout」ダイアログでOK

以上で、AndroidがLINE Simple Beaconとして動作すると思います。

# BOTアプリの作成
Beaconに反応して、BOTサーバーのWebhookが呼ばれます。
イベントとしては以下の物があるようです。

* ビーコンデバイスの受信圏内に入った
* ビーコンデバイスの受信圏内から出た
* Beacon Bannerをタップした（LINE Partner限定？）

詳細は公式ドキュメントを参照ください。
https://devdocs.line.me/ja/#webhook-event-object
System::Stringから普通のstringへの変換

# System::String から　std::stringへの変換方法

C++でフォームアプリケーションを作る際に必要になる。

下のnoteの部分を普通のstringにする場合を考える。
テキストボックス1(textbox1)の内容を普通のstring形式に変換したい。

```C++:
System::String^ note = this->textbox1->Text;
```

単純に考えて、string a = note.ToString();を試すが、普通のストリングには変換できない。
どうしたらよいか？


```c++:
using namespace std; 
using namespace System;  
  
void MarshalString ( String^ sys_string, string& std_string ) {  
   using namespace Runtime::InteropServices;  
   const char* chars =   
      (const char*)(Marshal::StringToHGlobalAnsi(sys_string)).ToPointer();  
   std_string = chars;  
   Marshal::FreeHGlobal(IntPtr((void*)chars));  
}  

////////フォームにテキストボックス1がある場合 ///////

string normal_string;

System::String^ note = this->textbox1->Text;
System::String^ app_text = gcnew System::String("abc" + note);//System::String同士を連結する

MarshalString(note,normal_string);
cout << normal_string << endl;

MarshalString(app_text,normal_string);
cout << normal_string << endl;



```
hamlでタグを改行しない方法の整理

## はじめに
この記事は、hamlでの改行を制御する方法をまとめたものです。
hamlから作られるhtmlタグは、基本的に改行が入り見やすいものになっています。
しかし場合によっては改行を消したいときもあるでしょう。
デザインにも影響します。
今回は、hamlでタグを改行しない方法を整理して解説します。

## 基本形
### haml

```haml
%ul
  %li
    %span
  %li
    %a
```

### html
```html
<ul>
  <li>
    <span></span>
  </li>
  <li>
    <a></a>
  </li>
</ul>
```

## 内側の改行を消す
### haml

１番目のliの直後に`<`を書いてみます。

```haml
%ul
  %li<
    %span
  %li
    %a
```

### html

すると、`li`の内側の改行が削除されるため、`li`, `span`がワンラインで書かれます。

```html
<ul>
  <li><span></span></li>
  <li>
    <a></a>
  </li>
</ul>
```

## 外側の改行を消す
### haml
`li`の直後に`>`を書いてみます。

```haml
%ul
  %li>
    %span
  %li
    %a
```

### html

すると、`li`の外側の改行が削除されるため、`ul`と次の`li`が改行なしで表示されます。

```html
<ul><li>
    <span></span>
  </li><li>
    <a></a>
  </li>
</ul>
```

`>`は`親のタグ`との改行を消すという説明がされている場合がありますが、正しくはこうなります。

親と子の改行を抑止する場合は以下のようにするのが良さそうです。

```haml
%ul<
  %li
    %span
  %li
    %a
```

```html
<ul><li>
  <span></span>
</li>
<li>
  <a></a>
</li></ul>
```

## まとめ
hamlの改行の削除に関しては、`<`は内側、`>`は外側と覚えておくのが良さそうです。
## 確認に使ったサイト
https://haml2erb.org/

## 追記
公式ドキュメントにキャッチーな説明が書かれていました:bow:
http://haml.info/docs/yardoc/file.REFERENCE.html#whitespace_removal__and_
```
You can think of them as alligators eating the whitespace: > faces out of the tag and eats the whitespace on the outside, and < faces into the tag and eats the whitespace on the inside.
```
アリゲーター🐊
AndroidStudioでエミュレータ起動時にi965_dri.soがロードされない

## 環境
* Ubuntu16.10 
* AndroidStudio v2.2.3

## 症状
* エミュレータ起動時にlibGLエラーが発生する。
* i965_dri.soがロードできない云々のエラーがでる

こんなやつ

```
Cannot launch AVD in emulator.
Output:
libGL error: unable to load driver: i965_dri.so
libGL error: driver pointer missing
libGL error: failed to load driver: i965
libGL error: unable to load driver: swrast_dri.so
libGL error: failed to load driver: swrast
X Error of failed request:  GLXBadContext
  Major opcode of failed request:  154 (GLX)
  Minor opcode of failed request:  6 (X_GLXIsDirect)
  Serial number of failed request:  49
  ＼(^o^)／
  ＼(^o^)／
  ＼(^o^)／
```

## 調査
i965_dri.soで検索したらarchlinuxのフォーラムにて解決されてた。
https://bbs.archlinux.org/viewtopic.php?id=213192

ちなみに、UbuntuとかCentOSとかarchとかで問題が発生しているようなので、Linux全般で往々にして発生する可能性がありそうですね。

## 原因
https://developer.android.com/studio/install.html
AndroidStudioをダウンロードしたときに表示されるインストール手順に従ってもこの問題は発生すると思われる。

`Android/sdk/tool/lib64/libstdc++.so.6`をAndroidStudioはエミュレータ起動時に見に行くが、本来見て欲しいのは公式手順にしたがって自分でインストールした`/usr/lib32/libstdc++.so.6`

公式手順でインストールしたライブラリを見に行ってくれていないのが原因。なのでリンクを貼り直すことで解決できるようです。

## 解決策
一応Ubuntuを対象に書くけども、他のやつでも多分大丈夫。

まずは念の為公式手順にしたがってインストールしとく。
以下AndroidStudioから抜粋

> 注: 64 ビット版の Ubuntu をご利用の場合は、以下のコマンドで 32 ビット用のライブラリをいくつかインストールする必要があります。  
> sudo apt-get install lib32z1 lib32ncurses5 lib32bz2.1.0 lib32stdc++6

上のやつ、たぶんエラーで止まると思うけど、すんなり入るやつだけ入れとけば大丈夫だと思われる。

コマンドでインストールされているかを確認。
```
ls /usr/lib32/libstdc++.so.6
もしくはこっち
ls /usr/lib/libstdc**.so.6
```

存在を確認したら、lnコマンドでリンクを貼ります。
オプション-sfをつけてください。

```
ln -sf /usr/lib32/libstdc++.so.6 ~/Android/sdk/tools/lib64/libstdc++/libstdc++.so.6
```

環境によって微妙に位置が違うっぽいので、コピペせずに確認しながらやったほうがよか。

起動してみると動くと思います。もしかしたらデバイスを作成し直すかAndroidStudioを再起動したほうがいいかもしれないですが、しなくても動いたんでいけると思います。

## 所感
はじめての投稿でどきどき。
CentOS 7.2にnode.jsをインストールする

CentOS 7.2にnode.jsをインストールしたときのメモ

###node.jsインストール

```bash
$ cd ~/git/github/
$ mkdir creationix
$ cd creationix
$ git clone git://github.com/creationix/nvm.github
$ echo . ~/git/github/creationix/nvm/nvm.sh >> ~/.bashrc
$ . ~/.bashrc
$ nvm install stable
```

```bash
$ node -v
v7.1.0
$ npm -v
3.10.9
```

###サンプルプログラム作成

```bash
$ cd ~/workspace
$ mkdir nodejs && cd nodejs
$ npm init
$ emacs index.js
```

```node.js
var http = require('http');
var server = http.createServer();

server.on('request', doRequest);
server.listen(8080);

console.log('Server running');

function doRequest(req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.write('Hello World¥n');
    res.end();
}
```

```bash
$ node index.js
```

###ポート制限
環境によってはポート8080など、80(HTTP)、443(HTTPS)以外は閉じられていることがある。サーバ側で対応する場合は以下。

```bash
$ emacs myiptables.sh
```

```text
iptables -t nat -I PREROUTING -p tcp --dport  80 -j REDIRECT --to-ports 8080
iptables -t nat -I PREROUTING -p tcp --dport 443 -j REDIRECT --to-ports 8443
```

```bash
$ sudo chmod u+x myiptables.sh
$ sudo sh myiptables.sh
```
CocosCreatorでドット絵をきれいに描く方法

# はじめに
CocosCreatorではデフォルトで画像にアンチエイリアシングがかかる仕様のようです。写真などはきれいに表示されますが、ドット絵のカクカクを表現したい場合には不向きですね。

本記事ではレトロゲーム作成向けに、アンチエイリアシングを無効化する方法をまとめます。

アンチエイリアシングを無効化しない場合：
（特にビットマップフォントがきれいに表示されない）
![antialiasing_on.png](https://qiita-image-store.s3.amazonaws.com/0/94561/cdadcbca-c15b-94d8-13db-e06a0b12e88f.png)


アンチエイリアシングを無効化した場合：
![antialiasing_off.png](https://qiita-image-store.s3.amazonaws.com/0/94561/d1f65e58-3967-f657-7393-e66f82e39298.png)

※クリスマスツリーとリャマの画像は、[ドット絵世界](http://yms.main.jp/index.html)様よりお借りしました。

# アンチエイリアシングを無効化する方法

以下のように、初期化処理にてcc.view.enableAntiAlias(false);を呼び出すだけです。
１回呼び出しておけば、Sceneが切り替わった後もアンチエイリアシングは無効のままとなります。

```JavaScript:Game.js
cc.Class({
    extends: cc.Component,

    properties: {
    },

    onLoad: function () {
        cc.view.enableAntiAlias(false);
    },
});
```

なお、CocosCreatorのVersion 1.3系ではバグがあり、以下のエラーが出て中断してしまいます。
<font color="red">（2017.3.10 追記：3月頭に正式リリースされたVersion 1.4.0で対処済み）</font>

```
Unable to get property 'map' of undefined or null reference
```

上記バグは1.4系では対処されているようです。
2017.2.22時点では[ベータ版(02.07 updated rc.2)](http://www2.cocos2d-x.org/t/cocos-creator-v1-4-0-beta-releases-02-07-updated-rc-2/33617)で動作確認を行いました。
OpsWorks chef_gemエラーが発生したので応急処置でバージョン指定

```
[2017-02-21T13:04:15+00:00] INFO: Installing chef-gem fog = 1.37.0
ERROR:  Error installing fog:
nokogiri requires Ruby version >= 2.1.0.
```

nokogiriが入らなくてエラーだったぽい。

うまく動いているインスタンスのgemバージョンをみる

```bash
$ ls /opt/aws/opsworks/releases/20161019094202_3441-20161019094202/vendor/bundle/ruby/2.0.0/gems
```

`nokogiri-1.6.8.1`

OpsWorks ChefのRubyバージョンは

```bash
$ /opt/aws/opsworks/local/bin/ruby -v
ruby 2.0.0p645 (2015-04-13 revision 50299) [x86_64-linux]
```

nokogiriのrubygemsページで見ると、1.7からRuby 2.1が必要で、このせいで落ちたみたい。


## レシピで指定する

カスタムcookbooksに書いておこう…

```ruby
# opsworks/attribtes/default.rb
defalt[:nokogiri_version] = '1.6.8.1'
```

```ruby
chef_gem "nokogiri" do
  action :install
  version node[:nokogiri_version]
end
```

Update Custom Cookbooksして試しに動かしてみる。

```bash
$ sudo opsworks-agent-cli run_command update_custom_cookbooks
$ sudo opsworks-agent-cli run_command configure
```

`configure`の部分は実行したいコマンド。

recipeのメンテが辛くなる…よくない


## 中途半端にインストールされたgemで依存関係が壊れたとき

```bash
# sudo su -
# cd /opt/aws/opsworks/releases/20161019094202_3441-20161019094202
# rm -rf vendor/bundler
# /opt/aws/opsworks/local/bin/bundle install
```

ただ、そこまでくると諦めてインスタンス作り直した方がいいかも。
ndenv / nodenv で Node.js をインストールする際、同時に Yarn もインストールする方法

## TL; DR
- ndenv / nodenv を使うと任意の Node をインストールできる
- プラグインを使うと、`ndenv install` と同時に [Yarn](https://github.com/yarnpkg/yarn) のインストールできて便利
  - [ndenv-yarn-install](https://github.com/pine/ndenv-yarn-install)
  - [nodenv-yarn-install](https://github.com/pine/nodenv-yarn-install) 

## Yarn とは ?
npm に比べて速い Node 向けのパッケージマネージャーです。

- [Yarnファーストインプレッション](http://qiita.com/mizchi/items/1002fde0de10e7c54fb2)

## ndenv / nodenv とは ?
nvm や nodebrew などと同じ、複数バージョンの Node を容易に管理する為のツールです。

- [node.js のバージョン管理ツール ndenv を試した](http://qiita.com/MahoTakara/items/8fdebe32e8f326afa7f8)
- [Ruby・Nodeを使うなら、rbenv・ndenvが便利](http://qiita.com/shuntaro_tamura/items/1a5883a24cd8d2579012)

## プラグインの導入方法
プラグインを使うと、ndenv を使って任意の Node をインストールした際、[Yarn](https://github.com/yarnpkg/yarn) も一緒にインストールすることができます。別途インストールする手間が省けて大変便利です。

- [ndenv-yarn-install](https://github.com/pine/ndenv-yarn-install)
- [nodenv-yarn-install](https://github.com/pine/nodenv-yarn-install) 


プラグインは Git を使ってインストールします。
(nodenv を使っている方は、ndenv を nodenv に置き換えてください。)

```
$ git clone https://github.com/pine/ndenv-yarn-install.git "$(ndenv root)/plugins/ndenv-yarn-install"
```

インストールが終わったら、シェルを再起動してインストールできているか確認します。

```
$ exec $SHELL -l
$ ndenv hooks install
/Users/pine/.anyenv/envs/ndenv/plugins/ndenv-yarn-install/etc/ndenv.d/install/yarn-install.bash
```

上記のように、 `ndenv-yarn-install` を含んだ何らかのパスが表示されれば正常にインストールされています。


## 使い方
いつものように ndenv で Node をインストールするだけで、自動で Yarn もインストールされます。

```
$ ndenv install v7.5.0
Downloading node-v7.5.0-darwin-x64.tar.gz...
-> https://nodejs.org/dist/v7.5.0/node-v7.5.0-darwin-x64.tar.gz
Installing node-v7.5.0-darwin-x64...
Installed node-v7.5.0-darwin-x64 to /Users/pine/.anyenv/envs/ndenv/versions/v7.5.0

Installing Yarn...
Installed Yarn 0.20.3
```

## まとめ
Yarn は本当に爆速なので、プラグインとセットでぜひ使ってあげて下さい。
AWStatsバージョンアップ手順

# AWStatsでiOSが検出されない
入れてるバージョンが7.2、iOSに対応しているのは7.3〜

と、いうことでバージョンアップ


####1. 最新版を[ここ](http://www.awstats.org/#DOWNLOAD)からダウンロード

####2. awstats.pl内にある日付の形式を編集

```pl:10055行目付近
#"$Message[5] $MonthNumLib{$MonthRequired} $YearRequired";

#表示形式を変更
"$YearRequired$Message[6] $MonthNumLib{$MonthRequired}";
```

```pl:12971行目付近
#: "$Message[5] "
#. $MonthNumLib{$MonthRequired}
#. " $YearRequired"

#表示形式を変更
:"$YearRequired$Message[6] $MonthNumLib{$MonthRequired}";
```

```pl:13376行目付近
#print "$MonthNumLib{$monthix}<br />$YearRequired";

#表示形式を変更
print "$YearRequired$Message[6]<br />$MonthNumLib{$monthix}";
```

```pl:13376行目付近
#print "$MonthNumLib{$monthix} $YearRequired";

#表示形式を変更
print "$YearRequired$Message[6] $MonthNumLib{$monthix}";
```

####3. 最新のファイルに置き換える
awstats.shとログファイルはバージョンアップ後も使用するため置き換えない！

```
awstats
├─docs
├─tools
└─wwwroot
  ├─cgi-bin
  │　　├─lang
  │　　├─lib
  │　　├─plugins
  │　　├─awredir.pl
  │　　├─awstats.pl
  │　　├─awstats.sh　　←置き換え対象外
  │　　└─ログファイル　　　←置き換え対象外
  ├─classes
  ├─css
  ├─icon
  └─js
```


終了！
JavaScriptで末尾再帰最適化（後付け）する

Qiita初投稿です

ES2015では、関数の末尾再帰最適化が仕様としてあったと思うのですが、
未だに各ブラウザでは（標準で）実装されていません。

以下のサイトでは、Pythonでデコレータを使って末尾再帰最適化を実現していました。
これのJavaScript版を書いてみようと思います
http://tanihito.hatenablog.com/entry/20110119/1295459297

```js

var tail_recursion = function(func) {
	var is_first = true;
	var cont = {};
	var saved_args;
	var _in = function() {
		if (is_first) {
			var args = arguments;
			while (true) {
				is_first = false;
				var result = func.apply(null, args);
				if (result === cont) {
					args = saved_args;
					is_first = true;

				} else {
					is_first = true;
					return result;
				}
			}
		} else {
			saved_args = arguments;
			return cont;
		}
	};
	return _in;
};
```

こんなふうに使います

```js

var sum = function(num, total){
	total = total || 0;
	if(num == 0) {
		return total
	} 
	return sum(num - 1, total + num);
};
sum = tail_recursion(sum);
console.log(sum(1000000));  //500000500000

```

こんな風に、関数内部用の名前をつけた場合はうまく動きません

```js

var sum = function sum(num, total){
        total = total || 0;
        if(num == 0) {
                return total
        }
        return sum(num - 1, total + num);
};
sum = tail_recursion(sum);
console.log(sum(1000000));  //RangeError: Maximum call stack size exceeded

```
おそらくどのブラウザでも動くのではないでしょうか
Ubuntu で日本語文字化けが発生した場合


・　調査

```
$ vi /etc/default/locale

LANG="en_US"
LANGUAGE="en_US:"
```

この場合、UTF-8に対応していないので日本語が文字化けされてしますので

```
$ vi /etc/default/locale

LANG="en_US.UTF-8"
LANGUAGE="en_US:"
```

変更して、ユーザログインしなおせばOK
DELL  Laptop Studio1555 InsertキーをPauseキーに割当て変更（Windows10(64bit)で動作確認済み）

####DELLのノートパソコンStudio1555には**pauseキー**がありません。

####そこで個人的に全く使用しない**Insertキー**に、**Pauseキー**を割当てました。

####**レジストリ編集**で割当てます。

####以下、作業手順です。
***
　1.レジストリエディタを起動する。

　2.HKEY_LOCAL_MACHINE\SYSTEM\Current Control Set\Control\Keyboard Layout　と進む。

　3.［編集］→［新規］→［バイナリ値］から値の名前を「Scancode Map」とする。

　4.Scancode Mapを右クリック→［バイナリデータの修正］を選択して16進でスクショのように入力する。

　![image](https://qiita-image-store.s3.amazonaws.com/0/166791/4c10b2d8-ea98-333f-7065-9d4a9c4666cc.png)

　5.一度、サインアウトもしくは再起動すると割当てが反映されます。
***
####作業を行う場合はくれぐれも慎重に作業ください。そして自己責任での作業をお願いします。
######※ちなみにリマップソフトも使いましたが、うまく割り当てられなかった。。
Lubuntuでデスクトップにショートカットを作る

環境： Lubuntu14.04

シェルスクリプトを書いてみたものの、ダブルクリックすると毎回こういうメッセージが出る。あと、アイコンがこれではわかりにくい。

![Screenshot from 2017-02-21 23:09:52.png](https://qiita-image-store.s3.amazonaws.com/0/80588/2d22f0d0-c9fd-ce55-1363-96a87a849d0f.png)

そこで、

1. ダブルクリックで即起動するショートカットをデスクトップに作る
2. アイコンを設定する



## ステップ１：シェルスクリプトを書く

保存場所はどこでも良いが、自分の場合はユーザールート（~/）にフォルダを作ってそこに保存した。


## ステップ２：アイコン画像を描く・または見つけてくる

形式は、PNGなどの画像で良い。自分は、シェルスクリプトと同じ場所に保存した。

## ステップ３：ショートカットを作る

端末から、

```{bash}
lxshortcut -o ~/Desktop/launcher

```
すると、launcherというファイルがデスクトップに作られる（ファイル名は任意）。

![Screenshot from 2017-02-21 23:21:11.png](https://qiita-image-store.s3.amazonaws.com/0/80588/64c19131-b551-c376-d5f2-bd802d880702.png)


## ステップ４：シェルスクリプトを登録する

launcherファイルを右クリック→Propertiesを開き、Desktop EntryタブのCommandというところにステップ１で保存したシェルスクリプトを指定する。
![Screenshot from 2017-02-21 23:23:01.png](https://qiita-image-store.s3.amazonaws.com/0/80588/04fdf21d-1a64-85a2-d82f-da93478b19b2.png)


## ステップ５：アイコンを指定する

launcherファイルを
右クリック→Propertiesを開き、Generalタブのアイコン部分をクリック。すると、画像を指定することができるので、ステップ２で用意した画像ファイルを指定する。

![Screenshot from 2017-02-21 23:27:05.png](https://qiita-image-store.s3.amazonaws.com/0/80588/816204b7-4bdd-972a-48fc-3838a187f0d3.png)


以上で、デスクトップにショートカットができる。ダブルクリックするとシェルスクリプトが走る。
Golang 所感とTips

去年辺りから少しずつGolangを書くようになってきたので所感をまとめました。

### "実現する方法は一つ、なるべく一つであるべきだ"
Goは文法がシンプルなので何かをするときの書き方がいくつもあって混乱することがありません。
これは[Pythonの考え方](http://python-history.blogspot.jp/2009/01/pythons-design-philosophy.html)と似ていて非常に好印象でした。

### リスト内包表記的なものはない
Goでは `map`, `reduce` といったリスト系メソッドも用意されておらず、`for` を使います。
最初は「えぇ・・」と思いましたが、これもまた、_"実現する方法は一つ、なるべく一つであるべきだ"_ の考えだと思って納得しました。


### gofmtがとても便利
gofmtによるコード自動整形によって、細かなフォーマットの違いに悩まされることがなくなりました。これはとても気楽！
`go vet` も併用することでちょいミスも早めに気付けてとても良いですね。

### 開発ツールには VSCode が便利
VSCodeを入れてGo拡張をインストールするだけ！
いい感じの環境が整います。
VSCodeは軽い感じのエディタなのですが、go拡張を入れると賢いコード補完や自動gofmtなどついてきて最高でした。

### `if err != nil` が面倒
Goには例外がなく、以下のように毎回エラーチェックをする書き方が基本ですが、これは面倒に感じました。「エラー処理を怠るな！」っていうGolangの意思なのかもしれませんが、本当に面倒です。。

```go
res, err := GetResponse()
if err != nil {
    // handle error...
}
```

### string と []byte の扱い
どちらもバイト列を示すものだが、`string`はimmutable, `[]byte` は mutableという点で使い分ける、と認識しています。

http://joshua.poehls.me/2014/04/go-101-string-or-byte-slice/
このサイトで学びました。


### ポインタ難しい
Goにはめずらしくポインタがあります。
構造体メソッドのレシーバーの型をポインタ型にするべきなのか迷ったり。やはりポインタは難しいです・・。
【Laravel】Modelをsaveすると、そのインスタンスのidが0になることがある

# 問題のない例
以下のようなmigrationとmodelの場合、特に問題は起こらない。

`php artisan make:migration create_samples_table`
`php artisan make:model Sample`

* create_samples_table.php

``` php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateSamplesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('samples', function (Blueprint $table) {
            $table->increments('id');
            $table->string('content');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('samples');
    }
}
```

* Sample.php

``` php
namespace App;

use Illuminate\Database\Eloquent\Model;

class Sample extends Model
{
    //
}
```

* 使用例

``` php
$sample          = new Sample();
$sample->content = 'hoge';
$sample->save();

echo $sample->id;   // 1
```

# idがnullになる例

例えば、`model`の`key`を`string`にしたいという場合。
`migration`は以下のようになるだろう。

``` php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateSamplesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('samples', function (Blueprint $table) {
            $table->string('id')->unique();  //変更
            $table->string('content');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('samples');
    }
}
```

これをこのまま使用すると以下のようにidに0が格納されてしまう。
(データベースには正しく`id`に`a1234567`が格納されている)

``` php
$sample          = new Sample();
$sample->id      = 'a1234567';
$sample->content = 'hoge';
$sample->save();

echo $sample->id;   // 0
```

# 解決策

~~おそらくだがsave時にint型で自動増分させる処理の際に、0が格納されてしまうのだろう。~~

なので、Modelのプロパティを以下のように設定してあげれば解決できる。

* Sample.php

``` php
namespace App;

use Illuminate\Database\Eloquent\Model;

class Sample extends Model
{
    /**
     * The "type" of the auto-incrementing ID.
     *
     * @var string
     */
    protected $keyType = 'string';

    /**
     * モデルの主キーを自動増分させるか否か
     *
     * @var boolean
     */
    public $incrementing = false; 
}
```

* 使用例

``` php
$sample          = new Sample();
$sample->id      = 'a1234567';
$sample->content = 'hoge';
$sample->save();

echo $sample->id;   // a1234567
```

# 原因?(追記)

`$incrementing = true`となっていると、以下の`processInsertGetId`が実行される。

``` php
public function processInsertGetId(Builder $query, $sql, $values, $sequence = null)
{
    $query->getConnection()->insert($sql, $values);
    $id = $query->getConnection()->getPdo()->lastInsertId($sequence);
    return is_numeric($id) ? (int) $id : $id;
}
```

つまり、save時にインサートが行われ、その後最新のIdを取得してきている。
この処理の間に$idが0となってしまっているようだが、
具体的になぜ0になってしまうのか...ということまではわからなかった。
GitHub Desktopでもgit-secretsが使いたい

# 問題
GitHub Desktopでコミットしようとしたら次のようなエラーが出た。
![image](https://qiita-image-store.s3.amazonaws.com/0/87448/0164e7af-b1bc-36b8-a6a2-433bf5ab6d49.png)

## 状況
- [AWSアカウントを取得したら速攻でやっておくべき初期設定まとめ \- Qiita](http://qiita.com/tmknom/items/303db2d1d928db720888#git-secrets)の手順でgit-secretsを導入している
- zshを利用しており、自分で実行する際にはgit-secretsが動作している

# 原因
これは以下のprehookの実行時に起こっているエラーである。

```bash
#!/usr/bin/env bash
git secrets --pre_commit_hook -- "$@"
```
（このprehookはbrewでgit-secretsを入れる際に定義される。）

GitHub Desktopを実行する際にgit-secretsが読み込めていない。

# 解決方法
```bash
cd /Applications/GitHub Desktop.app/Contents/Resources/git/bin
ln -s /usr/local/bin/git-secrets
```

## 解説
GitHub Desktopは自分のパッケージに含まれるGitを使う（システムのGitを使うようにする設定項目は見当たらない）。
git-secretsを使うためにはgitの実体がある階層にシンボリックリンクを貼ればよいので、はる。

## GitHub Desktopが利用しているGitのpathの調べ方
GitHub Desktopが利用しているgitの実体は、Gitのprehookの仕組みを使うことで、GitHub Desktopでのコミットの際にpathを出力することで確認ができる。
具体的にはコミットしたいリポジトリの`.git/hooks/pre-commit`に`which git`を書いておく。
Google Compute Engineでメールの送受信をする

# 結論

- 独自ドメインを使っている場合は[Mailgun](https://mailgun.com/)を使うのが良い
    - GCEから使う場合は[此方](https://www.mailgun.com/google)から登録
    - 2018年7月より料金が改定されますが、無料枠利用者には影響なし
- 受信もMailgun頼みになる（転送機能を使う）
    - ~~最近Gmailへの転送はエラーが出るようになってしまった（未解決）~~ 原因不明のままいつの間にか直っていました
- ~~何故かGmailからMailgunに設定したアドレス宛に送信できない（Gmail側でエラーが出る）。他のメールサービスからは送信できる~~→Google Cloud DNSを使い始めたので再度送受信チェックしてみたら送信できた

# 送信

SendGridを使おうとしていたのだが、独自ドメインの設定が上手くいかず断念（どうやら有料らしい）。Mailgunに乗り換えたらあっさりできた。

1. Mailgun側で独自ドメインを先に設定しておく
    - すごく親切なのでとりあえず登録したら流れでやっておく
    - Mailgunのアカウント認証（要SMSが受信できる回線）が済んでいないと、当然ながらrejectされる
2. [Google Compute Engineのドキュメント](https://cloud.google.com/compute/docs/tutorials/sending-mail/using-mailgun)通りに設定する

なお、Gmailなどのクライアントを通して送信メールアドレスとして使う場合は、587ポートなども使えるのでご安心を。
この場合、メールアドレスは自分のドメインで適当に設定（サーバー上にアカウントは必要ない）、認証情報は
https://mailgun.com/app/domains
から当該ドメインのページに移動して確認する。

公式ドキュメントも参照。
https://documentation.mailgun.com/user_manual.html#sending-via-smtp

GCEから直接送ると送信元が `アカウント名@インスタンス名.c.プロジェクト名.internal` となる。
自分はサーバーから一斉送信などはしない（クライアントを通しての送信しかしない）のでこれで良いかなと思っている。

# 受信

**サーバー側の設定は何も要らなかった。**
受信アドレスについてもサーバー上にアカウントは必要ない。

Mailgunのダッシュボードに、設定したドメインのメールアドレスにメールが来た時にどうするかフィルタをかけて設定する場所があるので、とりあえず全部自前のメールアドレス（フリメとか）に転送しておけば良い。
チームマネジメントというパズル

チームマネジメントは生きたパズルのようなもの。

チームという四角い枠があって、ピース（人）をそこに置いていく。

でもそこに置かれていく一つ一つのピースは、綺麗な四角にはなっていない。
丸いもの、超多角形のもの、尖ったもの、いびつなもの等々、多種多様。
しかも大きさもバラバラ。

枠にピースがなるべく綺麗にハマるように置いていく。
ピースの形は個性的なので、枠の中に隙間が必ず生まれている。

その隙間を埋めていかなければ、チームは美しい絵を形作る事が出来ない。

隙間の埋め方は色々。
あるピースの形を変化させて埋めたり。
別の新しいピースを置いて埋めたり。
枠自体を変えてしまう事もあるかもしれない。

そうやって枠やピースを変化させていく事が、チームマネジメント。

一度綺麗な絵になったとしても、また再び何処かに隙間が空いてしまう事が必ずある。
なぜなら、枠もピースも生きているから。

なるべく美しい絵を保つ事が、チームマネジメント。
例外じゃない例外を作らない、あるいは、例外的状態には例外を使う

# 概要

何やら哲学的なタイトルですが、最近とある SDK で例外っぽい名前の例外でないクラスを見かけたので、頼むからそれは例外にしてくれ🙏という気持ちをここに記しておこうと思います。

# 例外のような名前の例外でないクラス

ある[有名なライブラリ](https://github.com/square/retrofit/)にも昔は存在したのですが、非同期処理中におけるエラーを説明するために`FooError`というクラスを作り(以後この記事では便宜的にエラークラスと言います)、そこにステータスコードやメッセージを詰め込んでコールバックする設計のライブラリや SDK が稀によくあります。

言語によっては例外処理の機構が言語レベルで用意されていないものもあるので、一概にこれがどの場合でも悪手だとは言えませんが、少なくとも例外処理の機構を持っている言語では、例外的状態を説明するのに例外を積極的に使って欲しいです。あるいは、どうしてもやむを得ない理由で例外が使えない場合や、正常系としての振る舞いとして失敗したという結果を返したい場合は、`Error`や`Exception`等の例外を想起させるクラス名は使わないほうが良いです。

このあたり、某有名ライブラリにあがっている[イシュー](https://github.com/square/retrofit/issues/1102#issuecomment-152851967)では、「あの設計はひどかったからやめたよ」とコメントされていたりしています。

# エラークラスで困ること

## スタックトレースが取れない

例外の機構を使わない場合、スタックトレースがそのままでは得られないので、どこでなにが起きてだめだったのかという情報が欠落します。エラークラスに状況を説明するためのステータスコードやメッセージを含めるパターンが多いと思いますが、似たようなエラークラスの生成が複数箇所で行われると追いきれません。自分で例外クラスを拡張してステータスコードやメッセージを含められるようにすれば、晴れてスタックトレースも見えるようになるはずです。

## 投げられそうに見えて投げられない

Java言語であれば、例外クラスはたいてい`FooException`や`BarError`など語尾に`Exception`や`Error`がついています。おそらく他の言語でも例外を表すクラス名には一定の命名規則やパターンがあると思います。

これと似たような名前のエラークラスを見かけると、一見投げられるのかな？と思ったり、`Throwable`を吸い込んでくれる便利ユーティリティ(例えば、例外をログに出すようなメソッド)にそのまま渡せるかな?と思ったりしますが、その実まったく`Throwable`ではないので、通常の例外処理の機構にのっとった取り扱い方ができません。

# さいごに

EffectiveJava 第二版では、例外的状況にのみ例外を使うと題して、通常の制御構造として例外を使ってはいけないという事例が載っています。合わせて振り返っておきたい項目です。
【スクリプト&エクセル不使用】markdown形式の表をcsvから簡単に作る方法【正規表現】

csvやエクセルの表をmarkdownの表形式に変換する方法を紹介します。
[スクリプトを組んだり](http://qiita.com/taruhachi/items/5bd18d7de4c3fa40dd23)、[エクセルを使う方法](http://qiita.com/suin/items/f4bacb69c5d4c008fcd0)もありますが、今回は正規表現を使った置換でやります。

※急いでる人は[結論](#結論このサイトを使いましょう)を読んでください
※何故かatomで肯定戻り読みが使えないので、sakura editorでしか検証できていません。

# やること

```:このcsvを
A,B,C
D,E,F
G,H,I
J,K,L
```

↓

```:2回の置換でこんな感じに変形しちゃいます
|A|B|C|
|:-:|:-:|:-:|
|D|E|F|
|G|H|I|
|J|K|L|
```

## step0:正規表現が使えるエディタに変換前のcsv等をコピペ

Excelの表はエディタに貼り付けるとtsv(タブ文字区切り)になっています。
以降csv前提で書いているので、カンマ区切りを置換している部分は`,`を`\t`に読み替えてください。

## step1:正規表現の置換で2行目の左右寄せ「:-:」を除く部分の表を作ります

※tsvでやってる人は早速置換前の`,`を`\t`に読み替えてください

```:2行目以外の変換
//置換前
^|$|,

//置換後
|
```


```:結果

|A|B|C|
|D|E|F|
|G|H|I|
|J|K|L|
```



## step2.正規表現の置換で2行目の作成を行います

markdownの表には、各列の(左寄せ|真ん中寄せ|右寄せ)を表現する2行目が不可欠です。
こちらは1行目をコピペして余分に作成したものを正規表現で置換してを2行目として作成します。

```:一行目を増やす

|A|B|C|
|A|B|C|
|D|E|F|
|G|H|I|
|J|K|L|
```


上記のように一行目をコピペで増やした後、
2行目に対して以下の正規表現を実行してください。

```:ヘッダの変換
//置換前
(?<=¥|).+?(?=¥|)

//置換後(前列真ん中寄せで良い場合)
:-:
```

正規表現でやってることとしては、|と|に挟まれている文字列を:-:に変換しています。

```:結果
|A|B|C|
|:-:|:-:|:-:|
|D|E|F|
|G|H|I|
|J|K|L|
```

Markdown形式の表に変換できました。
ちゃんとレンダリングできますよ。

|A|B|C|
|:-:|:-:|:-:|
|D|E|F|
|G|H|I|
|J|K|L|

あとは必要な箇所の右寄せ・左寄せを調整してください。

# 最後に - Markdownの表形式に思うこと

ヘッダとデータの間に入る2行目のせいで変換に手間がかかりました。

```
|A|B|C|
|:-:|:-:|:-:| ←これ
|D|E|F|
|G|H|I|
|J|K|L|
```

再利用性とか効率性を重視するなら2行目なしでも表として扱えるようにしてほしいです。

ですが[Wikipedia](https://ja.wikipedia.org/wiki/Markdown)には

>書きやすくて読みやすいプレーンテキストとして記述した文書を、妥当なXHTML（もしくはHTML）文書へと変換できるフォーマット

とあります

「プレーンテキストでも読みやすい」コンセプトを重視するなら

```:列を揃えた結果
|A  |B  |C  |
|:-:|:-:|:-:|
|D  |E  |F  |
|G  |H  |I  |
|J  |K  |L  |
```

ここまで整形すべきです。また2行目があることでプレーンテキストでも読みやすくなっています。
手間ですが[リーダブルコードの縦を揃える](http://d.hatena.ne.jp/asakichy/20140730/1406672564)に通じるところがあります。個人的には好きです

文字数をあわせて列を揃えるのは正規表現では解決できません(多分)。
これはスクリプトを作る必要があります。

テキストエリアにペタッと貼ってボタンを押したら、きれいな表形式が出来るサイトなんかがあれば最高だと思います。


**なんとそんなサイトがありました**

# 結論:このサイトを使いましょう

前述した読みやすさも実現してくれます。すごい。

https://donatstudios.com/CsvToMarkdownTable

```:変換前コピペ用
A,B,C
D,E,F
G,H,I
J,K,L
```

```:上のサイトでの変換結果
| A | B | C | 
|---|---|---| 
| D | E | F | 
| G | H | I | 
| J | K | L | 

```
Android Thingsの画面を上下逆転

開発環境

* Android Things - Developer Preview 2
* RaspberryPi 3 Model B
* Macbook - Mac OS Sierra （SDカードを開けなくて失敗したので、Windows 10で試しました）
* Windows 10

Androidの画面を上下逆転するのにいくつのアプローチを試しました。失敗したアプローチ、成功したアプローチを下記にまとめます。

* **（成功）** Windows環境のパソコンでAndroid ThingsをフラッシュしたSDカードを開いて、ルートにあったCONFIG.txtファイルに`lcd_rotate=2`の一行を追加しました。CONFIG.txtを編集したら、再びraspberry piに挿入し、起動したら反転しました。
* **（失敗）** Macbook（OS Sierra）にAndroid ThingsをフラッシュしたSDカードをFinderで開こうとしましたが、SDカードがうまく読み込まれなくて、フォルダを開くことができませんでした。
* **（失敗）** adb rootでスーパーユーザになって、`find / -name "CONFIG.txt"`で検索したらファイルが見つかりませんでした。
* **（失敗）** `adb shell settings put system user_rotation 2`を送りんで、再起動してみましたが、残念ながら何も変わりませんでした。
matplotlib: 軸自体を別のものに差し替える。


`python2.6` + `matplotlib (1.4.3)` では実行できる[^1]。

[^1]: `matplotlib (1.0.1)` では実行できない

グラフ作成時に軸を全く別スケールにしたい場合。

- X軸を実数から、時間軸に。
- Y軸を 0~10の所を0~100に

今回は、サブプロットで、軸を作成しといてから、`ax1.twinx().twiny()` したものに対して、データをプロットする。
plot 対象は、毎回使ってる `rand.txt`。

```shell-session:
$ perl -le 'print rand (10) for 0 .. 99' > rand.txt
```

```python:replace.py
#!/usr/bin/env python -B
# -*- coding: utf-8 -*-
import sys
import matplotlib as mpl
mpl.use('Agg')
import matplotlib.pyplot as plt
import pandas as pd

df = pd.read_csv(sys.argv[1], header=None)
# 軸のプロット
fig, ax1 = plt.subplots()
ax1.xaxis_date()         # Xは時系列
ax1.set_ylim([0,100])    # Yは0~100
ax1.grid(True)
ax = ax1.twinx().twiny()

# データのプロット
df.plot(ax=ax,xticks=[],yticks=[])
ax.legend().set_visible(False) 
ax.grid(False)
fig.subplots_adjust( bottom=0.15, top=0.95,left=0.1, right=0.95)
plt.savefig(sys.argv[2])
```


```shell-session:
$ python replace.py rand.txt graph.png
```

![change.png](https://qiita-image-store.s3.amazonaws.com/0/64084/1a4331d8-de6c-52f1-167a-b1c34644a4cb.png "change.png")



## 背景

`matplotlib` で時系列を扱った場合に、膨大なタイムスタンプを含むデータ[^2]をプロットすると、`dates.MonthLocator` とかのロケーター回りが腐るっぽい。

[^2]: 10 * 365 * 24 * 60 くらいの(時オーダー)。

引数無しで実行すると、まあ、そこそこの絵にはなるのだが、一度(ひとたび)、 interval=4 などとして実行すると、grid, xticklabel あたりがぐちゃぐちゃになる。

それを回避するために、膨大なタイムスタンプを適当に差し引いて[^3]そっちからグリッドなどを描画。

[^3]: 10 * 365 * 24 (日オーダー)

## memo

- 最後の方で、`fig.subplots_adjust( )` をする。
    - `pandas` でのプロットは、画像幅とかを勝手に変更する場合があるので明示的に adjust する癖を。
ネームスペースのない型名（String）からTypeを取得

# 初めに
[PlantUMLのクラス図からスケルトンコード生成](http://qiita.com/Tanakancolle/items/cb5cc76f84da3dc97f24)
で「クラス図に使用されている型名からusingを宣言する」機能を作った時に使用した方法です。

# 型名からType取得までの流れ
## アセンブリ取得
読み込まれているアセンブリを取得します。
>AppDomain.CurrentDomain.GetAssemblies ()

## Type取得
アセンブリ内の全Typeを取得します。
>Assembly assembly;
Type[] types = assembly.GetTypes()

## ジェネリック対応
ジェネリックの場合は「\`1」で表されるようです。
そのため型名を変換します。
例)List\<string\> → List\`1

>string type_name; // Typeを取得したい型名
int index = type_name.IndexOf ("<");
if (index >= 0) {
    type_name = type_name.Remove (index) + "`1";
}

## 型名とTypeを比較
ネームスペースのない型名をTypeから取得し比較します。
>Type type; // アセンブリから取得したType
string type_name; // Typeを取得したい型名
type.Name.Equals (type_name) // trueならtypeが型名の型

# 型名からTypeを取得する関数
```c#:Sample.cs
public static Type GetTypeFromTypeName(string type_name)
{
    // ジェネリック対応処理
    int index = type_name.IndexOf ("<");
    if (index >= 0) {
        type_name = type_name.Remove (index) + "`1";
    }

    // タイプ検索
    foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies ()) {
        foreach (var type in assembly.GetTypes ()) {
            if (type.Name.Equals (type_name)) {
                return type;
            }
        }
    }

    return null;
}
```
メトロノーム


デモ：http://codepen.io/mo4_9/pen/WRVXvR

BPMと拍数を渡して、リズムがずれないようにするコード。
`.wrapper`のdata属性のインデックスを参照すれば、ページ全体でリズムが揃う。

```javascript:Metronome.js
class Metronome {
  constructor(opts={}) {
    this.BPM = isNaN(opts.BPM) ? 120 : opts.BPM;
    this.NUM_BEATS = isNaN(opts.NUM_BEATS) ? 4 : opts.NUM_BEATS;
    this.msPerBeat = 60000 / this.BPM;
    this.wrapper = document.getElementsByClassName("wrapper")[0];

    this.start();
  }

  start() {
    this.startTime = Date.now()
    requestAnimationFrame(() => this.loop())
  }

  loop() {
    const elapsedTime = Date.now() - this.startTime;
    const currentBeatIndex = Math.floor( elapsedTime / this.msPerBeat ) % this.NUM_BEATS;
    this.setBeatIndex(currentBeatIndex)
    this.loopId = requestAnimationFrame(() => this.loop())
  }

  stop() {
    cancelAnimationFrame(this.loopId)
  }

  // 何拍目かを設定
  setBeatIndex(index) {
    switch (this.NUM_BEATS) {
      case 4: this.wrapper.setAttribute("data-beat4-index", index+1); break;
      case 3: this.wrapper.setAttribute("data-beat3-index", index+1); break;
      case 2: this.wrapper.setAttribute("data-beat2-index", index+1); break;
    }
  }

}

(() => {
  
  const BPM = 120;

  new Metronome({
    BPM: BPM,     // BPM
    NUM_BEATS: 4, // 拍数
  })
  new Metronome({
    BPM: BPM,
    NUM_BEATS: 3,
  })
  new Metronome({
    BPM: BPM,
    NUM_BEATS: 2,
  })
                  

})()
```

`.is-beat3-1` なら「3コマアニメーションの1コマ目」という意味

```scss:_metronome.scss
// 4拍子
.wrapper[data-beat4-index="1"]{
  .is-beat4-2,.is-beat4-3,.is-beat4-4{display: none !important;}
}
.wrapper[data-beat4-index="2"]{
  .is-beat4-1,.is-beat4-3,.is-beat4-4{display: none !important;}
}
.wrapper[data-beat4-index="3"]{
  .is-beat4-1,.is-beat4-2,.is-beat4-4{display: none !important;}
}
.wrapper[data-beat4-index="4"]{
  .is-beat4-1,.is-beat4-2,.is-beat4-3{display: none !important;}
}

// 3拍子
.wrapper[data-beat3-index="1"]{
  .is-beat3-2,.is-beat3-3{display: none !important;}
}
.wrapper[data-beat3-index="2"]{
  .is-beat3-1,.is-beat3-3{display: none !important;}
}
.wrapper[data-beat3-index="3"]{
  .is-beat3-1,.is-beat3-2{display: none !important;}
}

// 2拍子
.wrapper[data-beat2-index="1"]{
  .is-beat2-2{display: none !important;}
}
.wrapper[data-beat2-index="2"]{
  .is-beat2-1{display: none !important;}
}
```
Friendly×Nunit3×Consoleの注意点

作ったテストをNunit3のコンソールから出力しようとしたときに躓いたのでメモ

テストエクスプローラーなら何の問題もなかったのだが
コンソールで起動しようとすると問題が起きた。
AnyCPUだと上手く行かなかった。
x86かx64を指定してあげれば問題なく動作した。

VS2015Pro.ではテストエクスプローラーからNUnit3を使えるから
問題ないけど
VS2015ExpressだとテストエクスプローラーからNUnit3を使えないので
どうにかしようとしてコンソールから出力させようとして困ったときのことでした。
TinyMCEでローカルフォルダを開くのに苦労した話

# TinyMCEでローカルフォルダを開く

[TinyMCE](https://www.tinymce.com/)知ってますか？
<img width="755" alt="スクリーンショット 2017-02-21 20.43.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/56423/7c6db4a0-cadd-0372-d6a3-7049e044923e.png">

プラットフォームに依存しない、ウェブベースのエディタでCDNでさくっとtextareaを拡張してくれます。
厳密に言うとフリーミニアム形式なのですが、かなりのところまでフリーで使えます。
かなり使い勝手が良いのですが、ローカルフォルダを開くのに苦労したので備忘録として残したいと思います。

## ドキュメントを読む
まずは[ドキュメント](https://www.tinymce.com/docs/)をあたります。
TinyMCEのドキュメントは豊富です。
[Example & Docs > Full Featured](https://www.tinymce.com/docs/demo/full-featured/)にあるかと思い読みましたが、該当の実装はありませんでした。

[Configure TinyMCE > File & Image Upload](https://www.tinymce.com/docs/configure/file-image-upload/)
これが良さそうです。

```
tinymce.init({
  selector: 'textarea',  // change this value according to your HTML
  file_browser_callback: function(field_name, url, type, win) {
    win.document.getElementById(field_name).value = 'my browser value';
  }
});
```
おお、画像inputの横にフォルダが表示された！
<img width="443" alt="スクリーンショット 2017-02-21 20.58.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/56423/1de2df0a-3f34-8a3c-510d-c66bb6d72dc2.png">

<img width="442" alt="スクリーンショット 2017-02-21 20.59.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/56423/cf3b4c85-82b7-cb9c-39e9-d2e91d36153c.png">
あ、Exampleそのままなら、そらそうだわw 開きたいのはローカルフォルダ。やりたいのはこの先です。
しかしながら、該当の箇所を見つけられない & ローカルフォルダを開くのをコールバックでする？？というのが理解できず、読み進めることに。

## pluginを探す
TinyMCEは必要なものは拡張する薄いモジュールです。[plugin](https://www.tinymce.com/docs/plugins/)にあるかもしれません。

image plugin, image tool plugin, media plugin, 
ローカルフォルダのことはないですね。。。

途中で、[file managerのextra plugin](https://github.com/trippo/ResponsiveFilemanager)に行き着き。んー、こんなことしないといけないのか？と考えましたが、壮大になりすぎたので却下。

## StackOverflow

最終的にStackOverflowで同様の投稿がありました。

```
    tinymce.init({
        toolbar : "imageupload",
        setup: function(editor) {
            var inp = $('<input id="tinymce-uploader" type="file" name="pic" accept="image/*" style="display:none">');
            $(editor.getElement()).parent().append(inp);

            inp.on("change",function(){
                var input = inp.get(0);
                var file = input.files[0];
                var fr = new FileReader();
                fr.onload = function() {
                    var img = new Image();
                    img.src = fr.result;
                    editor.insertContent('<img src="'+img.src+'"/>');
                    inp.val('');
                }
                fr.readAsDataURL(file);
            });

            editor.addButton( 'imageupload', {
                text:"IMAGE",
                icon: false,
                onclick: function(e) {
                    inp.trigger('click');
                }
            });
        }
    });
```

これは、tinymceのsetupでinputをhiddenでeditorに追加して、イベントを追加しています。

参考：http://stackoverflow.com/questions/3872009/upload-image-from-local-into-tinymce

## まとめ
ここまで書く必要はなかったのですが、公式のdocumentを読んでなかった(見つけれてない可能性もあり)のが時間がかかりました。
JavaScriptでeditorにinputを追加するというのは、原理原則から考えると、至極単純な話ですが、TinyMCE側でなんとかしてくれるといった頭が強く考えつきませんでした。
基本の再確認と、頭でっかちになってたなーっていう事例なのでプロセスも記述しました。
最近のmrubyでC++を使ったmrbgemを作る時の注意事項的な何か

# extern "C"と直接書いてはならない

```cpp
MRB_BEGIN_DECL
```

と

```cpp
MRB_END_DECL
```

で囲む。

# なんでか？

2016年の11月以降から、デフォルトだと
C++を使うmrbgemを組み込んだmrubyは.cファイルもC++としてコンパイルされることに
なったから。

この状態では、

```cpp
extern "C"
```

と記述してしまうと、C++としてコンパイルされた.cファイルからリンクできずにエラーとなる。

## デフォルトだと多くのCのコードでエラー

Cのコードとしては問題ないコードでも、C++としてはコンパイルすると
エラーとなることが多々ある。

例えば

```txt
C++では、void *への変換は暗黙にできるが、void *から他の型への変換は、明示的なキャストが必要
```

で結構引っかかった。

```
/home/junichi/work/mruby/mruby-webcam/mruby/build/mrbgems/mruby-socket/src/socket.c: In function ‘mrb_value mrb_addrinfo_getaddrinfo(mrb_state*, mrb_value)’:
/home/junichi/work/mruby/mruby-webcam/mruby/include/mruby/boxing_no.h:25:35: error: invalid conversion from ‘void*’ to ‘addrinfo*’ [-fpermissive]
 #define mrb_ptr(o)      (o).value.p
```

## じゃぁ、これまでとおりにCをCとしてビルドするには

build_config.rbの前の方に

```
conf.disable_cxx_exception
```

ただし、これを入れるとC++を使ったモジュールで-lc++なり、C++の標準ライブラリの
明示的なリンクが必要。
WORDPRESS--投稿のカスタムフィールドを配列として取得

カスタムフィールドを同一名で複数登録し、取得しようとした際のメモ<br>
以下は$postを取得している前提
# カスタムフィールドの設定
##### 「投稿」→「投稿一覧」→投稿の編集画面で右上にある「表示オプションをクリック」→カスタムフィールドにチェック
##### 「カスタムフィールド」新規追加→名前(phpからアクセスするときのプロパティ名およびDB上のmeta_keyの値になる)と値(DB上のmeta_value)を入力して追加
# カスタムフィールドに配列として登録
カスタムフィールドを同一名で複数追加
# カスタムフィールドの値(単一)を取得
$post->カスタムフィールドの名前でアクセスできる。[^1]
[^1]:オーバーロードを利用しているようです。
# カスタムフィールドの値(配列)を取得
上記のやり方では配列として取得できなかった。
ので、調べたところget_post_meta()を使うことで解決できた。<br>
コード例<br>

              <?php $skills = get_post_meta($post->ID, 'skills', false); ?>
	          <?php if($skills) : foreach($skills as $skill): ?>
	          	<p><?php print_r($skill); ?></p>
					  <?php endforeach; ?>
	          <?php endif; ?>

$postはpostオブジェクト、skillsはカスタムフィールド名、falseはシングルでない＝配列として値を取得
CSS でテーブルに行番号を振る

リスト要素に対して番号を振りたければ `list-style-type: decimal` を使えば良いんですが、テーブルだとそうもいかないです。しかし行番号を振るためだけに JavaScript は使いたくない。

そういうときは CSS Counters を使います。

``` html:html
<table>
  <thead>
    <tr>
      <th></th>
      <th>column1</th>
      <th>column2</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td></td>
      <td>foo</td>
      <td></td>
    </tr>
    <tr>
      <td></td>
      <td>bar</td>
      <td></td>
    </tr>
    <tr>
      <td></td>
      <td>baz</td>
      <td></td>
    </tr>
  </tbody>
</table>
```

``` css:css
table {
  counter-reset: rowCount;
}

table > tbody > tr {
  counter-increment: rowCount;
}

table > tbody > tr > td:first-child::before {
  content: counter(rowCount);
}
```

こう書くと、

![](https://qiita-image-store.s3.amazonaws.com/0/16369/9a26ef04-0c67-e92a-8045-33c7fbe72be9.png)

こうなります。

CSS Counters は CSS 2.1 の仕様[^mdn]のためほぼすべてのブラウザで動作する[^caniuse]ので、覚えておくと便利です。

[^mdn]: https://developer.mozilla.org/ja/docs/Web/Guide/CSS/Counters
[^caniuse]: http://caniuse.com/#feat=css-counters
[フロントエンド]olタグを使ってliに自動ナンバリングしてみた

今回、あるデザインにおいてリストに数字が1,2,3....とつくようにするものを作ることになった。
いろいろ試行錯誤したが、自分的にいいやり方を知ったので共有させて頂きたいと思います。

##やったこと
olタグで囲うと自動で1.,2.,3.,....と自動でつく(list-style-typeの指定でいろいろできる)のだが
.←が邪魔だったり、01,02,03とか1位、2位、3位とかしたかったので違う方法を考えていた。

調べていると自動ナンバリングできるというのを知り試してみたら自分のやりたいことができた。

とりあえずコードを貼っておこう。
![スクリーンショット 2017-02-21 20.19.17.png](https://qiita-image-store.s3.amazonaws.com/0/163415/62cc4441-6fd7-b52e-835a-91ecee37530b.png)

そんなに難しいこともせず簡単にできたのだが
まず、olにデフォルトの数字が出ないようにlist-style-type:none;で消しておく。
次にcounter-reset: 変数名 0;で要素の連番（カウンタ）の値をリセットする

liの方には
counter-increment: 変数名 1;でcontentプロパティで追加された連番の値を進める。
content: "0" counter(変数名);で先頭に0をそれに続いて、数字が増加していく。

以外と便利なものが多いと思った。
以上。