OmniAICreator/Qiita-1.07M huggingface dataset:
お手軽簡単PHPでクラスオートローダを作ってみた

# はじめに

- PHPを開発するときに、基本的にフレームワークには備わっていると思いますが、クラスをロードするオートローダクラスを作ってみました。
- 必要最低限の処理しか実装していないですが、それ以上の便利機能も特になさそうなので、よくバッチを作る際とかに重宝していたりしてます。
- ちなみにオートローダとは、複数ファイルやディレクトリ指定でrequireクラスをしてくれるクラスです。
- また、同じクラス名が被ってもエラーにならないようにNamespaceをつけられるようにしてます。

# ソースコード

```php:AutoLoader.php
<?php

/**
 * オートローダの基底クラスです
 */
class AutoLoader
{
  
    /**
     * @var array $classMap クラスマップ
     */
    protected $classMap = array(
        'XXXX\\Controller\\' => 'app/controller/',
        'XXXX\\Entity\\' => 'app/entity/',
        'XXXX\\Filter\\' => 'app/filter/',
        'XXXX\\Model\\' => 'app/model/',
        'XXXX\\Task\\' => 'tasks/',
        'XXXX\\Test\\' => 'tests/',
        'XXXXLib\\' => 'libs/',
    );
  
    /**
     * 指定した関数を __autoload() の実装として登録する
     */
    public function register()
    {
        spl_autoload_register(array($this, 'loadClass'));
    }
  
    /**
     * 対象となるクラスファイルをロードする
     *
     * @param string $className クラス名称
     * @return なにもしない
     */
    public function loadClass($className)
    {
        $file = str_replace(array_keys($this->classMap), array_values($this->classMap), $className);
  
        if (is_readable(__DIR__ . '/../' . $file . '.php')) {
            require __DIR__ . '/../'. $file . '.php';
            return;
        }
    }
}
```

# 使い方

## AutoLoaderクラスのロード

```php
require_once ROOT_DIR . '/libs/AutoLoader.php';
$autoLoader = (new AutoLoader())->register();
```

## ロードしたクラスの呼び出し

```php
<?php

namespace XXXX\Controller;

use XXXX\Entity\FugaEntity;
use XXXX\Service\Mysql\FooService;
use XXXXLib\Config;

class BarController
{
```

# 全リンク
- [お手軽簡単PHPでクラスオートローダを作ってみた](http://qiita.com/neriai/items/ba6e3126c33132907080)
- [お手軽簡単PHPで設定ファイルローダを作ってみた](http://qiita.com/neriai/items/1614e3c41def7bfa72cf)
- [お手軽簡単PHPでロガーを作ってみた](http://qiita.com/neriai/items/24a63bd66fd3563cacf7)
- [お手軽簡単PHPでバッチ用フレームワークを作ってみた](http://qiita.com/neriai/items/3fdc070f3b429e792a23)
ゲーム開発を受注しようぜ＜その６＞

前回の記事:http://qiita.com/muzudho1/items/c2d57d16fbab3db50f86

今回の記事は　別ブログに移動した。

「コインをステージに置いてくれだぜ☆（*＾～＾*）＜その１＞」
http://ordergame.warabenture.com/?p=25
cakephp3 behavior $this->data に 値をセット

まずエラー文
Indirect modification of overloaded property Cake\Event\Event::$data

はい。ビヘイビアのbeforeSaveで データをセットしようとするとこんなのが出る。
その対処方法。



```



class MarkdownBehavior extends Behavior
{


    public function beforeSave($event,$entity)
    {
        //$this->data['hoge'] に たろう をセット
        $entity->set("hoge","tarou");
    }




}




```


以上。
[Obsolute]ファイアウォール下での時計あわせ

下記の方法はNICTがhttpsで時刻を送信しなくなってしまったので，obsoluteとなってしまいました．(https://jjy.nict.go.jp/httphttps-index.html) 他のサイトを使えばできるかもしれません．過去の記録として残しておきます．

企業などのネットワークでは、セキュリティの事情でUDP123が閉じられているために, ntpdateが使えないことがある. httpsが接続できるなら(これができないということはほとんどないはず...), nict.go.jpのデータを利用する方法がある.

```bash:w3mを使ったやり方
date -s "`w3m -dump https://ntp-a1.nict.go.jp/cgi-bin/time`"
hwclock -w
```
上の w3m -dump ...というのは, nict.go.jp の時刻データを https で拾ってきて, 標準出力で出力させるコマンドであり、この標準出力をdateコマンドに渡している。最後のhwclock -wはハードウェア時計をソフトウェア時計に合わせる設定である.

ちなみに, リンク先については[nictの技術情報](http://www.nict.go.jp/JST/http.html)から選んだものである. 自分で都合のよいものを選べば良い. 

### 追記

w3m 以外に curl や wget を使ってもできる(指摘いただいた @kazinoue 様, ありがとうございます)

```bash:curlを使ったやり方
date -s "`curl -s https://ntp-a1.nict.go.jp/cgi-bin/time`"
hwclock -w
```

curl のコマンド中の -s はなくてもいけるかもしれません. 要は標準出力に日付データが出せればよいだけ.

```bash:wgetを使ったやり方
date -s "`wget https://ntp-a1.nict.go.jp/cgi-bin/time -q -O -`"
hwclock -w
```

ダウンロード情報等も出さないように -q を加える. "-O -" は標準出力に表示するコマンドである(-O /dev/stdout でもよい).
[checkio]Weak point

問題は引数に数字のみを要素として持つ二次元配列が与えられ、一定のルールに則って弱点を探す。
一定のルールとは、縦横の列それぞれの合計の、もっとも低い列の重なる位置となる。
これで宇宙船のメンテナンスをする・・・だと・・・
なんと今回は一発でテストが通る。嬉しい(*´ー｀*)

###自分の回答

```js
function weakPoint(matrix){
    //variables
    let sumCol = [];
    let lenRow = matrix[0].length;
    let lenCol = matrix.length;
    
    //calculate sum
    let sumRow = matrix.map(function(x) {
        let sum = 0;
        for (let i of x) {
            sum += i;
        }
        return sum
    });
    for (let i = 0; i < lenCol; i++) {
        let sum = 0;
        for (let j = 0; j < lenRow; j++) {
            sum += matrix[j][i];
        }
        sumCol.push(sum);
    }
    
    //find weakest and obtain index
    let minRow = Math.min.apply(null, sumRow);
    let minCol = Math.min.apply(null, sumCol);
    let minRowIdx = sumRow.indexOf(minRow);
    let minColIdx = sumCol.indexOf(minCol);
    
    return [minRowIdx, minColIdx]
}
```
相変わらず正攻法でしか解けない。前回学んだmapメソッドを使ってみた。sumColの方も頑張れば使えたのか。

###すごいかいとう
```js
function weakPoint(matrix){
    function minRow(matrix) {
        let sum = matrix.map(row => row.reduce((p, c) => p + c))
        return sum.reduce((p,v,i) => sum[i] < sum[p] ? i : p, 0)
    }
    return [minRow(matrix), minRow(_.unzip(matrix))]
}
```
もはや何が起こってるのかわからない。
3行目ではmapメソッドでrowを一つずつ取り出しつつreduceを使って合計を求めて、sum array objectに格納。アロー関数すごい。
4行目のreduceの引数を３つ定義してiとpをなんでインデックスに使ってるのかがわからない・・・
pはreduceに第二引数として渡されてる0がまず入って、iも一回目の処理は最初の要素だからこれは同じ要素の比較をしているのではないのか・・・？
あ、pとiにはインデックスの値しか入らないようにあえて指定してるのかな。で、左から順に比べていって一番小さいものが最後に残ると。
最後にunzipで縦横を入れ替えて、同じ関数で縦バージョンを処理。

む、.unzipのアンダースコアってなんだ・・・
stack overflowにあった。
[javascript - What does "_" means here? - Stack Overflow](https://stackoverflow.com/questions/5418279/what-does-means-here)
backbone.jsのunderscore.jsというところのオブジェクトらしい。ドットインストールで扱われてるらしいのでチェックする。


###学び
Math.min()
　ー与えられた複数の数字からもっとも低い数値を返す。配列は受け取れない。
function.apply(thisArg[, argsArray])
　ーargsArrayに渡した配列に対してfunctionの関数を呼び出す。thisArgには関数に渡すthisの値を指定できる。nullで省略も可能。

reduce(function(previous value, current value, idx, array){return })
　ーなにがしかの指定した動作で配列を一つの値にする。第二引数、つまり初期値を指定した時は、callbackの回数が一回増えることになる。
MDCによると・・・
>配列の（左から右へ） 2 つの値に対して同時に関数を適用し、単一の値にします。

便利そう(参考：[reduce関数は結構有用っていうお話 - あと味](http://taiju.hatenablog.com/entry/20110331/1301535208))

concat(value)
　ー配列オブジェクトに呼び出して、引数の配列と連結させる。

unzip(array)
　ー縦横を入れ替えた２次元配列を作り出すのに使える。



###反省
アロー関数を確認しつつ、今度使ってみる。
あとドットインストールをチェック。
--ssl-mode=REQUIRED などca.pem以外のSSL接続を阻止したい（MySQLフォーラムへもクロスポスト）

浦本＠エクスファと申します。 

MySQL5.7以降で、ssl接続を許可すると、--ssl-mode=REQUIRED など、本来の ca.pem を持っていなくてもアクセス可能になるわけですが、 
--ssl-mode=REQUIRED や暗号化方式でのログインを阻止し、ca.pem を持っていないとアクセスできなくしたいのです。 

ご存知であれば、ご教示いただけないでしょうか？ 

Nice to meet you, 

With MySQL 5.7 and later, if you allow ssl connection, you can access even if you do not have the original ca.pem, such as - ssl - mode = REQUIRED, 
I want to prevent --ssl-mode = REQUIRED or login with encryption method and to have access without ca.pem. 

If you know, could you teach me?
USBマスストレージメモリをext3/ext4でフォーマットする

USBメモリはfat32やntfsでフォーマットされていることが多いが, gitなどでロングネームファイルや大文字小文字を区別するファイルを管理したいときは, ext3でフォーマットしたい. 以下, USBメモリが/dev/sdbに接続されていると仮定して, USBメモリのフォーマット方法を述べる.

# メモリのパーティション作成 

```bash:cfdisk
sudo cfdisk /dev/sdb
```

とする. このときに/deb/sdb がUSBメモリに対応しているかを確認すること. USBメモリを刺したときに dmesg を使えば, USBメモリがどのデバイスと対応しているかを確認することができる. windowsと共用するときは, fat32(LBA) と ext3/ext4 の二つのパーティションを作ればよいだろう. なお, fat32のパーティションを作成するときは, 最初のパーティションに作ること. これは, windowsではusbメモリの最初のパーティションしか認識しないため. 以下, /dev/sdb2にext3のパーティションを作ったとする. 

# ext3フォーマット

```bash:mkfs.ext3
sudo mkfs.ext3 /dev/sdb2
```
とすればよい. 

```bash:mkfs.ext3
sudo mkfs.ext3 -L hogehoge /dev/sdb2
```
を加えれば, ボリュームラベル hogehoge を付加できる. USBごとにボリュームラベルを変えておくとマウントするときにボリュームラベルで区別ができて便利.

# user/groupの設定

このままだと, マウントしてもrootしか読み書きができないので不便. /media/disk/にマウントしたとして

```bash:chown
sudo mkdir /media/disk/hogehoge
sudo chown USERNAME.USERGROUP /media/disk/hogehoge
```
として, hogehogeディレクトリを作成し, 所有者をUSERNAME, グループをUSERGROUPにする. USERNAMEやUSERGROUPを一般ユーザの名前とグループにすれば, 一般ユーザでも読み書きできる. 

# 余談

この作業をするときは心を落ち着けて, きちんと確認をしながら作業をすること. ミスってdual bootのwindowsパーティションや回復パーティションをフォーマットしないように... 先人のミスから学んでいただければありがたい...
UE4.16.1でBLUIを使ってWebサイトを表示してみる

UE4やUnityでWebサイトを表示させたくて色々探してみていたが[BLUI](https://github.com/AaronShea/BLUI)というオープンソースのプラグインがあったのでUE4で使ってみた。

## BLUIについて

* [CEF](https://bitbucket.org/chromiumembedded/cef)(Chromiumの機能をアプリケーション内に組み込むためのフレームワーク)を利用してWebサイトを表示できる。
* しばらく変更がコミットされていないので使えないかと思ったが現時点でのUE4では動かすことができた。
* 最後のリリースが2015/08/10で内包されているCEFのバージョンがやや古い。[ビルドスクリプト](https://github.com/AaronShea/BLUI/tree/master/builder)が用意されているのでこれを利用すれば最新版のCEFを取り込める？
* 色々できそうだがまだそこまでさわれていない。

## 試した環境

* Windows10 Professional 64bit
* UE 4.16.1
* [BLUI 3.1](https://github.com/AaronShea/BLUI/releases/tag/3.1)
* Visual Stduio 2015/2017
* Windows SDK 8.1/Windows 10 SDK

## 試したこと

* 基本的には[BLUEのセットアップ手順](https://github.com/AaronShea/BLUI/wiki/Simple-Setup-(Windows-64-Bit))に従うとWebサイト表示までこぎつけられる。
* [pull/95の変更](https://github.com/AaronShea/BLUI/pull/95/files)と[GetModuleFilename(string) is obsolete vc14 UE4.12 - UE4 AnswerHub](https://answers.unrealengine.com/questions/460185/getmodulefilenamestring-is-obsolete-vc14-ue412.html)の変更を適用してコンパイルエラーを回避する必要がある。
* [2.Actor ブループリントをセットアップする | Unreal Engine](https://docs.unrealengine.com/latest/JPN/Engine/UMG/HowTo/Create3DWidgets/ActorSetup/index.html)のやり方で以下のような感じでも表示できる。
![blui_capture.PNG](https://qiita-image-store.s3.amazonaws.com/0/16768/fcc7bd55-9789-cc71-daca-0e03e04e6382.png)


## はまったこと

* 新規プロジェクトの作成でC++を選んでいなかったためにPluginsが読み込めなかった。
* WindowsのFirewallをオンにしていて実行ファイルで通信ができずWebサイトが表示されなかった。
自身のviewはタッチに反応させず親viewに任せるが子viewのタッチは反応させる

`isUserInteractionEnabled=false`だと子viewのタッチも反応しないから困るよねってやつ
古典的なやり方なせいかSwift版が見つからなかったんでメモ

```.swift
  //UIViewのサブクラスでこのメソッドをオーバーライド
  override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
    let view = super.hitTest(point, with: event)
    return view == self ? nil : view
  }
```
Docker for Windows でDockerが管理するボリュームをマウントする手順（シリーズその４）

#はじめに

[Docker for WindowsでIISウェブサイトの開発環境を作る手順](http://qiita.com/yoshiwatanabe/items/a903f7855e8f1f014018)の[[方法その２]コンテナ側のディレクトリにアクセスする](http://qiita.com/yoshiwatanabe/items/a903f7855e8f1f014018#%E6%96%B9%E6%B3%95%E3%81%9D%E3%81%AE%EF%BC%92%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E5%81%B4%E3%81%AE%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%81%AB%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%99%E3%82%8B)で紹介した、コンテナの実行方法で、コンテナ側に新にボリュームを設定しました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/103139/2756695c-36c1-97ce-2c10-f64edd6a23d8.png)

このボリュームはDockerエンジンがホストのどこかに保存しています。

#dockerのボリューム機能を使う
Dockerが管理するボリュームを列挙するには以下のコマンドを実行します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/103139/88aee6f6-e6ce-249d-e949-55708e1f23a7.png)

ところで、上のスクショには`my-volume`という名前のボリュームがありますが、以下のように簡単に任意のボリュームを作成できます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/103139/84437134-3c88-c6db-067a-43204a1e116f.png)

ホストのどこにボリュームがあるのかを調べるには`docker volume inspect`を使います。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/103139/a9509ba2-1bab-2f5b-8e4e-384327ee3dcc.png)

ところで`docker volume inspect`コマンドは完全なボリュームIDを必要とするようです。これは`docker run`がイメージIDの一部を取るのとは対照的ですね。

このボリュームにはシンプルなHTMLページを配置してます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/103139/0c7d569a-b2f0-978c-1508-c3a03fbf9503.png)

#ボリュームをマウントする

このボリュームをコンテナにマウントするには、以下のようなコマンドを使います。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/103139/6fd8a96a-6006-c0d6-9fb2-50ae20b95427.png)

* -v コマンドにボリュームIDを指定します
* ：のあとにコンテナ側のマウントするディレクトリ名を指定します

コンテナ側から正しくボリュームがマウントされているか確認します。`index.html`ファイルが存在するか、ファイルの日付が同じかどうかを検証します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/103139/e4695be1-f504-2d34-f491-cea7b7bae212.png)

正しくマウントされています。

#まとめ
Dockerのボリューム機能を使うことで同じボリューム、つまり同じフォルダーとファイルの集合、を異なるコンテナで使いまわしをすることが出来ます。例えば異なる環境を複数のイメージ（もしくはコンテナ）で再現し、全く同じボリュームをマウントしてそのふるまいを観察する、などの応用が考えられます。
Javascriptの実行順序(Web Worker、非同期処理、イベント )

cloudpack [あら便利カレンダー 2017](https://cloudpack.github.io/benri2017/) 16日目の記事です。

JavaScriptには非同期処理やイベント発火で実行されるもの、またWeb Workersを利用した別スレッドでの実行など記述した順序どおりではない実行タイミングのものがわりと多用されます。

そこでふと気になったのでそれぞれの実行順序ってどうなっているのか
Web Workersの別スレッドで実行された結果がどのタイミングで受取ったイベント発行されるのか気になったので
サンプルのコードを書いてざっくり調査してみました。

## 実行される処理
1. Web Worker1での1つめの処理
2. Web Worker2で2つめのループ処理
3. Web Worker1で3つめのループ処理
4. 非同期で実行される処理(setTimeout)
5. べた書きでのループ処理1
6. べた書きでのループ処理2
7. ボタンクリックでのイベント発火

記述した順序は上に書いたとおりで試しています。

## 書いたコード

```js
// メインのスクリプト
document.getElementById('btn')
    .addEventListener('click', () => console.info('button click fired!!!'));

document.getElementById('start')
    .addEventListener('click', () => {
        workerLog = function (e) {
            console.group();
            console.log(`%c${e.data} Worker onmessage fired!!!`, 'background: yellow; color:blue;');
        }

        let myWordker = new Worker('./worker.js');
        myWordker.onmessage = workerLog
        let myWordker2 = new Worker('./worker.js');
        myWordker2.onmessage = workerLog

        myWordker.postMessage("First Worker>>>");
        myWordker2.postMessage("Second Worker>>>");
        myWordker.postMessage("Third Worker>>>");

        setTimeout(() => {
            console.groupCollapsed();
            for (let i = 0; i < 10000; i++) {
                console.log('First Timeout>>>' + i);
            }
            console.groupEnd();
        }, 10)

        console.groupCollapsed();
        for (let i = 0; i < 10000; i++) {
            console.log('First Loop>>>' + i);
        }
        console.groupEnd();

        console.groupCollapsed();
        for (let i = 0; i < 10000; i++) {
            console.log('Second Loop>>>' + i);
        }
        console.groupEnd();
    })
```

```js
// Worker
onmessage = function(e) {
    let ar = []
    // console.group();
    for(let i=0; i<10; i++) {
        ar.push(i)
        // console.log(e.data+i)
    }
    postMessage(e.data)
}
```

## 結果
べた書きで書いたループ処理の実行が2つとも完了しない限り、
Workerからのメッセージ受取イベント`onmessage`や、 非同期処理`setTimeout`の実行は開始されませんでした。
またループ処理の途中で割り込み処理が入ることはないです。
クリックイベントに関してはメインのスレッドが完了後、イベントの発火が登録されていれば`setTimeout`や`onmessage`の処理よりも先に実行されました。

以下にサンプルコードをアップしています。
https://nobu222.github.io/WebWorker-sample/
Ubuntu16.04でInfinibandクラスタを作る。



###必要なパッケージをインストール
```
sudo apt-get install infiniband-diags opensm ibverbs-utils infiniband-diags perftest
```

###ドライバーインストール
```
wget http://us.archive.ubuntu.com/ubuntu/ubuntu/pool/universe/libm/libmlx4/libmlx4-1_1.0.6-1_amd64.deb
sudo dpkg -i libmlx4-1_1.0.6-1_amd64.deb 
```

/etc/modulesに必要そうなモジュールを追加して、それぞれをmodprobeする。




```
sudo vim /etc/modules

# For Infiniband
mlx4_ib
rdma_ucm
ib_umad
ib_uverbs
ib_ipoib


modprobe
```


さて、2クラスタ用意し、IBスイッチで繋ぎます。
そして、ibpingを使って疎通テストを行います。


###ping待機側

```
tumoi@kaby:~$ ibstat
CA 'mlx4_0'
        CA type: MT26428
        Number of ports: 2
        Firmware version: 2.9.1000
        Hardware version: a0
        Node GUID: ＊＊＊＊＊＊
        System image GUID: ＊＊＊＊＊＊
        Port 1:
                State: Down
                Physical state: Polling
                Rate: 10
                Base lid: 0
                LMC: 0
                SM lid: 0
                Capability mask: ＊＊＊＊＊＊
                Port GUID: ＊＊＊＊＊＊
                Link layer: InfiniBand
        Port 2:
                State: Active
                Physical state: LinkUp
                Rate: 40
                Base lid: 3
                LMC: 0
                SM lid: 1
                Capability mask: ＊＊＊＊＊＊
                Port GUID: ＊＊＊＊＊＊
                Link layer: ＊＊＊＊＊＊
tumoi@kaby:~$ sudo ibping -S
```

###ping送信側

```
tumoi@zenzen:~$ sudo ibping 3
Pong from kaby.(none) (Lid 3): time 0.160 ms
Pong from kaby.(none) (Lid 3): time 0.156 ms
Pong from kaby.(none) (Lid 3): time 0.158 ms
Pong from kaby.(none) (Lid 3): time 0.158 ms
^C
--- kaby.(none) (Lid 3) ibping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3772 ms
rtt min/avg/max = 0.156/0.158/0.160 ms
```

はい、無事疎通しました。

[参考](http://d.hatena.ne.jp/oraccha/20130410/1365559619)
[CSS] ボックスをわかりやすく

## CSSは要素のボックスに対してスタイルを適用する

こんなHTMLに

```html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div class="wrapper">
    <div class="header">
        <p>ヘッダー</p>
    </div>
    <div class="sidebar">
        <ul>
            <li>メニュー1</li>
            <li>メニュー2</li>
            <li>メニュー3</li>
            <li>メニュー4</li>
        </ul>
    </div>
    <div class="content">
        <p>本文</p>
    </div>
    <div class="footer">
        <p>フッター</p>
    </div>
</div>
</body>
</html>
```

下記のCSSを適用する。

```css
* { outline: 1px solid #FF0000; }
```

ボックスが視覚的にわかる。
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/170232/77841f34-b2b9-c0b5-c044-81e56bfc5539.png)
Cognos レポートのヘッダー部分をお手軽に消す方法

##概要
Cognos BIでレポートを実行すると、こんな感じに黒帯のヘッダーがデフォルトで表示されます。
system.xmlという構成ファイルをいじる事で、全レポート共通でこのヘッダーを削除する事はできますが、もっとお手軽にレポート単位でヘッダー削除する方法をご紹介します。
![001.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/b5542e13-9192-c403-ae08-a6f64bd7840d.png)

##内容
まあ、本当に簡単な実装なので、たいしたものではないのですが、レポートの一番下にHTML Itemを置きます。
![002.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/1a16d962-683a-2393-3a12-b813b55f6a20.png)

HTML Itemの中身はこれだけです。

```html
<style>
.topRow
{
display:none;
}
</style>
```

レポートを実行すると、こんな感じにあっさり消えてます。

![003.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/8ff2d7e1-69b1-d3ce-1cd2-0a652dda1f25.png)

お手軽にレポート単位で設定できるところがポイントです。

自分で勝手にレポート作っているような環境で、他のレポートに影響することなく、自分好みのヘッダーのレポート作りたい時に便利かと思います。
RでAzureのリソース名の切り取り方

AzureでのリソースAPIで取得したリソースのインスタンス名は、以下のようなパス形式になっていることがあります。

```
/subscriptions/**********************************/resourceGroups/***********/providers/Microsoft.Web/***********/SampleResource
```
サブスクリプション→リソースグループ名→サービス名→インスタンス名
というような構造になっていますが、省略したいときがあります。

正規表現で最後のインスタンス名のみ取得しようと思いましたが、
basename()を利用すれば簡単に取得できることに気づきました。

Rってそういうことが多い
RubyonRailsでUserAgent判定をするGem【browser】の使い方

# 記事を書いた目的
モダンブラウザの判定をする必要があり、ネット上を探したが内容にマッチする記事がなかった。
**条件は、モダンブラウザのシャットダウンとBotの追加。**

# 使用するGem
2017/06/22時点で最新版を入れ、バージョンを固定するため以下を指定しました。
GitHub : [fnando/browser](https://github.com/fnando/browser)

```rb:Gemfile
gem 'browser', '~> 2.4'
```

# コントローラー
私の場合、HomeControllerで使用しているので、以下のように記載

```rb:home_controller
class HomeController < ApplicationController
  def index
    # モダンブラウザの場合エラー画面を表示する。
    browser = Browser.new( request.env['HTTP_USER_AGENT'] )
    unless browser.modern? || browser.bot?
      render layout: 'modern_browser_error'
    end
  end
end
```

#終わりに
意外と、Gemを使用せず実装している例を見かけた。
Gemで手軽実装できるのは、RubyonRailsの良いところでもあるのでちょぅ書は伸ばしていきたいところ。

##Tips
Gemの検索には、[RubyGems.org](https://rubygems.org/search)が便利
Lua版 ゼロから作るDeep Learning その5.5［pklファイルをLua Torchで使えるようにする］


過去記事
--
[Lua版 ゼロから作るDeep Learning その１[パーセプトロンの実装]](http://qiita.com/Kazuki-Nakamae/items/16c82b5ac8a85d4adee3)
[Lua版 ゼロから作るDeep Learning その２［活性化関数］](http://qiita.com/Kazuki-Nakamae/items/5199447a54642620139a)
[Lua版 ゼロから作るDeep Learning その３［３層ニューラルネットワークの実装］](http://qiita.com/Kazuki-Nakamae/items/57c2977d0a9a38bdf6b8)
[Lua版 ゼロから作るDeep Learning その４［ソフトマックス関数の実装］]
(http://qiita.com/Kazuki-Nakamae/items/20e53a02a8b759583d31)
[Lua版 ゼロから作るDeep Learning その5［MNIST画像の表示］](http://qiita.com/Kazuki-Nakamae/items/6373443510f94a67e910)


はじめに
--

　今回は本筋とは関係がないですが、pkl ファイルに格納されたデータをLua で使えるようにするやり方をご紹介します。
　
STEP1 : pkl ファイルをnpz ファイルに変換する
--
　以下のスクリプトで行うことができます。

```python:pkl2npz.py
#!/usr/local/bin/python3
# coding: utf-8

"""
pklファイルの内容をnpzファイルへ出力する。
"""
__author__ = "Kazuki Nakamae <kazukinakamae@gmail.com>"
__version__ = "0.00"
__date__ = "22 Jun 2017"

import sys
import numpy as np
import pickle

def pkl2npz(infn, outfn):
    """
    @function   pkl2npz();
    pklファイルの内容をnpzファイルへ出力する。
    @param  {string} infn :   入力ファイル名
    @param  {string} outfn :   出力ファイル名
    """

    with open(infn, 'rb') as f:
            ndarr = pickle.load(f)
            np.savez(outfn, W1=ndarr['W1'],W2=ndarr['W2'],W3=ndarr['W3'],b1=ndarr['b1'],b2=ndarr['b2'],b3=ndarr['b3'])

if __name__ == '__main__':
    argvs = sys.argv
    argc = len(argvs)

    if (argc != 3):   # Checking input
        print("USAGE : python3 pkl2npz.py <INPUT_PKLFILE> <OUTPUT_NPZFILE>")
        quit()

    pkl2npz(str(argvs[1]),str(argvs[2]))
quit()
```

```bash:pkl2npz.pyの実行
$ python3 pkl2npz.py sample_weight.pkl sample_weight.npz
```
　
　一つ注意点ですが、要素に関してはあらかじめ把握しとかなくてはなりません。今回の場合は３層NN の重み(W1, W2, W3) とバイアス(b1, b2, b3) を格納したpkl ファイルとなります。
　
STEP2 : npz ファイルを読み込む
--

　では作成した sample_weight.npz をLua 上で読み込みましょう。何も手間はかかりません。以下の方がそのためのパッケージ（npy4th）を作成してくれています。
[htwaijry/npy4th](https://github.com/htwaijry/npy4th)

```bash:npy4thのインストール
$ git clone https://github.com/htwaijry/npy4th.git
$ cd npy4th
$ luarocks make
```

　使い方は簡単でloadnpz([ファイル名])を入れるだけで読み込めます。

```bash:loadnpz()の使い方
npy4th = require 'npy4th'

-- read a .npz file into a table
tbl = npy4th.loadnpz('sample_weight.npz')

print(tbl["W1"])
```

```bash:出力結果
Columns 1 to 6
-7.4125e-03 -7.9044e-03 -1.3075e-02  1.8526e-02 -1.5346e-03 -8.7649e-03
-1.0297e-02 -1.6167e-02 -1.2284e-02 -1.7926e-02  3.3988e-03 -7.0708e-02
-1.3092e-02 -2.4475e-03 -1.7722e-02 -2.4240e-02 -2.2041e-02 -5.0149e-03
-1.0008e-02  1.9586e-02 -5.6170e-03  3.8307e-02 -5.2507e-02 -2.3568e-02
（略）
 1.1210e-02  1.0272e-02
-1.2299e-02  2.4070e-02
 7.4309e-03 -4.0211e-02
[torch.FloatTensor of size 784x50]

```

　ちゃんとTensor 型に変換されていますね。今回は紹介しませんでしたが、npy ファイルでも同じような読み込みが可能となっています。
　しかし読み込みはしてくれますが、そのまま使えるmatrix の形になっているかは保証されないのに注意してください。どんな形かはnumpy 側でどんな形式だったかによります。必要とあらばresize() などで整形する作業がこのあと必要になってくるでしょう。
　
おわりに
--

　日本では人気のないTorch ですが、このようにnumpy の資源が使えると利用しやすいのではないかと思います。
　以上です。ありがとうございました。
【Java】【jackson】JSONをパースする際に末尾カンマ（ケツカンマ・trailing comma）に対応する。

JavaでJSONをパースする場合、[jackson](https://github.com/FasterXML/jackson)というライブラリが良く使われるかなっと勝手に思っています。
（なんでJavaにJSONを扱う標準ライブラリが無いんだ！？EE8のみ対応とか無くね？という愚痴はおいておいて）

このjacksonを使って、いわゆる「ケツカンマ」「末尾カンマ」とかいわれている書き方をしたJSONをparse出来るようにする方法について書きます。

# 正式リリースではないようです。

まず現時点(2017/6/22)でのjacksonの正式リリースは2.8系で、2.8系では末尾カンマには対応できないようです。
[ALLOW_MISSING_VALUES](https://github.com/FasterXML/jackson-core/wiki/JsonParser-Features)というOptionで惜しいところまでできるようですが、いわゆる末尾カンマの対応とは言えません。

# 末尾カンマ（ケツカンマ・trailing comma）
ES5や、最近のJava（いつからか忘れた）では末尾カンマを無視するようになりましたね。

```js:js
let obj = {
        key1: 1,
        key2: 2,
    };
let arr = [
        1,
        2,
    ];
```

```java:Java
String[] ss = new String[] {
        "a",
        "b",
    };
//・・・
enum KIND {
    A,
    B,
}
```

みたいな記述ができます。

（JSONの正式でどうなってるかはちゃんと調べていませんが）

通常のjacksonでのJSONパースで末尾カンマがあるとシンタックスエラーになりますが、
実はOptionとかで対応出来るんじゃないかと調べてみました。

# jacksonの対応
下記のissueを見ると対応するようですね。

[Add `JsonParser.ALLOW_TRAILING_COMMA` to work for Arrays and Objects](https://github.com/FasterXML/jackson-core/issues/323)

ただ正式対応はまだな様子で、2.9.0.pr系を使うことで実現できるようです。

mavenならば、以下のように記述します。

```xml:pom.xml
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.9.0.pr4</version>
</dependency>
```

2.9.0系を使ったうえで、以下のようにObjectMapperのALLOW_TRAILING_COMMAという設定をすることで対応できるようです。

```java
ObjectMapper mapper = new ObjectMapper().configure(JsonParser.Feature.ALLOW_TRAILING_COMMA, true);
Object obj = mapper.readValue(json, Object.class);
```


---

# ケツカンマでググってもあまり出てこない。     

個人的に「ケツカンマ」って呼んでたのですが、ググってもあまり出てこないですね。
日本語的には「末尾カンマ」なのでしょうか？ただ「jackson 末尾カンマ」でググってもこの対応方法は簡単に出てきませんでした。
最終的に「jackson trailing comma」でググったら出てきました。

「ケツカンマ」を調べるときは「trailing comma」でググること！というのが今回の個人的な教訓です。
Python3のシンタックスチェック

## はじめに

Python3 で、Perl の　`-c` オプションのように文法チェックだけしたいとき[こういった方法](https://zafiel.wingall.com/archives/8308)があるとのことなので、それをちょっとラップしたスクリプトをつくろう。

## スクリプト

```pl:$HOME/bin/pyck
#!/usr/bin/env perl

use strict;
use warnings;

&main;exit;

sub main {
	my $file = shift @ARGV;
	&USAGE unless $file && -r $file && `/usr/bin/file ${file}`=~/Python/;

	print `/usr/bin/env python3 -m py_compile ${file}`;

	if( $? == 0 ) {
		print $file . " syntax OK\n";
	}
	else {
		print $file . " had compilation errors.\n";
	}
}

sub USAGE {
	(my $name = $0) =~ s@.*/@@;

	print <<"HERE";
NAME
	${name} -- python3 syntax check

USAGE
	${name} file

HERE

	exit;
}
```

```bash:~/.bash_profile
export PATH=$PATH:$HOME/bin
```

```bash:設定
$ chmod +x ~/bin/pyck
$ . .bash_profile
```

## 使い方

```bash:第一引数にpythonスクリプトを与えてね
$ pyck temp.pl
NAME
	pyck -- python3 syntax check

USAGE
	pyck file

```

```bash:エラーがある場合
$ pyck ng.py
  File "ng.py", line 4
    🍣 = 'スシ'
    ^
SyntaxError: invalid character in identifier

ng.py had compilation errors.
```

```bash:問題ない場合
$ pyck ok.py
ok.py syntax OK
```

## おわり

おわり:whale2:

##　環境

```bash
## Mac
$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.12.5
BuildVersion:	16F73


## Python3
$ python3 --version
Python 3.6.1


## Perl5
$ perl -v | perl -nwle'print if/version/'
This is perl 5, version 12, subversion 1 (v5.12.1) built for darwin-thread-multi-2level
```

## 参考と注釈

* [Pythonスクリプト実行前に文法をチェックするお手軽な方法 - Zafiel](https://zafiel.wingall.com/archives/8308)
* [32.10. py_compile — Python ソースファイルのコンパイル](https://docs.python.jp/3/library/py_compile.html)
OpenCOBOLをUbuntu16.02TLSにインストールしてみた

#インストール
##とりあえずいつもの暗号文
`sudo apt-get install open-cobol`
![Screenshot from 2017-06-22 00-19-29.png](https://qiita-image-store.s3.amazonaws.com/0/156607/540af388-48da-64f1-3c35-28352ecf6159.png)
![Screenshot from 2017-06-22 00-21-09.png](https://qiita-image-store.s3.amazonaws.com/0/156607/4def84d7-bb9c-8f94-c64b-256a71d708d2.png)
いつもどおり。Windowsの知識しかなくてもなんとかなる。大正義現代。
現在ではOpenCOBOLではなく、GnuCOBOLと呼ばれているらしい。時代の流れとは残酷なものである。
とりあえずインストールに成功したのかどうかを確認するためにバージョンを確認。
`cobc --version`
![Screenshot from 2017-06-22 00-24-12.png](https://qiita-image-store.s3.amazonaws.com/0/156607/07dfa8d6-91fd-a7bf-17a7-267c584d78eb.png)

以上。バージョンも確認が取れたのでとりあえずこれでインストールは終わり。まだCOBOLには手を出してないのでコンパイルの仕方とかは追々覚える。とりあえず環境構築う部分だけ触れるところから始めてみようかなと思った次第。
Atlas-SoC pin 探検

試しに Linux(HPS/ARM) からオンボード NIC として見えている Ethernet RJ-45 の口を追いかけてみる。

まず terasic の[サイト](http://www.terasic.com.tw/cgi-bin/page/archive.pl?Language=English&CategoryNo=163&No=941&PartNo=4) の "Atlas-SoC User Manual" によると Gigabit Ethernet の端子がある。これは Micrel KSZ9031RN のコントローラを経由している。コントローラは RJ-45 端子から RGMII の信号に変換している。RGMII の信号は FPGA 側の Pin では `PIN_A12` などを使って受け取っていると記載されている。ここまでは半田付けされて決まっている。

<img width="535" alt="terrasic.png" src="https://qiita-image-store.s3.amazonaws.com/0/41883/87dad37b-d1ee-5964-6f7f-3253549b90c9.png">

次に Intel/Altera の[サイト](https://www.altera.co.jp/support/literature/lit-dp.html)で FPGA デバイス用ピンアウトファイルを眺める。Atlas-SoC は `5CSEMA4U23C6N` を使っているので、`5CSEMA4` のファイルが目的のファイルになる。先ほど見た `PIN_A12` は `A12` で探して、Bank Number `7B` のピンだと見つかる。ちなみに `A12` は A 行 12 列という物理的なピンの位置をあらわしている。このピンは `NAND_DQ4`, `RGMII1_TX_CTL`, `USB1_D5`, `HPS_GPIO23` といった用途に使えるようになっていると書かれている。multiplexer で実行時に選べるようにしているようだ。ここで見るべきは `RGMII1` を使いたいというところ。

QSYS で `system_soc` の `hps_0` の編集画面を開くと、Block Diagram の横に FPGA Interfaces, Peripheral Pins, HPS Clocks, SDRM とタブが並んでいる。Peripheral Pins が目的のタブ。EMAC1 pin が `RGMII1` と対応する。GHRD Makefile 的には `scripts/create_ghrd_qsys_ATLAS_SOC_GHRD.tcl` で `set_instance_parameter_value hps_0 {EMAC1_PinMuxing} {HPS I/O Set 0}` とされている部分が対応する。こうしておくと、QSYS は `PIN_A12` を `EMAC1` に使うように計画する、ということのようだ。

<img width="333" alt="qsys.png" src="https://qiita-image-store.s3.amazonaws.com/0/41883/0b10200d-8766-86e1-290a-9e5e11695101.png">

ちなみに、ピンアウトファイルの代わりに、QSYS から soc_system のピン配置を Pin Planner で眺めてみても、`A12` がどこにあるのか直感的でわかりやすい。

<img width="670" alt="pin.png" src="https://qiita-image-store.s3.amazonaws.com/0/41883/9e5a5e10-3f34-5238-d75d-402384f9ef09.png">

GHRD をコンパイルすると device tree file が生成される。DTS ファイルの中身には `hps_0_gmac1` というエントリができていて、`reg` アドレスは `0xff702000` だそうだ。`compatible` には `synopsys,dwmac-15.1`, `altr,socfpga-stmmac`, `snps,dwmac-3.70a`, `snps,dwmac` と書かれている。

Linux kernel source tree によると、`drivers/net/ethernet/stmicro/stmmac/dwmac-socfpga.c` が `altr,socfpga-stmmac` を識別するようだ。つまり `stmmac` kernel module によって netdev が構成される。
OS Sierra(10.12.5)にOpenCV3とChainerをインストールする方法

自分用の備忘録的な書き込みです。
単体でもインストール可能なはず・・・。
# 目次
・前提
・pyenvをインストール
・pythonをインストール
・OpenCV3をインストール
・numpyをインストール
・OpenCV３の動作確認
・Chainerをインストール
・Chainerのサンプルプログラムを実行

# 前提
・OSはタイトル通りSierra（10.12.5）
・homebrewはインストール済み

# Pyenvをインストール
`$ brew install pyenv`
これでPyenvのインストールが完了。

# Pythonをインストール
今回はPython３.6をインストールします。
なので
`$ pyenv install 3.6.0`
を実行。
忘れないうちにPythonのバージョンを3.6.0に変更しましょう。
`$ pyenv global 3.6.0`
これで　PythonはOK。

# OpenCV3をインストール
これは簡単に行きます。
`$ pip install opencv-python`
ちなみに、
`$ brew install opencv3`
だとインストールはできるのですが、後の動作確認で詰まりました。pipでやるのをお勧めします。

# numpyをインストール
`$ pip3 install numpy`

# OpenCV３の動作確認
Pythonを起動して確認です。
`>>>import cv2`
 `>>>cv2.__version__`
 `'3.2.0'`
こうなれば問題ありません。ならなければ・・・頑張ってください。

# Chainerをインストール
`$ pip install chainer`
はい、出来た。

# Chainerのサンプルプログラムを実行
サンプルプログラムはMNISTを使います。
まずはChainerのリポジトリをgit clone（ダウンロード）します。
`$ git clone https://github.com/pfnet/chainer.git`
そしたらサンプルを実行。
`$ python chainer/examples/mnist/train_mnist.py`
正く実行できました？
出来たなら終わりです、お疲れ様でした。
それでは、画像認識と機械学習を楽しんで！
coincheckのPrivate APIをHaskellから叩いてみる

[coincheck の Private API](https://coincheck.com/ja/documents/exchange/api#private) を叩くには Header に認証情報を入れる必要があります。 Haskellで利用する際の例がなかったのでドキュメントを頼りに実装しました。

認証に関する仕様は[こちら](https://coincheck.com/ja/documents/exchange/api#auth)。Headerに含めるべき情報は`ACCESS-KEY`と`ACCESS-NONCE`と`ACCESS-SIGNATURE`で前二つは発行されたものをそのまま使うものと自前で勝手に用意するもので楽に実装できます。手間なのは`ACCESS-SIGNATURE`で仕様では

> ACCESS-NONCE, リクエスト先URL, リクエストのボディ を全て文字列にし連結したものを、HMAC-SHA256 hash形式でシークレットキーを使って署名した結果

とあります。要はHMAC-SHA256でハッシュ化できればいいので[cryptohash-sha256](https://www.stackage.org/lts-8.19/package/cryptohash-sha256-0.11.100.1)を使えば良さそうでしょう。あとExampleを見ているとhexでエンコードする必要がありそうなので[base16-bytestring](https://www.stackage.org/lts-8.19/package/base16-bytestring-0.1.1.6)を使ってエンコードします。

出来上がったコードはこちら

```haskell
{-# LANGUAGE OverloadedStrings #-}

module Main where

import Control.Lens ((&), (.~), (^.))
import Crypto.Hash.SHA256 (hmac)
import Data.ByteString (ByteString)
import qualified Data.ByteString.Base16 as Base16
import qualified Data.ByteString.Char8 as BS
import Data.Monoid ((<>))
import Data.Time.Clock.POSIX (getPOSIXTime)
import qualified Network.Wreq as Wreq

accessKey :: ByteString
accessKey = ...

secretAccessKey :: ByteString
secretAccessKey = ...

createAccessSignature :: ByteString       -- ACCESS-NONCE
                      -> ByteString       -- リクエスト先URL
                      -> Maybe ByteString -- リクエストのボディ
                      -> ByteString       -- ACCESS-SIGNATURE
createAccessSignature accessNonce url body =
  Base16.encode $ hmac secretAccessKey (accessNonce <> url <> maybe "" id body)

main :: IO ()
main = do
  unixtime <- getPOSIXTime
  let accessNonce = BS.pack . show . round $ unixtime  -- Nonceとしてエポック秒を利用
      url = "https://coincheck.com/api/accounts/balance"
      opts = Wreq.defaults &
        Wreq.headers .~ [ ("ACCESS-KEY", accessKey)
                        , ("ACCESS-NONCE", accessNonce)
                        , ("ACCESS-SIGNATURE", createAccessSignature accessNonce (BS.pack url) Nothing)
                        ]

  r <- Wreq.getWith opts url
  print (r ^. Wreq.responseBody)
```

HTTPクライアントには[wreq](https://www.stackage.org/lts-8.19/package/wreq-0.5.0.1)を使用しています。実際に動かしてみましょう

```bash
$ stack build && stack exec app
"{\"success\":true,\"jpy\":\"0\",\"btc\":\"0\",\"usd\":\"0\",\"cny\":...
```

うまく動いているようですね！
iPad 12.9 インチで家じゅうのMacを操る

# 家じゅうのMacをこれ一台で

iPad 12.9 インチを購入しました。最高です!
<img width="300" alt="IMG_0149.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/98954/0051a9ba-c2ce-9822-75f8-7fdd24484910.jpeg">
デカい。きれい。見やすい。



Smart Keyboard も非常に便利。直接iPadと繋がるので、充電いらず、ネットワーク設定もBluetooth設定もいりません。最高です

<img width="300" alt="IMG_0149.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/98954/fa1c1679-404d-6bdf-5c75-c05d5794dda4.jpeg">
この三つ穴同士が磁石でくっつきます。



こうなってくると、居間でくつろぎながら仕事がしたくなってくるわけで。

「画面共有」のできるアプリを利用して、iPadからMacに接続して動かします

ここでは、iPadとMacが同じWiFiネットワークに接続していることを前提とします。



# VNC Viewer

1. iPadでアプリ [VNC Viewer](https://appsto.re/jp/Cr2-u.i) をダウンロードします
2. 接続したいMacで「画面共有」を有効化します
  1. 「環境設定」→「共有」を選択
<img width="400" alt="IMG_0149.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/98954/154ca383-cc59-799f-9e5c-9f02198aa503.jpeg">
  2. 「画面共有」のチェックを入れます
  3. 「コンピュータ設定」をクリック
  4. 「VNC使用者が画面を操作することを許可」し、パスワードを設定します
<img width="400" alt="IMG_0149.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/98954/e9ee95b5-521a-ea75-4d40-63aa684e2388.jpeg">

3. 接続したいMacのIPアドレスを確認します
  1. 「環境設定」→「ネットワーク」を選択
  2. WiFiに接続していることを確認します
  3. IPアドレスを確認します（右の文章内マウスカーソルのあたりに書いてあります）
<img width="400" alt="IMG_0149.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/98954/43647afa-058b-09a9-26a4-ca7e15759f19.jpeg">


4. iPadに戻り、VNC Viewer アプリを起動します
  1. 右上の「＋」をクリック
  2. 先ほど確認したMacのIPアドレスを入力。名前は自分でわかりやすいものを自由につけられます
  <img width="400" alt="IMG_0149.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/98954/96e77e0c-3bd5-99a0-f519-7233819764a4.png">
  3. 入力したら「Save」し、「Connect」する
  4. パスワードを聞かれるので、先ほど画面共有用に設定したパスワードを入力します
  <img width="400" alt="IMG_0149.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/98954/20f28cec-5dc1-a85c-31ab-457f3a4faf09.png">
  5. 暗号化されていないが大丈夫か聞かれる場合があります。問題ないならそのままOKとして進みます
  6. これで、Macのログイン画面が出ました！
  <img width="400" alt="IMG_0149.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/98954/8f26dc30-c405-b805-c202-65ad6bb06936.jpeg">
  7. ログインして、自由にMacを操っちゃいましょう

5. 操作
  1. iPad上をスワイプすると、画面上のマウスカーソルが移動します。タップしたところにマウスカーソルが瞬間移動するわけではありません
  2. iPad上でタップすると、クリックです
  3. iPad上でダブルタップからスワイプすると、Macでのドラッグになります
  4. iPad上でピンチすると、Macの画面が拡大縮小できます
  5. キー入力すべき箇所では、キーボードが表示されます。また、画面上部のキーボードのアイコンをクリックすることでも表示できます。Smart Keyboardを接続している場合は、キーボードは画面上には表示されませんが、打てば入力されます。
  6. 特殊キー（Cmd, Escなど）は、画面下部に表示されるバーチャルキーをタップすれば使えます

対象のMacは、電源が入っていてネットワークに繋がってさえ入れば、スリープモードのままでも大丈夫です。便利！
もしできない場合は、以下の設定をしてみてください
![IMG_0019.JPG](https://qiita-image-store.s3.amazonaws.com/0/98954/d6eac44b-0285-aea6-fe2e-d88837b521b7.jpeg)
[rails]データをピックアップ！

Rails,rubyの配列やactiverecord:relationからのピックアップの仕方まとめ

# first

```rb
fruits = ["apple", "orange", "banana", "kiwi"]
p fruits.first    #->"apple"
p fruits.first(2) #->["apple", "orange"]
```

# limit（rails）

railsのメソッドですが、User.all.first 2だったらUser.limit 2にできます。

```rb
# ＜モデル.limit(最大取得行数)＞
User.limit(5)　# SELECT * FROM users LIMIT 5
```

# shuffle,shuffle!

配列をランダムに入れ替えます。shuffle!で破壊的メソッドになります。

```rb
fruits = ["apple", "orange", "banana", "kiwi"]
p fruits.shuffle #-> ["banana", "kiwi", "apple", "orange"]
```

# sample(choice)

sampleは配列をランダムにピックアップしてきてくれます。
choiceメソッドはRuby 1.8.7に追加されましたが、Ruby 1.9ではsampleメソッドに変わりました。

```rb
animals = ["dog", "cat", "mouse", "rabbit", "horse"]
puts animals.sample #-> cat
p animals.sample(2) #-> ["horse", "mouse"]
```
グレゴリウス暦日付を修正ユリウス日から求める

こんにちは。
[jdcal](http://github.com/phn/jdcal) [^1]（グレゴリウス暦日付 (year, month, day) を修正ユリウス日（MJD）から求める変換計算） というものを見つけたので検算して正しいことを確認しました。

確認は、「[ユリウス通日](https://ja.wikipedia.org/wiki/ユリウス通日)」 (Wikipedia) の計算式（→「[ユリウス日とグレゴリウス暦日付との間の換算](http://qiita.com/kkdd/items/2f045ee9aa3a76921cc7)」の mjd2date() ）の結果と一致をみました。

[^1]: しかし、この [jdcal](https://github.com/phn/jdcal/blob/master/jdcal.py)（の jd2gcal）が行っている計算式は、他と比較すると出来栄えがあまり優れていません。

```console
$ pip install jdcal
$ ./test_jdcal.py
 passed
```

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

from __future__ import print_function
from jdcal import jd2gcal

def test():
    for mjd in range(146097):
        w = {jd2gcal: jd2gcal(2400000.5, mjd)[:3], mjd2date: mjd2date(mjd)}
        if w['jd2gcal']!=w['mjd2date']:
            print(w['jd2gcal'], "!=", w['mjd2date'])
            return
    print(' passed')

# conversion from modified Julian date to Gregorian calendar date 
def mjd2date(mjd):
    n = mjd + 678881  # Gregorian
    a = 4*n + 3
    a += 4*((3*((4*(n+1))//146097+1))//4)  # Gregorian
    b = 5*((a%1461)//4) + 2
    year, month, day = a//1461, b//153 + 3, (b%153)//5 + 1
    if month > 12:
        year, month = year+1, month%12
    return year, month, day

test()
exit(0)
```
webpack+laravel+Typescriptでエラー

#エラー
```
ERROR in [at-loader] ./vendor/symfony/translation/Tests/fixtures/resources.ts:1:2
    TS1110: Type expected.
```
webpackでtypescriptビルドしたらエラー
どうやらsymfonyがひっかかっているよう。そんなとこのts見に行かなくていいのに。
#tsconfig.jsで対象外にする
下記excludeを追記して解消

```tsconfig.js
{
  "compilerOptions": {
    ...
  },
  "exclude": [
    "node_modules",
    "vendor"
  ],
}
```
参考
https://github.com/symfony/symfony/issues/19293
仮想マシンとAndroid実機によるReact Native入門というか触りだけ

少しひねくれた環境だけど、仮想マシンと実機による React Native の動作について

## TL;DR
* React Nativeの勉強を始めるための準備
* 手元がWindows環境だったが、気分的にLinuxが使いたかったので仮想マシンで動かした
* 初期動作だけ確認したので、似た様なことをしたい人の参考になれば僥倖

## まず環境と下準備について

* Windows10(ホストマシン)
    - 仮想化は VirtualBox を使用
    - メモリは 16G 程度。ゲストには 8G 貸す感じ
* Xubuntu(ゲストマシン)
    - 環境を整えるのに少し時間が掛かるので前もって済ませておく  
        - Android Studio をインストールしておく
        - npm で react-native-cli をグローバルにインストールしておく
        - ついでに yarn もインストールしておく
    - :imp: debian の仮想マシンを用意した時は同じ手順で失敗した

## 手順

順番はある程度前後しても大丈夫かもしれないが、アプリを動かす前に済ませておくように

1. `react-native init [プロジェクト名]` でプロジェクトを作成する
    - プロジェクト名でディレクトリが出来るので事前に別途掘らなくても良い
    - :bulb:ホストマシンとの共有ディレクトリで作業すると不具合が出る可能性アリ。  
      共有ディレクトリではないゲストマシンの中で作業するべし
    - **成功するとプロジェクト名のディレクトリの中にごちゃっとファイルが出来る**  
      - ios(XCode用のプロジェクト) や android(Android Studio用のプロジェクト) のディレクトリがあるのを確認
2. Android実機を接続する
    - Virtual Box(仮想マシンのウィンドウ) の右下のUSBアイコンから実機にチェックを入れておく
    - 今回は手持ちの Nexus 6
    - ![screen_01.png](https://qiita-image-store.s3.amazonaws.com/0/19986/525a26c7-465d-1dab-318b-1e538af4d302.png)  

    

3. 先ほど出来たプロジェクトの android ディレクトリをAndroid Studioで開く
    - GradleやらBuild Toolやらが古いと怒られた場合は、どんどんアップデートする
4. コマンドラインで `adb reverse tcp:8081 tcp:8081` を実行
    - これをしておくと react-native から実機が見えるようになる模様
    - :imp: debian の仮想マシンで試した際には `reverse が無い` といった旨のマニュアルが表示されたが、  
      Xubuntu では出なかった
    - 実行しても何も出力されずにサクッとコマンドが終わる
    - ![screen_02.png](https://qiita-image-store.s3.amazonaws.com/0/19986/408b6d58-9e05-901a-0dc9-be1752f88d26.png)
5. `react-native start` を実行
    - :bulb: **Android Studioでアプリを起動させる前に実行する**
    - この画面はそのまま動かした状態にしておく
    - この後の動作で実機にエラー画面が出るようならもう一度 手順4. を実行してみたりすると動くかも
        - その際、実機のケーブル接続は外さずにそのまま作業する
    - ![screen_03.png](https://qiita-image-store.s3.amazonaws.com/0/19986/607d9039-50f7-86a2-cd6f-03d14cefb2c3.png)

6. Android Studio からアプリを起動
    - 上手くいくとアプリが起動した後、画面が見えるハズ

## まとめ

* `adb reverse tcp:8081 tcp:8081` で実機が見えるようにする
* `react-native start` を動かした状態にしておく
* Android Studio からアプリを起動
英語でKotlinを勉強するためのリソース

Android DevelopersのKotlinのページにはResources to Learn Kotlinというページがあります。

- [https://developer.android.com/kotlin/resources.html](https://developer.android.com/kotlin/resources.html)

このページにはタイトル通りKotlinを学ぶためのリソースのリストが載っていて、以下のカテゴリに別れています。

- Documentation
- Videos
- Books
- Social channels

各カテゴリで紹介されているリソースは以下のようになっています。

# Documentation

##### [Kotlinlang.org](https://kotlinlang.org/)
  Kotlinの公式サイトです。 [基本的なシンタックス](https://kotlinlang.org/docs/reference/basic-syntax.html)から[Kotlin standard libraryのリファレンス](https://kotlinlang.org/api/latest/jvm/stdlib/index.html)までこのサイトで確認できます。  

##### [Kotlin Koans Online](https://try.kotlinlang.org/)
  Kotlinの学習を助けてくれる問題集です。ブラウザ上で実際にコードを実行しながら学べます。Koansの意味を知りたい。


# Videos

##### [YouTube](https://www.youtube.com/results?search_query=Kotlin+on+Android)

"Kotlin on Android"で検索するとKotlinとAndroidに関する様々なビデオを探すことができます。無料で多くのビデオを見れるのが良いですね。

##### [O'Reilly course](http://shop.oreilly.com/product/0636920052982.do) 
  JetBrainsのHadi Haririさんによる"Introduction to Kotlin Programming,"という講座がO'Reillyから公開されています。8時間ほどで学べるようです。有料となっていて、講座単体で購入するか[Safari Books Online](https://www.safaribooksonline.com/)を契約する必要があります(10日間のフリートライアル有り)。


##### [Treehouse course](https://teamtreehouse.com/library/kotlin-for-java-developers)
  "Kotlin for Java Developers"Androidに重点置いてKotlinを学べる講座で、オンライン学習サイト[treehouse](https://teamtreehouse.com/)が提供しています。こちらも有料となっていて、フリートライアは7日間です。

##### [Udemy course](https://www.udemy.com/kotlin-course/)
  Udemyが提供している講座、"Kotlin for Beginners"では、Kotlinをゼロから学べます。こちらも有料ですがUdemyは割引を良くやってるのでタイミングによっては安く購入できるはずです(この記事を書いている時点(2017/06/21)で84%オフの1,800円でした)。


Videosで紹介されているリソースは以上ですが、[Udacity](https://www.udacity.com/)にはGoogle公式のAndroid講座があるのでKotlinに対応したAndroid講座をGoogleが開いてくれないかと個人的に期待しています。

# Books

##### [Kotlin in Action](https://www.manning.com/books/kotlin-in-action)

  JetBrainsのDmitry JemerovさんとSvetlana Isakovaさんによって書かれてた本です。ManningのサイトからChapter6と11が無料で読めます。

##### [Kotlin for Android Developers](https://leanpub.com/kotlin-for-android-developers)

  [Antonio Leivaさん](https://antonioleiva.com/)によって書かれてた"Kotlin for Android Developers"はKotlinについて書かれた最初の本の1つと紹介されています。この本では、実際に天気予報アプリを開発しながらKotlinを学ぶことができ、APIリクエストとレスポンスのデータクラスへのマッピングとキャッシュ、SQLiteの操作、そしてテストコードの書き方まで紹介されています。購入して読みましたが、購入後2度更新があり、Android Studio 3.0対応やコルーチンに関する章の追加、クローズドなクラスをどうモックするか？といった内容が追加されています。

# Social channels

##### [@kotlin](https://twitter.com/kotlin)

Kotlinの公式Twitterアカウントです。

##### [Kotlin Community](https://kotlinlang.org/community/)

Kotlinに関するイベントやグループのリストです。[日本Kotlinユーザグループ](https://kotlin.connpass.com/)もリストに掲載されています。

##### [Kotlin Slack](http://slack.kotlinlang.org/)

KotlinユーザーのためのSlackチャンネルです。

##### [Talking Kotlin](http://talkingkotlin.com/)

隔月で配信されているpodcastです。Kotlinに関する話題をメインに扱っています。

# 参考

- https://developer.android.com/kotlin/index.html
- https://developer.android.com/kotlin/resources.html
ソケット通信とは何か？

# ソケットはどこの話か？
* OSI参照モデル
  * アプリケーション層: HTTP/telnet/DNS
  * セッション層: Socket => ここ
  * トランスポート層: TCP/UDP
  * ネットワーク層: IP
  * 物理層: Ethernet, HUB

# ソケットにも種類がある
# INETドメインソケット(TCPソケット)
* ネットワーク上でマシンを越えてのプロセス間通信

# UNIXドメインソケット
* 同じマシン上で動いているプロセス間で通信を行うためのソケット
* 自マシンのみ

# UNIXドメインソケットは何がいいのか？
* INETドメインソケットよりもはるかに早い

# UNIXドメインソケットの種類
* ファイルシステムパス(pathname)
  * 一般的な手法。bind(2)でファイルシステム上のパスを結びつける
  * ファイルを使用しているためパーミッションを調整する
  * サーバプロセスが終了する時はunlink(2)で名前を削除し、それが参照しているファイルも削除する
* netstat -al --protocol=unixで判断する
* /var/lib/mysql/mysql.sockのようなものがUNIXドメインソケット
Railsのカラムにaliasをかける

## Rubyの`alias`文化

言語によって同じ機能があってもこのように書くほうがよりその言語として適切とされるなど、特有の「文化」ができてきますが、Rubyでは「同じ役割のメソッドが別の名前で存在する」ことを肯定的に捉えるような文化があります。標準ライブラリでも、`Enumerable#map`と`#collect`、`Array#length`と`#size`のような「名前しか違わない」メソッドが多数あります。

そして、自分でそのようなメソッドを実装することも簡単にできるように、`alias`構文や`Module#alias_method`のような、別名を作る仕組みが存在しています。

## Railsのモデルに仕掛けたら…失敗

そして、Railsのモデルについても、。「似たようなモデルで列名を調整して、ダックタイピングでまとめて扱いたい」というような場合に、カラム名メソッドの`alias`をかけたくなります。ただ、素直にやってもうまく行きません。

```rb:失敗例
class Person < ActiveRecord::Base
  alias foo_name name
  # alias_methodで書いても結果は同じ
end
```

こう書いてしまうと、モデルクラスのロード時に`NoMethodError`となってしまいます。

### 何が起きた？

ActiveRecordのカラム名メソッドはテーブル定義から自動定義されますが、逆を返せば「メソッド定義のためにテーブルアクセスが必要となる」ということになります。そして、「起動時に一気にテーブル定義を取得するために詰まってしまう」という事態を避けるためもあってか、クラスロード時には即座に定義されず、メソッドの定義は必要となるまで遅延するようになっています。

ところが、`alias`はクラスロード時に処理されるので、その時点でメソッドがまだ存在しないため、エラーとなってしまいます。

## フルコースの`alias_attribute`

さすがはRails、こんな状況にも使えそうな`alias_attribute`というのを用意しています。

ただ、これで`alias_attribute :foo_name, :name`のようにエイリアスを行うと、`foo_name`だけでなく、`foo_name?`や`foo_name=`など、他のカラム名メソッドまですべてできあがってしまいます。「別名での参照だけしたい」というときには、少し大げさかもしれません（これが必要になる場面が少ないからか、情報も少ないです）。

### 原始的なところに落ち着く

最終的には、

```rb
def foo_name
  name
end
```

と、単なるメソッドを立てる形で落ち着きました。`alias`と違って、`name`は呼んだ時点で動けば（`method_missing`の動作でも）いいので、メソッド定義そのものをコピーする`alias`とは質的に異なります。
戻り値がNullableなラムダ式(関数型リテラル。例: (num:Int)->Int? )がNullableであると示す方法

戻り値がNullableな関数型リテラルがNullableって、どう表現したらええねん。と。
`(num:Int)->Int??`とか書けないぞ、となった。

## 結論

関数型部分を`()?`で囲むと実現できる。


```kotlin
val returnNonNullOne: (num:Int)->Int = null                // invalid
val returnNonNullTwo: (num:Int)->Int = { num:Int -> num }  // valid
val returnNonNullThr: (num:Int)->Int = { num:Int -> null } // invalid

val returnNullableOne: (num:Int)->Int? = null                 // invalid
val returnNullableTwo: (num:Int)->Int? = { num:Int -> num }   // valid
val returnNullableThr: (num:Int)->Int? = { num:Int -> null }  // valid

val nullableReturnNullableOne: ((num:Int)->Int?)? = null                // valid
val nullableReturnNullableTwo: ((num:Int)->Int?)? = { num:Int -> num }  // valid
val nullableReturnNullableThr: ((num:Int)->Int?)? = { num:Int -> null } // valid
```
【第一回】Oracle DB 12c SQL基礎まとめ

# 1. データベースについて
- 様々なデータを一定の規則に従って格納し、利用できるようにした集合体
- 種類は多いが、人はだいたいデータベース(以下DB)と言うとリレーショナル型を指している。
- （今後もリレーショナル型を前提に話をする。）
    >リレーショナル型・・・データ間の関係を定義する。表に親子関係はなく、データの物理的な格納順序もない。Excelの表ぐらいに思っておけばよいのではないか。

- データは行（ROW）、列(COLUMN)で２次元的に表現された表（テーブル）で格納されている。
- 列には主キー、外部キー、NOT NULL、UNIQUE、CHECKの制約がかかっている。

|制約名|説明|NOT NULL / UNIQUE  |
|:---------|:----------|:----------|
|主キー（PRIMARY KEY）|表内の各行を一意に識別する|NOT NULL & UNIQUE|
|外部キー（FOREIGN KEY）|同じ表or他表の主キー(または一意キー)を参照する列|       |
|NOT NULL|NULL値を許可しない|NOT NULL|
|UNIQUE|重複を許可しない。NULLは重複許可|          |
|CHECK|上記以外の条件を自由に設定|          |


- リレーショナル型DBを管理するシステムをRDBMSといい、Oracle DBはその代表

# 2. SQLについて
- SQLはリレーショナル型を操作するための言語

|種類|代表的なコマンド| 
|:-------------|:--------------------------|
|DML（データ操作）|SELECT/INSERT/UPDATE/DELETE/MERGE|    
|DDL（データ定義）|CREATE/ALTER/DROP/RENAME/TRUNCATE/COMMENT|
|DCL（データ制御）|GRANT/REVOKE|
|トランザクション制御|COMMIT/ROLLBACK/SAVEPOINT|

今日は眠いのでまた後日。
Railsプロジェクトを作成するメモ

## 環境
* rbenv 1.1.0
* ruby 2.4.0

## プロジェクトの作成
```.sh
# ディレクトリを作成して移動
$ mkdir sample; cd $_

# Gemfileの作成
$ bundle init
Writing new Gemfile to /Users/your_name/sample/Gemfile
$ ls
Gemfile
$
```

Gemfileを編集してRailsをインストール

```.sh
$ vi Gemfile
```

編集前

```.sh
# frozen_string_literal: true
source "https://rubygems.org"

# gem "rails"
```

編集後 （ `# gem "rails"` の `# ` を削除）

```.sh
# frozen_string_literal: true
source "https://rubygems.org"

gem "rails"
```

```.sh
$ bundle install --path vendor/bundle --jobs=4
Fetching gem metadata from https://rubygems.org/..........
Fetching version metadata from https://rubygems.org/..
Fetching dependency metadata from https://rubygems.org/.
Resolving dependencies...
Installing i18n 0.8.1

# (略)

Installing rails 5.0.2
Bundle complete! 1 Gemfile dependency, 38 gems now installed.
Bundled gems are installed into ./vendor/bundle.
$ ls
Gemfile       Gemfile.lock  vendor/
```
プロジェクトの作成

```.sh 
$ bundle exec rails new -B -O --skip-turbolinks .
       exist
      create  README.md
      create  Rakefile
# （略）
$ ls -la
total 48
drwxr-xr-x  20 your_name  staff   680  4 24 11:31 ./
drwxr-xr-x  27 your_name  staff   918  4 24 10:52 ../
drwxr-xr-x   3 your_name  staff   102  4 24 11:18 .bundle/
-rw-r--r--   1 your_name  staff   468  4 24 11:30 .gitignore
drwxr-xr-x   7 your_name  staff   238  4 24 11:33 .idea/
-rw-r--r--   1 your_name  staff  1682  4 24 11:30 Gemfile
-rw-r--r--   1 your_name  staff  2702  4 24 11:19 Gemfile.lock
-rw-r--r--   1 your_name  staff   374  4 24 11:30 README.md
-rw-r--r--   1 your_name  staff   227  4 24 11:30 Rakefile
drwxr-xr-x  10 your_name  staff   340  4 24 11:30 app/
drwxr-xr-x   7 your_name  staff   238  4 24 11:30 bin/
drwxr-xr-x  13 your_name  staff   442  4 24 11:30 config/
-rw-r--r--   1 your_name  staff   130  4 24 11:30 config.ru
drwxr-xr-x   3 your_name  staff   102  4 24 11:30 db/
drwxr-xr-x   4 your_name  staff   136  4 24 11:30 lib/
drwxr-xr-x   3 your_name  staff   102  4 24 11:30 log/
drwxr-xr-x   9 your_name  staff   306  4 24 11:30 public/
drwxr-xr-x   9 your_name  staff   306  4 24 11:30 test/
drwxr-xr-x   4 your_name  staff   136  4 24 11:30 tmp/
drwxr-xr-x   4 your_name  staff   136  4 24 11:30 vendor/
$
```

今回の使用したオプションは、

* `-B` →  `bundle install`を実行しない
* `-O`  → DBを使用しない
* `--skip-turbolinks` → turbolinksを使用しない
* `.` APP_PATHには今いるディレクトリを指定して作成

その他のオプションについては `bundle exec rails new -h` で確認できます。

新規Railsプロジェクトの作成はこんな感じ

### コピペ用にコマンドだけ抜粋
```.sh
mkdir sample; cd $_
bundle init

vi Gemfile

bundle install --path vendor/bundle --jobs=4
bundle exec rails new -B -O --skip-turbolinks .
```
terminalでは上手く行くのに，PyCharmで実行するとライブラリが読み込まれない時の対応策

# python最強の開発環境であるPyCharm

今までに色々な環境でプログラミングをしてきましたが，JetBrains社に出会って以来，JetrBrains社のIDEの虜になっています．


特に数々の人が最高の評価をしているのがPyCharmです．

[最強のPython開発環境 PyCharmのすゝめ](http://qiita.com/pashango2/items/de342abc10722ed7a569)


# そんなPyCharmにも気をつけるべきことがPATHの設定

機械学習のフレームワークであるTensorflowを実行するためにPyCharmを使っていました．

全てのセットアップを終えサンプルコードを動かそうとしていた時，エラー発生．

## CUDA が認識されない


NVIDIAのGPUを用いてTensorflowを使用するときにCUDAをインストールします．

そのCUDAが無いというエラーが発生しました．


## LD_LIBRARY_PATHが上書きされる！？

色々調べてみるとPyCharm上では特定の環境変数の上書きが行われるようです．

CUDAのライブラリのPATHはLD_LIBARARY_PARHへ書き込まれるのです．

そのLD_LIBRARY_PATHが上書きされていました．

## Run -> Edit Configurationsをいじる！

 Run -> Edit Configurations -> Python -> [your project] -> Environment variables


にLD_LIBRARY_PATHを定義し，所望のパスを追加することで解決しました．

### 1:Run -> Edit Configurations
<img width="349" alt="Screen Shot 2017-06-21 at 22.38.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/116472/286df365-47ee-5eb4-0973-b3480c9cbf06.png">

### 2: Python -> [your project name] -> Environment variables 
<img width="1073" alt="Screen Shot 2017-06-21 at 22.38.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/116472/5c70d9ab-3626-054b-8fdc-b61ea137fefb.png">

### 3: Add Environment Variables
/add/path/here にPyCharmが認識すべきライブラリのPATHを書きます．
<img width="624" alt="Screen Shot 2017-06-21 at 22.36.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/116472/9fb0f559-afb2-db05-623a-e4c1f949d613.png">

# おわりに
以上です．
RailsのProductionでpublic配下のimageが404

本番の構築時にはまったのでメモしておく

DevelopmentやStagingでは表示されていたのに、本番環境ではimageが軒並み404で応答されていた。

`config/environments/production.rb`に下記を追加する
`config.public_file_server.enabled = true`

public配下の静的ファイルを取得するためにはこの設定が必要