OmniAICreator/Qiita-1.07M huggingface dataset:
いろいろメモ

#KVMもろもろ

##インストール

ホスト:CentOS7 ゲスト:CentOS6x64

```bash:
#!/bin/bash
virt-install \
--name centos6x64 \
--ram 3096 \
--disk path=/var/kvm/images/centos6x64.img,size=30 \
--vcpus 2 \
--os-type linux \
--os-variant rhel6 \
--network bridge=br0 \
--graphics none \
--console pty,target_type=serial \
--location 'http://ftp.iij.ad.jp/pub/linux/centos/6/os/x86_64/' \
--extra-args 'console=ttyS0,115200n8 serial'
```

ホスト:CentOS7 ゲスト:CentOS7

```bash:
#!/bin/bash
virt-install \
--name centos7 \
--ram 3096 \
--disk path=/var/kvm/images/centos7.img,size=30 \
--vcpus 2 \
--os-type linux \
--os-variant rhel7 \
--network bridge=br0 \
--graphics none \
--console pty,target_type=serial \
--location 'http://ftp.iij.ad.jp/pub/linux/centos/7/os/x86_64/' \
--extra-args 'console=ttyS0,115200n8 serial'
```

##スナップショット

```shell:
# virsh list --all
 Id    名前                         状態
----------------------------------------------------
 2     centos6                        実行中
 3     centos7                        実行中
```

###表示

```shell-session:
# virsh snapshot-list centos7
 名前               作成時間              状態
------------------------------------------------------------
 centos7-snapshot-160109 2016-01-09 20:49:26 +0900 running
```
###作成

```shell-session:
# virsh snapshot-create-as centos7 centos7-ss
```
###復元
```shell-session:
# virsh snapshot-revert centos7 centos7-ss
```
###削除
```shell-session:
# virsh snapshot-delete centos7 centos7-ss-160109-2206
ドメインのスナップショット centos7-ss-160109-2206 が削除されました
```

##ゲストOSの名前変更

```shell-session:
# uuidgen
38c71a44-e03a-4174-89e2-e27a6b1ab9c8 ←メモ
# virsh edit 仮想マシン名
<name>表示させたい名前</name>
<uuid>上でメモしたuuid</uuid>    ←メモしたuuidへ書き換える。

# virsh define /etc/libvirt/qemu/仮想マシン名.xml <--再定義する。
# virsh list --all                               <--新しい名称と古い名称の仮想マシンが表示される。
# virsh start 新しい仮想マシン名		 <--新しい仮想マシン名で起動して、正常に動作することを確認する。
# virsh undefine 古い仮想マシン名		 <--古い仮想マシン名を定義を解除する。
```
Paper > Graph Convolutional Matrix Completion > Users, ItemsをAuto Encoderに入力する例

Auto Encoder関連の論文。
図２が気になった。

https://arxiv.org/abs/1706.02263

Graph Convolutional Matrix Completion
Rianne van den Berg, Thomas N. Kipf, Max Welling

```
Cite as:	arXiv:1706.02263 [stat.ML]
 	(or arXiv:1706.02263v1 [stat.ML] for this version)
```

- Figure 2
    - Users, Itemsを入力
    - Graph encoderを通してU,Vを生成
    - U, VをBilinear decoderに入力
    - Predicted ratingsを出力

### 備考

自分の問題で以下のパラメータをどのようにNetworkに入力するか悩んでいる。

- サイズ
- 複素屈折率
- dipoleの配置

サイズ、複素屈折率は10のオーダー
dipoleの配置は10000のオーダー
単純に同じ重みでinput nodeに与えた場合、dipoleの配置がdecisive factorになってしまうのではと危惧している。
異なるパラメータを与えている論文を探索中。
Paper | code > Forward Thinking: Building and Training Neural Networks One Layer at a Time > Neural Networkの学習に関する論文

Neural Networkの学習に関する論文。

https://arxiv.org/abs/1706.02480
Forward Thinking: Building and Training Neural Networks One Layer at a Time
Chris Hettinger, Tanner Christensen, Ben Ehlert, Jeffrey Humpherys, Tyler Jarvis, Sean Wade

```
Cite as:	arXiv:1706.02480 [stat.ML]
 	(or arXiv:1706.02480v1 [stat.ML] for this version)
```

- 一層ずつ学習する手法
    - Forward Thikning
    - 学習時間を大幅に削減する
    - many sorts of learnersでのdeep networksを生成可能
        - e.g. decision trees
- backpropagationを使わない
- general mathematical formulationの紹介
- Figure 1
    - 層を増やしていく概念図
    - C(N),N=1..が学習対象
    - D(N),N_1..はfrozen
- Figure 2
    - CNN (ConvNet)での学習例(と記載)
        - **私見: Figure captionにはconvolutional neural networkと記載があるが、紹介されているのはFully-connected network results節において。Caption間違いか?**
    - Forward thinkingとBackpropagationの比較
    - (a) Training Accuracyの比較
        - Forward thinkingのAccuracyの向上が速い
    - (b) Test Accuracy
        - Forward thinkingとBackpropagationで同じ程度のAccuracyを達成
- Figure 3
    - Figure 1と同様
- Figure 4
    - Figure 2と同様
    - CNN (ConvNet)での学習例 
    - Forward thinkingの方が精度向上が早く、Test Accuracyも高い
    
 
### code

>All of the code used to produce our results is available in our github repository at
https://github.com/tkchris93/ForwardThinking.

GTX 1060 3GB GPUでテストしたとのこと。
lodash


https://lodash.com/

デモ：https://codepen.io/mo4_9/pen/vZLdbq

# 並び替え

## sortBy

ageで昇順

```javascript
users = _.sortBy(users, 'age');
```

## orderBy

'asc','desc'で昇順/降順が選べる

```javascript
users = _.orderBy(users, 'age', 'desc');
```

## reverse

ageで降順（メソッドチェーン）

```javascript
users = _(users)
  .sortBy('age')
  .reverse()
  .value(); // 配列でなく1つのオブジェクトを返す場合は不要
```

## shuffle

シャッフル

```javascript
users = _.shuffle(users);
```

## sample

ランダムに1つだけ取得

```javascript
user = _.sample(users)
```


# 絞り込み

## take

前から5つだけ取得

```javascript
users = _.take(users, 5)
```

後ろから取得する場合は`takeRight`

## filter

age > 35 で絞り込む

```javascript
users = _.filter(users, (obj) => {
  return obj.age > 35;
});
```

## find

プロパティ、条件で絞り込む
複数該当するものがあったら最初に該当したものだけを取得

```javascript
user = _.find(users, {user: 'fred', active: true})
```

## includes

名前に'b'が含まれるユーザーを絞り込む

```javascript
userContainB = _.filter(users, (obj) => {
  return _.includes(obj.user, 'b');
});
```


# 判定

## inRange

'月'は1~12、'日'は1~31を取得したいとき

```javascript
_.inRange(month, 1, 12 + 1);
_.inRange(today, 1, 31 + 1);
```



# 整形

## padStart

ゼロ埋め
時間表示に使える

```javascript
const hour = _.padStart(9,2,0);
const minute = _.padStart(5,2,0);
const second = _.padStart(3,2,0);
console.log(`${hour}:${minute}:${second}`); // 09:05:03
```

## nth

たとえば `http://sample.com/room/1/chat/2` の地点から `roomId=1` を取得する

```javascript
const roomId = _(location.href.split('/')).compact().nth(-3);
```

`compact()`はfalsyな値を削除


# ループ

## each

ObjectもNodeListもまわせるので便利。
古いiOSでNodeListにforEachが使えないなどのバグもよしなに吸収してくれるので、each処理はデフォルトでlodashを使うべき。

```javascript
// NodeList
_.each(document.querySelectorAll('.item'), (elm,index) => {
  console.log(elm,index);
})
// Object
_.each({one: 1, two: 2, three: 3}, (value,key) => {
  console.log(key,value);
})
```

# 間引く

## throttle

一定間隔以内での関数の再実行を禁止する

```javascript
function throttle() {
  $('.throttle').append('throttle ');
}
$('#inputThrottle').on('click', _.throttle(throttle,1000))
```

## debounce

処理が終了して、一定間隔経過したら関数の実行
再度処理が始まった場合はキャンセル

```javascript
function debounce() {
  $('.debounce').append('debounce ');
}
$('#inputDebounce').on('click', _.debounce(debounce,1000))
```


> 参考
http://matsukaz.hatenablog.com/entry/2014/04/09/082410
JavaScriptで「こいつ...できる...のか??」と思わせる方法


[元ネタ](http://qiita.com/Mic-U/items/9afcc24e3f84bfa60b8d)

# 黙ってstrictを黙らす

```js
"use strict";
```

を**書きません**。いらないからです。

ECMAScript 2015からモジュールの概念が追加されました。モジュールのコードは常に厳格モードになります([Module code is always strict mode code.](http://www.ecma-international.org/ecma-262/6.0/#sec-strict-mode-code))。モジュールであれば、`"use strict;"`を書く必要は**ありません**。

では、どういうときにモジュール扱いになり、常に厳格モードになるのでしょうか？

1. Babelでes2015またはそれを含むenv等のpresetを使うとき。(厳密には、[strict-mode](https://babeljs.io/docs/plugins/transform-strict-mode/)プラグインが厳格モードにするのですが、es2015に含まれるes2015-modules-commonjsプラグインによって常にモジュール扱いとしています。)
2. `<script type="module">`と`type`属性に`module`を指定したとき。(2017年6月10日現在、リリース済みブラウザでそのまま動作するのは最新のSafariのみです)

scriptタグはEdge、Firefox(開発版)、Chrome(開発版)共に実装は終わっており、デフォルト有効化しての正式リリースを待つだけの状態ですが、通常は使用できません。ですので、Babelの場合がほとんどになります。

モダンブラウザのECMAScript 2015対応がかなり進んだとはいえ、`import`や`export`などのモジュール機能はSafariを除いて対応していません。ましてや、ECMAScript 2016以降の新機能になると対応は完全ではありません。もっとも、IE11対応を捨てられなければ、ECMAScript 2015をそのまま動かすなど夢もまた夢の話です。

ということで、既にBabelを使うことは必須事項であり、既に使用しているはずです。その状態であれば、すでにモジュールとして作成している可能性が高い、いや、モジュールとして作成しない理由がありません。なので、初めから厳格モードになっており、わざわざ書く必要はありません。

なお、`class`構文内も自動的に厳格モードになります。

# もう「let」なんて言わない

変数宣言は`const`のみで必要十分です。再代入は**邪道**です。関数型プログラミングをマスターした諸君であれば、ここで大きく頷いてくれるはずです。

なお、`var`は初めから存在しません。

# for (;;) はもう飽きたろう?

とりあえずfor..ofにしておきましょう

```js
const array = [1, 2, 3];
for (const x of array) {
  console.log(x);
}
```

ループ処理の定番パターンですね。インデックス番号が欲しいって？

```js
const array = [1, 2, 3];
for (const [i, val] of array.entries()) {
  console.log(`${i}: ${val}`);
}
```

# ドキュメンテーションコメントを書かな・・・書く！

・・・ (どうやら、うまい返しを考えているようだ)

・・・・・・ (TypeScriptも元ネタで言及されていて、ネタがないようだ)

・・・・・・・・・ (・・・)

ドキュメンテーションコメントを書きましょう！ (諦めたようだ)
PhpStormでTODOを使う


「あとで実装する」といった事柄をメモがわりに **TODO** として残す。

#書き方

`//` + コメントで記載する。

![Screen Shot 2017-06-10 at 8.32.12.png](https://qiita-image-store.s3.amazonaws.com/0/109241/f4e4cd94-c2ac-6b45-df1a-d88c73775282.png "Screen Shot 2017-06-10 at 8.32.12.png")

#TODO検索

検索というか左下に出てる。

![Screen Shot 2017-06-10 at 8.30.22.png](https://qiita-image-store.s3.amazonaws.com/0/109241/41450157-4e07-f4b1-b1ee-41284a6c37f7.png "Screen Shot 2017-06-10 at 8.30.22.png")

![Screen Shot 2017-06-10 at 8.36.34.png](https://qiita-image-store.s3.amazonaws.com/0/109241/503f4aa5-06f4-9543-d611-810042b3365f.png "Screen Shot 2017-06-10 at 8.36.34.png")

#カスタマイズもできる

らしいです。

http://qiita.com/nanoco/items/d2ae33fe9e7a8dd6aec0#2-todo%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA
ROSのvSLAMまとめ


##目的
ROSのVisual-SLAMまとめ
動作確認したものを記載。たくさん出ているので順次更新。


##List
| 名前                 |        公開年      | Camera   | 補足    |
|----------------------|----------------------|------------------------|----------------------|
| [LSD-SLAM](http://qiita.com/nnn112358/items/815c90703244d2d00d4c)　| 2014| Monocular |　|　|　 |
| [ORB_SLAM2](http://qiita.com/nnn112358/items/1087d5b0e4df5367f48b)　| 2015　| Monocular/Stereo/RGB-D |　|　|　 |
| [RTAB-Map](http://qiita.com/nnn112358/items/dd4cbfbbd76d06799ea1)　|2013| RGB-D |　|　|　 |
| [RGBDTAM](http://qiita.com/nnn112358/items/2fbc2f53535dd27f118f)　|2017 | RGB-D |　|　|　 |
| 　| 　|  |　|　|　 |


##参考
[ROSのLidarSLAMまとめ](http://qiita.com/nnn112358/items/814c0fb0d2075eb71da0)
【ネタ】Chatterで”ぬるぽ”したら、”ガッ”するトリガ

練習用のネタトリガです。
初心者のApexトリガ学習の参考に(なるのか？)

# 1.どこから登録すれば良いのか。
Chatterが出たばっかりのときは、オブジェクト構成が色々複雑でめんどくさかったのですが、今はシンプルになってて楽ちんです。
- Feedに対するトリガ:[設定] -> [カスタマイズ] -> [Chatter] -> [トリガ] -> [FeedItem トリガ]
- Commentに対するトリガ:[設定] -> [カスタマイズ] -> [Chatter] -> [トリガ] -> [FeedComment トリガ]

# 2.Feedトリガ
サンプルコードは以下です。
今回は<del>手を抜いて</del>練習用なのでわかりやすくするために、トリガ直書きしてますが、実際には先人達が積み上げてくれた[あのテンプレ](http://www.embracingthecloud.com/2010/07/08/ASimpleTriggerTemplateForSalesforce.aspx)とか、[このテンプレ](http://www.tgerm.com/2012/01/salesforce-apex-trigger-template.html)とか[そのテンプレ](https://github.com/kevinohara80/sfdc-trigger-framework)を使ったりしていい感じに実装しましょう。

``` java
trigger EX_FeedItemTrigger on FeedItem(after insert, after update) {
  ID responseUserId = '005280000030xHe';
  List<FeedComment> insComments = new List<FeedComment>();

  if(Trigger.isInsert && Trigger.isAfter) {
    for(FeedItem f : Trigger.new) {
      //ぬるぽしたら、ガッ！する
      if(f.Body.contains('ぬるぽ')) {
        insComments.add(new FeedComment(
               FeedItemId = f.Id
            , CommentBody = '<b><i>ガッ!</i></b>'
            , CommentType ='TextComment'
            , CreatedById = responseUserId
             , IsRichText = true
        ));
      }
    }
  }

  if(Trigger.isUpdate && Trigger.isAfter) {
    for(FeedItem f : Trigger.new) {
      //更新で新たにぬるぽした場合も、ガッ！する
      if(f.Body.contains('ぬるぽ')
      && !(Trigger.oldMap.get(f.Id).Body.contains('ぬるぽ'))) {
        insComments.add(new FeedComment(
               FeedItemId = f.Id
            , CommentBody = '<b><i>ガッ!</i></b>'
            , CommentType ='TextComment'
            , CreatedById = responseUserId
            , CreatedDate = f.CreatedDate
             , IsRichText = true
        ));
      }
    }
  }

  if(!insComments.isEmpty()) insert insComments;
}
```

# 3.Commentトリガ
見てるオブジェクトが違うだけど、ほぼFeedトリガと一緒です。

``` java
trigger EX_FeedCommenTrigger on FeedComment(after insert, after update) {
  ID responseUserId = '005280000030xHe';
  List<FeedComment> insComments = new List<FeedComment>();

  if(Trigger.isInsert && Trigger.isAfter) {
    for(FeedComment c : Trigger.new) {
      //ぬるぽしたら、ガッ！する
      if(c.CommentBody.contains('ぬるぽ')) {
        insComments.add(new FeedComment(
               FeedItemId = c.FeedItemId
            , CommentBody = '<b><i>ガッ!</i></b>'
            , CommentType = 'TextComment'
            , CreatedById = responseUserId
             , IsRichText = true
        ));
      }
    }
  }

  if(Trigger.isUpdate && Trigger.isAfter) {
    for(FeedComment c : Trigger.new) {
      //更新で新たにぬるぽした場合も、ガッ！する
      if(c.CommentBody.contains('ぬるぽ')
        && !(Trigger.oldMap.get(c.Id).CommentBody.contains('ぬるぽ'))) {
        insComments.add(new FeedComment(
               FeedItemId = c.FeedItemId
            , CommentBody = '<b><i>ガッ!</i></b>'
            , CommentType = 'TextComment'
            , CreatedById = responseUserId
            , CreatedDate = c.CreatedDate
             , IsRichText = true
        ));
      }
    }
  }

  if(!insComments.isEmpty()) insert insComments;
}
```
ルックアップ検索条件の使い方 (有効なレコードだけを表示、 2つのルックアップ項目を連動等)

個人的には結構好きなんですが、あんまり記事見かけたことがなかったので、ちょっと書いてみます。

# ルックアップ検索条件とは
・ルックアップダイアログで検索されるレコードを、定義した検索条件に一致するレコードのみに絞り込む。
・必須と省略可能の2種類が選択できる。必須の場合は条件に一致したレコード以外は検索できなくなるが、後者の場合は検索条件を無視した検索も可能。(下図の、"すべての結果を表示"をクリックで条件が解除)
![image](https://qiita-image-store.s3.amazonaws.com/0/126858/68df1272-c7ec-27ff-bfd4-68278a831762.png)
・必須は1オブジェクトに付き5項目までしか作成できない。(それを超える場合は、省略可能+入力規則で対応)

# ルックアップ検索条件の設定方法
1. オブジェクトの設定画面から、条件をつけたいルックアップ項目の編集画面を開き、下の方の[条件設定を表示]をクリックすることで設定画面が開きます。
![image](https://qiita-image-store.s3.amazonaws.com/0/126858/e4eff9be-ba29-6639-a0ff-4167cd835470.png)


2. まず、検索条件の設定をします。条件の設定の方法はビューなどとほぼ同じですが、比較対象に固定の値だけでなく、任意の項目も設定することが出来ます。
![image](https://qiita-image-store.s3.amazonaws.com/0/126858/f94e6b69-a7a8-14b8-5acc-e4729cd771e2.png)
なお、ここでは表示対象にしたいレコードの条件を設定します。
入力規則のように、エラーになる条件を入力するわけではないので、入力規則から置き換えるときは注意してください。

3. 続いて、必須と省略可能のいずれかを選びます。必須の場合は入力規則同様にエラーメッセージを記述します。
![image](https://qiita-image-store.s3.amazonaws.com/0/126858/77f01a88-ec61-c230-497e-cba841ee8aef.png)

4. 最後に、必要に応じてルックアップウィンドウ上に表示するメッセージを定義します。
![image](https://qiita-image-store.s3.amazonaws.com/0/126858/7ae66472-e376-c24f-56c1-dae5906a91f7.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/126858/e55019cb-0d7e-52af-2408-45d14bcc02c0.png)

# 使用例
## 有効なレコードだけを表示する。
親レコードは存在しているが、それを選択して子レコードを登録されると困るときに使います。
以下の例では取引先に有効チェックボックスを追加し、商談の取引先項目で有効チェックがついている取引先のみを表示するようにしています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/126858/38504bfa-bc7d-55dc-0178-8832c986d81d.png)

例えば、「取引を開始するに辺り社内での審査が必要な場合に、その審査が通ったフラグが立つまでは商談で取引先に選べない」や、逆に「諸々の理由で取引できなくなった会社に無効フラグを立てて、新規の商談登録では選べなくする」などの使い方が考えられます。


## 特定のレコードタイプのレコードだけを表示する。
親オブジェクトに、複数のレコードタイプを持たせおり、子オブジェクトのルックアップ項目ではそのうち特定のレコードタイプのデータだけを登録させたいときに使います。
以下の例では、取引先に発注元レコードタイプを追加し、商談の取引先項目で発注元レコードタイプの取引先のみを表示するようにしています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/126858/3e080444-069f-05a4-707e-538071e04e7f.png)

例えば、取引先は取引のある会社をすべて登録するオブジェクトですが、発注元、仕入先のように、自社との関わり方の違いでレコードタイプを分けて、入力項目を切り替える様なことはよくあると思います。そのような場合、商談の取引先として適切なのは発注元だけですので、それ以外が表示されないように制御するという使い方が考えられます。

## 2つのルックアップ項目を連動させる。
連動選択リストと同じことをルックアップ項目で行います。
前提として、連動させる２つのルックアップ項目それぞれの参照先オブジェクトが親子関係である必要があります。
以下の例では、親取引先項目を商談に追加し、標準の取引先項目では親取引先項目で選択された取引先の子になっている取引先しか表示できないようにしています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/126858/79054d80-1109-2b11-9cfa-732198da6283.png)


大概の場合、子オブジェクトの方とだけリレーションを張れば十分なことが多いので、あえて親子２つのルックアップ項目を持つことはそれほど多くはないですが、
・親オブジェクトの関連リストにも、そのオブジェクトのレコードを表示させたい。(商談の活動が、取引先の活動選択リストにも表示されるような感じ。)
・子レコードの数が膨大で、かつ名称も重複しやすく探すのが困難な場合。
・連動選択リストで対応したいが、データ数が膨大で登録できない、あるいは登録できるが定期的に変更しなければならないため、その都度連動関係を定義する作業が困難な場合。
などに利用できるのではないかと思います。
[メモ] らずぱい WebUIでシャットダウン (セキュリティ考慮無し)

## 概要
- shutdown とか rebootって、タイプするのが、ダるい。
<br>=> ボタンおすと、再起動とか、シャットダウン
<br>=> Webサーバ立てて、php で、`system`関数呼べば...
- <font color='red'>**セキュリティは考慮してない**</font>ので、外部から接続されないように、おうちのLANだけとか、ラズパイをWifi-APにしてしまうとか、しましょう。
- 参考: [Basic way to shutdown via web](https://www.raspberrypi.org/forums/viewtopic.php?t=58802)


## 環境
- Raspberry Pi 2 / 3
- Raspbian: `2017-04-10-raspbian-jessie`
- lighttpdを使用
- 知らないヒトが入ってこない、ネットワーク環境.

## 手順
1. いつもの
    - Raspbianを焼いて
    - 適当に[初期設定](http://qiita.com/mt08/items/edefa35a7cefc726379e)
    - パッケージ更新:<br>`sudo apt-get update && sudo apt-get upgrade -y`

2. Webサーバ(lighttpd)の導入、phpの有効化

    ```bash
# パッケージ取得
sudo apt-get update && sudo apt-get install lighttpd php5-cgi
# モジュールを有効化
sudo lighty-enable-mod fastcgi fastcgi-php
# サービス再起動
sudo systemctl restart lighttpd.service
```
    - `/var/www/html` が htmlのルートディレクトリ
    - ブラウザから、http://<らずぱいのIPアドレス>/にあくせすしてみよう


3. sudores の設定

    ```bash:シェルにこぴぺ
# www-dataユーザが、sudo shutdownを呼べるようにする.
# ファイル:/etc/sudoers.d/www-data_shutdown
echo 'www-data ALL= NOPASSWD: /sbin/shutdown' | sudo tee /etc/sudoers.d/www-data_shutdown
```

4. html,phpファイルの準備

    ```bash:シェルにこぴぺ
# ファイル:/var/www/html/shutdown.php
cat <<EOF | sudo tee /var/www/html/shutdown.php
<script>setTimeout(function(){ history.go(-1); }, 1000);</script>
<?php system('sudo /sbin/shutdown -h now > /dev/null &'); ?>
Shutting down
EOF
#
# ファイル: /var/www/html/reboot.php
cat <<EOF | sudo tee /var/www/html/reboot.php
<script>setTimeout(function(){ history.go(-1); }, 1000);</script>
<?php system('sudo /sbin/shutdown -r now > /dev/null &'); ?>
Rebooting
EOF
#
# ファイル: /var/www/html/index.html
cat <<EOF | sudo tee /var/www/html/index.html
<html>
<form action="reboot.php ">    <input type="submit" value="Reboot" style="height: 240px; width: 50% ;font-size: 50px;" /></form>
<br><br><br><br><br><br>
<form action="shutdown.php ">    <input type="submit" value="Shutdown" style="height: 240px; width: 50% ;font-size: 50px;" /></form>
</html>
EOF
```
    - /var/www/html/ 以下に
        - ボタンを表示。押すと、phpのファイルへジャンプ

			```html:index.html 
			<html>
			<form action="reboot.php ">    <input type="submit" value="Reboot" style="height: 240px; width: 50% ;font-size: 50px;" /></form>
			<br><br><br><br><br><br>
			<form action="shutdown.php ">    <input type="submit" value="Shutdown" style="height: 240px; width: 50% ;font-size: 50px;" /></form>
			</html>
			```		
        - シャットダウン

			```php:shutdown.php
			<script>setTimeout(function(){ history.go(-1); }, 1000);</script>
			<?php system('sudo /sbin/shutdown -h now > /dev/null &'); ?>
			Shutting down
			```

        - 再起動

			```php:reboot.php
			<script>setTimeout(function(){ history.go(-1); }, 1000);</script>
			<?php system('sudo /sbin/shutdown -r now > /dev/null &'); ?>
			Rebooting
			```

5. ブラウザから、http://<らずぱいのIPアドレス>/にアクセス。
![ナイスなUIデザインがほしい](https://qiita-image-store.s3.amazonaws.com/0/75594/ef0b9ead-69f3-9175-f28b-a5f432beb508.png)<br>デザインがいまいちだと、使う気が...(ぉ
さようならこんにちは

バージョン変更で過ぎ去ったあなたたちは、まるで僕のようだ。

## uniqさよなら。distinctこんにちは。
uniq氏はdistinctのエイリアスでした。
uniq氏はrails5.1から、削除されます。
「`DEPRECATION WARNING: uniq is deprecated and will be removed from Rails 5.1 (use distinct instead)`（uniqは廃止され、Rails 5.1から削除されます（代わりにdistinctを使用してください））」

```
[32] pry(main)> User.joins(:user_statuses)
.where(user_statuses: {service_id: [Settings.service_code,Settings.service_code_ferret]}).uniq
DEPRECATION WARNING: uniq is deprecated and will be removed from Rails 5.1 (use distinct instead) (called from <main> at (pry):28)
  User Load (0.6ms)  SELECT DISTINCT `mmember`.* FROM `mmember` INNER JOIN `user_statuses` ON `user_statuses`.`uid` = `mmember`.`uid` WHERE `user_statuses`.`service_id` IN (9, 4)
```

```
[31] pry(main)> User.joins(:user_statuses).where(user_statuses: {service_id: [Settings.service_code, Settings.service_code_ferret]}).distinct
  User Load (0.7ms)  SELECT DISTINCT `mmember`.* FROM `mmember` INNER JOIN `user_statuses` ON `user_statuses`.`uid` = `mmember`.`uid` WHERE `user_statuses`.`service_id` IN (9, 4)
```

uniq、またいつか。

## first_or_createさよなら。find_or_create_byこんにちは。
first_or_createは削除されてないけど非推奨とされています。
非推奨にされた理由は読みづらさかららしいです。
廃止する可能性あるが、明確な廃止予定はないともありました。
「メソッドのfirst_or_createファミリは、このAPIのためにnodocされています。将来的に廃止される可能性がありますが、その実装はごくわずかであり、ユーザーには忌憚のない廃止予定の警告を送る価値はありません。」
http://blog.willnet.in/entry/2012/10/29/225845
https://github.com/rails/rails/blob/300d080ada31ac297264e6abba6ca16cd2db5925/activerecord/CHANGELOG.md

直近書いたfirst_or_create、確かに読みづらい。

```
# userに紐付いたuser_statusの中にSettings.service_codeと同じものがなければ、Settings.service_codeをセットして生成する。
user.user_statuses.where(service_id: Settings.service_code).first_or_create(service_id: Settings.service_code)
```

## before_filterさよなら。before_actionこんにちは。

動作的には違いはなく、読みやすさのためだけの変更と公式が言っているのを見つけました。

```
Magizharasu ‏@magizh  2012年12月7日
 @rails is it just a change in name for readability ?
Ruby on Rails ‏@rails  2012年12月7日
 @magizh Yes.
```
https://twitter.com/rails/status/277121523649740800
簡単に安全な方法でcrontabを修正する方法

「crontab -e」でのcrontabの修正は、「crontab -r（設定全消去）」の誤タイピングを招くので危ない！と半ば常識となっています。が、外部ファイルを編集してからcrontabで外部ファイルを読み込む、というのは二度手間だなぁ…。ということで、下記のようにaliasを使って手間を減らしましたという話。

##基本的な考え方
今回の安全な方法とは、「~/etc/crontab」という外部ファイルを経由して、その内容をcrontabに適用することで、「crontab -e」を使わないようにする！ということとします。

##.bash_profileにaliasを設定する
まずは、.bash_profileに下記aliasを追記します。

```
...
alias cronedit="vi ~/etc/crontab; crontab ~/etc/crontab; echo 'crontab edit complete.'"
...
```

こう書くことで、~/etc/crontabを編集したら自動でcrontabに適用されるようになり、「crontab -e」
と同じ使用感を得られるようになります。

.bash_profileを編集したら、当然ですがドット実行して設定を反映させてください。

```
. ./.bash_profile
```

##実際に使ってみる
こんな感じで外部ファイルの編集モードに入ります。

```
$ cronedit
```

viの画面が開くので、内容を適当に修正します。

```
0 * * * * echo 'test'
```
`:wq`で保存＆編集終了すると、下記の文字列が表示され、crontabにも設定が反映されます。

```
crontab edit complete.
```

##より安全性を高める

外部ファイルのバックアップを定期的に取るようにすると、より安全性が増すかと思います。他には、Git管理したりする方法もありますね。


以上で終了です。お疲れさまでした。
[swift3]画像に暗くフィルターをかける

# フィルターについて
画像をiOSで扱う際、以下のフィルターを使って、セピア色にしたり、ぼやかしたり、彩度や明度を弄ったり、色々できる。
> [CIFilter, OpenCV, vImageを使って画像フィルタ処理をかける](http://himaratsu.hatenablog.com/entry/2013/04/29/024711)


# 単純に暗くしたい
ただ、難しい処理ではなくて、単純に画像を暗くしたい場合、上記のフィルターでは難しい。明度をいじくっても、コントラストの変な感じの画像になる。（だれかわかる方おしえてください。。）


以下を参考に、半透明のUIViewを生成して重ねる手法で解決。リンク先はObjective-cで書かれていたので、swift3で書き直しました。
> [How to darken a PNG?](https://stackoverflow.com/questions/9550085/how-to-darken-a-png)

```swift:darken.swift
    /// 与えられた画像を暗くする。
    ///
    /// - Parameters:
    ///   - image: 元画像
    ///   - level: 暗くするレベル 0-1
    /// - Returns: 加工後画像
    func darken(image:UIImage, level:CGFloat) -> UIImage{
        
        // 一時的な暗くするようの黒レイヤ
        let frame = CGRect(origin:CGPoint(x:0,y:0),size:image.size)
        let tempView = UIView(frame:frame)
        tempView.backgroundColor = UIColor.black
        tempView.alpha = level
        
        // 画像を新しいコンテキストに描画する
        UIGraphicsBeginImageContext(frame.size)
        let context = UIGraphicsGetCurrentContext()
        image.draw(in: frame)
        
        // コンテキストに黒レイヤを乗せてレンダー
        context!.translateBy(x: 0, y: frame.size.height)
        context!.scaleBy(x: 1.0, y: -1.0)
        context!.clip(to: frame, mask: image.cgImage!)
        tempView.layer.render(in: context!)
        
        let imageRef = context!.makeImage()
        let toReturn = UIImage(cgImage:imageRef!)
        UIGraphicsEndImageContext()
        return toReturn
   
    }
```

元画像
![Simulator Screen Shot 2017.06.10 3.45.37.png](https://qiita-image-store.s3.amazonaws.com/0/180836/8b838501-dfd6-3af9-bec4-736763e1b0ba.png)

加工後 level=0.5
![Simulator Screen Shot 2017.06.10 3.44.59.png](https://qiita-image-store.s3.amazonaws.com/0/180836/c52c5a7a-6f63-7782-b30c-a0d4ce469e77.png)

背景としていい感じになる。
![Simulator Screen Shot 2017.06.10 3.50.43.png](https://qiita-image-store.s3.amazonaws.com/0/180836/f8e1c3a1-f260-4307-a2ee-d5eaecd6771a.png)
Bioconductor解説 Biostrings編 その２


過去記事
--

[Bioconductor解説 Biostrings編 その１](http://qiita.com/Kazuki-Nakamae/items/dd8859c5fe5a2e2d9671)
　

DNAString、 RNAString、AAString
--

　さて、今回はDNAString、 RNAString、AAString について解説していきたいと思います。
　
　これらは前回説明したBString objects の子供です。そのためBString objects でサポートされていた関数などは利用可能です。

```R:例
> length(DNAString(x="AAACCCCCCAA"))
[1] 11
```
　
　ちゃんとした言葉で説明しますと、前回説明したBString objects はXString というクラスで定義されたものですが、DNAString、 RNAString、AAString はこれを継承した。サブクラスです。
　仕様はほぼ同じですが、それぞれがDNA、RNA、アミノ酸配列処理を指向した機能を追加搭載しています。
　
　元は同じなので、一部は比較も可能となっています。

```R:DNAString、RNAString、AAString同士の比較

# ==で配列を比較

> DNAString(x="AAACCCCCCAA")==DNAString(x="AAACCCCCCAA")
[1] TRUE

> DNAString(x="AAACCCCCCAA")==RNAString(x="AAACCCCCCAA")
[1] TRUE

> DNAString(x="AAACCCCCCAA")==AAString(x="AAACCCCCCAA")
 DNAString(x = "AAACCCCCCAA") == AAString(x = "AAACCCCCCAA") でエラー: 
  comparison between a "DNAString" instance and a "AAString" instance is not supported
  
# もちろん配列が異なれば FALSEを返す

> DNAString(x="AAACCCCCCAA")==RNAString(x="AAA")
[1] FALSE

# !=もサポートしています

> DNAString(x="AAACCCCCCAA")!=RNAString(x="AAA")
[1] TRUE

```


DNAString objects
--

　それでは、各オブジェクトの説明に移りたいと思います。
　まずはDNA配列を扱うDNAString オブジェクトについてです。
　まずインスタンスの生成は以下のようになります。


```R:DNAStringインスタンスの生成
> DNAobj = DNAString(x="ATCGGCNAA-KKT", start=1, nchar=NA)
> DNAobj
  13-letter "DNAString" instance
seq: ATCGGCNAA-KKT
```

　このコンストラクタの引数は以下のようなものとなっています。

<dl>
  <dt>x：{string}</dt>
  <dd>配列データ</dd>
  <dt>start：{number}</dt>
  <dd>読み込み開始地点（"-"で末尾からの参照）</dd>
  <dt>nchar：{number}</dt>
  <dd>読む込む文字の数</dd>
</dl>



　DNAString オブジェクトについては使える文字に制限があります。
　alphabet()を使うとサポートしている文字一覧を見ることが可能です。

```R:DNAStringがサポートしている文字一覧
> alphabet(DNAobj, baseOnly=FALSE)
 [1] "A" "C" "G" "T" "M" "R" "W" "S" "Y" "K" "V" "H" "D" "B" "N" "-" "+" "."
```

　"M"や"R"はIUPAC nucleotide ambiguity codes に準じた多義的な塩基表記です。日本語では縮重塩基と呼んだりします。
　詳しくは以下の文献をご参照ください。
　[IUPAC nucleotide ambiguity codes](http://www.chick.manchester.ac.uk/SiteSeer/IUPAC_codes.html)
　
　またさらに以下の記号もサポートしているようです。

<dl>
  <dt>"-"</dt>
  <dd>ギャップ</dd>
  <dt>"+"</dt>
  <dd>the hard masking letter</dd>
  <dt>"."</dt>
  <dd>文字ではない、もしくは使用不可文字</dd>
</dl>

　"+"に関しては適切な日本語が思い当たらないためにそのまま表記しました。
　個人的には"-"以外は使ったことがないです。

RNAString objects
--

　DNAStringとほぼ同じです。サポートしている文字が違います。

```R:RNAStringobjects

> RNAobj = RNAString(x="AUCGGCNAA-KKU", start=1, nchar=NA)
> RNAobj
  13-letter "RNAString" instance
seq: AUCGGCNAA-KKU

> alphabet(RNAobj, baseOnly=FALSE)
 [1] "A" "C" "G" "U" "M" "R" "W" "S" "Y" "K" "V" "H" "D" "B" "N" "-" "+" "."

```


AAString objects
--

　アミノ酸配列をサポートしています。使い方はDNAStringとほぼ変わらないです。

```R:AAStringobjects

> AAobj <- AAString("MARKSLEMSIR*", start=1, nchar=NA)
> AAobj
  12-letter "AAString" instance
seq: MARKSLEMSIR*

> alphabet(AAobj, baseOnly=FALSE)
 [1] "A" "R" "N" "D" "C" "Q" "E" "G" "H" "I" "L" "K" "M" "F" "P" "S" "T" "W" "Y" "V" "U"
[22] "O" "B" "J" "Z" "X" "*" "-" "+" "."

```

　AAStringではよく見ると"*"という表記もサポートされています。
　これはストップコドン表記です。

--


 次の回ではここまでご紹介したBString、DNAString、RNAString、AAString オブジェクトを扱う関数ないしメソッドの説明をしていきたいと思います。 
 ありがとうございました。
Houdini Core ～はじめてのモデリング編①～

どうもです。ボチボチ進めていきます～。
今回ははじめてのモデリングです。

DCCツール(Maya,3dsMAX)等でやられている方もおられるとおもいます。

Houdiniでは、**非破壊モデリング**といわれる手法が主になります。

では　非破壊モデリングとは・・・？
例えば板ポリゴンがあるとして　
![キャプチャ2.JPG](https://qiita-image-store.s3.amazonaws.com/0/184524/a78f82e6-008e-7e15-1a75-ba47eea15293.jpeg)

その板ポリゴンを
・押し出ししたり
・ひねったり
・ベベルで角のエッジを落としたり
![キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/184524/269bfc51-f13c-ac1f-7347-63d30b3a3ed5.jpeg)


↑上図のとおり、板ポリゴンからかなり形状がかわりました。
ポリゴン数がかなり増えたな～とかおもいますが。

実は元の板からはなにも増えていないのです！
簡単に言うと
***
板ポリゴン
　＋
押し出し
　＋
ベベル  
***
もっと噛み砕くとPhotoShop等レイヤー構造みたいに
***
　線画
　＋
色レイヤー
　＋
ハイライト・シャドウ効果レイヤー
***
みたいなものです。
なので元の板ポリゴンの情報は残っています。非破壊モデリングって凄いですね。

では早速、**トレーニング**！

**■ 課題 ■**
テーブルをつくってみます。
　→流れとしては　板ポリゴンに厚みをつけてテーブル台、あとは脚４つの作成となります。

○　Creat > Grid
![キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/184524/50338373-afce-4df5-752a-58955d9c1aa0.jpeg)




○　このオブジェクトのアトリビュート項目に
**Rows** , **Columns** とあります。
このグリッドオブジェクトの頂点数を増やしたり、減らしたりできます。
![キャプチャ3.JPG](https://qiita-image-store.s3.amazonaws.com/0/184524/cccc2cb5-c10e-f0e0-b55f-d773e1fb30ec.jpeg)

今回は Rows , Columns　共に2と2にします。
さらに　サイズを変更します。
Size（左から x, z)で管理されているのが分かります。
Size の　パラメータを　10 . 5 にします。
![キャプチャ5.JPG](https://qiita-image-store.s3.amazonaws.com/0/184524/603e9cd3-2e79-e768-d396-5d6d669509c0.jpeg)


下図のようにプリミティブ選択モードから
オブジェクトを選択します。さらに
 Polygon　タブ　>　PolyExtrude　を選択します。
![キャプチャ6.JPG](https://qiita-image-store.s3.amazonaws.com/0/184524/9b36fd65-4f8e-2cba-55fe-db94929be854.jpeg)


すると真ん中に赤い点が目立つとおもいますので
赤点をクリックしたまま上下にやってます。これが　PolyExtrude(押し出し)の機能になります。
![キャプチャ7.JPG](https://qiita-image-store.s3.amazonaws.com/0/184524/1c12c1f8-1c32-a6ec-9687-0f989e89c663.jpeg)


いまのままでは上へと押し出ししたのみなので裏底の面がありません。。。
Extrusion (旧Opthion)の項目に　**Output Back** に [ v ] チェックを入れます。
![キャプチャ8.JPG](https://qiita-image-store.s3.amazonaws.com/0/184524/97225003-6899-9014-db70-77ff331f7bae.jpeg)
**↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓**
![キャプチャ9.JPG](https://qiita-image-store.s3.amazonaws.com/0/184524/e0c55fc9-64e3-a423-1ae4-551442a640bf.jpeg)

テーブル台ができたので　次は脚部をつくります。

Creat > Grid

先ほど作ったテーブル台がちょっと邪魔なので表示を隠します。
シーンヒエラルキ？ですかね？　そこから　オブジェクトが２つあるのもここで確認ができます。
テーブルオブジェクトの真ん中にカーソルを合わせると　青い目のアイコン　または　青いタブを押すと青色も消え
オブジェクトも非表示状態になります。
![キャプチャ10.JPG](https://qiita-image-store.s3.amazonaws.com/0/184524/28c9a9b0-386b-68b4-3a0e-9b80b4e87a23.jpeg)


つづく。
さくらサーバーにLinuxbrewを導入する(旧)

| |シリーズ：さくらサーバーで遊ぶ|
|:--|:--|
|設定等のメモ|http://qiita.com/cielavenir/items/67a7c631713b4c816b6d|
|SSL化|http://qiita.com/cielavenir/items/aad29b2348fc4d3f9155|
|(さくらサーバー導入の主目的)<br>メールをフックする|http://qiita.com/cielavenir/items/5ce4568fc405329d421a|
|Linuxbrewを導入する(旧)|http://qiita.com/cielavenir/items/741921fcecb281555f77|
|Homebrewを導入する|https://qiita.com/cielavenir/items/67ce0ec9cd8d43ed00f1|
|さくらサーバーでgccへの依存が発生しない理由<br>(HOMEBREW_BUILD_FROM_SOURCE=1は不要)|https://qiita.com/cielavenir/items/410ded536d9b520989c4|

## 前説

- http://linuxbrew.sh/
- HomebrewパッケージマネージャのLinuxポート
- POSIX互換OSなら移植可能なはず
    - 特に、SSHが使えるけどroot権限がないさくらサーバーでは需要が高い気もする

## 準備

- 私の環境ではrbenvを使っていますので必要に応じて導入します

- (私の環境だと~/.profile)に以下を書き込みます

```
export HOMEBREW_BUILD_FROM_SOURCE=1 # LinuxBrewをFreeBSDで走らせている時点でバイナリなんて存在しない
export HOMEBREW_TEMP=$HOME/tmp # /tmpがnoexecでマウントされているため
```

- $HOME/.linuxbrew/binをPATHに追加します
- ~/tmpを作成します

## インストール

- https://raw.githubusercontent.com/Linuxbrew/install/master/install を手動でダウンロードします
- `/bin/chown`を`/usr/sbin/chown`に、`/bin/chgrp`を`/usr/sbin/chgrp`に変更します
- (導入時のみ念のため)`export GIT_EXECUTABLE=/usr/local/bin/git`します
- `ruby install`します。警告は無視して構いません。
- `~/.linuxbrew/Homebrew`に移動します(必要に応じb973a6c5をチェックアウトします)
- `wget -O - https://gist.githubusercontent.com/cielavenir/a26f82b06f969ffd9113ffbae22573d3/raw/linuxbrew_freebsd.patch | patch -p1`としてパッチします。
    - パッチの内容は以下の通り：
    - ld.soのパスを修正します
    - LinuxBrewが変更された時、自動でrebaseする機能を解除します
    - gcc-4.2のバージョン取得処理をgcc-4.3以降のものと同一にします
    - 内部パスに/usr/local/binを追加します
    - /proc/cpuinfoを読まないようにします
    - OS.linux?を真にします
    - glibcを9に固定します
        - glibcに依存するパッケージは不具合が出る可能性が高いので現状暫定です
    - `~/.linuxbrew/Homebrew/Library/Homebrew/shims/scm/git`のbashパスを変更します

- /usr/local/bin/gmakeを~/.linuxbrew/Homebrew/Library/Homebrew/shims/linux/super/makeにリンクします

- 他、色々やっときます

```
ln -s ~/.linuxbrew/bin/m4 ~/.linuxbrew/Homebrew/Library/Homebrew/shims/linux/super/m4
ln -s ~/.linuxbrew/bin/bison ~/.linuxbrew/Homebrew/Library/Homebrew/shims/linux/super/bison
```

## 使用

- 一回準備が終わればbrew installとか普通に行なえます

## 謝辞

- パッチの一部 https://gist.github.com/mikoim/d86176c827fe1cee25b92576ed9bd99e を使用しています。ありがとうございました。
    - 特に自動rebase機能解除は助かりました。

## あとがき

- <del>[ツインテールdeエンジェルモード!!](http://angelmode.sourceforge.jp/)</del>スクリプト言語ＡＩＲのインストールを試みましたが、powlが実装されておらず失敗しました…
- まあ[unace](https://github.com/cielavenir/homebrew-ciel/blob/master/unace.rb)は手に入ったので良かったですが(<font color="red">※おそらく世界初のFreeBSD版unace2です</font>)

## 180507

- tgmath/long doubleを無効化してビルドするオプションを付けたことにより、 [**ツインテールdeエンジェルモード!!がさくらサーバー上で動作可能になりました**](https://github.com/cielavenir/homebrew-ciel/blob/f02aecf791ad7f189076d3b2c3cf0264e5a9d81d/twintail.rb)(<font color="red">※世界初のFreeBSD版</font>)

## 190102

- homebrew-coreは62db5b95903e0c920ee4926f7ca53c47989e5344までアップデート可能なようです。maximum_macosがこのLinuxbrewバージョンでは解釈できないためです。
Chainerのimagenetを[確実に]動かす

#導入
##この記事について
いくつかのサイトを見ながらimagenetをなんとか動かすことができたのでその内容を残すために執筆。chainerのサンプルを動かしたというサイトはたくさんあるが、バージョンの違いやコードの違いで詰まったりしてしまうこともありそうなので、実際に動かした環境とその時に使った文献（記事）をまとめる。

##対象
mnistのサンプルをやった人。初心者（僕も初心者なので）
##参考にしたサイト
[chainer（v1.14.0）で画像分類をはじめるための覚書](http://ob-om.hatenablog.com/entry/2016/09/04/143448)

[ChainerのNINで自分の画像セットを深層学習させて認識させる](http://d.hatena.ne.jp/shi3z/20150709/1436397615)

[pyenvを使った環境構築（Mac OS）](http://qiita.com/1000ch/items/93841f76ea52551b6a97)

[ChainerでcPickle.UnpicklingError](http://qiita.com/shota_hayashi/items/4a488931ab88f45cfa55)


#手順
##環境構築
今回の内容は全てMacOS上で行った。python3でやりたかったけれど、上のサイトが2.xを使っていたみたいなのでAnaconda 2.1.0 （python2.7.13）を使った。[pyenv](http://qiita.com/1000ch/items/93841f76ea52551b6a97)でanaconda2.1.0をインストールして環境を構築した。chainerのバージョンはchainer==1.20.0.1を使った。

##まず初めに
一つ目の記事で公開されているgitからツール群をお借りする。

```
git clone https://github.com/shi3z/chainer_imagenet_tools.git
```

二つ目の記事の通りにコードを書き直す。この二つを先にやってしまうと楽。



##画像の用意、教師データとテストデータ
画像は好きなデータセットを使える。[ディレクトリ名/分類クラス名/実ファイル]となっていればなんでも使えるはず。まず最初にすることは、データセットから分類教師データ&テストデータを作る。二つ目の記事の方が用意してくれているプログラムをgit cloneしてそれを使う。
```wget　http://www.vision.caltech.edu/Image_Datasets/Caltech101/101_ObjectCategories.tar.gz
```
を実行してデータセットを用意。二つ目の記事の方が用意してくれているコードを使って
```
python make_train_data.py 101_ObjectCategories
```

することにより画像データを集めたimagesディレクトリと、train.txt, test.txt, label.txtの3ファイルが出力される。中身をみると、train、testは画像へのパスとそれが属する分類クラスの番号が記述されている。

##画像のリサイズ
画像はバラバラなので今回のニューラルネットワークのインプット次元まで下げる必要がある。このために記事で用意してくれているのがcrop.pyである。cropimagesに生成した画像が保存される。ここで、前述したtrain.txt、test.txtには画像へのパスが記述されているが、今回使う画像はcropimagesなので、エディタなどを使って images -> cropimages に置換する。

##学習フェイズ
ここでchainerの[examples/imagenet/]に存在するcompute_mean.pyを使い、meanファイルを生成する。

```
python compute_mean.py train.txt
```
にてmeanファイルを生成する。また後者の記事を参考にプログラムを書き換える。ここで書き換えている内容だが、ざっくり言うとモデルの保存にpickelを使っているのをserializerに変えたりする。この辺はchainerのドキュメントをみて勉強するとよさそう。nin.pyには実際のニューラルネットワークのクラスが記述されている。ここをカスタマイズすることで自分の定義したニューラルネットワークを使って学習ができる。

ここまできても、そのままではcPickel関連でエラーが出る人もいるはず。そこで[ChainerでcPickle.UnpicklingError](http://qiita.com/shota_hayashi/items/4a488931ab88f45cfa55)を参照して68~70行目あたりのmeanファイルを読み込む部分を


```python
mean_image = np.load(args.mean) #meanファイルの読み込み
```

に書き換える。これでようやく実行できるはず。

```
python train_imagenet.py -E 10 train.txt test.txt 2>&1 | tee log
```

この実行によってmodelファイルが出力される。（学習後のニューラルネットワークをダンプしたもの）

##画像分類の実行
冒頭で載せた記事では出力されたmodelを使って、テストデータ外のデータを使って分類がうまく行くかを実験している。手順としてはテストする画像のリサイズ、分類である。
画像は記事にのっているオートバイの画像をそのまま使うとして

```
wget http://www.trago.co.uk/ekmps/shops/tragoshop/images/wk-650i-motorbike-35kw-restricted-version-for-a2-license-available-white-blue-35677-p.jpg

mv wk-650i-motorbike-35kw-restricted-version-for-a2-license-available-white-blue-35677-p.jpg bike.jpg 

mkdir resized
```

あとは実行するだけ

```
python resize.py bike.jpg
python inspection.py resized/bike.jpg
```

画面に結果がでるはず。


#感想
資料がたくさん出回っているのでサンプルを動かして簡単に機械学習が楽しめる。python2.xではなくpython3で動かしたかったのが残念。今後の記事では画像からの顔の切り出しとそれを用いた人物分類をしてみたい。

chainerのサンプルコードはファイル数も多く見えたりするが、学習に使ったのはtrain_imagenet.pyやnin.pyのみであとは教師データを作ったりテストしたりするコードなのでこれらのコードを中心に読めば理解がしやすいかと思う。
raspberryPi3Bを手に入れました。が、、、、

# RaspberryPi3Bを手に入れた

![2017-05-25 00.07.43.jpg](https://qiita-image-store.s3.amazonaws.com/0/179198/00ecabc3-b9a6-2a61-7b20-a40795e9ce2c.jpeg)
これです。

今更感もありますが念願のRaspberryPi3Bです。
このモデルからWifiとBluetoothが組み込まれているのでとても簡単に遊ぶことが出来ます。

# いざセットアップ！...がしかし

公式からRaspbianをダウンロードしブートディスクを作成したところで問題が発生しました。

**我が家には有線のUSBキーボードがない。**

我が家のキーボードとマウスは全てロジクール製のワイヤレスだったのでセットアップが出来ません。（試してませんが多分ドライバとか用意しないといけない）

わざわざ買いに行くのも面倒だなと思ってしまったので今回は"組み込みっぽく"こいつを利用しました。

## Arduino Micro
![2017-06-10-0-33-30.jpg](https://qiita-image-store.s3.amazonaws.com/0/179198/0996df48-d93d-e934-476c-31b70b461301.jpeg)

Arduino Microです。
こいつはLeonardo系のArduinoでPCなどとUSB接続したとき、自身をHIDとして認識させる機能が標準で備わっています。

IDE上に
```#include <keyboard.h>```

この一文を添えてあげるだけでまるでキーボードかのように振る舞うことが出来ます。Aha! So Easy!

今回はこいつを利用してログイン等をして行こうと思います。

## コード

```raspi_init.ino
/*
2017_06_09 S.yagi
Raspi login without keyboard , make ssh file and auto reboot.
*/
#include <Keyboard.h>

const int DERAY_TIME = 3000;  // 3000ms (3sec)

void setup() {
//Serial.begin(9600); // for Debug
Keyboard.begin();
}

void loop() {

char loginID[] = "pi";
char passWD[]  = "raspberry";
char cdBoot[] = "cd /boot";
char touch[] = "sudo touch ssh";
char lsal[] = "ls -al";
char reboot[] = "sudo reboot";

delay(DERAY_TIME);
keyboardTyping( loginID );
delay(DERAY_TIME); 
keyboardTyping( passWD );
delay(DERAY_TIME);
keyboardTyping( cdBoot );
delay(DERAY_TIME); 
keyboardTyping( touch );
delay(DERAY_TIME); 
keyboardTyping( lsal );
delay(DERAY_TIME); 
keyboardTyping( reboot );
Keyboard.end();
while(1);

}

void keyboardTyping(char *text){
  for(int i=0; text[i]!='\0'; i++){
      Keyboard.write(text[i]);
//Serial.write(text[i]); for Debug
  }
//  Keyboard.write(0x0d);  // if windows (CR + LF)
  Keyboard.write(0x0A);    // LF = 0x0A , CR = 0x0D
  return;
}
```

簡単なコードなので説明は省きます。

ただ一つだけ悩んだ点がありました。

### Linuxの改行コード

ん？改行コードって"LF"？"CR"？それともどっちもやったっけ？文字コードは？あれ？

てことで久々にASCIIコード表まで引っ張り出してきました。

```raspi_init.ino(41-42)
//  Keyboard.write(0x0D);  // windows (CR + LF)
  Keyboard.write(0x0A);    // LF = 0x0A , CR = 0x0D
```

コードのココに書いてる通りlinuxではLFが改行コードです。
ついでに間違いなく必要にならないですが、一応Windowsでも使えるようにしておきました。

# 結果

Arduinoは書き込み後、USBでRaspberrypiにおもむろに接続すると自動的に起動します。
後は勝手にAruduinoが

1. キーボードにふりをする
2. IDを打ち込む
3. パスフレーズを打ち込む
4. /bootに移動する
5. sshファイルを作る
6. 一応確認のためにディレクトリの中身を見せてくれる
7. 再起動させる

この一連の流れをやってくれます。

そうして無事に再起動後raspberrypilocalでの接続に成功しました。

ちなみに、この子には
```#include <Mouse.h>```
という特技もあります。ほんとにいい子！

とっさの状況では何が役に立つか分からないものですね！

次はこいつらを使ってなんちゃってIoTシステムを作ってみようと思います。
git branch コマンド

**20190505追記**

- わかりにくい表現を修正しました。
- `git branch -v`コマンドの説明を追加しました。
- `git branch \<branchname>`コマンドの説明に追記しました。

 
****


`git branch`コマンドについて、主にオプションをまとめました。

#表示

##git branch
ローカルブランチの一覧を表示する。

##git branch -r
`-r`、もしくは、`--remotes`オプション。
リモートブランチの一覧を表示する。

##git branch -a
`-a`、もしくは`--all`オプション。
リモートブランチを含んだブランチの一覧を表示する。

##git branch --merged
`--merged`オプション。
HEADにマージ済みのブランチの一覧を表示する。

##git branch --no-merged
`--no-merged`オプション。
HEADにマージされていないブランチの一覧を表示する。

##git branch --color
`--color`オプション。
ブランチの一覧の表示をカラフルにする(デフォルト)。

##git branch --no-color
`--no-color`オプション。
ブランチの一覧を色付きで表示しない。

##git branch -v
`-v`、もしくは`--verbose`オプション。
詳細情報を付与した状態で、ブランチの一覧を表示する。
各ブランチの先頭のコミットのIDとメッセージを表示する。
`-vv`オプションを使用することで、追跡しているリモートブランチの名前を表示する。


#操作

##git branch \<branchname>
現在のHEADから、指定したbranchnameを名前として、新しいブランチを作成する。
新しく作成したブランチへの切り替えは行わない。
切り替えを行う場合は、`git checkout <branchname>` を使用する。
新しいブランチの作成と切り替えを同時に行う場合は、`git checkout -b <branchname>` を使用する。

##git branch -d \<branchname>
`-d`、もしくは、`--delete`オプション。
指定したブランチを削除する。
`-r`オプションを付けた場合は、リモートブランチを削除する。
指定したブランチの内容が、追跡しているリモートブランチ(設定されていない場合はHEAD)にマージされていないと削除できない。

##git branch -D \<branchname>
`-D`オプション。
マージの状態に関わらず、指定したブランチを削除する。

##git branch -m \<new branchname>
`-m`、もしくは、`--move`オプション。
現在チェックアウトしているブランチ名を\<new branchname>に変更する。
`git branch -m <old branchname> <new branchname>`で変更元を指定することもできる。

##git branch -u \<upstream>
`-u`、もしくは、`--set-upstream-to=<upstream>`オプション。
現在チェックアウトしているブランチが、\<upstream>で指定したリモートブランチを追跡するようにする。
`git branch -u <upstream> <branchname>`で対象ブランチを指定することもできる。

##git branch --unset-upstream
`--unset-upstream`オプション。
現在チェックアウトしているブランチが追跡しているリモートブランチがあった場合、そのひもづきを解除する。
`git branch --unset-upstream <branchname>`で対象ブランチを指定することもできる。
twitterからbanをうけないようにAPIで自動フォローするためのまとめ

twitterルールを読む限り自動フォローに対して厳しく取り締まっているように思えます。
ただ、
具体的に何件自動フォローしてもtwitterにbanされないのか明記しているわけではないのでまとめました。
学びはまとめると３つ。

- 「数百件の無差別自動フォローはだめ」
- 「システム制限とは別に過剰フォローチェックしてるので注意」
- 「フォローチャーン、だめ。」

でした。

以下、twitterルール（[https://support.twitter.com/articles/249071](https://support.twitter.com/articles/249071)）のまとめです！


⓪フォローリミット自体は１０００件。（禁止している過剰なフォロー行為に当たるかどうかは別で判断）

```
現在のTwitterリミット　

アカウントに対して設けている現在の仕様上のリミットは以下の通りです。
-  ダイレクトメッセージ (1日): 1日に送信できるメッセージは1,000件に制限されています。
-  ツイート: 1日に2,400件。1日のツイート投稿リミットは、さらに30分間隔の細かいリミットに分かれます。リツイートもツイートとしてカウントされます。
-  アカウントの登録メールアドレスの変更: 1時間に4回。
-  フォロー (1日): 仕様上のフォローリミットは1日に1,000件です。これは、仕様上のアカウントリミットのみを示しており、これ以外に過剰なフォロー行為などを禁止するルールが設けられていることにご注意ください。フォローリミットの詳細については、「フォローに関するルールと留意点」ページをご覧ください。
-  フォロー (アカウントベース): 1つのアカウントで5,000件を超える他のユーザーをフォローすると、それ以降のフォローはアカウントごとの特定の比率に基づき制限されます。詳細については、「フォローに関するルールと留意点」ページをご覧ください。
```

①自動化による過剰なフォローは制限している。（https://support.twitter.com/articles/237504）

フォローとフォロー解除の自動化: Twitterアカウントを大量または無差別にフォローしたり、フォロー解除したりしないでください。過剰なフォローはTwitterルールで禁止されています。詳しいルールについては、「フォローに関するルールと留意点」をご覧ください。また、ユーザーがフォロワーを増やせると謳うアプリケーションも、Twitterルールで禁止されています。
＊過剰なフォロー：注目を集めるために数百件のアカウントを無差別にフォローすること（https://support.twitter.com/articles/251786）

```
②適度な自動フォローは禁止していない（https://support.twitter.com/articles/251786）

「基本的に1日数百件のアカウントのフォローやフォロー解除を繰り返したり、アカウントのフォローを自動化したりしていない限り問題ありません。」
```

```
③注意点 システム制限を超えなくても過剰なフォロー行為と認定されればアカウント凍結される。

1日の上限または合計の上限に達すると、「スパムアカウントによる目に余る行為を制限し、サイトへの負荷を防ぐために設けられたシステム制限に達しました」という旨のエラーメッセージが表示されます。これらはシステムによってアカウントにかけられる制限です。しかしそれ以前に、過剰なフォロー行為はTwitterで禁止されています。これらの行為を行うと、アカウントのフォロー数とフォロワー数の比率に関わらず、アカウント凍結に至る可能性があります。
```

④会員登録で自動フォローを実装した場合、いたずらでユーザーに登録退会を繰り返されたらフォローチャーンにあたる行為になってアカウントがbanされるかもしれない。
https://support.twitter.com/articles/251786

```
過剰なフォローチャーンとは？

あるアカウントをフォローした後で気が変わった場合、そのアカウントのプロフィールページに移動してフォローを解除できます。過剰なフォローチャーンとは、アカウントのフォローとフォロー解除を大量に繰り返すことです。この行為は多くの利用者の注目を集めたり、Twitterの制約を回避したり、フォロワー数とフォロー数の比率を変えたりするために行われます。これらの行為は一般的なスパムの手法であり、Twitterの他の利用者に良くない印象を与えるほか、アカウントの凍結につながることがあります。
```

＊何回ぐらいフォローと解除を繰り返したら、過剰なフォローチャーンとされるかはわからんどぅ。


##おまけ：具体的に何に注意したか。

絶対にバンだけは起こしたくなかったので、
アンパイな自動フォローを実装になるよう以下２点に注意しました。
実装後のbanは起きていません。というご報告でした:innocent:

・②より「1日数百件」の自動フォローは禁止しないと明記していたので、100件を超えないこと。
・②、④よりフォローチャーンを１００件以上起こさせないこと。
AzureのVMでLAMP立ち上げたけどMySQLのパスワードがわからない。

# 問題
Microsoft AzureのVirtual Machinesでbitnami提供のLAMPを作ったけどアプリケーションとMySQLのrootのパスワードが分からない。

# 解決策
mysqlのrootのパスワードは初回ブート時にランダムで自動生成される。
Azureの管理画面からVMのブートログを確認するとパスワードが出力されている。
https://docs.bitnami.com/azure/faq/#how-to-find-application-credentials
さくらクラウドからMicrosoft AzureにWordpressを移行する。

さくらクラウドからMicrosoft AzureにWordpressを移行した時のメモ
パスとか間違ってるかもしれないので適宜読み替えてください。。。

# AzureにLAMP環境を構築
以下の手順でVirtual Machinesのインスタンスを立てる。
http://qiita.com/ArtemisHaD/items/ab55c2d78735e0c9eafe
ただし、環境の構築がめんどかったのでLAMP環境構築済みのBitnami公開のLAMPを選択。

# 旧サーバで(Sakura)
'''
mkdir /home/admin/20170609
cd /home/admin/20170609
```

## DBのdump
```
mysqldump -u wordpress -p wordpress > wordpress_20170609_dump.sql
```

## ファイルの圧縮
```
zip -r ./wordpress_20170609.zip /var/www/wordpress
```

# ローカルで(Mac)
```
mkdir 作業ディレクトリ
cd 作業ディレクトリ
scp -r sakura:/home/admin/20170609 ./
scp -r 20170609 azure:/home/artemis
```
# 新サーバで(Azure)

# ファイルの復元
ぐちゃぐちゃですみません。。。
```
cd 20170609/
unzip wordpress_20170609.zip

cd /opt/bitnami/apache2/htdocs/
rm -rf ./*

cd
cd 20170609/
cd var/www/
sudo mv ./wordpress /opt/bitnami/apache2/htdocs

cd /opt/bitnami/apache2/
sudo chown -R bitnami:daemon ./htdocs
```

# DBの復元
mysqlのrootのパスワードは初回ブート時にランダムで自動生成される。
Azureの管理画面からVMのブートログを確認するとパスワードが出力されている。
https://docs.bitnami.com/azure/faq/#how-to-find-application-credentials
```
mysql -u root -p
```
```
CREATE DATABASE wordpress DEFAULT CHARACTER SET utf8;
GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpress' IDENTIFIED BY 'password';
```
```
mysql -u wordpress -p wordpress < /home/artemis/20170609/wordpress_20170609_dump.sql
```

# apacheの設定変更

```
sudo vi /opt/bitnami/apache2/conf/httpd.conf
```
```:httpd.conf
    # AllowOverride None
    AllowOverride All
```
```
sudo apachectl restart
```

# あとはDNSを変更すればほら
Room Persistence Library さわってみたメモ

*このメモはα版リリース直後の検証を元に書いています。現在は古い情報もあるため注意してください（AACは公式ドキュメントが充実しているので、そちらに目を通すのが良いと思います）。*

## Room Persistence Library
Google I/O 2017で発表のあったAndroid Architecture Componentsのひとつ。
SQLiteDatabaseの薄いラッパーのようなものだと理解しています。

## 実際に少しさわってみたメモ
こちらの[チュートリアル](https://developer.android.com/topic/libraries/architecture/room.html)を見て実際に少しさわってみましたが、ここに書いてある通りに実装すれば特に困るようなこともなさそうです。
実装でありがちなパターンで、チュートリアルのサンプルコードになかったものをいくつか試してみたのでメモ書きです。

#### トランザクション管理
トランザクション管理系のメソッドは`RoomDatabase`で定義されているので（実際は`SupportSQLiteDatabase`の同名メソッドのラッパー）、トランザクション管理も通常の`SQLiteDatabase`と同様に可能です。

```java:UpdateSomeTables.java
private MyDatabase mDb;

public void update(MyEntity1 entity1, MyEntity2 entity2) {

    mDb.beginTransaction();
    try {
        mDb.myEntityDao1().update(entity1);
        mDb.myEntityDao2().update(entity2);
        mDb.setTransactionSuccessful();
    } finally {
        mDb.endTransaction();
    }
}
```       
追記： 正式バージョンの1.0.0では`@Transaction`アノテーションが追加されているため、`Dao`のメソッドに宣言することでトランザクション管理が可能です。

#### Entityを使わずにUPDATE/DELETEする
データ操作は基本的に`Dao`クラスで`@Insert`,`@Update`,`@Delete`アノテーションを使用します。この場合、メソッドの引数は[Entity](https://developer.android.com/topic/libraries/architecture/room.html#entities)になりますが、条件に合致するレコードの特定カラムだけ更新したいといった場合は、`@Query`アノテーションでDMLを記述するほうが簡単です。

> @Query is the main annotation used in DAO classes. It allows you to perform read/write operations on a database. 

read/writeと書かれているのでなんでもOK。

```java:MyDao.java
// Entityを使ったUpdate
@Update
void update(MyEntity entity);

// 条件でUpdate
@Query("UPDATE my_entity SET name = :name WHERE id = :id")
void update(String name, String id);

// Entityを使ったDelete
@Delete
void delete(MyEntity entity);

// 条件でDelete
@Query("DELETE FROM my_entity WHERE id = :id")
void delete(String id);

// 全件Delete
@Query("DELETE FROM my_entity")
void delete();
```

#### レコード件数
`SQLiteDatabase`をそのまま使った場合は`DatabaseUtils#queryNumEntries`等を使うことが多そうですが、こちらも`@Query`でそのまま書いて大丈夫でした。検索結果格納用のクラスを定義する必要もなく、そのまま`long`で返してくれるようです。

```java:MyDao.java
// 件数取得
@Query("SELECT COUNT(*) FROM my_entity")
long count();

// 条件指定
@Query("SELECT COUNT(*) FROM my_entity WHERE name LIKE :name")
long count(String name);
```

#### 既存のSQLiteDatabaseにRoomを適用する
すでに`SQLiteDatabase`を使用しているプロジェクトに`Room`を追加する場合は、`Entity`の定義さえ合っていればそのまま既存のDBを使用できます。
注意する点としては、DBのスキーマバージョンを上げることと、上げたバージョンに対応する**空の**`Migration`を定義することです。

例えば、元のスキーマバージョンが5の場合は
- `Room`適用時にバージョンを6に上げる
- 5から6への`Migration`クラスを定義する
- `Migration5_6#migrate`メソッドの中に処理は書かない

となります。
`Room`が管理用のマスタテーブルを追加することでスキーマの構成が変わるので、バージョンを上げる必要があるためです。


## 感想
今のところ使いやすいです。
`SQLiteDatabase`を使ってるということを忘れることがない（過度に隠蔽していない）ので、もともと生SQLばっかり書いてた私のようなおっさんでも直感的にさわれます。
あとクエリがアノテーションに書けるので、コードが見やすくなったと思います。
Pythonからはじめる数学入門　勉強メモ Vol.1

# Pythonからはじめる数学入門
　O'Reilly Japanで販売されている「Pythonからはじめる数学入門」を読み進めていく中で、特に気になったところなどをまとめていく。
https://www.oreilly.co.jp/books/9784873117683/
# 1章　数を扱う
## 分数を扱う
　Pythonで分数を扱うために、[fractions](https://docs.python.jp/3/library/fractions.html)モジュールが利用できる。

```python:fractions_.py
from fractions import Fraction
a = Fraction(1, 2) # Fraction(1, 2)
b = a + 1 + 1.5 # 3.0
```
　Fraction(分子, 分母)の形で分数を利用できる。式の途中に浮動小数点があると、結果を浮動小数点で返す。
　fractionsモジュールは有理数計算をサポートするもの。

## 複素数を扱う
　Pythonで複素数を扱う場合、文字"j"または"J"を用いる。（電気工学の分野では、"i" or "I"は電流を表す記号として使っている。）
複素数1+2iは、1+2jと書く。

```python:complex_.py
a = 1 + 2j
b = complex(3, 4) # (3+4j)

a + b # (4+6j)
a - b # (-2+2j)

a.real # 1 実部
a.imag # 2 虚部

c = a.conjugate() # (1-2j) 共役複素数
d = abs(a) # 2.23606797749979 複素数の大きさ
```
　complex()関数を使って複素数を定義することができる。complex(x, y)など変数を代入して定義できる。
　共役(conjugate)複素数は実部が同じで虚部の符号が逆になった複素数。conjugate()メソッドを使って得ることができる。
　複素数の大きさ（magnitude）は、abs()関数で求めることができる。実数では絶対値を返すが、複素数に用いると大きさを返す。

[cmath](https://docs.python.jp/3/library/cmath.html?highlight=cmath#module-cmath)モジュールを使うことで複素数を扱う他の関数を利用できる。

```python:cmath_.py
from cmath import *
a = 1 + 1j
phase(a) # 0.7853981633974483 偏角を浮動小数点で返す。返り値は、[-π, π]の範囲。
polar(a) # (1.4142135623730951, 0.7853981633974483) 直交座標から極座標に変換できる。 (x, y) → (r, Θ)
```