OmniAICreator/Qiita-1.07M huggingface dataset:
ScalaでHello Android最速理論

#環境

- Windows10
- Android SDK 25.2.2（最新）
- Scala 2.11.8
- sbt 0.13.12
- Android実機もしくはエミュレータ

おそらくScalaでAndroidが書きたい人ならこの辺りの環境は既に整っていると思うので、環境構築に関しては割愛します。
OSはWindowsでなくてもほぼ同様の手順でいけると思われます。

なお、環境変数ANDROID_HOMEにAndroid SDKのパス（android-sdkディレクトリのパス）を設定しておく必要があります。

#方針

[sbt-android](https://github.com/scala-android/sbt-android)を使用します。
バージョンは現時点の最新版である1.7.1を対象とします。
sbt-androidはバージョンアップで結構ダイナミックに改変が行われるので、今回紹介する手順も他のバージョンでは通用しないかもしれません。

#準備

作成するアプリ用のディレクトリを作成し、その中にprojectディレクトリを作成します。
projectディレクトリ直下に、以下の内容を記載したテキストファイルとしてplugins.sbtを作成します。

```sbt:project/plugins.sbt
addSbtPlugin("org.scala-android" % "sbt-android" % "1.7.1")
```

#いきなりHello Android

おもむろに上で作成したアプリ用のディレクトリで以下のコマンドを実行します。

```
sbt "gen-android <パッケージ名> <プロジェクト名>" android:run
```

ざらざらとログが流れた後で実機なりエミュレータでサンプルアプリが実行された方はラッキー。
おそらく何らかのエラーで止まると思われます。

#自分の場合

実機で動かそうとしたところ、INSTALL_FAILED_OLDER_SDKエラーで止まりました。
アプリ用ディレクトリ直下にbuild.sbtが生成されているはずですので、以下を追記します。

```sbt:build.sbt
minSdkVersion := "11"
```

指定バージョンは適当です。おそらく6以下にしなければ問題ないと思いますが、10以下だと警告が出ます。
そして下記コマンドでリトライ。

```
sbt clean android:run
```

以後は基本的にコード変更したらandroid:run、で良いはずです。

#その他、想定されるエラーケース

##最新のSDKが入っていない

sbt-androidが最新SDKをインストールしようとするのですが、ライセンス認証に失敗して無限リトライします。
素直にSDK Managerから最新SDKを入れておいてください。
AndroidTVでHELLO WORLD

環境があれば10分で出来る、BRAVIAでHelloWorldするところまでのメモです。


# 環境

* AndroidTV
    * Androidバージョン: 5.1.1
    * モデル: SONY BRAVIA KJ-43X8500C
    * ソフトウェア: PKG3.531.0108JPB
* Android Studio
    * version 2.2.2
* Macから利用, adbコマンドへPathは通ってる

# 設定

1. [AndroidTV] 設定>テレビ>端末情報>ビルド連打
    2. 開発者モードが有効になる
2. [AndroidTV] 設定>ネットワーク＆周辺器機>通信設定>詳細設定>ネットワーク接続状態
    3.  `IPアドレス設定` > `IPアドレス` をメモる。
        4.  `192.168.10.108` とか
5.  [Mac] AndroidTVに接続

```
$ adb kill-server
$ adb start-server # いらない
$ adb connect 192.168.10.108
$ adb devices
```
More: https://developer.sony.com/develop/tvs/android-tv/get-started/


# HelloWorld

1. `New Project`
2. `PhoneAndTablet`のチェックを外して、`TV`にチェック
3. Add No Activity
4. 作成されたプロジェクトにて、BasicActivityを追加
5. 作成されたBasicActivityにTextViewを置いてHelloWorldとかにする
6. `Run app`(clt+r)
7. 実行先を問われるため、接続したAndroidTVを選択
8. 「HelloWorld」 yay

BasicActivityを追加せずに、AndroidTVActivityを追加するとAndroidTVぽい画面が一斉に追加される。
お勧めのUIとかなのかもしれない。

# 最後に

AndroidTVのStoreもっと賑やかになってほしい気持ちでいっぱいﾃﾞｰｽ φ('ᴗ'」)
固定IPの設定方法ーDebian5系編

今回はVMware上に、Debian5系の環境を構築した際に、
固定IPの設定を行ったので、そのメモを残す。

基本的にはCentOSと同じようなことをやればいけるが、編集するファイルが異なる。

* まずは、ネットワークの設定は /etc/network/interfaces に記載されている。

```
 # The primary network interface
allow-hotplug eth0
iface eth0 inet dhcp
```

こんな感じで書かれている箇所を編集する。
編集の際には、 nanoコマンドを使うのが便利！
※nanoコマンドは直ちに編集モードに入ってしまうので、間違えた際に悲惨なことになるので、
　必ずバックアップを取ってからにする。

```
# The primary network interface
auto eth0
iface eth0 inet static
address 192.168.xxx.yy
netmask 255.255.255.0
gateway 192.168.xxx.zz
```

上記のように記載したら、
 $ /etc/init.d/networking restart
を実行して、変更を反映させる。

名前解決の箇所は /etc/resolv.conf に記載する。

```
dns-nameservers 8.8.8.8
```
上記を最後に追記するだけ。
serversの最後にsをつけるので、お間違えなく。

これで、ifconfigしてやれば、任意の固定IPを設定することが出来る。
もし、これでダメなら設定の仕方が間違っているか、すでに指定したIPが使われているかなので、
もう一度設定ファイルを書き直しましょう。
SpringのRestTemplateが便利すぎて鼻血でた

元々はC#、最近はNode.jsがコーディングの主流だったのですが、仕事で久々にJavaを使うことになりました。Javaは10年以上前にJava AppletからJNIでPCの周辺機器を操作するようなものを作って以来です。ServletとかTomcatとかStrutsとかとは無縁に生きてきました。
というわけで、久々にJavaを使って見たら、Spring 3.0～ にRestTemplateとかいう余りに素敵なクラスがあって驚いて鼻血が出たので、驚きを記事にしてみました。

## RestTemplate
RestTemplateの何がすごいかというと、Rest APIを呼び出すのに1行だけで済んでしまうという点です。これまでなら、HttpConnectionをOpenして、そこからBufferedWriterで書き出して、ResponseをBufferedReaderで読み込んで、みたいなことをしていましたが、そんな複雑なコードを全てスキップできます。ということでサンプルコードはこちら。

```java
// packageは省略
import org.springframework.web.client.RestTemplate;

public class Main {
    public static void main(String[] args){
        RestTemplate restTemplate = new RestTemplate();
        User user = restTemplate.getForObject("https://server.to/api/user/12345", User.class);
    }
}
```

これだけで、`https://server.to/api/user/12345`にGETし、戻ってきたJSONデータをUser型にキャストしてuser変数に設定してくれます。
なんということでしょう！

# MockRestServiceServer

RestTemplateのすばらしいところはコードがシンプルなだけでなく、テストもシンプルになるところです。RestTemplateを使った単体試験をするには、接続先のモックが必要となりますが、それもとっても簡単に作成できるのです。

```java
@RunWith(MockitoJUnitRunner.class)
public class TestCase{
    @Test
    public void Test(){
        RestTemplate restTemplate = new RestTemplate();
        
        MockRestServiceServer mockServer = MockRestServiceServer.CreateServer(restTemplate);
        mockServer.expect(requestTo("https://server.to/api/user/12345"))
            .andRespond(withSuccess("{\"id\":\"12345\", \"Name\":\"Kawasaki Taro\", \"Age\":26}", MediaType.APPLICATION_JSON_UTF8));

        User user = restTemplate.getForObject("https://server.to/api/user/12345", User.class);

        assertThat(user.getId(), is("12345"));
        assertThat(user.getName(), is("Kawasaki Taro"));
    }
}

```

これでモックが動きます。
いやあ世の中便利になっていますねぇ。

参考:

http://terasolunaorg.github.io/guideline/5.1.0.RELEASE/ja/ArchitectureInDetail/RestClient.html#resttemplate
PHPがstatシステムコールの結果をキャッシュしている件

# PHPのstatキャッシュ

PHPには`CurrentStatFile`という内部管理用の変数があり、直前のstatシステムコールの結果を1件だけ覚えています。これはたとえば次のような状況で使われます。

```php
<?php

mkdir("foo");
var_dump(is_dir("foo")); // bool(true)
var_dump(is_dir("foo")); // bool(true)
```

パッと見ではわかりませんが、実は上記プログラムの`is_dir()`の内部処理は1回目と2回目とで異なっています。1回目は真面目にstatシステムコールを呼んでfooがディレクトリかどうかOSに問い合わせているのですが、2回目の呼び出しではシステムコールを呼ばず、直前のシステムコールが返した値を使い回すという挙動になっています。本稿ではこのキャッシュのことをstatキャッシュと呼ぶことにします。

以下の関数がstatキャッシュを利用するようです。

> 影響を受ける関数を以下に示します。 stat(), lstat(), file_exists(), is_writable(), is_readable(), is_executable(), is_file(), is_dir(), is_link(), filectime(), fileatime(), filemtime(), fileinode(), filegroup(), fileowner(), filesize(), filetype(), および fileperms().
>
> http://php.net/manual/ja/function.clearstatcache.php

# statキャッシュは暗黙的にクリアされることがある

statキャッシュは必要に応じてクリアされたりもします。

```php
<?php

mkdir("foo");
var_dump(is_dir("foo")); // bool(true)
rmdir("foo");
var_dump(is_dir("foo")); // bool(false)
```

今度のプログラムでは`rmdir()`でディレクトリを削除していますが、2回目の`is_dir()`は正しくディレクトリの削除を認識しています。実は`rmdir()`の実行時にstatキャッシュがクリアされるので、古いキャッシュのせいで混乱するようなことはないというわけです。

`rmdir()`を含め、下記の関数を呼び出すことでstatキャッシュのクリアが行われます。

 - unlink
 - rename
 - rmdir
 - chdir（statキャッシュ対象が相対パスのときのみクリアされる）
 - chroot
 - chgrp
 - lchgrp
 - chown
 - lchown
 - chmod
 - touch（対象がfile:///のときだけ）

これは残念ながらドキュメント化されていない情報で、PHP 7.0.12時点のPHPソースコードから私が読み取ったものです（[unlinkについてはclearstatcacheの説明に書いてありました](http://php.net/manual/ja/function.clearstatcache.php)）。

# statキャッシュの不整合と明示的なクリア

上記の関数以外の関数を利用してファイルシステムの更新を行うと古い状態のstatキャッシュが更新されないまま残ってしまい、キャッシュの不整合が発生することがあります。先ほどのプログラムを少し変更してみましょう。

```php
<?php

mkdir("foo");
var_dump(is_dir("foo")); // bool(true)
system("rmdir foo");
var_dump(is_dir("foo")); // bool(true)
```

`system()`で`rmdir`コマンドを呼び出してディレクトリを削除していますが、`is_dir()`はディレクトリが消えたことに気づいていません。外部システム呼び出しをしてしまうとstatキャッシュがクリアされず、このような不整合状態が起きてしまうのです。

こわいですねー。恐ろしいですねー。

もちろん対策はあります。statのキャッシュが信用ならないことをプログラマが知っている場合、`clearstatcache()`を呼び出すことでこのキャッシュをクリアすることができます。

```php
<?php

mkdir("foo");
var_dump(is_dir("foo")); // bool(true)
system("rmdir foo");
clearstatcache();
var_dump(is_dir("foo")); // bool(false)
```

このあたりはi_ogiさんが2008年にまとめた頃からほとんど変わっていないと思いますが、案外知られていないように思います。

- [clearstatcache\(\)のはなし \- おぎろぐはてな](http://d.hatena.ne.jp/i_ogi/20080506/clearstatcache)
githubへpush時に毎回認証要求される時に確認したいこと


## URLを確認

リポジトリ内で以下のコマンドで確認。

`$ git remote -v`

## 共通して考えられる原因

### `~/.ssh/known_hosts`に古い認証情報がキャッシュされている

対処方法: 当該ファイル内の行の先頭が`github`で始まる行を削除する

## git@で始まる場合に考えられるもの

### 公開鍵の設定に不備がある

対処方法: https://help.github.com/articles/adding-a-new-ssh-key-to-your-github-account/

### `~/.ssh/config`の設定に不備がある

対処方法: `vi ~/.ssh/config`で適切な設定に変更する
参考: http://karage-ageta.hatenablog.com/entry/2016/10/11/191811

## https://で始まる場合に考えられるもの

### `osxkeychain helper`を設定していない
対処方法: https://help.github.com/articles/caching-your-github-password-in-git/

### 基本認証要求をされることを知らなかった
対処方法: git@のURLへ変更し、公開鍵をgithubに登録する
参考: https://help.github.com/articles/adding-a-new-ssh-key-to-your-github-account/

その他ハマりそうなことなどありましたら、編集リクエスト頂けると嬉しいです。
【Swift】モジュール化（Dynamic Framework）アプリのサンプルコード

# 概要
モジュール化（Dynamic Framework）アプリのサンプルコードです。

[【Swift】API利用アプリのサンプルコード（Storyboard未使用、PureLayout）](http://qiita.com/menomoto/items/67fb1fec12d444072ed6)の
Components（APIClient、Parser、Entity）部分を
Dynamic Frameworkを利用してモジュール化してみました。

* プロジェクト名： modularization
* モジュール名： YFoundation


# 手順
以下、モジュール化の手順です。（旧コードからの変更手順）
* File New Target作成 Cocoa Framework追加 (YFoundation)
* YFoundation.h削除
* ComponentsをYFoundation以下に移動
* プロジェクトファイルでYFoundationの設定変更
　- GeneralのLinked Frameworks and LibrariesにSwiftyJson追加
　- Build SettingsにRunscriptでSwiftyJson追加
* Target（YFoundation）のビルドが通ることを確認
* Target（modularization）のビルドでエラーを確認
　- import YFoundation 追加
　- YFoundationのclass, struct, methodのアクセス修飾子をpublicに変更
* Target（modularization）のビルドが通ることを確認 


# フォルダ構成
![sample](http://i.imgur.com/Dfirmuk.png)

# github
https://github.com/menomoto/Sample_Apps/tree/master/modularization

# 結果
![サンプル](http://i.imgur.com/g8elfOH.gif)
nodeでgitを扱う

nodeでgit使いたかったのでやってみました。

googleやnpmで"npm git"で検索してみましたが、コレといったデファクトっぽい物が出ず。ググラビリティ低めですね。

---

## **simple-git**

なんだか使いやすそうだったので[simple-git](https://www.npmjs.com/package/simple-git)を使ってみました。

使い方はその名の通りシンプルで、gitコマンドとほぼ一緒なので直観的◎。

例えば

```js
require('simple-git')().clone('gitリポジトリのPath', '作業コピーのPath');
```

や

```js
reuqire('simple-git')('作業コピーのpath').pull();
```

などなど

addしてcommitしてpushもできます。

```js
require('simple-git')()
  .add('addしたいfile')
  .commit('コミットメッセージ')
  .push(['-u', 'origin', 'master'], callback);
```

とっても使いやすいですね。

Promiseをつかい時はcallback処理内にてresolve()をcallすれば良いです。

---

## **ハマりポイント**

作業コピーがすでにあった場合は`pull`、なければ`clone`したい時、
次のような記述をしてハマりました。

NGコード

```js

const repoPath = 'path/to/repo',
          localPath= 'path/to/localDir';
let simpleGit = require('simple-git')(localPath); // NG


if (/* 作業コピーが既にある */) {
  simpleGit.pull();
} else {
  simpleGit.clone(repoPath, localPath);
}
```

これはclone()前だとrequire()時にlocalPathが存在せず、ENOENT吐いて落ちます。

workaroundとして下記のように都度require()します

```js
const repoPath = 'path/to/repo',
          localPath= 'path/to/localDir';

if (/* 作業コピーが既にある */) {
  require('simple-git')().pull();
} else {
  require('simple-git')().clone(repoPath, localPath);
}
```

*requireをファイル先頭でしてしまいたい派の私には辛い*
【Haskell】様々な配列その1

Haskellには様々な配列があります。Array、MArray、STArray、IOArray、UArray、STUArray、IOUArray…。他にもVectorというデータ構造があり、こちらもいくつかの種類があるようで、正直どう使い分ければいいか判断がつきません。わかりやすくまとめたページを見つけることができなかったため、自分でまとめていこうと思います。といっても、いきなりすべての配列の種類を網羅した記事を書くことは困難なため、まず配列の種類毎に記事を作成し、その後ですべての配列の種類を網羅したページを作成しようと思います。途中で飽きなければいいのですが…。

## 通常の配列

```hs
import Data.Array

-- 配列の生成
arr1 = array (0,2) [(0,"foo"),(1,"bar"),(2,"baz")]
arr2 = listArray (1,100) [n^2|n<-[1..]]
arr3 = listArray (0,999) $ repeat False

-- 要素の取得
elem1 = arr1 ! 0            -- "foo"
elem2 = arr1 ! 2            -- "baz"
elem4 = arr1 ! 3            -- *** Exception: Ix{Integer}.index: Index (3) out of range ((0,2))
elem3 = arr1 ! (-1)         -- *** Exception: Ix{Integer}.index: Index (-1) out of range ((0,2))

-- 配列の更新（更新後の配列を返す）
arr4 = arr1 // [(1,"hoge")] -- [(0,"foo"),(1,"hoge"),(2,"baz")]
arr5 = arr3 // [(2,True),(3,True),(5,True),(7,True)]

-- 配列をリストに変換
lst1 = elems arr1           -- ["foo", "bar", "baz"]
lst2 = elems arr2           -- [1, 4, 9, ..., 9604, 9801, 10000]
```

* 要素の追加、削除はできない。
* Haskellでは、値に変数名を紐付けることを、代入と呼ばずに__束縛__と呼ぶ。束縛した値は、まるで読み取り専用メモリ領域に書き込まれた値のように振る舞う。つまり、値の変更は許されない。`arr1`配列を更新するといっても、`arr1`に束縛された`(1,"bar")`という値を保持するメモリ領域が`(1,"hoge")`に書き換わるわけではなく、新たにメモリ領域を確保して`arr1`の値である`array (0,2) [(0,"foo"),(1,"bar"),(2,"baz")]`を書き込み、`(1,"bar")`を`(1,"hoge")`に変更し終えた後で変更不可能領域となり`arr4`に束縛される（妄想）。
Windows Forms の Chart の解像度を上げる方法

`System.Windows.Forms.DataVisualization.Charting` では、
`Chart.SaveImage()` という関数で Chart に描いたグラフを画像として保存できる。

```csharp
chart1.SaveImage("image.png", ChartImageFormat.Png);
```

だが、デフォルトだとゴミみたいな解像度で保存される。

![161025_102907.png](https://qiita-image-store.s3.amazonaws.com/0/117994/e9dafb1e-9ec7-20c5-1c32-ae9918a275ab.png)

この解像度をマシにする方法がなかなかなくて苦しんだ。
今のところ一番簡単な方法は、セーブするときだけ Chart 自体の大きさを変更すること。
試しに 2 倍にしてみる。

```csharp
chart1.Width *= 2;
chart1.Height *= 2;
chart1.Dock = DockStyle.None; // 特に設定していないなら不要。
chart1.SaveImage("image.png", ChartImageFormat.Png);
chart1.Width /= 2;
chart1.Height /= 2;
chart1.Dock = DockStyle.Fill; // 特に設定していないなら不要。
```

![161025_103334.png](https://qiita-image-store.s3.amazonaws.com/0/117994/89fb5dff-33db-3839-b0ff-df880943c9f8.png)

少しはマシになっているのがわかるだろうか。

ちなみに、3 倍にすれば 3 倍の解像度になるので、10 倍とかにして保存すれば画質に困らないかと思いきや、 `Chart` のサイズを大きくするごとにグラフの線が細く、ラベルが小さくなるので、使い物にならなくなってしまう。
ここらへんを設定しなおす方法も探せばありそうだが、今回は 2 倍の解像度で十分だったのでやめておいた。

ご存知の方がいたら、教えていただけると助かります。
unboundでのstub設定について

## 背景

unboundはキャッシュサーバの役割をしており、クライアントPCもunboundをむいている
他のゾーンのキャッシュもしているため、ADのDNSは利用したくない

## やりたいこと
クライアントのDNSはunboundのキャッシュサーバを向けたい
ADを導入する際に、ADの名前解決だけはADサーバ内へ転送させたい

クライアント <-> unboundのキャッシュサーバ <-> ADのDNSを利用したい  

## 設定

ADサーバはコンテンツサーバなので、stubzoneでの定義が必要

```
private-domain: "example.com"
stub-zone:
      name: "example.com"
      stub-addr: ADのDNSサーバのIP
```


### 参考記事

[第4回　Unboundサーバ運用Tips](http://gihyo.jp/admin/feature/01/unbound/0004)
Android Studioで、LintがAPIレベルのエラー(Calling new methods on older versions)が出る時

#現象
build.gradleで指定したminSdkVersionが低すぎる場合に、
Lintのエラーが表示される。
例：
Calling requires API level 11 (current min is 10)
(minSdkVersionが10の場合に、API11以降が必要な関数を使った場合)

#対処法
minSdkVersionを変更しない前提で。

##成功例1：　自動補完で作った例。
```
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB){}
で囲む。(バージョンは適宜変えて下さい。)
```

##成功例2：　APIレベルは、数字でも大丈夫。
```
if (Build.VERSION.SDK_INT >= 11){}
で囲む。(バージョンは適宜変えて下さい。)
```

##成功例3：　Build.VERSION.SDK_INTを、他の変数に入れておいても大丈夫。
```
final static int SDK_INT = Build.VERSION.SDK_INT;
if (SDK_INT >= 11){}
で囲む。(バージョンは適宜変えて下さい。)
```

##失敗例1：　Build.VERSION.SDK_INTが**後ろ**にある。
```
if (Build.VERSION_CODES.HONEYCOMB <= Build.VERSION.SDK_INT){}
で囲む。(バージョンは適宜変えて下さい。)

if (11 <= Build.VERSION.SDK_INT){}
なども同様。
```

ミス避けのために、定数を前に置く規則になっている所もあるかと思います。
※(定数 == ～)などを、誤って(定数 = ～)と書くとエラーとして弾かれるので。
その際に、以外と起こりがちなのが、この現象。
一瞬、APIレベルの判定が書いてあるのに、何で～となりますよね。

ということで。今日の小ねたでした。
$GOPATH/bin に入らない

# 何が起こったか

go get でとってきたバイナリが \$GOPATH/bin に入らなかった。
しょうもない勘違いですが備忘録として残しておきます。

gooseっていうマイグレーションツールを試したかった。

```
$ go get bitbucket.org/liamstask/goose/cmd/goose
```

go get で入れる。

```
$ goose
-bash: goose: コマンドが見つかりません
```

あれ・・・？

```
$ ls -l $GOPATH/src/bitbucket.org/liamstask/
合計 4
drwxrwxr-x. 6 vagrant vagrant 4096 10月 25 13:01 goose
```

srcには入ってる。でもbinになかった。

# 原因

これ

```
[vagrant@localhost ~]$ go env
GOBIN="/usr/lib/golang/bin"
```

http://golang.jp/install/source

> $GOBIN
>Go言語のバイナリがインストールされるディレクトリで、デフォルトは\$GOROOT/binです。インストール後、各ツールを利用できるようにこのディレクトリを>\$PATHに加えてください。\$GOBINを設定すると、goコマンドはそのディレクトリに全コマンドをインストールします。

\$GOBINが設定されているとgo getで取得したものをbinaryは\$GOBINに保存されます。
さらに\$GOBINがPATH通ってなかったので呼び出しができなかったという結果に。

特に分ける用途が今のところなかったので\$GOBIN を空にしました。(分ける利点をご存知な方いたらコメント頂けると嬉しいです)

これで入れ直して、 \$GOPATH/bin に無事入るようになりました。
PowerShellメモ　C#コードを実行

# 概要
PowerShellスクリプト中にC#のコードを書いて呼び出すサンプル。

# コード

```PowerShell:サンプル1
$src = @'
using System;
public static class TestClass1
{
    public static string TestMethod(string name)
    {
        string msg = name + "さん、こんにちは";

        Console.WriteLine(msg);
        return msg;
    }
}
'@

Add-Type -TypeDefinition $src -Language CSharp
[TestClass1]::TestMethod("太郎") > $null
```

```PowerShell:サンプル2
$src = @'
using System;
using System.Linq;
public static class TestClass2
{
    public static void TestMethod()
    {
        var data = new[]
        {
            new {id = 1, name = "taro"},
            new {id = 2, name = "jiro"},
            new {id = 3, name = "saburo"},
        };
        var query = 
            from x in data
            where x.id < 3
            select x.name;

        foreach(var n in query)
        {
            Console.WriteLine(n);
        }
    }
}
'@

Add-Type -TypeDefinition $src -Language CSharp
[TestClass2]::TestMethod()  # taroとjiroが出力される
```

# 注意点
C#ソース部分を修正して再実行すると、「型は既に存在している」エラーになる。
簡単な解決方法はPowerShell再起動。

# 動作確認した環境
* PowerShell V4 (Windows 8.1)
* PowerShell V5 (Windows 10)
golangパフォーマンス1:文字列とビット転換

golang 文字列とビット転換のパフォーマンス
テスト環境: go version go1.7.3 windows/amd64

ファイル構造:
rootファイル/01byteToString.go
rootファイル/01byteToString_test.go (転換効率テスト用)

01byteToString.go

```
package go1_6

import "unsafe"

func StringToByte(s string) []byte {
	//[]byte(s)処理はまず文字列をコピーしてbyteに転換を行う
	return []byte(s)
}

func ByteToString(b []byte) string {
	return string(b)
}

//StringToByteにより早いし　余裕メモリが利用なし
func StringToBytePerf(s string) []byte {
	//メモリで直接転換可能
	x := (*[2]uintptr)(unsafe.Pointer(&s)) //stringは静的系ためメモリ中にポインタで  x[0] : メモリスタート場所  x[1] : 長さ
	h := [3]uintptr{x[0], x[1], x[1]}      // []byteは動的ためメモリ中にポインタで x[0] : メモリスタート場所 x[1] : 実際長さ(len) x[2] : 良いした長さ(cap)
	return *(*[]byte)(unsafe.Pointer(&h))
}

//ByteToStringにより早いし　余裕メモリが利用なし
func ByteToStringPerf(b []byte) string {
	//byteポインタ直接にstirngポインタに転換(x[2]なしになる)
	return *(*string)(unsafe.Pointer(&b))
}
```

01byteToString_test.go

```
package go1_6

import (
	"github.com/stretchr/testify/assert"
	"testing"
)

const StringTest = "hello, world!"

func TestStringToByte(t *testing.T) {
	assert.Equal(t, StringToByte(StringTest), []byte(StringTest))
}

func TestByteToString(t *testing.T) {
	assert.Equal(t, ByteToString([]byte(StringTest)), StringTest)
}

func BenchmarkStringToByte(b *testing.B) {
	for i := 0; i < b.N; i++ {
		StringToByte(StringTest)
	}
}

func BenchmarkByteToString(b *testing.B) {
	for i := 0; i < b.N; i++ {
		ByteToString([]byte(StringTest))
	}
}

//---------------------------------------------------------------------

func TestStringToBytePerf(t *testing.T) {
	assert.Equal(t, StringToBytePerf(StringTest), []byte(StringTest))
}

func TestByteToStringPerf(t *testing.T) {
	assert.Equal(t, ByteToStringPerf([]byte(StringTest)), StringTest)
}

func BenchmarkStringToBytePerf(b *testing.B) {
	for i := 0; i < b.N; i++ {
		StringToBytePerf(StringTest)
	}
}

func BenchmarkByteToStringPerf(b *testing.B) {
	for i := 0; i < b.N; i++ {
		ByteToStringPerf([]byte(StringTest))
	}
}
```

テスト結果:
![image](https://qiita-image-store.s3.amazonaws.com/0/138880/d78919be-eaae-66b7-b6b1-1330268c577c.png)
ポイント:
string構造:[3]uintptr{x[0], x[1], x[2]}
[]byte構造:[2]uintptr{x[0], x[1]}
デメリット:
変数のポインタが変わります。(使い場合は用注意)
AndroidSDKをUbuntu 14.04 LTSのCUI環境にインストール

GUI環境のSDK ManagerでやることをCUI環境でやったのでメモ。
# 環境
```
Ubuntu 14.04.4 LTS （64bit）
```

# 利用可能なパッケージの一覧をリストを表示
```
$ ./tools/android list sdk -a -e
```

# パッケージをインストール
```
$ ./tools/android update sdk -u -a -t <update_package>
```
[質問]多次元配列について

初歩的な質問ですみません。

numpyで以下のような配列を宣言したいのですが、方法を教えて頂けないでしょうか。

[[[1,2,3,4,5] [1,2]]
 [[6,7,8,9,10] [3,4]]
         ・
　　　　　・
　　　　　・
　　　　　・
]
Deep LearningライブラリKerasとKeras.jsの紹介

#Kerasとは？
公式ホームページから引用すると
> Kerasは最小限で記述できる,モジュール構造に対応しているニューラルネットワークのライブラリです。Pythonによって記述されており、TensorflowやTheanoに対応しています。
 革新的な研究、開発を行うためにはアイデアから結果まで最小限の時間で行うことが求められます。そこでKerasはより早い実装、改良を行うことを目的として開発されました。

「アイデアから結果まで最小限の時間で行う」というのがポイントでしょうか。直感的にわかりやすいコードでDeep Learningの構造を記述できる。

# Kerasの基本
## 逐次モデル（Sequential）
Kerasでは2種類の方法でDeep Learningの構造を記述できます。SequentialとFunctional APIの2つです。Sequentialはシンプルにレイヤーを重ねていくような構造を書くのに適してると思う。
https://keras.io/ja/#30keras にあるコードですが

```py
from keras.models import Sequential
from keras.layers import Dense, Activation

model = Sequential([
    Dense(32, input_dim=784),
    Activation('relu'),
    Dense(10),
    Activation('softmax'),
])
```
のようにレイヤーを書ける。`add`を使っても書ける。

```py
model = Sequential()
model.add(Dense(32, input_dim=784))
model.add(Activation('relu'))
```
`model.add(Dropout(0.5))`のようにDrop outも簡単に書ける。

##Functional API（Model）
単純なレイヤー以外に複数の出力、有向非巡回グラフなど複雑なモデルを構築するときに使う。これまた公式リファレンスにありますがhttps://keras.io/ja/getting-started/functional-api-guide/

```py
from keras.layers import Input, Dense
from keras.models import Model

inputs = Input(shape=(784,))

# a layer instance is callable on a tensor, and returns a tensor
x = Dense(32, activation='relu')(inputs)
predictions = Dense(10, activation='softmax')(x)

# this creates a model that includes
# the Input layer and three Dense layers
model = Model(input=inputs, output=predictions)
```

##compile, fit
どちらの方法でもモデル構築後にcompileで各種設定をして、fitで学習できる。
compleではロス関数や最適化手法を設定し、fitでエポック数、バッチサイズを指定する。

```py
model.compile(loss='categorical_crossentropy’, optimizer=sgd, metrics=['accuracy'])
model.fit(X_train, y_train, nb_epoch=20, batch_size=16)
```

#Keras.js
KerasをJavascriptから動かせるようにしたライブラリ
動作を試してみるだけなら下記URLから実行可能
https://transcranial.github.io/keras-js/

##Keras.jsを動かしてみる
まずはGitからClone
`git clone https://github.com/transcranial/keras-js`
次にNode.jsなどで使うnpmでインストールとサーバー起動
`npm install`
`npm run server`

http://127.0.0.1:3000 にアクセスすると自分の環境でブラウザから使える。Chromeでは動きました。
【Swift】API利用アプリのサンプルコード（Storyboard未使用、PureLayout）

# 概要
YahooオークションのAPIを2つ利用した簡単なアプリのサンプルコードです。

[カテゴリ情報API](http://developer.yahoo.co.jp/webapi/auctions/auction/v2/categorytree.html)にてカテゴリの一覧を取得して、
TableViewに「カテゴリ名、商品数」を表示します。

末端カテゴリのときは[商品リストAPI](http://developer.yahoo.co.jp/webapi/auctions/auction/v2/categoryleaf.html)にて商品一覧を取得して、
CollectionViewに「商品画像、商品名、価格、残り時間、入札数」を表示します。

# github
https://github.com/menomoto/Sample_Apps/tree/master/auctionCategoryList

# 結果
![サンプル](http://i.imgur.com/g8elfOH.gif)

# Auto Layout設定
* tableViewCell

```
    private func addConstraints() {
        
        categoryLabel.autoAlignAxisToSuperviewAxis(.Horizontal)
        categoryLabel.autoPinEdgeToSuperviewEdge(.Leading, withInset: 15.0)
        categoryLabel.autoPinEdgeToSuperviewEdge(.Trailing, withInset: 15.0)
    }
```

* collectionViewCell

```
    private func addConstraints() {
        itemImageView.autoPinEdgeToSuperviewEdge(.Top, withInset: 2)
        itemImageView.autoPinEdgeToSuperviewEdge(.Left, withInset: 2)
        itemImageView.autoPinEdgeToSuperviewEdge(.Right, withInset: 2)

        titleLabel.autoPinEdge(.Top, toEdge: .Bottom, ofView: itemImageView, withOffset: 3.0)
        titleLabel.autoPinEdgeToSuperviewEdge(.Left, withInset: 2)
        titleLabel.autoPinEdgeToSuperviewEdge(.Right, withInset: 2)

        priceLabel.autoPinEdge(.Top, toEdge: .Bottom, ofView: titleLabel, withOffset: 3.0)
        priceLabel.autoPinEdgeToSuperviewEdge(.Left, withInset: 2)
        priceLabel.autoPinEdgeToSuperviewEdge(.Right, withInset: 2)

        endTimeLabel.autoPinEdge(.Top, toEdge: .Bottom, ofView: priceLabel, withOffset: 3.0)
        endTimeLabel.autoPinEdgeToSuperviewEdge(.Left, withInset: 2)
        endTimeLabel.autoPinEdgeToSuperviewEdge(.Bottom, withInset: 5)

        bidLabel.autoPinEdge(.Top, toEdge: .Bottom, ofView: priceLabel, withOffset: 3.0)
        bidLabel.autoPinEdge(.Left, toEdge: .Right, ofView: endTimeLabel, withOffset: 10.0)
        bidLabel.autoPinEdgeToSuperviewEdge(.Bottom, withInset: 5)

    }
```
Bitcoin P2SHの謎

Mastering Bitcoinの自分用の理解メモ

P2SHはPay-to-Script-Hashと呼ばれるビットコイントランザクションscriptで、
標準的な5つのトランザクションの一つ
Pay-to-Public-Key(ナカモト氏考案）やPay-to-Public-Key-Hash(P2PKH)より新しい

特にマルチシグネチャscriptに使われる

トランザクションscriptは、未使用トランザクションに含まれるlocking scriptとlocking scriptを解除するためのunlocking scriptを下記のように結合して使用する
**unlocking script + locking script**
（通常unlocking scriptには、公開鍵と公開鍵に対応する秘密鍵から作成される署名が入る）

P2SHは下記組み合わせになっている(2-of-3の場合)

| スクリプト名    | スクリプト                                                  |
|:---------------|:-----------------------------------------------------------|
|unlocking script|OP_0 [signature1] [signature2] redeem script                |
|locking script  |OP_HASH160 [20-byte hash of redeem script] OP_EQUAL         |
|redeem script   |2 [publickey1] [publickey2] [publickey3] 3 OP_CHECKMULTISIG |


signature    : publickeyに対応したprivatekeyで作成された署名
publickey    : 公開鍵
redeem script: 署名チェックのコマンドをシリアライズしたスクリプト

実際チェックするとなると、下記スクリプトを実行することになる
`OP_0 [signature1] [signature2] redeem script OP_HASH160 [20-byte hash of redeem script] OP_EQUAL`

手順としては下記

1.[signature1]をプッシュ
2.[signature2]をプッシュ
3.redeem scriptをプッシュ
4.OP_HASH160でredeem scriptをハッシュ化
5.[20-byte hash of redeem script]をプッシュ
6.OP_HASH160(redeem script)と[20-byte hash of redeem script]をOP_EQUALで評価し、一致するときはTRUEをプッシュ

なのでスタックは下記になるはず、、。

|           |
|:---------:|
|TRUE       |
|signature2 |
|signature1 |

実際の署名チェックはいずこへ、、、。
BIP16に下記のように書いてある
3.{serialized script} is popped off the initial stack, and the transaction is validated again using the popped stack and the deserialized script as the scriptPubKey.


どうやら、redeem scriptのハッシュ値チェックを実施した後、
自前でredeem scriptをデシリアライズして、再度署名をチェックする必要があるということだ（？）

二回チェックを走らせるということだな！うん！~~（わかってない）~~

（追記）
コメントいただきました。
ソースのVerifyScript関数の中でP2SHだけ追加でスクリプトを検証しているようです。
（ソースが読めない、、精進しよう）

##参考URL
P2SHのBIP
https://github.com/bitcoin/bips/blob/master/bip-0016.mediawiki
BIPの訳
http://techmedia-think.hatenablog.com/entry/2015/09/20/184903
私と同じ疑問を持っている人たち
http://bitcoin.stackexchange.com/questions/19450/how-do-pay-to-script-hash-transactions-work
http://bitcoin.stackexchange.com/questions/42521/pay-to-script-hash-execution
マルチシグネチャ全般
http://qiita.com/hshimo/items/453ffc5aa75e55fadd1c
Redeem script
http://qiita.com/hshimo/items/99bb041f17b50fcbe64b
Chainerの基本オブジェクトについて〜functions編〜

前回からChainerの基本オブジェクトについて私が勉強したことを記述しています．
前回はVariableについて書きました．今回は活性化関数や誤差関数などニューラルネットワークにおいて重要な関数を提供するfunctionsについて書きます．

#functions
前回紹介したVariableオブジェクトを変数として持つ関数をfunctionsは提供してくれます．
Variableと同じくchainerから呼び出します．（すでにchainerとVariableは呼び出されている前提）

```
from chainer import Function as F
```

関数はざっくり言うと色々あります．
例えば三角関数とか．．．

```
>>> x = Variable(np.array([-1], dtype=np.float32))
>>> F.sin(x).data
array([-0.84147056], dtype=float32)
>>> F.cos(x).data
array([ 0.54030228], dtype=float32)
```

ちなみに関数の返り値はVariableオブジェクトとして返されるため，微分も可能です．

```
>>> x = Variable(np.array([-0.5], dtype=np.float32))
>>> z = F.cos(x)
>>> z.data
array([0.87758255], dtype=float32)
>>> z.backward
>>>x.grad
array([0.47942555], dtype=float32)
```
ここで，

```math
(\cos x)' = - \sin x
```

なので，

```
>>> - F.sin(x).data
array([0.47942555], dtype=float32)
```

同じ結果となることが確認できました．

なお，変数が多次元となる場合は，関数の傾きをあらかじめ指定する必要があるみたいです．

```
>>> x = Variable(np.array([-1, 0, 1], dtype=np.float32))
>>> z = F.sin(x)
>>> z.grad = np.ones(3, dtype=float32) #3次元の配列をあらかじめ作成
>>> z.backward()
>>> x.grad
array([0.54030228, 1., 0.54030228], dtype=float32)
```

なお，np.onesではなくnp.zerosを使うとx.gradの際に全て0になってしまいます．

```
>>> z.grad = np.zeros(3, dtype=float32) #3次元の配列をあらかじめ作成
>>> z.backward()
>>> x.grad
array([0., 0., 0.], dtype=float32)
```

ちなみにそれらしいsigmoid関数を使うと（sigmoid関数は（-∞, ∞）→ （0, 1）の単調増加連続関数．活性化関数として用いられる．）

```
>>> x = Variable(np.array([-1, 0, 1], dtype=np.float32))
>>> x.sigmoid(x).data
array([ 0.37754068], dtype=float32)
```

あっという間に計算できました．


#おわりに
簡単な計算のみになりましたが，今回はここまでにします．
次回はlinksオブジェクトについて書きます．

#参考
新納浩幸
Chainerによる実践深層学習～複雑なNNの実装方法～　オーム社
GoのJSON API ServerでゆるふわJSON responseを返す方法

ブログのコピペです(https://t-hiroyoshi.github.io/go-yuru-json)

最近GoをAPI Gateway(Aggregator)としている環境で開発を行なっているのですが、呼び出し先のServiceの実装が終わっていなくてもClientでとりあえずJSONのresponseが欲しいという状況がありました。

JSONのUnmarshalについては[golangはゆるふわにJSONを扱えまぁす!](https://www.kaoriya.net/blog/2016/06/25/)という記事が有ったのですが、ゆるふわMarshalについては情報がありませんでした。

ですが考えてみればjson.Marshal()すると`[]byte`型になるのでそれを初めから作ってあげればよかったです。
まあもちろんこれではGoの良いところを捨てているようなものですが、開発中のとりあえずのレスポンスには手軽で良いと思いました。

```go
package main

import (
    "fmt"
    "net/http"
)

func jsonResponse(rw http.ResponseWriter, req *http.Request) {
    response := []byte(`
        {
          "status": "success",
          "user":
            {
              "id": "2d7b8fe1-1e63-4c3b-83b9-46274554e822",
              "name": "t-hiroyoshi",
              "birthday": "1993-09-06T11:22:33.496Z"
            }
        }
    `)

    defer func() {
        rw.Header().Set("Content-Type", "application/json")
        fmt.Fprint(rw, string(response))
    }()
}

func main() {
    http.HandleFunc("/json", jsonResponse)
    http.ListenAndServe(":8080", nil)
}
```
Ubuntu memo

## Version 等
```
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.1 LTS"
$ arch
x86_64
$ nproc
8
$ free -h

```

## SSD か HDD か調べる

`cat /sys/block/sda/queue/rotational`
1: Hard disk
0: SSD

## Open
`xdg-open`

## Screencast, screenshot
`sudo apt install kazam`

## キーバインドを emacs 風に
`gsettings set org.gnome.desktop.interface gtk-key-theme Emacs`
or
`gsettings set org.cinnamon.desktop.interface gtk-key-theme 'Emacs'`


全選択は、`C-/`.

## Clipboard

## Oh my zsh で git status を表示しない
```
git config --add oh-my-zsh.hide-status 1
git config --add oh-my-zsh.hide-dirty 1
```

## Zsh で改行を insert

C-V C-J   ([source](https://superuser.com/questions/719138/in-zsh-line-editor-how-to-insert-a-new-line))
ipaのembedded.mobileprovisionの中身を一発で表示する


ipaをExportした後、実機にインストールが失敗することがあり、embedded.mobileprovisionファイルをデバッグすることがあります。
特にAdHoc配布の場合、デバイスが正しく登録されたかどうかはこのファイルを見るとわかります。まあ、Provisioning Profile自体がDeveloperポータル上で無効になっていたら意味ないのですが。

毎回unzipして。。とするのも面倒なので、シェルにしてみました。

# Update: 2017/05/18
goのコマンドにしてhomebrewでインストールできるようにしました。
https://github.com/toshi0383/ipanema

```bash
$ brew tap toshi0383/ipanema && brew install ipanema
$ ipanema -E Sample.ipa
.
.
.
    <key>ProvisionedDevices</key>
    <array>
        <string>xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx</string>
        <string>xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx</string>
        <string>xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx</string>
    </array>
```

# inspect_ipa_mobileprovision.sh

```inspect_ipa_mobileprovision.sh
# name:
#   inspect_ipa_mobileprovision.sh 
#
# description:
#   Extract ipa file and decode all embedded.mobileprovision file inside.
#
# author:
#   Toshihiro Suzuki (@toshi0383)
#
# license:
#   MIT
#
# parameters:
#   - 1 IPA_PATH: path to ipa
#

#!/bin/bash
IPA_PATH=${1:?ipa path is missing}
if [ ! -f "$IPA_PATH" ];then
    echo "No such file ${IPA_PATH}"
    exit 1
fi
tmp=`mktemp`
tmppayload=`mktemp -d`

cmsdecrypt='security cms -D -i'

unzip "${IPA_PATH}" Payload/**/*mobileprovision -d $tmppayload > /dev/null

find $tmppayload -name "*mobileprovision" > $tmp

while read line;
do
    $cmsdecrypt $line 2> /dev/null
done < $tmp
rm $tmp
rm -rf $tmppayload
```

# 使い方
パスを通してどこでも使えるようにすると良いかな、と。コマンドにしちゃってもいいのかもしれませんが。

```
$ inspect_ipa_mobileprovision.sh path/to/your.ipa | head
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>AppIDName</key>
	<string>XC your app id</string>
	<key>ApplicationIdentifierPrefix</key>
	<array>
	<string>XXXXXXXXXX</string>
	</array>
```

plist形式で出力されますが、個別のファイルで出力できるようにすると、その後plutilなりPlistBuddyなりで料理しやすいのかもしれませんね。今はApp Extensionの分など複数見つかってもまとめて出力してしまっています。
【初心者向け】ブロック付きメソッドとは

ブロック付きメソッドに対して考える前に、まず**ブロック**と**メソッド**について考えてみよう！

##ブロック

**do ... end** または **{ ... }** の形をしたもの。

初めにdo ... endの記述で書いてみよう！

```ruby
%w(chida hayashi shimohira).each do |name|
  puts name
end


#以下のように表示される
#"chida"
#"hayashi"
#"shimohira"
```

同様に、{ ... }のパターンでも書いてみよう！

```ruby
%w(chida hayashi shimohira).each {|name|
  puts name
}
#上とおなじ結果になります。
```

ブロックを多くの方は、繰り返し処理などの時に使用すると思っているのではないでしょうか。
ブロックとは一体なんですか？と質問される時に、多くの方は上の配列を繰り返し処理する時に使う物と答えるのではないでしょうか。
実はブロックは繰り返しのために使用されるというわけでなく、様々な用途で使用されます。
	
```ruby
File.open 'README.md' do |file|
  puts file.read
end
```

ここで行なわれている処理は
**ファイルを開く**　**ファイルの内容を読み込んで出力する**　**ファイルを閉じる**です。

File.openはブロックを実行した後で自動的にファイルを閉じるため、ファイルを閉じ忘れる心配はありません。
このように配列以外でもブロックを使用しています。
またファイルの他にもデータベースのトランザクションなど処理を抽象化する用途に使用されます。

##メソッド
メソッドとはなんでしょうか？一度プログラミングを実行した方であれば既にお気付きの方もいると思いますが、もう上記の例でメソッドは出現しています。

```
レシーバー.メソッド名
```
という記述方法でメソッドは記述されます。

```ruby
%w(chida hayashi shimohira).each do |name|
  puts name
end
```

この上記の例と見ると、%w(chida hayashi shimohira)がレシーバーに当たります。
そしてeachがメソッド名となります。

ここのeachというものは、配列の要素数と同じ回数だけ処理を実行する事が出来ます。

ここまででブロックとメソッドに関して大丈夫でしょうか？大丈夫ですね！😊
それでは、ブロック付きメソッドについて考えていきましょう。

#ブロック付きメソッド

##引数なしのブロック付きメソッド

```ruby
def block_method
  yield "a"
  yield "b"
  yield "c"
end

block_method do |x|
  puts x
end
```

##引数ありのブロック付きメソッド
```ruby
def plus(x, y)
  yield x, y
end

plus(1, 1) do |a, b|
  puts a+b
end
```

あっ、先ほど上で使用したブロックだ！!と気付きましたでしょうか。ここでもブロックを使用しています。
ここで**yield**という構文が出てきました。ブロックを学習するとよく出てくるyieldについて学びましょう。

##yield

yieldは指定した値をブロックのパラメーターに渡してブロック内部を実行します。下のコードを見て学習しましょう。

```ruby
def block_method
  yield "a"
  yield "b"
  yield "c"
end

block_method do |x|
  puts x
end
```

こちらのyield "a"など指定した"a","b","c"が、|x|（ブロックのパラメーター）に渡して、putsの処理を行います。
ここまでの説明をみて、なんとなく分かったけどいまいち腑に落ちない方、よくわかります。私もそうでした！

ここはある程度プログラミングを学習された方が読み進んでもらえると良いと思います。
実はブロック付きメソッドとyieldは、コールバック関数を**簡単に**書けるようにしたものなのです。

```ruby
def block_method(func)
  func.call "a"
  func.call "b"
  func.call "c"
end

block_method( lambda{ |x| puts x } )
```
これがブロックを省略しないで書いたものです。ここでは深く言及しませんが、このfuncというものは**無名関数lambda**という関数ごと引数に渡しているのです。yieldと記述するだけで、これと全く同義のコードを書く事が出来ます。

では最後に問題を解いてみましょう。


2個の配列とブロックを受け取り、配列の各要素ごとにブロックで指定された演算を行うメソッドplusを作れ。例えば、 plus([1,2], [3,4]){|x,y| x*y} は [4,6] を返す。ただし、引数が配列でない場合や、要素の個数が一致しない場合は考えなくてよい。

解答例1

```ruby
def plus(array1, array2)
  array = []
  array1.count.times do |n|
    array << yield(array1[n], array2[n])
  end
  p array
end
plus([1, 2], [3, 4]){ |x,y| x+y }
```
yieldが引数をブロックのパラメーターに渡してブロック内部を実行しています。よって[4,6]という結果が返ってきます。

解答例2

```ruby
def plus(array1, array2)
  array1.map.with_index{ |n, i| yield(n, array2[i]) }
end
p plus([1, 2], [3, 4]){ |x,y| x+y }
```

#まとめ

ブロックとは**do ... end** または **{ ... }** の形をしたもの。
yieldとは指定した値をブロックのパラメータに渡してブロック内部を実行するもの。

##参照

パーフェクトRuby
Deep Learning bookを読んで学んだこと

## Deep Learning bookとは？
Deep Learning bookは2016年末にMIT Pressより発売予定の書籍（英語）で、深層学習御三家の一人Bengio先生や画像生成のGANで有名なGoodfellow先生らによって書かれており、現時点で深層学習の決定版と言える教科書です。太っ腹なことに本の内容はウェブサイトで公開されており無料で読むことができます。

[Deep Learning; Ian Goodfellow, Yoshua Bengio and Aaron Courville, MIT Press, 2016.](http://www.deeplearningbook.org/)

私は[以前の記事](http://qiita.com/yoh_okuno/items/06155fe4666204caf944)に書いた通り自然言語処理の分野で深層学習が浸透してきてから勉強を始めたため、機械学習はもちろん画像や音声が専門の人と比べて基礎的な知識が足りていないように感じたためこの本を読むことにしました。読み始めてみると機械学習の教科書として有名なPRMLと比べて数式も少なく実践的な応用を重視しているようで（理論的な背景は研究が発展途上ということもありますが）、日本語訳がないという点を差し引いても読みやすく感じました。

内容は大きく3部に分かれており、第1部は前提知識の復習、第2部は教師あり学習を中心にした実践編、第3部は教師なし学習を中心とした研究編となっています。なお強化学習はこの本ではカバーされていません。詳しくは本の方を読んでもらうとして、個人的に特に収穫の大きかった誤差逆伝搬法の部分（6.5節）について紹介したいと思います。

## 誤差逆伝搬法による自動微分
誤差逆伝搬法はニューラルネットワークのコスト関数の勾配を計算する方法としてよく紹介されていますが、この本ではより一般的に動的計画法を適用した自動微分法の一種として捉え直しています。どういうことかというと、勾配を求めたい関数や変数を複数のノードからなる計算グラフとして表し、その計算グラフ上の任意の変数による任意の関数の勾配の計算方法を求められるようにするということです。

これは現代的な深層学習のライブラリのほとんど全てが採用している方針で、さらにコンパイル型とインタープリタ型の2つの方式に分けられます。コンパイル型はTensorFlowやTheanoが採用していて、勾配の計算方法を別の計算グラフとして表すことで二次微分（ヘッシアン行列）を自動的に求められるといった特徴があります。一方インタープリタ型はTorchやChainerのような方式で、勾配の計算方法を計算グラフとして表さずに実行時に動的に求めるため柔軟性が高いという特徴があります。

この本を読んで自動微分の仕組みを理解しておけば、これらのライブラリを使うときに計算グラフが何のためにあるのか、一部の変数（例えば学習率）が計算グラフに含まれないのはなぜかといったことが理解できるようになり、自分で演算を定義するときに必要となる局所勾配の導出もできるようになるでしょう。ただし計算グラフを使う理由は自動微分だけではなく、GPU上で計算を完結させてCPUとのやりとりを減らすという目的もあるのでその点は区別する必要があるでしょう。

## PythonによるDeep Learning
本を読んでいるだけだと自分が分かっているのか分かっていないのか分からなくなってくるため、Pythonを使ってこの本で紹介されているアルゴリズムやモデルを実装し、GitHubで公開しました。

[deeplearning: Python implementation of Deep Learning book](https://github.com/yohokuno/deeplearning)

線形代数や確率の復習は素のPython 3.5、機械学習のアルゴリズムはnumpyで、速度が必要な実験はTensorFlowで実装し、画像による可視化や試行錯誤が必要な実験はJupyter notebookを使いました。ノートブック以外のpythonスクリプトには単体テストが付いています。以前公開した[dl4nlp](https://github.com/yohokuno/dl4nlp)と同じく勉強用のコードですが、深層学習を勉強したいけどやり方がわからないという人がこうやって勉強すればいいんだなという参考になってくれれば幸いです。
BitbucketからGithubへの移行方法

# 移行方法
GitHubにはインポート機能があるのでBitbucketのURLをいれるだけで簡単に移行できます。
以下のURLにアクセスします。

https://import.github.com/

Your old repository’s clone URLに以下のような移行したいBitbucketのプロジェクトページのURLをいれれば自動的にインポートできます。
https://bitbucket.org/takish/repository
グリッドスタイルで高さを同じにする

bootstrap を使って横並びを作ろうとすると、高さがバラバラになる

![スクリーンショット 2016-10-25 19.38.18.png](https://qiita-image-store.s3.amazonaws.com/0/142995/cc181891-b3bd-92a7-b312-45aed70a625d.png)

高さを指定せずに揃えたいので、

col-* クラスを指定している一つ上の要素に「row-eq-height」を追加

```html
<div class="container">
	<div class="row row-eq-height">
		<div class="col-md-2">
			テスト<br>
			テスト<br>
			....（略）....
```

さらにCSSを追加

```css
.row-eq-height {
    display: flex;
    flex-wrap: wrap;
}
```

高さが統一されます。

![スクリーンショット 2016-10-25 19.44.16.png](https://qiita-image-store.s3.amazonaws.com/0/142995/db26b108-ee38-d03f-d466-52166cc2e158.png)
メイリオを斜体にする

```html
<!DOCTYPE html>
<style>
@font-face {
  font-family: Meiryo;
  src: local('Meiryo'), local('メイリオ');
}
:root {
  font: italic 100% Meiryo, sans-serif;
}
</style>
<p>@font-face規則を使ってメイリオを定義してやるだけでメイリオも斜体にできるようになります。
```
[JSBin](https://jsbin.com/himotu/1/edit?html,css,output)
bugsnagを試してみました

bugsnag.comというサービスがあるらしく、Railsにbugsnagというgemを入れるとエラーを貯めてくれたり、GithubにIssueを作ってくれたりするそうです。

# bugsnagのAPIキーを取得
bugsnag.comのページにいってユーザー登録をします。
https://bugsnag.com/

次にプロジェクトを作成します。
<img width="653" alt="Railsプロジェクト" src="https://qiita-image-store.s3.amazonaws.com/0/1624/aca809ec-3f7e-e4c9-15e8-19e5d17649c7.png">
CONTINUEを押します。
<img width="626" alt="bugsnagのAPIキーをメモ" src="https://qiita-image-store.s3.amazonaws.com/0/1624/9833781c-bf88-1a43-6572-2bf200507a52.png">
導入方法が表示されました。
3.のところにAPIキーがあるのでコピーしておきます。

# bugsnagを導入
導入テキストのとおりにGemfileにbugsnagを指定します。

```
vi Gemfile

group :development, :test do
  gem "bugsnag"
end
```

gemをインストールします。

```
bundle install
```

bugsnag.rbを生成します。

```
rails generate bugsnag APIキー

 initializer  bugsnag.rb
```
`config/initializers/bugsnag.rb`が生成されました。

# bugsnag.rbを編集
生成されたbugsnag.rbにはAPIキーがべた書きされていました。

```rb
Bugsnag.configure do |config|
  # config.api_key = "APIキー"
  config.api_key = ENV['PUGIEMONN_COM_BUGSNAG_API_KEY']
end
```
環境変数にしてみました。

```bash
vi ~/.bashrc

export PUGIEMONN_COM_BUGSNAG_API_KEY='APIキー'
```
`.bashrc`に書いておきます。

# bugsnagとGithubを連携する

bugsnagの管理画面に行き、`SETTINGS`から`Projects`を選択して、`Configure integrations`からGithubと連携します。

Githubの画面に移動するので情報を入力して`Personal access tokens`というものがコピーできるのでコピーしておきます。

<img width="739" alt="スクリーンショット 2016-10-25 19.21.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/1624/1ff66c15-db83-20e3-8be9-0989ca1da2c7.png">

bugsnagの管理画面に戻り`Personal access tokens`を入力します。

設定はこんな感じにしました。
<img width="429" alt="スクリーンショット 2016-10-25 19.25.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/1624/b844a348-98c1-0b3a-2129-cf6a9206dcc7.png">

とりあえずBugsnagのエラーのISSUE作成にチェックを入れています。
<img width="575" alt="スクリーンショット 2016-10-25 19.25.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/1624/3020fc00-d443-3b28-7467-e273a2774ac7.png">

# エラー発生コマンドを実行
rakeコマンドを実行するとexceptionを発生させられるみたいです。

```bash
bundle exec rake bugsnag:test_exception
```
bugsnagの管理画面にいくとエラーが見つかりました。
<img width="948" alt="スクリーンショット 2016-10-25 19.33.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/1624/6c983839-1d27-eb08-10c4-c55751cb6383.png">

Githubに[ISSUEが作成](https://github.com/pugiemonn/pugiemonn.com/issues/55)されていました。

# 感想
GithubにISSUEが作成されたのでとりあえずここまでです(☝ ՞ਊ ՞)

# 参考
https://docs.bugsnag.com/platforms/ruby/rails/
[IE][BHO] Internet Explorer Add-on (Browser Helper Object - BHO)をVisual Studio 2013でデバッグする方法

古のテクノロジーを再び目覚めさせなければならなくなった未来人へ……。

# 環境

- Windows 10 Professional (x64)
- Visual Studio 2013 Professional Update 5
- Internet Explorer 11 (x86)

# やるべきこと

やるべきことを列挙します。

- Visual StudioをAdministrator権限で起動する（次でCOMを登録するため）
- プロジェクトのプロパティ＞ビルド＞Register for COM interopをチェックする
- IObjectWithSiteのSetSite内で、Debugger.Launch()する


以下詳細です。

## Visual StudioをAdministrator権限で起動する

ビルドと同時にBHO COMを登録するために、Visual StudioをAdministrator権限で起動します。

手動で登録する場合は、一般ユーザ権限で問題ありません。

手動での登録にはregasmコマンドを使います。

```
regasm DLLファイル名 /codebase
```

## プロジェクトのプロパティ＞ビルド＞Register for COM interopをチェックする

[PROJECT]-[プロジェクトのプロパティ]メニューを開きます。

[ビルド]タブを選択し、[Register for COM interop]をチェックします。

![debugbho1.PNG](https://qiita-image-store.s3.amazonaws.com/0/59475/48e756bf-2c27-bf5d-0896-d37e659ba0d6.png)

## IObjectWithSiteのSetSite内で、Debugger.Launch()する

IEを起動したとき、Visual Studioのデバッガへ自動接続するようにします。

IObjectWithSiteインターフェースを実装するクラスの中で、以下のようにします。

```csharp:
public void SetSite(Object site)
{
#if DEBUG
    System.Diagnostics.Debugger.Launch();
#endif
    // some code
}
```

手動でやるときは、Visual Studioから[DEBUG]-[Attach to Process...]メニューを開いて、IEを選択します。


# デバッグ時の手順

1. IEが起動していたら終了する
2. Visual Studioでビルドする
3. IEを起動する
4. デバッガの選択画面が表示されるので、使用しているVisual Studioを選ぶ

# 落穂拾い

登録してしまったBHO COMは、以下のようにして登録解除できます。

```
regasm DLLファイル名 /unregister
```
Watson Java SDK 3.5.0 で Speech To Text 日本語

https://github.com/watson-developer-cloud/java-sdk/blob/master/speech-to-text/README.md

java-sdk-3.5.0-jar-with-dependencies.jar

SDK 3.5.0 の、日本語のときのオプション設定が不明だったので。

```java
package stt;

import java.io.File;

import com.ibm.watson.developer_cloud.http.HttpMediaType;
import com.ibm.watson.developer_cloud.speech_to_text.v1.SpeechToText;
import com.ibm.watson.developer_cloud.speech_to_text.v1.model.RecognizeOptions;
import com.ibm.watson.developer_cloud.speech_to_text.v1.model.SpeechAlternative;
import com.ibm.watson.developer_cloud.speech_to_text.v1.model.SpeechResults;
import com.ibm.watson.developer_cloud.speech_to_text.v1.model.Transcript;

public class SpeechToTextExample {

	public static void main(String[] args) throws Exception {

		String endPoint = "https://stream.watsonplatform.net/speech-to-text/api";
		String username = "xxx";
		String password = "yyy";
		String wavFile = "file/input.wav";
		String model = "ja-JP_BroadbandModel";

		SpeechToText service = new SpeechToText();
		service.setUsernameAndPassword(username, password);

		RecognizeOptions recognizeOptions = new RecognizeOptions.Builder()
				.contentType(HttpMediaType.AUDIO_WAV) //
				.continuous(true) //
				.interimResults(true) //
				.model(model) //
				.build();

		File audio = new File(wavFile);
		service.setEndPoint(endPoint);

		long time1 = System.currentTimeMillis();
		SpeechResults transcript = service.recognize(audio, recognizeOptions)
				.execute();
		long time2 = System.currentTimeMillis();
		System.err.println("time:" + (time2 - time1));

		// System.out.println(transcript);
		// System.out.println();
		for (Transcript t : transcript.getResults()) {
			// System.out.println(t.toString());
			for (SpeechAlternative a : t.getAlternatives()) {
				System.out.println(a.getTranscript());
			}
		}
	}
}


```

以下、結果。

time:5152
今日 は 桜 が きれい だった 
久々 に 六本木 に 行った けど いろいろ 新しい ビル が 増えてる ね
案 > PDFファイル作成処理の失敗チェック > Chrome使用が便利

Windowsソフトで作成したPDFファイルがある。
Windowsソフトの不具合でPDF作成に失敗したかチェックするには。

- 不具合の特徴
   - 特定ページのグラフ描画欠損
   - グラフタイトルの欠損
   - 凡例の欠損
   - 軸の欠損

## TensorFlow案

### 目視の場合
  - 処理時間: 1枚5秒
  - ファイル数: 90

### Deep Learningの場合

正常PDFと異常PDFの訓練データファイルを作成する。
それを用いてTensorFlowで2値クラス分類を学習させる。誤差関数はcross entropy。
学習結果を用いて、通常PDFファイルを処理して「正常」「異常」の判別をする。

上記の処理を5秒 * 90枚 = 450秒以内でできるか。
無理。

### 今のところ

検討の結果、目視処理の方が今はよさそう。

将来的に処理対象ファイルが9000枚とかになった時には上記のようなものを検討することもありかもしれない。問題は誤認識（「異常」を「正常」ととらえること)をどれほど減らせるか。

## 複数ファイルアニメーション表示案

複数のPDFファイルを開いて、各ページごとにアニメーション表示する、ようなソフトを実装する。

アニメーションにおいて、違和感の出る部分がPDF作成失敗している。

このようなソフトの実装も450秒ではできない (実力不足)。

linuxコマンドを組み合わせてするというのもありかもしれない。
低優先度で時間が余った時にでも検討する。当分は無理。

## Chrome使用

手順

1. 複数のPDFファイルをChrome上にてタブで開く
2. 各タブについて以下をする
  - Ctrlを押しながらマウスホイールを回転し、表示を最小にする
  - +マークを2回押して、1.5ページ表示にする 
3. Ctrl+Tabで切り替え表示して異常のチェック
4. 各タブについて以下をする
  - スペースキーでページ送り
5. Ctrl+Tabで切り替え表示して異常のチェック 
6. 手順4に戻りすべてのページまで処理する

アニメーションのように表示され、異常ファイルが見つけやすくなる。
ページ送りにはスペースキーを使う。

ページ縮小表示など組み合わせると、なお良い。

タブ切り替え http://qiita.com/7of9/items/06066a0584605b63f081

ファイル数は13くらいは処理できそう。
欲張るとタブ操作時にxマークを押してしまう。

欠損が１つ見つかった。
ubuntu 16.04 or raspberry pi 3 でのNISの設定

# はじめに
以下の説明は、IPアドレス 192.168.1.1 のサーバー(ホスト名：host1)と IPアドレス 192.168.1.2 のクライアントでNISをする時の設定を意図しています。
NISを使って、両方のマシンで同じユーザー名、パスワードを使う、といった運用を考えています。

# サーバー側
まず、サーバーをインストールします。ドメイン名を決めた後、以下のコマンドを実行します。ドメイン名自体は、/etc/defaultdomainを編集すればいつでも変えることが可能です。
``
sudo apt-get install nis
``
次に、/etc/ypserv.securenets を編集します。
``
sudo vi /etc/ypserv.securenets
``
このファイルに以下を追記してください。
``
255.255.255.0   192.168.1.0
``
次にNISの設定を編集します。
``
sudo /etc/default/nis
``
ここで、編集すべき箇所が2つあります。
1, 6行目 NISSERVER=falseをNISSERVER=masterに変更してください。
2, 8行目 NISCLIENT=true を NISCLIENT=false に変更してください。

次に、ユーザーのデータベースを更新します。
``
sudo /usr/lib/yp/ypinit -m
``
次に、サービスを起動します。
``
sudo service rpcbind start
sudo service ypbind start
``

ubuntuでも、raspberry piでもrpcbindがデフォルトでは動いていないみたいです。そのため、最初にrpcbind を起動しています。
その後、NISサーバーを起動しています。

# クライアント側
まず、NISをインストールします。
``
sudo apt-get install nis
``
次に、参照する予定のNISサーバーの設定を行います。
``
sudo vi /etc/yp.conf
``
このファイルに、以下の行を追記します。
``
ypserver host1
``
次に、/etc/hostsを編集します。名前の逆引きが可能であれば必要ありません。
``
sudo vi /etc/hosts
``
ここに以下の行を追記します。
``
192.168.1.1  host1
``
次に、ドメイン名の設定を行います。
サーバー側で設定したものと同じドメイン名を使ってください。
``
sudo vi /etc/defaultdomain
``
次に、NISを読み込むように設定を行います。
``
sudo vi /etc/nsswitch.conf
``
ここの compat と書いてある所全てに、 nis を追加してください。
``
編集前 -> compat
編集後 -> compat nis
``
サービスを起動します。
``
sudo service rpcbind start
sudo service ypbind start
``
ubuntuでも、raspberry piでもrpcbindがデフォルトでは動いていないみたいです。そのため、最初にrpcbind を起動しています。
その後、NISクライアントを起動しています。

確認として、host1マシンにしか居ないユーザーに切り替わって見ましょう。
``
su host1only
``
このコマンドを実行して、パスワードを聞かれたら成功です。
ユーザ'host1only'のパスワードエントリがありません。的なことを言われたら設定を見直してください。

念のため、チェックするためのコマンドを書いておきます。
ypbindの起動確認のコマンドは以下の様な感じです。
``
ps aux | grep ypbind
``
結果が、 /usr/bin/ypbind みたいな出力があれば大丈夫です。なければ、ypbindが起動していません。ypbind を起動してください。
また、同様にrpcbindの起動確認は以下の様なコマンドでできます。
``
ps aus | grep rpcbind
``
自動起動するためには、以下のコマンドで良いっぽいです。
``
sudo update-rc.d rpcbind enable
``


# 参考
http://askubuntu.com/questions/771319/in-ubuntu-16-04-not-start-rpcbind-on-boot
http://qiita.com/hdoi/items/9cff4f840939636df807
http://botukikaku.blogspot.jp/2015/04/raspberry-pi-nfs.html
Slack | Incoming Webhooks を使って コンソールから curl で投稿する

# 1. 投稿先のチャンネルを選ぶ。

https://slack.com/services/new/incoming-webhook にアクセスする。

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/28b6a0bf-d07b-b5b1-fc26-04507bb07a01.png)

# 2.  WebHookのURLが表示される。

こんなの。

`https://hooks.slack.com/services/XXXXXXXXX/XXXXXXXXX/XXXXXXXXXXXX`


# 3. コンソールでコマンドを打つ

(2)で得たURLを末尾につける。

`$ curl -X POST -H 'Content-type: application/json' --data '{"text":"test"}' https://hooks.slack.com/services/XXXXXXXXX/XXXXXXXXX/XXXXXXXXXXXX`

# 4. 成功


![image](https://qiita-image-store.s3.amazonaws.com/0/89618/cc4547b6-9396-78a9-9773-ad5d0cbb2425.png)

# 備考

- 備忘録。
- ひとつのことをするにも複雑すぎるSlack。

# 参考

- http://qiita.com/vmmhypervisor/items/18c99624a84df8b31008








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
iOSアプリの行動ログをTreasure Dataへ登録しようとしたらデータが重複してはまった話

TDにiOS向けのSDK（[td-ios-sdk](https://github.com/treasure-data/td-ios-sdk)）で、起動時のログを登録しようとしたら、サーバサイドに登録したデータが重複してたよという話題です。（多分仕様です。）


## やりたかったことの概要


アプリの起動時にいろいろな箇所でaddEvent()をやって、サーバにuploadしたかどうかは管理したくないので、addEvent()した直後にuploadEvents()を都度実行するといったことをやってみました。

### コードイメージ

```swift
TreasureData.sharedInstance().addEvent(["msg":"first"], database: "test_app", table: "test_table")
TreasureData.sharedInstance().uploadEvents()
 
TreasureData.sharedInstance().addEvent(["msg":"second"], database: "test_app", table: "test_table")
TreasureData.sharedInstance().uploadEvents()
```	

### 結果	


![スクリーンショット 2016-10-25 17.33.49.png](https://qiita-image-store.s3.amazonaws.com/0/88743/553c4e7d-e929-e680-75e4-47b2818b5b98.png)


firstとsecondのレコードがそれぞれ２件作られました。


## 重複に関する調査

### その1

TDサイトに最後に登録された10分間にUUIDが重複していたら削除すると書かれています。

https://docs.treasuredata.com/articles/data-deduplication



### その2

http://qiita.com/komamitsu/items/8c4fe3ed8cef2f2f3567

>サーバー側でイベントの重複排除を行っているためアップロードが複数回行われてもデータの重複を防止（現在、1日間の重複排除を実施）

td-ios-sdk のコミッタの方の記事でサーバーサイドで重複に対する考慮されているとありました。

SDKでレコードを追加すると、レコード毎に値が異なるuuidカラムが暗黙のうちに追加されていて、enableAutoAppendRecordUUID()との違いがよくわっていなかったのですが、uuidカラムを使って重複削除する仕組みのようです。ただ、実験した環境だと動いていないようでした。



## 回避をこころみた

### やってみたこと

uploadEventsメソッドにはコールバックを受け付けるバリエーションがあります。これを使って、uploadEventsを直列化すれば重複を回避できそうです。


```swift
TreasureData.sharedInstance().uploadEventsWithCallback(
    {
        //成功した場合
    },
    onError: {errCode,errMsg in
        //失敗した場合
    }
)

//dispatch_sync()とかdispatch_semaphore_waitとかで直列に処理する
```

### 結果

Request data is empty とログがでて、直列化の途中で詰まりました。内部のKeenClientクラスで、アップロードするデータが無い場合は、成功のブロックも、失敗のブロックも呼ばない仕様のようです。

## 今回のまとめ

さがせば書いてあるのかもしれませんが、公式のドキュメントとgithubのプロジェクトを1日くらい眺めていましたが、特にこれ以上の情報は見つけられませんでした。サーバに登録されたレコードには、timeカラムが自動的に付与されて処理時間が記録されるのですが、ミリ秒以下の時間は丸められています。ディフォルトだと秒単位でレコードを記録をする仕組みなので、1秒間に何度もイベントを記録するといった用途はそもそも向いていないのかもしれません。