OmniAICreator/Qiita-1.07M huggingface dataset:
よく使うファイルをすぐ編集できるGitプラグインを作ってみた


普段よくやっていることをちょっとしたエイリアスにしていたんだけど、Gitプラグインを作って公開してみたくなったのでやってみた
ちょっと汎用化が足りないので、需要があるかは謎

## 概要
git管理下でよく編集するファイルをリストアップしておき、そのリストを[`percol`](https://github.com/mooz/percol)で絞り込みサクっと編集する
git管理下であればどこで実行しても正しいファイルパスで編集できる

## 動作環境
pythonは2.7で動作を確認した
3系での動作は未確認

## インストール
### git-quickedit
```
wget 'https://raw.githubusercontent.com/suzuki-hoge/dev-note/master/git-quickedit/git-quickedit'
```

上記の方法等で取得したファイルをパスの通った場所に置いてください
`git-xxx`という実行ファイルをパスの通った場所に置くと、`git xxx`で実行できます

### percol
```
sudo pip install percol
```

pipを用いない方法は[公式](https://github.com/mooz/percol#installation)を参照してください

## パスリスト
よく使うファイル名をテキストで管理します

### パス
特に明記が無い場合は`~/.git_quickedit`と言うファイルを用います

リポジトリ毎に変更したい場合は以下の様に`.git/config`に追記してください

```
git config quickedit.pathlist /Users/xxx/project-xxx/Dropbox/.git_quickedit
```

リポジトリ毎ではなくグローバルなパスリストを設定する場合は以下の様に`~/.gitconfig`に追記してください

```
git config --global quickedit.pathlist /Users/xxx/Dropbox/.git_quickedit
```

パスリスト検索は以下の順で行われます

1. リポジトリ固有の`.git/config`の設定場所
+ グローバルの`~/.gitconfig`の設定場所
+ `~/.git_quickedit`

また、指定されたパスに実ファイルが見つからなかった場合は新規作成を促すガイドが表示されます

### 内容例
```
.github/ISSUE_TEMPLATE.md
.github/PULL_REQUEST_TEMPLATE.md
.github/CONTRIBUTING.md
.git/config
.gitignore
README.md
```

僕はgithubのルールに則ったテンプレートファイルや良く触るファイルを定義しました
他には`.git/hooks/pre-push`なんてフックスクリプトとかを列挙しておいても良いかもしれません

## コマンド
### git template help
ヘルプを表示する

![help.png](https://qiita-image-store.s3.amazonaws.com/0/113398/9c2633f9-7b53-e3ae-a9ad-dc5617c62538.png)

### git template list
パスリストの参照をする

![list.png](https://qiita-image-store.s3.amazonaws.com/0/113398/e00b31d7-e90d-381a-ecfa-aa7458ebed59.png)

### git template manage
パスリストの編集をする

![manage.png](https://qiita-image-store.s3.amazonaws.com/0/113398/f2a7ee90-9f96-226a-827e-fad4f76ddeb8.png)

### git template new
リストの中の**実在しないパスのみ**を`percol`で選択し、`vim`で編集する

![new01.png](https://qiita-image-store.s3.amazonaws.com/0/113398/28579cbf-21aa-1612-c9da-bff058c63657.png)
![new02.png](https://qiita-image-store.s3.amazonaws.com/0/113398/f11b6515-bb43-eb39-e012-6433b50dbe7c.png)

### git template write
リストの中の**実在するパスのみ**を`percol`で選択し、`vim`の無名バッファで編集する
`write`は実在するファイルを開き編集するが、保存することは出来ない

![write01.png](https://qiita-image-store.s3.amazonaws.com/0/113398/d33f48c5-bf00-10fa-e6b1-61c134f4510e.png)
![write02.png](https://qiita-image-store.s3.amazonaws.com/0/113398/b56c216e-b03f-f9a2-5240-df14001e7661.png)
![write03.png](https://qiita-image-store.s3.amazonaws.com/0/113398/f56525c2-2958-2479-5c91-14ee05bf6a6c.png)

### git template edit
リストの中の**実在するパスのみ**を`percol`で選択し、`vim`で編集する

保存可能な点以外は`write`と同じ

## やってみたかったこと
+ 丁寧な例外処理
+ git.configを使った設定
+ 公開と配布
+ インストール数を知る
 + GitHubのTraficと言う画面でわかるらしい

## 対応しなかったこと
+ エディタは`vim`固定じゃあなくて`git`で使うエディタを参照してきても良かった
 + とりあえず自分用なので`vim`固定
 + いつか対応するかも
+ `percol`の部分も同様に`peco`と選べても良かった
 + 未対応理由は同上

## 感想
IssueやPRをブラウザで書くときにどうしても`vim`で書きたくて作った
要は`write`が一番やりたかったことで、他のはプラグインとしての体裁を保つためのおまけ

何にせよ晒すと思うとこういう場合の終了コードは普通どうなんだろう？とか色々既存品読んだりして勉強にはなった
組織・チームの補助的なところの思考実験 にゃ

## 背景

下記のことが継続？浸透しないなぁという印象からやってみた
＋スライドの実験

- ナレッジ共有/コアコンピタンス明確化/文化形成
- 行動指針(クレド)/研修/勉強会/人事評価

うまくいくのかなぁ・・・・

---

## tl;dr

[ソラコムの「リーダーシップ・ステートメント」の公開](https://blog.soracom.jp/blog/2016/09/30/leadership-statement/)

[Kaizen Platform, Inc. エンジニア行動指針](https://medium.com/kaizen-product-team/kaizen-platform-inc-%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E8%A1%8C%E5%8B%95%E6%8C%87%E9%87%9D-6623d7aca4c2#.ynvmbxcej)

は素晴らしいことだと思う。

が実際どれくらいスタッフ・メンバーに浸透しているのだろう・・・というのがあって
どうすれば良いかとかを思考実験してみた

---
## 実験の準備

「施策」を行なって、結果的に「成果」につながる形の因果関係で考える。あと制約として、「施策」からの成果物が「成果」への「要因」としてあるとする。

施策 → 要因 → 成果  の流れ

---

## 実験の思考関係

下の関係性でうまくいかないケースとして思考実験をしてみる。

成果：イノベーション/経済的利益/社会的貢献/人材採用
 ↑
要因：ナレッジ共有/コアコンピタンス明確化/文化形成
 ↑
施策：行動指針(クレド)/研修/勉強会/人事評価

---
## 実験の条件


実験の条件は以下とします

- 施策を行うことをメンバー共有
- メンバーには要因に該当することを施策の成果物として伝えていない 
- 成果について、フィードバックをしない


（これがすべての原因と言える感じはありますが・・・）

---
## うまくいくためには

以下の条件を満たす必要が想像できます。

* 施策の共有時に、以下もセットで共有する
    * 施策の成果物
    * 成果物に関連/影響する事項
* 実際やってどうだったか？をフィードバックをする
MMDモデルを使用したデスクトップユーティリティの開発 その8 PMX読み込み

前: [その7](http://qiita.com/JI1LDG/items/ff6185456138bbd35289)
次: [その9](http://qiita.com/JI1LDG/items/7d8f02421dcdc6d83143)

今回も短いです。
##今回やること
PMXの読み込みクラスを作る。
PMDとPMXを読み込んだデータを共通化し、表示できるようにする。
今回のソース: [MmdFileViewer](https://github.com/JI1LDG/MmdFileLoader/tree/c49f331315779f70a48581f0960669f2cc862af9), [ModelViewer](https://github.com/JI1LDG/ModelViewer/tree/5f415044893aa503db22e5671d6a995d99a4d07e)

##PMX読み込み
PMXのフォーマットは、PMDEditorに同梱されているので、参考にする。
基本的に、PMDと同じ要領で読み込んでいけばいいが、PMDよりも構造が複雑であったり、テキストバッファやエンコーディングの扱いに注意が必要。

描画に必要なマテリアルまでを読み込むクラスを作った。

##データの共通化
PMD, PMXの読み込みができるようになったので、共通のフォーマットを用意して、(描画するプログラムから見て)扱いやすくさせる。

![iso_dx.png](https://qiita-image-store.s3.amazonaws.com/0/135830/af1b52b8-0af5-4522-0c6b-dc995ecf6078.png)
とらはぜ式磯波(PMX)

##さいごに
次回からはスキンメッシュの準備にとりかかりたいと思います。

欲を言えば、アンチエイリアスとか輪郭線を付けたいのですが、うまく描画ができないですね。
django geodjango tutorialでつまったときに参考にした（編集中）

```
python manage.py runserver
....
OSError: /usr/lib/x86_64-linux-gnu/libspatialite.so.7: undefined symbol: freexl_version
```

http://trac.osgeo.org/postgis/wiki/UsersWikiPostGIS22UbuntuPGSQL95Apt

https://www.gaia-gis.it/fossil/libspatialite/index

https://www.gaia-gis.it/fossil/freexl/index

https://www.gaia-gis.it/spatialite-2.3.1/how_to_build_libspatialite.html#linux
アレな人でも使える 使い捨てWP環境を整える


Docker とか Vagrant はエラー対応で詰むので、責任持たなきゃいけないケースでは余りオススメしたくない

Xampp や MAMP もエラー対応が面倒。よくわかんない環境になりガチ。

「困ったら再インストールしろ！」で投げられるお手軽環境が欲しいとき向けのCLIベースWordPress 環境構築を。

## 設計方針

- wp cli でなんとかする。
- WordPress 本体は core download で

## wp コマンド

多分グローバルに入ってない人もいる & グローバルのバージョン管理面倒、なので、composer 経由で入れてもらう。

composerは入っていない人もいるので、Makefile なりを作って適宜引っ張ってこれるようにしておいてあげる。

````
composer:
	curl -sS https://getcomposer.org/installer | php
````

以下のコマンドでWordPress本体を引っ張ってきてconfigファイルの設定まで整えられる。

````
$ vendor/bin/wp core download
$ vendor/bin/wp core config
````

## プラグイン

plugin install コマンドでプラグインの導入は可能。プラグインのファイル一式は事前にもっていてもいいが、
activate だけはしないと行けないので注意。

````
$ vendor/bin/wp plugin install contact-form-7 --activate
````



## テーマ

テーマはおそらくいちばん手の入るところなので、composerで導入できるように。
composer installer を使えばローカルに配置したWordPress テーマをテーマフォルダに自動配置出来る。

````
/themes/mytheme/
/www/wp-content/
/www/wp-incluedes/
/www/wp-admin/
````

みたいなフォルダ構成の場合、`/themes/mytheme/composer.json`に以下の様な内容を追記。
name は任意の構成で良い。

````
{
    "name": "vedorname/mytheme",
    "type":"wordpress-theme",
    "authors": [
        {
            "name": "mikakane",
            "email": "mikakane2@gmail.com"
        }
    ],
    "require": {}
}
````

あとは親のcomposer.json で次のような記述を入れれば `composer install`で全てはよしなに進む。

````
    "repositories":[
        {
            "type":"path",
            "url": "./themes/mytheme/"
        }
    ],
    "require": {
        "composer/installers": "^1.2",
        "vendorname/mytheme": "dev-master",
        ...
    },
    "extra": {
        "installer-paths": {
            "wordpress/wp-content/themes/{$name}": ["type:wordpress-theme"]
        }
    }
```` 

テーマの有効化には `theme activate` コマンドが有効

````
$ vendor/bin/wp theme activate {theme_name}
```` 



## データ

インポートツールを使ってファイル読み込み。
WordPress Importerが必要になるのでプラグインで以下を導入できるように。

````
vendor/bin/wp plugin install wordpress-importer --activate
````

## その他

色々と細かい設定とかもあるのでその辺も極力コマンドで済ませたい。

パーマリンクの設定

````
$ vendor/bin/wp rewrite structure '/%category%/%post_id%/'
````

デフォルト投稿の削除

````
$ vendor/bin/wp post delete 1
````

タクソノミーの再集計(インポート後のエラーとかに)

````
$ vendor/bin/wp term recount {taxonomy_name}
````
値が配列になっている連想配列の処理(Javascript)

- 値が配列になっている
- その配列の要素数はキーごとに異なる

そんな連想配列(オブジェクト)の処理についてのメモ
例えばこんな感じのオブジェクト

```javascript
var obj = {
  key1 : [
    "value1-1", "value1-2", "value1-3", "value1-4", "value1-5"
  ],
  key2 : [
    "value2-1", "value2-2", "value2-3"
  ],
  key3 : [
    "value3-1", "value3-2", "value3-3", "value3-4"
  ],
  key4 : [
    "value4-1"
  ],
  key5 : [
    "value5-1", "value5-2", "value5-3"
  ],
}
```

# 各キーに対する配列内の要素すべてにループ処理
要は「値となっている文字列すべてに同じ処理をする」場合。
`Object.keys`でキー配列を取得し、`forEach`でループを回す。`forEach`の第二引数に元のオブジェクトを入れると、ループ内でthisとして扱えるので楽。
`forEach`が２つ並ぶのが綺麗じゃない気がするけどどうなんだろう。

```javascript
Object.keys(obj).forEach(function(key) {
  this[key].forEach(function(val) {
    console.log(val); // -> "value1-1", "value1-2", ... "value5-3"
  });
}, obj);
```

もしくはこう。

```javascript
Object.keys(obj).forEach(function(key) {
  for(val of this[key]) {
    console.log(val);
  }
}, obj);
```

# 特定の文字列が配列内に含まれているか調べる
同じく`Object.keys`でキー配列を取得し、`forEach`でループを回す。
`targetStr`が配列内に存在しない場合`indexOf(targetStr) = -1`となるので、0以上の場合に含まれているとみなす。

```javascript
var targetStr = "value3-3";
Object.keys(obj).forEach(function(key) {
  if(this[key].indexOf(targetStr) >= 0) {
    console.log(key); // -> key3
  }
}, obj);
```
VBA.SendKeysでキーボードのロックが外れる現象への対策

#1. 現象
操作の自動化の最終手段であるSendKeysですが、VBAのSendKeysにはバグが存在します。

>Misrosoftサポート
[[BUG] 複数の SendKeys ステートメントが実行されると NumLock キーがオフになる][SendKeysBug]

リンク先にあるように、VBAでSendeKeysステートメントを使用すると、NumLockなどが外れることがあります。

#2. 対策：他のSendKeysを使用する
"Windows Script Host Object Model"の"WshShell"オブジェクト（ProgID："WScript.Shell"）のSendKeysステートメントでは上記の問題は発生しません。

##WshShellのSendKeysをラップする
WshShellのSendKeysを使えば良い、といっても参照設定を追加するのも面倒だし、CreateObjectするのも面倒、ということでサブルーチン化したものがこちらです。

```vb
Public Sub wshSendKeys(Keys As String, Optional Wait As Boolean = False)
    'メモリ効率より動作速度を優先する場合
    Static wshShell As Object
    If wshShell Is Nothing Then Set wshShell = CreateObject("WScript.Shell")
    Call wshShell.SendKeys(Keys, Wait)
End Sub
```
毎回CreateObjectすると負荷が大きくなるので、Static宣言+存在判定をしています。
代わりにオブジェクトを破棄する方法が無くなるので、wshShellオブジェクトがメモリに残り続けます。

#3. その他
##AppActivate
WshShellのAppActivateもVBAのものと動作が異なるので状況によっては使い道があります。

具体的には、
VBAでは該当ウィンドウが存在しないときはエラーとなりますが、WshShellではAppActivateが成功したか、失敗したかがBooleanで戻ってきます。

##力技
>[NumLock/CapsLockのオン・オフを取得する][WordNumLock]

にあるように、WordのApplicationオブジェクトからNumLockなど状態を取得できます。
これを使って、初期状態を保存しておき、VBA.SendKeys後に元に戻すという事もできなくもないです。

#参考
+ [[BUG] 複数の SendKeys ステートメントが実行されると NumLock キーがオフになる][SendKeysBug]

+ [NumLock/CapsLockのオン・オフを取得する][WordNumLock]



[SendKeysBug]:https://support.microsoft.com/ja-jp/kb/179987  "[BUG] 複数の SendKeys ステートメントが実行されると NumLock キーがオフになる"

[WordNumLock]:http://www.ka-net.org/office/of39.html#n60 "NumLock/CapsLockのオン・オフを取得する"
【個人的メモ】たのしいRuby第5版を読んで勉強

#はじめに
たのしいRubyの個人的メモです。
読みならが随時追加していきます。

#第１章　はじめてのRuby
## 文字列オブジェクトの区切り文字「"hoge"」と「'hoge'」の違い
### 「"hoge"」の場合
改行などを表現したい場合は特殊文字（バックスラッシュ「\」の後に文字を記述）を使用する。

```ruby:main.rb
puts "hoge\nhoge\n"
```

```
$ ruby main.rb
hoge
hoge
```

### 「'hoge'」の場合
特殊文字の解釈をせず、シングルクォート「''」で括られた文字がそのまま出力される。

```ruby:main.rb
puts 'hoge\nhoge\n'
```

```
$ ruby main.rb
hoge\nhoge\n
```

例外として、「\」「'」をそのまま文字列として出力したい場合は文字の前に「\」をつける。

```ruby:main.rb
puts 'hoge\\ho\'ge'
```

```
$ ruby main.rb
hoge\ho'ge
```

## メソッド呼び出し
### カッコ「()」は省略可能
上の記事でもカッコついてませんね。
```ruby:main.rb
puts 'hoge\nhoge\n'
```

```
$ ruby main.rb
hoge\nhoge\n
```

## pメソッド
### オブジェクトの内容を出力

```ruby:main.rb
str = "hoge"
array = ["hoge1","hoge2","hoge3"]
has = {"hogex"=> "hoge1","hogexx"=>"hoge2" }

p str
p array
p has
```

```
$ ruby main.rb
"hoge"
["hoge1", "hoge2", "hoge3"]
{"hogex"=>"hoge1", "hogexx"=>"hoge2"}
```

## ppメソッド
### オブジェクトの内容を改行して出力

```ruby:main.rb
require "pp"

has = [
  {"hogex"=> "hoge1","hogexx"=>"hoge1" },
  {"hogex"=> "hoge2","hogexx"=>"hoge2" },
  {"hogex"=> "hoge3","hogexx"=>"hoge3" }
  ]

p has
pp has

```

```
$ ruby main.rb
[{"hogex"=>"hoge1", "hogexx"=>"hoge1"}, {"hogex"=>"hoge2", "hogexx"=>"hoge2"}, {"hogex"=>"hoge3", "hogexx"=>"hoge3"}]
[{"hogex"=>"hoge1", "hogexx"=>"hoge1"},
 {"hogex"=>"hoge2", "hogexx"=>"hoge2"},
 {"hogex"=>"hoge3", "hogexx"=>"hoge3"}]
```

#第４章　オブジェクトと変数・定数
## 変数

```
 _hoge  # ローカル変数
 $hoge  # グローバル変数
 @hoge  # インスタンス変数
 @@hoge # クラス変数
```
AWS EB CLIのメモ帳 （Mac OS Xターミナル編）

AWSのEB CLIで使っていたコマンドを忘れないうちにメモっておきます。

* 有効なprofileを確認はcredentialsファイルを確認し、括弧内`[]`はprofileになります。

```
cat ~/.aws/credentials
```

* プロジェクットのセットアップ

```
eb init --profile=XXX
```

* eb sshのセットアップ

pemファイルを`{HOME_DIRECTORY}/.ssh`フォルダの配下に配置すれば良いです。.ssh/configの設定は不要ですが、pemのファイル名はawsからダウンロードしてそのまま使うことです。
Could not insert new outlet connectionエラーへの対処

UIStackViewのIBOutletを追加するためにstoryboardから.swiftファイルのdistributionButtonとallignmentPickerViewの宣言の間にドラッグしたところ、以下のようなエラーが出ました。

```
Could not insert new outlet connection: Could not find any information 
for the class named allignmentPickerView
```

![error.gif](https://qiita-image-store.s3.amazonaws.com/0/100736/b7efbb05-331f-a137-f38e-d9714279c0c8.gif)

`Could not insert new outlet connection`でググると以下の資料が出てきました。

* [Xcode でCould not insert new outlet connection が出て story board と controller の紐付けができなくなった時](http://kappa-game.hatenadiary.jp/entry/2016/02/18/Xcode_でCould_not_insert_new_outlet_connection_が出て_story_board_と_controller_の紐付けができなく)
* [Xcodeのストーリーボードでボタンをドラッグアンドドロップ出来ない問題](http://qiita.com/nagahori/items/71c1940319d35fa886f5)

ただ今回の場合はもう一度よくエラー文を見ると、ドラッグした部分のすぐ下に宣言した`allignmentPickerView`という文字列が含まれていることに気づきます。

まさかと思いdistributionButtonとallignmentPickerViewの間に1行空行を入れて、空行めがけて再度ドラッグしたら無事IBOutlet作成できました。行間を狙ってドラッグしたつもりが、既存の宣言の上にドラッグしたことになっていたようです。
Windowsの細かな設定、ショートカット



## 基本操作

| 操作 | キー | その他 |
|:------------:|:------------:|:------------:|
| トラックパッド有効／無効 |Ctrl + F1 | トラックパッドの有効無効のショートカット（VAIO® Pro 13  mk2）の場合 |
|Windowsタスクマネージャの起動|Ctrl+Shift+ esc|-|
|システム構成|Windowsボタンの後msconfig|-|
PHPでBASIC認証


[無料でSSL証明書](http://qiita.com/lumbermill/items/2aa8b1833ee9bf23f65f)の取得が簡単になった今、ひょっとしてBASIC認証の仕組みって意外と便利に使えるのではないでしょうか。Railsと同じ要領で使えるメソッドを書いてみました。


```
function http_basic_authenticate_with($name,$password,$realm = "Protected area"){
  if (!isset($_SERVER['PHP_AUTH_USER']) || !($_SERVER['PHP_AUTH_USER'] == $name && $_SERVER['PHP_AUTH_PW'] == $password )) {
    header('WWW-Authenticate: Basic realm="'.$realm.'"');
    header('HTTP/1.0 401 Unauthorized');
    echo 'Not allowed to access.';
    exit;
  }
}
```

PHPスクリプトの先頭に記述するとBASIC認証が必要なページになります。

```
http_basic_authenticate_with("user","pass");  
```

客先へのプレビューの際や、ちょっとした管理機能の運用なんかには必要十分かと思います。ソースコードにパスワードが残ると困る場合は、「$_ENV」などを使って外部の値を渡す方法もあります。

## 参考URL
http://php.net/manual/en/features.http-auth.php
Grunt環境設定



## 使うプラグインのコマンド
-  grunt.loadNpmTasks('grunt-contrib-concat');
-  読み込みプラグインの末尾の単語を入れる（grunt concat）



引用：<a href="http://webdrawer.net/javascript/firstgrunt.html" target="_blank">今更だけどやるgrunt入門編・インストールから基本的な使い方｜WEB Drawer</a>
引用：<a href="http://kojika17.com/2013/03/grunt.js-memo.html" target="_blank">Web制作で面倒な作業を自動化するビルドツール、Grunt v0.4 入門｜Web Design KOJIKA17</a>

引用：<a href="http://geckotang.tumblr.com/post/29117250620/windows7%E3%81%A7nodejs%E3%81%A8gruntjs%E3%82%92%E5%8B%95%E3%81%8B%E3%81%99" target="_blank">windows7でnode.jsとgrunt.jsを動かす - < /gecko ></a>

引用：<a href="http://blog.webcreativepark.net/2013/08/28-010250.html" target="_blank">Gruntで始めるWeb制作の自動化 - to-R</a>
chainerインストールメモ（ windows10 python3.5 cuda8.0 ）

#はじめに

最近CUDA Toolkit 8.0 がリリースされてVisual C++ 14.0対応になったようです。
http://docs.nvidia.com/cuda/cuda-installation-guide-microsoft-windows/#axzz4LpboNmuU

またいつの間にか、Visual studio 2015 の Visual C++ 14.0コンパイラ部分が独立して、[Visual C++ Build Tools] (http://landinghub.visualstudio.com/visual-cpp-build-tools)
としてインストールできるようになっていたので、Visual studioなしでもCUDAが動かせそうです。

このため、今までよりもWindowsでのchainerのGPU計算環境の構築が少し簡単になりそうなのでやってみました。

※注意　2016/12/20時点でChainer v1.19.0ではインストールに失敗するので、Chainer v1.18.0をインストールしてください。[dsannoさんより修正のリクエスト]
(https://github.com/pfnet/chainer/pull/2031)が上がっているので、v1.20.0では解消されそうです。
⇒(2017/2/24追記）chainer v1.21.0では解消されていました

#環境、インストールしたもの
- Windows 10 Professional
- GeForce GTX 1070
- Visual C++ Build Tools
- CUDA Toolkit 8.0 (8.0.44)
- cuDNN 5.1
- Anaconda3 4.2.0 (Python 3.5)
- Chainer 1.16.0

#手順

- Visual C++ Build Toolsをダウンロード・インストール
http://landinghub.visualstudio.com/visual-cpp-build-tools

- CUDA Toolkit 8.0をダウンロード・インストール
https://developer.nvidia.com/cuda-downloads

- cuDNN 5.1をダウンロード（登録の必要あり、なくても動く）
https://developer.nvidia.com/cudnn
解凍して、CUDAフォルダ内の「bin」「include」「lib」を
```C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\```　以下に貼り付け（上書き）

- Anaconda 4.2.0 Python 3.5 64bit　をダウンロード・インストール
https://www.continuum.io/downloads

- chainerインストール前に、環境変数を追加。[こちら](http://xelloss.dip.jp/wp/?p=193)を参考にしました。
環境変数「PATH」に以下のパスを追加する
```C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin```
環境変数「INCLUDE」に以下のパスを追加する
```C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt```

- chainerのインストール
Anaconda Promptを開いて以下を実行
``` pip install chainer```
プロセスを生かしたまま出力先を変更


アプリのログを`/dev/null`に流してしまった。すでに流れてしまったものは取り戻せないが、以降のログをなんとかプロセスを生かしたままファイルに出力させたいという場合はよくある。
`gdb`を使えばそれが可能となる。

追記：
書いた後ですでに[同じような記事](http://qiita.com/kawaz/items/96af6fa59fdf999b94bd)があるのを見つけてしまったが若干やり方が異なっていたりしたのでそのまま公開。

## 準備

１秒毎にHelloを出力するだけのプログラム。

```cpp:hello.cpp
#include <iostream>
#include <unistd.h>

int main(int argc, char *argv[])
{
    while(true) {
        std::cout << "Hello" << std::endl;
        sleep(1);
    }
    return 0;
}
```

```bash
$ g++ -o hello hello.cpp
$ ./hello
Hello
Hello
...
```

## gdbで出力先変更

標準出力を`/dev/null`にリダイレクトしてみる

```bash
$ ./hello > /dev/null
```

プロセスが持つファイルディスクリプタ一覧の`/proc/$(pidof hello)/fd`を見ると確かに標準出力(1)が`/dev/null`に向かっていることがわかる

```bash
$ ls -la /proc/$(pidof hello)/fd
合計 0
dr-x------ 2 maueki maueki  0 10月  2 15:26 .
dr-xr-xr-x 9 maueki maueki  0 10月  2 15:26 ..
lrwx------ 1 maueki maueki 64 10月  2 15:26 0 -> /dev/pts/4
l-wx------ 1 maueki maueki 64 10月  2 15:26 1 -> /dev/null
l-wx------ 1 maueki maueki 64 10月  2 15:26 2 -> /dev/pts/4
```

gdbを使って標準出力を`/tmp/hello_log`に流れるようにしてみる。

```
$ gdb
...
(gdb) shell pidof hello
25168
(gdb) attach 25168
Attaching to process 25168
...
(gdb) call open("/tmp/hello_log", 66, 0666)
$1 = 3
(gdb) call dup2($1, 1)
$2 = 1
(gdb) call close($1)
$3 = 0
(gdb) detach
Detaching from program: /tmp/hello, process 25168
(gdb) quit
```

これで出力先が変更された

```bash
$ cat /tmp/hello_log
Hello
Hello
...
```

`/proc/$(pidof hello)/fd`を見ても確かに変更されている

```bash
$ ls -la /proc/$(pidof hello)/fd
合計 0
dr-x------ 2 maueki maueki  0 10月  2 15:26 .
dr-xr-xr-x 9 maueki maueki  0 10月  2 15:26 ..
lrwx------ 1 maueki maueki 64 10月  2 15:26 0 -> /dev/pts/4
l-wx------ 1 maueki maueki 64 10月  2 15:26 1 -> /tmp/hello_log
l-wx------ 1 maueki maueki 64 10月  2 15:26 2 -> /dev/pts/4
```

## 解説

gdbの`call`コマンドではCの関数が呼び出せる。

1. まずopenで差し替え先ファイルを開く。引数の66は`O_CREAT|O_RDWR`。ファイルディスクリプタが`$1`に入る
2. 次にdup2で`$1`を標準出力(1)として複製する
3. 最後に`$1`をcloseして終わり

## おわりに

今回は標準出力を差し替えたが基本的にどのファイルでも差し替えが可能。以下のサイトではプロセスが開いている任意のファイルを差し替えるスクリプトが公開されている。

https://www.redpill-linpro.com/sysadvent//2015/12/04/changing-a-process-file-descriptor-with-gdb.html
JavaScript で async/await によるコルーチン的な処理 (Chrome 53以上)

Chrome 53 以上であれば実験的な段階ではありますが JavaScript の  async/await により非同期処理を記述することができます。

いわゆるコルーチン的な処理の書き方ができるようになります。

## Chrome設定
残念ながら async/await 機能はまだ正式な実装とはなっておらず、Chrome の場合には以下「方法1」または「方法2」により追加設定を行う必要があります。（この機能が標準で有効になるのはしばらく先のことになるかと思います）

### 方法1: chrome:flags による設定
<img width="407" alt="flags.png" src="https://qiita-image-store.s3.amazonaws.com/0/25555/9cbbe365-3920-6b85-27b4-5625a3b55126.png">

Chrome のアドレスバーから chrome:flags を開き、「試験運用版の JavaScript (Experimental JavaScript)(#enable-javascript-harmony)」の項を有効にすると async/await 機能が使えるようになります。

※ この方法は @naruto さんに教えていただきました。ありがとうございます。

### 方法2: 起動引数による設定
<img width="272" alt="chrome.png" src="https://qiita-image-store.s3.amazonaws.com/0/25555/198c6366-f671-0b48-c30f-12c1ce0522a7.png">

Chrome の起動引数に ``` --js-flags="--harmony-async-await"``` を追加すると async/await 機能が有効になります。



## sleep処理
細かい説明は省きますが、一定時間スリープするような処理がサンプルとしては分かりやすいでしょう。

※ sleep 実装については @naruto さんからご指摘いただいて当初よりスマートな形に書き直しました。

```js
// 一定時間スリープ
//（最初からこれ入ってるとありがたいのですが、無いので自作します）
function sleep(milli_seconds)
{
  return new Promise(resolve => setTimeout(resolve, milli_seconds));
}
```

```js
// 1回毎に1秒ウェイトを入れながらループを回す
async function hoge()
{
  for(var i = 0; i < 5; i++){
    console.log("hello " + i);
    await sleep(1000);
  }
}
hoge();
```
連続した非同期処理を実装しようとすると JavaScript だとどうしてもコールバック地獄になりがちですが、async/await 機能により割とスッキリした記述に抑えることができます。

### 実行結果
![sleep.gif](https://qiita-image-store.s3.amazonaws.com/0/25555/f2832791-015e-429a-86ed-9b5a88a757bf.gif)

## 通信処理
クロスオリジン通信可能な ```http://old.clock-up.jp/junk/cors-sample.php``` というもの（現在日時を出力するだけ）を用意しました。ここと通信してみます。

```js
async function fuga()
{
  console.log("取得中...");
  var f = await fetch('http://old.clock-up.jp/junk/cors-sample.php');
  var text = await f.text();
  console.log("取得完了: " + text);
}
fuga();
```

こんな感じに通信結果の出力もコールバックを用いずに記述できます。非常に楽。

### 実行結果
![fetch.gif](https://qiita-image-store.s3.amazonaws.com/0/25555/c63643c5-3678-8238-65a4-870cc20aa44d.gif)

## おしまい
現時点ではまだ実験的な段階なので、ブラウザでの async/await 処理は手元での実験くらいにしか用いられませんが、後々これが普及することを見込んで今のうちに慣れておくと良いのでは、という感じです。

## 参考
- [Awaiting the future of JavaScript in V8 – Igalia Compilers Team](https://blogs.igalia.com/compilers/2016/05/23/awaiting-the-future-of-javascript-in-v8/)
- [javascript - Combination of async function + await + setTimeout - Stack Overflow](http://stackoverflow.com/questions/33289726/combination-of-async-function-await-settimeout)
numpyによる配列操作

chainerを使う前にnumpyを使いこなしておく必要があると感じたので、numpyの配列操作で、わかりにくいけど便利で使えそうなものをリストアップ。

全体的にまとめられたものは以下のページが分かりやすい。
http://wbhappy.hatenablog.jp/entry/2015/02/06/210000
http://rest-term.com/archives/2999/

自分の場合、特にリストのスライスが分かりにくかったので今後便利な使い方があったら追記予定。

#配列生成
連続した整数値で指定サイズの配列を生成。

```python
>>> import numpy as np
>>> a = np.arange(start=3,stop=15).reshape(nrow=3,ncol=4)
>>> a
array([[ 3,  4,  5,  6],
       [ 7,  8,  9, 10],
       [11, 12, 13, 14]])
```
一様乱数、正規分布の乱数生成。

```python
>>> np.random.uniform(lower=0,upper=1,num=3) #一様乱数
array([ 0.20556995,  0.45022502,  0.83767878])
>>> np.random.normal(ave=5.0, std=2.0, num=3) #正規分布
array([ 2.48301737,  7.38501008,  4.3084136 ])
```

#基本行列操作

列数と行数を調べる

```python
>>> rows, cols = a.shape
>>> (rows, cols)
(3, 4)
```
配列を縦または横に結合する

```python
>>> a = np.arange(6).reshape(2,3)
>>> a
array([[0, 1, 2],
       [3, 4, 5]])

>>> b = np.arange(6).reshape(2,3)
>>> b
array([[0, 1, 2],
       [3, 4, 5]])

>>> np.hstack([a,b])  #配列を横に並べる
array([[0, 1, 2, 0, 1, 2],
       [3, 4, 5, 3, 4, 5]])

>>> np.vstack([a,b])  #配列を縦に並べる
array([[0, 1, 2],
       [3, 4, 5],
       [0, 1, 2],
       [3, 4, 5]])
```
特定の条件を満たす要素を置き換える。

```python
>>> a = np.arange(30).reshape(5,6)
>>> a
array([[ 0,  1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10, 11],
       [12, 13, 14, 15, 16, 17],
       [18, 19, 20, 21, 22, 23],
       [24, 25, 26, 27, 28, 29]])
>>> a[a % 2 == 0] = -2    #偶数列を−２に置き換える
>>> a
array([[-2,  1, -2,  3, -2,  5],
       [-2,  7, -2,  9, -2, 11],
       [-2, 13, -2, 15, -2, 17],
       [-2, 19, -2, 21, -2, 23],
       [-2, 25, -2, 27, -2, 29]])
```

行列aと行列bの内積を計算

```
a.dot(b)
```
行列aの固有値を求めてから、逆行列を計算

```
np.linalg.det(a)
la, v = np.linalg.eig(a)
```
#スライス
指定の行のみ取り出す

```python
>>> a = np.arange(16).reshape(4,4)
>>> a
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])
>>> a[[0,1,3],:] #0,1,3行目を取り出す
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [12, 13, 14, 15]])
>>> a[:,[0,2]]  #0,2列目を取り出す
array([[ 0,  2],
       [ 4,  6],
       [ 8, 10],
       [12, 14]])
```

配列を逆から読む

```python
>>> a = np.arange(9).reshape(3,3)
>>> a
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])
>>> a[::-1]   #配列を最後の行から読む
array([[6, 7, 8],
       [3, 4, 5],
       [0, 1, 2]])
```
#配列順序
配列要素をシャッフルする。

```python
>>> np.random.permutation(range(6))
array([0, 2, 5, 3, 1, 4])
```

#注意点
配列の単純なコピーはポインタのコピーなので、コピー先を変えるとコピー元も変わる。
実体をコピーする場合は ``b = a.copy()`` のようにcopyを使用。
phpIPAMインプレッション

以前試用した[openDCIM](http://opendcim.org/)にはIPアドレス管理機能がなかったので、そこだけ補完するツールはないかと探してみたところ[phpIPAM](http://phpipam.net/)があったので使ってみました。バージョンは1.2.1です。

Linux, Apache, MySQL, PHP の古き良き伝統的LAMPです。インストールは既に[別の方が書かれた記事](http://qiita.com/yusukew62/items/9465108a3f18c3cdeeaa)がありますのでそこに譲って以下早速使っていきます。

#IPアドレス

IPアドレスは、以下の管理単位で管理します。

|粒度|管理単位の名前|備考|
|:--|:--|:--|
|大まか|Section|≒IPリーチャビリティ。作成に管理者権限が必要|
||Folder||
||Subnet|例：192.168.0.0/24|
|細かい|IP address|例：192.168.0.1|

Sectionは、大まかにIPリーチャビリティの管理と考えてよいかと思います。Sectionが違えば別のネットワークと見なされますので、IPアドレスが同一でも重複とは見なされず、問題なく登録できます。
同じSectionの中でのIPアドレスの重複はエラーです。ただし、Sectionの設定で、エラーが出ないように規制緩和が可能です。

Folderは、単純に整理のための単位です。Folderを作らず、Sectionの直下にSubnetを並べていくこともできます。また、Folderの下にFolderを作ってネストにすることもできます。

Subnetはネットマスクで区切られたアドレスブロックです。Subnetもネスト化が可能で、この場合は上位Subnetのアドレスブロックが下位Subnetのアドレスブロックを含むように構成しなければなりません。Subnetのネスト機能は計画的に使わないと整合性が破たんして警告メッセージだらけになってしまいがちで、ここは熟練と計画性が物を言うところです。

#デバイス

ルータなど、マルチホームのデバイスはDeviceという管理単位を作って管理します。
デバイスを作ると、そこにIP addressを所属させることができます。また、Subnetを所属させることもできます。
シングルホームのデバイスは、わざわざDeviceを作るまでもなく、IP addressのホスト名で管理すれば十分でしょう。

#VLAN

VLANは、L2 domainとVLANの2階層で管理し、その下にSubnetを配置します。

|粒度|管理単位の名前|備考|
|:--|:--|:--|
|大まか|L2 domain||
||VLAN|VLAN IDで指定する|
|細かい|Subnet|例：192.168.0.0/24|

VLAN IDの上限は、デフォルトでは4096です。これは設定で変更できますので、Cisco ISLを使っているとか、既にVLAN ID枯渇に直面してVxLANやNVGREに手を出しているという場合にも、ある程度は応用が効くと思います。もっともMySQLのINT型ですので、符号つき32ビット整数が限界です。また、VLAN同士のネストができないので、QinQの対応は苦しいところです。

#考察

##多機能！

例えばユーザ認証が6種類もあります（それなのにOAuthがない。。。）。また、phpIPAM settings画面に行くと、デフォルトでOFFになっている機能が7項目もあります。そんなわけで色々と目移りしてしまいますが、全部いっぺんに使う必要はありませんので、必要なものから順に使いこなしていけば十分かと思います。

##日本語がない！

チェコ語、ドイツ語、英語、スペイン語、フランス語、オランダ語、ポルトガル語（ブラジル）、スロベニア語が用意されていますが日本語がありません。

誰か翻訳してみませんか。1,673項目ありますので、なかなか根性が要りそうです。

##リビジョン管理がない！

これまたISO9000的リビジョン管理機能がありません。この手の仕組みを開発するのが手間なのは分かるんですが、やはり実用上は辛いものがあります。ロールバックできませんので、不注意な人に書き込み権を与えられないし、コミットに決裁や承認手続きが必要な業務フローに乗せにくいんですよね。

#Q&A

##openDCIM, RackTablesと比べた場合どうか。

openDCIMとは割と相互補完的です。openDCIMとphpIPAMをセットで導入するか、RackTablesを単体で導入するかの選択ではないでしょうか。どちらかというと前者が大きめで複雑な構成、後者が小さめで単純な構成のデータセンター向けかと思います。

##改造は必要か。

大量のオーダーの一括処理が必要な場合や、Zabbixなど統合運用監視系のツールとの間で整合性を図る局面では、素の機能だけでは不足という場合が現れてくると思います。そこは改造スキルが問われるところです。

以上！幸運を祈る。

#リファレンス

phpIPAM（公式）
http://phpipam.net/

yusukew62 (2016)
IPアドレス管理OSS phpIPAMインストール手順
http://qiita.com/yusukew62/items/9465108a3f18c3cdeeaa

不肖私 (2016)
openDCIMインプレッション（インストール編）
http://qiita.com/n-i-e/items/f4ba15640e58b031d7f6

不肖私 (2016)
openDCIMインプレッション（構成管理編）
http://qiita.com/n-i-e/items/8f7447c6fe274d05829a

不肖私 (2016)
openDCIMインプレッション（ワークフロー編）
http://qiita.com/n-i-e/items/d7f9c3084fb28fdc5af9
Laradockをwindows10で使う

[LaraDock](https://github.com/LaraDock/laradock "LaraDock")(Docker版Laravel homestead)があったので、Windows10 Homeで導入まで試してみた。

##環境
ローカル環境:Windows10 Home

##docker toolboxのインストール
Windows10 HomeではHyper-Vを使用できないため、docker toolboxをインストール。
https://www.docker.com/products/docker-toolbox

##作業用ディレクトリの設定＆作成
仮に「C:\dockerWorkspace」を作業用ディレクトリと設定する場合、以下の操作実行

1.Virtual Boxの共有ディレクトリ設定
以下の画像の通りに
パス:C:\dockerWorkspace
フォルダ名:c/dockerWorkspace
を設定

![2016-09-28.png](https://qiita-image-store.s3.amazonaws.com/0/133718/2904f2a6-e3a4-0f5a-da62-e8a797eb8909.png)

2.docker-machineの共有ディレクトリ設定
Docker Quickstart Terminalを起動して`docker-machine ssh`でログインし、以下のコマンド入力
`echo 'sudo mkdir -p /c/dockerWorkspace' |sudo tee -a /var/lib/boot2docker/profile`
`echo 'sudo mount -t vboxsf -o uid=0,gid=0 c/dockerWorkspace /c/dockerWorkspace' |sudo tee -a /var/lib/boot2docker/profile`

3.dockerを再起動
`docker-machine restart`でdockerを再起動するとC:\dockerWorkspaceが共有ディレクトリとして設定される。

##Laradockの起動
以下C:\dockerWorkspaceでの作業

1.LaraDockのブランチをclone
Windows10 Homeの場合、Docker Native for Windowsが使えないのでブランチを使用する（公式ドキュメントhttps://github.com/LaraDock/laradock参照）
`git clone -b LaraDock-ToolBox https://github.com/LaraDock/laradock.git`

2.laradockで作業するためlaradockへ移動
`cd laradock`

3.laradockを起動
公式ドキュメントに沿って`docker-compose up -d nginx mysql`を実行。初回起動の場合、しばらく待たされる。

4.作業用ディレクトリにログインしLaravelプロジェクト作成
`docker exec -it laradock_workspace_1 /bin/bash`を実行
作業用ディレクトリ内で`composer create-project laravel/laravel laravel`を実行し、Laravelプロジェクト作成。プロジェクト名は任意。

5.docker-compose.ymlを以下の通りに編集し、docker-composeを再起動
`../laravel`は任意のプロジェクト名

```5.docker-compose.yml
### Laravel Application Code Container ######################

    volumes_source:
        build: ./volumes/application
        volumes:
            - ../laravel:/var/www/laravel
```
編集後、再度`docker-compose up -d nginx mysql`を実行

6.http://192.168.99.100
にアクセス。
Laravel5.3のデフォルト画面に到達する。
![2016-10-02.png](https://qiita-image-store.s3.amazonaws.com/0/133718/a2776e20-b3a6-0ca6-2152-51863d2b588f.png)

##参考文献
[LaraDock](https://github.com/LaraDock/laradock "LaraDock")(公式ドキュメント)
[Docker MachineでDドライブなどUsers以外を自動マウントする](http://qiita.com/Bakudankun/items/d612865440565b10523f "Docker MachineでDドライブなどUsers以外を自動マウントする")
[Laravel使った開発にLaradockを使うというのはどうだろう](http://qiita.com/niisan-tokyo/items/d4485b8bb4fbfcfcc6be "Laravel使った開発にLaradockを使うというのはどうだろう")
[LaraDock on Windows 10](http://blog.nojaf.com/2016/08/19/laradock-on-windows-10/ "LaraDock on Windows 10")
[Swift]ストーリーボードでポップアップビューを実装


![PopUpVewSample.gif](https://qiita-image-store.s3.amazonaws.com/0/49022/789ee93d-2538-9b66-04e2-62f278714a5f.gif "PopUpVewSample.gif")


[iOSでポップアップビューの自作を行う。](http://qiita.com/g-1/items/bbf785e32bdfb66eb714)
[iOSでポップアップビューを実装する(with Storyboard)](http://qiita.com/g-1/items/970d9101bdd14cbceffd)

こちらの記事を参考にしてストーリーボードを使ってポップアップビューを自作。
上記の記事でも言及されているが、世の中には高機能でオシャレなポップアップ/モーダル実装がたくさんあるので、まずはそれらを採用できないか検討するのが賢明かと思われます。

Deployment Target:iOS 8.0
Swift:2.2

## ViewControllerを２つ
最初のViewControllerとポップアップのViewControllerの２つを用意。

![Main_storyboard_—_Edited3.png](https://qiita-image-store.s3.amazonaws.com/0/49022/685878e0-17d2-787d-4592-c117b2dbead0.png "Main_storyboard_—_Edited3.png")

## ポップアップのViewController
背景透過で後ろの画面を表示させるためにポップアップのViewControllerのPresentationを`Over Current Context`に設定

![Main_storyboard_—_Edited_と__Swift_ストーリーボードでポップアップビューを実装あ.png](https://qiita-image-store.s3.amazonaws.com/0/49022/65ae563c-85e8-baaa-2f54-ef771850d8f8.png "Main_storyboard_—_Edited_と__Swift_ストーリーボードでポップアップビューを実装あ.png")

## 背景透過のView
ポップアップは背景透過のViewの上にポップアップ（ピンク）のView重ねて実現する。
背景透過は`Background`に透過カラーを設定する。
ここで`Alpha`の設定を変えてしまうと、そのviewのsubviewsも`Alpha`の影響を受けてしまうので`Alpha`は1のまま。
ポップアップ以外の場所（背景透過の部分）をタップした時にポップアップを閉じる処理をしたいのでViewを識別する`Tag`に1を設定する。

![Main_storyboard_—_Edited_と_1__zsh_と__Swift_ストーリーボードでポップアップビューを実装_と_Kobito.png](https://qiita-image-store.s3.amazonaws.com/0/49022/4106cf65-7195-4bf5-f85d-9328abd4d4c0.png "Main_storyboard_—_Edited_と_1__zsh_と__Swift_ストーリーボードでポップアップビューを実装_と_Kobito.png")

## ポップアップView
背景透過Viewと区別するため、`Tag`に2を設定する。
![Main_storyboard_—_Edited5.png](https://qiita-image-store.s3.amazonaws.com/0/49022/9f29584c-17d7-b3fb-d817-f316862dd9fa.png "Main_storyboard_—_Edited5.png")

## セグエで接続
最初のViewControllerとポップアップのViewControllerをセグエに接続。
`Transition`は`Crosse Dissolve`を設定。
ここらへんをもっとポップアップぽくしたい時は、カスタムクラスなどで実装する。

![Main_storyboard_—_Edited4.png](https://qiita-image-store.s3.amazonaws.com/0/49022/4262dd3c-5675-2ef1-0332-e8daba8ec07b.png "Main_storyboard_—_Edited4.png")

## ポップアップを閉じる
ポップアップのViewControllerでCloseボタンをタップ、またはポップアップ以外の場所（背景透過の部分）をタップした時にポップアップを閉じる処理を入れる

```swift
override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
    super.touchesEnded(touches, withEvent: event)
    for touch: UITouch in touches {
        let tag = touch.view!.tag
        if tag == 1 {
            dismissViewControllerAnimated(true, completion: nil)
        }
    }
}

@IBAction func didTapClose(sender: AnyObject) {
    dismissViewControllerAnimated(true, completion: nil)
}
```

## サンプルコード
https://github.com/dondoko-susumu/PopUpViewSample
AndroidStudioで実行したGradleのタスクを停止する方法


ここで止まると思ったけど、

![スクリーンショット 2016-10-02 15.03.56.png](https://qiita-image-store.s3.amazonaws.com/0/132627/12ccdf5d-6c77-a8df-9163-3a4116eae05e.png "スクリーンショット 2016-10-02 15.03.56.png")

いつまで待っても止まんないって時は

```
$ ./gradlew --stop
```

をAndroidStudioのターミナルで実行する

![スクリーンショット 2016-10-02 15.10.32.png](https://qiita-image-store.s3.amazonaws.com/0/132627/46b0d9f3-bd4c-6ade-970e-bbb8ae58e0a8.png "スクリーンショット 2016-10-02 15.10.32.png")
(続)・Xcode8でXVimを使う

# 概要
以前[Xcode8でXVimを使う](http://qiita.com/hikarut/items/5e7049d44c714878b55a)というのを書きまして、Xcode8でXVimを使う際の注意点をメモしたのですが、最近になり再度やろうとしたらこれだけではダメだったのでさらにメモを残しておきます。。

# 前回の問題
* XVimを入れてXcode8を起動しようとすると「Xcodeが壊れているため..」と表示されXcodeが起動できない
 * → Macを再起動して解決

# 今回の問題
* 前回同様の手順を試したところうまくいかず。。
* 今回はXcodeは起動できるのですがプラグインを入れたときに最初に出る「Unexpected code bundle "XVim.xcplugin"」で「Load Bundle」を押すとうまくXcodeが起動しないという問題が発生
* その後再度Xcodeは起動できるものの、XVimは有効になっておらず、、という状況です。

<img width="411" alt="スクリーンショット 2016-10-02 14.49.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/110485/e5bd85a8-b701-0027-0616-9c0c035cc384.png">

# エラー内容
* Xcode起動時にログを見てみると以下エラーを吐いていました

```
$ tail -f /var/log/system.log

WARNING: Failed to load plugin at path: "/Users/hikaru/Library/Application Support/Developer/Shared/Xcode/Plug-ins/XVim.xcplugin", skipping. Error: Error Domain=NSCocoaErrorDomain Code=3587 "dlopen_preflight(/Users/hikaru/Library/Application Support/Developer/Shared/Xcode/Plug-ins/XVim.xcplugin/Contents/MacOS/XVim): no suitable image found.  Did find:
		/Users/hikaru/Library/Application Support/Developer/Shared/Xcode/Plug-ins/XVim.xcplugin/Contents/MacOS/XVim: mmap() error 1 at address=0x11C36E000, size=0x00108000 segment=__TEXT in Segment::map() mapping /Users/hikaru/Library/Application Support/Developer/Shared/Xcode/Plug-ins/XVim.xcplugin/Contents/MacOS/XVim" UserInfo={NSLocalizedFailureReason=The bundle is damaged or missing necessary resources., NSLocalizedRecoverySuggestion=Try reinstalling the bundle., NSFilePath=/Users/hikaru/Library/Application Support/Developer/Shared/Xcode/Plug-ins/XVim.xcplugin/Contents/MacOS/XVim, NSDebugDescription=dlopen_preflight(/Users/hikaru/Library/Application Support/Developer/Shared/Xcode/Plug-ins/XVim.xcplugin/Contents/MacOS/XVim): no suitable image found.  Did find:
		/Users/hikaru/Library/Application Support/Developer/Shared/Xcode/Plug-ins/XVim.xcplugin/Contents/MacOS/XVim: mmap() error 1 at address=0x11C36E000, size=0x00108000 segment=__TEXT in Segment::map() mapping /Users/hikaru/Library/Application Support/Developer/Shared/Xcode/Plug-ins/XVim.xcplugin/Contents/MacOS/XVim, NSBundlePath=/Users/hikaru/Library/Application Support/Developer/Shared/Xcode/Plug-ins/XVim.xcplugin, NSLocalizedDescription=The bundle “XVim” couldn’t be loaded because it is damaged or missing necessary resources.}
```

# 解決方法
* 本家のREADMEをみると最近新しい手順が1つ追加されておりそちらを試すとうまくいきました。
* 内容はXVimのプラグイン用の**証明書を作成**するとの事でした。
 * → [Install XVim for Xcode 8](https://github.com/XVimProject/XVim/blob/master/INSTALL_Xcode8.md)
* どうもどこかのタイミングでXcode8からはサードパーティーのプラグインが使えなくなったようで、使うためには証明書を作成する必要があるみたいです。
* XVimの[README](https://github.com/XVimProject/XVim/blob/master/README.md)をみるとこの手順が追加されたのが2016/09/21のようで、前回のXVimの記事を書いたのが2016/09/16だったので、その後追加されたみたいでした。。
* 証明書を作って改めてREADMEの通りにインストールしたらうまく使えました！
* 前やった時はこんなことしなかったしなぁと思って色々調べて時間を費やしてしまいました。。。
Androidアプリを Gradle DeployGate Plugin を使って簡単公開


![Androidアプリを Gradle DeployGate Plugin を使って簡単公開.png](https://qiita-image-store.s3.amazonaws.com/0/41522/d268c707-3903-f90d-9ee3-67e9438d36f1.png "Androidアプリを Gradle DeployGate Plugin を使って簡単公開.png")


大した記事じゃないけど、全体的な手順がまとまってるものがなかったので書いた。

# 手順

## 1. app/ ルート直下の build.gradle ファイルに以下を記述

```gradle:build.gradle
apply plugin: 'deploygate'
dependencies {
       :
    compile 'com.deploygate:sdk:x.x.x'
       :
}
```


## 2. `Application#onCreate` に初期処理を書く

```kotlin:YourApplication.kt

class YourApplication : Application() {
    override fun onCreate() {
        super.onCreate()
        DeployGate.install(this, null, true)
    }
}

```

## 3. Deploygateにアップロード

```AndroidStudio:AndroidStudio
[Gradle メニュー] > [deplygate] > [uploadDeplyGateXXXX]
// XXXX は Build Variant
```
この時にアカウントを作っていないと作成画面に入るんだと思われる。事前に作っておいた方がいいかも。

## 4. 関係者に展開
メンバー一覧からメールアドレスを追加するか、[共有用のリンクを追加]から共有リンクを作成して展開する
びっくりするぐらい簡単でしょ？


## 参考
- [DeployGate - Android SDK](https://docs.deploygate.com/docs/android-sdk)
- [DeployGate - Gradle Plugin v0.6をリリースしました](http://blog-ja.deploygate.com/post/81187335794/deploygate-gradle-plugin-v06%E3%82%92%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F)
ORMはなぜ流行したのか

#はじめに
　ORMが職場で流行していているので、なぜ流行しているのかを自分なりに考えました。
　今回、ORMと言っているものですが、HibernateのようなSQLを自動生成する機能を持ったものを対象としています。
　流行した理由として、「QRMを使うとSQLに詳しくなくてもデータベースを扱える」も挙げようと思ったのですが、諸々の理由で書くのをやめて、また別の視点から話を進めていこうと思います。
　途中にORMと関係ないことも書いてあるので、要点だけ知りたい人は最後のまとめを読んで下さい。

#言語の課題解決のパターン

　よく言われていることですが、言語の進化の速度は、課題提起される速度に比べて非常に遅いです。
　そのため、本来は言語の仕様を変更することで解決できる課題も、それ以外の様々なアプローチで解決されていることが頻繁に起こります。また、言語の仕様を変更すると、過去のプログラムを破壊してしまうことがある場合は、仕様そのものが変更できないという場合もあります。
　例えば多くの言語で「参照型にnullが入って、実行時エラーになる」という課題があるのですが、これに対する解決方法として、以下のようなものが挙げられます。もちろんこれで解決方法は全部というわけではないでしょうが。

1. 過去のプログラミング言語を元に新たな仕様の言語を作る(Swift)
+ 現在のプログラミング言語の仕様を変更(追加)する(C#7.0)
+ フレームワーク(ライブラリ、パッケージ)を作り対応する
+ デザインパターンを用いて解決する(Null Objectパターン)

　この解決方法一覧では、上に行くほど労力がかかるようになり、下に行くほど労力が少なくなると考えてください。そのため、「参照型にnullが入って、実行時エラーになる」という課題に対しては労力の少ない順に

　デザインパターンができる　→　フレームワークができる　→　言語仕様が変更される　→　新言語が開発される

という流れで課題解決に向かうことが期待できます。当然、必ずこの順に進むとは限りませんが。

#SQLでの課題解決の方法は？

　SQLでの課題解決を上のパターンに当てはめるとどうなるか考えていきたいと思います。

#### `1. 過去のプログラミング言語を元に新たな仕様の言語を作る`

　2016年時点でRDBMSを扱う言語がほとんどSQLしかなく、SQL == RDBMS のようになっている現状があります。新たに代替言語を作り、普及させるのはそうとう労力がかかる作業になるでしょう。仕様が若干違う方言のような言語ならたくさんあるのですが…

#### `2. 現在のプログラミング言語の仕様を変更(追加)する`

　妥当な案だと思われます。ただ労力がかかるので解決には時間がかかるでしょう。

#### `3. フレームワーク(ライブラリ、パッケージ)を作り対応する`

　個人や企業内レベルだと対応できるかもしれません。しかしSQLは、C#やJavaと違いパッケージ配布の仕組みが整っていないので全体に行き渡るようにすることは難しいでしょう。また、C#やJavaとくらべてパッケージの制作難度が高いです。

#### `4. デザインパターンを用いて解決する`

　妥当な案だと思います。全てがデザインパターンで解決できるわけではありませんが、有用なパターンに名前をつけて普及させることは、SQLの品質向上に大いに役立つでしょう。

#### 現状のSQL課題解決案

　以上のような理由からSQLの課題を解決する方法として、適切なのは以下の2点だと言えます。

+ 現在のプログラミング言語の仕様を変更(追加)する
+ デザインパターンを用いて解決する

#ORMによる解決方法

　やっとORMの話です。実は、ORMでもSQLの課題を解決しています。それも今まで述べた方法は使っていません。
　具体的な実現手段は以下になります。ここではJavaを使って実装するものとします。

+ SQLの課題を解決できるようなインタフェースを考える
+ Javaで実装を行なう
+ Javaのフレームワークとして配布する

　このような手段を取ることで、先程述べたSQL単体では解決できなかった以下の問題点を解決しています。

+ SQLの仕様変更を行なう労力の発生(SQLそのものは変更しない)
+ パッケージ開発の難しさ
+ パッケージ配布の難しさ

　フレームワークの開発なので、SQLに手を入れるよりは少ない労力で済みます。そのため、要望に対してより短時間で改善を行なうことができます。パッケージの開発もJavaを用いたほうが容易に行うことができ、パッケージ配布の仕組みも整っているので公開が容易いです。

#実際にORMが行ったSQLの課題解決

　ORMが解決した課題は以下の様なものが挙げられます。
　ここに関しては、ORMの利点などというテーマで多くの人が既に書かれていると思うので、自分が便利だなと思ったものの概要を述べる程度に留めます。また特定のORMのことを言っているわけではないので、実装されているかどうかはORMによってまちまちです。

+ クエリの細分化と、構築する機能の強化
+ 簡易な文法の導入(IN句内に配列を書ける等)
+ Index使用の明示化、作成忘れ防止(述部でカラムごとにIndexを貼るかの指定を書ける)

　以上のような機能があるため、**ORMはSQLの機能拡張を行ったフレームワークである**と言えます。

#まとめ

　ORMが流行した理由

+ ユーザはORMを通してより容易になった多機能のDB操作を利用することができる。
+ ORMはフレームワークという性質上、更新が頻繁に行われるので、SQLの言語の進化を待つ必要がない。

　以上のことから、SQLのことをある程度わかっている人が、SQLより効率的な生産方法を求めてORMを使用するようになったと言えるだろう。
RocksDB と SSD の親和性調査のまとめ


## Outline

(1) RocksDB Overview 
(2) LevelDB Overview
(3) LevelDB Architecture
(4) RocksDB Architecture と LevelDB Architecture の違い
(5) RocksDB Performance Measurement
(6) RocksDB とSSDの親和性
(7) コメント・所感

---
## RocksDB Overview [1/2]

- 2013年にFaceBookから提案されたNo-SQL形式 (key-value形式) データベース
- backend データベースとして利用される
- 分散型アーキテクチャ、fail-over は重視していない
- LevelDBの派生
- LevelDBはアクセスエントリサイズがRAMサイズよりも小さいときに、アクセス遅延が小さい。RockDBは、RAMより大きいエントリでもアクセス遅延が小さい
- Contribution: メモリにのり切らない一次記憶、二次記憶のデータアクセス遅延を気にしないで高速アクセス可能なデータベースアーキテクチャ

--- 
## RocksDB Overview Overview [2/2]
開発目標
1）マルチコアCPUを持つサーバーでの拡張性
2）高速なストレージの効果的利用
3）技術革新のための柔軟性
4）I/Oバウンドやインメモリ、ライトワンスなどの作業のサポート

---
## LevelDB Architecture [1/2]
アクセス頻度を利用した階層的なデータストアアーキテクチャ
- Write
mentableとLog Fileにデータエントリ書き込み
- flush/write
memtableがあふれたら SST (Sorted String Table) 書き込み
- Read
memtableまたはSSTからエントリ読み込み（後述）

![image](https://qiita-image-store.s3.amazonaws.com/0/142884/b73cedc3-b0da-a328-26e7-3577b9071353.png)

---
## LevelDB Architecture Overview [2/2]
- memtable
on-memoryにもつSST

- Log Files
Write処理で最初にエントリが格納されるファイル
閾値サイズ以上になると、SSTとして出力される

- SST (Sorted String Table)
keyでソートされたエントリを保存
階層的に管理されている
SSTがあるLevelで閾値サイズになると、次のLevelにSSTをマージする

![image](https://qiita-image-store.s3.amazonaws.com/0/142884/aef194ef-ba2a-d872-71be-7933e0687a2c.png)

---
## Read 処理の補足（thanks to @tatsuya6502 さん）
- memtableとSSTにデータ自体が入っているため、RocksDBは、これらのテーブル位置を検索し、エントリを読み出す
- Read処理シーケンス
 1. bloom filterでエントリテーブル位置を探す
 2. 1でエントリが見つからなかった場合、降順のLevel別にパーティション検索する
 ※ パーティション検索とは - Level0意外のLevelでは、SSTが複数存在する。複数のSSTがある場合、RocksDBでは、ハッシュキーをベースにSSTをパーティションしている。これによって、キーの検索範囲が狭まり、高速なエントリ検索を実現している
 
---
## RocksDB Architecture と LevelDB Architecture の違い
Pluggable: 部分的な欠損があっても、全体のパフォーマンスや運用に影響しない
(1) pluggable file format (コード変更無しで、データ圧縮方式の変更可)
(2) pluggable compaction (データ圧縮タイミングの柔軟性)
(3) plugable memtable (SSTの個別定義可能にする)
(4) allow different files on different storage (デバイス種別に依存しないファイル保存可能)

---
## RocksDB Performance Measurement
公式サイトから評価リンク消失
- 参考サイト
http://lmdb.tech/bench/ondisk/

---
## RocksDB とSSDの親和性
1. Tunable between device wear-out and read latency
デバイス固有に発生するWrite/Read/Space Amplificationを隠蔽するようなチューニング可能

2. Pluggable
部分的なデバイス欠損にも対応可能なアーキテクチャ

3. Optimized for fast storage
e.g., ロックフリーのRead, CPU負荷の最適化

---
## コメント・所感
- 一次記憶、二次記憶媒体のアクセス遅延を意識させないアーキテクチャ構成
- 従来、SSD はRnd W/R性能が評価されてきたため、Rnd性能が求められるアプリがHDDの置き換えで使っているにすぎなかった
- RocksDBは、SSDのRnd W/R性能に加えてSeq W/R性能の向上も全体パフォーマンス向上させる

- SSDとの親和性を確かめるために、他のDBアーキテクチャとの比較もしたい

---
## Reference
- "The History of RocksDB" post on November 24, 2013
http://rocksdb.blogspot.jp/
- "RocksDB Embedded Key-Value Store for Flash
and Faster Storage" presented in flash memory summit
http://www.flashmemorysummit.com/English/Collaterals/Proceedings/2014/20140805_D12_Dong.pdf
- "SSTable and Log Structured Storage: LevelDB" post on February 06, 2012
https://www.igvita.com/2012/02/06/sstable-and-log-structured-storage-leveldb/
- "LevelDB入門 (基本編)" from scratch
http://yosuke-furukawa.hatenablog.com/entry/2014/05/05/095207
Pythonで指定したディレクトリ内の*.pyに含まれるクラスを一括して読み込む方法

Pluginなどをあるディレクトリに格納していて、それをコード内で個別にファイル指定せず、そのディレクトリ内にある*.pyのファイルを全てimportする方法です。

以下のようなディレクトリ構成を想定します。

```
./loader.py
./plugins
./plugins/__init__.py
./plugins/a.py
./plugins/b.py
```

`__init__.py`は空でOKです。`a.py`と`b.py`はとりあえずこんな感じ。

```a.py
#!/usr/bin/env python
# coding: utf-8

class Plugin1:
    ''' plugin1 '''

class Plugin2:
    ''' plugin2 '''
```

```b.py
#!/usr/bin/env python
# coding: utf-8

class Plugin3:
    ''' plugin3 '''
```

`loader.py` を以下のように書きます。

```loader.py
#!/usr/bin/env python
# coding: utf-8

import os
import inspect
import importlib
import glob

def load_classes(dname):
    class_list = []

    # *.pyを読み込む
    for fpath in glob.glob(os.path.join(dname, '*.py')):
        # 拡張子を除去＆ファイルパスのセパレータ (Unix系なら'/') を '.' に置き換え
        cpath = os.path.splitext(fpath)[0].replace(os.path.sep, '.')
        # モジュールとして読み込み
        mod = importlib.import_module(cpath)
        # 読み込んだモジュールに含まれるクラスを呼び出す
        for cls_name, cls in inspect.getmembers(mod, inspect.isclass):
            # (ディレクトリパス含むクラス名, クラス本体) という形式で格納
            class_list.append(('{0}.{1}'.format(cpath, cls_name), cls))

    return class_list
        

import pprint
clist = load_classes('plugins')
pprint.pprint(clist)
```

実行結果は以下の通り。

```shell-session
$ ./loader.py
[('plugins.a.Plugin1', <class plugins.a.Plugin1 at 0x10d2538d8>),
 ('plugins.a.Plugin2', <class plugins.a.Plugin2 at 0x10d253940>),
 ('plugins.b.Plugin3', <class plugins.b.Plugin3 at 0x10d2539a8>)]
```

リストの2つ目の要素がクラス本体なので、これを使ってインスタンスを生成できます。

```py
c = clist[0][1]()
print c
# <plugins.a.Plugin1 instance at 0x107195d40>
```
VR におけるプレゼンスの維持と破壊


```ruby:qiita.rb
puts '先日、UNREAL FEST 2016 YOKOHAMA で’
puts 'VRの開発奥義について登壇させていただきました。'
puts '3年間の経験・知見を1時間にまとめたので'
puts 'かなり駆け足になってしまいましたが、'
puts 'その中でも重要な「VRにおけるプレゼンス」に'
puts 'ついてシェアできればと思います。'
```



詳しくは[こちら](https://medium.com/@GOROman_1661/vr-%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E3%83%97%E3%83%AC%E3%82%BC%E3%83%B3%E3%82%B9%E3%81%AE%E7%B6%AD%E6%8C%81%E3%81%A8%E7%A0%B4%E5%A3%8A-5d9858f44ef6#.7xu9gc1wf)
entitlement.plistとは


##entitlementとは
entitlement=資格
様々な設定の資格を設定する

##entitlement.plistは何をする？
apple payやicoud、プッシュの設定許可が記述されている。

targetのcapablitiesのON　OFFをいじるとここも変更される。

##entitlementsファイルが必要な状況は？
様々なデバイスで共有するものやPUSHなどの設定する際には必要
詳細はこちら
https://developer.apple.com/library/content/documentation/IDEs/Conceptual/AppDistributionGuide/AddingCapabilities/AddingCapabilities.html#//apple_ref/doc/uid/TP40012582-CH26-SW1


##参考
https://developer.apple.com/library/content/documentation/Miscellaneous/Reference/EntitlementKeyReference/Chapters/AboutEntitlements.html

https://developer.apple.com/support/code-signing/jp/
archiveがCompiling asset catalogsで終わらない問題


##Compiling asset catalogsでarchiveが止まる
解決方法がstackoverflowにありました。
http://stackoverflow.com/questions/25909317/xcode-6-0-1-stuck-compiling-asset

##解決方法
クリーンビルドをして再度アーカイブすれば良いそうです。
クリーンしたらうまくarchiveできました。
iOS10でFacebookログインできない時

iOS10からはkeychainにentitlementが指定されてないと使えない。
FBSDKはkeychainにトークンなどを入れるためにこれで使えなくてエラーが出る。

ここをonにするだけでいい。

![スクリーンショット 2016-10-02 14.03.58.png](https://qiita-image-store.s3.amazonaws.com/0/31237/ef8d3757-6630-a3d2-98e9-7daaaea1c23c.png)
iOSエンジニアのAndroidアプリ開発備忘録 - Xcode、Android Studio 比較編


![iOSエンジニアのAndroidアプリ開発備忘録 - Xcode、Android Studio 比較編.png](https://qiita-image-store.s3.amazonaws.com/0/41522/40613666-8f0b-a4a4-32db-2cbd86713619.png "iOSエンジニアのAndroidアプリ開発奮闘記 - Xcode、Android Studio 比較編.png")


本記事の前段についてはこちら
[iOSエンジニアのAndroidアプリ開発備忘録 - Qiita](http://qiita.com/RyoAbe/private/f44299bfdb470dcebb8f)

# 対象読者
備忘録のため、主に自分。
iOSアプリを開発やってた人で、Androidアプリ開発やってみたい人。

# 本題
## ショートカットの比較
### Open Quickly
`⌘ + ⇧ + O` です。同じです。

### Reveal in Project Navigator
Xcode でいう `⌘ + ⇧ + J` です。今開いてるソースファイルを左メニューの Project Navigator のフォルダーツリーと一致させてくれるショートカット（言葉で説明すると難しい..）
Android Studio では標準では該当するショートカットはないみたいです。（それ相当のメニューはありますが）
僕が知ってる解決策は2つ。

- [Projectメニューで「AutoScroll From Source」を有効にする](http://stackoverflow.com/questions/11051692/how-to-make-scroll-from-source-feature-always-enabled)
    - これで基本的には事足りるかと
- 「[Scroll From Source](https://github.com/luonanqin/intellij-idea-plugins/tree/master/ScrollFromSource)」というプラグインを入れて自分でキーマップする
    - 「AutoScroll From Source」の設定知らなくて初めこれ使ってた...

# まとめ
結局、Android Studioについてはこれぐらいしか紹介するものはなく。。
IDE としては、Xcode より若干もっさり感があるかなという印象。（あ、いやほとんど大差ないレベルですが）
あとはプラグイン色々あるので試して使ってみるといいです。
Raspbian OSからpipでのパッケージダウンロードや、httpsでのアクセスができないと思ったら時計ずれてただけだった話。

タイトルまんま。なんかしらんけど、pipで変なエラー出る。

```text:
Cannot fetch index base URL https://pypi.python.org/simple/
Could not find any downloads that satisfy the requirement pip in /usr/lib/python2.7/dist-packages
Downloading/unpacking pip
Cleaning up...
No distributions at all found for pip in /usr/lib/python2.7/dist-packages
Storing debug log for failure in /home/pi/.pip/pip.log
```

pip.logを見ると、connection errorとか出てる。
curlやwgetでhttpsに接続しても

```text
curl: (60) SSL certificate problem: certificate is not yet valid
More details here: http://curl.haxx.se/docs/sslcerts.html
```

のように出る。`apt-get install --reinstall ca-certificates` しても、状況は変わらない。

なんじゃこりゃ！　ってことで、さんざん調べたら、日時が全然合っていなかったのが原因らしい。
時計の初期設定をし忘れていたのが原因で、あと、ラズパイはハードウェアクロック持ってないから、起動時の時刻は前回システム終了時の時刻になるみたい。
ntpdは動いてるんだけど、ntpdって、全くトチ狂ってる時計を合わせるのが目的じゃなくて、あくまで微調整のため、ちょっとずつ合わせる、みたいなことをしているらしく、こういうときには役に立たない。

そこで。とれる方法が。

0. 手動で時計合わせ
 `sudo date -s "Oct 2 13:05 JST 2016"`
0. ntpdateで時計合わせ `sudo service ntp stop ; sudo apt-get install ntpdate ; sudo ntpdate -s -b -u ntp.nict.jp ; sudo service ntp start`

さらに。どうせなら起動時に同期したいよねって思って、調べてみた。
起動時、ネットワークを立ち上げる段階でntpdateを呼んでるようなので(`/etc/network/if-up.d/ntpdate`)、そいつが呼んでいる`/usr/sbin/ntpdate-debian`というシェルスクリプトが参照している`/etc/default/ntpdate`を編集する。

```text:ntpdate
NTPDATE_USE_NTP_CONF=no
NTPSERVER="ntp.nict.jp"
NTPOPTIONS="-s -b -u"
```

これで再起動してみても、なぜか時刻更新されている気配がなかった。syslogみた感じ、dhcpcdより先にこのスクリプトが動いてNTPサーバにアクセスできてない？
仕方ないので、`/etc/init.d/ntp`をちょっと変えてみた。

```bash:/etc/init.d/ntp
start)
        #略
        lock_ntpdate
        ntpdate-debian  # この行を追加
        start-stop-daemon --start --quiet --oknodo --pidfile $PIDFILE --startas #DAEMON -- -p $PIDFILE $NTPD_OPTS
        # 略
```

なんとなくうまくいってそうな雰囲気。
raspberrypiでＬチカをやってみる

# 必要なもの
  * ＬＥＤ（発光ダイオード）
  * 抵抗（１ｋΩ）
  * ジャンパー線（オス―メス）
  * ブレッドボード
  * raspberrypi 3 一式

# 配線する
GPIOのピン番号については[こちら](https://www.element14.com/community/servlet/JiveServlet/previewBody/73950-102-10-339300/pi3_gpio.png)を参照

  * raspberrypi3のGPIO23番ピン　→　ＬＥＤのアノード（足が長い方）
  * ＬＥＤのカソード（足の短い方）　→　抵抗
  * 抵抗　→　ＧＮＤ

![Ｌチカ.jpg](https://qiita-image-store.s3.amazonaws.com/0/141266/aa94233a-041e-d775-efc2-8774b4c8206a.jpeg)


# Pythonでプログラムを組む
  * wiringpiをインストールする。

```
pip install wiringpi
```

  * 下記プログラムを作成し実行する。

```py:led_test.py
import wiringpi
import time

out_pin = 23

wiringpi.wiringPiSetupGpio()
wiringpi.pinMode(out_pin, wiringpi.OUTPUT)

for i in range(0, 5):
    wiringpi.digitalWrite(out_pin, 1)
    time.sleep(1)
    wiringpi.digitalWrite(out_pin, 0)
    time.sleep(1)
```

  * １０秒間ＬＥＤが点滅すれば成功です。

#参考
[raspberrypi3 のGPIO HEADER](https://www.element14.com/community/servlet/JiveServlet/previewBody/73950-102-10-339300/pi3_gpio.png)
[WiringPi 関数メモ](http://nya03n.hatenablog.com/entry/2015/07/05/114301)
"The OPatch version is not applicable for current OUI version."の対処方法

Oracle製品のアップデートやバージョン確認のためにOPatchを使用すると、次のようなメッセージが出てくることがあります。

```
$ ./opatch lsinventory

OPatch Version : 11.1.0.11.0
  OUI  Version : 11.2.0.4.0
The OPatch version is not applicable for current OUI version.

Since OUI Version starts with 11.2, Please go to 'My Oracle Support' and get right OPatch 11.2.*.*.* based on patch 6880880, release version 11.2.0.0.0 and appropriate platform.

OPatch failed with error code 19
```

これは、同じマシンに複数のOracle製品を入れていて、ORACLE_HOME環境変数がOPatchを実行している製品以外の製品を指していると、発生します。例えば、DBのORACLE_HOME環境変数が設定された状態で、WebLogicのOPatchを実行しようとした、などです。

ORACLE_HOME環境変数が正しい製品を指しているか、見直してみるといいと思います。