OmniAICreator/Qiita-1.07M huggingface dataset:
c++ builder > アプリのアイコンを変更したが反映されない時の対応

```txt:動作確認
C++ Builder XE4 on Windows 7 pro
```

XE4で作成したソフトのアイコンをデフォルトから変更したが、ショートカットを作成するとデフォルトのアイコンのままとなることがある。

この場合は[True Color (32 ビット)] から [High Color (16 ビット)] に変更し、さらに[True Color (32 ビット)]に戻せばいいとのこと。

参考 http://blog.systemjp.net/entry/20110812/p2

16ビットに変更時はアイコンが新しいものになり、32ビットに戻したときにまたデフォルトアイコンになるPC環境があった。

以下によるとセーフモードにすればいいとのこと。実際にやってみたらセーフモードで解決した。
http://freesoft.tvbok.com/tips/pc/desktop_icon.html
夏到来! TinyObjLoader C89 で始めよう刺激的な wavefront .obj モデルローディング(2016 年版)

夏到来! それは新しいチャレンジの季節ですね!

夏休みも間近に迫ってひと段落してきたこの季節, wavefront .obj モデルを C89 でロードして刺激を求めたいですね!

たとえばマインクラフトデータを Mineways を使って .obj にエクスポートしたのを自分の IoT 機器で読んでみたいですね!
http://www.realtimerendering.com/erich/minecraft/public/mineways/

でも .obj のロードはクセがあってパーサ書くのめんどい... と思っていたズボラなアナタに朗報!

世界中のみんなに愛され使われていると言っても過言ではない, シングルヘッダオンリーな .obj ローダである TinyObjLoader の C89 版を作りました!

https://github.com/syoyo/tinyobjloader-c

80 年代のあの刺激的な時代を味わいましょう!

データ構造とかはだいたい 2016 年 C++ 版とおなじです.

[春到来! TinyObjLoader で始めよう waveront .obj モデルローディング(2016 年版)](http://qiita.com/syoyo/items/bfe45d1bcbd0ab4a125c)
JavaScriptで文字列要素を切り出す

## やりたいこと
(例) 2016-04-21 みたいなデータが存在する。
(2016)みたいにしたいので、先頭の4文字だけ切り出したい。

## 処理
```js

function sliceDate(aDate) {
  let date = aDate;
  let sliceData = date.splice(0, 4); // 先頭から4文字まで取得する
  return sliceData; // 値を返す
}

let rel = sliceDate('2016-03-21'); // 元の日付データ
console.info(`(${rel})`); // (2016)
```

## 追記
sliceの中の第一引数、第二引数を変えることで、要素を切り出したい場所を変更できる。
C89 でモダンなレイトレーシングを行う

漢なら C89 でモダンな BVH を使ったレイトレしたいですね!

やりましょう!

できました.

https://github.com/lighttransport/nanort/tree/c89/experimental

これで IoT 機器でもレイトレーシングできますね!

## なぜ C89 か.

昨今のコンパイラでは C99 は十分対応されているですが, C99 と C++03/C++11 が混在が難しかったり(long long の扱い, 不完全配列 a[], math.h など), IoT みたいな組み込み用途では C++ STL や libc/libm がまともに扱えなかったりとか,  docker/runC でプロセスを isolate して実行したいのでプログラムを全部 static link したいような用途では, まだまだ C89 レベルで対応するような機会があるのではないか, と思いました.

## C89 テクニック

```
	clang -fsanitize=address -o test -Weverything -g -O0 -ansi -pedantic test.c -lm
```

clang で `-Weverything -ansi -pedantic` あたりにしていろいろエラー/Warning を吐かせてチェックできるようにすると良いです. Address sanitizer 有効にするとなおよし!(`-fsanitize=address`)

### 変数定義が関数(ブロック)の最初でしかできない!

```
void func() {
    float a;
    a = 1.0f;
    float b = a + 2.0f;
}
```

とかすると, `b` が関数の最初に定義されていないと言われてエラーが出ます.

全部最初に持ってくるとコードが見づらい時はカッコ(ブロック)でくくるといいかも.

```
void func() {
    float a;
    a = 1.0f;
    {
       float b = a + 2.0f;
    }
}
```

### long long(int64) の扱い.

C89 では `stdint.h` が使えないのですが... まあとりあえず昨今の 64bit OS では long long は 64bit と想定して良いのではないでしょうか.

### bool 型が無い!

char or int で代用!

## TODO

* 三角形以外にも対応する.
* カスタムメモリアロケータなどを提供して `libc` フリーにする.
* Parallella などの MIMD プロセッサで動かす.
* とあるアーキティクチャで動かす.
WordPressインストール時に実施する設定や機能拡張


## マルチバイト文字の取り扱いに関する不具合の累積的修正

プラグイン「WP Multibyte Patch」を使用する（WordPress -jaヴァージョンに添付済）



## URLを望ましいものにする

### カテゴリページのURLからcategoryという表記を削除する
プラグイン「WP No Category Base」を使用する

- http://wordpress.org/extend/plugins/wp-no-category-base/


### パーマリンク設定
設定 > パーマリンク設定 > 共通設定でカスタム構造を選び、

```
/%category%/%postname%
```

と指定する。マルチサイトではサイトごとに設定する。



## 共有機能


### SNS共有ボタンの設置

プラグイン「WP Social Bookmarking Light」を使用する
- https://wordpress.org/plugins/wp-social-bookmarking-light/



## SEO対策

### サイトマップファイル生成

プラグイン「Google XML Sitemaps」を使用する
- https://wordpress.org/plugins/google-sitemap-generator/


## メディアファイル

### 同一画像でたくさんのサイズを生成させない。

「設定」→「メディア」で数値指定をすべて空にする。



## 多言語サイトへの道

### マルチサイト化

- https://wpdocs.osdn.jp/%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%81%AE%E4%BD%9C%E6%88%90


### MultilingualPressのインストール

プラグイン「MultilingualPress」を使用する。
サブディレクトリ／サブドメインどちらにでも対応し、複数の言語で同じ投稿を紐付けられる（同一画面で編集できる）ので非常にいい


- https://ja.wordpress.org/plugins/multilingual-press/


「サイトネットワーク管理者」→「サイト」を選択し、個別のサイトの「MultilingualPress」タブ内の設定をする。


### マルチサイト時の画像置き場の設定

- 「参加サイト」→「サイトネットワーク管理者」→「サイト」とたどり、サイトをどれか選択。設定タブの中にある。

- Uploads Use Yearmonth Folders
「アップロードしたファイルを年月ベースのフォルダに整理」の設定
1　…　年月名フォルダに自動で振り分け保存
0　…　フォルダ分けをせずに同一階層にすべて保存

- Upload Path
「アップロードするファイルの保存場所」
デフォルトは /wp-content/uploads/
任意のパス指定ができる。
ネットワークインジケータをAlamofireNetworkActivityIndicatorで表示して幸せになろう


`Alamofire` を使用した開発を行った時に通信処理を記述するところにすべて以下の様な記述するのが面倒くさい！という方におすすめです。

```swift:hoge.swift
// ネットワークインジケータを表示
UIApplication.sharedApplication().networkActivityIndicatorVisible = true
// ネットワークインジケータを非表示
UIApplication.sharedApplication().networkActivityIndicatorVisible = false
```

## セットアップ

```ruby:Podfile
platform :ios, '8.0'
use_frameworks!

pod 'AlamofireNetworkActivityIndicator', '~> 1.0'
```

入力が終わったら以下を実行！！

```bash
$ pod install #(または, pod update)
```

ライブラリのお仕事が終わり次第、 `AppDelegate.swift` の `application: didFinishLaunchingWithOptions` に追記する。

```swift:AppDelegate.swift
import AlamofireNetworkActivityIndicator

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    // 以下を追記
    NetworkActivityIndicatorManager.sharedManager.isEnabled = true
   
    return true
}
```

以上でセットアップは完了！！

## オプション

### インジケータを表示させる時間の調整

デフォルトでは、1.0秒後にインジケータが表示されているようです。
また、レスポンスタイムが短すぎるときには表示されないという衝撃的な事実があるので以下を `AppDelegate.swift` の先ほどの下部に追記するといい感じになりました。

```swift:AppDelegate.swift
NetworkActivityIndicatorManager.sharedManager.startDelay = 0.0
```

遅くさせる場合は数を増やすと大丈夫です。

### インジケータの非表示にさせる時間の調整

デフォルトでは、レスポンス終了後から0.2秒後にネットワークインジケータが非表示になります。
私が実際に `AlamofireNetworkActivityIndicator` を実装してみた感じ「0.2秒で全然違和感ない！！」って言う感じだったのでこれで大丈夫かと思います。

```swift:AppDelegate.swift
NetworkActivityIndicatorManager.sharedManager.completionDelay = 0.2
```

## 注意事項

`UIWebView` や `AFNetworking` など別のライブラリを使用している場合は、この手は使えないです。
まぁ仕方ないですよね。
Scalaで8-queens

Scalaを忘れていたのでリハビリ。Haskellで書いたものを移植してみたが末端が一個ずれることによるバグを直すのが面倒だった。

```scala
object EightQueens {

  def queen(n: Int): List[List[Int]] = n match {
    case 0 => List(List())
    case `n` => for {b <- queen(n - 1); q <- 0 to 7 if safe(q, b)} yield q :: b
  }

  def safe(q: Int, b: List[Int]) = b.indices.forall(i => checks(q, b, i))

  def checks(q: Int, b: List[Int], i: Int) = q != b(i) && (Math.abs(q - b(i)) != i + 1)

  def main(args: Array[String]) {
    val res = queen(8)
    res.foreach(l => println(l))
    println(res.length)
  }

}
```
mrb_protect使ってみた

今回、[mruby-io-console](https://github.com/ksss/mruby-io-console)を実装した時に`mrb_protect`の使い方をおぼえたので、内容を共有します。

`mrb_protect`はmruby標準添付ライブラリー`mruby-error`にあるCの関数です。

`mrb_protect`は、指定した関数内でエラーが起こった場合、エラーをraiseせずエラーオブジェクトを返して処理をアプリケーション側に委ねるものです。
ようするにC内でmrubyの`ensure`的なことがやりたい時に便利です。
実際に`mrb_ensure`もあるのですが、ensure節でやりたいことが簡単なものであれば`mrb_protect`で十分だと思います。

build_config.rbで`mruby-error`を使えるようにして(`conf.gembox 'default'`に含まれてます)、

Cのソースで

```c
#include "mruby/error.h"
```

とすれば使えます。

定義は以下。

```c
mrb_value mrb_protect(
  mrb_state *mrb,  // おなじみのやつ
  mrb_func_t body, // コールバック関数
  mrb_value data,  // コールバック関数の引数
  mrb_bool *state  // エラーが起こったらtrue、でなければfalse
);
```

実装例として、メソッドに与えられたブロックを実行して、エラーでもエラーじゃなくても特定の関数を実行する場合を書いてみます。

```c
// mrb_protectで守りたい部分
static mrb_value
only_yield(mrb_state *mrb, mrb_value block)
{
  // blockをyieldで実行する。
  return mrb_yield_argv(mrb, block, 0, NULL);
}

// 絶対に実行させたい関数
static void
zettai_zikkou(void)
{
  printf("YATTA!\n"); // 絶対に"YATTA!"と表示する
}

static mrb_value
honyahonya_method(mrb_state *mrb, mrb_value self)
{
  mrb_value block;
  mrb_value result;
  mrb_bool state;

  // blockを取得
  mrb_get_args(mrb, "&", &block);

  // resultにはエラーが起こらなかったらonly_yieldの返り値が、
  // エラーが起こったらエラーオブジェクトが入る。
  result = mrb_protect(mrb, only_yield, block, &state);

  // mrb_protectのおかげで
  // エラーが起きようが起きまいが絶対に実行したい関数が呼べる
  zettai_zikkou();

  if (state) { // trueならエラー
    mrb_exc_raise(mrb, result); // ブロックで起こったエラーをそのまま発生させる
  }
  return result; // エラーじゃなかったらonly_yieldの返り値(ブロックの実行結果)を返す
}
```

こうして`mrb_protect`を使うことによって、mruby-io-consoleでもrawモード時にエラーが起こっても、rawモードのまま終了することなく、cookedモードに戻すといったことが実現できました。

# リンク

rawモードとcookedモードについて: http://qiita.com/ksss/items/9c8a237f452cd8aa7c11
mruby-errorのソース: https://github.com/mruby/mruby/blob/master/mrbgems/mruby-error/src/exception.c
mruby-io-consoleのソース: https://github.com/ksss/mruby-io-console/blob/f7baf75361f37bdcf4667da24bb98a5006b45c1c/src/io-console.c#L68
mrb_protect導入PR: https://github.com/mruby/mruby/pull/2845
repl.it で、ログインせずに実行可能なコードを共有する

# https://repl.it/ で新規ソースを作成する。


https://repl.it/languages < ココにアクセスし
使いたい言語を選択する。

![repl_it_-_Online_REPL__Compiler___IDE.png](https://qiita-image-store.s3.amazonaws.com/0/4036/30288e5a-009e-8743-0856-0ba96f86a804.png)


# 実装する

なんか適当に楽しむ。

![repl_it_-_Python3_Compiler_と_repl_it_-_Online_REPL__Compiler___IDE.png](https://qiita-image-store.s3.amazonaws.com/0/4036/7713a2fa-1027-524d-2cdf-af41bc54eb7e.png)

# シェアするために保存する。

シェアボタンを押すと・・・

![repl_it_-_Python3_Compiler_と_repl_it_-_Online_REPL__Compiler___IDE.png](https://qiita-image-store.s3.amazonaws.com/0/4036/98f220be-304e-9a49-407c-08f82c3a1665.png)

ログインフォームが出てくるので、おもむろに `continue as Anonymous` をクリック

![repl_it_-_Python3_Compiler.png](https://qiita-image-store.s3.amazonaws.com/0/4036/9d37c215-9051-72d7-17d2-0111e210e23b.png)

# Share Linkを共有する

エディターページに戻るので、再度Shareボタンをクリックすると
ShareLinkが記載されたモーダルが出る。

![repl_it_-_Python3_Compiler.png](https://qiita-image-store.s3.amazonaws.com/0/4036/6669c8c8-ed6c-ce8b-3c0d-a01ac31b964b.png)

上図、赤枠のURLを共有することでソースが共有される。
mruby-io-consoleちょこっと書いた

# mruby-io-console

CRubyにある`io/console`というライブラリがあって、この機能をmrubyでも使えるかなあと思って作ってみました。

自分でもio/consoleが何かわかってなかったので、学習のためにも書いてみました。

https://github.com/ksss/mruby-io-console

これで`IO#raw`と`IO#cooked`と`IO#noecho`と`IO#winsize`がmrubyでも使えるようになります。

なかでも使いみちがありそうなのは`IO#raw`と`IO#noecho`で、

`IO#raw`はコンソールから一文字ずつ読みこむようなアプリケーションを作りたい場合に使えます。

```rb
$stdin.raw do
  # この中での$stdinはrawモードになる
  while true
    ch = $stdin.getc
    print ch
  end
end
```

`IO#noecho`はパスワード入力時に入力文字を隠したい時に使えます。

```rb
password = $stdin.noecho { $stdin.gets }
```

まだ全てのメソッドが揃ったわけではないし自分の手元のmacマシンでしか動作確認してないデス。。。
PRお待ちしております。

# リンク

http://qiita.com/ksss/items/9d0a86f3be1b62ae6f50
意外と使えるPHPのファイル系の標準関数/オブジェクトまとめ


## [file](http://php.net/manual/ja/function.file.php)

ファイル全体を読み込んで、データを配列形式で返す。

## [file_get_contents](http://php.net/manual/ja/function.file-get-contents.php)

ファイル全体を読み込んで、データを文字列形式で返す。

## [file_put_contents](http://php.net/manual/ja/function.file-put-contents.php)

文字列形式のデータをファイルに書き込む。
ファイル全体を書き換えるため、既にファイルがある場合はデータを上書きすることになるので要注意。

## [file_exists](http://php.net/manual/ja/function.file-exists.php)

引数で渡されたパスにファイルまたはディレクトリが存在するかチェックする。

## [fopen](http://php.net/manual/ja/function.fopen.php)

ファイルまたはURLをオープンする。
以下のように標準入出力を使ったストリーム形式での対応も可能。

```
$stream = fopen('php://output', 'w');
```

## [fputcsv](http://php.net/manual/ja/function.fputcsv.php)

第２引数に配列を渡すと、CSV形式に変換して出力する。

## [glob](https://www.php.net/manual/ja/function.glob.php)
引数のパス名にマッチするパス名を検索する。

## [mkdir](http://php.net/manual/ja/function.mkdir.php)

引数で渡されたパスにディレクトリを作成する。

## [pathinfo](http://php.net/manual/ja/function.pathinfo.php)

引数に指定したファイルパスに関する以下の情報を取得する。

* ディレクトリ名
* ベースファイル名
* 拡張子
* 拡張子を除いたファイル名

引数の$optionを指定なしの場合は、上記の連想配列が、
引数の$optionを指定ありの場合は、指定した上記の情報が文字列で取得出来る。

## [rmdir](http://www.php.net/manual/ja/function.rmdir.php)

引数で渡されたパスのティレクトリを削除する。
ただしディレクトリ内にファイルが存在する場合は削除に失敗するため、実行前にファイルを削除する必要がある。

## [scandir](http://php.net/manual/ja/function.scandir.php)

引数で渡されたパス内のディレクトリ及びファイルを配列形式で返す。
ただし「.」や「..」などのシンボリックリンクも取得するため、取得後は以下のようにして排除する。

```
$files = scandir("/var/tmp");
$files = array_filter($files, function($file) {
    // ディレクトリなど排除したい場合は以下の条件を変更
    return !in_array(file, [".", ".."]);
});
```

## [SplFileObject](http://php.net/manual/ja/class.splfileobject.php)

SPLで提供されているファイル操作用のオブジェクト。
ファイル入出力の標準関数の多くをラッピングし、拡張子やファイル日付等の取得機能も提供している。

## [unlink](http://jp2.php.net/manual/ja/function.unlink.php)

引数で渡されたパスのファイルを削除する。
javascriptで要素の高さを取得したときに正しく取得されない問題

##要素の高さを取得しようとした。
はじめに

```
$(document).ready ->
  element_height = $(".img-element").height()
  console.log(element_height)
```
と書いたがchromeの開発者ツールで確認した高さとぜんぜん違った。

正しくは

```
$(window).load ->
  element_height = $(".img-element").height()
  console.log(element_height)
```

##$(document).ready() と $(window).load()の違い

(document).ready→DOMが構築されたら実行される。
(window).load→DOMの構築、さらに画像など含めて、ページが完全に読み込まれてからが実行される。
vimで改行コードをCRLF(dos)からLF(unix)に修正する

```.vimrc
fileformats=unix,dos,mac
```

vimrcに上記のような設定を書いておくと、vimでファイルを開いた時に改行コードを自動判定してくれます。

で、たまに、Windowsで修正したファイルを開くと改行コードがCRLFになっていて、vimのステータスライン付近に`dos`と表示されて改行コードがCRLFだよって教えてくるのでLFに修正しようと思います。


改行コードを指定してファイルを開く
-----------

`:e ++ff=<ファイルフォーマット>`

今回はLFにしたいので

```vim
:e ++ff=unix // => LF
```

これで改行コードをLFとしてファイルを開き直します。
すると、CRの箇所に `^M` が表示されるようになります。
あとは、この `^M` を消せばOK。


CRを消す方法
-----------
`^M` もしくは `\r` を消す。どちらでもOK。

1. ^Mを空文字に変換する

	```
	:%s/^M//g
	```
	`^M` は `Ctrl+V` + `Ctrl+M` で入力できる

2. \rを空文字に変換する

	```
	:%s/\r//g
	```
fluentd (td-agent) note

# fluentd ver 1.x
## multiprocess
```
<system>
workers 2
</system>
```

But any plugins do not supprt multiprocess e.g. `debug_agent`.
## sender sample
```
<source>
  @type tail
  path /tmp/test.log
  pos_file /tmp/td-pos/test.log
  tag hoge.test
  format none
  read_from_head true
</source>

<match hoge.**>
  @type forward
  <server>
    host <your fluend-server>
    port 24224
  </server>
  buffer_type file
  buffer_path /tmp/buff/test.*.buff
  flush_at_shutdown true
</match>
```

# out_file
## `path` = `buffer_path`
The `path` parameter is used as `buffer_path` in this plugin.
So..
- No need to set `buffer_path`.
- If you dislike bufferd path like "/path/to/file.20140101.log.b4eea2c8166b147a0", set `flush_interval 0s`

Of course , even if you set `flush_interval 0s`, buffers path created at the moment.

## output RAW format
`format single_value` retruns parts of JSON `message:` key. If you return other key, set ` message_key <YOUR_KEY>`. i.e.) default is `message_key message`

## Stop split!
`append true`

## `symlink_path`
Link to latest buffer file. But when just after logrotate (kill USR1) or no buffer file, this link to be a dead link.

`symlink_path` can not set * (wild card)


# out buffer

## default limit
|   type   |   buffer_chunk_limit   | buffer_queue_limit   |   total   |
|:--------:|:----------------------:|:--------------------:|:---------:|
|   file   |      256               |          8MB         |   2GB     |
|   memory |      64                |          8MB         |   512MB   |
【改定2】Apache 2.2 バーチャルホスト設定ファイル テンプレート

# ワイルドカード対応(HTTP 2.2/2.4)

```apache:conf.d/httpd-vhost.conf
<VirtualHost *:80>
  ServerName  a.cent.example.jp
  ServerAlias a.cent.example.jp *.cent.example.jp

  VirtualDocumentRoot /var/www/vhost/%1/html/
  ErrorLog  logs/vhost.error_log
  CustomLog logs/vhost.access_log common

  # RewriteLog logs/vhost.rewrite_log
  # RewriteLogLevel 9

  <Directory /var/www/vhost/*/html/>
    Options All
    AllowOverride All

    Order deny,allow
    Allow from all
    <IfVersion = /^2.4./ >
      # version 2.4
      Require all granted
    </IfVersion>
  </Directory>
  DirectoryIndex index.php index.html
</VirtualHost>

# HTTPS 接続が不要の場合はここ以下を削除 ---------------------------------------------
<IfVersion == 0.0>
# ありえないバージョンを指定することにより複数行コメントと為す
# SSL 証明書（自己証明書作成）
$ mkdir -p /var/www/vhost/conf/
$ cd /var/www/vhost/conf/
$ openssl genrsa 2048 -out server.key
$ openssl req -new -key server.key -out server.csr
# バージョン 0.0 の場合のみ実行 を利用したコメント
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:JP
State or Province Name (full name) []:
Locality Name (eg, city) [Default City]:Tokyo
Organization Name (eg, company) [Default Company Ltd]:Example.JP
Organizational Unit Name (eg, section) []:Developer
Common Name (eg, your name or your server's hostname) []:*.example.jp
Email Address []:root@example.jp

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:1234
An optional company name []:1234
$ openssl x509 -days 3650 -req -signkey server.key -in server.csr -out server.crt
$ openssl rsa -in server.key -out server.key
</IfVersion>

<IfModule ssl_module>

<VirtualHost *:443>
  ServerName  a.cent.example.jp
  ServerAlias a.cent.example.jp *.cent.example.jp

  VirtualDocumentRoot /var/www/vhost/%1/html/
  ErrorLog  logs/vhost.error_log
  CustomLog logs/vhost.access_log common

  # RewriteLog logs/vhost.rewrite_log
  # RewriteLogLevel 9

  <Directory /var/www/vhost/*/html/>
    Options All
    AllowOverride All

    Order deny,allow
    Allow from all
    <IfVersion = /^2.4./ >
      # version 2.4
      Require all granted
    </IfVersion>
  </Directory>
  DirectoryIndex index.php index.html

  SSLEngine on
  SSLProtocol all -SSLv2
  SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW
  SSLCertificateFile    /var/www/vhost/conf/server.crt
  SSLCertificateKeyFile /var/www/vhost/conf/server.key

</VirtualHost>
</IfModule>
```
Pandas + Jupyter notebookで分析を便利に


#### 環境
Python 3.5.1 :: Anaconda 2.5.0

### pandas.DataFrame使ってないの？
pythonでcsv読み込んだり、json読み込んだり、DBからSQL文書いてexecute(hogehoge)とかやるのは、大変じゃないですか？DBなんかは特に，エラー処理でrollbackとかcommitとか分けたり非常にめんどくさい。

その悩み、pandas使えば解決しますよー

よくあるcsvの読み込み

```python:before
import csv

with open("data.csv",'r') as f:
	data = csv.reader(f)
	
for row in data:
	print(row)
```

```python:after
import pandas as pd

data = pd.read_csv("data.csv")
print(data)
```

sqlでselectしたデータをpythonに落とす(postgres)

```python:before
import psycopg2

conn = psycopg2.connect("dbname=test host=localhost user=postgres")
cur = conn.cursor()
cur.execute("SELECT * FROM test_table LIMIT 100;")
data = cur.fetchall()

for row in data:
	print(row)
```

```python:after
import pandas as pd
import psycopg2

conn = psycopg2.connect("dbname=test host=localhost user=postgres")
data = pd.read_sql("SELECT * FROM test_table LIMIT 100;",conn)
print(data)
```

pandasのいいところとして、
__テーブル形式のデータ構造をそのまま保持できる__
ところにある。つまり，DBのテーブル構造とかcsvのカラムとかそのまま引っ張ってこれるということ。

例([csvファイルのサンプル](http://trial.future-shop.jp/toranomaki/overseas/English_sample_fs2.csv))

__Jupyter notebookで扱うことで、さらに見やすく便利に__

![スクリーンショット 2016-07-19 13.18.35.png](https://qiita-image-store.s3.amazonaws.com/0/116528/6a96297c-13b3-948d-0ab3-7f1ca5f2a41c.png "スクリーンショット 2016-07-19 13.18.35.png")

__各カラムの型も簡単にチェック__

![スクリーンショット 2016-07-19 13.22.31.png](https://qiita-image-store.s3.amazonaws.com/0/116528/c187ca73-3c1e-c94d-672d-755662f13e8c.png "スクリーンショット 2016-07-19 13.22.31.png")
(objectという型は、カラム内に複数の型データが存在しているので、文字列となっている。例えば、数値と変な文字が入ったカラムを、数値のみの型に変換したいときは、``df["column_name"].convert_objects(convert_numeric=True)``とすれば、変換できなかったものがNaNとして格納される)

pandasのHow toはいろいろな記事があるし、Jupyter notebookも非常に簡単に使えるツールです。組み合わせれば、すごく早く、簡単にデータの分析ができるので是非お試しを

追記
pandasでデータ集計、分析をする際に便利なメソッドを備忘録としてまとめていきます(随時更新予定)
[Pandasでデータ集計をする際に最低限覚えておきたいメソッド](http://qiita.com/kyo-bad/items/f5ddb7e4b8e7ad9103c5)
RabbitMQのコネクションにクライアント情報を設定する


## コネクションからクライアント情報を知りたい場合がある
* clientからRabbitMQサーバーへの接続をロードバランサー経由にした場合、```rabbitmqctrl```でコネクション情報を見ると、全部同じIPアドレスになってしまう

```bash
sudo /usr/sbin/rabbitmqctl list_connections
#=>
#Listing connections ...
#guest   10.0.1.100    34989   running
#guest   10.0.1.100    34997   running
#guest   10.0.1.100    34992   running
#guest   10.0.1.100    34995   running
```

* コネクションから監視情報を取りたい（一箇所監視するだけにしたい）
  * あるキューを処理するclient(worker)がいるか
  * このホスト名から始まるclientがいるか

## 解決案
クライアント情報をコネクションの```client_properties```に埋め込むことで、```rabbitmqctrl```からクライアント情報を取ることが可能

```rb:client_properties.rb
# -*- coding: utf-8 -*-
require 'amqp'

# client情報を設定
# ホスト名、IPアドレス、プロセスID、起動時刻、処理するキュー名
client_properties = {
  :hostname   => Socket.gethostname,
  :ipaddress  => Socket.getifaddrs.select{|x| x.name == "eth0" and x.addr.ipv4?}.first.addr.ip_address,
  :pid        => Process.pid,
  :start_time => Time.now.to_s,
  :queues     => [ 'queue1' ]
}

# RabbitMQに接続
AMQP.start(
           :host => "localhost", :vhost => "/production",
           :user => "user1", :pass => "pass", :client_properties => client_properties
           ) do |connection, open_ok|
  # channelを作成
  channel = AMQP::Channel.new(connection)

  # queue1を作成
  queue = channel.queue("queue1", :nowait => false, :durable => true)

  # queue1からmessageを取得
  queue.subscribe(:ack => true) do |hdr, msg|
    p "queue  = #{queue.name}" #=> "queue  = queue1"
    p "message= #{msg}"        #=> "message= Hello, world!"

    # RabbitMQのmessageを削除
    hdr.ack
  end
end
```

## 埋め込んだクライアント情報を参照する

rabbitmqctrlに```client_properties```を指定すると、埋め込んだ情報が表示される

```
sudo /usr/sbin/rabbitmqctl list_connections client_properties
```

```text:実行結果
Listing connections ...
[{"platform","ruby 2.1.5p273 (2014-11-13 revision 48405) [x86_64-linux]"},{"product","AMQP gem"},{"information","http://github.com/ruby-amqp/amqp"},{"version","1.0.2"},
 {"hostname","testhost"},{"ipaddress","10.0.1.105"},{"pid",34989},{"start_time","2016-07-19 13:05:07 +0900"},{"queues",["queue1"]}]
[{"platform","ruby 2.1.5p273 (2014-11-13 revision 48405) [x86_64-linux]"},{"product","AMQP gem"},{"information","http://github.com/ruby-amqp/amqp"},{"version","1.0.2"},
 {"hostname","testhost"},{"ipaddress","10.0.1.128"},{"pid",34997},{"start_time","2016-07-19 13:05:08 +0900"},{"queues",["queue1"]}]
[{"platform","ruby 2.1.5p273 (2014-11-13 revision 48405) [x86_64-linux]"},{"product","AMQP gem"},{"information","http://github.com/ruby-amqp/amqp"},{"version","1.0.2"},
 {"hostname","testhost"},{"ipaddress","10.0.1.143"},{"pid",34992},{"start_time","2016-07-19 13:05:09 +0900"},{"queues",["queue1"]}]
[{"platform","ruby 2.1.5p273 (2014-11-13 revision 48405) [x86_64-linux]"},{"product","AMQP gem"},{"information","http://github.com/ruby-amqp/amqp"},{"version","1.0.2"},
 {"hostname","testhost"},{"ipaddress","10.0.1.92"},{"pid",34995},{"start_time","2016-07-19 13:05:19 +0900"},{"queues",["queue1"]}]
...done.
```
* 最初のplatform, product, information versionは、amqpが設定した情報
K8sでdeleteしたpodが止まらないとき

忘備録。これ以外の理由で pod が止まらないこともあるかもしれない。

症状
====

K8s で namespace を削除したあと、Terminating のまま延々と終わらない。
リブートしても消えない。
調べていくと、pod がいくつか消えていない。

原因
====

この pod が存在した worker node が物理的にシャットダウンされていた。
(言い換えると `kubectl get nodes` の結果が `NotReady`)

この状態では、コントローラは pods を落としたくても落とせない。

対策
====

worker node を立ち上げても良いし、`--grace-period=0` を引数に足して `kubectl delete pods` を呼ぶことで強制的に削除することもできる。

参考
====

http://stackoverflow.com/questions/35453792/pods-stuck-at-terminated-status
モデルのクラスメソッドであるattributesとインスタンスメソッドであるattributesは返すものが違う

# クラスメソッドとインスタンスメソッドは違う(当然)
属性名の一覧を取得するときによく使う`attributes`について、モデルに対して呼ぶときと、モデルのインスタンスに対して呼ぶときとでは違う値が返る。
いやそりゃクラスメソッドとインスタンスメソッドは違うものなんだから当たり前なんですけど、大体のケースで同じ値を返すので意外と気づきにくかったりする。ということは、稀にそれが原因でよくわからないエラーを踏んで爆発したりするのでメモ。

## 具体的には
モデルの属性はRailsが起動したときにロードされ、インスタンスの属性はそれが取得されたときにロードされる。

## 実例
違いがわかりやすいように`attribute_names`を使って実験。

```rb
[1] pry(main)> User.attribute_names
=> ["id", "name", "email", "created_at", "updated_at"]
[2] pry(main)> u = User.first
  User Load (0.5ms)  SELECT  "users".* FROM "users"  ORDER BY "users"."id" ASC LIMIT 1
=> #<User:0x007ffd6f881fe8 id: 1, name: "Taro", email: "foo@bar.com", created_at: Sat, 16 Jul 2016 11:06:18 UTC +00:00, updated_at: Sat, 16 Jul 2016 11:06:18 UTC +00:00>
[3] pry(main)> u.attribute_names
=> ["id", "name", "email", "created_at", "updated_at"]
```

見た感じでは一緒。ここでmigrateしてtableにcolumnを追加。

```console
$ bundle exec rake db:migrate
== 20160719032723 AddClassificationToUsers: migrating =========================
-- add_column(:users, :classification, :integer, {:default=>0})
   -> 0.0048s
== 20160719032723 AddClassificationToUsers: migrated (0.0050s) ================
```

`User`のレコードを再度取得してインスタンスを生成。

```rb
[4] pry(main)> User.attribute_names
=> ["id", "name", "email", "created_at", "updated_at"]
[5] pry(main)> u = User.first
  User Load (0.4ms)  SELECT  "users".* FROM "users"  ORDER BY "users"."id" ASC LIMIT 1
=> #<User:0x007ffd6a208248 id: 1, name: "Taro", email: "foo@bar.com", created_at: Sat, 16 Jul 2016 11:06:18 UTC +00:00, updated_at: Sat, 16 Jul 2016 11:06:18 UTC +00:00>
[6] pry(main)> u.attribute_names
=> ["id", "name", "email", "created_at", "updated_at", "classification"]
```

モデルに対する実行結果と、インスタンスに対する実行結果に違いが出た。
モデルについては、Railsが再起動されていないため属性に変化がない。
一方でインスタンスについては、取得時にtableのデータをロードしてくるため、その際に新たな属性を認識する(値が`NULL`のときは認識しないが、今回はdefault値を設定している)。

```rb
[7] pry(main)> reload!
Reloading...
=> true
[8] pry(main)> User.attribute_names
=> ["id", "name", "email", "created_at", "updated_at", "classification"]
```

Railsを再起動すると、モデルでも属性を認識する。
vbaにおけるセルのAddressについて


```
ActiveCell.Address(External:=True)
```

はファイルパスも含まれるので、ファイル名や置き場所が変わるとリンクが機能しなくなる。
なので

```
"'" & Activesheet.Name & "'!" & ActiveCell.Address
```
とした方が良さそう。
【Linux】シンボリックリング

参考：[シンボリックリンクの作成と削除](http://qiita.com/satomyumi/items/2e99304bd92201261c60)

#作成

```
#ln -s リンク元 作成されるリンク
ln -s /var/www/html /tmp/html
```

※注意
リンク元も作成されるリンクも最後に/はつけないこと。

llで確認するとリンクされていることがわかる。
rwxrwxrwx 1 root root 8 Jul  6 09:42 html -> /var/www/html

また、オプションで第二引数の作成されるリンクを省略すると、カレントにリンク元と同名でリンクが作られる。

以下は上記と同じ。

```
cd /tmp
ln -s /var/www/html
```

#削除

```
#unlink リンク
unlink html
```
パソコンのデータをコピーしてバックアップ


## 環境
windowsXP
ruby2.3

## 理由
実家のパソコンのOSをwindowXPからWindows7にクリーンインストールを実施しようとした際に家族から音楽やら、画像やら、なくなったら困るとツッコミをもらったことがはじまり。
内容は使い回しなので、musicデータに限った場合で公開。

## 使用前提
1. コピーするファイルの拡張子をあらかじめ調べておくこと。
2. コピー先のディレクトリを予め作成しておくこと。

## 書いてみた

```DataCopy.rb
#! usr/bin/env ruby
# coding: shift_jis

require "Find"
require "FileUtils"

$music_extension = ["m4a", "mid", "mp3", "ogg", "wav", "wma"]
$copy_dest_dir = "D\:\\copy_dest\\music"

def _copy_music_data

    Find.find("C\:\\Documents and Settings\\") { |search|
        #p search
        $music_extension.each { |ext|
            if File.extname(search) =~ /#{ext}$/
                FileUtils.cp(search.to_s, $copy_dest_dir)
            end
        }
    }

end

_copy_music_data
```

## todo
1. オランダ語のファイル名に当たるとエラーが発生する。
2. ファイルの拡張子を調べるに外部アプリケーションを使ってるので、プログラム内で完結させてたい。
ifで判断したい条件が多い場合はどうする？


if文でAND判断したい条件が複数ある場合、普通は・・・

```rb
if 条件1 && 条件2 && 条件3
```

とか、

```rb
if 条件1
  if 条件2
    if 条件3
```

とかしますよね。

しかし、もしも判断させたい条件が10個以上とかある場合は、どうするのが良いのでしょうか。

とりあえず、次のような方法を使ってみました(2016/07/25- @yancyaさんのコメントを元に修正)。

```rb
def filter(judges)
  yield if judges.all?
end

# 条件1~5はifで判断する文
judges = []
judges << 条件1
judges << 条件2
judges << 条件3
judges << 条件4
judges << 条件5

# 全ての条件に通過した場合のみ、ブロック内の式が実行
filter(judges) do
  puts 'pass'
end
```

具体的には以下のような感じで使います。

```rb
n = 15

judges = []
judges << (n > 10)
judges << (n < 20)
judges << (n % 2 != 0)
judges << (n != 5)
judges << (n.to_s.size < 3)

filter(judges) do
  puts "#{n} is correct"
end
```

何かアホなことをしている気がする・・・
ベストプラクティス的な方法があったら教えてください。

## 追記

@k-shogoさんが提示して下さった方法(+@asmさんの助言)が一番スマートかもしれません。コメントして下さった方々、本当にありがとうございます。勉強になりました。

```rb
n = 15

judges = [true]
judges << (n > 10)
judges << (n < 20)
judges << (n % 2 != 0)
judges << (n != 5)
judges << (n.to_s.size < 3)

puts "#{n} is correct" if judges.all?
```
テーブルを設計する上で考えておくと助かること

自分がテーブル設計をするときによく気をつけることを箇条書きにしました。

--
**業務フローを正確に理解・把握する**

```
　業務フローの理解が甘い場合、客先検収時に項目の不備が発見されたり、
　フロー成立に不可欠な要素の見落としが生じることがあります。
　データベース設計は業務フローと密接に関係しているため、業務フローを正確に把握するよう
　努める必要があります。
```

--
**保存が必要なデータ項目は漏らさず事前に収集しておく**

--
**基本は正規化を行う**

```
　正規化がすべてではない場合もあります。
　書き込み頻度が高いテーブルは敢えて非正規化したほうがいい場合もあるため、
　書き込みパフォーマンスを確認の上、正規化・非正規化の選択を行うようにします。
　でも基本は正規化したほうがいい場合が圧倒的多数です。
```

--
**集計済みデータを分解できない構造にしない**

```
　集計済みテーブルしかなく、集計前データが存在しないようなテーブル設計はできる
　限り行わないようにします。
　万一集計ロジックに不具合が発覚した場合、集計前データがあれば再集計で対応できますが
　データ量節約のために集計前データを破棄する設計にしてしまうと、過去の不具合を訂正できない
　システムになり、扱う業務によっては本格的に致命的な不具合になる場合がありますので、
　リスクを検討し、集計元データを残さない場合、その根拠とリスク対策を明文化しておくと安心です。
```

--
**並び順を制御する列を用意しておく**

```
　マスタのときは特にですが、例えば販売管理などの見積書の明細格納テーブルに
　順序制御を入れていなくて後で明細の順序を変えたいと言われることが過去にあったため、
　予想がされる場合はソート列の検討をいれています。
```

--
**運用で使われるSQLのたたき台はできるだけ自分で書き起こしておく**

```
　適切なインデックスを設計するためには論理的なリレーション設計だけでなく、
　実際にSQLを書き出してきちんとクエリプランを把握しておく必要があります。
　できる限り自分で書いておいたほうがいいです。
```

--
**言うまでもなく適切にインデックスを貼る**

```
　応答性能に極端な影響がでますのでここはきちんと検討します。
　事前にSQLを書き起こしていればある程度の目安は立ちますので、比較的容易な作業になります。
```

--
**ディスク容量はインデックスファイルの量もちゃんと含めて検討する**

```
　当たり前なんですが、運用がすすんで特定のテーブルに1000万件以上データが格納されていて、
　止むに止まれずインデックスを貼ったらディスク容量が急増し、運用計画に支障がでてし　まった、
　という経験がありました。データ件数が非常に大きくなるテーブルが複数あるときは
　特にインデックスファイルの容量も注意しておいたほうがいいです。
```

--
**件数が非常に大きくなるテーブルは事前にパーティショニングテーブルにしておく**

```
　日別・会員別・訪問IP別サマリーを格納し、データを表示したい。
　なんて要望で、会員数が万単位であることがわかっている場合、
　数年以上利用すると数百万件になることが容易に想定されます。
　そういった場合、データ件数が原因でSELECTパフォーマンスが落ちますので、
　月別にパーティショニングを貼っておくとパフォーマンスを安定させることができます。

　また、数百万件のテーブルで2年以上前のデータを一括削除したいとか
　要件がでたとき削除だけでかなりの時間ロックが発生するため、
　夜間や休日メンテを余儀されなくなりますが、
　パーティションテーブルであればDROPかTRUNCATEするだけですので
　DELETEよりは圧倒的に早く終わりますので、オンタイムでの対応も可能になります。
```

--
**書き込みが頻繁なテーブルはパーティション設計を行い、運用後はできるだけそっとしておけるように慎重に設計する**

```
　大量のDELETE / SELECT / UPDATE / ALTER、リアルタイム集計情報を提供するなどが必要と
　されるのであれば、パーティションは必須です。
　応答時間が数秒のクエリを書き込み以外で発生させると、
  対象SQLが書き込み要求を待ち行列に追加し、一瞬にしてパフォーマンスが急低下し、
　DBが応答不能になる経験がありました。
　書き込みが大量に発生するテーブルでリアルタイム集計を運用しないよう、要件を調整する
　リアルタイム集計は別テーブルに書き出しを行って常に件数が少ないテーブルで扱うなど
　結構な工夫をしないといけません。
```

--
**パーティショニングは銀の弾丸ではない**

```
　パーティショニングはすべての問題を解決してくれるわけではなく、
　ノーメンテでテーブルが100以上になるとパフォーマンス劣化につながりもする。
　有用な対策にはなり得るけれど、特性と事前の調査をきちんと行った上で採用する。
```

**同じテーブルに書き込みと読み込みが同時に走る場合は、設計確定前に必ず負荷テストを行う**

```
　先に記述した通り、書き込みが高頻度に走っているテーブルの最新行を頻繁に取得するような
　テーブルが存在する場合は軽いアクセス過多であっという間に遅延につながる場合がある。
　なので、簡単なスクリプトで実際の頻度を想定した書き込みを連続して行うスクリプトと
　最新レコードを含む検索クエリを同時に流し、負荷テストを行っておき、
　実運用上で障害に繋がらないか簡易にでも確認をしておく必要がある。
```

--
番外編　(物理サーバの場合)

**特に件数が大きく、読み込みも同時に発生するテーブルはテーブルスペースを割り当て、独立したディスクを割り当てる**

```
　RAIDに任せておけばいいんじゃない？
　っていうのもアリですが、ディスクを分けると他のテーブルのデータ更新や検索の影響を
　受けなくなり安定しますので、物理を扱える場合はディスクの割り当て設計も有用なアプローチです。
　ただ、バックアップからの復元の際にディスク割り当ての情報が伝わっていなかったりすると
　クリティカルな不具合が発生したりするので気をつけてください。
```

--
追記 2017.12

**ディスクスペースが全体の50%程度に収まるような運用を行う。**

```
全体のディスク容量が大きなサーバでデータベース運用をしていて、
定期的にフルバックアップを行う運用をしている場合、
圧縮に必要なディスクスペースやテンポラリで使うディスクスペースが想定以上に膨れてしまい、運用に支障をきたす場合があります。
80%を超えるディスク使用量が常態化しているサーバだと、
何かと不調に見舞われることがあります。
顕著な例だと、ディスク負荷が高い時間が普段以上に続き、フロントエンドのパフォーマンスが急激に落ちたり、応答待ちが増えることでコネクション数が一時的に増加して、知らない間に接続がきられていたり。

頻度が一定でない挙動不安定に近いことが起きることがあります。
```

ディスク容量の監視は運用継続することをお勧めします。
【PHP】ソートアルゴリズム

気が向いたら追加

別途、確認用のテストコード書く
asortの結果と比較
性能も見れたらいいかも


##バブルソート

```
function bable_sort($para){
    $cnt = count($para);
    
    for($i=0;$i<$cnt-1;$i++){
        for($j=$i+1;$j<$cnt;$j++){
            if($para[$i]>$para[$j]){
                $tmp = $para[$i];
                $para[$i] = $para[$j];
                $para[$j] = $tmp;
            }
        }
    }
    return $para;
}

```

##クイックソート

途中

参考
https://github.com/Khanashima/algorithm/blob/master/src/sort/quickSort.php

```
function quickSort(&$list, $first, $last) {

echo PHP_EOL;
echo 'first:'.$first,' last:'.$last,PHP_EOL;

    $firstPointer = $first;
    $lastPointer  = $last;

    //枢軸値を決める。配列の中央値
    $centerValue  = $list[intVal(($firstPointer + $lastPointer) / 2)];
    //$centerValue = $list[$firstPointer];

    echo 'centerValue:'.$centerValue,PHP_EOL;

    //並び替えができなくなるまで
    do {
        //枢軸よりも左側で値が小さい場合はポインターは進める
        while ($list[$firstPointer] < $centerValue) {
            $firstPointer++;
        }
        
        //枢軸よりも右側で値が大きい場合はポインターを減らす
        while ($list[$lastPointer] > $centerValue) {
            $lastPointer--;
        }


        //この操作で左側と右側の値を交換する場所は特定
        if ($firstPointer <= $lastPointer) {
echo 'firstPointer:'.$firstPointer,'→',$list[$firstPointer],' ','lastPointer:'.$lastPointer,'→',$list[$lastPointer],PHP_EOL;

            //ポインターが逆転していない時は交換可能
            $tmp                 = $list[$lastPointer];
            $list[$lastPointer]  = $list[$firstPointer];
            $list[$firstPointer] = $tmp;
            //ポインタを進めて分割する位置を指定
            $firstPointer++;
            $lastPointer--;
        }
        
    } while ($firstPointer <= $lastPointer);
    
    if ($first < $lastPointer) {
        //左側が比較可能の時
        quickSort($list, $first, $lastPointer);
    }
    
    if ($firstPointer < $last) {
        //右側が比較可能時
        quickSort($list, $firstPointer, $last);
    }
}

$list = [3,5,2,4,9,11,8];
quickSort($list,0, count($list)-1);

var_dump($list);

```
IAM アカウントでの Reserved Instance の購入について

Reserved Instance の購入について確認した。
ルートアカウントである必要はなく、適切な権限をもった IAM アカウントで購入可能。

※ [適切な権限](http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ExamplePolicies_EC2.html#iam-example-reservedinstances)

IAM の権限管理はしっかりしておこうねというお話。
squirrelでhiveに接続するには

- driversでhive driverを作成する。
- 追加jarは
    - hiveのlib以下にある全てのjar
    - hadoop-common.jar

設定等は普通に

```
driver name: org.apache.hive.jdbc.HiveDriver
jdbc:hive2://labo-rikitoku-dev-master:10000/default
username: から
password: から
```
BLEのデバッグツールまとめ

# Android

## nRF Connect for Mobile

https://play.google.com/store/apps/details?id=no.nordicsemi.android.mcp

* アドバタイズのスキャン
* 接続
* サービスとキャラクタリスティック一覧取得
* キャラクタリスティックのリードライト
* Peripheral化
    * Nexus6など比較的新しい端末で無いと動作しない
        * Nexus5はNG
    * スキャンして見つけたデバイスのアドバタイズ模倣も可能

# iOS

## LightBlue Explorer

https://itunes.apple.com/us/app/lightblue-explorer-bluetooth/id557428110

> Key Features:
- Scan for any peripherals
- Grab basic device info (UUID, RSSI )
- Browse Characteristics and Services
- Register for Notifications
- Read Characteristics
- Write to Characteristics in Hex, Oct, Bin, Decimal or Ascii
- Clone peripheral profiles
- Choose from an array of common preconfigured peripheral profiles
- Advertise as a peripheral using custom profiles
- Thoroughly log BLE events

# Mac

## Bluetooth Explorer と PacketLogger

[Hardware IO Tools for Xcode](https://developer.apple.com/download/more/) に含まれている。

### Bluetooth Explorer

詳細は [こちら](http://qiita.com/shu223/items/46dabad41cf2eed67d13) をご参照。

> Bluetooth Low Energy のデバイスをスキャン、接続し、提供するサービス／キャラクタリスティックを確認 することができます。

### PacketLogger

詳細は [こちら](http://qiita.com/kazuph/items/85ae7b350cd8a4209541) をご参照。

Mac内部のBTコントローラとのやりとり（HCI）をダンプして、アドバタイズや接続、リードライトを確認できます。

## LightBlue

https://itunes.apple.com/jp/app/lightblue/id639944780?mt=12

> Key Features:
- Scan for any peripherals
- Browse Characteristics and Services
- Register for Notifications
- Read Services
- Write Services in Hex or Ascii

詳細は [こちら](http://qiita.com/kazuph/items/85ae7b350cd8a4209541) をご参照。
できることは Bluetooth Explorer と同等だけど、こちらの方が操作しやすいかも。

# Linux

## hcidump

BTコントローラとのやりとり（HCI）をダンプできます。

あらかじめ

```bash
sudo hcidump &
```

しておき、BLE周りの通信をおこなえばダンプされます。


## gatttool

接続して対話的にGATTアクセスできます。

## hciconfig

HCIコマンドが通らなくなったとき、

```bash
sudo hciconfig hci0 off && sudo hciconfig hci0 on
```

でリセットかけます。

hci0は環境によって異なるので、あらかじめ

```bash
hciconfig
```

でご確認下さい。

# Windows

## Bluefruit LE Sniffer

とても安価（3千円ぐらい）なBLEスニファーです。
実際のBLE電波をキャプチャして可視化できるので、解析効率が段違いです。
（BLEの規格書と睨めっこすることになりますが…）

[Adafruit](https://www.adafruit.com/product/2269) から購入できますが、すぐ欲しい場合は [スイッチサイエンス](https://www.switch-science.com/catalog/3347/) でも取り扱いがあります。
非同期処理の書き方を Java と Swift と Xamarin で比較する

「重たい処理を非同期で実行して、結果をメインスレッドで画面に表示」を、

* Android-Java
* iOS-Swift
* Xamarin(Android も iOS も同じ)

で比較。

----

## Android

```java:
@Override
public void onClick(View view) {
    new AsyncTask<Void, Void, Long>() {
        @Override
        protected Long doInBackground(Void[] p) {
            // ワーカースレッド
            long ret = 0;
            for (long i = 0; i < 1000000000; i++)
                ret += i;
            return ret;
        }

        @Override
        protected void onPostExecute(Long result) {
            // UIスレッド
            text1.setText(String.valueOf(result));
        }
    }.execute((Void)null);
}
```

----

## Swift

```swift:
@IBAction func onTouchUpInside(sender: AnyObject) {
    weak var weakSelf = self
    dispatch_async(dispatch_get_global_queue(
        DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), {
        // ワーカースレッド
        var ret:Int = 0
        for i in 0...1000000000 {
            ret += i
        }
        
        dispatch_async(dispatch_get_main_queue(), {
            // UIスレッド
            weakSelf?.label1.text = String(ret)
        });
    });
}
```

----
## Xamarin(Android も iOS も)

```csharp:
Task<long> FatProc() => Task.Run<long>(() => {
    long ret = 0;
    for (long i = 0; i < 1000000000; i++)
        ret += i;
    return ret;
});

button1.TouchUpInside += async (_, e) => {
    var ret = await FatProc(); // ワーカースレッド
    label1.Text = ret.ToString(); // UIスレッド
};
```

----
## Xamarin はいいぞ！
zeppelinでhiveに接続するには

http://zeppelin.apache.org/docs/0.7.0-SNAPSHOT/interpreter/hive.html

にしたがって設定する。

username, passwordを設定しない場合は空欄で、

dependenciesは2つのjarを設定する。


- org.apache.hive:hive-jdbc:0.14.0 	
- org.apache.hadoop:hadoop-common:2.6.0 	

動作確認したいる、version等は

- hive : 1.2.0
- hadoop : 2.7.2
- zeppelin: 0.7.0

動作確認は

```
%hive

select
*
from parquet_table
```

な感じで
MySQLでn行ずつ結果を取得する

## 概要

- ユーザー変数を使って行番号を付ける
- 行番号の剰余でフィルタリング

## 例

### n=3の場合

```sql
SELECT
*
FROM (
  SELECT 
    @i:=@i+1  as rownum, 
    TABLE_NAME.* 
  FROM 
    (select @i:=0) as dummy,
    TABLE_NAME) tmp 
   )
WHERE 
  tmp.rownum % 3 = 1
```
[Vim]英和辞書機能をつける(翻訳)

Vim 内で英単語の意味を検索・表示する機能を追加しました。

## 必要？

OSSなどのドキュメントを翻訳してコントリビュートしているときに
こんな機能あったら便利だなっと思って探したのがきっかけです。  

kaoriyaさんのMacVimにはデフォルトでその機能が用意されています。  

(参考) [dicwin.vimでvimエディタに英和辞書を組み込む。 - 名無しのVim使い](http://nanasi.jp/articles/vim/dicwin_vim.html)
※辞書のリンク切れてました...

## 導入  

GENEという辞書を下記URL先からダウンロード、解凍します。  

[GENE95 辞書](http://www.namazu.org/~tsuchiya/sdic/data/gene.html)

自分は、  

- gene95.tar.gz (tar+gzip圧縮形式)

を選びました。

解凍したら、出てきたフォルダの中にある```gene.txt```を移動します。

- Windows
```/vimfiles/ または $HOME/vimfiles/dict/```

- Mac OSX
```$HOME/.vim/ または $HOME/.vim/dict/```

文字コードがSJISだったのでUTF-8に変えて保存します。

  
```$ vim gene.txt```


```
vim内  
:e ++enc=sjis    
gg V G yy(全コピー)   
:e ++enc=utf8  
gg V G p(上書き)   
```

<br>


## 実践

vimを新規で開いて使ってみます
なにかの英単語にカーソルがあたっている状態で 
```<C-k>k (ctrl+k 押下後にk)```

<a href="http://ikenji.tech/wp-content/uploads/2016/07/vimeng0.png"><img src="http://ikenji.tech/wp-content/uploads/2016/07/vimeng0-300x70.png" alt="vimeng0" height="70" class="alignnone size-medium wp-image-194" /></a>


出来ました。
とても便利です！
spark sqlでhiveのtableにinsertするには

- spark sqlではhiveqlの"insert into table 〜 values 〜"が使えない on ver.1.6.2

なので、次で回避

```
sqlContext.sql("insert into sandbox.test3 select t.* from (select 3, '3') t")
```

```
hive> desc test3;
OK
c1                      int                                         
c2                      string                                      
Time taken: 0.114 seconds, Fetched: 2 row(s)
hive> 
```


http://stackoverflow.com/questions/33923348/insert-into-with-sparksql-hivecontext
pythonでグローバルIPを記録する

#ちょっとだけ説明
+ [Requests](http://requests-docs-ja.readthedocs.io/en/latest/)でページを取得
+ HTMLParserモジュールでIPを取得
+ codecsモジュールでファイルの読み書き
 
#コード
下記は[ここ](http://www.axisnetworks.biz/tools/gip/)で取得する例となります。

```python:ip.py
#!/usr/bin/env python

import requests
from HTMLParser import HTMLParser
import codecs

class MYHTMLParser(HTMLParser): #HTMLParserクラスをオーバーライドしてます
        def __init__(self): #初期化
                HTMLParser.__init__(self)
                self.mytag = ''

        def handle_starttag(self,tag, attrs): #タグの始めに読むと呼ばれるハンドラ
                if tag == 'p': #タグの判別
                        if (dict(attrs).get('name')=="ip"): #属性の判別
                                self.mytag = 'ip'

        def handle_data(self,data): #データを読むと呼ばれるハンドラ
                if self.mytag == 'ip': #属性の判別
                        self.mytag = '' #ここでフラグの初期化
                        print 'IP='+data
                        with codecs.open('my_ip.txt','w','utf-8') as f:
                                f.write(data)


def ip_get(myurl): #メインの処理
        r = requests.get(myurl)
        r.encoding = r.apparent_encoding #そのままでは処理出来なかったのでエンコード

        with codecs.open('my_ip.html','w','utf-8') as f:
                f.write(r.text)
                f.flush() #念の為ですが、追加しました。

        with codecs.open('my_ip.html','r','utf-8') as f:
                parser = MYHTMLParser()
                parser.feed(f.read())
                parser.close()


if __name__ == '__main__':
        ip_get("http://www.axisnetworks.biz/tools/gip/")
```

取得したページは`` `my_ip.html` ``に保存され、IPは`` `my_ip.txt` ``に保存されます。
エンコードの処理は悩んだ結果です。。。
Pepper　 JavaScriptによるPepperマイク音声ストリーミング処理について教えてください

PCからPepperに対し、ストリーミング開始/終了命令を実施、処理中にPepperに話しかけた音声データをリアルタイムにPC側スピーカーにて再生させることが可能でしょうか？

≪構築環境≫
JavaScript、qimessesing	
（動作確認用として、Python 、Python SDK、PyAudio）	


![Pepper.png](https://qiita-image-store.s3.amazonaws.com/0/110057/4bac7919-9da8-cf22-55ec-9a3f9e81823b.png)

≪質問≫
	上記処理について、Pythonでの実現は確認（Pythonシート参照）		
	同様の処理について、JavaScriptで構築(JSシート参照)を行っていますが以下問題点の為、実現が出来ない状態です。		
			
1	「ALAudioDevice」コール後、		
	JSシート41行 session.service('ALAudioDevice').done(function(pALAudioD) 		
	JSシート46行 pALAudioD.setClientPreferences(subscriberID, 16000, 3, 0)		
	の様に「setClientPreferences」サービスを実施したが、		
	>>setClientPreferences: Error! ALProxy::ALProxy Can't find service		
	とサービスが見つからないとエラーが発生する。		
			
			
2	Python側での処理		
	Pythonシート33行 self.BIND_PYTHON(self.getName(), "callback")		
	Pythonシート60行 def processRemote(self, inputChannels, inputSamples, timeStamp, inputBuff):		
	Pythonシート75行 myBroker = ALBroker("myBroker","0.0.0.0",0,PEPPER_IP,9559)		
	の処理内容について、Pepper API側の処理内容と予測されますが、ドキュメント等を確認しても処理内容が確認できませんでした。		
			
			
3	PythonでPC側スピーカーで再生させる際、外部モジュール「PyAudio」を経由して再生しています		
	JavaScriptで同様に再現できるモジュール、命令はあるのでしょうか？		
	※AudioContextで実現できそうですが、Pepper側からの音声データが取得できない為未確認です。		
			
【参考サイト】			
	ALAudioDevice API(Aldebaran)		
	http://doc.aldebaran.com/2-4/naoqi/audio/alaudiodevice-api.html		
			
	Python/qi Frameworkを使ってPepperのマイクからストリーミングする		
	http://www.baku-dreameater.net/archives/2411		
			
	AudioContext(Mozzila)		
	https://developer.mozilla.org/ja/docs/Web/API/AudioContext
JSON1 Extensionを有効にしたSQLiteをbuildする

SQLite 3.9から導入されたJSON1 Extensionを有効にしたSQLiteをbuildする方法を書いておく。

brewからinstallしたSQLiteだと有効になっていないっぽいので、sourceからbuildして有効にしてみた。

JSON1 Extensionの使い方は、公式のDocumentや他のQiitaの記事を見るといい。

* [The JSON1 Extension](http://www.sqlite.org/json1.html)
* [Sqlite 3.9 の Json1を試した](http://qiita.com/smith/items/c0bd002666a23a6fe8e4)

## JSON1 Extensionを有効にしたSQLiteをbuildする

SQLiteのversionはversion 3.13.0を使用し、Macでbuildすることを前提としてます。

以下のコマンドを実行すれば、JSON1 Extensionが有効になった`sqlite3`が生成される。

```bash
wget https://www.sqlite.org/2016/sqlite-autoconf-3130000.tar.gz
tar zxvf sqlite-autoconf-3130000.tar.gz
cd sqlite-autoconf-3130000
./configure --enable-json1 # JSON1 Extensionを有効にする
make
```

ソースコードはwgetで取得してますが、以下からダウンロードもできます。
https://www.sqlite.org/download.html
疎行列同士のcos類似度計算では、0以外の要素集合に変換すると超速いことに気付いた(Ruby)


すごく初歩的なことだとは思いますが・・・

疎行列同士のcos類似度を計算して、近いものを選択してくるということに取り組んでいました。約5000要素から成るの疎行列が40000程あります。

約40000の行列の内一つをクエリとして、cos類似度が近いもの上位5個を選択するという処理を**何も考えずに**行ったところ、**約60秒**も掛かってしまいました。

そこで、疎行列を以下のように変換しました。

```
[0,0,2,0,6,0,0,0,0,3,0,0,0]
```

↓

```
[
  [2,4,9],
  [2,6,3]
]
```

変換先は二次元の配列になっており、一次元目には0以外から成る要素のindexが、二次元目には、indexに該当する値が入ります。

この変換を行ったうえで、先ほどと同様の処理を行ってみました。以下Rubyでのコードサンプルです。

```rb
# vectorsには上記の変換を行った疎行列が約40000格納される
vectors = Marshal.load(File.read(input))

# クエリの行列
input = vectors[id]

# 類似度が上位5個を保存
max_score = Array.new(5, {score: 0, index: 0})

vectors.each_with_index do |vector, index|
  double = vector[0] & input[0]
  score = 0
  double.each do |s|
    score += vector[1][vector[0].index(s)] * input[1][input[0].index(s)]
  end
  score = score.fdiv(Math.sqrt(input[1].reduce(0){|vec, s| vec += s ** 2} * vector[1].reduce(0){|vec, s| vec += s ** 2}))
  max_score.sort! {|a, b| a[:score] <=> b[:score] }
  if max_score[0][:score] < score
    max_score.shift
    max_score.push({score: score, index: index})
  end
end

# 類似度降順に並び替え
max_score.sort {|a, b| b[:score] <=> a[:score] }
```

今回の処理は、**約0.3秒**で終了しました。約200倍速度が改善されました。

[MinHash](https://research.preferred.jp/2011/02/minhash/)とか使えばもっと早くなりそうなので、今度試してみたいです。
webpackちゃんと理解しとこ loader編

※ これは古いWebpackの情報です。(どのバージョンの話か忘れるぐらいには古い)

webpackで様々なものをbundle出来るようにするloaderについて、公式ドキュメントを読む。
http://webpack.github.io/docs/using-loaders.html

[チュートリアル編](http://qiita.com/umezo@github/items/fe812bc58d78097db5db) ← prev | next → [設定ファイル編](http://qiita.com/umezo@github/items/e2dde7d1f66dbf8aec3a)

読んでメモとりたくなったところは以下に記載

### Loader featuresの訳
- 連結することが出来て、パイプライン状にリソースに対して適用される。最期のloaderはJavaScript(のコード?)を返すことが期待され、それ以外は任意の形式を返していい。
- 同期的でもいいし、非同期でもいい
- nodeで出来ることはなんでもやっていい
- ローダを設定するためにクエリパラメータを受け付ける
- 設定で正規表現により拡張子と関連付けることができる
- npmとして公開されインストールできる
- `うまく訳せなかった` Normal modules can export a loader in addition to the normal main via package.json loader.
- 設定にアクセスできる (クエリパラメータのこと？ webpack.config.jsのこと？) Loaders can access the configuration.
- `プラグイン？` Plugins can give loaders more features.
- 追加で任意にファイルをうみだせる

まじかよ、もはやローダーの域こえてるだろこれ。

### Referencing loaders
- 必須ではないけど慣例的に`XXX-loader`という名前がつけられている
    - `XXX`はそのローダーの機能を表す
- ローダーは `XXX-loader`でもいいし、省略して`XXX`と表してもいい
    - たぶん命名規則にそっている限り
- この慣例はrequireするときとかに便利だよ 
    - あんまり重要そうには思えなかったけど、命名規則や検索の優先順位はwebpack configuration apiを通して変更できる模様

### Usage
- `require(...)`に直接指定
    - 明示的にと書いてあり、残りの方法が暗黙的なのと対になってる
    - そして`Avoid using this`なのでオススメではないらしい
    - `require('./xxxx!module/name')`
        - `xxxx.js` を探しに行く
        - 次の方法と対比するとキモイ気がする
    - `require('xxxx!module/name')`
        - `xxx-loader.js` を探しに行く
    - `require("!style!css!less!bootstrap/less/bootstrap.less")`
        - 後ろに書いてあるローダから仕事する
- configファイルに記載
    - `/module/loaders[]`に定義を追加していく
        - testプロパティとloaderかloadersプロパティを定義する
        - testプロパティには正規表現オブジェクトを指定
            - require()に指定された文字列をtestしてマッチするとローダが働く
        - loaderにはrequire()に直接ローダを指定する場合の記法でローダを定義する
        - loadersの場合は、配列でローダを一件ずつ定義する
        - queryプロパティもあるが 後述
- CLI
    - `--module-bind`オプションに`拡張子=ローダ定義` の形式で指定する


### qurey文字列
文字列の形式はローダごとに違うらしい。まじかよ。

とはいえ通常、url的なqueryパラメータか、json形式(`{"key":"value","key2":"value2"}`)を受け付けているらしい。

全部文字列でローダとともに指定する場合は`loader?queryString`の形式。
configファイルではqueryプロパティにオブジェクトとして指定することもできる。
（が、loadersと併用できるかはここではわからなかった。



## まとめ
- ローダって言う名前の機能だが実際はなんでもできる
- 名前は慣例的に`XXX-loader`であり特に問題がない限りしたがって命名すべき
- requireで明示するか、設定ファイルに別記し暗黙的にローダを適用する
- 特に問題がない限り設定ファイルに書く
- loaderを外から設定するためにquery文字列を渡すことができ、通常webっぽいアレかJSONオブジェクトで渡す
Processing > ControlP5 > ScrollableList > リストから選択できた / Serial.list()の表示と選択

```txt:動作環境
Processing 3.1.1 on Windows 8.1 pro(64bit)
Library: ControlP5 v2.2.6
```

http://qiita.com/7of9/items/778a2c3bc763d1d9401b
にてListBoxを使ってリスト項目の選択を試みたがうまく行かなかった。
ScrollableListではどうかという記載が見つかっていたので使ってみた。

## リスト表示と選択

### code v0.1

以下に実装した。

```java
import controlP5.*;
import java.util.*;

ControlP5 cp5;
int myCurrentIndex = 0;
String[] tokens;

void setup() {
  size(400, 400);
  cp5 = new ControlP5(this);
  
  tokens = new String[10];
  tokens[0] = "Hello";
  tokens[1] = "Hi";
  tokens[2] = "Ca va bien?";
  
  List l = Arrays.asList(tokens[0], tokens[1], tokens[2]);

  cp5.addScrollableList("dropdown")
     .setPosition(100, 100)
     .setSize(200, 100)
     .setBarHeight(20)
     .setItemHeight(20)
     .addItems(l)
     // .setType(ScrollableList.LIST) // currently supported DROPDOWN and LIST
     ;
}

void draw() {
  background(0);
  
  fill(255);
  if (myCurrentIndex >= 0) {
     text(tokens[myCurrentIndex], 200, 40); 
  }
}

void dropdown(int n) {
  println(n);  
  myCurrentIndex = n;  
}
```

### 実行例

選択した項目がウィンドウ上面に表示されるようになった。
項目選択時には0, 1, 2など項目番号(n)がコンソール出力される。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/5a8c3573-84ff-4a7b-206e-42d540f9cafd.png)

## シリアルリストの表示と選択

Serial.list()により使用できるシリアルポートのリストが取得できる。
それをScrollableListと組合せてみた。

### code

```java
import processing.serial.*;
import controlP5.*;
import java.util.*;

Serial myPort;

ControlP5 cp5;
int myCurrentIndex = 0;
String[] tokens;

void setup() {
  size(400, 400);
  cp5 = new ControlP5(this);
  
  tokens = new String[10];
  tokens = Serial.list();
  
  List l = Arrays.asList(Serial.list());

  cp5.addScrollableList("dropdown")
     .setPosition(100, 100)
     .setSize(200, 100)
     .setBarHeight(20)
     .setItemHeight(20)
     .addItems(l)

     // .setType(ScrollableList.LIST) // currently supported DROPDOWN and LIST
     ;
}

void draw() {
  background(0);
  
  fill(255);
  if (myCurrentIndex >= 0) {
     text(tokens[myCurrentIndex], 200, 40); 
  }
}

void dropdown(int n) {
  println(n);  
  myCurrentIndex = n;  
}
```

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/cba43ad1-e3e5-4a8a-918f-3fc66b74e31e.png)

slidebarでのCOMポート選択よりもこちらの方がまともなUIになりそうだ。