OmniAICreator/Qiita-1.07M huggingface dataset:
技術英語 > that trail's the only clue / the only clue we have / the clue to Chakotay's whereabouts > that trail's the only clue we have to Chakotay's whereabouts

@ Start Trek Voyager > INITIATIONS

副長(Chakotay)失踪に関連してJaneway艦長が

> that trail's the only clue we have to Chakotay's whereabouts

`have to`と見てしまいそうだが、上記を分解すると

`that trail's the only clue`
`the only clue we have`
`the clue to Chakotay's whereabouts`

<hr>
whereabouts

http://eow.alc.co.jp/search?q=whereabout&ref=sa
> 〔人・物の〕行方、居場所、居所、所在、位置◆【用法】単数・複数扱い

単数 (whereabout)、複数(whereabouts)どちらでも使えるように見える。

複数の方が、色々な（場所の）可能性を含んでいるという感じがする。
どこかの文法書にそういうのが掲載されていたが忘れた。
QiitaのシンタックスハイライトがまだPerl6に対応してないみたいどうしよう

# 本文

Advent Calendarで`Perl6`について何か書こうと思っているのですが
Qiita のシンタックスハイライトは現時点で`Perl6`に対応していないため、
`Perl6`のコードを`pl`(=Perl5)で貼るとハイライトが変になることがありそう。

そのときは他の言語を指定して貼ればいいというバッドノウハウ。[^Qiita]

### Perl5

aからz を出力する

##### `pl`(Perl5) を指定

```pl
#!/usr/bin/env perl

use v5.20;
use warnings;

say ( 'a' .. 'z' ); #=> abcdefghijklmnopqrstuvwxyz
say ( 'A' .. 'Z' ); #=> ABCDEFGHIJKLMNOPQRSTUVWXYZ
```

きれい。

### Perl6

aからz を出力する

##### `pl`(Perl5) を指定

```pl
use v6;

@('a'..'z').join.say; #=> abcdefghijklmnopqrstuvwxyz
@('A'..'Z').join.say; #=> ABCDEFGHIJKLMNOPQRSTUVWXYZ
```

…せつない。

##### `rb`(ruby) を指定

```rb
use v6;

@('a'..'z').join.say; #=> abcdefghijklmnopqrstuvwxyz
@('A'..'Z').join.say; #=> ABCDEFGHIJKLMNOPQRSTUVWXYZ
```

##### `bash` を指定

```bash
use v6;

@('a'..'z').join.say; #=> abcdefghijklmnopqrstuvwxyz
@('A'..'Z').join.say; #=> ABCDEFGHIJKLMNOPQRSTUVWXYZ
```

##### `php` を指定

```php
use v6;

@('a'..'z').join.say; #=> abcdefghijklmnopqrstuvwxyz
@('A'..'Z').join.say; #=> ABCDEFGHIJKLMNOPQRSTUVWXYZ
```

おわりです。

# 注釈と参考

[^Qiita]: Qiitaの中の人が12月までにPerl6対応してくれるかもしれない
TensorFlowで深層学習像が変わる？少し触って思った事


先日、Googleは深層学習ライブラリTensorFlowを公開しました。すでに、多くの方が試され、感想や使い方が書かれたりしています。自分も触ってみて、思った事を書きたいと思います。

# 深層学習の説明を初めて読んだ時の自分
よくある深層学習の説明では次のような図を用いて

![pic1.png](https://qiita-image-store.s3.amazonaws.com/0/51820/3a33c6f4-371d-3d9f-aae7-14f7e24a56e3.png "pic1.png")

神経の仕組みを連想させるような仕組みとして紹介されます。データが神経細胞から神経細胞へシナプスを通して伝達され、データを受け取った神経細胞がそのデータを見てまた新しいデータを送信する。


# 深層学習の仕組みがちょっと分かった時の自分
しかし、いざこの図を見てプログラムに反映するとなると、たくさんの細胞を再現しないといけないのではないかと困ります。そこで、同じ機能を持つ神経細胞を塊だと思って、次元の高いベクトル空間を用いて図を簡略化すると分かりやすいと思います。

![pic2.png](https://qiita-image-store.s3.amazonaws.com/0/51820/a91dd896-3a9a-cfea-e719-62423d8ff47d.png "pic2.png")


神経細胞がベクトル空間でシナプスで繋がれているのを何らかの写像（分からない人は関数と思って）だと思いましょう。この写像は多くの場合非線形だが、線形写像（行列で表されるもの）と簡単な形の非線形な関数の合成で表されるようなものを使うものが多いと思う。機械学習ではこの写像を学習によって性能を上げていく。線形写像と非線形な関数の合成になっているような場合なら、線形写像の部分を行列で表して、学習の度にその行列を更新していくという方法が取れます。

# 今ここ
このような理解のもと、TensorFlowの説明を読んでいたところ、グラフを使って深層学習をするんだということはすぐに納得がいけるのですが、「あれ？」と思うことがありました。それは、頂点に関する説明は多くても、辺に当たる部分がほとんど見当たらないことです。さっきの図だと、写像の部分、つまり、グラフの辺を学習により強化していくところなのに、その辺の説明はありません。その代わりに、Variableというのがあって、それを更新することで学習をすることになっているようです。

どうやら、自分の中での深層学習像をもう一度書き換える必要があるようです。

写像の部分は、普通、可変で学習で更新される部分（線形写像の部分）と不変な部分（非線形な関数の部分）に分けられることに注目しよう。可変な部分は数値の何らかの列で表される。これをVariableとして、辺に組み込むのではなく頂点として扱うというのがTensorFlowのスタイルと理解できるのではないだろうか。辺から頂点へ切り離すことで、データと関数を分離を実現し、入力からくるデータと学習データを同格に扱っているのだ。そうすると次の図のようなイメージになる。
![pic3.png](https://qiita-image-store.s3.amazonaws.com/0/51820/18dc97cc-ea56-b671-6f8c-d374cbec2187.png "pic3.png")

学習の際に、辺を逆流して、学習データ部分を更新していく。そのようなイメージで考えると、他のアプリケーションなどの仕組みに似たものとして、深層学習が捉えられるのではないでしょうか。
8 Best Push Notification Services to drive mobile app engagement 

Push Notification Services are one of the best ways to keep users interested and engaged. Push notification services have come on a lot in recent years. The degree of personalized content and the richness of the media you can now push at users is staggering. We look at the top 8 Push Notification Services for Mobile Apps.
https://www.kumulos.com/2015/11/11/top-8-best-push-notification-services-for-mobile-apps/
Linux　android studio の　kvm 設定

いつも忘れてあたふたする

If you are running the emulator from Android Studio, run your Android application with an x86-based AVD and include the KVM options:
In Android Studio, click your Android module folder and then select Run > Edit Configurations...
In the left panel of the Run/Debug Configurations dialog, select your Android run configuration or create a new configuration.
Under the Target Device options, select the x86-based AVD you created previously.
In the Emulator tab, in the Additional command line options field, enter:
-qemu -m 512 -enable-kvm
Run your Android project using this run configuration.
Important: When using the -qemu command line option, make sure it is the last parameter in your command. All subsequent options are interpreted as qemu-specific parameters.
BitConverterは速いって話をしたな。あれは嘘だ。

すいません。ごめんなさい。

http://qiita.com/yu_ka1984/items/f350bba80b08d6c30bec

コードの最適化ありなしで速度が変わる事がわかりました。

コード最適化なし
>BitConverter 50ms
Marshal 802ms
unsafe 140ms

コード最適化ある
>BitConverter 49ms
Marshal 631ms
unsafe 32ms

現実的にコード最適化しないとかないのでBitConverterよりunsageの方が速いです。
unsafeとコード最適化のからみはいずれ調べたいです。
rails-assetsでbootstrap-sassを使う際にglyphiconのパスでハマらない為のメモ

# glyphiconのパスで悩まないために！

RailsプロジェクトでBootstrap3を適用したい際に、最近はrails-assetsをよく使っています。
今回も同様にそのようにしようとしたところ、glyphiconが表示されない現象に悩まされました。

<img width="268" alt="glyphiconが表示されない例" src="https://qiita-image-store.s3.amazonaws.com/0/10078/bfcdd967-c707-7e8f-fba1-1f882254998e.png">こんな感じのやつですね！！

今回は同様のことが起きてみなさんの時間を無駄にしないようにするために、簡潔にメモを残したいと思います。

## bootstrap-sassをrails-assets経由でインストール

まずはrails-assets経由でbootstrap-sassをインストールします。今回は、bootstrap-sass-officialを使います。
以下をGemfileに追加します。

```ruby:Gemfile
source 'https://rails-assets.org' do
  gem 'rails-assets-jquery', '1.11.3'
  gem 'rails-assets-jquery-ujs'
  gem 'rails-assets-bootstrap-sass-official', '3.3.5'
end
```

`bundle install`しましょう。

これでインストールは終わりました。

## assets以下の設定

では、rails-assetsでインストールしたものをassetsで読み込みましょう。

## JavaScript(CoffeeScript)

こちらは特に迷うことはありません。普通です。

```coffeescript:assets/javascripts/application.coffee
#= require jquery
#= require jquery-ujs
#= require turbolinks
#= require bootstrap-sass-official
#= require_tree .
```

## CSS(SASS)

肝はこちらです。`$icon-font-path`を設定します。

```scss:assets/stylesheets/application.scss
$icon-font-path: "bootstrap-sass-official/assets/fonts/bootstrap/";
@import "bootstrap-sass-official/bootstrap-sprockets";
@import "bootstrap-sass-official";
```

なんかめっちゃ長いですよね…。おかげですごくハマったんですが。
参考にしたqiitaの記事の[Use Bootstrap-Sass 3.x and Font Awesome (bower-rails vs. rails-assets)](http://qiita.com/izumin5210/items/73f93347a9fe458dbbf5#rails-assets%E3%81%A7bootstrap--font-awesome)では、

```scss
$icon-font-path: "bootstrap-sass-official/";
```

と書いてありますが、これは間違いじゃないかなと思います…。（当時は動いていたのかもしれないですが）

### どうして気付いたのか

先の記事のようにしても全然表示されないため、IntelliJのExternal Libraryを掘っていって、該当gem(rails-assets-bootstrap-sass-official)のディレクトリ構成を見ました。

<img width="456" alt="gem rails-assets-bootstrap-sass-officialのディレクトリ構成" src="https://qiita-image-store.s3.amazonaws.com/0/10078/1ffdab54-0c3a-d10f-6cf6-750b6b3fe33b.png">

なんか、やけに長いですよね。IntelliJで開いているせいか、パッケージっぽい表示になってしまっています。.(ドット)のつながりはディクレトリなので、実際は、`fonts/bootstrap-sass-official/assets/fonts/bootstrap`です。これを、最初のfontsを外して、`$icon-font-path`に指定しました。

## 結果

<img width="265" alt="glyphiconが表示された例" src="https://qiita-image-store.s3.amazonaws.com/0/10078/0b69544d-e35c-421b-ee66-bc95b7cea9a5.png">ジャジャーン！

## 感想

なんで`$icon-font-path`が長ったらしくなるんや…。
ググっても似たようなキーワードだといい情報に出会えなかったので、そういうときはgemのインストールディレクトリを掘っていきましょう。
FontAwesomeのiconをulやolのlist-styleに使う方法

FontAwesomeのiconをulやolのlist-styleに使いたくなることってありますよねー。
残念ながら、list-styleに直接アイコンを使うことは出来ないのですが、以下の方法を使えば、同じようなことが実現できます。

**HTML**

```html
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css">
(中略)
<ul>
  <li>人間失格</li>
  <li>斜陽</li>
  <li>ヴィヨンの妻</li>
</ul>
```

**CSS**

```css
ul {
  list-style: none;
}
li:before {
  font-family: FontAwesome;
  content: '\f054'; /* アイコンのunicode */
}
```
**li:before**に設定する**content**にはバックスラッシュに続けて、FontAwesomeサイトのアイコン詳細ページ(上の例だと[ここ](http://fortawesome.github.io/Font-Awesome/icon/chevron-right/))に描かれてる**Unicode**の値を書きます。

[デモ](https://jsfiddle.net/8t6fxdhk/)で実際にどうなるか御覧ください。
複数パスをUnity上でまとめて選択するウインドウ


##概要
Unityで作業していると異なるディレクトリにあるファイルを複数選択したい時がよくあります。
結構手間だったので複数パス貼り付けて一気にオブジェクトを選択するウインドウを作りました。

1.SourceTree等でクリップボードへのパスをコピー
2.カスタムウインドウにペースト
3.選択ボタンを押す

この操作でUnity上で簡単に複数オブジェクトの選択ができます。
 




![スクリーンショット 2015-11-11 1.25.52.png](https://qiita-image-store.s3.amazonaws.com/0/67497/346204b0-94fc-852e-0c21-47e12eacd2cc.png "スクリーンショット 2015-11-11 1.25.52.png")

![スクリーンショット 2015-11-12 1.32.01.png](https://qiita-image-store.s3.amazonaws.com/0/67497/158cd964-bc9b-d52c-b510-b0e6c8ba7e89.png "スクリーンショット 2015-11-12 1.32.01.png")

##コード
```csharp
using UnityEditor;
using UnityEngine;
using System.Collections;
using System.Collections.Generic;

/// <summary>
/// パスからUnity上でまとめてオブジェクトを選択するセレクトするウインドウ. 
/// </summary>
public class CustomSelectWindow : EditorWindow {
    string text;

    [MenuItem ("Custom/PathSelector")]
    static void Init () {
        EditorWindow.GetWindow (typeof (CustomSelectWindow));
    }

    void OnGUI() {
        EditorGUILayout.HelpBox ("アセットのパスを改行かカンマで区切った文字列をペーストしてください", MessageType.Info);
        string prev = text;
        text = EditorGUILayout.TextArea (text, GUILayout.Height (120), GUILayout.ExpandWidth (true));

        if (GUILayout.Button ("選択", GUILayout.MaxWidth (100))) {
            Select(text);
        }
    }

    public static void Select(string paths)
    {
        paths = paths.Trim ();
        string[] split = paths.Split (new char[]{ '\n', ',' });
        List<Object> objs = new List<Object>();
        foreach (string path in split) {
            // Assetsから前は削除
            string fromAssets = path.Substring(path.IndexOf("Assets"));
            Object obj = AssetDatabase.LoadAssetAtPath (fromAssets, typeof(Object));
            if (obj) {
                Debug.Log ("Selection Add : " + fromAssets);
                objs.Add (obj);
            }
        }

        // 選択
        Selection.objects = objs.ToArray();
    }
}
```
Java8のStreamでListや配列を初期化する

JavaでListや配列を任意の値で初期化したい場合、Java8ならStreamを使って、すっきりかけます。

#例）```hoge```という文字列で初期化した要素数10のList／配列
##Listの場合
```java

List<String> list = Stream.generate(() -> "hoge").limit(10).collect(Collectors.toList());
```

##配列の場合
```java
String[] array = Stream.generate(() -> "hoge").limit(10).toArray(String[]::new);
```

Stream、いいですね！
RPGツクールMVのデータ解析対策をしてみる

Steam版を購入した方、デジカで海外版を買った方、テスターの方、まだ買ってない方、こんにちわ
快適なMVライフをお過ごしでしょうか？

凄いですねMV、ついにMacにもスマホにも対応、新時代のツクールです。

しかし、強引なマルチプラットフォーム化の代償が・・・・・・

![0.png](https://qiita-image-store.s3.amazonaws.com/0/100325/adcbd73e-6a11-b071-83aa-8c4c6a79353c.png)

**デデドン（絶望）**

**デプロイメント（出力）したら、画像もBGMもすべてのデータが丸見えになってしまいます。**

データ丸見えなのでぶっこぬきや無断での素材複製、プログラムの改変なんでもやり放題です

MV以前のVX Ace等はこれらすべてのデータを暗号化して圧縮し、改変・解析はできない仕組みでした。

しかし、MVはすべて丸見え。
同人屋の自分としては、これは非常にマズい。フリー配布にしても、中身丸見えはいい気がしませんよね。


一応、対策がないわけではないです。
すべてのデータを圧縮して1つのファイルにまとめ、解析を困難にするツールがあります
それがこのEnigma VirtualBox
http://enigmaprotector.com/en/aboutvb.html

しかし、このツールにも難はあります
・英語
・手順がけっこう複雑で、使いこなすのがちょい難しい
**・あまりに広く使われているツールなので、複合化しデータをぶっこ抜くツールが存在している
・そのツールは容易に入手可能で誰でも使えてしまう**


ガバガバじゃないか（絶望）


結局Enigma VirtualBoxも危なさげ。

しかし、ネットの海を調べまくったところ、ほぼWindows標準の機能だけを使って、より解析困難にする方法を見つけ出すことに成功しました。

その方法とは・・・・・・


データをzipに圧縮して、ゲームの実行プログラムと結合してしまえば解析困難になる！

参考にしたサイト
http://lealog.hateblo.jp/entry/2015/03/02/234536


・じゃあ、やってみよう！

1.まずは、MVのデプロイメントで書き出します
![1.png](https://qiita-image-store.s3.amazonaws.com/0/100325/9fa1ff25-332f-f463-9ba3-336aad3a73c8.png)


 
2.**フォルダ内のGame.exe以外を全て選択**し、zipに圧縮します。
zipファイルの名前は**「data.zip」**にします
 
 
![2.png](https://qiita-image-store.s3.amazonaws.com/0/100325/b2d2e526-b22a-b6d9-ea47-32cbc82db97f.png)
 
![3.png](https://qiita-image-store.s3.amazonaws.com/0/100325/a54f6744-74dd-e47d-1996-c2c53fdd0d45.png)

次に、メモ帳に次の内容をコピペし、「merge.bat」の名前で保存し、MVの**デプロイメントで書き出したフォルダ**の中にコピーします。

**注意！ 作業中のプロジェクトフォルダに入れないでください。作業データ全部ぶっ飛びます。私のゲームデータはそれをやらかして消え去りました（涙）**

```lang:merge.bat
rename data.zip data.nw
copy /b Game.exe+data.nw release.exe
del Game.rpgproject
del data.nw
del Game.exe /Q
rmdir www /s /q
```

![5.png](https://qiita-image-store.s3.amazonaws.com/0/100325/8ae761e9-93dc-2df9-c0bd-46ccc532abaa.png)

merge.batを実行すると、データが統合・削除され、リリースしても安全なデータになります
![6.png](https://qiita-image-store.s3.amazonaws.com/0/100325/d9b63b95-3988-1968-c8c5-ba1f8f207ec3.png)

ここまで終わったら、merge.batは削除してかまいません。


・終わりに
いろいろ書きましたが、この方法も万全ではありません（Enigma Virtual Boxよりマシだけど）
PCに詳しい方なら、これでも解析できてしまうでしょう。
MVユーザー安息の地はまだまだ遠い



なんとかしてくださいよEnterbrainさん（涙）
ShinobiLayer: Windows2012 R2のシステムバックアップとリストア(2)

[前回](http://qiita.com/testnin2/items/665910dcc1e2ac70cc4c)の続き。今回はリストア編です。

#障害の想定と回復
何か障害が発生したものとして、OSが全く起動しなくなったことを仮定して、OS reloadを実行します。OS reloadは（現時点での仕様では）Cドライブのみリストアしてくれます。また、同一仮想サーバーを上書きする形でOSを再導入するため、IPアドレスが変更されることはありません。
※システムに何らかの異常はあるが、OSとしては起動するというのであれば、OS reloadは不要です。次の項目に進んでください。

#OS reload後のリストア作業
1. KVMコンソールでOSにログイン（RDPからでは以下のshutdownコマンドは実行できません）
2. コマンドプロンプトにて、`shutdown /r /o /t 0`　を実施<br>
![restore01.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/7443a86e-e0be-88b8-2023-73d053aa2197.jpeg)
3. Troubleshootを選択<br>
![restore02.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/4006f5ed-9189-813d-258d-a0a0773ed2b1.jpeg)
4. System Image Recoveryを選択（この後OSの再起動がかかる）<br>
![restore03.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/53e4c5ee-9a3e-d3b4-7a96-d12b8975299c.jpeg)
5. KVMコンソールを使って再接続
6. Administratorを選択<br>![restore04.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/91e823a3-f267-facc-3542-bf930c80e12d.jpeg)
7. Administratorのパスワードを入力。ここでのパスワードは当然OS reload後のもの。<br>![restore05.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/2d5db1a5-a67b-6c12-7b64-840086e42733.jpeg)
8. "Select a system image"を選択<br>![restore06.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/2b32b078-380d-1b57-0677-33c75b0890c8.jpeg)
9. 該当のイメージの配置先を選択。<br>![restore07.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/cf7d477e-0665-e792-a33f-774e94d1d734.jpeg)
<br>ちなみにNASにイメージが配置されている場合は、上記画面で"Advanced"を選択し、以下の"Search for a system image on the network"を選択する。<br>![restore07_network.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/5c88eb89-778c-c097-36b2-8b0de7230755.jpeg)
10. 該当のイメージを選択<br>![restore08.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/836a0189-f9b0-eb83-ec69-9521c8deb9a9.jpeg)
11. defaultのまま特にいじらなない。<br>![restore09.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/6e2f3f31-4c56-0b92-c731-307eae43657c.jpeg)
12. 確認した後、"Finish"を選択。<br>![restore10.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/ec34c6cd-81d0-891d-0763-99baadbc13c2.jpeg)
13. ここでも確認した後、"Yes"を選択。<br>![restore11.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/f869a23d-dcca-5ca1-f837-c979744b08ba.jpeg)
14. ということで、無事日本語化したOSに復元できました。この最終状態では、KVM ConsoleのパスワードはOS reload時のものであり、Administratorのパスワードはリストア前のイメージのものになるので注意。![restore12.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/49bd02b1-1fb0-73a8-50fb-575a1dbd768c.jpeg)
[メモ]Djangoのプロジェクト作成と用語

## MTV型フレームワーク
Model 　　データのまとまり
Templete 画面表示する雛形
View 　　 画面遷移先の制御

http://djangoproject.jp/doc/ja/1.0/faq/general.html

## 環境構築
#### Pythonのパッケージソフトウェア管理ツールをインストール

```
sudo easy_install pip
```

#### Djangoのインストール

```
sudo pip install django
```

## プロジェクトの作成

```
django-admin.py startproject プロジェクト名
```

下記の様な物が作成される
プロジェクト名
├── manage.py
├── プロジェクト名
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   ├── wsgi.py

## マイグレーションの利用に関して

```
python manage.py startapp アプリケーション名
```

下記の様なのが構成される
├── アプリケーション名
│   ├── __init__.py
│   ├── admin.py // DBをいじるための管理画面に必要な物
│   ├── models.py // DB Model
│   ├── tests.py
│   └── views.py

Modelを作成する
adminの設定を行う

```
python manage.py makemigrations アプリケーション名
```

アプリケーションにモデルを基にmigrationsの追加構成される
├── アプリケーション名
│   ├── __init__.py
│   ├── admin.py
│   ├── migrations // DBの定義構成するためのファイルがある
│   │   ├── 0001_initial.py
│   │   └── __init__.py
│   ├── models.py
│   ├── tests.py
│   └── views.py

```
python manage.py syncdb
```

DB定義更新的な物
Scalaでサロゲートペア文字を除去する…から脱線してscala-java8-compatを使う話

[[scala | java] サロゲートペア文字列を排除する](http://komaken.me/blog/2014/06/07/scala-java-%E3%82%B5%E3%83%AD%E3%82%B2%E3%83%BC%E3%83%88%E3%83%9A%E3%82%A2%E6%96%87%E5%AD%97%E5%88%97%E3%82%92%E6%8E%92%E9%99%A4%E3%81%99%E3%82%8B/)
こちらの記事を参考にしつつ、`var`や`do~while`を使わず書きたい、というのが出発点。

### [java.text.BreakIterator](http://docs.oracle.com/javase/jp/8/api/java/text/BreakIterator.html) を使う(1)

```scala
  def removeSurrogate(s: String): String = {
    val itr = BreakIterator.getCharacterInstance
    itr.setText(s)
    val last = itr.last()
    Iterator.iterate((itr.first(), Option.empty[Char])) { case (index, _) =>
      val c = PartialFunction.condOpt(index) {
        case i if i < last && s.codePointAt(i) <= 0xFFFF => s.charAt(i)
      }
      (itr.next(), c)
    }.takeWhile { case (i, _) => i != BreakIterator.DONE}.toList.unzip._2.flatten.mkString
  }
```

元記事を少し書き直した版。

### java.text.BreakIterator を使う(2)

```scala
  def removeSurrogate(s: String): String = {
    val itr = BreakIterator.getCharacterInstance
    itr.setText(s)
    val last = itr.last()
    Iterator.iterate(itr.first())(_ => itr.next())
      .takeWhile(i => i < last && i != BreakIterator.DONE)
      .collect { case i if s.codePointAt(i) <= 0xFFFF => s.charAt(i)}
      .toList.mkString
  }
```

(1)と大差ない気もするけど…。

余談だけど、`itr.next()` は直前に `itr.last()` を呼んでいると `BreakIterator.DONE` が返るので少しハマッた…。
Javadocに `first()`, `last()`, `next()` でそれぞれイテレータの現在位置を設定すると書かれているのでドキュメントに目を通せば済む話ではあるのだけど…。

```scala
val first = itr.first() // 最初の位置を取ろう
val last = itr.last() // 最後の位置を取ろう
val n = itr.next() // 順番に境界を…と思ったら -1 !?
```

### [CharSequence.codePoints](http://docs.oracle.com/javase/jp/8/api/java/lang/CharSequence.html#codePoints--) を使う

`s.codePointAt(i)` を繰り返し処理で取らなくても、便利なのがJava8から入ってる！
という事でこれを使う。
返り値は `IntStream` になるので、Java Stream API の `filter` などが使えるようだ。

```scala
  def removeSurrogate(s: String): String = {
    s.codePoints.toArray.collect { case i if i <= 0xFFFF => i.toChar }.mkString
  }
```

こんな感じで一旦配列にしてScalaの `collect` を呼んでもいいけど、せっかくなので Stream API を上手い具合にScalaで書けないものか。

### CharSequence.codePoints を使う (Java Stream API with scala-java8-compat)

`scala.collection.JavaConversions._` でのJavaとScalaのコレクション変換のようなノリで、
`java.util.function.IntPredicate` と `scala.Function1[scala.Int , scala.Boolean]` などを変換できないかな、と調べてみたところ、
[scala-java8-compat](https://github.com/scala/scala-java8-compat)の存在を知った。

```scala
  import scala.compat.java8.FunctionConverters._

  def removeSurrogate(s: String): String = {
    val f: Int => Char = _.toChar
    val p: Int => Boolean = _ <= 0xFFFF
    s.codePoints.filter(p.asJava).mapToObj(f.asJava).toArray.mkString
  }
```

おお、やりたかったイメージに近い。
一旦変数に置いて`.asJava`を呼ばないといけないのがイマイチな気もするが…
サロゲートペア文字を除去する関数もそれなりにシンプルに書け、
scala-java8-compat も試せて良かった。
(とはいえ、比べてみると先に`toArray`して`collect`を呼ぶひとつ前の書き方のほうがシンプルなようにも思えるな…)

### 追記: [Character.isSurrogate](http://docs.oracle.com/javase/jp/8/api/java/lang/Character.html#isSurrogate-char-) を使う

コメントで教えてもらったけど、ややこしい事やらずにこれが一番シンプルかな。

```scala
  def removeSurrogate(s: String): String = {
    s.toCharArray.filterNot(_.isSurrogate).mkString
  }
```
BitConverterは速いってお話は嘘かもしれない

BitConverterのパフォーマンスってどうなのかなって思ってたから調べてみた。

```csharp

    class Program
    {
        const int COUNT = 1000000;
        static void Main(string[] args)
        {
            var basearray = Enumerable.Range(0, 1024).Select(x => (byte)x).ToArray();

            var sw = Stopwatch.StartNew();
            for (var i = 0; i < COUNT; i++)
            {
                var buffer = BitConverter.ToInt64(basearray, 2);
            }
            sw.Stop();

            Console.WriteLine($"BitConverter {sw.ElapsedMilliseconds}ms");

            sw = Stopwatch.StartNew();
            for (var i = 0; i < COUNT; i++)
            {
                var buffer = BtoS<Int64>(basearray, 2);
            }
            sw.Stop();

            Console.WriteLine($"Marshal {sw.ElapsedMilliseconds}ms");

            sw = Stopwatch.StartNew();
            for (var i = 0; i < COUNT; i++)
            {
                var buffer = ToInt64(basearray, 2);
            }
            sw.Stop();

            Console.WriteLine($"unsafe {sw.ElapsedMilliseconds}ms");



            Console.ReadKey();
        }

        private static T BtoS<T>(byte[] bytes, int startIndex) where T : struct
        {
            GCHandle handle = GCHandle.Alloc(bytes, GCHandleType.Pinned);
            T stuff = (T)Marshal.PtrToStructure(handle.AddrOfPinnedObject() + startIndex,
                typeof(T));
            handle.Free();
            return stuff;
        }

        unsafe static void PutBytes(byte* dst, byte[] src, int start_index, int count)
        {
            for (int i = 0; i < count; i++)
                dst[i] = src[i + start_index];
        }

        unsafe static Int64 ToInt64(byte[] bytes, int startIndex)
        {
            Int64 ret;

            PutBytes((byte*)&ret, bytes, startIndex, 8);

            return ret;
        }

    }
```



BitConverter 29ms
Marshal 809ms
unsafe 123ms

BitConverterは速い。
でも書くのメンドクサイ。BitConverter.toInt64(なんてかいてられるかばかやろ～

すいません。コード最適化によって結果が変わります。
http://qiita.com/yu_ka1984/items/fa403894af35a3f3925c
gvimにquickhlを導入するよ。

# 概要

vim任意の単語や文字列をハイライト表示する「quickhl」というプラグインがあるそうです。


- [vim-jp &raquo; Hack #226: 複数のキーワードを手軽にハイライトする](http://vim-jp.org/vim-users-jp/2011/08/31/Hack-226.html)

これは便利そう！
と思ったのですが、Windows(gvim)だしVundleも導入していないしどうしたものかと。

振り返れば難しい手順ではなかったですが、次やる時は忘れていると思うので、綴っておきます。

※ちなみに、Cygwinのvimでも同様の手順で導入可能でした。

# 導入するもの

- operator-user
- quickhl

# 手順

## operator-userの導入
※quickhlを動かすのに必要だよ！
### 1. ダウンロード
- http://www.vim.org/scripts/script.php?script_id=2692
- https://github.com/kana/vim-operator-user

↑ここら辺から.zipをダウンロードして展開してね！

### 2. vimフォルダに投入！
展開されたフォルダから、

- autoload
- doc

をvimフォルダにコピーしてね！

※Cygwinの場合は `cygwin/usr/share/vim/vim*/` にコピー

![ss_109.png](https://qiita-image-store.s3.amazonaws.com/0/97611/2d449099-9f06-8845-27c9-9fb95f184551.png)

## quickhlの導入

### 1. ダウンロード
- http://www.vim.org/scripts/script.php?script_id=3692
- https://github.com/t9md/vim-quickhl

↑ここら辺から.zipをダウンロードして展開してね！

### 2. vimフォルダに投入！

展開されたフォルダから、

- autoload
- doc
- plugin

をvimフォルダにコピーしてね！

※Cygwinの場合は `cygwin/usr/share/vim/vim*/` にコピー

![ss_110.png](https://qiita-image-store.s3.amazonaws.com/0/97611/8f635c49-14e2-97e3-4c04-a537e9b452e6.png)


### 3. キーマップ設定

quickhlを使いやすくするために、キーマップを設定するよ。

```vim:_vimrc
nmap <Space>m <Plug>(quickhl-manual-this)
xmap <Space>m <Plug>(quickhl-manual-this)
nmap <Space>M <Plug>(quickhl-manual-reset)
xmap <Space>M <Plug>(quickhl-manual-reset)
```

_vimrcに上の4行を追記してね！


# 動作確認
### 1. 起動

![ss_111.png](https://qiita-image-store.s3.amazonaws.com/0/97611/8ddd0f88-1b13-19e6-c89b-e4040b98646a.png)
gvimを起動してね！

### 2. 単語をハイライト
任意の単語の上にカーソルを持っていき、
![ss_112.png](https://qiita-image-store.s3.amazonaws.com/0/97611/c51c9337-8725-6c24-bd0c-7e6fe039ae23.png)

`Space` + `m` を押すと…

![ss_113.png](https://qiita-image-store.s3.amazonaws.com/0/97611/2d669466-29af-44d9-33e1-b62cfdabc829.png)
カーソルがある位置の単語がハイライトされるよ！


### 3. 選択した文字列をハイライト
`v`で選択モードに入り、任意の文字列を選択した状態にして、
![ss_114.png](https://qiita-image-store.s3.amazonaws.com/0/97611/e400e43a-270c-25c8-5271-d410a5bac5ae.png)

`Space` + `m` を押すと…

![ss_115.png](https://qiita-image-store.s3.amazonaws.com/0/97611/59c9cf75-4799-8cb0-97e1-903d882be743.png)
選択していた文字列がハイライトされたね！

### 4. ハイライトを解除
解除したい単語の上にカーソルを持っていき、
![ss_116.png](https://qiita-image-store.s3.amazonaws.com/0/97611/139f8225-9af9-f34a-ac5c-ce3f01e817ae.png)

`Space` + `m` を押すと…

![ss_117.png](https://qiita-image-store.s3.amazonaws.com/0/97611/74e73ad3-df81-1a56-0f75-9a9c1ec13b5f.png)
単語のハイライトが解除されたね！

同様に、任意の文字列のハイライトを解除する場合は、範囲指定した状態で `Space` + `m` だよ！

それと、一度に全部のハイライトを解除したい場合は `Space` + `M`

とっても簡単ね！
JSP/サーブレット Cookieの設定・取得

JSP/サーブレットでのCookieの設定と取得についての備忘録です。

# Cookieの設定
Cookieクラス(javax.servlet.http.Cookie)のオブジェクトを生成して、名前とそれに紐づく値を設定します。
そしてCookieオブジェクトをレスポンスに付加して返します。

```java:Cookieの設定
protected void doGet(HttpServletRequest request, HttpServletResponse response){
  Cookie cookie = new Cookie("XxxName", "XxxValue");
  cookie.setValue("YyyName", "YyyValue");
  // 90日間有効なCookie
  cookie.setMaxAge(60 * 60 * 24 * 90);
  response.addCookie(cookie);
}
```

# Cookieの取得
設定よりも簡単で、getCookiesメソッドでリクエストからCookieオブジェクトを取得するだけです。

```java:Cookieの取得
protected void doGet(HttpServletRequest request, HttpServletResponse response){
  // 存在しなければnullとなる
  Cookie[] cookies = request.getCookies();
  for (Cookie cookie : cookies) {
    System.out.println(cookie.getName() + ":" + cookie.getValue());
  }
}
```

# Cookieのプロパティ
Cookieのプロパティは以下で設定・取得します。

| Setter | Getter | 説明 |
|:--|:--|:--|
| setComment(String) | getComment() | コメント |
| setDomain(String)  | getDomain() | 生成されたドメイン名(RFC2109) |
| setHttpOnly(boolean) | isHttpOnly() | HTTP通信ヘッダのみで有効なCookieか否か(デフォルトはfalseで無効) |
| setMaxAge(int) | getMaxAge() | 有効期限(秒) |
| setPath(String) | getPath() | クライアントがCookieを返す対象のパス |
| setSecure(boolean) | getSecure() | HTTPSまたはSSLの場合にのみCookieを送る（デフォルトはfalse） |
| setValue(String, String) | getValue(String) | Cookieに値を設定・取得する |
| setVersion(int) | setVersion() | Cookieのプロトコルバージョン(0ならNetscape Cookie、1ならRFC2109) |
バイト配列の部分コピーの速度のおはなし

過去皆さん書いてることだけどね。
わかってることだけど速さ必要なところでサボってlinqで書いちゃいけないよってね(;・∀・)

```csharp
    class Program
    {
        const int COUNT = 1000000;
        static void Main(string[] args)
        {
            var basearray = Enumerable.Range(0, 1024).Select(x => (byte) x).ToArray();

            var sw = Stopwatch.StartNew();
            for (var i = 0; i < COUNT; i++)
            {
                var buffer = basearray.Skip(20).Take(20).ToArray();
            }
            sw.Stop();
            
            Console.WriteLine($"linq {sw.ElapsedMilliseconds}ms");
       
            sw = Stopwatch.StartNew();
            for (var i = 0; i < COUNT; i++)
            {
                var buffer = new byte[20];
                Array.Copy(basearray, 20, buffer, 0, 20);
            }
            sw.Stop();

            Console.WriteLine($"ArrayCopy {sw.ElapsedMilliseconds}ms");

            sw = Stopwatch.StartNew();
            for (var i = 0; i < COUNT; i++)
            {
                var buffer = new byte[20];
                Buffer.BlockCopy(basearray, 20, buffer, 0, 20);
            }
            sw.Stop();

            Console.WriteLine($"BlockCopy {sw.ElapsedMilliseconds}ms");


            sw = Stopwatch.StartNew();
            var ptr = Marshal.AllocCoTaskMem(basearray.Length);
            Marshal.Copy(basearray, 0, ptr, basearray.Length);
            try
            {
                
                for (var i = 0; i < COUNT; i++)
                {
                    var buffer = new byte[20];
                    Marshal.Copy(ptr + 20, buffer, 0, 20);
                }
            }
            finally
            {
                Marshal.FreeCoTaskMem(ptr);
            }
            sw.Stop();

            Console.WriteLine($"marshal {sw.ElapsedMilliseconds}ms");

            Console.ReadKey();
        }
```

linq 1622ms
ArrayCopy 71ms
BlockCopy 55ms
marshal 62ms
Laravel5のお勉強 -第八回 Circle CIでHerokuにAutoDeploy-

# Laravel5のお勉強
[第一回 環境構築](http://qiita.com/yu_eguchi/items/0426ea0a41489e96dd33)
[第二回 ControllerとViewの追加](http://qiita.com/yu_eguchi/items/d6ac0fa3e0014db536c3)
[第三回 Database連携(Mysql)](http://qiita.com/yu_eguchi/items/e272a8d34e714f8249df)
[第四回 モデルの作成/tinker紹介](http://qiita.com/yu_eguchi/items/419a2a081ff142ecf67f)
[第五回 テストデータの挿入/Fakerの使用](http://qiita.com/yu_eguchi/items/9af6eed45e14505f6ecc)
[第六回 CRUDの作成](http://~)
[第七回 Herokuにdeploy](http://qiita.com/yu_eguchi/items/34fce39a07c79591f4af)

# 第八回 Circle CIでHerokuにAutoDeploy
## 前提条件
Mac OS yosemite
PHP 5.5以上
Mysql 5.6以上
Herokuにアカウント登録済み
Githubアカウント登録済み

## 目的
前回は本番環境としてherokuにdeploy & 公開しました。
しかし、毎回コマンドで

```
git push heroku master
```

とか書くのもだるいですし、<font color="red">**エンジニアは開発にのみ専念すべき**</font>です。
なので、「<font color="red">**Deployを自動化します。**</font>」

Circle CIを使います。

## CIって??

継続的インテグレーションのこと

▼http://itpro.nikkeibp.co.jp/article/COLUMN/20121023/431822/
上記より抜粋
```
CIとは、ソフトウエア開発においてコンパイルやテストといったビルド処理を一日に何度も実行することにより、フィードバックサイクルを短くし、品質を向上させる仕組みのことです。
```
今回はCIツールの中でも、Githubアカウントがあれば誰でも無料枠から使えるCircle CIを使います。
https://circleci.com/

## Circle CIでLaravelをbuildするのに必要なこと

CircleCIを開いたら、管理画面が表示されるので、githubリポジトリから、対象のアプリを選択すれば良い。
いきなりbuildを行うこともできるが、errorでfailします。

なので、まずはCirclCIを行いたいLaravelアプリのroot直下に以下を作成・配置します。

```
$ vi circle.yml 
     1	machine:
     2	  php:
     3	    version: 5.6.14
```

この記述をしないと、デフォルトの設定でbuildが走り、私が試した際は「php 5.3.0でbuildしようとしますが、このアプリが求める最低PHPversionは5.5です」とエラーが吐き出され、failしました。
なので、明示的にCircleCIに

```
version: 5.6.14
```

だと教えてあげるのです。
このファイルをgit pushすれば自動でCircle CIが走ります。
今度はSuccessすると思うので、試してみてください。

## Circle CIからbuild完了時にherokuにdeployする方法

まずCircle CIからherokuにdeployするためには

1. HerokuアプリのAPIKey登録
2. HerokuアプリへのSSHKey登録
3. Circle CIの設定ファイル(circle.yml)に追記

この作業が必要になりますので、Herokuのアカウント設定から上記2つを作成してください。
[ここ](https://dashboard.heroku.com/account)から設定・取得できます。
SSHKeyはlocal環境で鍵をgenerateしてから、heroku add:keysで登録すればOKです。

鍵の作成は以下

```
ssh-keygen -t rsa -C "メールアドレス"
```

上記で作成された公開鍵(id_rsa.pub)をherokuに登録すれば完了です。

```
heroku keys:add ~/.ssh/id_rsa.pub 
```

あとはCircle CIのdeploy設定画面で、上記の鍵と、APIkeyを設定すれば準備完了。

最後に、ymlを修正です。

```
$ vi circle.yml 
     1	machine:
     2	  php:
     3	    version: 5.6.14
     4	deployment:
     5	  staging:
     6	    branch: master
     7	    heroku:
     8	      appname: 【あなたが登録したherokuアプリ名(heroku appsコマンドで確認可能)】
```

## 実行!!

これで

1. localでファイル修正
2. git add -> commit -> push!!
3. 勝手にbuild -> herokuに最新版がdeploy!!

とHAPPYになれます。

CircleCIでbuildした際に、コマンドを実行したい、例えば、shを叩きたいとか。も簡単にできます。

▼例

```
commands:
      - ./deploy_prod.sh
```

こんな感じで、「commands」内にいくらでも好きなコマンドを実行できます。
scp ローカルからリモートへ(OSX版 -i -p オプション付き)


#環境
OSX Yosemite

###コマンド
`scp -i ./identity_file -P 60022 -r ./local_path/send_file username@hostname:~/remote_path/`

###経緯
manみてオプション確認しても ローカルとリモートのパスの順番は分からなかった。
webに載ってたのはこれだけど、いかない...
`scp ユーザ名@リモートのホスト名:コピーしたいリモートのファイル ローカルのコピー先`
Linuxと同じと思わせて微妙に違う。OSXの悪い点。
Androidのビルドを高速化するあれこれ

※効果はプロジェクトや環境によって異なるので参考程度に

# gradle.propertiesの設定


```gradle.properties
# JVMのメモリ設定
org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8

# 並列ビルド
org.gradle.parallel=true

# デーモン（CIではOFFにした方がいいらしい）
org.gradle.daemon=true

# オンデマンド
org.gradle.configureondemand=true


```

あんまり効果ありませんでした。

# Gradleのバージョンを上げる

Gradle 2.2.1を使っていたので最新の2.8にあげてみました。2.4で高速化が入ってるらしいです。

```gradle/wrapper/gradle-wrapper.properties
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
# ここを2.8にする
distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
```

まあまあ効果ありました。

# Google Play Servicesを必要なものだけリンクする

Google Play Services は6.5から必要なパッケージだけリンクできるようになってます。必要な物だけ使うことで、無駄なクラスをビルドしなくてよくなります。
参考：https://developers.google.com/android/guides/setup


```app/build.gradle
// before
// compile 'com.google.android.gms:play-services:8.3.0'

// after
compile 'com.google.android.gms:play-services-auth:8.3.0'
compile 'com.google.android.gms:play-services-base:8.3.0'
compile 'com.google.android.gms:play-services-appindexing:8.3.0'
compile 'com.google.android.gms:play-services-analytics:8.3.0'
compile 'com.google.android.gms:play-services-gcm:8.3.0'
compile 'com.google.android.gms:play-services-location:8.3.0'
compile 'com.google.android.gms:play-services-maps:8.3.0'
```

結果的には、これが一番効果ありました。

# multidexを使っている場合、minSdkVersion=21にする

[こちらの記事](http://qiita.com/boohbah/items/b9ea5e0aaff5b955d0ef)に書いてある通り、multidexを使っている場合はminSdkVersionを21以上にするとビルドが高速化されます。

```groovy
android {
    productFlavors {
        dev {
            // 開発時はこちら
            minSdkVersion 21
        }
        prod {
            // リリース時はこちら
            minSdkVersion 15
        }
    }
    ...
}
```

コマンドラインのDebugビルドで3分15秒かかっていたのが、2分18秒に短縮されました。
psql経由でのCPU使用率のテーブル蓄積

psql経由で、CPU使用率を1秒間隔でテーブルに蓄積します。

```sql
-- CPU使用率のus、sy、id、waと取得時のタイムスタンプを記録するテーブルを作成します。
=# CREATE TABLE cpu_usage (
  time timestamp DEFAULT now(),
  us smallint,
  sy smallint,
  id smallint,
  wa smallint
);

-- COPY FROM PROGRAMを使い、vmstatからCPU使用率を取得してテーブルにコピーします。
COPY cpu_usage(us, sy, id, wa)
  FROM PROGRAM 'vmstat | tail -1 | awk ''{print $13 "," $14 "," $15 "," $16}'''
  WITH (FORMAT csv);

-- CPU使用率を1件テーブルに蓄積する上記COPY FROM PROGRAMを1秒間隔で実行します。
\watch 1
```
TensorFlow紹介文の適当和訳 ななめ読み用

英語だと5分かかるけど、1分でナナメ読みするための http://www.tensorflow.org/ 適当和訳です。さてこれからTutorialやります。

## TensorFlowとは

TensorFlowはデータフローグラフを使った数値計算のためのオープンソースライブラリです。ノードは数学的操作を、エッジはノード間でやりとりされる多次元データ配列（[テンソル](https://ja.wikipedia.org/wiki/%E3%83%86%E3%83%B3%E3%82%BD%E3%83%AB) tensors）を示します。柔軟なアーキテクチャにより、単一APIで、数値計算をデスクトップでも、サーバでみ、モバイル端末でも、CPUやGPUの数を問わず、その上で実行できます。TensorFlowはもともとGoogle Machine Intelligence research organizationの[Google Brain](https://en.wikipedia.org/wiki/Google_Brain) Teamの研究者やエンジニアにより、機械学習と深層ニューラルネットワーク研究のため作られました。しかし、他の領域にも適用できるよう、十分に一般化されたものです。

## データフローグラフとは

![](https://api.tensorflow.org/system/image/body/238/tensors_flowing.gif)

データフローグラフは、数値計算を、[有向グラフ](https://ja.wikipedia.org/wiki/%E3%82%B0%E3%83%A9%E3%83%95%E7%90%86%E8%AB%96)の[ノードとエッジ](https://ja.wikipedia.org/wiki/%E3%82%B0%E3%83%A9%E3%83%95_(%E3%83%87%E3%83%BC%E3%82%BF%E6%A7%8B%E9%80%A0))を使って表します。ノードは通常数学的操作を表しますが、データの取込み、結果の出力、値の書込みと永続化も表せます。エッジはノード間の入出力関係を表します。こうしたデータエッジが、動的なサイズを持つ、[多次元データ配列](http://jp.mathworks.com/help/matlab/math/multidimensional-arrays.html)（テンソル）を表します。TensorFlowの名前の由来は、このグラフ内を流れるテンソルのフローです。ノードは、入力エッジが運ぶテンソルがが全て出揃うと、各演算デバイスに割り当てられ、非同期・並列で実行されます。

## TensorFlowの特徴

- 深い柔軟性
- 真の可搬性
- 研究と製品の架け橋
- 自動微分
- 多言語対応（注：プログラミング言語）
- パフォーマンス最大化

## TensorFlowは誰が使えるか

Apache 2.0オープンソースライセンスで配布

## なぜGoogleはTensorFlowをオープンソース化したか

（割愛）

訳出ここまで。

## 以下参考

- Python - TensorFlow 畳み込みニューラルネットワークで手書き認識率99.2%の分類器を構築 - Qiita : http://qiita.com/haminiku/items/36982ae65a770565458d
Web開発プロジェクトにおけるJavaDocの理想的な運用・使用方法考察2015.11

Web開発プロジェクトでのJavadocの運用方法について現時点(2015年11月)でどのように利用すべきか検討したのでまとめてみました。
実際は使用できるツールやサーバが限られるし、現状によってはいきなりJavadocを使用できないかもしれないので以下のすべてを設定できるかというと難しいのですが。
あくまで私見なのでもっといいツールや運用方法があればコメントください。

#前提
- JavaによるWeb開発
- 構成管理ツールとしてchefを使用
- インテグレーションツールとしてJenkinsを使用
- プロジェクト管理ツールとしてredmineを使用
- 単体テストではJUnitを使用
- 内部結合テスト以降、テストではselenium, appiumを使用
- 開発者のIDEとしてEclipseを使用

#目的
- 開発効率の向上
- 納品ドキュメント作成工数の削減
- 属人化の排除
- 開発者のスキルアップの促進
- 開発者の手抜き・抜け漏れの防止

#構成管理者の設定
- [ ] **出力文字コードの指定**
 ソースコードの文字コードと合わせる事。良く忘れて文字化けするので。当然ant.xmlに設定しておいて開発者が意識せずに使えるようにしておく事。
 Javadocのオプションに以下を追加する。
 ``` -encoding utf-8
 -charset utf-8 ```
<br />

- [ ] **Javadocタイトル設定**
 Javadocを表示するブラウザのタイトルバーに表示されるタイトルを設定
 Javadocのオプションに以下を追加する。
```-windowtitle HogeHogeプロジェクト```
<br />

- [ ] **Javadocの先頭ページ(概要ページ)の設定**
 Javadocの先頭ページ（概要ページ）にアプリケーションの説明、環境、バージョン情報等を持たせる。selenium等のテストの場合はテスト前提条件、観点等も記載する事。
参照：[Javadocの概要ページ設定](http://qiita.com/boss_ape/items/bc2100d60a17ad7c396a)
<br />

- [ ] **クラスパスmain以下のクラス図出力設定**
 main以下のJavadocにはクラス図を自動で出力しておくと何気に見直した時に使い方の間違いに気づく時がよくある。デザインパターンを確認する場合にも役立つ。何より開発者がクラス図とコーディングの関係を学習するのでスキルアップにつながる。
 参考：[Eclipse+APIvizでjavadocにクラス図を出力](http://qiita.com/boss_ape/items/de4ae2d820146d3b7ddb)
<br />

#開発者が実施する事
- [ ] **Javadocパッケージ概要説明**
 Javadocのパッケージ先頭ページにパッケージの概要説明を持たせる。当然、main以下はそのパッケージの説明、test以下は何のパッケージの単体テストかの説明、selenium等のテストの場合はシナリオ別にパッケージを分けてシナリオの説明、前提条件、テスト観点を記載する。
参照：[Javadocの概要ページ設定](http://qiita.com/boss_ape/items/bc2100d60a17ad7c396a)
<br />

- [ ] **Javadocクラス／メソッド説明**
 クラス説明は必須。packageメソッド以上のメソッド(他クラスから参照が可能なメソッド)は必須。privateメソッドは任意。
 クラスは一行コメント、作成者(＠auther:生成したhtmlには表示しない)は必須。
 メソッドは一行コメント、パラメータ(＠param)、戻値(＠return)、スロー(＠throw)は必須

- [ ] **selenium, appiumのシナリオ説明**
 シナリオ、ケース毎にJavadocで説明を作成する。シナリオ番号、ケース番号はクラス名、メソッド名に付加し、スクリーンショットを出力している場合はスクリーンショットファイル名にシナリオ番号、ケース番号を付加して紐付けるようにする。

<h1>運用</h1>
- [ ] **開発フェーズ以降のJenkinsを使用したクラスパスmain以下のJavadoc出力**
 開発期間中は毎日Jenkinsで出力する。
 クラス図を一緒に出力する事。
 <br />

- [ ] **クラスパスtest(単体テストソース)以下のJavadoc出力**
 開発期間中は毎日Jenkinsで出力する。
 クラス図の出力は任意。
<br />

- [ ] **selenium, appiumによるテストプロジェクトのxmlリスト出力**
 顧客の意向で結合テスト内容等はExcelでの提出を強制されるような場合は
　 ```Javadoc⇒xml⇒Excel等のフォーマット```
 と出力する必要がある。Jenkinsで定期的に実行。
 ここが一番手間。
 Excel等のフォーマットに取り込む際は、テスト結果も取り込めるようにしておく。seleniumとJavaDocの使用で内部結合テスト以降の工数はかなり削減できる。
 ※なぜかJavadocをxmlで出力するドックレットが見つからないので自作するしかないみたい。Doxygenだったらxml出力できるのでここだけDoxygen使って出力するか。
 また、xmlからExcel等のフォーマットに取り込むのは別途マクロ作成。Java等の開発で使用している言語使って直接ドキュメント出力するのも有りだけど他プロジェクトに応用が利くようにelectronとかC#でWindowsアプリ作った方がいいのかな。
<br />

- [ ] **Checkstyleの設定**
 残念なことだが、コーディングが好きな開発者もJavadocは面倒くさがって書きたがらない人が多い。いくら手順化しても漏れてしまうことが多々ある。ということでCheckstyleにJavadocのチェックを入れる。
Checkstyleはchefで配布するようにし、同様の設定でJenkinsで定期的にチェックする。
 参考(近日公開予定)：[Eclipse CheckStyle サンプル]
<br />

- [ ] **redmineの設定**
 Jenkinsで定期的に出力したJavadocをredmineのwiki等からリンクしておく。テスト関連のJavadocは生成したドキュメントをダウンロードできるようにしておく。他のドキュメント類も含めてredmineから全てリンクし一元管理する事が理想。
RSSでいろいろ情報取ってみた

# はじめに
RSSはそろそろ下火なのかなと個人的には思っていたのですが、調べてみるとまだまだ現役ですね。広く公開して良いような情報とかは、手軽さもありRSSが配信されていることが多いです。

# RSSまとめサイト
様々な種類のRSSがまとまっているサイトで以下が便利でした。

"gloopsエンジニアが見ているRSSまとめ"
http://qiita.com/t_sudo_gloops/items/14c37d66d61bd97b3064

"All About RSS"
http://rss.allabout.co.jp/

"RSSなび"
http://rssnavi.jp/index.html

# 天気情報の取得
"livedoor 天気情報"
http://weather.livedoor.com/weather_hacks/rss_feed_list

例えば東京の天気は、以下のRSSから取得可能
http://weather.livedoor.com/forecast/rss/area/130010.xml

# レシピ情報の取得
"All About（オールアバウト） [料理レシピ]"
http://rss.allabout.co.jp/aa/latest/ch/recipe/

# 旅行関連
"新着旅行記 by 旅行のクチコミサイト フォートラベル"
http://4travel.jp/rdf/travelogue_all_new.xml
UnityEngine.dll 内シンボルを抽出

## 2015.12.16 追記
Unity 5.3.0f4 の UnityEngine.dll, UnityEditor.dll のシンボル一覧も出力して http://files.clock-up.jp/unity-index/ に反映しました。

## 概要
Unity で使えそうなメソッドをアタリを付けて横断的に探したいことがよくあります。
そういうときは Google 検索や公式サイト内検索を何度も繰り返すようなやり方だとけっこう時間をロスするので、あらかじめクラスとメソッドの一覧が記載されたテキストファイルを手元に持っておくとキーワード探しが捗ります。

UnityEngine.dll 内からクラス一覧とそのメンバ一覧が取得できるので、それをテキストに保存しておくと良いです。

## C#による UnityEngine.dll 内シンボル一覧取得

```csharp
string dll = @"C:\Program Files\Unity\Editor\Data\Managed\UnityEngine.dll";
Assembly assembly = Assembly.LoadFrom(dll);

foreach (Type type in assembly.GetTypes())
{
    Console.WriteLine(type.ToString());
    MemberInfo[] members = type.GetMembers();
    foreach (MemberInfo member in members)
    {
        Console.WriteLine("  " + member.ToString());
    }
}
```

## 結果
```
UnityEngine.AssetBundleCreateRequest
  …
  Boolean isDone
  Single progress
  Int32 priority
  Boolean allowSceneActivation
  …
UnityEngine.AssetBundleRequest
  UnityEngine.Object get_asset()
  UnityEngine.Object[] get_allAssets()
  Boolean get_isDone()
  Single get_progress()
  …
UnityEngine.AssetBundle
  UnityEngine.AssetBundleCreateRequest CreateFromMemory(Byte[])
  UnityEngine.AssetBundle CreateFromMemoryImmediate(Byte[])
  UnityEngine.AssetBundle CreateFromFile(System.String)
  …

```
こんな感じでそれっぽい情報一覧が取得できます。

## 取得するためのプログラム・取得したもの
※作業過程をそのまま保存してるような感じなので汚いです。
https://github.com/kobake/unity-index

## 整形した上でWebに配置したもの
Web閲覧用に整形したものです。gzip対応のブラウザからしか見れないはず。（サイズが大きいので生で転送するととんでもないことになる）
http://files.clock-up.jp/unity-index/
![unity-index.png](https://qiita-image-store.s3.amazonaws.com/0/25555/21a00ed1-1e2f-4142-96f8-6b9beb41c9c7.png)
line monitor > コア部分 > シリアルリレー (+UDP送信) + UDPコマンド受信

```txt:動作確認
RaspberryPi2 + raspbian
```

http://qiita.com/7of9/items/bb5b3e92ce84b25a3c0f
に以下の機能を追加した。

1. UDPコマンド受信

```151111g.py
import serial
import time
import socket

def comrelay(rcvd, srccom, dstcom):
    str1 = srccom.read()
    if (len(str1) > 0):
        rcvd = rcvd + str1
    if "\n" in rcvd:
        print "rcvd=", rcvd
        dstcom.write(rcvd)
        return rcvd, True # new line = true

    return rcvd, False # new line = false

def udpcmd(cmdsock, rcvcmd):
    try:
        data,address = cmdsock.recvfrom(100)
    except socket.error:
        pass
    else:
        rcvcmd = rcvcmd + data
        return rcvcmd, True
    return rcvcmd, False

def main():
    print "Hello"
    monip = "192.168.10.8"
    monport = 6000
    monsock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    cmdip = ""
    cmdport = 5000
    cmdsock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    cmdsock.bind((cmdip, cmdport))
    cmdsock.setblocking(0)
    con1=serial.Serial('/dev/ttyUSB1', 9600, timeout=0.1)
    con2=serial.Serial('/dev/ttyUSB0', 9600, timeout=0.1)

    rcvd1=""
    rcvd2=""
    rcvcmd=""

    while True:
        rcvd1,isNL = comrelay(rcvd1, con1, con2)
        if isNL == True:
            monsock.sendto("1:" + rcvd1, (monip, monport))
            rcvd1 = ""
        rcvd2,isNL = comrelay(rcvd2, con2, con1)
        if isNL == True:
            monsock.sendto("2:" + rcvd2, (monip, monport))
            rcvd2 = ""

        rcvcmd,rcvd = udpcmd(cmdsock, rcvcmd)
        if rcvd == True:
            if "\n" in rcvcmd:
                print "rcvd command=",rcvcmd
                rcvcmd = ""

if __name__ == '__main__':
    main()
```

次の課題はシリアル通信の速度を変更すること。
echo > 改行しない > echo -n "test"

UDPの受信処理をテストしていて、改行が来たら処理するようにしていた。

送信側で以下を実行していた。

```
echo "test" | nc -w 1 -u 192.168.10.5 5000
```

上記だと`test`に改行がついてしまっていた。

```
echo -n "test" | nc -w 1 -u 192.168.10.5 5000
```

により改行なしで送信できた。


参考
http://www.ksknet.net/cat24/echo.html
gemを探す知恵


gem 探すときにとりあえず [The Ruby Toolbox](https://www.ruby-toolbox.com) を見るんだけど、
The Ruby Toolbox は昔からある gem が上位に来てしまう傾向にあって、
後発の gem は埋もれてしまいがちだ。

わりと gem を探していると、あまり使われてない gem や、新しく出来た gem であっても
設計がシンプルだったりしていい感じの物があるので、そういうやつを効率的に見つけたい。

### github の Advanced search が便利だった

github の検索結果ページの左下に [Advanced search](https://github.com/search/advanced) へのリンクがある。
ここで条件を細かく指定して検索すると効率よく gem を探すことができた。

とりあえず次のような条件で検索した。

- 言語を `Ruby` に限定
- Star 数が 100 を超えている
- 最終コミットが今年中に行われている
- 拡張子が `gemspec` のファイルがリポジトリ内に存在する

![screencapture-github-com-search-advanced-1447247883482.png](https://qiita-image-store.s3.amazonaws.com/0/8985/48aabc10-d4e2-fb03-9afa-b5b56a3893b2.png)


Advanced search で条件を選択すると一番上にある検索欄に検索オプションが設定される。

`language:Ruby stars:>100 pushed:>2015-01-01 extension:gemspec`

この状態で、任意のテキスト検索をすれば、新しめの gem を見つけることができる。
switch 文で Optional Binding を使いたかった話

皆さんは Optional Binding 使ってますか？私はガンガン使ってます！何より nil 判定と nil じゃない場合の値導入（Unwrap）が同時にできちゃうからとても便利で安全でかつソースコードもエレガントですからね！

え？Optional Binding が知らない？？うーんまあググればいっぱい出てくるけどとりあえず簡単な例を出しときましょうか：

```swift
let dict = [1: 2, 3: 4]
let key = 1

if let value = dict[key] {
	print(value)
}
```

上記の `if let value = dict[key]` の部分が Optional Binding にあたりますね。要するに `dict` に `key` が定義されているかを判定し、定義されていたらその値を `value` に代入して `print(value)` するというコードです。

ところが上記のソースは if 文ですけど、switch 文でも Optional Binding を使いたい、と思ってるわけですよ。だって条件が増えるといちいち `else if` で書くのだるいじゃん？

というわけで早速やってみた：

```swift
// このコードは間違いです。
let dict = [1: 2, 3: 4]
let key = 1

switch key {
case let value = dict[key]:
	print(value)
	
default:
	break
}
```

とまあとりあえず書いてみたけど、Playground に怒られました。「Expect ':' after 'case'」だって。は？

というわけでいろいろ探してみたけど、どうやらそもそも switch 文で Optional Binding ができないようです。

そこで[友人がこんな書き方を教えてくれました](https://twitter.com/b123400/status/664410511010721792)：

```swift
let dict = [1: 2, 3: 4]
let key = 1

switch dict[key] {
case .Some(let value):
	print(value)
	
default:
	break
}
```

まあ確かにこれなら一応判定はできるんですけどね。ただ Optional Binding ではなく、`Optional<T>` のパターンマッチに過ぎないのです。まあ `dict[key]` の中身だけ見たいのでしたらこれで OK ですが、自分の場合それだけでなく `key` 自身による条件判断も switch 文の中でやる予定ですのでこれではダメだ。

というわけでいろいろ試行錯誤したけど Optional Binding がどうしても使えないようなので、仕方ない、ここで Tuple を使うことに妥協することにしました。それでソースコードはこんな風になります：

```swift
let dict = [1: 2, 3: 4]
let key = 1

switch (key, dict[key]) {
case (let key, _) where key < 0:
	print("Invalid")
	
case (_, let value?):
	print(value)
	
default:
	print("nil")
}
```

まあこれは参照したい辞書型が `dict` だけなのでまだいいんですけど、これ以上増えてくると case 文が地獄になりそうですね…（そもそも自分の場合は沢山の辞書を参照したくてこれを作ったわけでしてw）

ちなみに上記のコードで気づいた人もいるかもしれませんが、実はパターンマッチで Unwrap するとき、`case .Some(let value):` のシンタックスシュガーとして `case let value?:` が使えることを色々調べてるうちにわかったのです。まあこっちの方は少しくらいは書きやすいですね。と一応収穫もありました。（と自分に言い聞かせる。）

***

追記

さらに無理やりな方法を思いついたのでここで追記しますw

```swift
let dict1 = [1: 2, 3: 4]
let dict2 = [5: 6, 7: 8]
let key = 5

var value = 0

switch key {
case let key where {() -> Int? in if let res = dict1[key] { value = res }; return dict1[key]}() != nil:
	print(value)
	
case let key where {() -> Int? in if let res = dict2[key] { value = res }; return dict2[key]}() != nil:
	print(value)
	
default:
	print("nil")
	
}
```

あらかじめ結果用の変数を用意して Closure を `where` に無理やりぶち込んで判定させるやり方です。もう何が何だか…
ちなみにここのサンプルコードは両方の `case` の中身が同じ `print(value)` ですがもちろん実際のコードでは中身は違うのです。

***

さらに追記

上記のコードをもう少し使いやすくしてみた。これならまあ使ってもいいかな？

```swift
let dict1 = [1: 2, 3: 4]
let dict2 = [5: 6, 7: 8]
let key = 5

var value = 0
let getDictValueFor = {(key: Int, fromDict dict: [Int: Int], inout andWriteTo value: Int) -> Int? in
	if let result = dict[key] {
		value = result
	}
	return dict[key]
}

switch key {
case let key where getDictValueFor(key, fromDict: dict1, andWriteTo: &value) != nil:
	print(value)
	
case let key where getDictValueFor(key, fromDict: dict2, andWriteTo: &value) != nil:
	print(value)
	
default:
	print("nil")
	
}
```

まああんまり `inout` 使いたくない感はなくはないけどまあ仕方ない。
マイナンバーのチェックデジットをGoで計算する

自分で書いたrubyの記事（[マイナンバーのチェックデジットを計算する](http://qiita.com/qube81/items/fa6ef94d3c8615b0ce64)）を公開したらいろんな言語でやってみたって人がたくさん現れて参考になりました。ありがとうございます。

最近Goを書いてみているので、Goを使って書いてみます。細かい説明は元記事の方で。

```go:mynumber.go
package main

import (
	"fmt"
	"regexp"
	"strconv"
	"unicode/utf8"
)

func main() {
	// 有効なマイナンバーです
	r := validateMyNumber("123456789018")
	fmt.Println(r)
}

func validateMyNumber(numstr string) bool {

	// 12文字かどうか
	if utf8.RuneCountInString(numstr) != 12 {
		return false
	}

	// 全て数字かどうか
	if !regexp.MustCompile(`^[0-9]+$`).Match([]byte(numstr)) {
		return false
	}

	// 最後の一桁をチェックデジットとする
	checkDigit, _ := strconv.Atoi(numstr[11:])

	// 残り11けたを逆順にします
	runes := []rune(numstr[:11])
	for i, j := 0, 11-1; i < j; i, j = i+1, j-1 {
		runes[i], runes[j] = runes[j], runes[i]
	}

	// 1文字ずつ処理します
	pq := 0
	for i, r := range runes {
		// 何番目か
		n := i + 1

		// Pn
		p, _ := strconv.Atoi(string(r))

		// Qn
		var q int
		if n >= 7 {
			q = n - 5
		} else {
			q = n + 1
		}

		// Pn * Qn を足していきます
		pq += p * q
	}

	// 条件でチェックデジットを検証します
	remainder := pq % 11
	if remainder <= 1 {
		return checkDigit == 0
	}
	return checkDigit == (11 - remainder)
}
```

実行します。

```
$ go run mynumber.go
> true
```

合ってますね。

雑ですが、テストを書いてみます。

```go:mynumber_test.go
package main

import (
	"testing"
)

func TestValidateMyNumber(t *testing.T) {

	// 12桁以外が通ったらエラー
	if validateMyNumber("1234567890120000000") {
		t.Error("12桁でないものが通った")
	}

	// 半角数字以外が通ったらエラー
	if validateMyNumber("I234S6789OI2") {
		t.Error("数字以外が通った")
	}

	// 有効なマイナンバーがはじかれたら失敗
	if validateMyNumber("123456789018") == false {
		t.Error("有効なものがはじかれた")
	}

	// 不正なものが通ってしまったら失敗
	if validateMyNumber("123456789010") {
		t.Error("間違ってるものが通った")
	}

}
```

テストを実行します。

```
$ go test -v
=== RUN   TestValidateMyNumber
--- PASS: TestValidateMyNumber (0.00s)
PASS
ok  	mynumber	0.006s
```

なんとなく、正しいみたいですね。
本当はもうちょっとテストケース書いたりすると良さそうです。

文字列->数字変換とか、正規表現とかスライスとか色々入ってて良い勉強でした。
Oracle 12cにレガシーアプリから接続の際SIDが違うと怒られる

Delphiなどで作った昔のアプリから12ｃのpdbに接続しようとすると、SIDが違うと
怒られます。（今回はCorelab/Devart社のODACコンポーネントからの接続）

#SIDでアクセスできない
そんな時はListener.oraに以下を加えて、TnsListenerサービスを再起動してみてください。

```LISP:Listener.ora
USE_SID_AS_SERVICE_LISTENER = ON
```

こちらの記事を参考にしました。
[ORACLE IN ACTION](http://oracleinaction.com/12c-use_sid_as_service_listener_name/)


#CDBでORA-20840
ちなみにcdbに接続する場合は、 sqlnet.oraに下記の追加が必要です。
こちらもORA-28040で怒られます。

```LISP:sqlnet.ora
SQLNET.ALLOWED_LOGON_VERSION=8
```


#RESTRICT SESSION
これは自分用の備忘録
全てデフォルトでインストールすると、pdbがRESTRICTモードになるので
SqlPlus SYS/PWD as SYSDBAで入ってRESTRICTモードを解除

```plpgsql:SQLPLUS
ALTER PLUGGABLE DATABASE PDBORCL CLOSE IMMEDIATE;
ALTER PLUGGABLE DATABASE PDBORCL OPEN WRITE;
```

v$pdsで確認

```sql:
SELECT name, open_mode, restricted FROM v$pdbs;
```

#データベースを再起動するとPDBに接続できない
CDBに接続してPDB(プラガブルDB)をオープン、その状態を記憶する必要があります。

```plpgsql:SQLPLUS
-- PDBをオープン
ALTER PLUGGABLE DATABASE ALL OPEN;
-- オープン状態を保持
ALTER PLUGGABLE DATABASE ALL SAVE STATE;
```


Oracle 12c必要に駆られてテストしてますが、予備知識なしでやると
嵌まりますね・・・また気付いたことがあれば追記していきます。
意外な所で非破壊処理（Array.prototype.concat）

JavaScriptでゴリゴリ配列を操作していましたが、破壊的か非破壊的かわかりづらいメソッドがあるなと感じました。

# 破壊的・非破壊的
まず、「破壊的」メソッドというのは元の配列を変更してしまうメソッドのことです、いちばんわかりやすい例としては`.push()`や`.pop()`があります。

逆に、「非破壊的」なメソッドは元の配列に変更をくわえず、別に結果を返すものです。`.join()`や`.slice()`などがあります。

# あなたの予想に反して、元の配列は変更されていないでしょうか？

そして、Arrayには`.concat()`というメソッドがあります。「連結」ということで、元の配列につないでくれると考えるかもしれませんが、じつは…

> concat は this や引数として与えられた配列を変更しませんが、その代わりに元の配列から結合させた同じ要素のコピーを含むシャローコピー (1 次元の配列要素までの浅いコピー) を返します。

（[MDNの解説](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/concat)より）

ということで、じつは非破壊のメソッドでした。ただ、もちろんこの事実が便利な時もちょくちょくあります（自分自身、積極的に使っていたりします）。

# 破壊的につなぎたい時
ただ、非破壊的ということは、長い配列を作ろうとすれば[この前も取り上げたような事態](http://qiita.com/jkr_2255/items/af044a1ae2efca463b48)となって、パフォーマンスは出ません。それでは、破壊的に配列を連結するにはどうすればいいのでしょうか。

ここで、`.push()`が破壊的だということを利用します。そして、引数をいくつでも取れるので、`apply`で連結すべき配列を引数にしてしまえば、問題は解決します。

```js
//arrへarr2を破壊的に連結する
arr.push.apply(arr, arr2);
```