OmniAICreator/Qiita-1.07M huggingface dataset:
論文まとめ：Improving Data Augmentation for Medical Image Segmentation

# はじめに  

何かと話題のmixupだが、今回はmixupをsegmentationタスクに適応させたこの論文
[1] Z. Eaton-Rosen, et. al. "Improving Data Augmentation for Medical Image Segmentation", MIDL 2018 
をまとめてみた。

本論文:
https://openreview.net/pdf?id=rkBBChjiG  

mixupの論文：
https://arxiv.org/abs/1710.09412

コード：
著者らのコードはこのサイト内に 
http://www.niftynet.io 
にupされてるそう。どこにあるかは未確認だけど。。。

# 概要  

1. mixup を若干修正し、初めて semantic segmatation タスクに応用させた  
2. 著者らはこの augmentation を mixmatch と名付けた

# miupの復習  
まず mixup の復習から。

トレーニングデータとそのラベルから任意に２つのペア $(x_i, y_i)$ 、 $(x_j, y_j)$ を取り出す。

mixupしたデータはこれら２つの線形結合。  

```math
\begin{align}
x_{mixup} &= \lambda x_i + (1 - \lambda ) x_j, \\
y_{mixup} &= \lambda y_i + (1 - \lambda) y_j, \\
\end{align}
```

となる。 $\lambda$ は $\lambda \sim \beta (\alpha, \alpha) \  for \  \alpha \in (0, \infty) $ とベータ関数から得る。

# mixup から mixmatch への修正点  
mixup では、 $x_i$ と $x_j$ はランダムにサンプリングされたが、ここを修正する。

具体的には、対象物体が高い密度で写ってる画像群を $x_{I}$ 、最も低い密度で写ってる画像群を $x_J$ として、 この両者で mixup する。

# mixmatch の有効性を検証  

## 各augmentation手法と比較  
BraTS 2017 datasetというのを用いて検証を行なった。  

用いたモデルはBraTS 2017というコンペで２位だった a cascade neural network[2] 。

メトリクスは dice score。結果以下のようになった。

<img width="888" alt="mixmatch_img01.png" src="https://qiita-image-store.s3.amazonaws.com/0/116706/20a0d766-f64c-59e7-7d05-7bc925bc4428.png">

nomixはaugmentationなし。augはrotation、横flip、zoomのみ。mixupはmixupのみ。mixmatchはmixmatchのみ。

mixupとmixmatchの性能がいい。

## 勾配を用いての有効性検証  

```math
\frac{\partial L}{\partial p_i}(\lambda x_i + (1-\lambda) x_j) \approx \lambda \frac{\partial L}{\partial p_i}(x_i) + (1 - \lambda)\frac{\partial L}{\partial p_i}(x_j)
```
と考えて、 $\lambda$ を変化させて右辺と左辺を図示したものが以下。

<img width="892" alt="mixmatch_img02.png" src="https://qiita-image-store.s3.amazonaws.com/0/116706/9e3f732c-0c56-fb10-8d5e-18d063266756.png">

上記式の右辺はmini-batchを増やしたようなものなのだが、これに左辺の値は似ている。特に $\lambda$ が0や1に近い時。

# まとめ  
mixup や mixmatch は semantic segmentation でも有効。

# 個人的感想  
mixupにしてもmixmatchにしてもsemantic segmentationタスクで有効性が示されたのは大きいね〜。

実装も簡単だし、他のaugmentationと組み合わせて使っていきたい。

ただmixmatchにすべきか、mixupのままでいいのかは要検討。


# reference  
[2] G. Wang, et. al. "Automatic Brain Tumor Segmentation using Cascaded Anisotropic Convolutional Neural Networks" CoRR, 2017
Rails5.2のActiveStorageでS3ダイレクトアップロードするときのS3のCORSとIAM設定メモ

細かな点で誤ってるかもしれませんが、メモ書きです。

## 確認バージョン

* Rails 5.2.1
* ActiveStorage 5.2.2


## S3のCORS設定

ダイレクトアップロード時はPUT、ダイレクトダウンロード時はGETが必要になります。
本番環境では、AllowedOriginに本番環境のホストをいれるぽいです。(Ex: `https:://www.service.co.jp`など)

```xml
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedMethod>GET</AllowedMethod>
    <MaxAgeSeconds>3000</MaxAgeSeconds>
    <AllowedHeader>Authorization</AllowedHeader>
</CORSRule>
<CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedMethod>PUT</AllowedMethod>
    <MaxAgeSeconds>3000</MaxAgeSeconds>
    <AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
```

## IAM Policy

最低限Put,Get,List,Deleteが必要。
アップロード時にACLを設定したい場合は、GetObjectAclが必要かも？

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:ListBucket",
                "s3:DeleteObject"
            ],
            "Resource": [
                "arn:aws:s3:::<バケット名>",
                "arn:aws:s3:::<バケット名>/*"
            ]
        }
    ]
}
```

参考: https://guides.rubyonrails.org/active_storage_overview.html#amazon-s3-service
Scala の implicit の使用例

# 目標
Scala の implicit （暗黙的な型変換）があるとどううれしいか紹介する．

# implicit の簡単な紹介
型の不一致を解消するための型変換の操作が繰り返し実装に現れると，コードのシンプルさが失われ可読性が落ちる．そこで， implicits を用いることで暗黙的に型の不一致を解消でき，シンプルでわかりやすいコードを記述することができる．さらにこれを応用させて，組み込み型のクラスに対してあたかも新しいメソッドを追加したようにメソッドを呼び出すことができる．

# 使用例とメリット
異なる複数の通貨間で加算と減算を実行するコードを書く場合を取り上げて， implicit により実装がシンプルになる例を紹介する．ここでは 100 円 + 1 ドル (= 111円） = 211 円　などの演算を想定する．円，ドル，ユーロ，それぞれの貨幣を示すクラス， Yen, Dollar, Euro を定義し，それぞれに加算を実行する add メソッドと減算を実行する sub メソッドを定義する．同じ通貨の間での加算や減算の結果は自明に定義できるが，異なる通貨との演算は自明に定義できない．とりわけ，そのときの為替レートに応じて演算結果が変化するため，演算の対象のクラスに応じて場合分けの実装が必要になる．すると各クラス，各演算ごとに場合分けが頻出し，実装は複雑になる．

そこで，implicit を用いることで実装がシンプルになる．各通貨クラスの add, sub メソッドの引数は，自クラスのみを受け付けるように実装する．implicit により， Yen <-> Dollar <-> Euro 間の変換を暗黙的に実行できるようにすることで，場合分けを必要とせずに異なる通貨間の演算が記述できるようになる．以下にソースコードを記述する．

```scala

// Yen と Dollar と Euro 間を暗黙的に型変換するメソッド
object ImplicitFunctions {
  implicit def dollar2yen(dollar:Dollar):Yen = new Yen(dollar.dollar * 111)
  implicit def euro2yen(euro:Euro):Yen = new Yen(euro.euro * 128)

  implicit def yen2dollar(yen:Yen):Dollar = new Dollar(yen.yen * 0.009)
  implicit def euro2dollar(euro:Euro):Dollar = new Dollar(euro.euro * 1.16)

  implicit def yen2euro(yen:Yen):Euro = new Euro(yen.yen * 0.0078)
  implicit def dollar2euro(dollar:Dollar):Euro = new Euro(dollar.dollar * 0.86)
}

// 以下通貨のクラス．各通貨は自身の通貨としか
// 加減演算できないような定義である．
case class Yen (yen:Double){
  def add(that:Yen):Yen = new Yen(this.yen + that.yen)
  def sub(that:Yen):Yen = new Yen(this.yen - that.yen)
}

case class Dollar (dollar:Double){
  def add(that:Dollar):Dollar = new Dollar(this.dollar + that.dollar)
  def sub(that:Dollar):Dollar = new Dollar(this.dollar - that.dollar)
}

case class Euro (euro:Double){
  def add(that:Euro):Euro = new Euro(this.euro + that.euro)
  def sub(that:Euro):Euro = new Euro(this.euro - that.euro)
}

object Main extends App {

  // 暗黙的な型変換メソッド群をインポートする．
  import ImplicitFunctions._
  val yen_3 = new Yen(3.0)
  val dollar_4 = new Dollar(4.0)
  val euro_5 = new Euro(5.0)

  // 異なる通貨間で演算可能になる．
  print(yen_3.add(dollar_4))
  print(dollar_4.add(euro_5))
  print(euro_5.add(yen_3))
}
```
Scala の wildcard の使用例

# 目標
Scala において，` (_ <: AnyVal)` のようなwildcard を用いた定義式がどううれしいかを論じる．

# wildcard の簡単な説明
generic type を用いるとき，型安全性のため Covariant な型（A <: B のときのA）の操作に制限がある．例として，型安全のために， covariant type の compound type (List[A] や Set[A], Array[A]）に別の covariant type を挿入できうる操作が定義できないことがある．　（詳しくは使用例で）そこで，wild card を用いることにより，generic type に対しするメソッドを型安全となるよう柔軟に定義できる．

# 使用例とメリット
独自の Int クラスと Double クラス， List クラスを定義し，独自の List クラスに　Int や Double を追加していくような実装を考える．ここで，独自の Int クラスと Double クラスはともに NumericVal クラスの covariant タイプである．各クラスの定義は次のようになる．

```scala
// 数値クラス
abstract class NumericVal (){}
class MyInt ()    extends NumericVal {val value = 0}
class MyDouble () extends NumericVal {val value = 0.0}

// リストクラス
class MyList[T](){
  var list:List[T] = List()
  def add(elem:T) {list = elem :: list}
}
```

この例では， generic type を用いて定義した独自のリストクラス MyList に MyInt, MyDouble を挿入するメソッドを， wildcard で型安全に定義できることを示す．
MyList クラスは， generic type T のリストを保持し， add メソッドを通じてリストに T のインスタンスを追加できる．

addElemToList メソッドでは，次のことを実現したいとする．
1. MyList[NumericVal] に MyInt や MyDouble のインスタンスを追加する．
2. MyList[MyInt] に MyInt のインスタンスを追加する．
3. MyList[MyDouble] に MyDouble のインスタンスを追加する．

しかし，これを型安全に定義するのは難しい．
もし次のように定義する場合，

```scala
 def addElemToList(elem:NumericVal, list:MyList[NumericVal]){
  list.add(elem)
}
```
SBT のコンパイラでは` MyList[MyInt] <: MyList[NumericVal]`が成り立たないため（後述），要件２と３を満たさない．仮に` MyList[MyInt] <: MyList[NumericVal]` が成り立つとしても，次のように型安全でないメソッドが定義できうるため，型検査をパスしない．

```scala
val intList = new MyList[MyInt]()
val myDouble = new MyDouble()
addElemToList(myDouble, intList) // MyList[MyInt] に MyDouble が入っちゃう
```

そこで， wildcard を用いることにより，次のように型安全にメソッドを定義できる．

```scala

object Main extends App {

  def addElemToList[A<:NumericVal](elem:A, list:MyList[_ >:A]){
    list.add(elem)
  }

  // 要件１を満たす．
  var numericList = new MyList[NumericVal]()
  addElemToList(new MyInt(), numericList)
  addElemToList(new MyDouble(), numericList)
  // 要件２を満たす．
  var intList = new MyList[MyInt]()
  addElemToList(new MyInt(), intList)
  // 要件３を満たす．
  var doubleList = new MyList[MyDouble]()
  addElemToList(new MyDouble(), doubleList)
}

```

前述のとおり，SBT のコンパイラでは` MyList[MyInt] <: MyList[NumericVal]`が成り立たない．これは次のエラーにより確認できる．

```
[error] /home/ytakahashi/project/classes/programingDesign/problem02/src/main/scala/example/Hello.scala:31:30: type mismatch;
[error]  found   : problem02.MyList[problem02.MyInt]
[error]  required: problem02.MyList[problem02.NumericVal]
[error] Note: problem02.MyInt <: problem02.NumericVal, but class MyList　is invariant in type T.
[error] You may wish to define T as +T instead. (SLS 4.5)
[error]   addElemToList(new MyInt(), intList)
[error]                              ^
[error] one error found
[error] (Compile / compileIncremental) Compilation failed
[error] Total time: 1 s, completed Aug 8, 2018 11:30:35 PM
```
Scala の Trait の使用例

# 目標
Scala の Trait がどううれしいかについて論じます．

# 注意
Scala の Trait は厳密には Mixin なので，以降の文では Mixin という言葉を使いますが，特に気にしないという人は Mixin のことを Trait に置き換えて読んでください．

## Mixin の簡単な説明
あるクラスに複数の別のクラスの機能を持たせるために多重継承するとき，もし複数の親クラスが同じ名称のメンバー変数や関数を持つとき，子クラスはこの名称のメンバへアクセスするときにどちらの親クラスのメンバにアクセスすればよいか曖昧になる． Mixin を用いることで，継承の順序関係を明らかにでき，さらに子クラスで Mixin の継承先を決定できるため，継承先のクラスを子クラスが柔軟に決定することができる．

## 使用例
電子マネーのウォレットのような，外部サーバと API を通じて連携するアプリケーションの実装を想定する．ウォレットは残高を保持し，他のウォレットのアドレスを指定してお金を送金する機能を有する．この機能は， API を通じて他のウォレットの残高を増やし，その後自身の残高を減らす．

この例では，外部サーバと連携する代わりにテスト用のサーバと連携する API を使うテスト用のウォレットを実装するとき， Mixin 機能が有効に働くことをクラス図を用いて示す．

![01_class.png](https://qiita-image-store.s3.amazonaws.com/0/139085/bbf3ff7f-980b-5923-f640-31d8efe8a5f6.png)

テスト用のウォレット（TestModeWallet）は，本番用の Wallet と似たような機能を提供することに加え，テスト用のサーバと連携する TestMode の機能も提供したい．そのため，TestModeWallet は二つのクラスを継承したいのだが，二つは callPayAPI という同名のメソッドを持つため，多重継承の際にどちらのクラスのメソッドを優先するかの曖昧さが生じる．ここで，Mixin を導入することで親クラスの継承関係に順序をつけることができる．継承関係は TestModeWallet <: TestMode <: Wallet となる．

さらに， Wallet とは別に API を通じて外部サーバと連携する Account クラスが存在し，これのテスト用を作るように拡張する際は， TestMode の継承先を Account クラスになるように TestModeAccount を定義することができる．継承関係は TestModeAccount <: TestMode <: Account となる．

Mixin　を使うと，このように子クラスが Mixin の継承先を決めることができるので，いろんなクラスに Mixin で定義した機能を提供できる．


コーディング例：

```scala
// テストモードにしたいクラスはこの Mixin を継承すると，テスト用の API を使うようになる．
trait TestMode {
  def callPayAPI(amount: Int, address: String){
    TestAPI.pay(amount, address)
  }
  def callSetIDAPI(oldID: Int, newID: Int){
    TestAPI.setID(oldID, newID)
  }
}

// テスト用のサーバの挙動．
object TestAPI {
  def pay(amount: Int, address: String){} // TestMode causes nothing.
  def setID(oldID: Int, newID: Int) {}// TestMode causes nothing.
}

class Wallet {
  var balance = 0
  def pay(amount: Int, address: String){
    callPayAPI(amount, address)
    balance = balance - amount
  }
  def callPayAPI(amount, address){
    API.pay(amount, address) // This calls actual API.
  }
}

class Account {
  val id = 1
  def setID(newID: Int){
    callSetIDAPI(id, newID)
    id = newID
  }
  def callSetIDAPI(oldID: Int, newID: Int){
    API.setID(oldID, newID) // This calls actual API.
  }
}

// Wallet class for test mode.
class TestModeWallet extends Wallet with TestMode {}
// Account class for test mode.
class TestModeAccount extends Account with TestMode {}
```

## Mixin 機能がない場合の考察
Mixin の機能がない場合を想定すると，いくつかの実装上の制約が生じる．
もし Mixin がなく， TestModeWallet が TestMode と Wallet を多重継承するよう実装する場合，TestMode と Wallet 両方に callPayAPI メソッドが存在するため，メソッドの呼び出し先に曖昧さが生じる．もし，TestMode をなくし，TestModeWallet で callPayAPI メソッドを定義する場合， TestAPI を別のテスト用の API に差し替える際に複数のクラス定義で実装を変更しなければならない問題が生じる．
dockerで構築したコンテナにてgulpが走らない時の対応法

#やりたいこと
- `docker-compose up -d`にて立ち上げたnodejsコンテナにて、`gulp`が走らないことを解決したい

#環境

```
$ docker exec -it node_js_1 npm -v
v6.1

$ docker exec -it node_js_1 node -v
v10.6.0

$ docker exec -it node_js_1 gulp -v
v3.9.1
```
#原因
タスクランナーの`node-sass`に不備があったため

#解決策
node-sassをuninstallして再度install

```
//まずnode_jsコンテナに入る
$ docker exec -it node_js_1 bash

//コンテナ内でnode-sassをuninstall実行
$ npm uninstall node-sass

//node-sassをinstall実行
$ npm install node-sass
```
ちなみに、プロジェクトのルートディレクトリからでもinstallまで可能

```
$ docker exec -it node_js_1 npm uninstall node-sass
$ docker exec -it node_js_1 npm install node-sass
```
```
$ gulp
```
上記でコンパイルが成功しました。

#node-sassとは
Node.jsをLibSassに関連付けされるLibraryで、高速でsassファイルをコンパイルする。
gulpfile.jsにてrequireして使う。
https://www.npmjs.com/package/node-sass

#LibSassとは
C++で書かれたコンパイラー

#考察
gulp-scssとの違いを調査したい。
そもそもこれDocker関係なかった...
強いて言えばdocker-compose.ymlやDockerfileの中身が間違っていたくらいか...

フロント超絶初心者なのでご指摘等お願いします。
Infiniband の P_Key を /etc/network/interfaces で指定する方法

以下の定義で動きました。
`pre-up`で親ポート(`ib0`)にサブインターフェイスを追加しています。

```shell:/etc/network/interfaces
auto ib0.8001
iface ib0.8001 inet static
	address 1.2.3.4/24
	pre-up    echo 0x8001    > /sys/class/net/ib0/create_child
	post-up   echo connected > /sys/class/net/$IFACE/mode
	post-up   ip link set $IFACE mtu 65520
	post-down echo 0x8001    > /sys/class/net/ib0/delete_child
```
Python3.5でhttp.server使うときの注意点

# はじめに
pythonでwebサーバ立ち上げたくなって、ラズパイ上で試してみた。

# 試行錯誤
ここらへんを読みながら真似してみた。
[pythonでローカルwebサーバを立ち上げる - Qiita](https://qiita.com/okhrn/items/4d3c74563154f191ba16)
[21.22. http.server — HTTP サーバ — Python 3.6.5 ドキュメント](https://docs.python.jp/3/library/http.server.html)

こんな感じ。

```python
import http.server
import socketserver

PORT = 8000

Handler = http.server.SimpleHTTPRequestHandler

with socketserver.TCPServer(("", PORT), Handler) as httpd:
    print("serving at port", PORT)
    httpd.serve_forever()
```

するとエラーが出た。

```bash
File "simpleserver.py", line 8, in <module>
    with socketserver.TCPServer(("", PORT), Handler) as httpd:
AttributeError: __exit__
```

わからないんで、そのまま調べてみると、ヒットした。

[AttributeError: __exit__ with socketserver on python-3.4.3 - Stack Overflow](https://stackoverflow.com/questions/48055880/attributeerror-exit-with-socketserver-on-python-3-4-3)

ここに、こんなん書いてあった。

> Changed in version 3.6: Support for the context manager protocol was added. Exiting the context manager is equivalent to calling server_close().

らしい。

python3のバージョン調べてみると、

```bash
python3 --version
Python 3.5.3
```

やった。

バージョン指定してドキュメント見てみると、サンプルコードが微妙に違う。
[21.22. http.server — HTTP サーバ — Python 3.5.3 ドキュメント](https://docs.python.jp/3.5/library/http.server.html)

そのまんま、こんな感じで書いた。

```python
import http.server
import socketserver

PORT = 8000

Handler = http.server.SimpleHTTPRequestHandler

httpd = socketserver.TCPServer(("", PORT), Handler)

print("serving at port", PORT)
httpd.serve_forever()
```

動いた。よかった。

# おわりに
大概のエラーはstackoverflowに解決方法書いてある。
公式ドキュメント見るとき、バージョンを指定するの大事。
python3の中でも微妙にバージョンによる差異がある。
気をつけよ。
Pythonワンライナー：Fizzbuzzをイテレータ、クラスで

# Oneline
Pythonistaの嗜み。
セミコロンは甘え。

# 環境

* Ubuntu 16.04
* Python 3.5.2

# ターゲット

イテレータクラスをワンライナーで定義して呼び出します。
例題としてFizzbuzzをやってみます。

* イテレータクラス`FizzBuzz`
* `fb = FizzBuzz(n)`とすると1番目から`n`番目までのFizzBuzzを順番に返すイテレータ`fb`を得る
* `fb`を`n + 1`回以上`__next__`すると`StopIteration`を送出

# 必要になるテクニック

特に今回必要になるテクニックです。
以下を他の処理と接続できるように文ではなく関数またはオブジェクトで表現できるようにしなければなりません。


* 変数の代入
* import
* クラス定義
* 条件分岐
* 複数の文を順番に実行するような処理（代入、if、return）など
* 例外の送出

# 普通の実装

```python
class FizzBuzz(object):
    def __init__(self, M):
        self.M = M
        self.i = -1
    def __iter__(self):
        return self
    def __next__(self):
        self.i += 1
        if self.i >= self.M:
            raise StopIteration()
        return "{}".format(self.i%3//2*'Fizz' + self.i%5//4*'Buzz' or self.i+1)

fb = FizzBuzz(16)
print("\n".join(fb))
```

このように、`__iter__`と`__next__`（python2だと`next`）を持つクラスのインスタンスはイテレータとなります。
そしてイテレータの終了条件に来ると　`StopIteration`を送出すればイテレータの終わりと判断されます。
そして`join`は文字列を返すイテレータを渡してやると、終了までの要素を指定された文字列でつなげてくれます。
イテレータの例：`list`

`__next__`関数の`return`文にある`format`の引数の中身が、`self.i`番目のFizzBuzzの処理となります。どこかのコードゴルフのものを
パクり
参考にしました。
`join`に渡すために、`"{}".format()`で文字列化しました。`str()`でもいいのかもしれない。

カウンタ`self.i`の初期値が`-1`なのが少々不格好ですが、ご容赦ください。

あと、１５番目までやればFizzBuzzはとりあえず一周しますので、ターミナルの見やすさのために`fb = FizzBuzz(16)`と１６番目で終了させました。

# クラス定義のみ関数化

```python
FB = __import__("types").new_class(
    "FB",
    exec_body=lambda FB: FB.update({
        "__init__": lambda self, M: self.__dict__.update({"M": M, "i": -1}),
        "__iter__": lambda self: self,
        "__next__": (lambda self:
            self.__dict__.update({"i": self.i + 1}) or (
                iter([]).__next__() if self.i >= self.M else "{}".format(self.i%3//2*'Fizz' + self.i%5//4*'Buzz' or self.i+1)
            )
        )
    })
)

fb = FB(16)
print("\n".join(fb))
```

### クラス定義

`types`モジュール中の`new_class`関数を使います。`import`文も関数にして１行化しました。
python2では`new`モジュールが使えます。

参考：[Pythonワンライナー：階乗の定義を３通りで](https://qiita.com/sage-git/items/245cc2913535e45e57e9)

### 代入

`"__init__"`に渡されているlambdaの中身が、python onlinerにおける典型的な代入文になります。

### 複数文の実行

`__next__`関数では２つの文（インクリメント、return）を順番に実行しなければなりませんが、これをlambdaの中で書こうとすると一気に難しくなります。
`None`が`False`として扱われることを使うと、`None`を返す関数`a`、`b`、`c`がある場合、

```python
a() or b() or c()
```
とするとそれぞれが順番に実行されます。
`update`関数がNoneを返すのでこのテクニックが使え、`"__next__"`の次の行のような書き方となり、これが`self.i += 1`の操作に該当します。

### 例外

続いての困難は`raise`文です。今回は長さ`0`のイテレータの`__next__`を呼びだせば即`StopIteration`となることを使いました。

### 条件

`if`文は普通に３項演算子的なあれです。
これに収めるために、Fizzbuzzの処理本体をコードゴルフのものにしました。

# すべてを一行に

クラス定義のみ関数化したものを単純に改行を消して、`print`関数の中に押し込めただけです。

```python
print("\n".join(__import__("types").new_class("FB", exec_body=lambda FB: FB.update({"__init__": lambda self, M: self.__dict__.update({"M": M, "i": -1}),"__iter__": lambda self: self, "__next__": (lambda self: self.__dict__.update({"i": self.i + 1}) or ( iter([]).__next__() if self.i >= self.M else "{}".format(self.i%3//2*'Fizz' + self.i%5//4*'Buzz' or self.i+1)))}))(16)))
```

# 終わりに

「誰得」、この一言に尽きます。
Reshaper/Riderの「Possible unintended bypass of lifetime check of underlying Unity engine object」って何ぞや？


JetBrains製で「赤ペン先生」とも呼ばれるVisual Studioプラグイン「Reshaper」、そしてそれを搭載した.NET向けIDE「Rider」

素晴らしい機能を多く持っている、Reshaper/Rider。愛用しているUnity開発者も、多いのではないでしょうか？

そんなReshaper/Riderの機能の一つ「Code Inspections」。コードの良くない部分を指摘してくれたり、「こうすればよくなるよ」という修正をしてくれます。

さて、Unity固有の「Code Inspections」には、ちょっと背景知識が必要でわかりにくいものがあります。それが、

「Possible unintended bypass of lifetime check of underlying Unity engine object」

です。

Riderでは、こんな感じで出ます。

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/4125/8f9758c0-3d00-b3de-93c1-5063d4a18f40.png)

この投稿ではその背景・内容を紹介します。

# 背景知識1

GameObjectやComponentをnullと比較するとき、落し穴があります。

```csharp:
[SerializeField] private GameObject target; // 参照している。nullじゃない。

private void Awake()
{
    Debug.Log(target == null); // Falseと表示される
    DestroyImmediate(target);
    Debug.Log(target == null); // Trueと表示される
}
```

上のコードで、変数targetがオブジェクトを参照していてnullじゃないのに、`target == null`がtrueになります。

GameObjectやComponentの親クラスであるUnityEngine.Objectには、==や!=、boolのオペレーターが定義されています。

そしてその挙動が「対象のGameObjectやComponentが、生存していないならば、==でnullと比較するとtrueを返す」という仕様になっています。

関連記事 : 「[GameObjectやComponentをnullと比較するときの落し穴](https://qiita.com/RyotaMurohoshi/items/339d77d10b89198ce4fc)」

# 背景知識2

C#で「person?.Name」と「person == null ? null : person.Name」は等価じゃありません。

null条件演算子 (?.) において、nullとの比較に 「==」オペレーターでの比較は行われなません。（型に対して==で独自定義した処理は呼ばれない）

同様に、null合体演算子 (??)でも同じように、nullとの比較に 「==」オペレーターでの比較は行われない。（型に対して==で独自定義した処理は呼ばれない）


関連記事 : 「[C#で「person?.Name」と「person == null ? null : person.Name」は等価じゃない。](https://qiita.com/RyotaMurohoshi/items/825e5b9e386600712daf)」

# 背景知識1と背景知識2を合わせての注意点

次のコード1と

```csharp:
// コード1
[SerializeField] private GameObject target;

private void Awake()
{
    DestroyImmediate(target);
    Debug.Log(target == null ? null : target.name); // `Null`と表示される
}
```

次のコード2は、

```csharp:
// コード2
[SerializeField] private GameObject target;

private void Awake()
{
    DestroyImmediate(target);
    Debug.Log(target?.name); // `UnassignedReferenceException`が投げられる
}
```

は結果が異なります。

コード1では==オペレーターを使っているので、`target`が生存していなため（DestroyImmediateで破壊している）、`target == null`はtrueとなり、ログに`Null`と表示されます。

コード2ではnull条件演算子（`?.`）を使っているので、`==`が呼ばれません。コード2ではオブジェクトの生存に関係なく処理が進みます。その結果、処理が進みオブジェクトが破壊されているため`UnassignedReferenceException`が投げられます。

# ReShaper/RiderのCode Inspectionの意味は？


「背景知識1と背景知識2を合わせての注意点」

でReShaper/RiderのCode Inspectionの

「Possible unintended bypass of lifetime check of underlying Unity engine object」

意味と理由とメリットが伝わったでしょうか？

GameObjectやComponentをnullとの比較で`==`を使っている場合、ライフサイクルを加味した処理を行われます。一方で、null条件演算子（`?.`）やnull合体演算子(`??`)ではライフサイクルが加味されません。一見、同じように見えるコードでも違うことに十分に注意しましょう。


詳しくはこちらも！

JetBrains/resharper-unityのwiki「[Possible unintended bypass of lifetime check of underlying Unity engine object](https://github.com/JetBrains/resharper-unity/wiki/Possible-unintended-bypass-of-lifetime-check-of-underlying-Unity-engine-object)」


# 個人的な意見

個人的には、`UnityEngine.Object`の生存状態で`==`や`!=`の結果が変わるの、分かりにくい仕様だと思うんですよね。。。
Android StudioのLayout Inspector

Viewの構造を確認できるAndroid Studioのツール

AndroidのUI開発中、特に動的にLayoutを作成した時の確認に使えそう

Hierarchy Viewerの後継ツールっぽい。 [Profile your layout with Hierarchy Viewer](https://developer.android.com/studio/profile/hierarchy-viewer)

## 検証環境
Android Studio 3.1.3

## 使い方
1. 実機orエミュレーターでアプリを立ち上げる  
<br>
2. Viewの構造をチェックしたい画面に、実機orエミュレーターを操作しておく  
<br>
3. Tools > Layout Inspector  
<img width="1680" src="https://qiita-image-store.s3.amazonaws.com/0/132583/d5cf40a4-24e5-95d6-02f2-bb90b9f49dcc.png">  
<br>
4. プロセスを実行中の端末のactivityを選択  
<img width="1680" src="https://qiita-image-store.s3.amazonaws.com/0/132583/31131426-d96e-4bb5-e320-97fe9c903c2b.png">
<br>
5. project-name/captures/以下に.liファイルが保存されるので、Android Studio上で開く  
<img width="1680" src="https://qiita-image-store.s3.amazonaws.com/0/132583/a5da4e8a-169a-91d0-6dc7-f96eb1c090d0.png">  
<br>
Viewの構造や属性が分かるので、期待するLayoutになっているかの確認に使える。


## 参考
[公式ドキュメント - Layout Inspector でレイアウトをデバッグする](https://developer.android.com/studio/debug/layout-inspector)
Raspberry-pi で起動時に自動的に時刻合わせをする

#背景
Raspberry-pi で時刻合わせがなぜか自動でキマらないのでやりました。

#開発環境
Raspberry-pi 3B
Python 2.7.13

#コード
以下、コードになります。
ntplibを用いてdateで合わせます。時刻取得部分についてはPyPlのexampleをそのまま流用しました。ntpサーバーはNICTから配信されているものを使ってます。

```ntp_get.py
from time import ctime
import os
import ntplib

c = ntplib.NTPClient()
response = c.request('ntp.nict.jp', version=3)

print(response.offset)
#-0.143156766891
print(response.version)
#3
now=ctime(response.tx_time)
print(now)
# 'Sun May 17 09:32:48 2009'
print(ntplib.leap_to_text(response.leap))
# 'no warning'
print(response.root_delay)
# 0.0046844482421875
print(ntplib.ref_id_to_text(response.ref_id))
# 193.190.230.66

now_year = now[20:24]  
print(now_year)

now_day = now[8:10]  
print(now_day)

now_month = now[4:7]
if now_month=="Jan":
    now_month=1
if now_month=="Feb":
    now_month=2
if now_month=="Mar":
    now_month=3
if now_month=="Apr":
    now_month=4
if now_month=="May":
    now_month=5
if now_month=="Jun":
    now_month=6
if now_month=="Jul":
    now_month=7
if now_month=="Aug":
    now_month=8
if now_month=="Sep":
    now_month=9
if now_month=="Oct":
    now_month=10
if now_month=="Nov":
    now_month=11
if now_month=="Dec":
    now_month=12
print(now_month)

now_time = now[11:19]  
print(now_time)

os.system("sudo date -s"+" "+"'"+str(now_year)+"-"+str(now_month)+"-"+str(now_day)+" "+str(now_time)+"'")
```

あとは、出来たファイルに権限を付与し、スタートアップで起動するようにすれば完成です。

```text:terminal
>>>chmod 755 ntp_get.py
```

```text:~/.config/lxsession/LXDE-pi/autostart
@python /home/pi/python/ntp_get.py
```
#参考文献
<a href="https://pypi.org/project/ntplib/" target="_blank">ntplib</a>
Angular プロジェクトのビルド成果物を Docker で動かす

## 前提
- 既存の Angular プロジェクトに Docker を導入する
- production build した生成物を動かしたい
    - ので、 Nginx も使う
- Docker for Mac インストール済み

## Dockerfile を用意する
- ベースの image は [node:8.11.3-alpine](https://hub.docker.com/r/library/node/tags/8.11.3-alpine/) を指定
    - Node.js が欲しい、かつ軽量な Alpine Linux を選択
- 任意の名前で WORKDIR を設定
- host 側のファイル一式を WORKDIR にコピー
- `$ yarn` と `$ yarn build` を実行するように RUN で設定

```:Dockerfile
FROM node:8.11.3-alpine

WORKDIR /training-docker

COPY . .

RUN yarn

RUN yarn build --prod
```

## docker-compose.yml を用意する
- service を web と nginx の 2 つを用意

### web container
- image は上で用意した Dockerfile をビルドして作成
- Dockerfile ビルド時の ng build で生成される dist/ を container 間で共有する volumes にマウント

### nginx container
- nginx の image は [nginx](https://hub.docker.com/r/library/nginx/) をから作成
- 8080 ポートをポートフォワーディングする
- web container で dist/ を置いた volumes にマウント
    - ro つけると Read Only になる
- host 側に用意していた Nginx の config file もマウント

```yaml:docker-compose.yml
version: '3'
services:
  web:
    build: .
    container_name: "traning-docker"
    volumes:
      - www:/training-docker/dist
  nginx-proxy:
    image: nginx
    container_name: "training-nginx"
    ports:
      - "8080:8080"
    volumes:
      - ./.docker/nginx:/etc/nginx/conf.d:ro
      - www:/www:ro
volumes:
  www:
```

```:.docker/nginx/default.conf
server {
  listen 8080;
  server_name localhost;

  location / {
    root /www/training-docker-with-angular;
    index index.html;
  }
}
```

# Docker の起動・終了
- docker-compose を使って起動する

```shell
# image がない場合は build から走る
$ docker-compose up
```

- 起動したら http://localhost:8080/ につなぐと画面が表示される
- 起動している Nginx container に入る場合

```shell
# container id を確認
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                            NAMES
9c63974154e0        nginx               "nginx -g 'daemon of…"   42 minutes ago      Up 27 seconds       80/tcp, 0.0.0.0:8080->8080/tcp   training-nginx

# 対象 container に入る
$ docker exec -it 9c63974154e0 /bin/sh
## /www/training-docker-with-angular に dist/ のファイルが格納されているのが確認できる
```

- 停止する

```shell
$ docker-compose stop
```

# まとめ
- コマンド一発で起動できる
- hosting サービスを使わなくても production build の動作確認が可能
- Nginx の設定がちょっと雑…
php-master-changes 2018-08-09

# 2018-08-09

今日は限界ギリまで少ないよ！

## cmb69: [ci skip] Update NEWS regarding SameSite cookie support
- https://github.com/php/php-src/commit/d22ddd8cf12b5582b11dcba84d93f1b558ce30ae
- SameSite cookie のサポートについて NEWS への言及を追加
macOS: Google Cloud Storage に gsutil で日本語ファイル名が転送できない問題の対処メモ

tl;dr
-------

代わりに mc コマンドを使うこと。

問題
-------

`gsutil` を使い、macOS 上で日本語文字バイトを含むファイル名をつけたファイルを転送しようとするとエラーになる。

```
CommandException: Couldn't write tracker file (/Users/you/.gsutil/tracker-files/upload_TRACKER_a5a3118b61060366b4e074bbd40c0051f7ca5c29.��.m4a__JSON.url): Illegal byte sequence. This can happen if gsutil is configured to save tracker files to an unwritable directory)
```

ローカルディスク上に、日本語を含むファイル名で一時ファイルを正しく保存できないようだ。Python 自体のエンコーディングの扱いの問題だと思われる。

未検証だが `HFS+` 時代は問題なかったはずなので、起動ディスクが `Apple File System (APFS)` でフォーマットされているとダメである可能性がある。（メモ：HFS+ 時代からダメな場合もある模様）

うまくいかないパターン集
---------------------------------

いろいろ試行錯誤をしたログ。

### 環境変数を指定する

* LC_ALL 系
* LANG
* PYTHONIOENCODING

どれも効果がなかった。

### Python スクリプトにエンコードの設定を入れてみる

直接スクリプトを編集しデフォルトエンコーディングを指定する。だいぶ昔に試したため詳細は失念。

### awscli を使う

たとえば `gcs` という profile を作成して試しても：

	aws --profile=gcs --endpoint-url https://storage.googleapis.com/ s3 ls

バケット一覧は参照できるが、オブジェクトは見えない。

	aws --profile=gcs --endpoint-url https://storage.googleapis.com/ s3 ls s3://your-bucket/

```
An error occurred (InvalidArgument) when calling the ListObjects operation: Invalid argument.
```

`--debug` をつけて実行すると、次のようにパラメータに互換性がないため失敗することがわかる。

```
Invalid query parameter(s): [encoding-type]
```

### Docker を使う

[google/cloud-sdk:latest](https://github.com/GoogleCloudPlatform/cloud-sdk-docker) というイメージがあるので起動して、gcloud などの設定を済ませてみても：

	docker run -it --rm google/cloud-sdk:latest bash
	> gcloud auth login
	> gsutil config
	...
	> gsutil rsync -r -e -C /from/ gs://your-bucket/to/

`ascii` 以外にエンコードする手段が分からない。

```
Caught non-retryable exception while listing file://.: 'ascii' codec can't encode characters in position 15-20: ordinal not in range(128)
```

### Mountain Duck を使う

[Mountain Duck](https://mountainduck.io/) は、[Cyberduck](https://cyberduck.io/) を使ってネットワークディスクをマウントする拡張アプリ（有償）。Google Cloud Storage を macOS にマウントできる。

マウントされるパスは `~/Library/Group Containers/G69SCX94XU.duck/Library/Application Support/duck/Volumes/gcs` などとなり Finder から参照できる。

ただ、`cp` コマンドは使えるのだが `rsync` コマンドで同期を取ることはできない。

```
rsync: close failed on "/Users/you/Library/Group Containers/G69SFX91XU.duck/Library/Application Support/duck/Volumes/gcs/your-bucket/test.txt.0Bf5R6": Unknown error: 10006 (10006)
rsync error: error in file IO (code 11) at receiver.c(853) [receiver=3.1.3]
```

代替手段
------------

[minio](https://www.minio.io/) に含まれる [mc](https://docs.minio.io/docs/minio-client-complete-guide) コマンドを使う。gsutil とはコマンド名や挙動に互換性はないので注意。

	brew install minio-mc

設定例については README に記述がある。

	mc config host add gcs https://storage.googleapis.com xxxx xxxxxxxxxxxxxxxx
	mc mirror --force /from/ gcs/your-bucket/to/

上書きしたい場合は `--force` が必要。削除をするなら `--remove` を指定する。

一部の日本語文字は化けて表示されるが、出力自体は見やすい。欠点として、特定のファイルを除外するオプションがない。

まとめ
---------

`awscli` や `gsutil` がいつか対応するまでは、`mc` コマンドでひとまず代用できる。
[Review] MLE and MAP ~Maximum Likelihood Estimate and Maximum a Posteriori Probatility~

## Introduction
This article aims at explaining the whole picture of MLE and MAP, then makes the difference between them clear.
![image.png](https://qiita-image-store.s3.amazonaws.com/0/240801/6d78dd36-46a5-a1fe-1d30-136c15dd2332.png)

## Agenda
1. MLE
2. MAP

### MLE
In statics, MLE is a method of estimating the parameters of a statistical model, given observations. MLE attempts to find the parameter values that maximise the likelihood function, given the observations. The resulting estimate is called a maximum likelihood estimate.

The methods of ML(maximum likelihood) is used with a wide range of statistical analyses. As an example, let's say that we are interested in the heights of adult female penguins, but are unable to measure the height of every penguin in a population. Assuming that the heights are normally distributed with some unknown mean and variance, the mean and variance can be estimated with MLE while only knowing the heights of some sample of the overall population. MLE would accomplish that by taking the mean and variance as parameters and finding particular parametric values that make the observed results the most probable given the normal model.
InAppBrowserで表示した上に要素を表示

Hato Poppo Project様からの引用です。


<a href="http://hatopp.wpblog.jp/archives/914">InAppBrowserで表示したサイト上にFAB風の［閉じる］ボタンを設置する</a>

これで初めてInAppBrowserの上に要素を置けることを知りました。
まだまだ勉強が必要ですね。

 code:　←これでjsなどが書けたりするみたいです。
eclipse ローカルホスト での tomcat  で必要な幾つかのポート (8080, 8009) がすでに使用中です。サーバーはすでに別のプロセスで稼働中であるか、システム・プロセスがそのポートを使用中である可能性があります。このサーバーを始動するには、他のプロセスを停止するか、ポート番号を変更する必要があります。

ターミナルでコマンド入力 
<h2>sudo lsof | grep LISTEN

使用しているポートのID番号確認　

<h2>kill + ID番号

で抹殺。

eclipse立ち上げてtomcatの再開始
(Github)ディスカッションとかプロジェクト管理やWiki(ドキュメンテーション)はコントリビューションにならないんですか？

## 注意
本稿は何かしらのアクションなど解決を求めるものではありません。
いちポエムとして笑って流してください。

## 言いたいこと
（日本の）世の中にはハッカソンにアイデアソンもあるのに、意見やアイデアはコントリじゃないんですか…？

## Q. `git log`に反映されないからコントリに反映できないのでは？
Issueやコードレビューはしっかりコントリに反映されるので、そんな事はないはず。

## Q. アイデアだけでは貢献性が低いのでは？
アイデアをいただいて対応する事を考えた場合、貢献性が低いアイデアを実装した場合はコントリに反映されます。
貢献性が低いアイデア自体はコントリに反映されません。これはおかしいと思います。

## Q. 直接運営に言ってみては？
今回の問題はGithubの問題を提起したいものではなく、Github転職プロジェクトの一環で気付いたものです。
元記事主やサービスにクレームをするものではありません。

https://qiita.com/sagae_twins_developper/items/ecac0fa91358378f1396

### 誤解させてる気しかしないので、言い訳
フォローというワケではないんですが、私個人として採用基準を色々模索してみて実施しているエージェント・スカウト事業社は好感を持っています。
そもそも私自身もGithub転職プロジェクトを掲げて試行錯誤している最中なので、こういったサービスがうまく定着してくれればエンジニアに新しいバリューを提供していけると思います。
もちろん、空pushをbatで見た目上のコントリ数を増やせてしまうため、単純なコントリ数を計測するだけでは問題点もありますが記事主さんは認識していそうな印象を持っています。

参考までに、過去に公開リポジトリのコードをAIに掛けて独自基準で評価するシステムを活用したエージェントがありました。
少しだけ私も関わったんですが、今でも活動されているんでしょうか。

## エンジニアリングスキルとマネジメントスキル
今回の趣旨はここなんでしょうね。
Githubが評価しているのはエンジニアリングスキルであって、マネジメントスキルではないという意味であれば納得できます。
サイト名にgitがあるので、コントリビューションにgitの使い方が上手い人を想定していそうな気がしないでもないですが、`git submodules`とか`git filter`を評価しているようには思えないので、この辺りも判断が難しそうです。

コントリ数で評価する方法もアプローチとして面白そうですが、課題は多そうです。

## 採用者は見極めを、被採用側は発信を
これまた誤解を与える表現になってしまいましたが、採用者がする見極めとは応募者の演技を見抜くとかそういう話ではありません。
今回のケースだと自身（自社）の採用システムは応募者に正しいメッセージを発信できているか、勘違いさせてしまった結果、期待していた人物とは異なる方が応募してしまった場合はサービス側の問題だと受け取れているかどうか、というお話です。
実際は採用側はシステムに明るくない人事部の方である事が多いと思いますので、なかなか議論されにくいですが採用で独自システムを使用している場合、エンジニアの方は上記の観点で採用活動に同席されると自社サービスの問題点に気付きやすいと思います。
また、案件を取ってくる営業の方にとってデータを投入しやすいシステムである事も重要な観点です。この辺りは運用の仕方もあると思いますが、結局のところ人材マッチングの精度を上げていく事ができれば、どんな採用システムでも解消できていくと思います。

被採用者は、エントリーシート(通称ES)を送るのがよくやる発信作業ですが、ESに書いていない（書けない）内容で公開可能なものはバンバン出してしまっていいと思います。
この考え方が合う企業からは別途メッセージが来るでしょうし、逆に合わない企業からはメッセージが来なくなるので、一種のフィルタリングができます。
後は、発信者（被採用者）が企業の話を聞いてみて、両者が合うものを選べば良いと思います。
もちろん、専門性の高いスキルやキャッチーな経歴があるならESを作り込むのも一手です。

## おまけ：Github Wikiをコントリビューションに反映する方法
`https://github.com/(ユーザーID)/(リポジトリ名).wiki.git`がWikiの更新履歴の全部を持っているので、これをコントリビューションに反映させるために通常の手段でリポジトリを作ってpushするだけです。
Wikiの更新をトリガーに出来たかどうかは分かりませんが、リアルタイムでなくてもいい場合はGithubActionsのworkflowトリガーをタイマーにすることで自動化できます。

## 次の記事
- [(9日目) 在宅フリーランスの勉強・仕事へのモチベーション管理例](https://qiita.com/nomurasan/items/1ab798e5794cc4b29b65)
- [カレンダーページ](https://qiita.com/advent-calendar/2022/oreno_nomurasan2022)
ChatGPT部#63 発表後ディスカッションから得た知見と考察から急激な進化を続けるAIサービスにどのように向き合うべきか考える

## 発表資料
https://qiita.com/nomurasan/items/ab3e73c1bf7ba1ae8b1e

## 経緯
元々は発表資料の後付けで作っていたのですが、内容が多くなってしまったのでページ自体を分けました。
資料は発表前からconnpassでも共有していたため、内容を差し替えると当時の話と大きく乖離してしまうことを危惧したこともあり書き直しました。

## 👦発表後所感
DeepResearchへの考え方について、私が見えていない世界について様々教えていただきました。
「この後やりたいこと」に対して「こうするといいよ」「ここは気をつけよう」というものです。
非常に嬉しかった反面、その経験値がここに反映されていないので、スライドをこのまま公開していていいのか🤔と疑問を覚えたため、追記するという判断をしました。

以下、全て👦の作成物です。

---

# これからはAIを使いこなすスキルも実務経験と同じぐらい重要になる

---

## （発表後追記）見えている世界の違い
:::note warn
この辺りは要議論です
:::

私が思うに「AIサービスを使いこなしている人」と「AIサービスを使いこなしていない or 業務利用できるAIサービスを探している人（筆者はここに該当）」では見えている世界が違うのではないかと思ってます。
「AIが仕事を奪う」という議論は度々交わされますが「AIを使いこなせる人がAIを使えない人の仕事を奪う」が正しい表現なんだろうと、今日の発表後ディスカッションからも感じたところです。
少なくとも、DeepResearchを一週間触っただけでは分からなかったです。

---

## （発表後追記）【考察】非データサイエンティストが見る、本職のデータサイエンティストに求める役割の変化
:::note warn
本職のデータサイエンティストではなく、一緒に業務を行った経験がある人間の立場としての目線です
:::

AIを使うからにはプロンプトに対するAIの生成結果への分析はやります。
が、実際問題として生成結果に至るまでに対する考察や分析も必須になるはずです。
業務利用からもハルシネーションやエビデンスに対して情報の出所の精査が不要の立場から見ても、利用過程のどこかでAIの思考プロセスを知る必要が生じると考えています。

とはいえ、現実問題として実務的には情報の出所を扱う事はない、あるいは情報の出所自体を欠損しても困らない業種もあるため、情報の精度精査がデータサイエンティストのバリューになると考えています。

--- 

## （発表後追記）非参加者向けの要約・エンジニアの心構え
読者向けにはこちらが重要そうなのですが、 `ある程度のエンジニア経験と業界知識を持っているレベル（筆者レベルを想定）では今の時点でもAIに代替される` ため、代替が難しい（＝AIが出せないバリューは何か）を考えるべきだろうと感じています。
設計だろうが実装だろうが根拠をDeepResearchで引っ張ってこれるからです。
DDDをTDDベースでやろうとすると個社カスタマイズが必須のため、AIがコード化するのは難しいのでは？とも思いたくなりますが、大体の場合はプロンプトの問題です。（もちろん、AIに開示できない情報はあるかもしれません）
エンジニア界隈でありながらデータ化されていないかされにくい属人的なナレッジが多いのもここです。

また、反例的にあまりにも情報が多すぎて人間だけでは処理できないレベルに到達してしまっており、データ化されていても発見または活用が難しい状況になってしまっています。
DeepResearchでこれらの情報にアクセスするためには、やはりプロンプト側から具体性を持ったキーワードを含める事ができるのか？というのは重要な点になると考えています。

---

## （発表後追記）AI初学者が研究・分析以外の実務で使いたい時に気にするべきこと
:::note
自分にとって必要な「AIスキル」を言語化しよう
:::

テキスト生成系はわりかし精度比較をしやすいので議論しやすいのもありますが、ユーザー目線からは「精度以前に、そもそも生成結果が使えるものか」という観点でのレビューの需要が高い事が多いです。
無理やりゲームハードに言い換えると「高性能・高画質なPSシリーズ」と「どこでも遊べるし、ここにしかないソフトがある任天堂ハード」でどちらを選ぶか？という話のニュアンスが近い気がします。

今回でいえば「DeepResearchはその人にとってどちらのハードに属するか？」という話であると認識しています。
そのため、私がDeepResearchの性能を理解していない事で誤った情報（少なくとも知らないので書けなかった）を発信してしまうリスクを低減したいという気持ちです。

---

## （発表後追記）AI研修の現場としてできる事
現在のプログラミングスクール・研修事業者が提供するAI研修は、主にChatGPT（GPTsを含む）の使い方やAIリスク・セキュリティの話を中心に取り上げています。
AIをこう使うと良いよ！というベストプラクティスな話はほとんどありません。（０ではない）
また「AIニューズを追いかけようね」という締めをするのですが、初学者にとってはニュースそのものが氾濫気味な上に、どの情報を信用すれば良いか、情報の見極め方についても語れる講師はほぼいないように思います。
今回のDeepResearchの検証でも思ったのですが「それぞれのAIツールをどうやって使っていくか？」というサービス固有のハウツーユースの価値が上がっていくのではないかな、と思っています。

そして、ある程度エンジニアリング経験がある人でもAI固有の仕様や振る舞いのようなものを分析していくフェーズに移行している事を痛感しています。

---

## 次はあなたの番です
今回はDeepResearchの話を終始やりましたが、DeepResearchによらずAIサービスを使いこなすにはベンダー依存しないように（？）各社サービスが競合が持つ機能相当のサービスに付加価値をつけて展開しようとしています。
DeepResearchに次いで新たなサービスが出てきた時に、適切なキャッチアップがだんだん難しくなってくるのではないかというのが今回の体験を通じて私が学んだ事です。

AIに対する接し方として正しい・間違いもないという前提で、どのような人間がどういう目的でAIを活用しようとしているのか、その立場から感じた生の声の価値が高まってくるはずです。
もちろん情報発信の質を高める事も重要ながら、発信者の数自体を増やす事も同等以上に価値が高くなっていると思います。
エラー bad interpreter :Not such file or directoryをどう処理したか

##環境
macbook
Anaconda
python 3.6.5
##状況
プログラミング初心者です。
Pythonを使い始めて、HTML形式のファイルを読み込むためにhtml5libモジュールをダウンロードしようと、コマンドラインで
`$ conda install -c anaconda html5lib`
としたところ、次のエラーが出ました。
`/Users/anaconda3/bin/conda: /anaconda3/bin/python: bad interpreter: No such file or directory`
##対応策
そんなファイルまたはディレクトリはないよ、といったエラーが出ました。
始めて見たエラーだったので取り敢えずネットで調べていたら似たような状況で質問している人を見つけたのでこれを元に対応してみることに
https://stackoverflow.com/questions/39884499/conda-command-will-prompt-error-bad-interpreter-no-such-file-or-directory#
<img width="1074" alt="スクリーンショット 2018-08-09 22.01.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/249818/10b07e3a-1a37-7064-f708-474624304b70.png">
condaのコマンドを入れようとして似たようにファイルやディレクトリが存在しないというエラーが出ています。
これに対しての回答が
<img width="737" alt="スクリーンショット 2018-08-09 22.20.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/249818/1025c959-398f-015c-bc99-f3e3130a97b5.png">
でした。
要約するとインストールに誤りがあり、存在しないインタープリター（解釈プログラム？）を探している。
この問題はcondaのscriptで記述される#!shebang(シバンと言って、Unix系システムにおいて、ファイルに書かれたプログラム文をどうやって実行するかを指定しているそうです。)によるものだろう、ということです。
このcondaのscriptの#!shebang文をテキストエディタなどで書き換えることによってエラーが回避できるそうです。

実際にやってみました。
まずcatでファイルを閲覧してみます。
`$cat conda`
とすると次のような結果が
<img width="535" alt="スクリーンショット 2018-08-09 22.46.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/249818/9bccba8f-baaf-89bd-1724-8e70ac9e6019.png">
このshebang文を
`#! /Users/anaconda3/bin/python`
と書き換えてから、インストールを実行するとうまくダウンロードできました。


結果的には具体的な原因がわからなかったので、あくまで一例として考えてください。
損失関数）クロスエントロピー誤差

![nn05.png](https://qiita-image-store.s3.amazonaws.com/0/276318/257821cc-e61d-81fd-3e88-3af923145a85.png)


#損失関数
前回で最終出力の $z_1^4, z_2^4, z_3^4$ がわかりました。
これらの値がそれぞれ $t_1, t_2, t_3$ と同じ（か、ひじょうに近い値）であれば期待した出力といえます。
しかし、重みやバイアスの初期値は適当な（いいかげんな・ランダムな）値になっているため、初めから期待した出力になるわけではありません。
そこで、損失関数を使い、現時点の出力が期待する出力とどれだけ乖離しているか（誤差）を調べ、
出力が期待する値になるように、重みやバイアスといったパラメータを調整していきます。

今回、出力層の活性化関数には <font color="OrangeRed">$Softmax$</font> 関数を適用しているので、
損失関数にはクロスエントロピー誤差（交差エントロピー誤差）を採用します。

#クロスエントロピー誤差
このニューラルネットワークでのクロスエントロピー誤差（<font color="red">$E$</font>）は以下の式で表されます。

```math
E = - \sum_{k=1}^3 t_k \log z_k^4 
```

$\sum$ を展開するとこのようになります。

```math
E = - \sum_{k=1}^3 t_k \log z_k^4 = - (t_1 \log z_1^4 + t_2 \log z_2^4 + t_3 \log z_3^4)
```

#教師データ
今回、教師データは one-hot表現 としています。
これは、正解のラベルが 1 でそれ以外は 0 となっているデータです。
例えば、$t_2$ が正解ラベルの場合、次のようになります。

```math
\begin{bmatrix}
t_1 \\
t_2 \\
t_3
\end{bmatrix}

=

\begin{bmatrix}
0 \\
1 \\
0
\end{bmatrix}
```

#誤差の計算
具体的に誤差の計算をしてみます。
いま、期待する出力として、以下の出力を得たいとします。

```math
\begin{bmatrix}
t_1 \\
t_2 \\
t_3
\end{bmatrix}

=

\begin{bmatrix}
もも \\
りんご \\
ぶどう
\end{bmatrix}

=

\begin{bmatrix}
0 \\
1 \\
0
\end{bmatrix}
```

つまり、りんごの出力（このニューラルネットワークでは $z_2^4$）が最大になるようにしたいとします。
ところが、ニューラルネットワークの最終出力が次のような場合、損失関数の値はどのようになるでしょうか。
（出力層ではソフトマックス関数を適用しているので、出力の総和が 1 になっています。）

```math
\begin{bmatrix}
もも \\
りんご \\
ぶどう
\end{bmatrix}

=

\begin{bmatrix}
z_1^4 \\
z_2^4 \\
z_3^4
\end{bmatrix}

=

\begin{bmatrix}
0.5 \\
0.2 \\
0.3
\end{bmatrix}
```


```math
\begin{align}
E &= - (t_1 \log z_1^4 + t_2 \log z_2^4 + t_3 \log z_3^4) \\
&= - (0 \times \log 0.5 + 1 \times \log 0.2 + 0 \times \log 0.3) \\
&= - (0 \times (-0.30) + 1 \times (-0.70) + 0 \times (-0.52)) \\
&= - (-0.70) \\
&= 0.70
\end{align}
```

では、最終出力が次のようだった場合はどうなるでしょうか。
今回は、りんごの出力が最大になっています。

```math
\begin{bmatrix}
もも \\
りんご \\
ぶどう
\end{bmatrix}

=

\begin{bmatrix}
z_1^4 \\
z_2^4 \\
z_3^4
\end{bmatrix}

=

\begin{bmatrix}
0.3 \\
0.5 \\
0.2
\end{bmatrix}
```


```math
\begin{align}
E &= - (t_1 \log z_1^4 + t_2 \log z_2^4 + t_3 \log z_3^4) \\
&= - (0 \times \log 0.3 + 1 \times \log 0.5 + 0 \times \log 0.2) \\
&= - (0 \times (-0.52) + 1 \times (-0.30) + 0 \times (-0.70)) \\
&= - (-0.30) \\
&= 0.30
\end{align}
```


先ほどと比べて損失関数の値が小さくなっています。

さらに次のような場合はどうでしょうか。
今度はさらにりんごの出力値が大きくなっています。

```math
\begin{bmatrix}
もも \\
りんご \\
ぶどう
\end{bmatrix}

=

\begin{bmatrix}
z_1^4 \\
z_2^4 \\
z_3^4
\end{bmatrix}

=

\begin{bmatrix}
0.05 \\
0.90 \\
0.05
\end{bmatrix}
```


```math
\begin{align}
E &= - (t_1 \log z_1^4 + t_2 \log z_2^4 + t_3 \log z_3^4) \\
&= - (0 \times \log 0.05 + 1 \times \log 0.90 + 0 \times \log 0.05) \\
&= - (0 \times (-1.30) + 1 \times (-0.05) + 0 \times (-1.30)) \\
&= - (-0.05) \\
&= 0.05
\end{align}
```

先ほどと比べてさらに損失関数の値が小さくなっています。

#まとめ
このように、正しい（期待する）出力に近ければ近いほど損失関数の値は小さくなっていきます。
なので、損失関数の値が小さくなるような出力となるように、重みやバイアスなどのパラメータを調整すれば、
正しい判断のできるニューラルネットワークになります。

また、ソフトマックス関数が出力を確率として求めていることを考えると、
２つめの例では 50% (0.5) の確率でりんごだと思っていて、
３つめの例では 90% (0.9) の確率でりんごだと思っていると考えることができます。
損失関数の値は、ニューラルネットワークがどの程度（自信をもって）正しく判断しているかの目安になります。
続・今更聞けないシグナル・スロット総整理

# 1. 初めに

[今更聞けないシグナル・スロット総整理](https://qiita.com/argama147/items/30da69e4c1088917d522) 記事のサンプルアプリを作りました！
[GitHub](https://github.com/argama147/qiita-qt-signalslotsample)に登録してありますので、よかったら参考にしてください。
それでは！！
。
。
。
ってわけにはいかないので、簡単ですが、アプリの説明をします。

# 2. こんな画面のアプリです

![image1.png](https://qiita-image-store.s3.amazonaws.com/0/69678/b5c003a4-9135-f538-2ac4-86e0bc61b61c.png)

![image2.png](https://qiita-image-store.s3.amazonaws.com/0/69678/5c476f14-d472-62c3-5b81-cda0874a2d5e.png)

設定は、ToolBoxで「基本動作」、「オーバーロード対策」に分けています。
使い方はシンプル！

ComboBoxでconnect関数やシグナルの種類を選択→「connect」ボタンを押下→「send Signal」ボタンを押下

と順番に操作するだけです。
動作は、Qt Creator等のログ出力画面で確認できます。
ログ内容を検索すれば、どの処理を通っているかはわかると思います。

# 3. オーバーロード対策は、C++Version縛りに注意

[今更聞けないシグナル・スロット総整理](https://qiita.com/argama147/items/30da69e4c1088917d522) の記事でも説明しましたが、C++11以上、またはC++14以上でないと動作しない記述方法があります。
C++Veresionはプロジェクトファイルで切り替えます。

```
CONFIG += c++11
or
CONFIG += c++14
```

のように記述すればC++11やC++14になります。
（※Qt5用の記述方法です。Qt4の記述方法は異なりますが省略します）
当然、ビルド設定で指定したコンパイラが、C+11やC++14に対応していない場合はビルドできません。
私は、Windows10上で「Qt_5_10_1_MinGW_32bit」を指定してビルドしています。

cppファイル上は、

```
#if __cplusplus  >= 201103L //C++11以上
#endif

 or

#if __cplusplus  >= 201402L //C++14以上
#endif
```

のように記述して、C++Version依存コードを囲っています。

※尚、自分の環境では、「CONFIG += c++11」を記述しなくてもC++11としてビルドされてしまう為、C++03の動作は確認できていません。
ビルドログを見ると、「-std=gnu++11」が付いている影響のように見えますが、明示的にC++03固定でビルドする方法がわからなかった為、C++11とC++14の動作差分だけ確認しています。
たぶん、判定はうまくいっているはずです。。。

# 4. 最後に

明日(2018/08/10)はコミケ１日目。
Qtの本が売られるようなので、買いに行くつもりです。
私自身もQt本（Qt5入門書）の執筆に挑戦中。
Qt初心者の方に読んでいただけるような本にしたいと思っていますので、ご要望があれば、気軽にコメント欄にコメントをお願いします。
Reactの環境構築 (ES2015)


Reactの環境開発でだいぶつまずいたのでメモ

#環境

node  8.11.1
npm 5.7.1

#構築手順
作業ディレクトリの作成

```
mkdir react-sample && cd $_
```

package.jsonを生成します

```
npm init -y
```
以下のように生成されます

```package.json
{
  "name": "react-sample",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
```

babelのパッケージをインストールします
-Dは--savedevでもいい。devDependenciesに自動的に記録されます。

```
$ npm i -D babel-core babel-loader babel-preset-env babel-preset-react babel-preset-es2015
```

babelの設定ファイルを作成

``` 
touch .babelrc
```

.babelrcは以下のように作成

``` 
{
  "presets":["es2015"]
}
```

ソースコードを入れるディレクトリとコンパイル後のコードを入れるディレクトリを作成します

```
mkdir src dist
```

webpackとwebpack-cliをインストールします。

```
$ npm i -D webpack webpack-cli
```

webpack.config.jsの作成

```
touch webpack.config.js
```

webpack.config.jsは以下のように作成します。

```webpack.config.js
module.exports = {
  mode: "development",

  entry:__dirname + '/src/app.js',
  output: {
    path:__dirname + '/dist',
    filename:'bundle.js'
  },
  module: {
    rules: [
      {
        test: /\.js$/,
        use: [
          {
            loader:'babel-loader',
            options:{
              presets:[
                ['env',{'modules':false}],
                'react'
              ]
            }
          }
        ]
      }
    ]
  }
};
  
```
reactのパッケージのインストール

```
npm i -S react react-dom
```

Reactのコードをかきます

```
touch src/app.js
```

app.jsは以下のように作成します

```app.js
import React, { Component } from 'react';
import ReactDOM from 'react-dom'

class App extends Component {
  render() {
    return (
      <h1>Hello world!</h1>
    );
  }
}

ReactDOM.render(
    <App />,
    document.getElementById('main')
)

```

htmlファイルを用意します

```
touch index.html
```

```index.html
<!doctype html>
<html>
    <head>
        <meta charset="utf-8">
        <title>React-sample</title>
    </head>
    <body>
        <div id="main"></div>
        <script src="./dist/bundle.js"></script>
    </body>
</html>

```

コマンドでビルドできるように設定します

```package.json
"scripts": {
  "test": "echo \"Error: no test specified\" && exit 1",
  "build:dev": "webpack --mode development",
  "build:pro": "webpack --mode production"
},

```

npm run build:devでビルドできるようになりました
次にwebpack-dev-serverをインストールします。
以下のコマンドを入力します。

```
npm i -D webpack-dev-server
```

これもコマンドで動かすことができるように設定します。

```package.json
"scripts": {                                                                                  
  "test": "echo \"Error: no test specified\" && exit 1",
  "build:dev": "webpack --mode development",
  "build:pro": "webpack --mode production",
  "start": "webpack-dev-server --mode development"
}
```

npm startでserverを動かすことができます。
ビルドしたあとにnpm initすることで以下のような画面になります
![Screenshot_2018-08-09 React-sample.png](https://qiita-image-store.s3.amazonaws.com/0/240403/9f97df33-09df-a249-4d27-808e75ab1bac.png)

以上で完成です
画像URLやリンク先URLを一括取得できるPHPライブラリ、ImlinScraperを公開しました。

Webページの画像URLやリンク先URLを全て取得したいということが結構あったのでライブラリ化させて公開しました。

https://github.com/awesam86/imlinscraper
GitHubで公開して、Composerから導入できるようにしました。

## どんなライブラリなのか

[ImlinScraper](https://github.com/awesam86/imlinscraper)は、Webページ内のimg要素やa要素の情報を一括で取得して配列で返すスクレイピング系ライブラリです。複数ページから一括で取得することや、外部リンクのみを抽出するといったことも簡単にできます。検索エンジンの検索結果から情報収集する時なんかに役立ってくれる感じですね。

## 導入方法

### Composerからの導入

Composerのインストールはされていることを前提とします。
composer.jsonに以下を記述。

```json
{
    "require": {
    "awesam86/imlinscraper": "~1.0"
    }
}
```
composer installで導入。

```terminal
$ composer install
```
これで、あとはautoload.phpをrequireなどで読み込むだけで使えるようになります。

### GitHubからダウンロードして使用する場合

Composer経由でなくても、GitHubからダウンロードしてsrc/Awesam86/ImlinScraperの中にあるScraper.phpを読み込むことで使用可能となります。

## 使用方法

### autoload.phpの読み込みと名前空間のインポート

```php
// autoload.phpの読み込み（autoload.phpのパスが異なる場合は適宜変更してください）
require_once __DIR__."/vendor/autoload.php";
// useを使って名前空間のインポート
use Awesam86\ImlinScraper\Scraper;
```
GitHubからダウンロードした場合は、autoload.phpの読み込みの代わりにダウンロードしたScraper.phpを読み込みます。

```php
require_once "ダウンロードしたScraper.phpのパス";
```

### Scraperインスタンスの生成

インスタンスの生成時にページURLを引数で渡します。
複数URLを配列で渡すことで一度に複数ページの情報を取得することもできます。
また、取得する際のUAを変更したい場合は第二引数で指定することも可能です。

- 第一引数：String or Array - ページURL（省略可）
- 第二引数：String - UserAgent（省略可）

```php
// 1ページの情報取得の場合
$scraper = new Scraper('情報取得したいURL');
// 複数ページの情報取得の場合
$scraper = new Scraper(['情報取得したいURL1','情報取得したいURL2']);
```

### 画像情報を取得する方法

インスタンス生成時にページURLを引数で渡さなかった場合や、ページURLを変更したい場合は引数でページURLを渡すことが可能です。
また、特定の要素の子要素のみを取得したい場合などは第三引数にXPathの構文を指定することで取得することもできます。

- 第一引数：String or Array - ページURL（省略可）
- 第二引数：String - UserAgent（省略可）
- 第三引数：String - カスタムXPath（省略可）

戻り値の配列のキー
src => 画像URL
alt => 代替テキスト

```php
// 通常取得の場合
$imgsInfoArray = $scraper->GetImagesData();
// UserAgentを指定した場合
$imgsInfoArray = $scraper->GetImagesData(NULL,'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:43.0) Gecko/20100101 Firefox/43.0');
// XPathで要素を指定した場合（下記の場合はdiv要素の子要素のみを取得します）
$imgsInfoArray = $scraper->GetImagesData(NULL,NULL,'div/');

// 戻り値の配列を出力
var_dump($imgsInfoArray);
```

### リンク情報を取得する方法

第三引数までは、画像情報の取得と同じです。
第四引数は、外部リンクのみ取得したい場合にtrueにしてください。（デフォルト値はfalse）

- 第一引数：String or Array - ページURL（省略可）
- 第二引数：String - UserAgent（省略可）
- 第三引数：String - カスタムXPath（省略可）
- 第四引数：Boolean - 外部リンクのみの抽出（省略可）

戻り値の配列のキー
href => リンク先URL
text => ノード値

```php
// 通常取得の場合
$linksInfoArray = $scraper->GetLinksData();
// 外部リンクのみを取得する場合
$linksInfoArray = $scraper->GetLinksData(NULL,NULL,NULL,true);

// 戻り値の配列を出力
var_dump($linksInfoArray);
```