OmniAICreator/Qiita-1.07M huggingface dataset:
噂の9ドルコンピュータ、C.H.I.Pに関する覚書


なんでこんなググラビリティ低い名前にしたんや

内容的にはほとんど http://docs.getchip.com/chip.html に書いてあることです。

# USB OTGのシリアルコンソールからログイン

`/dev/tty.xxx`で認識されてるものとばかり思って「ないな〜」と小一時間悩んでたんだけど、`/dev/cu.xxx`で認識されてた。

```
sudo screen /dev/cu.usbmodem1421 115200
```

1日経ってから試してみたら、`/dev/tty.usbmodem1421`も存在してた・・・なんだったのだろう。

ちなみにscreenを抜けたあとに高確率でシェルの表示がぶっ壊れるんだけど、

```
reset
```

を実行すれば元通りになるということを知った。

http://www.commandlinefu.com/commands/view/32/salvage-a-borked-terminal



# WiFiの設定

nmcli（NetworkManagerのコマンドライン版）を使うっぽい。
日本国内で試す場合は電波暗室を御使用ください。

スキャン

```
nmcli device wifi list
```

接続

```
sudo nmcli device wifi connect 'SSID' password 'PASSWORD' ifname wlan0
```

状態を確認

```
nmcli deivce status
```

ちなみに、nmtuiというのが便利そうだなと思って起動してみたらterminal文字化けしてどうしようもない感じになってしまった。

# パッケージのアップデート

組み込みLinuxならopkgやろって思ってた時期もあったけどやっぱaptが便利だな

```
sudo apt-get update
sudo apt-get upgrade
```

# nodejsのインストール

apt-getでインストールできるバージョンが古すぎるので、ビルド済みバイナリを落として手動でいれる。
（apt-getではいる0.10.29だと後述のchip-gpioがビルドできない）
このへんどのSBC使ってもほんとうに一筋縄でいかないですね。

```bash
wget https://nodejs.org/dist/v4.2.4/node-v4.2.4-linux-armv7l.tar.gz
tar zxvf node-v4.2.4-linux-armv7l.tar.gz --strip-components=1 --exclude="*.md" --exclude="LICENSE" -C /usr
```

参考: http://qiita.com/ystg/items/5a9a3ad5dd9f7b270517


# nodejsからGPIOを使う

https://www.npmjs.com/package/chip-gpio


# CHIP SDK を使う

CHIP SDK = ファームウェア開発環境構築済みのVM で、Vagrantで起動できます。


# USB Ethernet を有効化する

https://bbs.nextthing.co/t/chip-otg-ethernet/1365

http://www.instructables.com/id/CHIP-USB-OTG-Ethernet-Gadget/?ALLSTEPS

ためしてみたけどまだうまくいってない。うーん・・・


# MicroUSBではなくピンヘッダから電源供給する

`CHG-IN`ピンを使えとのことです。

https://bbs.nextthing.co/t/connect-vin-to-5v/2338/2

電圧範囲は、コメントにもある通り[AXP209のデータシート](http://linux-sunxi.org/images/8/89/AXP209_Datasheet_v1.0en.pdf)を読んでみたところ、`5. Electrical Characteristics`に 3.8V ~ 6.3V とあるので、この範囲で使うのがよいのではないかと思います。
ちなみに5Vで動作しています。


# 回路図

オープンハードウェアなので回路図が公開されてます。
（部品として使うモジュールとかはオープンハードウェアじゃなくても回路図は公開されてることが多いけど）

https://github.com/NextThingCo/CHIP-Hardware/blob/master/CHIP%5Bv1_0%5D/CHIP_v1_0_SCHEMATIC_20151203.pdf


# その他

触ってる最中に得た知識とか

- USB EtherGadgetはプロトコルが複数ある
  - いちばん古いのがRNDISで、いまはNCMというのがCDCの下位に定義されていて世界標準になっているらしい
  - `make linux-menuconfig`でどっちも選択できるみたいだった
- しばらく組み込みLinux触ってない間にJFFS2がUBIにとってかわられたらしい
  - http://d.hatena.ne.jp/ayokoyama/20120607/p1
num-executors指定でのspark sql thriftserverの起動

```start-sparksql-thriftserver.sh
#!/bin/sh                                                                                                                                       export SPARK_HOME=/opt/spark2.0

$SPARK_HOME/sbin/start-thriftserver.sh \
  --hiveconf hive.server2.thrift.port=10001 \
  --hiveconf hive.server2.thrift.bind.host=なんかおまえのほすと \
  --master yarn \
  --num-executors=5 \
  --conf spark.ui.port=4049 &
```
Paizaで使える標準入力の取得

[Paiza](http://paiza.jp)ではDランク〜Sランクまでのプログラミング問題が解けます。対応言語もPHP、Javascript、Python、Swiftなど多いので自分の得意な言語で挑戦できます。私はPHPで問題を解いていますが、単一行や複数行で渡される標準入力を取得するコードを毎回書くのがめんどくさいのでコピペ用にメモしておきます。

# 標準入力が一行の場合

```php
<?php

// 標準入力からの入力値を変数に代入します
$single_line_input = fgets(STDIN);
// 取得した入力値を半角スペースで分解します
$array = explode(" ", $input_line);
// 単一行の入力の場合はこれだけで各入力値が配列の要素として使えます
```


Paizaでは自分の環境でテストを行うことが推奨されているようです。テスト時に`stdin.txt`というファイルから入力を得るとすると次のようになると思います。

```php
<?php

// ファイルパスの指定
$file = fopen(".../path/to/stdin.txt", "r");
// ファイル内容の読み込み
$single_line_input_line = fgets($file);
// 入力値の分解
$array = explode(" ", $input_line);
// ファイルパスを閉じる
fclose($file);
```

# 標準入力が複数行の場合

1行ずつ代入するっていうのがちょっとめんどくさいですね。

```php
<?php

// 標準入力を一行ずつ配列に代入します
while ($line = fgets(STDIN)) {
   $tmp[] = trim($line);
}

// 配列の各要素をさらに分解します
foreach ($tmp as $key => $value) {
  $array[] = explode(" ", $value);
}
```

自分の環境でテストする場合

```php
<?php

// ファイルパスの指定
$file = fopen(".../path/to/stdin.txt", "r");

// ファイルの内容を一行ずつ配列に代入します
if($file) {
  while ($line = fgets($file)) {
    $tmp[] = trim($line);
  }
}

// 配列の各要素をさらに分解します
foreach ($tmp as $key => $value) {
  $array[] = explode(" ", $value);
}

// ファイルパスを閉じる
fclose($file);
```
Landscapeリンク集


KPCB Internet Trends
http://www.kpcb.com/internet-trends

Scrum Ventures トレンドレポート
http://scrum.vc/ja/consulting-training/

LUMA Partners LUMAScape
http://www.lumapartners.com/resource-center/lumascapes-2/

Chiefmartec Marketing Technology Landscape 2016
http://cdn.chiefmartec.com/wp-content/uploads/2016/03/marketing_technology_landscape_2016_3000px.jpg

Startup management Blockchain Landscape
http://startupmanagement.org/2015/12/08/update-to-the-global-landscape-of-blockchain-companies-in-financial-services/

Firstmark Big Data Landscape
http://mattturck.com/wp-content/uploads/2016/03/Big-Data-Landscape-2016-v18-FINAL.png
http://mattturck.com/2016/02/01/big-data-landscape/

Mozio Online Travel Landscape 
https://www.tnooz.com/article/online-travel/
CloudTrailと連携させたElasticsearch Serviceをカスタマイズして使う

Amazon CloudTrailのログをElasticsearchに投入してKibanaで見やすくするソリューションはわりと知られているが、特に最近はCloudWatch Logsに「Streaming to Amazon Elasticsearch Service」機能があるので、ワンクリックでKibanaの可視化が出来たりする。具体的に言うと、Elasticsearchの新規インスタンス作成、CloudWatch LogsからElasticsearchへログを送るためのLambda、必要なIAM Roleの設定がさっくりできる。

参照：[【運用】CloudTrailで取得した監査ログをElasticSearch Serviceで活用する【簡単設定】 ｜ Developers.IO](http://dev.classmethod.jp/cloud/aws/cloudtrail-to-elasticsearch-service/)

ただこの機能で作ったElasticsearchの設定だと、自動作成である故に少々運用に辛いポイントがいくつかあったので、カスタマイズした点をまとめてみる。


not_analyzed設定
----

自動作成されたElasticsearchのmappingには、`not_analyzed`が一切設定されていない。なのでリージョン名すら「ap」「northeast」「1」が分かれてグラフ化されるという悲しいことになるので改善する。

CloudTrailのログだけあって`string`のフィールドはかなり多いので、まとめてdynamic_templatesを当ててしまうのが早かった。インデックスは日付毎に切られるので`"cwl-*"`でワイルドカード指定にする。

```json:mapping.json
{
    "template": "cwl-*",
    "mappings": {
        "_default_": {
            "dynamic_templates": [
                { "es": {
                      "match": "*",
                      "match_mapping_type": "string",
                      "mapping": {
                          "type": "string",
                          "index": "not_analyzed"
                      }
                }}
            ]
        }
    }
}
```

`curl`で設定。

```bash
$ curl -XPUT xxx.es.amazonaws.com/_template/mapping -d @mapping.json
```


type名の変更
----

`type`にはCloudWatch Logsのロググループ名が割り当てられるのだが、ロググループ名というとスラッシュを含める場合が少なくない（はず？）。Elasticsearchの`type`にスラッシュが含まれるというのがどうにも気持ち悪かったので、任意のものに変更する。

変更箇所としては、「Streaming to Elasticsearch Service」機能で作られたLambda Function内。`function transform`がElasticsearchへのRequest Bodyを構成しているので、ここの以下の箇所を変更する。

```js
        var action = { "index": {} };
        action.index._index = indexName;
        action.index._type = "logs";
        action.index._id = logEvent.id;
```

また`index`も同様にここで変えられる。デフォルトではログの日付毎に別の`index`が切られ、`cwl-YYYY.MM.DD`の形式で名前が充てられるが、例えば1つの`index`にまとめたいのであれば、`indexName`に固定値を指定することで実現できる。日付で`index`を分けておくと、古いログをローテートするような実装を行いたい場合、`index`ごとごっそり消せばよいので楽だったりするが、そのあたりは好みの問題かなと思う。

個人的な見解としては、CloudTrailのログは別で保存されており、Elasticsearchで永続的にログを保持する必要はなかった（直近1か月ぐらい取りあえずKibanaで見られればよい）ので、`index`はそのままで外からcronで削除のリクエストを定期的に発行している。ドキュメントの有効期限を設定する`ttl`の機能もあるようだが、Deprecatedとのことなので採用はしなかった。

参考：[TTL Documents, Shield and Found | Elastic](https://www.elastic.co/blog/ttl-documents-shield-and-found)


Cluster Healthの適正化
----

デフォルトで作成されたElasticsearch Serviceのインスタンスは、ダッシュボードで見たとき`Cluster Health`の`Status`が"Yellow"になってしまう。これはデフォルトのノード数が1であるため、同じくデフォルト設定の条件であるレプリカ数＝1を満たせないことによる。解消するにはノードを増やすかレプリカ数を0にするかだが、CloudTrailのログであれば耐障害性もそこまで必要ないので、後者を選択する。

```json:replica.json
{
    "template" : "*",
    "settings" : {
        "number_of_replicas" : 0
    }
}
```

先述の通り`index`が毎日増えていく設定となっているため、Index Templatesでデフォルトの設定としてしまう。

```bash
$ curl -XPUT xxx.es.amazonaws.com/_template/replica -d @replica.json
```
!attach.depth || !attach.depth->backBuffer エラー

# 概要
Unity5.4アップデート後、以下のエラーがでることがあります。

attach.color[0]->backBuffer == attach.depth->backBuffer 
!attach.color[0] || !attach.color[0]->backBuffer

# 解決法
メニュー > File > Build Settingsを選択
Player Settings を選択

Other Settings -> Rendering
Graphics Jobsにチェックを入れる

![Main.unity - inthesea-master - PC, Mac & Linux Standalone (Personal) <OpenGL 2.1 (deprecated)> 2016-08-05 17-24-14.png](https://qiita-image-store.s3.amazonaws.com/0/34936/6a5fde23-5611-c313-1bf5-6180147192c2.png)


# 参考リンク
https://issuetracker.unity3d.com/issues/shaderuniformarray-osx-weird-errors-appear-in-the-console-when-launching-scene-with-different-uniform-array-shaders
Pythonで画像処理

#PILの導入
PIL(Python Imaging Library)を使います

PILについてはこちら
http://www.lifewithpython.com/2013/09/pil.html

## ダウンロード
http://www.pythonware.com/products/pil/
公式サイトから自分のOSなどにあったものをダウンロードしてください

ダウンロードして、そのフォルダに移動した後に以下の手順でインストールします。

```cd Imaging-1.1.7
sudo python setup.py install
```

# 画像をマスクする
```python:mask.py
from PIL import Image, ImageOps
mask = Image.open("マスク画像のパス")
org = Image.open("元画像のパス")
sq = ImageOps.fit(sq, (400, 400), method = Image.LANCZOS)
sq.putalpha(mask.convert("L"))
sq.save("丸く切りぬいた画像の保存先のパス")
```

# （おまけ）QRコードを読み書き
http://nixeneko.hatenablog.com/entry/2016/01/25/023703
http://qiita.com/kiyota-yoji/items/7fe134a64177ed708fdd
【Sass】親セレクタを参照する&や+の使い方

# 親セレクタを参照する & や + のやつ

Sassを書く上でたまに忘れてしまってパニックになるので、メモ程度に。
cssにコンパイルされた後、どうなるのかも一緒に記載しておきます。



## セレクタの前に記述する

```ruby:Sass
.hoge {
  color: #000;

  &:hover {
    color: #fff;
  }

  &.fuga {
    color: #ccc;
  }
}
```


```ruby:css
.hoge {color: #000;}
.hoge:hover {color: #fff;}
.hoge.fuga {color: #ccc;}
```

## セレクタの後に記述する



```ruby:Sass
.hoge {
  width: 640px;

  .fuga & {
    width: 100%;
  }
}
```


```ruby:css
.hoge {width: 640px;}
.fuga .hoge {width: 100%;}
```

### 注意

3階層以上の場合は、& を使うと上の階層で指定した親要素すべてが対象になるということ。
3階層目で.fuga & とした場合 
".hoge　.hoge__hoge　.fuga　" や
".hoge　.fuga　.hoge__hoge" ではなく
".fuga　.hoge　.hoge__hoge" となる。

```ruby:Sass
.hoge {
  width: 640px;

  &__hoge {
    margin: 10px;

    .fuga & {
      margin: 0;
    }
  }
}
```


```ruby:css
.hoge {width: 640px;}
.hoge__hoge {margin: 10px;}
.fuga .hoge .hoge__hoge　{margin: 0;}
```


## セレクタの後に　+ &　を記述する

```ruby:Sass
.hoge {
  color: #000;

  .fuga + & {
    color: #ccc;
  }

  .fuga + & &__hoge {
    color: #ccc;
  }
}
```


```ruby:css
.hoge {color: #000;}
.fuga .hoge {color: #ccc;}
.fuga .hoge .hoge__hoge {color: #ccc;}
```
Macからリモートデスクトップで接続先のWindowsをシャットダウンする小技


# 背景
* ビルメンテナンス等で日曜日に停電があるとき、土曜日とか直前までRDPして、停電直前で接続先のPCをシャットダウンしたいものです。
* 会社のPCはWindowsで、持ち歩くノートがMacというケースは多々あるので、Macからリモートデスクトップで接続先のWindowsをシャットダウンする小技のメモを記載しときます。

# Windowsでいうところの 「Alt + F4」
* リモートデスクトップのデスクトップ上で「command + F4」をターンしてください。（Windowsでいうところの 「Alt + F4」です）
![skitch.1.png](https://qiita-image-store.s3.amazonaws.com/0/39596/99b6a212-065f-c601-5014-85eefc2f57f6.png "skitch.1.png")


* 一通りのシャットダウンメニューが選択できます。
![skitch.png](https://qiita-image-store.s3.amazonaws.com/0/39596/a0b3cf1a-aed1-e1a3-e729-36c3173c37e8.png "skitch.png")
[Javaの小枝] JavaのソースにHTMLとか埋めこむ時、here document したい

JavaのソースにHTMLとか埋めこむ時、here document したい！

…そう。みんな困っているのだが残念ながら良い解決法はない。JavaDoc と annotation の合わせ技でなんとかしている例もあるのだが、うっかりするとEclipseが JavaDoc 部分を勝手に整形しちゃったりして内容がいつのまにか変化してしまっている、なんて事故も発生する。

just idea なのだが、下記のようなコードを書いてこれからしばらく使ってみることにする。

```java:Sample.java
	public static String hereDoc(Function<String, String> trimmer, String eol, String... strs) {
		StringBuilder sb = new StringBuilder();
		for (String s : strs) {
			sb.append(trimmer == null ? s : trimmer.apply(s)); 
			sb.append(eol == null ? "" : eol);
		}
		return sb.toString();
	}

	public static void sample() {
		System.out.print("<?php\n\nclass MyClass {\npublic function test() {\n}\n}\n?>");
		// ↑このようなコードを

		// ↓このように書いてみる
		System.out.print(
			hereDoc(s->s.trim(), System.lineSeparator(),

				"    <?php                                 ",
				"                                          ",
				"        class MyClass {                   ",
				"            public function test() {      ",
				"            }                             ",
				"        }                                 "
			)
		);
	}

```

タブ文字使いたいときはどうするのが良いだろうか…
自分のIPアドレスを得る(PHP)

下記の PHP 版。

- [自分のIPアドレスを得る - Okiraku Programming](http://d.hatena.ne.jp/NeoCat/20070721/1184994948)
- [[Ruby] 自分のIPアドレスを知る。 - Qiita](http://qiita.com/saltheads/items/cc49fcf2af37cb277c4f)
- [[Haskell] 自分のIPアドレスを知る。 - Qiita](http://qiita.com/saltheads/items/1edc0445db1d582cdcad)

```php
<?php
/**
 * @return string|false
 */
function detectMyAddress()
{
    $socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
    if ($socket == false) {
        return false;
    }
    if (socket_connect($socket, '128.0.0.0', 7) == false) {
        return false;
    }
    if (socket_getsockname($socket, $addr) == false) {
        return false;
    }
    return $addr;
}
```
Entity Frameworkで配列型のカラムに追加、更新する（EF, C#, PostgreSQL）

PostgreSQLで型を配列にしたとき、Entity Frameworkで追加、更新するのにハマったのでメモ。

#成功
配列では宣言しない。
文字列型も数値型もstringで宣言する。

```csharp
[Column("data")]
public string Data { get; set; } // text[]

[Column("data2")]
public string Data2 { get; set; } // integer[]
```

```csharp
var t2 = dbContext.Test2s.Single(x => x.Id == 0);
t2.Data = "{\"a\",\"b\"}"; // text[]
t2.Data2 = "{0,1,2}";      // integer[]
dbContext.SaveChanges();
```

#失敗
Entityクラス側でも配列で宣言して、配列をgetsetするものだと思っていたが、それだとDBが更新されなかった。
エラーは出ない。
dbContext.SaveChanges();の戻り値は0なので成功している・・・？


```csharp
[Column("data")]
public string[] _Data;
public string[] Data {
	get {
        return _Data;
    }
    set {
    	_Data = value;
    }
}
```


```csharp
t2.Data = new string[] { "a", "b", "c" };
dbContext.SaveChanges(); // エラーは出ないがDBに反映されない・・・
```
Homebrew で pyenv を導入し Python のバージョンを管理するメモ


Homebrew で [pyenv](https://github.com/yyuu/pyenv) を導入し、作業環境の Python のバージョンを管理できるようにした際の作業メモです。

## 前提環境

- OS X El Capitan (10.11.5)
- Homebrew が導入済みであること
	- 導入済みでなければ [公式](http://brew.sh/index_ja.html) を参考にインストールしてください

## 手順

### ① pyenv のインストール

`$ brew install pyenv`

### ② 有効化

`$ eval "$(pyenv init -)"`

> もし次回以降、自動でやりたい場合は `~/.bash_profie` 等に次のように記載してください。

```sh:~/.bash_profile
eval "$(pyenv init -)"
```

### ③ Python のインストール

例としてバージョン `3.5.0` をインストールする場合は、

`$ pyenv install 3.5.0`

そして作業環境で利用するバージョンを `3.5.0` に切り替えます。

`$ pyenv global 3.5.0`

バージョンを確認してみます。

```
$ python --version

Python 3.5.0
```

以上
LaraDock起動用シェルスクリプト

ただコマンドを書き並べただけなのでこれをシェルスクリプトと呼ぶのは少々抵抗がありますが。

```sh
echo '; cd /your/laradock/dir/path'
cd /your/laradock/dir/path

echo '; docker-machine start'
docker-machine start

echo '; eval $(docker-machine env)'
eval $(docker-machine env)

echo '; docker-machine regenerate-certs'
echo 'y' | docker-machine regenerate-certs

echo '; eval $(docker-machine env)'
eval $(docker-machine env)

echo '; docker-machine ssh default "sudo mkdir -p /d"'
docker-machine ssh default 'sudo mkdir -p /d'

echo '; docker-machine ssh default "sudo mount -t vboxsf -o uid=0,gid=0 d /d"'
docker-machine ssh default 'sudo mount -t vboxsf -o uid=0,gid=0 d /d'

echo '; docker-compose down'
docker-compose down

echo '; docker-comose up -d nginx mysql'
docker-compose up -d nginx mysql
```

※ WindowsをホストOSとしてDドライブをまるっと/dにマウントするようになっています。

通常は `/usr/local/bin` あたりに保存すると良いかと思いますが、
筆者が利用しているGit Bashでは `/usr/local` が無いので、
`/usr/bin/docker-compose-up` に保存して使っています。
`docker-compose-up` コマンド一つでLaraDockが起動出来ます。

起動後は

```sh
docker exec -ti laradock_workspace_1 bash
```

でワークスペースにログインして作業。
Windows使用でttyがどうたらでログインできない場合は

```sh
docker-machine ssh
docker exec -ti laradock_workspace_1 bash
```

docker-machine内からいけばログインできます。

カレントディレクトリを決め打ちしてるのはイケてないところなので、
コマンドを打った際の現在のディレクトリを取得するか、
コマンドの引数でディレクトリの指定を出来るようにすると更に良さそう。

しかもeval $(docker-compose env)の影響がシェルスクリプト内に限定されるし、
もう一捻り二捻り三捻りくらい工夫する余地が大きく残ってそう。
共起性分析の可視化(ネットワークグラフ)

# **記事について**

共起性分析の際に、ネットワークグラフでの可視化をRで行ったので、手順を備忘録として残す。
集計のためのSQLはHiveクエリーで記している。

# **想定するデータ**

| user_id | demographics |
|:--------|:-------------|
| aaa     | 男性:20～30歳代:会社員:未婚:収入400～600万円 |
| bbb     | 女性:30～40際代:既婚:子供あり |
|||
|||
|||

というような直列のデモグラフィック属性値を各ユーザーが持っているデータ構造を想定。
※欠損値は単に連結されない

これを、以下のような形に展開する。
最終的にこの形になればどういう経緯でもOK。

| user_id | dmg |
|:--------|:----|
| aaa     | 男性 |
| aaa     | 20～30歳 |
| aaa     | 会社員 |
| aaa     | 未婚 |
| aaa     | 収入400～600万円 |
| bbb     | 女性 |
| bbb     | 30～40歳 |
| bbb     | 既婚 |
| bbb     | 子供あり |
|||
|||
|||

以下はHiveクエリーの例。
Rだとreshape2モジュールのmelt関数で同じようなことができるはず。

```sql
select
  user_id,
  dmg

from
  user_demographics_tbl

lateral view
  explode(split(demographics, ':')) dmgs as dmg
```

# **エッジサイズの集計**

共起パターンとその数を集計をする。

```sql
select
  a.dmg,
  b.dmg,
  count(1) edge

from
  parsed_dmg_tbl a

left outer join
  parsed_dmg_tbl b

on
  a.user_id = b.user_id

where
  a.dmg < b.dmg

group by
  a.dmg, b.dmg

order by
  edge desc
```

<code>where a.dmg < b.dmg</code> で組み合わせの重複を除外する。

# **ノードサイズの集計**

単純に各属性の出現回数をカウント。

```sql
select
  dmg,
  count(1) vertex

from
  parsed_dmg_tbl

group by
  demographics

order by
  vertex desc
```

# **ネットワークグラフの描画**

Rのigraphモジュールにエッジサイズとノードサイズの情報を渡す。
大きなコードじゃないので全体を載せるが、gistは[こちら(network_graph.r)](https://gist.github.com/peristrophe/9e1f944f36c8f8638d715cf0a018e3c2#file-network_graph-r)

```network_graph.r
require(igraph)

vs <- read.delim("D:/tmp/r/network_graph_vertex.tsv", sep="\t", header=F, row.names = 1)
es <- read.delim("D:/tmp/r/network_graph_edges.tsv", sep="\t", header=F)
vsize <- 10000
esize <- 10000

# ノードラベル
vn <- read.delim("D:/tmp/r/network_graph_labels.tsv", sep="\t", header=F, row.names = 1)

# 描画
ng <- graph.data.frame(es, directed = F)
tkplot(ng,
       edge.width=E(ng)$V3/esize,
       vertex.size=vs[V(ng)$name,]/vsize,
       vertex.label=vn[V(ng)$name,],
       vertex.color = "#AACCFF88",
       layout=layout.fruchterman.reingold
      )
```

![ng2.png](https://qiita-image-store.s3.amazonaws.com/0/134107/1ea37454-117f-22f7-fced-3106130ec049.png)

Layoutメニューから様々な形で自動配置できる。
Excelシートにあるそこそこ多めのデータに対してinsert文を生成する

あのときのExcel遺産シリーズです。Excelに15000行程ためてたデータをDBに放り込みたくてどうしようかなーと悩んでいて取った方法です。ググッてみるとクリップボードにコピーするところまでやっている方もいたのですが、そこまではいけませんでした。今回はこういう感じ↓でDBのテーブルと全く同じ定義をしたExcelシートにデータが入っているときに1行ずつinsert文を生成し、隣のセルに書き込むというのをします。

こういうシートが

|id|col1|col2|col3|insert文が入るセル|
|:-:|:-:|:-:|:-:|:-:|
|1|な|ん|か||
|2|デ|ー|タ||
|3|が|山|ほ||
|4|ど|入|っ||
|5|て|る|。||
|...|||||

こうなる

|id|col1|col2|col3|insert文が入るセル|
|:-:|:-:|:-:|:-:|:-:|
|1|な|ん|か|insert into tbl_name (col1, col2) ...|
|2|デ|ー|タ|insert into tbl_name (col1, col2) ...|
|3|が|山|ほ|insert into tbl_name (col1, col2) ...|
|4|ど|入|っ|insert into tbl_name (col1, col2) ...|
|5|て|る|。|insert into tbl_name (col1, col2) ...|
|...||||insert into tbl_name (col1, col2) ...|

# insert文を生成

```vbnet
Sub insert文を生成()
 
Dim i As Long
Dim LastRow As Long
Dim tbl_name As String
Dim insertstmt1 As String, insertstmt2 As String

'id列で最終行が何行目が取得します。
'途中で空白があることは考慮していません
LastRow = Range("a2").End(xlDown).Row

'例えばこういう形式のinsert文を生成したいとき
'INSERT INTO tbl_name (col1, col2, col3) VALUES (data1, data2, data3);
'(idはauto_incremntになっているとします)
tbl_name = "tbl_name"
insertstmt1 = "INSERT INTO " & tbl_name
insertstmt2 = "(col1, col2, col3, col4) VALUES ("

'最後の');'を忘れないようにしてください
For i = 2 To LastRow
Cells(i, 5) = insertstmt1 & insertstmt2 & _
                "'" & Cells(i, 2) & "'" & ", " & _
                "'" & Cells(i, 3) & "'" & ", " & _
                "'" & Cells(i, 4) & "'" & ");"
Next

End Sub
```

これだけです。

<!--

以下、いつ使ったか思い出せないけど使えそうな使えなさそうなのが一緒に入ってたので載せておきます。

空白セルに対して`null`を挿入したいとき

```vbnet
Sub Nullの挿入()
Dim i As Long
Dim LastRow As Long

LastRow = Range("a2").End(xlDown).Row

For i = 2 To LastRow
If Cells(i, 4) = "" Then
    Cells(i, 4) = "Null"
End If
Next
End Sub
```
半角空白を,区切りに置き換えるやつです。

```vbnet
Sub ,区切り()

Dim i As Long
Dim str As String
Dim LastRow As Long

LastRow = Range("a2").End(xlDown).Row

For i = 2 To 10000
str = Cells(i, 5).Text
Cells(i, 5) = Replace(Replace(str, " ", ", "), "　", ", ")
Next

End Sub
```
-->
rbenv,ruby-buildを使ってRails環境を構築するまで（Ubuntu）

しょっちゅうググり直してしまうので、自分用にまとめました。
rbenvは複数ユーザーで共有したいので、/usr/local/rbenv にインストールすることにします。

参考）
[CentOSでrbenvをシステムにインストールする](http://qiita.com/youcune/items/a5cc93313641b69b62f8)

## install necessary packages
```
$ sudo apt-get -y install libssl-dev zlib1g-dev libreadline-dev libmysqlclient-dev sqlite3 libsqlite3-dev g++ git curl
```

## install rbenv
```
$ cd /usr/local
$ sudo git clone git://github.com/sstephenson/rbenv.git rbenv
```

## make export path setting
--no-rehash をつけないとログインのたび rehash するので遅くなるそうです。

```bash:/etc/profile.d/rbenv.sh
export RBENV_ROOT="/usr/local/rbenv"
export PATH="${RBENV_ROOT}/bin:${PATH}"
eval "$(rbenv init --no-rehash -)"
```

## load setting
```
$ source /etc/profile.d/rbenv.sh
```

## confirm rbenv installed
```
$ type rbenv
```

## install ruby-build
```
$ sudo git clone git://github.com/sstephenson/ruby-build.git rbenv/plugins/ruby-build
```

## install Ruby
```
# rbenv install 2.3.1
# rbenv global 2.3.1
```

## install bundler
```
# gem install bundler --no-ri --no-rdoc
```

## install Rails
```
$ mkdir project
$ cd project
$ bundle init
```

```ruby:Gemfile
source "https://rubygems.org"

gem "rails"
```

システムのgemにインストールせずにvendor/bundle以下に配置する

```
$ bundle install --path vendor/bundle
$ bundle exec rails new .
```

## 補足
### bundle install で An error occurred while installing pg (0.17.1) というエラーが起きた時の対処
postgresqlとlibpgを入れることで解決できた

```
$ sudo apt-get install postgresql-9.3
$ sudo apt-get install libpq-dev
```
Windows7SP1のWindows Updateがまともに進まない事象の解消


# 事象

導入手順書を作成するためHyper-V上にWindows7SP1 64bitを新規にインストールしWindows Updateを行ったところ、CPU使用率が100%に張り付き応答しなくなりました。

## 環境

ホスト機の環境は以下の通りです。

* Core i5 6500
* RAM 32GB
* Windows10 Pro 64bit 1607

仮想機には仮想1コアとRAM8GB（動的）を割り振りました。

## 備考

Microsoftのナレッジベースを読む限り、Windows7及びWindows Server 2008 R2の両方で起こるようです。

# 対応

以下のサイトの情報を参考にしました。

[Windows 7 の WindowsUpdateの不具合回避法(進まない、終わらないなど) - Hone.のたま～に戯言](http://blog.goo.ne.jp/psyna_hone/e/cf4334674dcab6634eef72c59446ad9f#)

## 手順

1. Windows Updateエージェントを最新にする
2. Windows Update自動更新の無効化
3. 更新プログラムKB3050265の適用
4. 更新プログラムKB3138612の適用

### Windows Updateエージェントを最新にする

[Windows Update エージェントを最新バージョンに更新する方法](https://support.microsoft.com/ja-jp/kb/949104)

※私の環境では作業開始時点でver7.6になっていたため適用しませんでした

#### Windows Update エージェントのバージョン確認方法

%systemroot%\system32\Wuaueng.dllのプロパティ＞詳細 から確認します。

%systemroot%は通常C:\WINDOWS のはずです。

```
>echo %systemroot%
C:\WINDOWS
```

もし古いバージョンがインストールされている場合は上記ナレッジベースから対象のシステムに合致した更新プログラムを入手してインストールしてください。インストール後再起動が必要かもしれません。

### Windows Update自動更新の無効化

コントロールパネル>Windows Update>設定の変更

から「重要な更新プログラム」を「更新プログラムを確認しない」にします。

![自動更新の無効化](https://qiita-image-store.s3.amazonaws.com/0/21354/709a43b3-0724-21d6-c7df-fd74abc18c87.png)

設定後一回再起動したほうがよいと思います。

### 更新プログラムKB3050265の適用

[Windows Update Client for Windows 7: June 2015](https://support.microsoft.com/ja-jp/kb/3050265)

中ほどの「How to obtain this update」の章「Method 2: Microsoft Download Center」の項から対象のシステムに合致した更新プログラムを入手してインストールしてください。インストール完了後再起動が必要です。

### 更新プログラムKB3138612の適用

[Windows 7 および Windows Server 2008 R2 用 Windows Update クライアント: 2016 年 3 月](https://support.microsoft.com/ja-jp/kb/3138612)

中ほどの「この更新プログラムの入手方法」の章「方法 2: マイクロソフト ダウンロード センター」の項から対象のシステムに合致した更新プログラムを入手してインストールしてください。インストール完了後再起動が必要です。

***

以上の手順で、最初CPU100%張り付きで全く進捗が進まなかったWindows Updateが、20~80%の使用率で変動し無事に更新が完遂しました。（メインストリームサポートが終わっているのであまり意味がないですが、Windows Updateの自動更新を有効に戻すのを忘れずに）

今回は仕方なくWindows7環境を作る羽目になりましたがメインストリームサポートが1年半も前に終わっているOSなんてとっとと捨てるべきですね。

[Windows 7 メインストリーム サポート終了のお知らせ - Microsoft](https://www.microsoft.com/ja-jp/windows/lifecycle/eos/consumer/)
GalaxyProject の Galaxy の docker_volumes の指定の仕方について

# 概要

* [galaxy/job_conf.xml.sample_advanced at dev · galaxyproject/galaxy](https://github.com/galaxyproject/galaxy/blob/dev/config/job_conf.xml.sample_advanced)

docker_volumesの例がでていたが、以下のように、絶対パスが１つの例しかなかった。
この場合は、***-v /mnt/galaxyData/libraries:/mnt/galaxyData/libraries:ro*** となるようだ

```
<param id="docker_volumes">$defaults,/mnt/galaxyData/libraries:ro,/mnt/galaxyData/indices:ro</param>
```

次のように、ホスト側と、コンテナ内とで違うパスを指定できるのか調べてみた。

```
/home/hogehoge/dummy:/dummy:ro
```


# 結論

可能

```
            <param id="docker_volumes">$defaults,/home/hogehoge/dummy:/dummy:ro</param>
```

## SGE と docker を利用する、サンプルコンフィグ

```
<?xml version="1.0"?>
<job_conf>
    <plugins workers="8">
        <plugin id="sge" type="runner" load="galaxy.jobs.runners.drmaa:DRMAAJobRunner">
            <param id="drmaa_library_path">/usr/lib/gridengine-drmaa/lib/libdrmaa.so.1.0</param>
        </plugin>
    </plugins>
    <handlers>
        <handler id="main"/>
    </handlers>
    <destinations default="cluster">
        <destination id="cluster" runner="sge">
            <param id="embed_metadata_in_job">False</param>
            <param id="docker_enabled">true</param>
            <param id="docker_sudo">false</param>
            <param id="docker_volumes">$defaults,/home/hogehoge/dummy:/dummy:ro</param>
        </destination>
    </destinations>
    <limits>
        <limit type="registered_user_concurrent_jobs">1</limit>
        <limit type="anonymous_user_concurrent_jobs">1</limit>
        <limit type="destination_user_concurrent_jobs">1</limit>
        <limit type="destination_total_concurrent_jobs">1</limit>
        <limit type="unregistered_user_concurrent_jobs">1</limit>
    </limits>
</job_conf>
```
ArchLinuxを１コマンドでインストールする

よく仮想環境にArchLinuxをインストールするのだが、コマンドを毎回打つのが流石に面倒になってきたので、シェルスクリプトにした。ただコマンドが並んでるだけ、オプションを取らないのでパーティショニングは基本以外ルート、余分なものはvimとopenssh、base-develも無し、UEFI専用、/dev/sdaへのインストール専用。

## 実行方法

VMWare Playerの場合は、vmx に下記を追記
GUI から選択できる場合はEFIを選択

```
firmware = "efi" 
```

インストールディスクから起動したら、下記のコマンドを実行、エラーが無ければ完了

```bash
curl -L 'https://goo.gl/LkGcyO' | bash
```

VirtualBox の場合は、UEFIの扱いに問題があるので、下記を実行

```bash
curl -L 'https://goo.gl/f2X3Ba' | bash
```

## 参考

http://opamp.hatenablog.jp/entry/2013/10/30/233548
vimで現在開いているファイルのコピー,リネーム,削除をする

vim上でのリネーム方法が思った以上にシンプルなコマンドだったのでメモ
ついでにコピーと削除の方法も記載

# リネーム
```vim
:f [変更後ファイル名]|call delete(expand('#'))
```
実行後、「:w」して保存しておかないとファイルが消えるので注意

# コピー
```vim
:w [コピーファイル名]または :f [コピーファイル名]
```
前者がコピー元、後者がコピー先のファイルを実行後に表示

# 削除
```vim
:call delete(expand('%'))
```

# あわせて知っておきたい
ファイルをコピー,リネームする場合は現在開いているファイルのパス情報を利用することが多いのでそれの取得方法をメモ

`/home/hoge/workspace`で`tmp.txt`を開いている状態とする

|記号   |意味                 |例|
|:-----|:------------------ |:--|
|%     |カレントファイル       |`./tmp.txt`|
|%:p   |フルパス             |`/home/hoge/workspace/tmp.txt`|
|%:h   |カレントディレクトリ   |`./`|
|%:t   |ファイル名           |`tmp.txt`|
|%:r   |拡張子除去           |`./tmp`|
|%:e   |拡張子のみ           |`txt`|
p,h,t,r,eは変換子で組み合わせ可
※`%:p:h -> /home/hoge/workspace`

###例)バックアップファイルを作成する
```vim
:w %.bk
```

# 参考サイト
- [Hack #17:Vimを終了することなく編集中ファイルのファイル名を変更する](http://vim-jp.org/vim-users-jp/2009/05/27/Hack-17.html)
- [eval-Vim日本語ドキュメント](http://vim-jp.org/vimdoc-ja/eval.html#expand())
EC2にsftpで接続するユーザーを作成する

<a id="makekey"/>
# 鍵の作成は別稿

http://qiita.com/dahugani/items/e1fc5c212bf6a7365f8f#2-2
だいたいこんな感じだけど、あとでちゃんと書く。

鍵を別に作成する前提だと、ひとつの鍵で複数のサーバーにログインできる。その代わりすべてのサーバーで以下の手順が必要。

# ユーザーを作成する

```
sudo useradd sftpuser
```

# sshでログインできるようにする（鍵認証）
## authorized_keysファイルを準備
ホームディレクトリ直下に```.ssh```ディレクトリを作成して、```authorized_keys```という名称のファイルを配置する。[^1]


```
sudo su -
cd /home/sftpuser/
ls -la
mkdir .ssh
cd .ssh
vi authorized_keys
```
ここで鍵のテキストを貼り付け＆保存。[（鍵の作り方↑）](#makekey)
## パーミッション設定
以降は権限設定＆オーナー変更（ダサい）

```
chmod 600 authorized_keys
chown sftpuser:sftpuser authorized_keys
cd ..
chmod 700 .ssh
chown sftpuser:sftpuser .ssh
exit
```

## 接続可能か確認（自PC→サーバー）
```
ssh -i hoge_rsa sftpuser@hostname
```
rsaファイルは[ここ(↑)](#makekey)で作成したもの。

# sshでログインできないようにするw

sftpだけ使えればいい、sshは使わせたくない、という場合は以下を設定する。

## ssh設定ファイルの変更
```
sudo vi /etc/ssh/sshd_config
```

設定ファイルの一番下あたりに次の行を追加。
```/Match```とかで検索するのがいいかも。

```
Match User sftpuser
    ForceCommand /usr/libexec/openssh/sftp-server
```
<a id="authorized_keys_multi" />
複数ユーザーを指定したい場合はカンマ区切りでOK。

```
Match User sftpuser,otheruser
    ForceCommand /usr/libexec/openssh/sftp-server
```
## sshdを再起動
```
sudo /etc/init.d/sshd restart
```

# 今後のTODO
- [x] ~~authorized_keysって複数鍵あつかえんの？~~<br>
→~~```/etc/ssh/sshd_config```の```AuthorizedKeysFile```を複数設定？~~<br>
→そもそも考え方が間違ってたw sftpユーザ追加したのでauthorized_keysはユーザごとにユニーク。その代わり[この設定](#authorized_keys_multi)が必要。
- [ ] 作成したユーザーにはホームディレクトリ以下しか触らせたくない。
- [ ] ホームディレクトリではなく複数のユーザーで一つのディレクトを見るには？→ln使えばいいだけ？

-----
[^1]: authorized_keysで認証できるのは、AMILinuxの初期設定だかららしい。
Entity Frameworkで主キーがintegerのカラムにinsertする

Entity Frameworkを使ってC#でPostgresqlを操作する。
主キーがintegerのカラムにinsertしようとしたがエラーが出てはまったのでメモ。

#エラー内容
 Npgsql.PostgresException: 23502: 列"id"内のNULL値はNOT NULL制約違反です



#ソースコード
```csharp
//[Key] //これだけだとエラーが出る
[Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
[Column("id")]
public int Id { get; set; }
```
URLに日本語を使うときに気をつけること

ドメインには日本語が使えるとちょっと前から聞くようになってきた。
ファイル名なども、推奨しないことも多いけど、大抵動くような気がする。
フレームワークなどによって、URIがそのままパラメーターになることもよく見かける。

でも、注意しなければいけないことは、マルチバイト文字列はときに[パーセントエンコーディング]されるということだ。
Firefoxなんかは日本語を含むURLをコピペしたときに[パーセントエンコーディング]されて難儀する。

ただのアドレスならブラウザが味良うしてくれるのか、問題になることは少ない。
しかし、エンコードが起こるという時に気をつけないといけないことは、エンコードが多重に起きないかということだ。
とくにエンコード後の`%`がエンコード対象(`%25`)になるのがミソ。

つまり

![p1.png](https://qiita-image-store.s3.amazonaws.com/0/62354/67eaa6f3-1366-4312-bf18-070f17d322e4.png)

![p2.png](https://qiita-image-store.s3.amazonaws.com/0/62354/86688aba-4f47-e15f-7e82-fd3c358564f4.png)

![p3.png](https://qiita-image-store.s3.amazonaws.com/0/62354/70cdd9de-b506-4d1f-9177-77d0a07d15fe.png)

# エンコード デコード

エンコード
ポエム → `%E3%83%9D%E3%82%A8%E3%83%A0`
再エンコード
`%E3%83%9D%E3%82%A8%E3%83%A0` → `%25E3%2583%259D%25E3%2582%25A8%25E3%2583%25A0`
デコード
`%25e3%2583%259d%25e3%2582%25a8%25e3%2583%25a0` → `%e3%83%9d%e3%82%a8%e3%83%a0`
再デコード
`%e3%83%9d%e3%82%a8%e3%83%a0` → ポエム

***

なにが原因かはわかりませんが、気をつけようと思った(小並感

# 参考

* [URL の日本語表記について]
* [URLエンコード・デコード｜日本語URLをサクッと変換 | すぐに使える便利なWEBツール | Tech-Unlimited]
* [パーセントエンコーディング - Wikipedia]

[URLエンコード・デコード｜日本語URLをサクッと変換 | すぐに使える便利なWEBツール | Tech-Unlimited]:http://tech-unlimited.com/urlencode.html
[パーセントエンコーディング - Wikipedia]:https://ja.wikipedia.org/wiki/%E3%83%91%E3%83%BC%E3%82%BB%E3%83%B3%E3%83%88%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0
[パーセントエンコーディング]:https://ja.wikipedia.org/wiki/%E3%83%91%E3%83%BC%E3%82%BB%E3%83%B3%E3%83%88%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0
[URL の日本語表記について]:http://ar.aichi-u.ac.jp/iri/
Windowsノートパソコンの画面切替方法（プロジェクター投影など）

#基本はこれでOK（Window 7 / 8 / 8.1 / 10）

`Windows` キー + `P`

#メーカー別ならこれ

|メーカー|ショートカット|
|:--|:--|
|Panasonic|`Fn`キー + `F3` キー|
|FUJITSU|`Fn` キー + `F10` キー|
|NEC|`Fn` キー + `F3` キー|
|DELL|`Fn` キー + `F8` キー|

メーカー別は[ここ](http://faq.ricoh.jp/app/answers/detail/a_id/9533/~/rgb-%E3%82%B1%E3%83%BC%E3%83%96%E3%83%AB%E3%81%A7%E6%8E%A5%E7%B6%9A%E3%81%97%E3%81%9F%E3%83%8E%E3%83%BC%E3%83%88%E3%83%91%E3%82%BD%E3%82%B3%E3%83%B3%E3%81%AE%E6%98%A0%E5%83%8F%E3%81%8C%E6%8A%95%E5%BD%B1%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E5%A0%B4%E5%90%88%E3%81%AE%E5%AF%BE%E5%87%A6%E6%96%B9%E6%B3%95)に詳しく記載されてる。
オーバーライドとオーバーロード間違えないために

オーバーライドとオーバーロードは両方ともオーバーが付いているので間違いやすいワードかと思います。
間違えない覚え方を考えてみました。

##覚え方

###オーバーライド(override)
> オーバーライドとは、スーパクラスから継承されたサブクラスにおいて、メンバ関数を独自の機能で上書きすることである。 オーバーライドは、オブジェクト指向における多態性（多様性、ポリモーフィズム）の例である。 なお、オーバーライドを可能にするには、引数の型、および、引数の数が同じでなければならない。
http://www.weblio.jp/content/オーバーライド

オーバー(上に)　ライド(乗る=上書きする)
=>スーパークラスのメソッドを上書きする
と覚えるといいかも
C#でオーバーライドを使うときはこんな感じで書きます。

```lang:C#でのオーバーライド

public class Test
{
	public virtual void Method1 ()
	{
		Debug.Log ("111");
	}
}

public class Test2 : Test
{
	public override void Method1 ()
	{
		base.Method1 ();
		Debug.Log ("222");

	}
}
```

###オーバーロード

> オーバーロードとは、「引数や戻り値が異なるが名称が同一のメソッドを複数定義する」というオブジェクト指向プログラミングのテクニックである。
http://www.weblio.jp/content/Overload

オーバー(上に) ロード(読み込む)
=>メソッドを複数読み込む(上書きするわけじゃないから似たようなメソッドが沢山ある状態)
と覚えるといいかも

```
	public virtual void Method1 ()
	{
		Debug.Log ("111");
	}

	public void Method1 (int a)
	{
		Debug.Log ("a:" + a);
	}
```
ImageMagickでfailed: {:status_code=>1, :output=>"identify.im6: not authorizedのエラーの対応



ImageMagickの脆弱性「ImageTragick」に対応するためにpolicy.xmlを下記を追加します。

```
<policy domain="coder" rights="none" pattern="EPHEMERAL" />
<policy domain="coder" rights="none" pattern="URL" />
<policy domain="coder" rights="none" pattern="HTTPS" />
<policy domain="coder" rights="none" pattern="MVG" />
<policy domain="coder" rights="none" pattern="MSL" />
<policy domain="coder" rights="none" pattern="TEXT" />
<policy domain="coder" rights="none" pattern="SHOW" />
<policy domain="coder" rights="none" pattern="WIN" />
<policy domain="coder" rights="none" pattern="PLT" />

```

参考：http://qiita.com/nt-uni/items/bb4cc3064a3af857a63e

すると下記のようなエラーが発生しました。

```
MiniMagick::Error (Command ("identify -quiet -ping -format %wn <画像URL>") failed: {:status_code=>1, :output=>"identify.im6: not authorized `<画像URL>' @ error/constitute.c/ReadImage/454.\n"}):
```

処理の流れとして

1. Aサーバで画像加工
2. BサーバにAサーバで加工した画像を送る
3. AサーバからBサーバに送った画像をチェック
という流れで、画像をチェックした時にエラーが発生しました。

どうやら権限設定に問題がありそう。

画像チェック時に画像URLをhttpsでアクセスしていたので、pattern=HTTPSのrightsの属性値を変更しました。
画像の存在チェックをするだけで読み取りをすればよいだけなので **read権限** を追加。

```
<policy domain="coder" rights="read" pattern="HTTPS" />
```

無事うまく行きました。
基底クラスから、派生クラスにある（基底クラスになくても可）メソッドを呼びだす

#概要
基底クラス（スーパークラス）から、派生クラス（サブクラス）に任意の名前のメソッドが使えたらそれを呼び出すコードです。本来は基底クラスのほうにメソッドを用意しておいて、派生クラスでオーバーライドすべきですが...
ミソは、基底クラスのthisは、（派生されていたら）派生クラスのオブジェクトを示す※ことです。常識かもしれませんが...
#コード１

```csharp
var m = this.GetType().GetMethod("MethodName");
if (m != null)
  m.Invoke(this, new object[] { /* パラメータが必要であればここに */ });
```

##ミソ
※次のようなコードで、MyClass のインスタンスからGetClassNameメソッドを呼び出すと、MyClass が返されます。

```csharp
public class BaseClass
{
/// ...
  public string GetClassName()
  {
    return this.GetType().Name;
  }
/// ...
}

public class MyClass : BaseClass
{
/// ...
}

//
//var obj = new MyClass();
//var ret = obj.GetClassName();
//
//ret ==> "MyClass"
//
```

#コード２

dynamic型が利用できれば、こちらにキャストして呼び出します。そのメソッドが確実に存在する場合には、こちらのほうがずっとシンプルに書けます（yubaさん有難う御座います）

```csharp
((dynamic)this).MethodName( /* パラメータが必要であればここに */ );
```
よく使う日付フォーマット Ruby on Rails

# 日付フォーマット

参考：http://railsdoc.com/references/strftime

1. **strftimeで成形する**

```
Date.current.strftime('%Y/%m/%d')
```
みたいな感じで使う。
ただこれは、瞬間的に使うのはいいけど同じフォーマットパターンを何箇所も使うときに、strftimeで書くのは長ったらしくなるしナンセンスかなぁ。

2. **localesのymlで成形する**

```config/locales/ja.yml
ja:
  date:
    formats:
      default: ! '%Y/%m/%d'
      long: ! '%Y年%m月%d日(%a)'
      short: ! '%m/%d'
```
てな感じで、locals/ja.ymlとかにフォーマットパターンを書こうということです。

```haml
%p= l(hoge.created_at, format: :long)
```
こんな感じがviewですかね。
l(エル)で括る必要なことだけ注意(よく忘れるのは、俺だなぁ)

# おすすめフォーマット

10の位のところに0を埋めるパターン。

```
long: ! '%Y/%m/%d'
 => 2016/08/04
```
```
short: ! '%m/%d'
 => 08/04
```

10の位のところが0なら割愛してくれるパターン。

```
long: ! '%Y年%-m月%-d日(%a)'
 => 2016年8月4日(水)
```
```
middle: ! '%-m月%-d日(%a)'
 => 8月4日(水)
```
```
short2: ! '%-m/%-d'
 => 8/4
```

日本語＆viewで使う場合のほとんどは、「10の位のところが0なら割愛してくれるパターン」の方だと思うのでメモっといた。
画像圧縮で便利なコマンド

# コマンドで行う理由
いちいち、画像フォルダを開いて、アプリに引っ張って…っていう処理が面倒だったため、
コマンドでいっきに圧縮する方法に変更。

ファイル名を*.jpg　とかにすればいっきに対応画像を圧縮できるし。



# jpg
```
//　インストール
brew install jpegoptim

//圧縮コマンド
jpegoptim [options] [ファイル名]

// メタ情報を削除しつつ、品質90%で圧縮する
jpegoptim --strip-all --max=90 *.jpg

// メタ情報だけ削除
jpegoptim --strip-all *.jpg

```
参考
http://www.yoheim.net/blog.php?q=20130802
こっちのコマンドも後々使えるようになってきそう（現状圧縮時間にとても時間がかかる）
Google製の圧縮　Guetzli
http://qiita.com/yohhoy/items/406af27d4415c7bb6346

# png

```
// インストール
brew install pngquant
// 256色に減らして、上書き
pngquant --ext .png --force 256 *.png

// option
//処理スピード
--speed 1 hoge.png
//クオリティー　これよりは色制限した方が良いかも
--quality 80-100 hoge.png

```

参考
http://nukesaq88.hatenablog.com/entry/2013/04/16/194251
DataBindingでTextViewに入力必須マークを付与する


# やりたいこと
こんな感じで、ラベルの横に入力必須の `*` マークをつけたい場合、要素がたくさんあると地味にめんどくさいです。

![Screenshot_2016-08-02-16-18-19_jpg__1080×1920_.png](https://qiita-image-store.s3.amazonaws.com/0/15267/363eeb09-a626-666b-641e-94aa43389175.png "Screenshot_2016-08-02-16-18-19_jpg__1080×1920_.png")


# BindingAdapterを使う
BindingAdapterを使えばxmlのattributesで書けます。
DataBindingはkotlinの拡張関数のようなもので、既存のViewに動きを付与できます。

適当なクラスに下記のようなstaticメソッドを書いておきます。自分は `DataBindingAttributeUtil`を作ってそこに置きました。

```java
@BindingAdapter("requiredMarkVisible")
public static void requiredMarkVisible(TextView textView, boolean enable) {
    String text = textView.getText().toString();
    String requiredMark = " " + textView.getContext().getString(R.string.required_mark);

    if (enable) {
        textView.setText(Html.fromHtml(text + "<font color=\"#e86242\">" + requiredMark + "</font>"));
    } else {
        String defaultText = text.replace(requiredMark, "");
        textView.setText(defaultText);
    }
}
```

xmlではでこんな感じで書けます。 `@{true}`じゃなくて`true`で書きたいですが、何かいい方法があるんでしょうか。あれば知りたいです。

```xml
<TextView
    ...
    android:text="@string/name"
    app:requiredMarkVisible="@{true}"/>
```

# 補足
ちなみに、なぜ `false` の時にわざわざ `text.replace(requiredMark, "")` としているかというと、状態によって必須かどうかが動的に変わるケースがあるからです。
例えば以下のようにViewModelの状態が変わったら`requiredMarkVisible`も変更してほしいみたいな時のためです。

```xml
<TextView
    ...
    android:text="@string/name"
    app:requiredMarkVisible="@{viewModel.isNameRequired}"/>
```

# 所感
もしかしたらstringの`%1$s`とかをxml上でセットできるような、汎用的なBindingAdapterを作った方がいいのかもしれないです。そのうち試してみます。

以上です。
Rails4 orderの罠

Rails4からOrderにハッシュ渡せて快適！という記事はいっぱいありますが、複数指定する場合、

`User.order(:name, created_at: :desc)`
> SELECT "users".* FROM "users"  ORDER BY "users"."name" ASC, "users"."created_at" DESC

なら問題ないのですが（大抵の記事はこっちしか書いてない）、逆にすると

`User.order(created_at: :desc, :name)`


> syntax error, unexpected ')', expecting =>

あれ？

`User.order(created_at: :desc, name: :asc)`

> SELECT "users".* FROM "users"  ORDER BY "users"."created_at" DESC, "users"."name" ASC

こうしないとダメみたい
ダイナミックDNSを登録してRaspberry Piを自宅の外から繋ぐ


家に帰らないとラズパイと戯れることができないので家の外からでもアクセスできるようにダイナミックDNSを登録してみた時のメモ書き

# ポートマッピングの設定
ルーターによって設定方法が違うので割愛

# ダイナミックDNSサービスに登録
無料のダイナミックDNSサービスは色々あるけど会社の先輩に教えてもらった[No-IP](https://my.noip.com/)というサービスを試してみることに
英語だけど直感的に登録できるので説明は割愛(おい

# ddclientをインストール
[DiCE for Linux](http://www.hi-ho.ne.jp/yoshihiro_e/dice/linux.html)は古すぎるのかラズパイがバイナリを読んでくれなかった
その代わりddclientというモジュールが使えるそうなので、[ここ](http://denshikousaku.net/raspberry-pi-domain-and-dynamic-dns)を参考にインストール

参考サイトによるとMyDNSはddclientが使えないらしいけど、No-IP使っているのでddclientが使えるか不明。ということで一旦様子見( 'ω')

# メモ
- auひかりはグローバルIPのリースタイミングが1日間隔になっているそうで、環境によっては事実上の固定IPになる場合もあるらしい

*** 

10/7 追記

# DUCをインストール

しばらくddclientの様子見てみたけどどうも動いてないようなのでNo-IP公式から用意されているDynamic Update Client(DUC)を試してみる。

1. 適当なディレクトリにパッケージをダウンロード

	```
	wget https://www.noip.com/client/linux/noip-duc-linux.tar.gz
	```

2. パッケージを解凍

	```
	tar xf noip-duc-linux.tar.gz
	```

3. 解凍してできたディレクトリに移動してインストール開始

	```
	cd noip-2.1.9-1/
	sudo make install
	```

4. ログイン設定

	```
	pi@raspberrypi:~/ddns_client/noip-2.1.9-1$ sudo make install
	if [ ! -d /usr/local/bin ]; then mkdir -p /usr/local/bin;fi
	if [ ! -d /usr/local/etc ]; then mkdir -p /usr/local/etc;fi
	cp noip2 /usr/local/bin/noip2
	/usr/local/bin/noip2 -C -c /tmp/no-ip2.conf

	Auto configuration for Linux client of no-ip.com.

	Please enter the login/email string for no-ip.com  (ログインIDを入力)
	Please enter the password for user 'ログインID'  (パスワードを入力)
	```

5. その他の設定
	ここはなんとなく訳してるのであやふやです(

	```
	Only one host [(登録してるホスト)] is registered to this account.
	It will be used.
	Please enter an update interval:[30]  (更新間隔を設定？)
	Do you wish to run something at successful update?[N] (y/N)  (更新後に何かスクリプトを走らせるならy)
	Please enter the script/program name  (更新後に走らせたいスクリプトのパスを入れるっぽい？)
	```

# さて
これでちゃんと動いてくれるといいけど。。。
memo

どうする？ SQL Server のクエリ パフォーマンスが低下した！
https://blogs.msdn.microsoft.com/jpsql/2013/09/03/sql-server-5/

実行プランを読む – 活用編 (その 1) – クエリチューニング
https://blogs.msdn.microsoft.com/jpsql/2011/11/14/1-2/
brew upgrade で Error: Calling Formula.md5 is disabled! 出た時の対処


# なにこれ
ある日 ```brew upgrade``` したらこんなのが出た。

```
$ brew upgrade
Error: Calling Formula.md5 is disabled!
Use Formula.sha256 instead.
/Users/200118/Library/Caches/Homebrew/Formula/sshpass.rb:6:in `<class:Sshpass>'
Please report this bug:
    https://git.io/brew-troubleshooting
/usr/local/Library/Homebrew/utils.rb:153:in `odeprecated'
/usr/local/Library/Homebrew/utils.rb:161:in `odisabled'
/usr/local/Library/Homebrew/compat/md5.rb:3:in `md5'
/Users/200118/Library/Caches/Homebrew/Formula/sshpass.rb:6:in `<class:Sshpass>'
/Users/200118/Library/Caches/Homebrew/Formula/sshpass.rb:3:in `load_formula'
/usr/local/Library/Homebrew/formulary.rb:25:in `module_eval'
/usr/local/Library/Homebrew/formulary.rb:25:in `load_formula'
/usr/local/Library/Homebrew/formulary.rb:42:in `load_formula_from_path'
/usr/local/Library/Homebrew/formulary.rb:91:in `load_file'
/usr/local/Library/Homebrew/formulary.rb:82:in `klass'
/usr/local/Library/Homebrew/formulary.rb:78:in `get_formula'
/usr/local/Library/Homebrew/formulary.rb:215:in `factory'
/usr/local/Library/Homebrew/formulary.rb:239:in `from_keg'
/usr/local/Library/Homebrew/formulary.rb:225:in `from_rack'
/usr/local/Library/Homebrew/formula.rb:1150:in `block in installed'
/usr/local/Library/Homebrew/formula.rb:1148:in `map'
/usr/local/Library/Homebrew/formula.rb:1148:in `installed'
/usr/local/Library/Homebrew/cmd/upgrade.rb:22:in `upgrade'
/usr/local/Library/Homebrew/brew.rb:87:in `<main>'
```

ちな、```brew doctor``` でも同じところで Error る。

# 対処
issue 上がってました。
https://github.com/Homebrew/brew/issues/614

```
We no longer provide a formula for sshpass so you should probably brew uninstall --force sshpass.
```

押忍。
ということで解決。
FullCalendarの日・週単位表示で深夜帯の表示

カレンダー機能を提供してくれるjQueryプラグインFullClendar(Ver2.7.3)で日単位表示（agendaDate）で深夜帯の予定を表示しようとしたところ、縦の時間軸はきちんと表示され、同日の午前０時以前から始まる予定は表示されるものの、午前０時を超えて始まる予定が表示されませんでした。
調べてみると、StackOverflowに

http://stackoverflow.com/questions/36342790/fullcalendar-with-maxtime-set-24-items-past-midnight-will-not-render

の記事があり、FullCalendarのバグとのこと。

さっそく元々あった答えのように、computeSegVerticalsを

```
        seg.top = this.computeDateTop(seg.start, this.colData[seg.col].day);
        seg.bottom = this.computeDateTop(seg.end, this.colData[seg.col].day);
```
と修正して実行みましたが、colDataが見つからないとエラーになってしまいます。

たぶん、バージョンが新しくなったため表現が変わったためと思い、コードに目を通して、

```
computeSegVerticals: function(segs) {
    var i, seg;
    for (i = 0; i < segs.length; i++) {
        seg = segs[i];
        var start = this.dayDates[seg.dayIndex];
        seg.top = this.computeDateTop(seg.start, start);
        seg.bottom = this.computeDateTop(seg.end, start);
    }
}
```
と修正。
これで、エラー無く午前０時を超えて始まる予定も表示できるようになりました。週単位表示(agendaWeek)でも表示できました。StackOverflowにもお返しの投稿をしておきました。

まだ確認していませんが最新の2.9.0でもcolDataは存在せずdayDatesが存在するという同様の状況なので、上記の措置で表示できるようになるのではないかと思います。
Laravel の publicフォルダの階層を移動させたい


某レンタルサーバのサブディレクトリ配下に、Laravel 5.1 をインストールする必要がありました。

普通に composer等で Laravel をインストールすると、フォルダ構造は

```
/laravel        # laravel本体
/laravel/public # ドキュメントルート
```

みたいな感じで、laravel本体の下の public フォルダが公開領域になるのですが、これだとレンタルサーバのサブディレクトリ配下にインストールするには都合がわるい。

たとえばこんな感じに public フォルダの場所を変更し、laravel本体と公開領域とは別階層に分けたい。

```
/laravel        # laravel本体
/www/subfolder  # ドキュメントルートのサブフォルダ
```

そのために作業したことまとめです。

## とりあえず public を移動させる

`/laravel/public` フォルダを `/www/subfolder` などに移動させます。

## index.php を修正

移動させた `/www/subfolder/index.php` 内を、 2ヶ所書き換えます。

*/www/subfolder/index.php*

```
// 変更前
require __DIR__.'/../bootstrap/autoload.php';
$app = require_once __DIR__.'/../bootstrap/app.php';
```

```
// 変更後
require __DIR__.'/../../laravel/bootstrap/autoload.php';
$app = require_once __DIR__.'/../../laravel/bootstrap/app.php';
```

require のパスの修正をしているだけです。これで、ひとまず動作するようになります。

## php artisan serve が動くようにする

ただ、まだこの状態では `php artisan serve` コマンドが以下のようなエラーになります。

```
$ php artisan serve

  [ErrorException]
  chdir(): No such file or directory (errno 2)
```

なので `php artisan serve` から参照される public フォルダの場所を変更したいのですが、`Illuminate\Foundation\Application` 内の `publicPath()` メソッドでフォルダ名が直書きされていました。ということで、継承したクラスを新たに作ります。

*laravel/app/Application.php*

```
<?php
namespace App;

class Application extends \Illuminate\Foundation\Application
{
    public function publicPath()
    {
       return dirname($this->basePath) . '/www/subfolder';
    }
}
```

こんな感じで、新しくドキュメントルートを設定。

で、 `laravel/bootstrap/app.php` の冒頭で読み込んでいる Application クラスを、新しく作ったものに変更します。

*laravel/bootstrap/app.php*

```
$app = new App\Application(
    realpath(__DIR__.'/../')
);
```

## server.php を修正

`/laravel/server.php` 内にもパスの指定がありますので、それを修正します。

*/laravel/server.php*

```
// 変更前
if ($uri !== '/' and file_exists(__DIR__.'/public'.$uri)) {
    return false;
}
require_once __DIR__.'/public/index.php';
```

```
// 変更後
if ($uri !== '/' and file_exists(__DIR__.'/../www/subfolder'.$uri)) {
    return false;
}
require_once __DIR__.'/../www/subfolder/index.php';
```

以上で動くようになりました。(Laravel 5.1.40 で確認)
[森のタクト] 各スピーカーを個別にONOFFするためのハードウェアボタンの作成する

[Maker Faire Tokyo 2016 森のタクトについて](http://qiita.com/shozaburo/private/43561a396cdc0ed2facd)の詳細記事です。

#概要
手元のハードウェアボタンを押すと、それに対応したスピーカーをミュートにしたり、再びミュートを解除したりという機能を実装していますが、ここではこの機能について説明します。今回５つのボタンを用意しました。

![IMG_9060.jpg](https://qiita-image-store.s3.amazonaws.com/0/95321/9ce294f3-446a-079b-740e-8e8eefe8e1ee.jpeg)

#詳細
## LED付きボタン回路の作成
ただの、タクトスイッチを使用してもよいのですがそれだと今Muteなのか、Mute解除なのかが視覚的にわかりにくいので[LED付きボタン](http://akizukidenshi.com/catalog/g/gP-02010/)を使うことにしました。
回路図が２枚になっているのは、１枚目の基板は極力ボタン以外の部品は載せず、２枚目の基板はそれ以外の部品を載せ、２枚を積み重ねる構成にしているためです。

回路は、ローパスフィルタとシュミットトリガでチャタリング回避、フリップフロップで状態の保持などを行っています。フリップフロップの出力はは外に引き出してクライアント（RaspberryPi）への入力になります。

### 回路その１
<img width="1285" alt="スクリーンショット 2016-08-05 11.20.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/95321/5db1844d-bca4-45e0-859e-a3b61745bf02.png">
### 回路その２
SWx_AとSWｘ_Bという信号は実際はショートされています。
<img width="1182" alt="スクリーンショット 2016-08-05 11.17.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/95321/bd277eba-b101-696a-9caf-6d83c8137c81.png">

## ボタンからの入力に応じて音をMuteにする
上記回路からの5つのInputに対して割り込みを設定とハンドラーを追加します。
あとは、GPIOの状態をslave_en_flagとして保持し、note_onイベントのvelocityにかけるようにします。
そうするともしインプットがLowの場合はflagが0になっているので、velocityも0になりMuteになります。

```c

unsigned char slave_en_flags[6] = {1, 1, 1, 1, 1, 1};

void sw1_event(){
    slave_en_flags[0] = digitalRead(BCM_SW1);
    printf("Detect SW1 Event: %d");
}

void sw2_event(){
    slave_en_flags[1] = digitalRead(BCM_SW2);
    printf("Detect SW2 Event: %d");
}

void sw3_event(){
    slave_en_flags[2] = digitalRead(BCM_SW3);
    printf("Detect SW3 Event: %d");
}

void sw4_event(){
    slave_en_flags[3] = digitalRead(BCM_SW4);
    printf("Detect SW4 Event: %d");
}

void sw5_event(){
    slave_en_flags[4] = digitalRead(BCM_SW5);
    printf("Detect SW5 Event: %d");
}

int main(){
    //省略

    wiringPiISR(BCM_SW1, INT_EDGE_BOTH, sw1_event);
    wiringPiISR(BCM_SW2, INT_EDGE_BOTH, sw2_event);
    wiringPiISR(BCM_SW3, INT_EDGE_BOTH, sw3_event);
    wiringPiISR(BCM_SW4, INT_EDGE_BOTH, sw4_event);
    wiringPiISR(BCM_SW5, INT_EDGE_BOTH, sw5_event);

    //省略

    //再生
    for(p = datahead->next; p != NULL; p = p->next){

        switch(0xf0 & p->sendbuf[0]){
            case 0xc0:
                //program Change
                pgm_change(slave_num, 0x0f & p->sendbuf[0], p->sendbuf[1]);
 
                break;
            case 0x80:
                //note off
                note_off(slave_num, 0x0f & p->sendbuf[0], p->sendbuf[1], p->sendbuf[2]);

                break;
            case 0x90:
                //note on
                note_on(slave_num, 0x0f & p->sendbuf[0], p->sendbuf[1], p->sendbuf[2]*slave_en_flags[slave_num]);

                break;
            default:
                //printf("Other events\n");
                break;
        }

        usleep(p->wait_time * coeff);

    }
}
```
after_commitで無限ループの恐怖

Rails5では確認していないが、Rails4で確認。
after_commit :hoge, :on => :create でhogeメソッド内にupdate処理を行うと
無限ループする。

updateじゃなくてcreateなのに無限ループする…。
直観的じゃないからハマりそうなもんなのに、あまりググっても出てこないから書いてみた。
外国人だとstackoverflowで書いてる人がいた。

これがバグなのかバグじゃないのか、修正されるのかされないのかは不明。

http://stackoverflow.com/questions/22567358/prevent-infinite-loop-when-updating-attributes-within-after-commit-on-crea:embed:cite

こんな感じのコード書いて、本番にリリースすると無限にメールが
送信される障害発生((((；ﾟДﾟ))))ｶﾞｸｶﾞｸﾌﾞﾙﾌﾞﾙ

```
after_commit :hoge, :on => :create

def hoge
  self.update(status: "hoge") #update_attributesでもダメポ
  mail.deliver if Rails.env.production?
end
```