OmniAICreator/Qiita-1.07M huggingface dataset:
Android Enterprise (旧Android for work)って何

# 簡単に言うと
- 企業で社員にAndroid使わせる時に、そのAndroidの管理に使うGoogleが提供してる仕組み。無償ね。
- 仕組み自体はGoogleが提供してるけど、実際に使う場合はサードパーティ製のMDM (Mobile Device Management)サービスが必須ね。これは有償。
    - MDMとしての有名どころはWorkspaceONE UEM(旧AirWatch)、mobileiron、intune、国産だとCLOMOあたり。iOSやAndroidが実質バージョン固定できなくて、どんどん勝手にVersionUPが走るから、開発力が弱いMDMベンダーは追随できなくて正直しんどい。
- これらのMDMにAndroid端末を登録する時に、Android Enterpriseモードで登録する。Android Enterpriseじゃないモードで登録することもできるけど、GoogleがAndroid9.0以降はAndroid Enterpriseに一本化するよ(それ以外のモード使わせなくするよ)とアナウンスしたので実質Android Enterprise必須な。
- 実はAndroid Enterpriseの中にも2つの登録モードみたいなのがあるよ。Work Profile と Fully Managed の2つね。

# Work Profile
- 主にBYOD (Bring Your Own Device:私物デバイスを(業務に)持ってこいや!の略) で使われるよ。
- 私物のAndroidを会社のMDMにWork Profileモードで登録して使わせるよ。
- MDMからアプリをリモートで配ったりリモートで消したりできるよ。例えば、会社の情報が入っているメールアプリやファイルサーバにアクセスできるようなアプリをMDMから配って、紛失時や盗難時にはそのMDMから配られたアプリだけをリモートで消す、みたいな運用ができるね。
- とはいえ私物なんで、荒野行動入れて遊ぼうがDropBoxやGoogle Drive入れようが、どう使おうとMDMは検知すらしないよ
- Dropboxに会社のデータ移されたらアカンやんけ! → 大丈夫、会社データが見られるアプリと私物アプリの間はデータの受け渡しやコピペ、スクリーンショット含めて制御できるから
- ほなBYODやなくて、社給端末をWork Profileで使わせたらエエやんけ! → 別に良いんだけど、Work Profileだと紛失時のリモートロックとかデバイスワイプとか、企業が結構欲しがる機能が使えないんだよね。ワイプできるのはあくまでMDMから配ったアプリとデータだけ。まぁ個人的にはそれで十分じゃね?とも思うんだけど、リモートロックもできないってのはやっぱりちょっと痛いよね。

# Fully Managed
- 企業の社給Androidを管理するときは、こっちを使うことが多いね。
- Work Profileより端末をガチガチにできるよ。その分ユーザの自由度は低いけどね。
- 完全な社給なんで、ユーザー勝手にアプリをインストールすることすらできないよ。**ストレスだね。**
- もちろんその分セキュリティレベルは高いよ。モートロックやリモートワイプもできるし。
- でも、IT部門って結構おじさんじゃん? 若いスマホネイティブ世代の子が、これのアプリ使えば移動時間中にスマホでこれできるのにとか、このアプリ使えばここの生産性上がるのにとか思っても、いちいちITに申請して説明しないとそのアプリ使えないっての結構いやだよね。会社としての魅力ダウンだよね。いや割とマジで。
- セキュリティガチガチにした結果、スマホであることのメリットが死んでガラケーと同じような機能しか残らないってのは結構あるある。

# まとめ
ここまで書いといて何だけど、最新のAndroid 8.0だとWork ProfileとFully Managedのいいとこ取りをする第三のモードが使えるようになってるらしいよ。**Fully Managed Device with a Work Profile**ってやつ。セキュリティと自由度を両立させようと思ったら、今後はこれがよさげかもね。
https://developers.google.com/android/work/overview#company-owned-devices-for-knowledge-workers
Android8.0以上で、かつMDM側も対応してないと駄目だから、普及はもうちょっとだけ先かもね。
Buffalo WZR-HP-AG300HにLG L-03D USBドングルを接続して利用する

##前提条件
BuffaloのルーターにはUSBポートを持つものがありますが、同社の[対応USB用データカード一覧](http://buffalo.jp/taiou/kisyu/item/datacard/)や[価格コムの口コミ](http://bbs.kakaku.com/bbs/K0000387142/SortID=15018527/)を見る限りでは、NTTドコモのL-03D USBドングルで利用できる実績がありませんでした。

今回は、ファームウェアにOpenWRT(LEDE)を利用することで、L-03Dを動作させることを目標にします。

##LEDEを採用
OpenWRTの最新版は18ですが、udevの削除まわりが影響しているのかうまくいきませんでしたので、今回OpenWRTと統合する前のLEDE 17を利用します。

利用したバージョン：[lede-17.01.6-ar71xx-generic-wzr-hp-ag300h-squashfs-factory.bin](https://downloads.openwrt.org/releases/17.01.6/targets/ar71xx/generic/lede-17.01.6-ar71xx-generic-wzr-hp-ag300h-squashfs-factory.bin)
（私は純正ファームやDD-WRTなどを入れて何度か文鎮化させましたので、これではなく[tftpイメージ](https://downloads.openwrt.org/releases/17.01.6/targets/ar71xx/generic/lede-17.01.6-ar71xx-generic-wzr-600dhp-squashfs-tftp.bin)を使いました)
##パッケージのインストール
参考：https://openwrt.org/docs/guide-user/network/wan/wwan/3gdongle

```bash
# opkg update
# opkg install comgt kmod-usb-serial kmod-usb-serial-option kmod-usb-serial-wwan kmod-usb-usb-modeswitch
# opkg install udev usbutils luci-proto-3g
# lsusb
BUS 002 Device 001: iD 1d6b:0001 Linux Foundation 1.1 root hub
BUS 001 Device 003: ID 1004:6326 LG Electronics, Inc.
BUS 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
```
まずはUSBデバイスとしての認識に成功しました。プロダクトIDも0x6326ですので、CDROMデバイス(0x6327)ではなくモデムデバイスとして認識されていることがわかります。しかし、/dev/USBtty*はまだ出てきません。

そこで、下記のファイルを生成・追加します。

```bash:/etc/udev/rules.d/50-l3d.rules
ATTRS{idVendor}=="1004", ATTRS{idProduct}=="6326", RUN+="/sbin/modprobe usbserial vendor=0x1004 product=0x6326"
```

```bash:/etc/modules
usbserial vendor=0x1004 product=0x6326
```
どちらが功を奏したのかはいまいちわかりませんが、これでttyUSB*が生成されるようになりました。

## IIJmioの接続設定

```bash:/etc/config/network
config interface '3g'
option proto '3g'
option service 'umts_only'
option apn 'iijmio.jp'
option username 'mio@iij'
option password 'iij'
option device '/dev/ttyUSB2'
option ipv6 'auto'
option dialnumber '*99***1#'
option metric '0'
```

##Luciから設定変更
参考にしたのは[こちらのブログ](http://yokb.blogspot.com/2015/10/wzr-hp-ag300h-openwrt-l-02cwan3g.html)です。すでに/etc/config/networkに設定した内容でLuci GUIでも3Gインタフェースが表示されているので、

* Network-Interfacesに3Gがあることを確認する
* Firewall Settingで3GのFirewall ZoneをWANに所属させる
* InterfacesのWANポート、WAN6ポートをStopする

これで3Gがリンクするようになりました。

##再接続に失敗する挙動を修正する
参考にしたのは[こちらのWiki](https://www57.atwiki.jp/ddwrt_openwrt/pages/53.html)です。GUIやifup 3gで再接続するように

* /etc/chatscripts/3g.chat のOK”ATD\$DIALNUMBER” を OK"ATHD\$DIALNUMBER"に変更する
* Luciの3G設定- Advanced Settingにて、LCP echo failure threshold, LCP echo interval, Inactivity timeoutを空欄にセットする

これで、Buffaloのルータで、LTE回線をアップリンクとして動作させることができました。
【SELv.UP 日記】Word相互参照の設定方法【備忘録】

入社して３年目で、ろくにWordを使用出来ていないので、
これから自分なりに備忘録を残していきます。

参考になれば幸です。

今回は、Microsoft Wordの相互参照の設定方法についてです。

最近、システムエンジニアにStep UPするために仕事で、軽微な設計に関わっているのですが、
最近、レビューで、「参照している見出し番号は相互参照にしておいて」と指摘が。
今後、設計書の改定がある可能性があり、修正した場合に、見出のズレが生じるため
相互参照にするべきだとのこと。
（約２年設計に関わってきたのに初めて知った、、、）

相互参照は下記手順で設定できる
１．挿入→相互参照をクリック
２．参照する項目を選択
　　　いくつかあるので必要な項目を選択する。今回私は「見出し」を選択。
３．相互参照の文字列を選択
　　　こちらもいくつかあるので必要な項目を選択する。今回は「見出し文字列」を選択。
４．見出しの参照先を選択する
　　　例えば、　『１．１初期画面を表示する』を参照したい場合は、
　　　『１．１初期画面を表示する』を選択する。
５．「挿入」をクリック

今回の設定では、「１．１」のような見出しの文字列が挿入される。
この相互参照リンクにカーソルを合わせ、Commondキーを押しながらクリックすると
指定の見出しにジャンプします。
めっちゃ便利だと初めて気づいた！！

ただ、一点注意することが、、、
wordに見出しを追加した場合に以前に追加した相互参照リンクの見出しがズレた場合、
フィールドの更新をしないとリンク切れでジャンプしないです。
相互参照を設定している資料は、保存前に「Command」+「a」で全選択し、
右クリック→フィールドの更新をして相互参照リンクの最新化を心がけましょう！

相互参照の設定方法について調べていると、他にもいろいろと知らないことが
いろいろとあったので、また今度使用する機会があれば、
備忘録として残していこうと思います。

まだまだ、システムエンジニアの修行はまだまだ続く！！

参考リンク
・「相互参照」が便利な理由
　https://news.mynavi.jp/article/wordtech-31/
・Wordで相互参照を設定したい | DTPサポートサービス
　http://dtp.screen-cre.co.jp/dtp0005/
Elixirでコンパイル時にStruct/Mapを生成して埋め込む方法

コンパイル時に外部ファイルなどからデータを取ってきて，それを元にStructなりMapなりを生成して実行ファイルに混ぜ込みたいということがあります．

そういうときは以下のようにすれば良いです：

~~~sample.ex
defmodule Hoge do
  defmacro generate_map do
    map = File.read!("./sample.json") |> Poison.decode!
    
    Macro.escape(map)
  end
end

defmodule Sample1 do
  require Hoge

  def cached_file do
    Hoge.generate_map
  end

  def main do
    IO.inspect(Sample1.cached_file)
  end
end
~~~

~~~shell-session
iex(1)> Sample1.main
%{"age" => 34, "name" => "John Smith"}
%{"age" => 34, "name" => "John Smith"}
~~~

`generate_struct` の最後にある `Macro.escape(map)` がミソで，これによってMapをASTに変換して実行ファイルに埋め込んでいます．

もちろん `map = File.read!("./sample.json") |> Poison.decode!` の部分には好きな処理を書くことができます．
例えばJSON APIのリクエストを叩いてその結果を埋め込むこともできます：

~~~sample.ex
defmodule Fuga do
  defmacro generate_map do
    HTTPoison.start
    map = HTTPoison.get!("https://jsonplaceholder.typicode.com/todos/1").body |> Poison.decode!

    Macro.escape(map)
  end
end

defmodule Sample2 do
  require Fuga

  def cached_http_call do
    Fuga.generate_map
  end

  def main do
    IO.inspect(Sample2.cached_http_call)
  end
end
~~~

~~~shell-session
iex(1)> Sample2.main
%{
  "completed" => false,
  "id" => 1,
  "title" => "delectus aut autem",
  "userId" => 1
}
%{
  "completed" => false,
  "id" => 1,
  "title" => "delectus aut autem",
  "userId" => 1
}
~~~

参考： https://elixirforum.com/t/understand-macro-escape/405/2
sh、python などに実行させたいコマンド（文字列）を指定するオプション -c、 -e

こんにちは。
```sh```, ```python``` などに、動かしたいコマンド（文字列）を指定して実行させる場合、指定する際のオプションは、```-c```、 ```-e```、無しがあるようです（下記例）。

```console
$ sh -c 'command'
$ python -c 'command'
$
$ perl -e 'command'
$ ruby -e 'command'
$ osascript -e 'command'
$
$ awk 'command'
$ jq 'command'
```

* ワンライナーで多用しますが、```-c``` と ```-e``` を取違いしやすいのですが、そもそもなぜ複数種あるのか不思議に思っています。

なお上記例では、コマンド（文字列）をシングルクウォートで括っていますが（```'command'```）、シェルによって外されます[^1]：

```console
$ echo 'command'
command
```

[^1]: シングルクウォートで括ると、シェルが文字通りに解釈してくれます。ただし、シングルクウォート文字を使うことはできませんので、その場合は、ダブルクウォートで括る必要があります。
アノテーションツール(正解入力ツール)が進化している。 2


[アノテーションについて調べてみる](https://qiita.com/nonbiri15/items/9a47c0568da351b197d7)から、アノテーションツールの記事を独立させました。



### Image annotation tool in OpenCV
YouTube [Image annotation tool in OpenCV(python)](https://www.youtube.com/watch?v=-0QIr6Nv1Yo)

https://github.com/opencv/opencv/tree/master/apps/annotation

https://github.com/opencv/opencv/blob/master/apps/annotation/opencv_annotation.cpp

上記のソースコードを読むかぎり、PASCAL VOC のXMLフォーマットやjsonフォーマットではなく、スペース区切りテキストとして保存するものです。
ですから、アノテーションツールのサンプルとしてみれば良さそうです。

機械学習の中で使われる標準的なデータ形式をサポートしているものを最初から使えば十分でしょう。


---


### [Computer Vision Annotation Tool (CVAT)](https://github.com/opencv/cvat#computer-vision-annotation-tool-cvat)

OpenCVがCVATというアノテーションツールを配布している。

Youtube [CVAT 0.2.0 - annotation mode](https://www.youtube.com/watch?v=6h7HxGL6Ct4&feature=youtu.be)

アノテーションは、長方形で指定する場合と、折れ線で領域を指定するのを選べます。
従来の検出では、対象物と背景とをまとめて長方形で領域指定していましたが、それだとどこまでが、対象物なのかを指定できていません。このモードでは、折れ線で領域を指定することで、対象物を指定することができます。


[CVAT 0.2.0 - interpolation mode](https://www.youtube.com/watch?v=U3MYDhESHo4&feature=youtu.be)

動画に対してアノテーションする際に、全部のフレームに正解枠をつけるの大変です。このツールでは、あるフレームで正解枠をつけたら、数フレーム後の画像で正解枠を移動してつけます。それをさらに数フレーム後の画像で正解枠を移動してつけます。それらを繰り返します。そうすると、そのあとで、一連のフレームに対して、正解枠の補間をしてくれるとのことです。

こういった作業を、対象のオブジェクトごとに繰り返します。そうすることで、正解枠のアノテーションの作業を楽にする。


[CVAT 0.2.0 - attribute mode](https://www.youtube.com/watch?v=UPNfWl8Egd8&feature=youtu.be)
年齢、性別、メガネの有無などを画像にアノテーションをつけることができます。



[CVAT 0.2.0 - segmentation mode](https://www.youtube.com/watch?v=6IJ0QN7PBKo&feature=youtu.be)

アノテーションをセグメンテーションでつけることができるモードです。セグメンテーションとは、領域をpixel単位に指定するやり方です。空・森林・道路・芝生・建築物を指定することができます。




-----

最近にアノテーションでは、
セマンティックセグメンテーションのアノテーションになってきています。


[セマンティックセグメンテーションのアノテーションツールlabelme](https://qiita.com/kouki_outstand/items/7b7597f271beca0051e5)


## [VoTT（Visual Object Tagging Tool）の紹介記事](https://www.softbanktech.jp/service/list/ms-azure_blog/ms-azure_blog_0086/)


Githubによれば、出力データ形式は以下のものがサポートされている。
> Exporting tags and assets to Custom Vision Service CNTK , Tensorflow (PascalVOC) or YOLO format for training an object detection model.

Camshift tracking algorithm. を使って追跡をするので、追跡した結果の枠を修正すれば済むのが利点です。


### VoTTの利用記事

- [VoTTで鬼畜作業](https://qiita.com/mokoenator/items/4d106d682f1b4bc7d0e3#vott%E3%81%A7%E9%AC%BC%E7%95%9C%E4%BD%9C%E6%A5%AD)

- [VoTTを使って超お手軽に画像のタグ付け～ChainerCVのデータセット変換まで](https://qiita.com/yoshizaki_kkgk/items/20d4061529471c3f06c8)

- [VoTTでのタグ付け作業の簡単化](https://teratail.com/questions/143925)
- [VoTTでラベル付けしたJSONをAWS SageMaker用に変換する](http://thr3a.hatenablog.com/entry/20180903/1535978036)
-
【PHP】extendsで親クラスの__constructメソッドが呼び出せていない場合の対処法

## 結論
- 子クラスの__construct()が親クラスの__construct()をオーバーライドしているのが原因。
- parent::__construct();を子クラスの__construct()に書けばおｋ

## 事象
### 内容
以下のように親クラス、子クラスどちらにも__construct()がある場合、
そのままだと親クラスの__construct()が読み込まれない。

```php
<?php

class ParentClass {

  public function __construct() {
    define('SOMETHING',"this is something.");    
  }

}

class ChildClass extends ParentClass {

  public function __construct() {
    define('OTHERTHING',"this is otherthing.");    
  }

  public function exec() {
    echo SOMETHING;
    echo "\n";
    echo OTHERTHING;
  }

}

$Child = new ChildClass();
$Child->exec();

```

```bash:期待する結果
this is something.
this is otherthing.
```


```bash:実際の結果
this is something.

```

### 原因
親クラスの__construct()を子クラスの__construct()がオーバーライドしたことで、
親クラスの__construct()が打ち消されてしまっている。

### 対処法
以下のように明示的に親クラスの__construct()を呼び出す必要がある。

```php
parent::__construct()
```


```php:変更後
<?php

class ParentClass {

  public function __construct() {
    define('SOMETHING',"this is something.");    
  }

}

class ChildClass extends ParentClass {

  public function __construct() {
    parent::__construct();
    define('OTHERTHING',"this is otherthing.");    
  }

  public function exec() {
    echo SOMETHING;
    echo "\n";
    echo OTHERTHING;
  }

}

$Child = new ChildClass();
$Child->exec();

```


```bash:結果
this is something.
this is otherthing.
```
ElixirでTable Driven Testを書く

[fukuoka.ex](https://fukuokaex.connpass.com/)代表のpiacereです
今回もご覧いただいて、ありがとうございます:bow:

[Go言語では、ポピュラー（？）らしい「Table Driven Test」のコラム](https://qiita.com/yut-kt/items/5f9eb752f40d4d2a2e97)をたまたま読み、Elixirでも似たようなこと、サクッとできるよなー、と思い、書いてみました

# まずは実装

```elixir
defmodule Sample do
	def fee_from_age( age ) when age <= 12, do: 1000
	def fee_from_age( _ ), do: 2000
end
```

ガード節でシンプルに書け、本体は、2行で終わりです

# 次に普通のテスト

```elixir
defmodule Sample do
	@doc """
	## Examples
		iex> if Sample.fee_from_age( 10 ) != 1000, do: "The judgment of fee is wrong"
		nil
		iex> if Sample.fee_from_age( 20 ) != 2000, do: "The judgment of fee is wrong"
		nil
	"""
	def fee_from_age( age ) when age <= 12, do: 1000
	def fee_from_age( _ ), do: 2000
end
```

doctestで、実装と並べて書けるので、アッサリ終わります

# Table Driven Testでテストを書き換える

```elixir
defmodule Sample do
	@doc """
	## Examples
		iex> [ 
		...>   %{ "age" => 10, "fee" => 1000 }, 
		...>   %{ "age" => 20, "fee" => 2000 }, 
		...> ] |>
		...> Enum.map( fn %{ "age" => age, "fee" => fee } -> 
		...>  if Sample.fee_from_age( age ) != fee, do: "The judgment of fee is wrong" end )
		[ nil, nil ]
	"""
	def fee_from_age( age ) when age <= 12, do: 1000
	def fee_from_age( _ ), do: 2000
end
```

Qiitaでの見やすさのため、テストコードを5回、改行していますが、正味は4行で終わります

Enum.mapでの、リスト処理と、パターンマッチによるマップ分解は、実にエレガントです

# 終わり

Elixirの記述性の高さと、テストをアッサリ書ける魅力、伝わりました？

# p.s.「いいね」よろしくお願いします

ページ左上の ![image.png](https://qiita-image-store.s3.amazonaws.com/0/155423/4d515047-cc48-382e-c2b1-3ad0cc50dbbf.png) や ![image.png](https://qiita-image-store.s3.amazonaws.com/0/155423/a4e3da58-70a3-4197-95a2-6a6906650d01.png) のクリックを、どうぞよろしくお願いします:bow:
ここの数字が増えると、書き手としては「ウケている」という感覚が得られ、連載を更に進化させていくモチベーションになりますので、もっとElixirネタを見たいというあなた、私達と一緒に盛り上げてください！:tada:
LaravelのSlack Notificationにproxyを通す

Slack NotificationでProxyを使うには？

#はじめに
Laravel付属のSlackの通知を仕組みを使おうと思ったら、proxyに阻まれました。Slack通知にproxyを設定をする方法をメモっておきます。

#使ったもの

```
php artisan --version
Laravel Framework 5.4.32
```

#答え
このように書くのが正解。SlackMesasgeクラスに```http```メソッドがあった。

```php
return (new SlackMessage)
        ->success()
        ->content('message')
        ->http( $guzzle_option );
```

https://github.com/laravel/framework/blob/cc8c84c02f8b24f2619318024301e0f207a46c2c/src/Illuminate/Notifications/Messages/SlackMessage.php#L267

Guzzleのオプションの組み立て方は、こちらへ
http://docs.guzzlephp.org/en/stable/request-options.html#proxy


#調べたこと

##まずはエラーメッセージ
Slackに投げてみたらこんなエラーが。。。Slack通知は内部的に```Guzzle```を使っているのだけど、```SlackMesasge```を組み立てる過程では```Guzzle```のインスタンスは出てこない。どうしたものか。。。

```
  [GuzzleHttp\Exception\ConnectException]
  cURL error 7: Failed to connect to hooks.slack.com port 443: Timed out (see http://curl.haxx.se/libcurl/c/libcurl-errors.html)
```

##ヒント見つけた
ググってたらこのスレッドにたどり着き、
https://github.com/laravel/framework/issues/15837

そしてここにたどり着く
https://github.com/laravel/framework/pull/15882

SlackMessageに```options```メソッド。。だと。早速、実行してみると、

```
[Symfony\Component\Debug\Exception\FatalThrowableError]
  Call to undefined method Illuminate\Notifications\Messages\SlackMessage::options()
```

なんでや。

履歴を追いかけたらわかりました。
昔は```options```という名前だったのですが、今は```http```というメソッド名前になったようです。


#参考にした資料

**LaravelでSlack通知を実装する～ソーシャルではなく開発者/管理者としてのSlack通知～**
https://www.ritolab.com/entry/110

**Laravel5.3 NotificationsでSlackに通知してみる**
https://qiita.com/amymd/items/2616368bf3969ecb1aaf
Pythonの決定木をdtreevizでスマートに可視化する

# はじめに

決定木は、説明可能性が高く有用な手法なのですが、pythonにおいては可視化がいまいちなため、選択肢に入りにくくなっていたと個人的に思います。
そんな中、dtreevizというライブラリが公開され、綺麗に可視化できるようになったよ！って話。

# python決定木可視化のBefore/After

先にどのように変わったのかを示した方が分かりやすいので、irisデータを使った決定木の例。

```python:決定木を学習
from sklearn.datasets import load_iris
from sklearn import tree

clf = tree.DecisionTreeClassifier(max_depth=2)  # limit depth of tree
iris = load_iris()
clf.fit(iris.data, iris.target)

```

## Before

おそらくメジャーなgraphvizでの可視化

```python:graphvizによる決定木可視化
import pydotplus
from IPython.display import Image
from graphviz import Digraph

dot_data = tree.export_graphviz(
    clf,
    out_file=None,
    feature_names=iris.feature_names,
    class_names=iris.target_names,
    filled=True,
    proportion=True)
graph = pydotplus.graph_from_dot_data(dot_data)
Image(graph.create_png())
```

<img src=https://qiita-image-store.s3.amazonaws.com/0/221698/2f7d675f-0e7f-0169-51f3-52d332ccaee0.png width=50%>

## After

dtreevizだとこんな感じ

```python:dtreevizによる可視化
from dtreeviz.trees import dtreeviz

viz = dtreeviz(
    clf,
    iris.data, 
    iris.target,
    target_name='variety',
    feature_names=iris.feature_names,
    class_names=[str(i) for i in iris.target_names],
) 
              
viz.view()
```

![dtreeviz.png](https://qiita-image-store.s3.amazonaws.com/0/221698/fb680482-7684-163c-fdce-536ba2f77394.png)

# dtreevizで変わったところ

- とにかくデザインがオシャレになった
 - このまま説明資料に使えそう 
- 分類に使用される特徴量の分布と決定境界が示されるようになった
- 葉の詳細な純度が落ちた代わりに、円グラフによる構成比で分かりやすくなった

- サンプルデータを与えると、推論の過程と根拠となる特徴量を表示することができる

```python:決定木推論過程の可視化
X = iris.data[29]  # サンプルデータ

viz = dtreeviz(
    classifier,
    iris.data, 
    iris.target,
    target_name='variety',
    feature_names=iris.feature_names,
    class_names=[str(i) for i in iris.target_names],    
    X=X, # サンプルデータを与えると、分類の過程が表示される
) 
              
viz.view()
```

![dtreeviz2.png](https://qiita-image-store.s3.amazonaws.com/0/221698/76392959-02c5-311a-2c0a-8cf03bbe1f5c.png)


ちなみに、ここまでは分類木の例だけでしたが、回帰木の可視化もできます。
（ただ回帰木を積極的に使う機会はあまりないですね・・・。）

# dtreeviz関数の引数

|引数|型|デフォルト値|説明|
|:-------------|:------------:|:------------:|:-------------|
|tree_model|||sklearnのDecisionTreeRegressorかDecisionTreeClassifier|
|X_train|(pd.DataFrame, np.ndarray)||モデル訓練に使用した説明変数データ|
|y_train|(pd.Series, np.ndarray)||モデル訓練に使用した目的変数データ|
|feature_names|List[str]||X_trainの各特徴量名|
|target_name|str||目的変数の名前|
|class_names|(Mapping[Number, str], List[str])||(分類木の時必須)各クラスに対応する名前|
|precision|int|2|特徴量の境界値を表示する小数点以下の桁数|
|orientation|('TD', 'LR')|'TD'|木が分岐する方向 TD: top-down or LR: left-right|
|show_root_edge_labels|bool|True|ルートからノードへの分岐の値関係を表示するか|
|show_node_labels|bool|False|ノード番号を表示するか|
|fancy|bool|True|特徴量の決定境界を可視化するか|
|histtype|('bar', 'barstacked')|'barstacked'|分類木の時、ヒストグラムの表示形式|
|X|np.ndarray|None|推論過程を可視化するサンプルデータ|
|max_X_features_LR|int|10|orientation='LR'の時、表示するサンプルデータの特徴量数|
|max_X_features_TD|int|20|orientation='TD'の時、表示するサンプルデータの特徴量数|

# 注意

jupyter labやgoogle colabの場合は、viewが使えないようなので、`display(viz)`で可視化してあげる必要があります。

# 参考

 - [dtreeviz : Decision Tree Visualization](https://github.com/parrt/dtreeviz)
 - [決定木の可視化ライブラリ「dtreeviz」が凄かったのでまとめる](http://st-hakky.hatenablog.com/entry/2018/09/30/172910)
header関数について

#header関数とは
header関数とは、HTTPヘッダを送信することです。
HTTPヘッダーとは、どのようなリクエストを受けて提案するかという流れを表しています。

つまり、どのようなコンテンツを受け取るかを定めたものだといえます。

ここで重要なのは、header関数はHTMLやPHPからの出力に関係なく、すべて出力前にコールする必要があることです。
include関数やrequire関数といったエラーが出てしまい、header関数の前に出力してしまうのです。

コードは次のように入力します。
<?php

header('Location : 「サイト名」')
exit;

?>

また、HTTPヘッダを定義付けるためのコードは、以下の通りです。

<?php
header($ヘッダ文字列 [, bool $replace = true[, int $http_response_code]])
?>

ヘッダ文字列とは、"http://"から始まるヘッダを使用する場合に使います。
また、LocationヘッダとURLを指定すると、指定したURLのブラウザ表示させることができます。
replaceオプションは、前に送信された類似のヘッダを置き換えるかについて、定められます。
そして、$http_responce_codeは、強制的に指定した値に設定できます。
ColdFusionのWeb REPLが超便利

##はじめに
ColdFusionのコード(CFML)をオンラインで動かしてみたりできちゃうサービスを紹介します。

ColdFusion(CFML)をちょっと触ってみたいけど、環境作るの面倒・・・なんて向きにぴったり！
既にCFerの方も、ちょっとしたスニペットの共有なんかに使えるのではないでしょうか。

私が探した限りでは、以下の2つがあるようです。

- CFFiddle
- TryCF


以前Qiitaに投稿した、正規表現のコードで試してみました。
[【ColdFusion】正規表現で部分文字列を取得](https://qiita.com/namitan/items/833338bc3ccd1ce45c89) [^1]
[^1]: この記事、「ColdFusion 正規表現」でググると1番目に出てきてビビった・・・書いた当初は3番目くらいだったのに。

##[CFFiddle](https://cffiddle.org/)
JSFiddleみたいなネーミングですね。エンジンはCF2016とCF2018が選べます。

![2018-11-09_172955.png](https://qiita-image-store.s3.amazonaws.com/0/106969/04db6c8e-d5ec-e303-5685-77b403fd0146.png)
https://cffiddle.org/app/file?filepath=2de412e8-437a-4c00-bc32-ba06b172b2b2/7b521187-8f8a-4136-bf9d-222e4f3def6d/9e2b61ef-7858-4769-9b9b-75c950fe4b2f.cfm


##[TryCF](https://trycf.com/)
こちらはCF10以降から選べます。RailoやLuceeも選択できちゃいます。
エディタのテーマも変更できます！
見た目がちょっと野暮ったいけど全画面表示にしてしまえば気にならない。

![2018-11-09_173054.png](https://qiita-image-store.s3.amazonaws.com/0/106969/cd0fe926-6669-199b-0b9e-a75a3533b91e.png)
https://trycf.com/gist/93a8906a03115a5d469085c30e6aefdc/lucee5?theme=monokai


##おわりに
実は私も上記の2つは最近知ったばかりですが、機会を見つけて使ってみたいと思います。特に複数のエンジンを切り替えできるのは便利そうです。
Swift 二つ前の画面に戻る方法


#二つ前の画面に戻る方法#
アプリ開発をしている際に
ホーム画面　→ メニュー画面　→ A(仮）画面へと遷移する流れが出来ており、A画面からメニュー画面ではなく、ホーム画面まで一気に戻る仕様にしたいので２つ前の画面に戻る方法を調べました。

復習としてこちらに書かせて頂きます。

<img width="750" alt="スクリーンショット 2018-11-10 0.08.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/282860/54acd043-ddba-b427-9bee-0d794c7f8d80.png">


こちらが使用した二つ前の画面に戻るコードです。
##presentingViewController##
presentingViewControllerというプロパティには、モーダル表示された遷移前の画面が格納されおり、上記の写真のように、presentingViewControllerを2回書いた場合は、2つ前のViewControllerを指定しています。なので上記のA画面からみて、２つ前のホーム画面を指定することができます。

##dismiss##

dismissは厳密には前の画面に戻るというメソッドではなく、ViewControllerを破棄するメソッドです。なので上記の場合、A画面でホーム画面を指定しています。そこでdismissを呼び出しているので、A画面とメニュー画面が破棄され、ホーム画面まで戻ります。

今後も使う機会がありそうなので忘れないようにしたいです！

下記のサイトを参考に書かせて頂きました。
https://yuu.1000quu.com/two_before_screen_return
laravelでQRコードを作ってbase64でエンコードする

最初は`werneckbh/laravel-qr-code`を入れたけど、
どうやら画像生成に特化しているようでQRコードを文字列で出力できなかった。
`simplesoftwareio/simple-qrcode`だと上手くいったので共有。

## インストール方法
* composer.jsonのrequireにパッケージを追加

```javascript:composer.json
"require": {
    "simplesoftwareio/simple-qrcode": "~2"
}
```
* laravelのディレクトリに移動して`composer update`を実行
* サービスプロバイダーとエイリアスを追加

```php:config/app.php
'providers' => [
    ...
    /*
     * Package Service Providers...
     */
     // 追加!!!
    SimpleSoftwareIO\QrCode\QrCodeServiceProvider::class,
],

'aliases' => [
    ...
    // 追加!!!
    'QrCode' => SimpleSoftwareIO\QrCode\Facades\QrCode::class,
],
```

## 使い方
* フォーマット指定->生成->base64化でOK

```php:SampleController.php
use SimpleSoftwareIO\QrCode\Facades\QrCode;

class SampleController extends Controller
{
    ...
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        $src = base64_encode(QrCode::format('png')->size(100)->generate('https://qiita.com/nobuhiro-kobayashi'));
        
        return response('<img src="data:image/png;base64, ' . $src . '">');
    }
}
```
* png以外でもsvgやepsにも対応している模様

## 参考サイト
[simple-qrcode](https://www.simplesoftware.io/docs/simple-qrcode)
ScalaのFutureで例外を飛ばす時の罠メモ

忘れやすいので記述。

### マル

```
Future.failed(new Exception)

Future(throw new Exception)
```


### ダメ

```
Future.failed(throw new Exception)

Future(new Exception)
```


### 理由

※コメントを頂き訂正しました

`Future` では `ExecutonContext` が求められるという差異もある。

#### `Future(throw new Exception)` recoverできる。
```
scala> val a = Future(throw new Exception)
a: scala.concurrent.Future[Nothing] = Future(<not completed>)
scala> val c = a.recoverWith{ case _ => Future("ok") }
c: scala.concurrent.Future[String] = Future(<not completed>)
scala> c
res15: scala.concurrent.Future[String] = Future(Success(ok))
```

#### `Future.failed(new Exception)` recoverできる。
```
scala> val e = Future.failed(new Exception)
e: scala.concurrent.Future[Nothing] = Future(Failure(java.lang.Exception))
scala> val f = e.recoverWith{ case _ => Future("ok") }
f: scala.concurrent.Future[String] = Future(<not completed>)
scala> f
res19: scala.concurrent.Future[String] = Future(Success(ok))
```

https://qiita.com/mtoyoshi/items/f68beb17710c3819697f#failed に書かれているような `Successful[Throwable]` を作るわけではなさそう？ `Failure[Throwable]` が作られている。


#### `Future(new Exception)` 引数に渡す地点でThrowが飛ぶ。 recoverできない。
```
scala> Future.failed(throw new Exception).recoverWith{ case _ => Future("ok") }
java.lang.Exception
  ... 28 elided
```

#### `Future(new Exception)` `Successful[Exception]` が返る。 recoverできない。
```
scala> val b = Future(new Exception)
b: scala.concurrent.Future[Exception] = Future(<not completed>)
scala> val d = b.recoverWith{ case _ => Future("ok") }
d: scala.concurrent.Future[java.io.Serializable] = Future(<not completed>)
scala> d
res16: scala.concurrent.Future[java.io.Serializable] = Future(Success(java.lang.Exception))
```
3 basic ways to use OpenStack interactively when you have a kolla environment

# 0. prelude
```
source /etc/kolla/admin-openrc.sh
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/12587/444d011b-c546-878c-dce3-7ee2f72d9a2a.png)


# 1. openstackclient

```
flavor list
server list
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/12587/b87c1063-5eda-4646-32ef-99f5f7aac057.png)

# 2. ansible-console

```
ansible-console
os_flavor_facts
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/12587/ce2815a9-9743-fd40-dc23-0111c791d41c.png)

# 3. openstacksdk

```bash
pip install ipython openstacksdk
ipython
```
ref:
https://docs.openstack.org/openstacksdk/latest/user/

```python
import openstack
conn = openstack.connect()
list(conn.compute.flavors())
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/12587/9d9d8b9b-ffec-72a9-5fec-db67b16a6780.png)

# The End
if you know other ways to do, please share your ideas with us.
Expressの冗長なエラー処理を簡潔にする

初投稿です。

今までExpressのエラー処理は以下のように書いてました。
（例：必須のリクエストパラメータのチェック）

```
const { username } = req.body;
if (!username) {
  const err = new Error('username is required');
  console.log(err);
  res.status(400).send({ error: err });
}
```

パラメータの個数分、同様の処理を書いていて冗長だなぁと感じていました。

## エラー処理ミドルウェア関数

[Express でのエラー処理](http://expressjs.com/ja/guide/error-handling.html)にエラーハンドリングの方法が書いてありました。

err, req, res, nextの4つの引数を持つミドルウェア関数を定義して、全てのミドルウェアの最後で呼び出します。

```
function logErrors(err, req, res, next) {
  console.error(err.stack);
  next(err);
}

function errorHandler(err, req, res, next) {
  res.status(500);
  res.send({ error: err });
}

app.use(logErrors);
app.use(errorHandler);
```

logErrors関数はエラーのログを出力します。
errorHandler関数はクライアントにエラーレスポンスを返します。

そして、エラーを投げる側ではnext関数にエラーオブジェクトを渡します。

```
const { username } = req.body;
if (!username) {
  const err = new Error('username is required');
  next(err);
}
```

これでエラーログ出力とエラーレスポンス返却をエラー処理ミドルウェアに任せることができました。

しかし、今のままではerrorHandlerで常にステータスコードが500のエラーレスポンスが返されてしまいます。なので、ちょっと変えます。

```
function errorHandler(err, req, res, next) {
  res.status(err.statusCode || 500);
  res.send({ error: err });
}
```

```
const { username } = req.body;
if (!username) {
  const err = new Error('username is required');
  err.statusCode = 400;
  next(err);
}
```

これでステータスコードが400のエラーレスポンスを返せるようになります。

## ステータスコードの設定

毎回、エラーオブジェクトにステータスコードを設定するのは面倒臭いです。
CustomErrorクラスかboomを導入すると、ステータスコードの設定が簡潔になります。

### CustomErrorクラス

```
class CustomError extends Error {
  constructor(message, statusCode) {
    super(message);
    this.statusCode = statusCode;
  }
}
```

```
if (!username) next(new CustomError('username is required', 400));
```

ワンライナーで書けました。


### boom

[hapijs/boom](https://github.com/hapijs/boom)
boomはHTTPのエラーオブジェクト返すモジュール群です。

```
Boom.badRequest('invalid query')
```

上のコードは以下のオブジェクトを返します。

```

{
    "statusCode": 400,
    "error": "Bad Request",
    "message": "invalid query"
}
```

コードを見ればどんなエラーかわかるのでいいですね。
badRequestの他にもunauthorizedやnotFoundなど基本的なエラーが揃っています。

boomを使って書くと、こうなります。

```
if (!username) next(Boom.badRequest('username is required'));
```

## まとめ

- エラーミドルウェア関数を用いることで、エラーログ出力とエラーレスポンスの返却処理を共通化することができました
- CustomErrorクラス（またはboom）を用いることで、ステータスコードの設定が簡単になりました

## 参考
- [Express 4.x - API リファレンス](http://expressjs.com/ja/4x/api.html#res)
- [Express でのエラー処理](http://expressjs.com/ja/guide/error-handling.html)
- [hapijs/boom](https://github.com/hapijs/boom)
C言語のポインタについて

## C言語のポインタについてさくっと確認する用

```c
#include <stdio.h>

int main(void)
{
  int a;
  a = 10;

  int *pa; // int型領域を指し示すアドレスを格納するための変数
  pa = &a; // 変数paに変数aのアドレスを代入

  printf("%d\n", *pa); // 変数paに入っているアドレスが指し示す領域のデータを出力
  return 0;
}
```

### 出力

```console
10
```
docker-machine上のdockerが突如動かなくなった時の対処法


## 事象
コマンドを何を打っても `x509: certificate has expired or is not yet valid` と言われる。`env` でも `ls` でもなんでも。

```
$ docker-machine ls
NAME    ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER    ERRORS
local   -        virtualbox   Running   tcp://192.168.99.100:2376           Unknown   Unable to query docker version: Get https://192.168.99.100:2376/v1.15/version: x509: certificate has expired or is not yet valid
```

## 解決法その１
VMとローカルの時刻がずれている。
ぐぐっても割とこの解決方法が出てくるのであるある事案っぽい。

```
sudo ntpdate ntp.nict.jp
```

適当にntpで時刻を合わせれば解決するときもある模様。今回は解決しなかった。


## 解決策その２
docker-machineと通信するときに使う証明書の期限が切れている

dockerのセットアップ時に作成された証明書は3年の有効期限っぽいので
それを過ぎると突然使えなくなる。

確認方法は以下の通り。めっちゃ有効期限切れとるやんけ！！

```
$ openssl x509 -in ~/.docker/machine/certs/ca.pem -noout -dates
notBefore=Nov 25 13:28:00 2015 GMT
notAfter=Nov  9 13:28:00 2018 GMT
```

`docker-machine regenerate-certs --client-certs VM名` で証明書は更新できる。

手元の `docker-machine` では古すぎてhelpに `--client-certs` がいなかったけど、最新版にupgradeしたら居ました。

```
$ docker-machine regenerate-certs --client-certs local
Regenerate TLS machine certs?  Warning: this is irreversible. (y/n): y
Regenerating TLS certificates
Regenerating local certificates
CA certificate is outdated and needs to be regenerated
Creating CA: /Users/agile/.docker/machine/certs/ca.pem
Client certificate is outdated and needs to be regenerated
Creating client certificate: /Users/agile/.docker/machine/certs/cert.pem
Waiting for SSH to be available...
Detecting the provisioner...
Copying certs to the local machine directory...
Copying certs to the remote machine...
Setting Docker configuration on the remote daemon...
```

更新された模様。さっき確認した証明書を再度確認。

```
$ openssl x509 -in ~/.docker/machine/certs/ca.pem -noout -dates
notBefore=Nov  9 15:01:00 2018 GMT
notAfter=Oct 24 15:01:00 2021 GMT
```

こっちもおk。`ls` もエラーが消えました。

```
$ docker-machine ls
NAME    ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER     ERRORS
local   -        virtualbox   Running   tcp://192.168.99.100:2376           v18.09.0  
```
Oculus Go のカメラ操作をマウスで行う

Oculus Go 向けのアプリ・ゲームの開発には Oculus Go が必要です。

ただ、細かいデバッグなんかをしたいときには、いちいちビルド→Oculus GOにインストール→Oculus Goを装着する、という手間がかかってしまって面倒です。

それは面倒だなぁと思っていたら、良いものを見つけました。

[HMD Motion Emulation](https://developer.oculus.com/documentation/unity/latest/concepts/unity-hmd-emulation/)

`OVRHeadsetEmulator` を `OVRCameraRig` などのヘッドセットのカメラのコンポーネントとしてアタッチをすればマウスによる操作ができるようになるらしいです。便利そうですね。

マウス操作との対応は以下。

- Ctrl + マウスの移動→カメラのピッチとヨーの操作
- Ctrl + alt + マウスの移動→カメラのロールの操作
- Ctrl + マウスホイール→カメラの高さ
- Ctrl + マウスの中ボタン→カメラのリセット

実際にマウスで操作をしているところ。

![cap.gif](https://qiita-image-store.s3.amazonaws.com/0/6756/59eaf316-dd20-388a-1862-efcc20b0a7da.gif)

PC 上で開発をするときにこういう仕組みを利用できるのは便利ですね。
IP2LocationのCSVデータをデータベースにインポートする方法

#IP2Locationとは
IPアドレスからだいたいの住所や緯度・経度情報を割り出すのに便利な[IP2Location](https://www.google.com/search?q=IP2Location)。基本的には有償のサービスだけど、[無償プラン](https://www.google.com/search?q=IP2Location+lite)のほうを使う人も多いと思う。メアドを登録するだけでCSVデータを入手できる。

#テーブルを作る
```php
CREATE TABLE `ip2location_db3` (
    `ip_from` INT(10) UNSIGNED NULL DEFAULT NULL,
    `ip_to` INT(10) UNSIGNED NULL DEFAULT NULL,
    `country_code` CHAR(2) NULL DEFAULT NULL COLLATE 'utf8_general_ci',
    `country_name` VARCHAR(64) NULL DEFAULT NULL COLLATE 'utf8_general_ci',
    `region_name` VARCHAR(128) NULL DEFAULT NULL COLLATE 'utf8_general_ci',
    `city_name` VARCHAR(128) NULL DEFAULT NULL COLLATE 'utf8_general_ci',
    INDEX `idx_ip_from` (`ip_from`),
    INDEX `idx_ip_to` (`ip_to`),
    INDEX `idx_ip_from_to` (`ip_from`, `ip_to`)
)
COMMENT='IPテーブル'
COLLATE='utf8_bin'
ENGINE=InnoDB
;

```
まず、上記のようにテーブルを作る。このテーブルにCSVデータを食わせる。DBのフィールド名はなんでもよくて、要は６列のCSVデータなのでフィールドが６つあればいい。後述の取り込みスクリプトではフィールド名を照合しないから、数さえ合っていれば問題ない。フィールドの型も、varcherであればとりあえず動作はする。

https://lite.ip2location.com/
データはここから入手する。ダウンロードできるデータはいくつか種類があって、都道府県名だけ分かればいいなら`DB3`。市町村情報も取得できるが、あまりあてにならない。福岡県のデータを調べてみたら、福岡市・北九州市・久留米市・筑後市・苅田町・宗像市・大牟田市・八女市しかなかった。

緯度経度も必要なら `DB5`を選ぶ。上記のcreate table文は`DB3`用なので、`DB5`の場合はさらにフィールドを追加する必要がある。

#データを取り込むSQL文
```php
TRUNCATE ip2location_db3;

LOAD DATA LOW_PRIORITY LOCAL INFILE 'C:\\download\\ipdata.csv'
INTO TABLE ip2location_db3
FIELDS TERMINATED BY ','
ENCLOSED BY '"'   
LINES TERMINATED BY '\r\n'
```

これでデータを取り込める。フィールド名の照合を行わず無条件に追加する。稼働中のサービスに負荷をかけないように`LOW_PRIORITY`をつけている。

シェル操作が苦手な人はこのスクリプトの実行方法が分からないかもしれないけど、phpMyAdminやAdminerの「SQLを実行」みたいなのに貼りつけて実行ボタンをクリックするだけでいいはず。

インポート元のデータは日本以外の国のデータも含まれているので、全部でかなりの量になる。日本国内だけ対象にすればよい場合は、`grep "JP" data.csv > jp.csv`などとしてあらかじめデータを絞り込んでおく。だいぶコンパクトになる。

このCSVデータで扱われているIPアドレス情報はxxx.xxx.xxx.xxx形式ではなく、長整数表現と呼ばれる形式なので注意。PHP側で処理するなら[ip2long](https://www.google.com/search?q=php+ip2long)を、MySQL側なら[inet_aton](https://www.google.com/search?q=mysql+INET_ATON)で変換する。

ここまで書いといてアレだけど、
https://lite.ip2location.com/database/ip-country-region-city
下のほうにほぼ同じことが書いてある。細部が微妙に違うけど得られる結果はほぼ同じ。でも英語のページってだけで不安って人も多いと思うので、この記事を書くことにしました。
【BAT】巨大ファイルの高速文字コード変換

# はじめに
お仕事のサーバーリプレース作業でデータベースをOracle 11gからPostgreSQL 9.6に移行作業をしています。
Oracle 11gのダンプファイルから、株式会社レッドペンギンの[RP Dump Browser for Oracle](https://www.rp-dumpbrowser.com/)(旧 EX Dump Editor) のテキスト出力機能にてCSV出力しました。しかし、文字コードのエンコーディング指定は有料版のみのため、Shift-JISで出力することになります。ちなみにライセンス購入依頼中の段階です。

今回、PostgreSQLにインポートするのに出力したCSVファイルをUTF-8(BOMなし)に文字コード変換する必要がありますが、一部のデータは1GByte～4GByte近くあったりします。
[サクラエディタ](https://github.com/sakura-editor/sakura)でも開くのは厳しいですが、[EmEditor](https://jp.emeditor.com/)は巨大なファイルを開けるエディタとして有名です。

【2021/12/25追記】
Oracle環境なしで、簡単にDumpファイルの中身を確認、出力するツール「RP Dump Browser for Oracle」の開発会社である株式会社レッドペンギンが倒産してました。
https://www.tokyo-keizai.com/archives/60951

# EmEditorのコマンドライン
EmEditorには、[コマンドライン](http://www.emeditor.org/ja/howto_file_file_commandline.html)機能があり、その中にはエンコードの変換が用意されています。
[コマンド ラインでエンコードを変換するには](http://www.emeditor.org/ja/howto_file_file_convert.html)

TESTDATA.txt(Shift-JIS) を TESTDATA.csv (UTF-8 BOMなし) に変換するバッチです。

```bash
@echo off
cd /d %~dp0
set EM_COMMAND="C:\Program Files\EmEditor\EmEditor.exe"
%EM_COMMAND% TESTDATA.txt /nr /sp /cp 932 /c "Config" /cps 65001 /ss- /sa TESTDATA.csv 
```

## 文字コード変換速度
文字コード変換には、定番の[nkf](https://www.vector.co.jp/soft/win95/util/se295331.html)ツールがあります。
[nkfツールで文字コードを変換する（Windows編）](http://www.atmarkit.co.jp/ait/articles/1301/25/news092.html)

3.91GByteのテキストファイルの文字コード変換(Shift-JIS → UTF-8 BOMなし)を、nkfツールとEmEditorで比較してみました。

### nkfツール
```bash:nkf.bat
@echo off
cd /d %~dp0

echo %time%
nkf32 -w TESTDATA.txt > TESTDATA.csv
echo %time%

pause
```
10:43:11.36
10:53:17.17
約10分かかっています。

### EmEditor

```bash:emcnv.bat
@echo off
cd /d %~dp0
set EM_COMMAND="C:\Program Files\EmEditor\EmEditor.exe"

echo %time%
%EM_COMMAND% TESTDATA.txt /nr /sp /cp 932 /c "Config" /cps 65001 /ss- /sa TESTDATA.csv 
echo %time%

pause
```

11:21:31.02
11:22:40.86
約1分10秒で終わりました。

### 結果
nkfツールは約10分、EmEditorは約1分10秒という結果となりました。
**文字コード変換の速度としては約10倍の差がでました。**

# 一括変換
変換するテーブル一覧を `list.txt` にセットします。

```bash:list.txt
FUGA
HOGE
TESTDATA
```

```bash:SJIS2UTF8N.bat
@echo off
cd /d %~dp0

set EM_COMMAND="D:\Program Files\EmEditor\EmEditor.exe"

for /f %%a in (list.txt) do (
    if exist backup\%%a.txt (
        %EM_COMMAND% backup\%%a.txt /nr /sp /cp 932 /c "Config" /cps 65001 /ss- /sa %%a.csv 
    ) else (
        echo %%a.txt が見つかりません
    )
)

pause
```

# 最後に
EmEditorのコマンドラインというマイナーな機能を紹介してみました。
実は高速はどうかは後付けです。EmEditorのコマンドラインがあったという記事では寂しいので、試しにnkfツールで文字コード変換してみたら思ってたより遅かったので、EmEditorのコマンドラインのメリットを見つけれたということですね。
WP-CLIを使ったWordPressの新規構築

## 概要
WP-CLIを使ったwordpressの構築をメモとして残しておく
新規構築の場合は下記のコマンドを一通り叩けば最低限の環境は揃うはずです

## 構築の流れ
### WP-CLIのインストール
```
$ curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
$ chmod +x wp-cli.phar
$ sudo mv wp-cli.phar /usr/local/bin/wp
```

### 本体ダウンロード
```
$ wp core download --locale=ja --path=/var/www/wordpress
```

### DB設定
```
$ wp core config --dbname=wp_sample --dbuser=root --dbhost=localhost --dbprefix=wp_
```

### セットアップ
```
$ wp core install --url=http://wordpress.local/ --title=test --admin_user=admin --admin_password=admin1234 --admin_email=admin@example.com
```

### プラグインのインストール・有効化
sampleとしてよく使われそうな2つを書いています

```
$ wp plugin install all-in-one-seo-pack --path=/var/www/html/wordpress  --activate
$ wp plugin install google-sitemap-generator --path=/var/www/html/wordpress  --activate
```

### テーマ作成・有効化
```
$ wp scaffold child-theme twentysixteen-child --parent_theme=twentysixteen --path=/var/www/html/wordpress --activate
```

### テーマの有効化
既存のテーマを利用したい場合はこちらのコマンドを利用すればOKです

```
$ wp theme activate twentysixteen-child --path=/var/www/html/wordpress
```
[python]Google検索結果で、自分のサイトが何番目か調べる .py

# 私のサイトは検索結果上位に表示されてるの？ 何位なの？
というわけで、自分のサイトが何番目に表示されているのかを知りたいな、と思い[前回](https://qiita.com/jima262/items/0f8b263fa351c5e95125)の内容を改修しました。
## 内容
検索結果のリストを保持するのは変えず、
　　① URLだけのリストを作成
　　② キーワードを含むURLを抜き出し別のリストをつくる
　　③ indexでもともとのリストの何番目にあるのかを確認する
という非常にアナログな方法で解決しました。
（リスト内を部分一致で検索し、それが何番目かを直接引っ張る方法はなさそうでした。）

## 成果物
以下を
<code>python googlerank.py 検索語</code>
で実行してください
__引数がないと機能しません。__

```googlerank.py

# -*- coding: utf-8 -*-
import requests
import sys
from bs4 import BeautifulSoup
import csv
from datetime import datetime
date = datetime.now().strftime("%Y/%m/%d %H:%M:%S")

# エリアはus、言語はenglish、検索件数は10件  で検索
google = 'https://www.google.com/search?gl=us&hl=en&num=10&q='
resp = requests.get(google+ ''.join(sys.argv[1:]))
soup = BeautifulSoup(resp.text, "lxml")

# 初期値
newlist=[]
rank='NONE'

# キーワード；知りたいサイトのドメインにして遊んでください
keyword = 'keyword'


elems = soup.select(".r a")

with open('googlesearch.csv', 'w', newline='') as f:
        f.write("")

for elem in elems:
    txtelem = elem.getText()
    repelem = elem.get('href').replace('/url?q=','')
#  csvに書き込む内容を確認したい場合は次をコメントアウトしてください
#    print('{} ,{}'.format(txtelem, repelem))
    data = [[elem.getText(),repelem]]
    with open('googlesearch.csv', 'a', newline='') as f:
            writer = csv.writer(f)
            writer.writerows(data)
    newlist.append(repelem)

l_in = [s for s in newlist if keyword in s]
if l_in ==[]:
        print('There is no URL')

else:
        print(keyword + ' is indexed')
        for i in range(len(l_in)):
                rank = newlist.index(str(l_in[i]))
                print(rank)
data2 = [[date ,rank]]
with open('googlerank.csv', 'a', newline='') as f:
        writer = csv.writer(f)
        writer.writerows(data2)
```

実行結果が表示され、同時にcsvファイルが同一ディレクトリにできますので、確認して下さい。
csvが不要でしたら、 with ~ を削除してください。

毎朝実行して、データを蓄積することにしましょう。
factory_botのhas_manyアソシエーションの付け方について

### はじめに
こんばんは。
はじめに白状するとこの記事は今日の未明に書いていた記事でした。
以下は、そのまま文章を変えないでいこうと思います。
秋の夜長とはよく言ったもので今日もこんな時間まで起きています。
今日はfactory_botについてです。テンションは高くもなく低くもなくいきたいと思います。

### この記事で書くこと
factory_botで `has_mmany` 関連付けをどうつけるのかというのをまとめる。

### factory_bot
[Github | 公式リポジトリ](https://github.com/thoughtbot/factory_bot)
もともとはfactory_girlだったのですが、名前を変えたようです。(確かに受け手によってはなかなかな名前だったと思います。

fixture、モックデータをつくるためのgemです。

### 関連付け
以下のようなモデルをテストするときのモックデータをつくる場合

```ruby
class Animal < ApplicationRecord
  belongs_to :family
end

class Family < ApplicationRecord
  has_many :animals
end

## ここでは、Family(家族)には何匹かAnimal(動物)がいるかもしれないので、「1対多」の関係を表現しています。
```

モックデータを作成。

```ruby
# spec/factories/families.rb
FactoryBot.define do
  factory :family do
    name { "のらねこ一家" }
    address { "隣町１丁目" }
    animal { FactoryBot.create(:animal) }
  end
end

FactoryBot.define do
  factory :animal do
    name { "ねずみさん" }
    age { "100" }
  end
end
# このコードは間違っています。記事の後半で修正していきます。
```

```ruby
# 意気揚々とテストケースを書き、いざ実行。
RSpec.describe Family, type: :model do
  describe "#show" do
     context "when family is choiced," do
        let(:family) { create :family } # ここでエラー! orz
        it "render #show." do
          get :show, params: { id: family.id }
          expect(response).to be_success
        end
     end
  end
end
```

関連付けられた「Animalがない」といわれ、バリデーションに引っかかってテストはそもそも失敗。

公式を確認する。
[Github | 公式リポジトリ factory_bot | Getting_started#associations](https://github.com/thoughtbot/factory_bot/blob/master/GETTING_STARTED.md#associations)
[Github | 公式リポジトリ factory_bot | Getting_started#callback](https://github.com/thoughtbot/factory_bot/blob/master/GETTING_STARTED.md#callbacks)


```ruby
# spec/factories/families.rb
FactoryBot.define do
  factory :family do
    name { "のらねこ一家" }
    address { "隣町１丁目" }
    after(:build) do |family|
      family.animal = FactoryBot.create(:animal)
    end
  end
end

FactoryBot.define do
  factory :animal do
    name { "ねずみさん" }
    age { "100" }
  end
end
```

今度はちゃんと関連付けを表現してあげられたので、テストは無事通りました。 :tada: 

#### まだまだfactory_bot及びrspecを理解できてない
モデル同士の関連付けを行うこと自体は珍しくないので、より多くのケースを早く書けるように精進しなくてはと思いました。

Happy coding! :sleeping: :star:
エンジニアのやる気を削ぐ職場環境の作り方

エンジニアのやる気を削いでおけば文句も言ってこなくなるので従順に従わせることが出来ると思いますので、ぎりぎりの線を狙っていきましょう

# 低スペック端末を支給

64bitでメモリ8GBのPCだなんて与えるなんてありえない！　32bitのメモリ2GBで十分だぞ？　Excelが動けばいいだろ？

# フリーソフトインストール禁止

フリーソフトが使いたい？　ダメだよウイルスが入ってるだろどうせ、ランチャー？　ファイラー？　何言ってんだお前？　Excelが動けばいいだろ？

# 私物マウス/キーボード禁止

使い慣れたものが使いたいだと？　どうせ楽がしたいだけだろ？　純正品のマウスとキーボードを使いなさい。どうせExcelしか使わないだろ？

# Excel方眼紙

やっぱりExcelは最高だな！

# スーツ着用必須

クールビズ？　何言ってんだお前？　社会人たるものビシッとスーツ着てネクタイ締めて仕事するのが当たり前だろ。サンダル履く奴は人として破綻してるね

# インターネット禁止

どうせ調べものとか言って遊びたいだけだろ？　お前エンジニアとして仕事するんだったら調べなくてもわかるようになっとけよな

# 昼休み以外食事禁止

昼食べれば十分だろ、お菓子だのガムだのお前は子供か？

# スペースは狭く

この机もう一人入れるだろ？　一人で幅80cmも使いたいとか贅沢言ってんじゃねーぞ

# 始業は早く

9時半とか甘えたこと言ってんじゃねーぞ。9時始業な。遅刻は認めんぞ

# 定時は曖昧に

お前「明日やろうは馬鹿野郎」って言葉知らねーのか？

# 新しいことを取り入れない

バージョン管理したい？　そんなもんファイルに名前つけときゃいいだろーが！

テストの自動化？　そんなんに時間かけるんだったら手でやれよ手で！

# 休みを取らせない

お前来週休むって言ってたけど、あれリリースと被ってるから取り下げといたからな

# 仕事を職人芸にして俗人化させる

つーかリリースできるやつお前しかいないんだから休むわけないよな！

# ここまで書いてみて

気分が悪くなりました。こんな職場嫌ですよね。
Fixed-size vectorizable Eigen objects

# はじめに

c++で数値計算を行う場合、Eigenライブラリを使うことが多いです。Eigenライブラリの使い方は

- [Eigenを用いた密行列演算・分解の概要](https://qiita.com/MusicScience37/items/13fefa6bed25ab8fb6e9)

がコンパクトにまとまっていてわかりやすいでしょう。

しばしばEigenクラスのオブジェクトをSTLコンテナ（`std::vector`等）に格納する必要があるのですが、”[Fixed-size vectorizable](http://eigen.tuxfamily.org/dox/group__TopicFixedSizeVectorizable.html)”なEigenクラスをSTLコンテナに格納する場合、特別なアロケータ`Eigen::aligned_allocator<T>`を使用しなければなりません。

- [Eigenを用いた密行列演算・分解の概要： Eigen を含むクラスやコンテナ](https://qiita.com/MusicScience37/items/13fefa6bed25ab8fb6e9#eigen-%E3%82%92%E5%90%AB%E3%82%80%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%84%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A)
- [Using STL Containers with Eigen](http://eigen.tuxfamily.org/dox/group__TopicStlContainers.html)

使わないとプログラムが途中でクラッシュします。

# 自動的に適切なアロケータを選択させる

アロケータをテンプレートパラメータとして一々与えるのは面倒ですし、バグの基です。
そこでc++らしくコンテナ要素の型`T`に応じて自動的にアロケータを選択するようにします。

追記：[GitHub: shohirose/qiita/fixed_size_vectorizable](https://github.com/shohirose/qiita/tree/master/shohirose/fixed_size_vectorizable)にアップしました。

```cpp:is_fixed_size_vectorizable.hpp
#include <type_traits>
#include <Eigen/Core>
#include <Eigen/Geometry>

namespace foo {

template <typename T>
struct is_fixed_size_vectorizable : std::false_type {};

// fixed-size vectorizableなEigenクラスに対してテンプレートを特殊化
template <>
struct is_fixed_size_vectorizable<Eigen::Vector2d> : std::true_type {};

// ... 以下同様

} // end namespace foo
```

```cpp:allocator.hpp
#include <memory>
#include <Eigen/StdVector>
#include "is_fixed_size_vectorizable.hpp"

namespace foo {

template <typename T>
using allocator = std::conditional_t<is_fixed_size_vectorizable<T>::value,
                                     Eigen::aligned_allocator<T>,
                                     std::allocator<T>>;

} // end namespace foo
```

あとはこれを使ってSTLコンテナのエイリアスを作成します。

```cpp:vector.hpp
#include <vector>
#include "allocator.hpp"

namespace foo {

template <typename T, typename Allocator = allocator<T>>
using vector = std::vector<T, Allocator>;

} // end namespace foo
```

`std::vector<T>`の代わりに`foo::vector<T>`を使えば、`T`がfixed-size vectorizableなEigenクラスの場合でも適切なアロケータが選択されます。
【Qiita】コメント件数表示がおかしい？

Qiitaでは最下部にある「投稿」を押すと、[新着順投稿一覧](https://qiita.com/items)を見ることができます。
あまりに目立たなすぎて、そんなに新着順見せたくないのかという気になります。

そしてここ、タグ検索やトレンドでは殺されてしまったコメント数表示が唯一残されているところでもあります。

しかしどうも、昨日あたりからコメント数表示がおかしい。

![20181109.png](https://qiita-image-store.s3.amazonaws.com/0/26088/cd809549-8e39-5776-e9d7-babafc924953.png)

適当に新着をもってきたところ、4記事にコメントがついているように見えます。
しかし実際にコメントがついているのは青丸の1記事だけで、他の3記事にはコメントがついていません。

他の記事でもこのような例が散見されます。

私はミュート設定などを一切していないので見えないコメントがあるというわけでもなく[^1]、またタイミングからしてSPAMが削除されたというわけでもなさそうです。
最初の`\items`を拾ってきた段階で既にコメント件数は入ってきているので、こちらから原因を窺い知ることはできなそうです。
これはいったい何なのでしょうかね？

あと青丸記事の人は即日仕事辞めたほうがいい。

[^1]: というか未ログインの別ブラウザでも発生する。
lua script to login facebook on Splash


```
function main(splash, args)
  assert(splash:go(args.url))
  assert(splash:wait(0.5))
  
  local form = splash:select("form#login_form")
    
  local values = assert(form:form_values())
  values.email = "email"
  values.pass  = "pass"
  
  assert(form:fill(values))
  assert(splash:wait(1))
  
  assert(form:submit())

  assert(splash:wait(2))
  
  return {
    html = splash:html(),
    png = splash:png(),
  }
end
```
Java で手軽にテキストファイルを読み込む (Java 11 & Java 7)

## 概要

- Java 11 環境では Files.readString と Path.of を使用
- Java 7 環境では Files.readAllLines や Files.readAllBytes と Paths.get を使用

## サンプルコード Cat.java

```java
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;

public class Cat {

    public static void main(String[] args) throws IOException {
        String path = args[0];
        System.out.print(readString11(path));
        System.out.print(readString7(path));
        // String.join は Java 8 以降
        System.out.println(String.join(System.lineSeparator(), readLines7(path)));
    }

    /**
     * テキストファイルを読み込みます。Java 11 から使えるメソッド。
     * @param path 読み込むファイルのパス
     * @return ファイルの内容
     * @throws IOException
     * @throws OutOfMemoryError
     * @throws RuntimeException
     */
    public static String readString11(String path) throws IOException {
        return Files.readString(Path.of(path), Charset.forName("UTF-8"));
    }

    /**
     * テキストファイルを読み込みます。Java 7 から使えるメソッド。
     * @param path 読み込むファイルのパス
     * @return ファイルの内容
     * @throws IOException
     * @throws RuntimeException
     */
    public static String readString7(String path) throws IOException {
        return new String(Files.readAllBytes(Paths.get(path)), Charset.forName("UTF-8"));
    }

    /**
     * テキストファイルを読み込みます。Java 7 から使えるメソッド。
     * @param path 読み込むファイルのパス
     * @return ファイルの内容
     * @throws IOException
     * @throws RuntimeException
     */
    public static List<String> readLines7(String path) throws IOException {
        return Files.readAllLines(Paths.get(path), Charset.forName("UTF-8"));
    }
}
```

## サンプル実行結果

コンパイル。

```
$ javac Cat.java
```

テキストファイルを用意。

```
$ cat sample.txt 
さんぷる
サンプル
SANNPURU
```

サンプルコードを実行。

```
$ java Cat sample.txt 
さんぷる
サンプル
SANNPURU
さんぷる
サンプル
SANNPURU
さんぷる
サンプル
SANNPURU
```

## 動作確認環境　

```
$ java -version
java version "11.0.1" 2018-10-16 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.1+13-LTS)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.1+13-LTS, mixed mode)

$ uname -mrsv
Darwin 18.2.0 Darwin Kernel Version 18.2.0: Fri Oct  5 19:41:49 PDT 2018; root:xnu-4903.221.2~2/RELEASE_X86_64 x86_64

$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.14.1
BuildVersion:   18B75
```

## 参考資料

- 英語リファレンス
  - [Files \(Java SE 11 & JDK 11 \)](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/nio/file/Files.html)
  - [Path \(Java SE 11 & JDK 11 \)](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/nio/file/Path.html)

- 日本語リファレンス
  - [Files \(Java Platform SE 8 \)](https://docs.oracle.com/javase/jp/8/docs/api/java/nio/file/Files.html)
  - [Paths \(Java Platform SE 8 \)](https://docs.oracle.com/javase/jp/8/docs/api/java/nio/file/Paths.html)
若手とは呼べなくなってきたエンジニアがQiitaに飛び込んで見る

## 自己紹介
都内のSIerに新卒で入社して気づけば9年目のかぶです
基本情報/応用情報/DBスペシャリストは持っているものの役立っている感じはあまりしない現状です。

定型作業を楽するためのshスクリプト組んだりVBAマクロ書いたりはありますが
よく考えたら設計やら試験やらばかりであまり下流はやっていないなぁと感じで、
そもそも下流やらプラットフォームを踏まえた設計しないとほんとはダメなんだろうなぁ、とか
いろいろ考えるようになったりしています。

そんなこんなでQiita読みながらいろいろ試せればいいなぁと考えております。
twitterは[@kabu0404](https://twitter.com/kabu0404)でやってます

## 興味
今興味があるのは

* python 
* django
* javascript
* node.js
* react native
* Spring
* raspberry Pi
* selenium
* markdown
* plantuml
* AWS
* CI/CD

なんとなく興味がある程度のものもあるので、Qiitaとかで情報収集できればな、と。
markdownはatomにmarkdown-preview-enhancedを入れてcssで書くとplantumlも埋め込めるしやろうと思えばこれで設計書かけるんじゃないかなとか考えてたんですが、今日Typoraに出会って、どうしたものか考え中です。

## Qiitaのスタンス
見る記事は皆さんすごく有用なものを書いていらっしゃって
そういう中で私も揉まれた方がよいのかなと思い
情報収集以外にも備忘録やネタ投稿に使えればなと考えてます
間違っていたら指摘してくれると嬉しいです。

よろしくお願いします
BeanのListから"一部のフィールド同士が"重複しているかチェックする処理

久々にJava。聞かれて、パッと思いつかなかったので。

### 案1: 専用のComparatorとTreeSetで頑張るよ

まず思いついたのは、任意のフィールドのComparatorを作りTreeSetで重複を排除するやり方（重複したものはわからない）

https://wandbox.org/permlink/Jy1QULC9vOUBSmIp

フィールドが増えたら、3項演算子とかでもりもり書く感じ。ただ、ComparatorをBean毎に定義する必要がある。。
そして、Null Pointer Exception警察にkillされること間違いなし。なので考慮しました。

https://wandbox.org/permlink/PTMp9eDR7M5YeHS1

・・・このやり方はそのうちバグりそうだし自信がない。
実際、書いてる最中にNullPointerExceptionを何度も踏みましたし。

### 案2: getterだけ書いて比較はListに任せるよ

このめんどくささは何なのか考えてみたところ、equalsで比較するフィールドを選ぶ必要があるのと、それぞれ比較する必要がある、と言う所に思い至った。
なので、

- 比較すべきフィールドをgetするgetterを書くだけ書く
- 比較時はgetした値のListにしてListが持つequalsに頼る

というやり方をすれば比較の面倒くささが減ると思い書いてみました。どうでしょうか。

https://wandbox.org/permlink/TDiFmIy3GfL2EmB9

一方で、やっぱりBean毎に一々書きたくないから、Bean側でいい感じにメソッド持ってほしい感もある。

### 案3: Annotation Processingでやらせたいよ

lombokみたいにやればインターフェースとメソッド継ぎ足せるのでは？と思った。
しかし、ちょっと調べて既存のファイルをASTを見ながら壊さないようにいじる必要がありそうで諦めた。


最高のやり方はあるんでしょうか。

~~メソッド名をスネークケースで書いてしまい申し訳ありません。~~