OmniAICreator/Qiita-1.07M huggingface dataset:
JavascriptでスマートにObservableする 改2

# 前回
https://qiita.com/angeart/items/29979f67d7a511bbec0e

# まだスマートにできる
お前に足りないものは、それは！
情熱・思想・理念・頭脳・気品・優雅さ・勤勉さ！そしてなによりもォォォオオオオッ！！
**スマートさが足りない！！**

# 改善点
プロパティレベルでのイベントハンドラ分離を行った
jQuery依存削除

# 実装
```js
class Observable {
  constructor() {
  　this.event = {};
    return new Proxy(this, {
      set: function(obj, prop, value) {
        if (obj[prop] === value) return true;
        obj[prop] = value;
        if(obj.event[prop + '_onchanged']) {
        	obj.event[prop + '_onchanged'].bind(obj)();
        }
        return true;
      }
    });
  }
}

class Test extends Observable {
  constructor() {
    super();
    this.event.hoge_onchanged = () => {console.log('changed : ' + this.hoge)};
  }
}

var tester = new Test();

tester.hoge = "hoge";
tester.hoge = "hoge";
tester.hoge = "fuga";

if (tester instanceof Test) {
  console.log("ok");
}
```

# 実行結果
```
changed : hoge
changed : fuga
ok
```

# 解説
まともに解説していなかったので解説します。

## 変更の監視
```js
    return new Proxy(this, {
      set: function(obj, prop, value) {
        if (obj[prop] === value) return;
        obj[prop] = value;
        if(obj.event[prop + '_onchanged']) {
        	obj.event[prop + '_onchanged'].bind(obj)();
        }
      }
    });
```
まず、この実装の根本ともいえるオブジェクトに対する変数の監視をする部分は[**Proxyクラス**](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Proxy)を用いて実現しています。
リンク先のMDNをご覧になると分かると思いますが、このProxyクラスはあるオブジェクトに対する**操作をラップ**できるクラスとなっています。どの操作をラップできるかについては[**Proxy Handler**](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Proxy/handler)の項目を見るとわかります。
このクラスを用いてラップすることによって実装者による独自の動作をさせることができますが、注意すべき点として、本来の動作をさせつつ何かをしたい場合は**トラップ関数に本来の動作を行う実装を書かなければいけません**

## 通知の発行/受け取り
いろいろ悩んだのですが以下のように落ち着きました

### 発行
```js
function(obj, prop, value) {
  if (obj[prop] === value) return;
  obj[prop] = value;
  if(obj.event[prop + '_onchanged']) {
    obj.event[prop + '_onchanged'].bind(obj)();
  }
}
```
**obj**にはProxyクラスのコンストラクタ第一引数に指定したオブジェクトが渡されます。
**prop**には変更があったプロパティが渡されます。
**value**は変更後の値です。
ですので
`obj[prop] = value`
とすることで元々のsetの役目を果たすことができます。

### 受け取り
```js
this.event.hoge_onchanged = () => {console.log('changed : ' + this.hoge)};
```
次にeventオブジェクトにハンドラが存在する場合のであればイベントを発行し、*this.event.\<prop>+_onchanged*で受け取っています。
ここはobj直属の関数を呼び出してもよかったのですが、objに大量のイベントハンドラが追加されるのは気持ちが悪いのでObservableクラスにeventオブジェクトを作成し、そこでイベントハンドラを記述するようにしています。

# 所感
結局**Test**は**Observable**を継承していますが、役目としては**Observer**,**Observable**両方の役目を果たしています。
これ以上スマートにする方法が見当たらないので一旦完成かなと思います。
もし、何か指摘点等あればコメントいただけると幸いです。

# repl.it
https://repl.it/@Angeart/Observable-on-Javascript-3

# 追記
タイトルがスマートじゃない
![](http://phdcomics.com/comics/archive/phd101212s.gif)
Jupyter > Python3 > print() > end=でエラーが出る > Python2のprintを使っている > 対策

```txt:動作環境
Ubuntu 16.04 LTS desktop amd64
IPython 5.5.0 -- An enhanced Interactive Python.
```

Jupyter NotebookでPython3のカーネルはインストール済み。

### codeとエラー

Python3を選択して実装。

```py:polarAndAzimuthCalc_171207.ipynb
import numpy as np

print('hello', end='')
```

```txt:error
  File "<ipython-input-1-ae4c065c97a5>", line 6
    print('hello', end='')
                      ^
SyntaxError: invalid syntax
```

Python2のprintになっている。

### About 

JupyterのAboutは以下となっている。

```
The server is running on this version of Python:
Python 2.7.12 (default, Nov 19 2016, 06:48:10) 
[GCC 5.4.0 20160609]

Current Kernel Information:
Python 2.7.12 (default, Nov 19 2016, 06:48:10) 
Type "copyright", "credits" or "license" for more information.

IPython 5.5.0 -- An enhanced Interactive Python.
?         -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help      -> Python's own help system.
object?   -> Details about 'object', use 'object??' for extra details.
```

### 対策

https://stackoverflow.com/questions/28831854/how-do-i-add-python3-kernel-to-jupyter-ipython
> answered Jul 22 '16 at 0:54
Jana

以下を実行したところ、Python3のprintになった。

```bash
python3 -m pip install ipykernel
python3 -m ipykernel install --user
```

JupyterのAboutの「Current Kernel Information:」は以下となった。

```
Current Kernel Information:
Python 3.5.2 (default, Sep 14 2017, 22:51:06) 
Type 'copyright', 'credits' or 'license' for more information
IPython 6.2.1 -- An enhanced Interactive Python. Type '?' for help.
```
【ILP 連載】自分で ILP を実装してみよう！

# 宣伝
![image.png](https://qiita-image-store.s3.amazonaws.com/0/71179/dc3ffc5f-988f-ee71-e224-78c6dbc33258.png)


この度、[日本インターレジャーユーザ会 Meetup#1](https://peatix.com/event/363009/) で ILP の次期バージョン候補である ILPv4 についてお話させて頂く事になりました。ご興味のある方は是非いらっしゃって下さい。今私が行っている実装についてのお話は登壇内容には含まれませんが、直接お声がけ頂ければお話できると思います。よろしくお願い致します。

# 前書き
こんにちは。どらです。突然ですが、ILP の連載をしてみる事にしました。

ILP というのはこれから世界の支払いを変え得る技術なのですが、ここで説明するのは大変なので詳しくは [世界で一番分かりやすい Interledger Protocol](https://medium.com/@dora_gt/%E4%B8%96%E7%95%8C%E3%81%A7%E4%B8%80%E7%95%AA%E5%88%86%E3%81%8B%E3%82%8A%E3%82%84%E3%81%99%E3%81%84-interledger-protocol-a6e6e3d11d80) をご覧下さい。このページでは **ILP をより深く理解し、実際に自分で実装してみる事を目指します**。

なお、言語としては C# を予定しています。特に深い理由はないのですが、既に JS と Java は実装があるので C# ならカブらない、自分が普段 C# を使っている、型があるのでコードを追いやすいだろうなというところでちょうどよいかなと思ったためです。

ステップとしては、下記の様な感じを考えています。

- ILP のサンプル実装を動かし、肌で動きを理解する
- 内部的な動きをコードレベルで詳細に把握する
- 実際に実装してみる

考えていますと書いたのは結構思いつきで始めた連載なので、内容も変わっていく可能性があるなと思ったためです😂 まぁそんな感じのゆるい連載ですが、まったりと見て頂ければと思います。

# 目次
- [【ILP 連載 - 1】ilp-kit を自分のサーバーで立ち上げる](https://qiita.com/dora-gt/items/22053dfe32f23b1c571f)
- [【ILP 連載 - 2】ILP の仕様を理解するための下準備　ASN.1 編](https://qiita.com/dora-gt/items/8176fec8801a4a334924)
- [【ILP 連載 - 3】ILP の仕様を理解するための下準備　C# Type 編](https://qiita.com/dora-gt/items/4fe9fd25ed49d4b97828)
- [【ILP 連載 - 4】ILP を実装するための下準備　PPC64 編](https://qiita.com/dora-gt/items/7cfb5b1c20be5d7ed579)
サブスレッドでアニメーションループを作る

この記事はQuadアドベントカレンダー7日目の記事です
前回[wift用アニメーションエンジンを作り始める](https://qiita.com/s_s_k/items/6beac2fdf620dcd79e02)からの第2回目です。

今回はアニメーション用のスレッドを別に用意して、CADisplayLinkを利用する方法を模索したいと思います。メインスレッドは何かと処理が重なると思うので、サブスレッドに分けてそちらでアニメーション専用で利用すればパフォーマンスも良くなるのではと考えています。

色々調べたところ、どうやらRunLoopを作る必要があるところまではわかりました。

## RunLoopを作るには

>実行ループを設定するために必要な作業は、スレッドを起動し、実行ループオブジェクトの参照を取得し、イベントハンドラを組み込んで、実行ループに実行を指示することだけです。長時間存続する二次スレッドを作成する場合は、そのスレッド用の実行ループを独自に設定する必要があります。

RunLoopはCADisplayLinkの設定でも使用したと思いますが、サブスレッドを切らない限りはRunLoop.currentでメインスレッドの実行ループを取得できます。
何度実行しても一つのスレッド内では同一のRunLoopを取得します。シングルトンみたいですね。

別スレッド内でRunLoop.currentすると新しいじ実行ループを取得できます。RunLoop.currentのタイミングで新規さ作成されるようです。

### 実際に作ってみる

RunLoopはThreadに紐づくようです。そのためまずはThreadを作る必要があります。
作るのは簡単です。

```swift
override func viewDidLoad() {
        super.viewDidLoad()
        let thread = Thread(
                     target: self, 
                     selector: #selector(self.threadLoop), 
                     object: nil
        )
        thread.start()
}
```

```swift
@objc func threadLoop() -> Void {
    print("thread loop done!")
}
```
起動するとコンソールに「thread loop done!」が表示されると思います。この処理では、単に別スレッドで処理を実行したというだけのようです。

### RunLoopを取得する

threadLoop()内で、RunLoop.currentを実行すると、サブスレッドのRunLoopが取得できます。RunLoopは一つのスレッドに対して、一つだけ存在します。

```swift
@objc func threadLoop() -> Void {
    print("thread loop done!")
    let runLoop = RunLoop.current
}
```

### CADisplayLinkを利用する

runLoopが取得できたのでCADisplayLinkを利用してアニメーションをエンジンを組み立てます。

```swift
@objc func threadLoop() -> Void {
    print("threadLoop done")
    self.updater = CADisplayLink(target: self, selector: #selector(self.onLoop(_:)))
    updater!.preferredFramesPerSecond = 60
    updater?.add(to: RunLoop.current, forMode: RunLoopMode.defaultRunLoopMode)
}
    
@objc func onLoop(_ sender:AnyObject ) -> Void {
     print("CADisplay loop done!!")
}
```

しかしこれでは、onLoop()のprintが実行される気配がありません。上記実装では、threadLoop()が実行されたタイミングで、Threadは終了し、RunLoopも消滅するためです。

### スレッド用の実行ループを独自に設定
スレッド〜キープするために、ループ処理を利用します。

```swift
@objc func threadLoop() -> Void {
    self.updater = CADisplayLink(target: self, selector: #selector(self.onLoop(_:)))
    updater!.preferredFramesPerSecond = 60
    updater?.add(to: RunLoop.current, forMode: RunLoopMode.defaultRunLoopMode)

    // スレッドをキープする
    while self.isRunning {
        // ここの数値はFPS設定に影響しています。1/60 = 60FPS
        RunLoop.current.run(until: Date(timeIntervalSinceNow: 1/60))
    }
}
```

これでサブスレッドはキープされています。コンソール上に「CADisplay loop done!!」が大量に表示されると思います。

Swiftでスレッド周りの情報はGCD周りぐらいしかないので、おそらく普通は使わないと思いますが、触ってみると面白いですね。

続きは次回へ
Fritzingでの部品の作り方のコツ（部品データ付）

Fritzingは良い。

 - ブレッドボードのイメージを手軽にかける。部品の下にジャンパー線を這わせる必要があったとき、実物をボードから抜き差しせず試せる。
 - ブレッドボードから基板化するときパターンや部品配置を決定する支援をしてくれる。基板の裏表ビューがあるので部品の方向をまちがったりしない。

けど、汎用部品はたくさん登録されているが、新しめな部品、特に秋月電子で売っている部品は登録されていない。
でも登録しないとちゃんとしたブレッドボードイメージは書けないし、基板イメージも作れない。部品の寸法やピンの並が重要になるからだ。

部品の登録は誰かが作った.frpzファイルをダウンロードしてきてインポート出来るが、誰も作ってない部品の場合はどうするか。
作るしかない！！

ここでは、Fritzingの部品の作り方のコツと、自作した部品データを公開したい。

---

#部品の作り方のコツ

部品を作る基本は、以下のURLにとても詳しく書かれている。なのでまずこのURLを読もう。
https://jumbleat.com/wp-content/cache/all/2017/01/18/making_custom_parts_fritzing//index.html

その上で、上記URLで学んでも以下の点はつまづきやすいので注意しよう。

- 文字はアウトライン化する。Inkscapeのメニュー「パス」->「オブジェクトをパスへ」でアウトライン化出来ます。
- SVG形式のファイルをFritzingに読み込んでもピンがリンクしない場合は、Fritzingで素直にピンを紐づけるのが早い。
- 次のようなエラーが出たら、お絵かきツールのInkscapeにて、「copper1」以下を削除する。

【エラー】
![エラー](https://qiita-image-store.s3.amazonaws.com/0/89689/0a0318a9-b9d0-ba5e-2978-0534389a7180.png)

【copper1以下を削除する例】
![例](https://qiita-image-store.s3.amazonaws.com/0/89689/e0880afb-bb25-6a6f-58af-63c5c3fbf61c.png)


#作った部品の披露
- [秋月電子通商の　超小型シリコンマイクモジュール　SPU0414HR5H-SB使用](https://mb.api.cloud.nifty.com/2013-09-01/applications/SP2tQsUZ1j0jD3qk/publicFiles/SiMIC.fzpz)
- [秋月電子通商の　８ビット双方向ロジックレベル変換モジュール](https://mb.api.cloud.nifty.com/2013-09-01/applications/SP2tQsUZ1j0jD3qk/publicFiles/8bit-logic.fzpz)
- [秋月電子通商の　マイコン内蔵ＲＧＢＬＥＤモジュール](https://mb.api.cloud.nifty.com/2013-09-01/applications/SP2tQsUZ1j0jD3qk/publicFiles/CLED-Chip2.fzpz)
- [マイクロテクニカの　WiFiモジュール(ESP-WROOM-02) ブレークアウトボード Ver.2](https://mb.api.cloud.nifty.com/2013-09-01/applications/SP2tQsUZ1j0jD3qk/publicFiles/ESP8266.fzpz)

の部品を作ってみた。
リンクをクリックするとダウンロードできるので使ってみてほしい。
※パーツの絵は[DEKOさんのページ](https://ht-deko.com/delphiforum/?vasthtmlaction=viewtopic&t=1971.0)のデータを一部使わせていただいております。

![akizuki02.jpg](https://qiita-image-store.s3.amazonaws.com/0/89689/80bbbd6f-10a9-36da-fa78-903e921ca3f4.jpeg)
pythonで任意のディレクトリ以下の全てのファイルを処理する(追記あり)

# はじめに
pythonを使ってあるディレクトリ以下の全てのファイルを処理することがあったので、その方法をまとめます。

# 全てのファイルにアクセスする方法
基本的には、ディレクトリを探索して中のファイルを調べて、ファイルだったら処理、ディレクトリだったらさらに探索、というのを再帰的に繰り返します。

```py3
import os
ROOT_PATH = 'ルートディレクトリ'


def prcess(file_path):
    # 処理を記述


def recursive_file_check(path):
    if os.path.isdir(path):
        # directoryだったら中のファイルに対して再帰的にこの関数を実行
        files = os.listdir(path)
        for file in files:
            recursive_file_check(path + "\\" + file)
    else:
        # fileだったら処理
        process(path)


recursive_file_check(ROOT_PATH)
```

# 特定のファイル形式のファイルのみ処理したいとき
else:ブロックを通過するときにif文でfilterを通してあげれば実装できます。後ろの文字から拡張子をするのが楽だと思います。

例えばエクセル形式のファイルのみを処理したいときは、

```py3
    else:
        if path[-4:] == '.xls' or path[-5:] == '.xlsx':
            process(path)
```

などとすれば、エクセルファイルだったときのみ処理をすることができます。

# 追記
わざわざ再帰検索をせずとも、ディレクトリ下の全てを出してくれる関数os.walkを使うともっと楽にかけます。

```py3
def file_check(path):
    for pathname, dirnames, filenames in os.walk(path):
        for filename in filenames:
             process(os.path.join(pathname,filename)
```

とてもすっきりしました！

フィルターに関しても、endswith関数を使えばわざわざスライスせずとも簡単に調べることができます。上と同様の例は、次のようになります。

```py3
def simple_check(path):
    for pathname, dirnames, filenames in os.walk(path):
        for filename in filenames:
             # フィルタ処理
             if filename.endswith('.xls') or filename.endswith('.xlsx'):
                    check(os.path.join(pathname,filename)
```
DiscordPHPを使って簡単なBotを作ってみる - 導入編

# Discord Advent Carendar 2017 7日目
空いてたので、導入編として最初の設定だけ書いちゃいます。

# DiscordPHPとは
３日目や4日目の記事にもあった `eris` や `discord.js` みたいなライブラリの一種ですね。
名前どおりPHPで書けるライブラリです。

# やってみよう
[DiscordPHPのドキュメント](https://discordphp.readme.io/docs)がありますので、そこのGetting Startedからやっていってみます。

## Botユーザの作成
Getting Startedを始める前にBot自身を作成しないといけませんので、そちらも作成しておきましょう。
詳細は3日目にsbhrさんが書かれていますので、ここでは割愛しますね。
[sbhrさんの記事](https://qiita.com/sbhr/items/43320a828e62eadbd77a#botの準備)

今回はPHP珠ちゃんのBotを使います。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/44541/e8415e29-fad5-461a-c8c1-6497f93b12fa.png)

## composerでdiscord-phpを導入
PHP界隈では有名なcomposerを使用します。
composerのインストールについてはここでは触れませんので、ご了承ください。

まずcomposer用ファイルのcomposer.jsonを作成します。

`composer init` と入力

```text:ターミナルで入力してね
⫸ composer init


  Welcome to the Composer config generator



This command will guide you through creating your composer.json config.

Package name (<vendor>/<name>) [*****/discord-php-sample]:
Description []: discord php sample project
Author [***** <*****@gmail.com>, n to skip]:
Minimum Stability []:
Package Type (e.g. library, project, metapackage, composer-plugin) []:
License []:

Define your dependencies.

Would you like to define your dependencies (require) interactively [yes]?
Search for a package:
Would you like to define your dev dependencies (require-dev) interactively [yes]?
Search for a package:
```

`composer init` すると上記のように色々と出てきて入力が求められますが
すべてEnterで大丈夫です。

composer.jsonが作成されたので、次はDiscordPHPのライブラリを導入してしまいましょう。

`composer require team-reflex/discord-php` を入力します。
入力するとずら～っとたくさん出てきて勝手に終わってくれます。

これで導入自体は完了です。

## 簡単なプログラムだけ書いてみる
あともう少しだけおつきあいを。
今回はまだDiscord上に流したりするようなものまでは書きませんが、動作確認程度はしてみましょう。
(Getting Startedに書いてあるコードをそのまま流用します。)

```php:run.php
<?php

include __DIR__.'/vendor/autoload.php';

$discord = new \Discord\Discord([
    'token' => 'your-auth-token', // ←作成したBotのTokenを入力してね
]);

$discord->on('ready', function ($discord) {
    echo "Bot is ready.", PHP_EOL;
  
    // Listen for events here
    $discord->on('message', function ($message) {
        echo "Recieved a message from {$message->author->username}: {$message->content}", PHP_EOL;
    });
});

$discord->run();
```

## 動かしてみますぞ
さて、動かしてみましょうか。

ターミナルで `php run.php` を入力します。

プログラム側で記述していた `Bot is ready.` が最後に表示されていれば成功です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/44541/7f3a037e-1571-9854-d388-2a3ecac604ad.png)

Discord側では↓のようにBotがオンライン状態になっていればOKです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/44541/22f8694b-361b-5d22-8cbb-71196105af87.png)

では実際に動作を確認してみましょう。

Discord側での入力
![image.png](https://qiita-image-store.s3.amazonaws.com/0/44541/94fc7326-171b-1835-c38a-00c04bba0980.png)


確認しますぞ。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/44541/27808f2c-492f-b7ca-98b1-5b6a553806a3.png)

ちゃんとログに残ってますね！

# まとめ
composerの扱いに慣れていれば、導入自体は一瞬で終わります。
簡単ですね。

# おわりに
Getting Startedをただ日本語でQiitaに書いただけでしたね。
また後日、今度はDiscord上でのやりとりの部分を記事にしたいと思います。
Objective-CのプロジェクトにSwiftを入れる前に考えたいこと

最近までObjective-Cで開発してきたアプリの新たな対応でSwiftを使い始めたら、色々と考慮すべきだったなってことがあったので、それについての話。

#考慮すべきだった点その１　カテゴリ
Objective-CやSwiftでは、既存のクラスを拡張する機能を持っています。
Objective-CではCategory、Swiftではextensionと呼ばれる機能です。

Objective-Cで作成したカテゴリはSwiftからでも呼び出せるのですが、例えば、以下のようなカテゴリだった場合、少し困ったことになります。

```objc:NSDate+differenceDays.m
- (NSDate *)diffrenceDays:(NSInteger)days
{
    NSCalendar *calendar = [[NSCalendar alloc]initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
    
    
    NSDateComponents *dateComponents = [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay|NSCalendarUnitWeekday
                                                   fromDate:self];
    
    dateComponents.day += days;
    
    return [calendar dateFromComponents:dateComponents];
}
```

これは、インスタンス化されたNSDateからdays日前、もしくはdays日後のNSDateを返り値とするNSDateの拡張メソッドです。

これをSwiftから呼び出してみると以下のようになります。

```swift
// 現在日時のNSDateを生成
let nsdate = NSDate()
// 三日後の日付を取得する(Date型)
let date = nsdate.diffrenceDays(3)
```

Swiftではバージョン3からNSDate型ではなく、Date型が採用されているため、Objective-CのNSDate型のカテゴリをDate型から呼び出すことができないので、それを使用する場合はNSDate型を使用する必要があります。

ですがSwiftとObjective-Cの連携の性質上、SwiftでObjective-C側のメソッドを呼び出す場合に、NSDateの引数や返り値はDate型になってしまいます。

そういった場合、何が都合が悪いかというと、先ほどの例で言うと、返り値がNSDateではなく、Date型のため、そこからさらにNSDateのカテゴリのメソッドを使用したい場合に、一度asでNSDate型に戻してやる必要があると言う点です。

```swift
// 現在日時のNSDateを生成
let nsdate = NSDate()
// 三日後の日付を取得する(Date型)
let date = nsdate.diffrenceDays(3)
// さらに三日後の日付を取得する
let nsdate2 = date as! NSDate
let date2 = nsdate2.diffrenceDays(3)
```

この例は極端な例ですが、NSDateは、様々なアプリで使用が想定されますし、その分カテゴリで拡張するのはかなり一般的で、過去の資産がたくさんある中で、新たにSwiftで使用し始めるのに毎回asで対応するのは辛い部分があります。

NSDate以外にもNSDataやNSCalendarなどのいくつかの型名はObjective-CとSwiftで名前が変わっているので、Objective-Cのカテゴリを使用する際には、Swift側でObjective-Cの型名を指定してやらなければいけません。

##対応策
1.諦める。大人しく必要な時はasでNSDateとDateを切り替える。
2.SwiftのDateのextensionにNSDateと同じ内容の物を作る

##結論
どちらにせよめんどくさい。

#考慮すべきだった点その２　ネットワーク
ネットワーク処理とSwiftは最近ではCodableといったJsonをいい感じに型に沿ったStructに変換してくれる機能が出てきて話題になりましたが、Objective-Cでは、JsonをNSDictionaryに変換するのが一般的ではないかと思います。

単純に完全に新規のネットワークを作成するのであればSwiftでCodableを使用してなんて考えたいところですが、開発期間などを考えると、Objective-Cで作成された既存の通信処理をSwift側で使用することもあります。

その場合、Dictionaryの中身の型が保証されていない場合、取り出す際にasを使用して、Any型からキャストしなければならなかったりするので、結局Objective-Cとやっていることが同じでSwiftの旨味を感じれない開発になったりします。

##対応策
1.諦める。asでキャストする。
2.意地でもSwift用のネットワークの処理を書く

##結論
どちらにせよめんどくさい。

#まとめ
まあこんなこと言ってるけど、SwiftだったらOptionalとかモダンな文法とかあって楽しいし、バグも減るんじゃないかって思うから使うべきだと思う。
でも、過去の遺産をどうするかも同時に考えたいって思った。
phalcon 3.1.2 にアップデートしていろいろ問題ありあり

#Phalconの初期設定でなぜautoload.phpが読まれなくなったのか。
phalconのdebtools.phpでプロジェクトを作ると以前あった、vendorのautoload.phpの読み込みが消えていた。なぜだろう。。
とりあえず、下記の通り追加でOK

```php:config/loader.php
require __DIR__ . '/../../vendor/autoload.php';
```
【FileMaker】Loopと全置換、どっちが早いのかやってみた

FileMakerもバージョンが16になり、以前とは比べ物にならないほど多機能になってきました。
しかし、スクリプトの組み方によっては、処理が遅いシステムになってしまいます。

今回は、同じことをするのに違うステップや関数で実装したらどっちが早いか、が気になったのでやってみました。
[Loop](https://fmhelp.filemaker.com/help/16/fmp/ja/index.html#page/FMP_Help/loop.html)と[フィールド内容の全置換](https://fmhelp.filemaker.com/help/16/fmp/ja/index.html#page/FMP_Help/replace-field-contents.html)です。

# 実施環境
MacBook Air (13-inch, Early 2015)
プロセッサ：1.6 GHz Intel Core i5
メモリ：8 GB 1600 MHz DDR3
OS：macOS High Sierra バージョン 10.13.1
FileMaker：FileMaker Advanced Pro 16.0.3.302

# 検証データ
(1)１万件ちょい(16,000件)のデータ２フィールドを変換
(2)５万件ちょい(56,000件)のデータ２フィールドを変換　→　(1)1の3.5倍
(3)10万件ちょい(112,000件)のデータ２フィールドを変換　→　(1)の7倍

変換するフィールドは、
・テキストデータ
・数値
の2つです。

# 仕様するFileMaker スクリプトステップ
以下の2つのスクリプトステップごとにスクリプトを作成します。
・[Loop](https://fmhelp.filemaker.com/help/16/fmp/ja/index.html#page/FMP_Help/loop.html)
・[フィールド内容の全置換](https://fmhelp.filemaker.com/help/16/fmp/ja/index.html#page/FMP_Help/replace-field-contents.html)

Loopを使ったスクリプトは、以下のような感じです。
![1208_1.png](https://qiita-image-store.s3.amazonaws.com/0/60538/c6c965a1-438a-9eec-1e28-4a8c2d1478db.png)

フィールド内容の全置換を使ったスクリプトは、以下のような感じです。
![1208_2.png](https://qiita-image-store.s3.amazonaws.com/0/60538/cf5b8808-e61d-fdb4-d830-f2e859ceb961.png)



# 結果
## １万件ちょい(16,000件)のデータ２フィールドを変換の場合
・Loop
![1208_3.png](https://qiita-image-store.s3.amazonaws.com/0/60538/717a3657-cb68-d945-8f79-12baba3a26ad.png)

・フィールド内容の全置換
![1208_4.png](https://qiita-image-store.s3.amazonaws.com/0/60538/b5bcf5ae-ffe6-1ff4-1a69-e31a65fce6f1.png)

## ５万件ちょい(56,000件)のデータ２フィールドを変換の場合
・Loop
![1208_5.png](https://qiita-image-store.s3.amazonaws.com/0/60538/6dc15a19-3ab3-ef54-0173-5f6bb9b31851.png)

・フィールド内容の全置換
![1208_6.png](https://qiita-image-store.s3.amazonaws.com/0/60538/83107d4c-d78f-c918-1d0e-97b35c7ae306.png)

## 10万件ちょい(112,000件)のデータ２フィールドを変換の場合
・Loop
![1208_7.png](https://qiita-image-store.s3.amazonaws.com/0/60538/aeed5fbb-5339-3103-40fc-29d06cbf315b.png)

・フィールド内容の全置換
![1208_8.png](https://qiita-image-store.s3.amazonaws.com/0/60538/1f9fd50a-9843-8692-4003-44eb7dc1c8c3.png)

さすがに10万件ちょいのLoop変換は、待っている間、眠くなりそうでした。。。

表にしてみました。

| 件数(件) | Loop(分:秒) | 全置換(分:秒) |
|----: |------:|--------:|
| 16,000 | 0:30 | 0:02 |
| 56,000 | 1:50 | 0:06 |
| 112,000 | 3:39 | 0:12 |



グラフにしてみました。
![1208_9.png](https://qiita-image-store.s3.amazonaws.com/0/60538/aacb6104-e158-8845-8e0d-15ea20e43e0e.png)
Loop、スキーの上級者コースを超えた斜度ですね！
基準値を16,000件とすると、Loopは16,000件の3.5倍のデータである56,000件は、処理時間は3.5倍を5秒ほど多くかかっています。
同様に、112,000件は16,000件の７倍ですが、処理時間は７倍を4秒ほど多くかかっています。
バッチ処理をするなら、4,5秒多くかかってもそんなに気になりませんが、オンラインで処理する際は、ものすごくかかることになりますね。

だがしかし、全置換に関しては、単に3.5倍、７倍の時間はかかっていません。
むしろ、少ない時間で処理を終了しています。

FileMakerのバージョンや実行環境にも寄るかと思いますが、今の所、フィールド内容の全置換の方が処理が早い、という結果になっています。
なお、再帰処理でのフィールド変換は、[再帰回数に限界数がある](https://qiita.com/manabuuuuun/items/7a6a20f9037995c3065d)ようですので、今回の検証からは外しました。

では、楽しいFileMakerライフを！
MySQLからSELECTした値をINSERTするときにエスケープは必要か？

# コード

```php
<?php

$c = mysql_connect('localhost', 'mysql', 'mysql');
mysql_select_db('testdb');

var_dump($r = mysql_Query('SELECT * FROM test'));
var_dump(mysql_fetch_array($r));
var_dump(mysql_error());

$text = "You can't escape";

echo "これはエラー\n";
$sql = "INSERT INTO test (text) VALUE('" . $text . "')";
echo $sql . "\n";
var_dump(mysql_Query($sql));
var_dump(mysql_error());
echo "\n\n";

echo "これは?\n";
$sql = "INSERT INTO test (text) VALUE('" . mysql_real_escape_string($text) . "')";
echo $sql . "\n";
var_dump(mysql_Query($sql));
var_dump(mysql_error());
echo "\n\n";

echo "入れたtextはどんな値で取得できる？\n";
var_dump($r = mysql_Query('SELECT * FROM test'));
var_dump($a = mysql_fetch_array($r));
var_dump(mysql_error());
echo "\n\n";

echo "値の再利用はどうなる？\n";
$sql = "INSERT INTO test (text) VALUE('" . $a['text'] . "')";
echo $sql . "\n";
var_dump($r = mysql_Query($sql));
var_dump(mysql_fetch_array($r));
var_dump(mysql_error());
```

# 出力

```
resource(8) of type (mysql result)
bool(false)
string(0) ""
これはエラー
INSERT INTO test (text) VALUE('You can't escape')
bool(false)
string(156) "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 't escape')' at line 1"


これは?
INSERT INTO test (text) VALUE('You can\'t escape')
bool(true)
string(0) ""


入れたtextはどんな値で取得できる？
resource(9) of type (mysql result)
array(2) {
  [0]=>
  string(16) "You can't escape"
  ["text"]=>
  string(16) "You can't escape"
}
string(0) ""


値の再利用はどうなる？
INSERT INTO test (text) VALUE('You can't escape')
bool(false)
PHP Warning:  mysql_fetch_array() expects parameter 1 to be resource, boolean given in /tmp/pdo.php on line 36
NULL
string(156) "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 't escape')' at line 1"
```

# 結論

~~mysqliやPDOを使おう~~
DBに入っていた値でも、エスケープされたままINSERT SELECTされるわけではないので、再利用する場合は再度エスケープしよう。

# 全体にかけるのも:no_good:

パラメーター増えたときにひとつひとつ長ーい関数にかけるのも辛いので、最終SQLにかけちゃえばいいじゃないか


```php
$text = "You can't escape";
$sql = "INSERT INTO test (text) VALUE('" . $text . "')";
echo mysql_real_escape_string($sql) . "\n";
```

```
INSERT INTO test (text) VALUE(\'You can\'t escape\')
```

はい。そうですね。
あくまで

>mysql_real_escape_string() は、MySQL のライブラリ関数 mysql_real_escape_string をコールしています。 これは以下の文字について先頭にバックスラッシュを付加します。 \x00, \n, \r, \, ', " そして \x1a. 

ですし、人がどのようなSQLを意図していたかなんてただのstringからではそうそうわからないでしょう。
エンジニアが急遽ベトナムに飛ばされたときのためのアドバイス

# 前置き
つい先月、ベトナムで提携先の会社に急遽退職者が発生し、その穴埋めとしてベトナムのハノイへ1ヶ月ほど出張してきたので、そのとき気づいたことを書こうと思う。誰か急遽ベトナムへ飛ばされることがあったら参考にして欲しい。

# ベトナムとはどんなところ？
### 気候 
夏は暑いらしいが、11月は半袖で過ごせるほど、気候は快適。雨季などは台風が多いなど、時期によりだいぶ違うらしい。

### 交通 
バイクがとにかく多く、渋滞ばかり。移動は全てタクシーで移動しても数百円くらいなのでかなり便利。
車やバイクは渋滞ばかりでスピードがでないため、道路を平然と歩いて横切ってもみんな避けてくれる。逆に、車の流れが途切れないため、慣れないと一生道路を渡れない。

### 食べ物
ベトナムの食べ物は、人により好き嫌いはあると思うが、すごく美味しくはないが、食べれないようなものでもなかった。いろんなものにパクチーが入っているため、苦手な人はそれは注意すること。また、ビュッフェがすごいお得で、日本食のお店の焼肉食べ放題ですら1000円で食べれる。ただし、屋台は衛生があまりよくないので、食べるときは気をつけたほうがよい。

### コミュニケーション
基本ベトナム語しか一般人はわからない。ホテル、空港、ツアーのガイド、ベトナムのエンジニアは英語が使えるくらい。ベトナム語は、アルファベットのようで、微妙に文字が違うため、読んだり、発音したりがベトナム語を知らないとできないため注意が必要。

### 日本人は？
日本人はほとんどいません。ハノイには日本人街はあるので、そこにいけば日本人に会えますが、その他だと提携先のベトナム会社に出張できていた日本人が2人いたくらい。観光地ですら日本人は数人見かけたくらいで、日本人はほとんどみませんでした。日本人だと思っても近づいても大抵中国語を話してます。。

# 生活する上での注意事項
日本にいると気にしないが、水には気をつけるようにするべき。
日本と違い、浄水設備がそれほど発展していないため、飲み水はもちろん、生野菜やシャワーの水、お店で出される飲み物の氷などは不安なら摂取しないようにしたほうがよい。

# 仕事環境

エンジニアはノートパソコンとwifi環境、コンセントだけあれば、どこでも同じ仕事ができることを改めて実感。
ちょっとした食事処やホテルならwifiは飛んでいるので、仕事環境においては全く困らなかった。

# 生活する上で重宝する便利アプリ
### google map
ベトナムではタクシーで主に移動することになると思うが、その際初めての場所だと本当にタクシーが正しい方向に進んでいるのかすごい不安になる。google mapをインストールしておくことで、GPSで現在地が常に確認できるため、ベトナムでの移動をかなり安心して行うことができるのでおすすめ。

### google 翻訳
主に現地の英語すらわからない人とコミュニケーションをとるのに利用。
ベトナム語しかわからない人とコミュニケーションをとるさいに、日本語→ベトナム語として、簡単なコミュニケーションはこれでとることができた。

ただ、もし少しでも相手が英語をわかるのであれば、日本語→英語、または英語→ベトナム語として利用するのをおすすめする。日本語→ベトナム語とした際、翻訳されるベトナム語が全くわからないため、翻訳が間違っていても気づくことができない。しかし、英語を一緒に表示しておけば、相手がベトナム語の翻訳がおかしいなと思った際は英語を読んで内容を理解してくれるため、かなりコミュニケーションのすれ違いを解消することができた。

### facebook messanger
ベトナムの標準メッセージアプリはLINEではなく、facebook messangerのため、基本向こうの人と個人的にやりとりする場合はこのアプリを利用するため、事前にインストールしておくことをおすすめする。

# その他知っておくと便利なこと
### ハノイの住所
ハノイは京都のように、住所で場所が特定できるため、タクシーに乗るときは住所をベトナム語で用意しておけばスムーズに移動できる。ホテルなどの場合は、ホテルの名刺がフロントにあると思うので、それを一枚確保しておくと便利。

### 家電製品の充電
ベトナムは日本の家電を利用する際は変圧器を通す必要があるが、Macの充電器はそのままベトナムでも利用可能。そのため、スマホの充電くらいしかしないのであれば、MacのUSBから充電するようにすれば変圧器を持っていく必要はない。

# ベトナムへ出張してみて
上司の人からベトナムことは事前に聞いていたが、思ったほど悪い場所ではなかった。ホテル、食べ物、水さえいいものを確保できるようになれば全然快適に過ごせた。旅行感覚で一度いくにはいい場所だと思う。

最初の1週間ほどはわからないことだらけで不安かもしれませんが、もし行く機会がある人がいたらぜひ楽しんできてください。
立方体のなかを動き回るボール

立方体のなかを動き回るボールを作ってみた。
[ball3D (1) | CreateJS](http://labo.project-nya.jp/createjs/ball3D/ver1/)

重なり順も考慮してみた。
[ball3D (2) | CreateJS](http://labo.project-nya.jp/createjs/ball3D/ver2/)
PythonとTwitterAPI使ってtweetしてみる

#はじめに
twitterを使ったbotを作りたく、手始めにpythonからAPI使ってtweetしてみます。備忘録です。

#環境設定
oauthlibをインストール
```$ python3   -m pip install requests-oauthlib
```

Pycarmにライブラリをインストール
[PyCharmによるパッケージの追加方法](https://qiita.com/yamaAtsu/items/34e2a04408695365d586)

#Twitter認証キーの取得
[TwitterAPIの取得方法](https://syncer.jp/Web/API/Twitter/REST_API/)

#Pythonからtweetする

まずは各種認証キーをconfig.pyとして準備します。

```config.py
CONSUMER_KEY = "**************"
CONSUMER_SECRET = "**************"
ACCESS_TOKEN = "**************"
ACCESS_TOKEN_SECRET = "**************"
```


```tweet.py
#coding: UTF-8
import json, config
from requests_oauthlib import OAuth1Session

CK = config.CONSUMER_KEY
CS = config.CONSUMER_SECRET
AT = config.ACCESS_TOKEN
ATS = config.ACCESS_TOKEN_SECRET
twitter = OAuth1Session(CK, CS, AT, ATS)

params = {"status": "Hello, World!"}
req = twitter.post("https://api.twitter.com/1.1/statuses/update.json",params = params)
```

#実行結果
<img width="579" alt="スクリーンショット 2017-12-07 10.55.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/200669/1c096fcf-68e4-fc72-b011-91b981c5d935.png">

やった！Pythonからtweet出来ました！

#参考にさせて頂きました
[PythonでTwitterAPIを叩いてみる](https://qiita.com/ogrew/items/0b267f57b8aaa24f1b73)
[PythonでTwitterしてみた](https://qiita.com/konojunya/items/59a68d35e44db8b87186)
docker-compose内の時刻を日本時間に変更する

dockerを起動すると、デフォルトではUTC時間になってしまう。
docker-composeに設定する際、以下の数行を追加することで
日本時間に変更する事が可能

※元にしたファイルはredashのcomposeファイル

``` [作業前]docker-compose.production.yml 
  nginx:
    image: redash/nginx:latest
    ports:
      - "443:443"
    depends_on:
      - server
    links:
      - server:redash
    logging:
      driver: "json-file"
      options:
        max-size: 3m
        max-file: "5"
    restart: always
```


``` [作業後]docker-compose.production.yml
  nginx:
    image: redash/nginx:latest
#-----------------------
# 以下追加
    volumes:
      - /etc/localtime:/etc/localtime:ro
    environment:
      TZ: Asia/Tokyo
#-----------------------
    ports:
      - "443:443"
    depends_on:
      - server
    links:
      - server:redash
    logging:
      driver: "json-file"
      options:
        max-size: 3m
        max-file: "5"
    restart: always
```

コンテナの落としあげをする事で日本時間に切り替わる。
Go的なのかどうかはわからないが時間だけは無い

多分Go的なきれいな設計になってないからこういう具合に苦しむのだろうけど…
インタフェースに依存させよ的な実装、「なるほどこういうことか！」ってなるし、できればそうしたいんだけど、例えば前の記事みたいな例だとうぅーんって気分に陥る。

が、業務でやってるので、どうしても戦わねばならない敵がいる。

その名も

納期の魔女
特技：前に倒れる

である。

その上で、明日の平和のためにも自分の精神衛生のためにもテストコードは書いておきたい。

と、ここまで言い訳を並べた上で結局こうした。
2018/5/23 追記
同僚にもうちょっと補足してくれと言われたので足した

```go
package main

type SugoiIF interface {
    Get() result
}

type result struct {
    mock string
}

type Sugoi struct {}

var NewSugoiApi = newSugoiApi

func newSugoiApi() SugoiIF {
    return &Sugoi{}
}

func (s *Sugoi) Get() result {
    return result{mock: "No"}
}

func main() {}

func ex() result {
    a := NewSugoiApi()
    b := a.Get()
    return b
}
```

```go
package main

import (
    "testing"
    "fmt"
)

type mock struct {
    SugoiIF
}

func newSugoiApiDummy() SugoiIF {
    return &mock{}
}

func (m *mock) Get() result {
    return result{mock: "Yes"}
}

func TestEx(t *testing.T) {
    NewSugoiApi = newSugoiApiDummy
    a := ex()
    fmt.Println(a)
}
```

これでテストパッケからはsugoiapiのNewSugoiApiをSugoiIFを満たす(埋め込んでしまうのがラクチンだった)物体を返す関数で上書いてしまえばとりあえずやりたいことはできた。
このつきまとう「本当にこれで良いのか」感、BccDeveloperではじめてCのお勉強したときの気持ちとにている。
Gradleについて調べる

# Gradleってなんぞ

### 参考サイト：
[Gradle User Guide](http://gradle.monochromeroad.com/docs/userguide/userguide.html) の８章あたりを見ると幸せになれる。
[【AndroidStudio 3.0】「flavor dimension」とは何?](https://android.benigumo.com/20171026/flavor-dimension/)
****

## Gradleとは

>Javaでのビルドツールの一つ。
>他のビルドツールの例　make、ant、maven、sConsなど
>ビルドとは、「ソースコード」を「ソフトウェア」に変換すること。

…だそうです。バリバリ書いたコードをいい感じに処理してくれるやつ。

## Gradleの書き方

### buildscript

ビルドスクリプト。このGradleのファイル自体が何に依存してるのか。（＝何が必要なのか）を記述する場所。

**repositories**
リポジトリっていうのはただのファイルの集合。開発時に使えるいろいろなファイルが置いてある。便利。
Mavenさんとかjcenterさんていういい人がいる。

```groovy
buildscript {
    repositories{
        mavenCentral() // Mavenのセントラルリポジトリを利用しますよー
        jcenter() // jcenterのリポジトリを利用しますよー
}
```

### dependencies
依存関係。いろいろ書いていく。

### apply plugin
プラグイン適用。プラグインは追加の便利機能。
例）

```groovy
apply plugin: 'com.android.application'
```

### flatDir
フラットディレクトリ。
ローカルファイルシステム（＝手元のPC)上のディレクトリをリポジトリとして使用することができるんだそうな。

```groovy
flatDir {
    dirs 'libs' // libsっていうディレクトリをリポジトリとして使用するよー。
}
```

## android
アンドロイド。メインの記述の部分と考えればよい。

### complileSdkVersion
コンパイルするアンドロイドAPIのバージョン。

### ext
変数を定義できる。

```groovy
android {
    compileSdkVersion 24
    buildToolsVersion 24
}
```
### flavorDimensions
状況によってビルドの内容を変更したい場合に使う。例えば、開発時と本番環境UP時でコンパイルのバージョンを変えたい場合とか。 基本は"default"と記述しておく。

```groovy
android {
flavorDimensions "default"
}
```
### defaultConfig
デフォルトコンフィグ。最小APIやらターゲットSDKバージョンやらを指定する。

### minSdkVersion
「これが限界ぎりぎりのバージョンだよ！」。これより低いAPIバージョンだと動かないよ！

### targetSdkVersion
「このバージョンなら動くよ！」という指定。指定なしだとminSdkVersionが適用。

### applicationId
アプリケーション毎にユニークなID。これが同じなら「同じアプリ」という意味になる。

### versionCode
管理側のバージョン。GooglePlayなどにアップする際に変える必要あり。ユーザーからは見えない。

### versionName
アプリを使用しているユーザーに見せるためのバージョン。変えなくても死なない。

```groovy
defaultConfig {
    minSdkVersion 14
    targetSdkVersion 15  
    applicationId "com.example.app"
    versionCode 1
    versionName "1.0.0"
}
```

### aaptOptions
apkを作る際に除外するファイルを指定？

### additionalParameters
わからん。謎。

### lintOptions
Android Studioにはlintっていう検査ツールがある。これでコードの構造や品質のチェックができる。そのオプションを指定する。

```groovy
lintOptions {
    abortOnError false // Lintでエラー出ても無視してビルド続けちゃうよ！
}
```
### packageingOptions
なんかこう、外部のjarファイルを依存関係でとってきたときに競合が起きるのを防ぐらしい。
エラーが起きたら追加していくイメージ

```groovy
packageingOptions {
    exclude 'LICENSE.txt' // 「LICENSE.txt」っていうファイルを除外しますよー
}
```

### sourceSets
javaのソースコードがデフォルトの場所（src/main/javaとか）以外に置かれている場合、それぞれの場所を指定して「追加」することができる。

### def
ローカル変数。定義されている場所でしか使えない。
内蔵HDDが遅くて死にそうだったので暗号化している外付けHDDを内蔵HDD代わりに起動時に自動マウントしてみたけど，結局マウントオプションの問題だった話

経緯
====

内蔵HDDにたかだか5MBのqgsファイルを保存するだけで30分くらいかかって泣きそうだったのでHDDを乗換えてから問題追求することにした．
運良くバックアップ用につないでいたLUKSで暗号化済の外付けHDDがまぁまぁ早かったので，とりあえずそっちにデータを写してマウントポイントを変え暫定対処しようとした．

前提
====

内蔵HDD `/dev/sdb`
外付けHDD `/dev/sdc`
外付けHDDはパーティションを切る前にHDD丸ごとLUKSで暗号化済

方法
====

こちらを参考にしたっつーか，ほぼそのまま → [\(Linux\)LUKSでファイルシステムを暗号化してみた : 3流プログラマのメモ書き](http://jehupc.exblog.jp/19078309/)

1. mkfs
    暗号化セットアップはできていたので，ファイルを消す（フォーマット）ところから．
    試しに mkfs.ext4dev やってみたら，マウントする時に ext4dev なんてFSは知らネーヨ！って怒られたので，ext4 で．
    
    ```sh:
    sudo cryptsetup luksOpen /dev/sdc csdc
    sudo mkfs.ext4 /dev/mapper/csdc
    sudo cryptsetup luksClose csdc
    ```

1. luksAddKey
    キーファイルを作ってluksに登録．参考サイトに従い`/boot`にキーを配置
    ちなみに，無限にキーを登録できると思ってたけど上限数（0から7の8個だった）があるようだ．

    ```sh:
    sudo dd if=/dev/urandom of=/boot/luks.key bs=1 count=1024
    sudo cryptsetup luksAddKey /dev/sdc /boot/luks.key
    sudo cryptsetup luksDump /dev/sdc
    ```

    マウントするデバイスをUUIDで指定したいので調べる．

    ```
    LUKS header information for /dev/sdc
    
    Version:       	1
    Cipher name:   	aes
    Cipher mode:   	xts-plain64
    Hash spec:     	sha1
    Payload offset:	4096
    MK bits:       	256
    (中略)
    UUID:          	b7223f8d-1a2c-4006-b289-35d62f88abf1    <--- これがUUID
    (略)
    ```

    テストはこんな感じで

    ```sh:
    sudo cryptsetup luksOpen /dev/disk/by-uuid/b7223f8d-1a2c-4006-b289-35d62f88abf1 csdc --key-file /boot/luks.key
    sudo mount /dev/mapper/csdc /mnt
    ```

1. crypttabの設定
    fstabと同じようにUUID指定でも書けた．

    ```
    csdc   UUID=b7223f8d-1a2c-4006-b289-35d62f88abf1    /boot/luks.key  luks,timeout=5
    ```

1. マウント設定
    参考サイトの知見に従い `rc.local` で設定する．

    ```sh:
    mount /dev/mapper/csdc /mnt
    ```

原因調査
======

実は上の工程の途中で`fstab`を覗いた時に目星はついていた．
何故つけたかは覚えてないけど，マウントオプションの`sync`が内蔵HDDについていた．
なので，外してベンチマークを取ってみると当たりだった．
ベンチマークの取り方だけメモっておく．

```sh:
sudo hdparm -tT /dev/sdb1
```

これは，外した後の値．うん，別に遅くないね．

```
/dev/sdb:
 Timing cached reads:   34264 MB in  2.00 seconds = 17156.06 MB/sec
 Timing buffered disk reads: 620 MB in  3.00 seconds = 206.35 MB/sec
```
abc.py in PyCharm

大したことないですが、一応メモ。

#トラブルシューティング
abc.pyという名前でPyCharm上でスクリプトを実行するとこうなります。
逆にいえば、PyCharm上でこうなったらファイル名がabc.pyになっていないか確かめると良いと思います。

```console
Fatal Python error: Py_Initialize: can't initialize sys standard streams
Traceback (most recent call last):
  File "C:\Users\name\Anaconda3\lib\io.py", line 52, in <module>
  File "C:\Users\name\PycharmProjects\project_name\abc.py", line 1, in <module>
RuntimeError: input(): lost sys.stdin
```

原因は[abc](https://docs.python.jp/3/library/abc.html "29.7. abc — 抽象基底クラス | docs.python.jp/3/")が標準モジュールであるために、PyCharmがそれをioに使用していて名前が衝突しているからですね。

#結論
abc.pyをPyCharm上でメタ構文変数のつもりで書くと死にます。

#参考
https://stackoverflow.com/questions/45122480/pycharm-runtimeerror-lost-sys-stdout-how-to-fix-this
Sota初期設定メモ

# 初回起動アプリ設定

/home/vstone/vstonemagic/app/jar/app.properties

```
length=1
Startup=controller/main.jar
```

## アプリの追加
```
app1.title=testapp
app1.workingdir=test/
app1.jar=test.jar
app1.type=app
app1.trigger=
app1.exec_prop=-Dfile.encoding=UTF8 -Djava.library.path=/usr/local/share/OpenCV/java/ 
app1.triggeroption=
```

## アプリ起動
```
java -Dfile.encoding=UTF8 -Djava.library.path=/usr/local/share/OpenCV/java/ -jar main.jar
```

## シリアルコード
```
/home/vstone/vstonemagic/update/lcc.conf
```

## edison wifi 設定
```
/etc/wpa_supplicant/wpa_supplicant.conf 
```
ダブルクォーテーション、シングルクォーテーション　違い

###　ダブルクォーテーション、シングルクォーテーション　違い
・ダブルクォーテーション　 ･･･ 文字列中の変数を変数値に置換する
・シングルクォーテーション ･･･ 文字列中の変数を変数値に置換しない

aに変数を入れる
[root@localhost order]# a=test

ダブルクォーテーション
aの変数が表示される
[root@localhost order]# echo "This is a $a"
This is a test

シングルクォーテーション
そのまま表示される
[root@localhost order]# echo 'This is a $a'
This is a $a
[メモ]ベアメタルにubuntu入れて苦しんだメモ

この記事は
===

* 久しぶりにVMじゃなくてベアメタルにUbuntu入れたら懐かしい感じに面倒なことになったのでグチっぽいメモです
* 備忘なので読む必要はありません

やりたかったこと
===

* ただ単にインターネットにつなぎたかったです

メディアにubuntuを焼けない
===

* 最近めっきりメディアにOSイメージ焼いたりしてなかったのですが、どうもうまくいかない
* 結局原因は下記です。無駄に時間をかけました。
    * 業務用のマシンだとセキュリティ製品が入っていて書き出し自体がうまく動かなくなっていたりします
    * セキュリティ製品と戦っても明らかに時間の無駄なので、きっぱりあきらめて自宅のマシンで焼きましょう
* ちなみに昔のMacではディスクユーティリティから焼いていましたが、今はisoイメージを右クリックして焼くみたいです
* 焼いたCDはMacからは認識不能でエラーがでますがそういうものなので気にしないようにしましょう

NICが認識されていない
===

* それでDVDからインストールしていたのですが、どうもネットワークがうまく認識されない
* とりあえず無視してインストールしきって```ifconfig -a```してみましたが、NICが認識されていないようです
    * どうもdriverが入っていない or 古いみたいですね。。。
* [こちら](http://rainbowdevil.jp/?p=1164)を参考にNICの型番が```I219-V```で、driverは```e1000e```であることを特定しました
* でもそもそもネットワーク繋がっていないから入手できない。。

USBメモリ経由でdriverを入手
===

* 仕方がないのでまた自宅マシンで[driver](https://downloadcenter.intel.com/ja/download/15817/-PCI-E-Linux-)を落としました
* linuxからusbメモリをマウントします
  * usbさす前と後で```fdisk -l```で増えてるデバイスを見つけるという原始的な方法
  * みつけたら普通にmountします
    * ```-t vfat```とかファイルシステムを指定しないとエラーになったりします
* で、なんとかdriverのファイルを入手して、[こちら](http://rainbowdevil.jp/?p=1164)の手順でsrcディレクトリで```make install```したのですが、そもそもmakeが入っていないと怒られました。。

インストールDVDからaptでmakeを入手する
===

* インストール時に本当に最低限しかパッケージを入れなかったので、後から追加で入れ込みます
* [こちら](https://www.hiroom2.com/2016/08/12/ubuntu-16-04-dvd%E3%81%8B%E3%82%89%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B/)を参考にcdromからaptできるように設定します
* 普通に```build-essential```入れてmakeを入手
* その上でdriverを```make install```
* 再起動して```ifconfig -a```で認識されている！

ネットワーク設定を追記
===

* ```/etc/network/interfaces```に下記を追記してnetworkingをrestart

```
auto eno1
iface eno1 inet dhcp
```

* インターネットつながったー

終わりに
===

* 無駄な時間をかけてしまった感がすごい
Kotlinでオプショナルな変数がnullだったらリターンする


`if (text == null)`とかでもよいのですが、もう少しKotlinぽくするなら、Elvis演算子を使用して次のように書くことができます。

```kotlin
fun showTextIfNotNull(text: String?) {
    text ?: return
    println(text)
}
```

`text ?: return`以降はSmart Castにより、変数`text`は非オプショナルとして使用できるので、アンラップの方法の一つでもありますね。
バイト列の一部に数字を埋め込む、埋め込まれている数字を取り出す

# バイト列の一部に埋め込む

``` 
import base64
import struct

arr = bytearray(base64.b64decode('base64文字列'))
arr2 = bytearray(struct.pack("<I", 1111))  <-- 埋め込みたい数字

arr[10] = arr2[0]
arr[11] = arr2[1]
arr[12] = arr2[2]
arr[13] = arr2[3]

base64.b64encode(arr)
```

* base64.b64decode の戻りは str
* str だと位置を指定した変更はできないので、bytearray に変換して一部分の変更をしてやる

# 埋め込まれたものを取り出す

```
import sys
import base64
import struct

print struct.unpack('<i', base64.b64decode(args[1])[10:14])[0] <--- args[1] は数字が埋め込まれたバイナリ文字列の base64 文字列
```

* str の一部分取り出しは str[0:4] とかで可能
* struct.unpack の戻りは tuple なので、最後に [0] をつけてやる
PostgreSQLで遅延制約を使って一意制約カラムを一括更新する

# 遅延制約

PostgreSQLで一意制約が設定されたカラムを一括UPDATEした際に、一意制約違反になったことありませんか？
今回、**遅延制約**という機能を使い、更新を実現する方法を紹介します。

例えば以下のようなテーブルとテストデータを用意し、一括更新してみましょう。

```sql
-- TABLE DEFINITION
CREATE TABLE posts(
    id integer NOT NULL,
    CONSTRAINT posts_pk PRIMARY KEY (id)
);

-- TEST DATA
INSERT INTO posts VALUES(1);
INSERT INTO posts VALUES(2);
INSERT INTO posts VALUES(3);

-- UPDATE
UPDATE posts SET id = id + 1;
```

すると、以下のようなエラーが発生します。

```sql
ERROR:  duplicate key value violates unique constraint "posts_pk"
DETAIL:  Key (id)=(2) already exists.
```

これは、PostgreSQLによってUPDATEが先頭から1件ずつ処理される為、`id=1->2`に更新される際に一意制約違反となる為です。
これを解消して更新を可能とするのが遅延制約(DEFERRABLE)です。

## 遅延制約の設定方法

遅延制約は、CREATE TABLE（またはSET CONSTRAINT）の際に設定する必要があります。
以下のようなテーブルを準備します。

```sql
-- TABLE DEFINITION
CREATE TABLE posts2(
    id integer NOT NULL,
    CONSTRAINT posts2_pk PRIMARY KEY (id) DEFERRABLE INITIALLY DEFERRED
);

-- TEST DATA
INSERT INTO posts2 VALUES(1);
INSERT INTO posts2 VALUES(2);
INSERT INTO posts2 VALUES(3);

-- UPDATE
UPDATE posts2 SET id = id + 1;
```

上記のクエリが正常に実行され、全件が正常にUPDATEされました。
`CONSTRAINT`として設定された`DEFERRABLE`によって、全件更新完了するまで一意制約が遅延された為です。
今回は`INITIALLY DEFERRED`句を使い、デフォルトで遅延制約を有効にしていますが、これを省略（または`INITIALLY IMMEDIATE`句を指定）した場合にはデフォルトで遅延制約が無効になります。

ここで指定可能な値は以下の通りです。

```sql
[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
```

## その他の使い方

### ユニーク制約で使う

遅延制約はユニーク制約でも使用可能です。

```sql
-- TABLE DEFINITION
CREATE TABLE posts3(
    id integer NOT NULL
);
-- ADD CONSTRAINT
ALTER TABLE posts3 ADD CONSTRAINT posts3_uniq_idx UNIQUE (id) DEFERRABLE INITIALLY DEFERRED;
```

また、遅延制約をデフォルトで無効（INITIALLY IMMEDIATE）にした際、クライアントセッション内で有効にする場合には以下の設定クエリを使用します。

```sql
SET CONSTRAINTS ALL DEFERRED;
```


詳細はPostgreSQLマニュアルをご参照ください。

- [CREATE TABLE](https://www.postgresql.jp/document/9.6/html/sql-createtable.html)
- [ALTER TABLE](https://www.postgresql.jp/document/9.6/html/sql-altertable.html)
- [SET CONSTRAINTS](https://www.postgresql.jp/document/9.6/html/sql-set-constraints.html)

## 最後に

遅延制約を設定する際は、必ず**制約の作成時**に設定する必要があります。
また対象テーブルでは`ON CONFLICT`句が使えなくなりますので、ご注意ください。
更新する可能性があるカラムにはお忘れなく！
macOS High Sierra (10.13) に Java2Python をインストールする

# 概要

macOS High Sierra (10.13) に Java2Python という言語トランスレータをインストールする手順を解説する．

# 動機

macOS に Homebrew で Python3 をインストールすると，どうも Xcode (Python 2.7) に付属の `pip` が腐るようだ．（詳しく調べたら治せるのだろうが，普段は Python 2.7 を使わないので放置していた．）

ところが Java2Python は Python 2.7 に依存しているので，`pip` を修復するか，`pip` を使わないインストール方法が必要になる．

# Java2Python のインストール方法

本稿では `pip` を使わないインストール方法を述べる．

以下，macOS High Sierra (10.13) に Xcode 9.0 がインストールされている前提で進める．

1. [antlr_python_runtime 3.1.3](https://pypi.python.org/pypi/antlr_python_runtime) から `antlr_python_runtime-3.1.3.tar.gz` をダウンロードする．
2. Tarボールを展開し `sudo python setup.py install` を実行する．
3. [java2python](https://github.com/natural/java2python) を clone する．
4. `sudo python setup.py install` を実行する．
[Practical BEAR.Sunday] 変数値を使ったオブジェクトの生成：ファクトリ、アシスティッドインジェクション

## はじめに

Ray.Di を使ったアプリケーションには２つのタイムステージがあります。

1. コンパイルタイム：PHPファクトリーコードの自動生成
2. ランタイム：アプリケーションの実行

コンパイルの対象になるのは、DIインジェクタに `束縛（bind）` の定義を知らせたサービスだけです。ソースコードを書いている時点で分かっている情報だけを使ってオブジェクトを生成できる場合は問題ありませんが、生成時に事前には分かっていない変数値を使いたい場合はどうするのが良いでしょうか？この問題に対する解決として、ファクトリとアシスティッドインジェクションを紹介し、それぞれ特徴を記します。

## 手組みによるファクトリ

`ファクトリ（Factories）` は、値オブジェクト、モデル／ドメインオブジェクト（エンティティ）や、パラメータ設定と依存を結び付けるオブジェクトの生成を行うためのパターンとして確立されています[※1]。たとえば、クラスが複数のパラメータを取り、DIインジェクタから得られるパラメータとそうでない（ランタイムの）呼び出し元から取るパラメータと両方が必要である場合について考えてみます。

```php
class RealPayment implements Payment
{
    public function __construct(
        CreditService $creditService,  // DIインジェクターから
        AuthService $authService,      // DIインジェクターから
        Date $startDate,            // インスタンスの生成元から
        Money $amount               // インスタンスの生成元から
    )
    {
        //...
    }
}
```

この問題に対して定番となっている解決方法は、DIで生成できるファクトリクラスを書くことです。

```php
class RealPaymentFactory implements PaymentFactory
{
    private $creditService;
    private $authService;

    /**
     * @Inject
     */
    public function __construct(CreditService $creditService, AuthService $authService) {

        $this->creditService = $creditService;
        $this->authService = $authService;
    }

    public function newInstance(Date $startDate, Money $amount)
    {
        return new RealPayment($this->creditService, $this->authService, $startDate, $amount);
    }
}
```

そして、モジュールで適切に束縛します。

```
  $this->bind(PaymentFactory::class)->to(RealPaymentFactory::class);
```

### 特徴

- 生成と実行の分離を保てる
- ボイラープレートの（定型的な）ファクトリクラスを書く必要がある

## アシスティッドインジェクション

Ray.Di にはメソッド実行時に依存を渡すことができる `アシスティッドインジェクション` [※2] があるので、これを利用するやり方も見ていきます。アシスティッドインジェクションを行うには、インジェクタに知られている引数に対して @Assisted アノテーションを付けて、引数リストの終わり（右）にこれを移動します。

```
class RealPayment implements Payment {

    /**
     * @Assisted({"creditServie"})
     */
    public function newInstance(
        Date $startDate,         // インスタンスの生成元から
        Money $amount,           // インスタンスの生成元から
        CreditServiceInterface $creditService = null    // アシストされる
    )
    {
        //...
    }
}
```

### メリット

- ボイラープレートのファクトリコードをなくすことができる

### 制約

- これは引数リストの終わりに対するアシストなので、複数パラメータを依存定義にしたい用途では利用できない。また、インターフェイスベースにしておく必要がある（アンターゲットバインドのアシストはできない）。

## BEARアプリケーションで変数値を使ったオブジェクト生成を行う場合について

実務レベルだとリソースやインターセプタが複雑な仕事を担うことがあります。このような場合は、サービスクラスをインジェクトして利用するパターンが有用です。サービスクラスの定義ではコンストラクタ引数に変数値を取りたいことがあります。コンパイルタイムで確定できる情報なのであれば、`インスタンス束縛` 、`コンストラクタ束縛`、`コンテンキストプロバイダ束縛` を利用できますが、実行時にしか変数値が決まらないケースでは上記の検討となります。ファクトリに `new` で生成させたサービスでは（コンパイル対象外なので）AOPが利用できなくなる点には留意が必要です。

## 補足：単純な値オブジェクトの場合

単純で `final` が付けられるような値オブジェクトであればコンパイル対象外としてユーザサイドで `new` して使う方が適切であることが多いでしょう。

## 引用記事

- [※1] [AssistedInject · google/guice Wiki](https://github.com/google/guice/wiki/AssistedInject)
- [※2] [BEAR.Sunday マニュアル - DI](http://bearsunday.github.io/manuals/1.0/ja/di.html),  [Ray\.Di（Github）](https://github.com/ray-di/Ray.Di/)
Visual Studio | WPF > 実装: デザイン時と実行時のウィンドウサイズの違いの対策 > XAML対応

```txt:動作環境
Windows 8.1 Pro (64bit)
Microsoft Visual Studio 2017 Community
Sublime Text 2
```

### 関連

- [Visual Studio | WPF > IDE > デザイン時と実行時のウィンドウサイズの違い](https://qiita.com/7of9/items/e87e80e6716268eb78aa)
- [Different size form WPF - Design mode vs Runtime mode](https://stackoverflow.com/questions/34718588/different-size-form-wpf-design-mode-vs-runtime-mode)
- [C# WPF different size from IDE after debugging?](https://stackoverflow.com/questions/15710176/c-sharp-wpf-different-size-from-ide-after-debugging)

WPF特有の問題なのか、デザイン時と実行時にウィンドウサイズが異なる。
一方で、コントロールの配置は保持されるようで、コントロール右と下のマージンがおかしくなったソフトになる。

### 対策

[Visual Studio | WPF > SizeToContent="WidthAndHeight" > 内容に応じてウィンドウサイズを変更してくれる](https://qiita.com/7of9/items/afa93bc4dfa1f39b8621)
を使う。

XAMLで以下のように記載する。

1. Gridの中にGridを作る
   - 元にあるGridと同じデザイン時のサイズにするが、
   - GUIで元のGridと同じサイズにするとWidthとHeight属性の表記が消失するため手入力する。
   - デザイン時のサイズに合うように目視しながらWidthとHeightの値を決める
        - 適当なサイズのGridを配置した上で、表示されるマージン値を参考に再度サイズを手入力してもよい
        
2. コントロールを配置していく

### コード例

```MainWindow.xaml
<Window x:Class="_171207_t0936_controlLocation.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:_171207_t0936_controlLocation"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525"
        SizeToContent="WidthAndHeight">
    <Grid>
        <!-- 実行時とデザイン時のウィンドウサイズの違い回避のため、-->
        <!-- SizeToContent=WidthAndHeightと合わせて -->
        <!-- 下記のGrid内でコントロールを配置すること -->
        <Grid Height="320" Width="515" Margin="0,0,0,0">
            <Button Content="Button" HorizontalAlignment="Left" 
                    Margin="430,10,0,0" VerticalAlignment="Top" Width="75"/>
        </Grid>
    </Grid>
</Window>
```

### デザイン時

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/5d100354-d3eb-aa4d-c3bd-e8701863fb6c.png)

### 実行時

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/27b73723-3e3e-1027-e241-db498554c5f0.png)

### 備考

日々様々なデザイン資料を作っているような人たちはピクセル単位での違和感を感じるかもしれない。

その他、多くのユーザに対しては違和感は少ないだろう。
PhotoView

# PhotoView
ImageViewを簡単にズームできるようにするライブラリらしい...
https://github.com/chrisbanes/PhotoView

## 準備
githubの説明通り通り、build.gradleに記述

```java:build.gradle

allprojects {
	repositories {
        maven { url "https://jitpack.io" }
    }
}

```
Moduleのbuild.gradleにも記述(そのままだとエラー吐くので修正)

```java:build.gradle
dependencies {
    compile 'com.github.chrisbanes.photoview:library:+'
}
```

## レイアウト

```java:activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <uk.co.senab.photoview.PhotoView
        android:id="@+id/photo_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>
```

## Activity
```java:MainActivity
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        PhotoView photoView = view.findViewById(R.id.photo_view);
        photoView.setImageResource(R.drawable.image);
    }
}
```

## 感想
* PhotoViewはImageViewを継承していて、ImageViewと同じ感覚で使用できるので使いやすい
* ライブラリ自体のコード量もそこまで多くないので構造を理解すれば自分でも似たようなものを作れそう
* 技術としては古いのに参考資料が少ないのはなんでだろう...