OmniAICreator/Qiita-1.07M huggingface dataset:
Python3 初心者　反復処理その他

# zip()を使った複数のシーケンスの処理
### シーケンスとは
シーケンスはリストやタプルなどの並んでいる順番で処理をするもののこと

では実際にzip()を使ったものを使ってみます。これから示す例は班行動で何をするのか、何を昼ごはんに食べるのかというものです。

```py
moths=['number 1', 'number 2', 'number 3']
doings=['play baseball', 'go shopping', 'buy cakes']
lunchs=['sushi', 'ramen', 'udon']
for moth, doing, lunch in zip(moths, doings, lunchs):
    print('Your moth is', moth, 'You do', doing, 'You eat', lunch)


Your moth is number 1 You do play baseball You eat sushi
Your moth is number 2 You do go shopping You eat ramen
Your moth is number 3 You do buy cakes You eat udon
```

まあfor文はシーケンスに入っている要素の''をなくすようなものだと思ってください！！

# range()による数値シーケンスの作成
range()を使うことによって値をコンパクトな形でストリームを返すことができる。rangeはrange(最初の数、 指定した数の一つ低い値)まあ説明したほうが早いですね！笑笑

```py
for x in range(0, 5):
    print(x)

0
1
2
3
4
```

って感じになります！！

#　内包表記
## リスト内包表記
リストといえば

```py
list=[1, 2, 3, 4]
```

とかが普通ですが、内包表記ではリストの中に反復処理などを入れるような感じですね！！

```py
number=[num for num in range(0, 6)]
number
[0, 1, 2, 3, 4, 5]
```

のようにリストの中に条件を書いたりすることが可能になります。これだとコードが短く済んで処理が早くなりますしみやすくもなります！！

```py
[表示したい結果　for　結果　in　どのようなものか]
```

だいたいこんな感じです笑笑。まあやってみるのが一番わかりやすいと思います！！これから使うコードは「オライリージャパンさんの入門python３」をみてやっていきます。下の方にリンクを貼っておきますのでわかりやすい参考書なのでぜひ読んでみてください！！

```py
rows=range(1, 4)
cols=range(1, 3)
cells=[(row, col) for row in rows for col in cols]
for cell in cells:
    print(cell)
(1, 1)
(1, 2)
(2, 1)
(2, 2)
(3, 1)
(3, 2)
```

このコードは考えてみると簡単でrowsには(1, 2, 3),colsには（1, 2)が入っている。そしてrowとcolをタプル化しています。このようにしてタプルのアンパックを使えばタプルからrow、colを引き抜くことが可能になる。

```py
for row, col in cells:
    print(row, col)
1 1
1 2
2 1
2 2
3 1
3 2
```
# 辞書包括表記
文字列を辞書化していく。今からやるものは文字列の文字を数えるものである

```py
word='letters'
letters_counts={letter: word.count(letter) for letter in word)
letters_counts
{'l': 1, 'e': 2, 't': 2, 'r': 1, 's': 1}
```

これは確かに間違っていないことはないが、もっと早く処理する方法がある。この場合だと全てのwordが出てきてその数を数える形になっているが、in　wordのところをin　set（word）にすることによって一つ一つの値を確認して行なっている一つ目のコードよりも楽になる。

#  集合内包表記
これはif文とかも使えることができる。

```py
numbers={number for number in range(1, 6) if number%2==0}
numbers
{2, 4}
```

>オライリージャパン入門python3
https://www.oreilly.co.jp/books/9784873117386/
rustの&mut分からん☆（＾ｑ＾）

うろ覚えで書くと

```rust
#[derive(Clone, Copy)]
pub struct Banana {
    // 略
}

pub fn get_banana(&self) -> Banana {
    self.banana
}
```

こんな感じでバナナのコピーを返して

```rust
boss.get_banana().change_color();
```

こんな雰囲気で　バナナのプロパティを変えても　'boss' のバナナのプロパティは変わらないのだった。

```rust
    // いろいろ略。
    pub fn change_banana_color(&mut self) {
        self.banana.change_color()
    }

// こう使う。
boss.change_banana_color();
```

こうラッピングするのが　いいのか☆（＾～＾）？
[EC-CUBE4]SESからメール送信する

運営している宿泊予約システムに物販機能を追加したいということでEC-CUBE4を使うことに。
EC-CUBE4の構造は全く把握していないけど、リリースページを見るとかなり洗練されている模様。
カスタマイズは「**既存システムの顧客とポイントを連動させる程度**」なのでなんとかなるかなということで選択。

で、現在のシステムではSESからメール送信しているので、それを使いたい。

いまどき「SESからメール送信」という頻出機能は簡単（おそらくプラグインを追加してIAMアカウントとシークレットキーを設定）にできるよね。。。って、あさはかでした。
プラグインもなければカスタマイズの情報もない。プログラム改修は不要でしたが、解決まで２時間くらい要しました。

先が思いやられます。。。涙

# SESのSMTP設定

SESはSMTPとして利用することができます。手順は簡単。

![](https://i.gyazo.com/86dd116a4029f23cc85bd830f03bb8f4.png)
![](https://i.gyazo.com/f52fbbe20e5d8d8a22925be82efb8a52.png)

# 環境変数（MAILER_URL）を変更

インストール時にメールサーバを設定してもtlsが有効になっていないのでメール送信時に接続エラーになります。
そこで`MAILER_URL`の値を以下のように書き直す。
(MAILER_URLはインストーラを使用した場合`.env`に設定されている（本番ではApacheの環境変数への設定が推奨されている）)

*変更前*

```
MAILER_URL=smtp://<SMTPユーザ名>:<SMTPパスワード>@<Server Name>:587?auth_mode=plain
```

*変更後*

```
MAILER_URL=smtp://<SMTPユーザ名>:<SMTPパスワード>@<Server Name>:587?auth_mode=login&encryption=tls
```
今年の言語はRust その６０

# 今年の言語はRust その６０

Rustを学びます

Rustの日本語ドキュメント 2nd Edition
https://doc.rust-jp.rs/book/second-edition/

オリジナル(英語)
https://doc.rust-lang.org/book/


## 実行環境

```sh
$ cargo -V
cargo 1.33.0 (f099fe94b 2019-02-12)

$ rustup -V
rustup 1.17.0 (069c88ed6 2019-03-05)

$ rustc --version
rustc 1.33.0 (2aa4c46cf 2019-02-28)

$  cat /proc/version
Linux version 4.14.97-74.72.amzn1.x86_64 (mockbuild@gobi-build-64002) 
(gcc version 7.2.1 20170915 (Red Hat 7.2.1-2) (GCC)) 
#1 SMP Tue Feb 5 20:59:30 UTC 2019

$ uname -a
Linux ip-10-100-0-8 4.14.97-74.72.amzn1.x86_64 
#1 SMP Tue Feb 5 20:59:30 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

$ cat /etc/\*release
NAME="Amazon Linux AMI"
VERSION="2018.03"
ID="amzn"
ID_LIKE="rhel fedora"
VERSION_ID="2018.03"
PRETTY_NAME="Amazon Linux AMI 2018.03"
ANSI_COLOR="0;33"
CPE_NAME="cpe:/o:amazon:linux:2018.03:ga"
HOME_URL="http://aws.amazon.com/amazon-linux-ami/"
Amazon Linux AMI release 2018.03

```

## 19. 高度な機能

通常なら飛ばして後から考えますが、今回は全写経が目的なので、
理解朧げでもひたすら写経して進んでいきます。


### 19.5 高度な関数とクロージャ


#### 関数ポインタ

やっと来ました__関数ポインタ__

こんな簡単に使えるなんて嬉しいわ。

```rust

fn add_one(x: i32) -> i32 {
  x + 1
}

fn do_twice(f: fn(i32) -> i32, arg: i32) -> i32 {
  f(arg) + f(arg)
}

fn main() {
  let answer = do_twice(add_one, 5);

  println!("The answer is: {}", answer);
}
```

#### クロージャを返却する

クロージャの返却にはBoxを使えばよいのですね。

```rust
fn returns_closure() ->Box<Fn(i32) -> i32>{
  Box::new(|x| x + 1)
}

```

やっと終わった！

念願のWebサーバー構築！


イエス！


あと、5/8にRustの最新本がでるみたいです! 気が付いてラッキー！ (現在5/7)

[実践Rust入門[言語仕様から開発手法まで] 単行本（ソフトカバー） – 2019/5/8](https://amzn.to/2VdAQ6y)

<a href="https://www.amazon.co.jp/%E5%AE%9F%E8%B7%B5Rust%E5%85%A5%E9%96%80-%E8%A8%80%E8%AA%9E%E4%BB%95%E6%A7%98%E3%81%8B%E3%82%89%E9%96%8B%E7%99%BA%E6%89%8B%E6%B3%95%E3%81%BE%E3%81%A7-%CE%BAeen/dp/4297105594/ref=as_li_ss_il?_encoding=UTF8&psc=1&refRID=KADG0R1CJZD9Y07B3P7E&linkCode=li2&tag=peace098beat-22&linkId=52fef8a307968a1010a3375899274077&language=ja_JP" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4297105594&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=peace098beat-22&language=ja_JP" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=peace098beat-22&language=ja_JP&l=li2&o=9&a=4297105594" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

※アフェっときます
Leetcode #60: Permutation Sequence


```swift
func getPermutation(_ n: Int, _ k: Int) -> String {
    var ar = Array(1...n)
    var target = k
    var answer = [Int]()
    for i in stride(from: n-1, through: 1, by: -1) {
        let power = factorialPower(i)
        let remainder = target % power
        var index = 0
        if remainder == 0 {
            index = target / power - 1
        } else {
            index = target / power
        }
        let num = ar.remove(at: index)
        answer.append(num)
        target -= index * power
    }
    answer.append(ar.last!)
    return answer.map { String($0) }.joined(separator: "")
}

private func factorialPower(_ n: Int) -> Int {
    guard n >= 2 else {
        return n
    }
    var sum = 1
    for i in 2...n {
        sum *= i
    }
    return sum
}
```
macでターミナルからタイマーを簡単にセット出来るようにする

エイリアスの設定をする際にちょっとつまづいたので備忘録。

## 背景
とある案件でデプロイからサーバー反映まで10分〜50分程時間がかかるものがあった。
確認するのに毎度時計を見るのは面倒だったのでタイマーを仕掛けたかったが、macの通知センターにタイマーがなかった。
わざわざアプリを入れるのは嫌だったので、あるもの（ターミナル）でどうにかしようと思った。

## 環境
- MacOS Mojave 10.14.4
- Bash

## 設定
```bash:.bashrc
function timer() {
  sleep $1; osascript -e 'on run argv
    display notification item 1 of argv
  end run' -- "$2"
}
```
これでターミナルで`timer 5 xxx`と打てば5秒後に以下のような通知が出る。
<img width="347" alt="スクリーンショット 2019-05-07 20.03.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169126/21d259a6-c8b9-254e-e260-0df5d5c86052.png">
途中で止める場合は`Ctr`+`C`

## 課題
- 進捗状況が見えない
- タイマーが出るまでターミナル動きっぱなし

## 参考
- Macで使えるシンプルタイマー、時間がきたらアラームでお知らせ  
https://www.wholenotism.com/blog/2018/08/simple-alarm-timer-mac.html
- コマンドラインで通知メッセージを表示する - GeekFactory  
https://int128.hatenablog.com/entry/2015/07/17/002844
[UE4]半透明マテリアルで一番手前の表面だけ描画する

画像Aを画像Bのようにします。
A：![ScreenShot00000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369485/dd8df82a-7a6e-dc35-7525-6e1f68c9f987.png)

B：![ScreenShot00002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369485/576ac62d-5536-8d20-2554-9209f248eaa5.png)

##半透明の問題点
上の画像はAの方が挙動としては正しいのですが、複雑なメッシュの場合Opacityを1に近づけると描画エラーが発生します。  
![ScreenShot00003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369485/df8ec873-4b4f-8cfe-4643-451afa2892e5.png)
静止画だと分かりにくいかもしれませんが、奥にあるはずの面が手前側に描画されてしまっています。
これを回避するために一番手前側にある表面だけを描画します。

##方法
まず、すでに置いてあるオブジェクトをCtrl + C & Ctrl +Vで全く同じ位置にコピーします。
分かりやすいように片方の名前を変えておきましょう。

###片方
オブジェクトの詳細パネル>Renderingにある、
1.Render in Main Passのチェックを外す
2.Render Custom Depth Passのチェックを入れる
![2019-05-07_21h00_34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369485/e5eabf53-f632-c883-216e-161607afdcdc.png)
これでCustom Depthのみに描画されます。
こちらはDefault Materialなど不透明のマテリアルにしてください。

###もう片方
Translucentマテリアルをアサインし、以下のようにノードを組んでOpacityピンに刺します。
すでに何かの処理が刺さっている場合はMultiplyでブレンドすればOKです。
![2019-05-07_21h07_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369485/5b08e35f-9759-36c7-cc4c-c0d9b3353201.png)
https://blueprintue.com/blueprint/vv4r5lg1/
こちらにもアップしてあります。

具体的に何をしているかというと、Custom Depthに描画された不透明のオブジェクトの深度と、微量にスケールした半透明のオブジェクトの深度を比較し、Custom Depthの方が奥にあれば半透明を表示、手前にあれば非表示にしています。
スケールする理由はそのまま比較するとZ Fightingのようなエラーが起きるためです。


##注意点
Custom Depthに描画するということは一回分多く描画負荷がかかるということになります。
処理負荷を気にする場合は過度な使用はおすすめしません。
Depth描画する方は頂点数を抑えるなどしてもいいかもしれません。

##参考リンク
こちらのフォーラムで検証されている内容を参考にしました。
https://forums.unrealengine.com/development-discussion/rendering/18285-translucent-water-material-displacement-banding-issue?45945-Translucent-Water-Material-Displacement-Banding-Issue=
RedHatがサポートしてるphpのバージョンが分かりづらかったけど分かったのでメモ

- 最新のphpサポートは[ここ](https://secure.php.net/supported-versions.php)に書いてあるけど、RedHatは最新のphpをサポートしてるわけではない
- RedHatの[公式サイト](https://access.redhat.com/solutions/409673)にある通り、RHEL7はphp5.4系をサポートし続けるし、RHEL6はphp5.3をサポートし続ける
    - 本家phpがサポート終わっても脆弱性が出た際などにREHLはパッチを提供し続ける
        - 安定稼働のため
- RHEL7でサポートされたphp7などを使いたい場合は、[Red Hat Software Collections Product](https://access.redhat.com/ja/solutions/666823)を利用すると良いが、デフォルトでバンドルされてるバージョンと比べるとサポート期間が短い
[１ヶ月で4言語⁉]　個人的なプログラムの考え方  [初心者]

# １カ月で4言語触れてみた作者の感想
＊高級言語のみです。
＊初心者による戯言なので、温かい目で見てください。
＊あくまで、個人的な感想です。
## １カ月で4言語?!
　私は、新卒の駆け出しエンジニアで、独学で[C#]を卒業研究で一年ほど触っていました。
　
　しかし、しっかりとプログラムを学んだことがないので　初心者とさせていただきました。　　
　
　１カ月で4言語というのは、とあるアプリを自動でクリアするプログラムを[Ruby]で開発し、
[PHP]、[Java]、[C#]にそれぞれコンバートする形で　触れたということです。

　表面的なことしか、触っておらず完全に理解できたわけではありませんが、よく聞くプログラム言語の壁を
それほど感じなかったため、OUTPUTしてみることにしました。

## 私の感じた言語の壁
　プログラム言語の間に壁はあります。
　
　ですが、本質は一緒なんです。
　
　多くの人がコンソールに「Helo,world!」と出力するところから始めたと思います。

　どんな言語だろうと、「Helo,world!」と出力する　という本質は一緒なのです。
　
　「お前何言ってんだよ、あたり前のことだろ。」と思われるかもしれません。

　ですが、未経験者の方も含め、多くの言語が跋扈しているプログラム界隈に苦手意識を持っている人も多いと思います。
　PS.私もその一人でした…。

　私の言う壁は、宣言の仕方、if文、for文の書き方などの　**作法** のことなんです！！

　それに加え、文法的なことはほとんど変わりません。　日本語に加え、英語を学んできた皆さんにとっては簡単だと思います。

##まとめ

　私が言いたかったのは、プログラムはもちろん、多くの言語におびえる必要はないということです。

　本質は一緒で、違いは**作法**だけ…。

　苦手意識を持たずに、様々な言語に挑戦していってほしいです。
　
## 謝辞

 初心者の戯言にお付き合いいただきありがとうございました。

 誰かの助けになれたら、幸いです。


## 追記 2022/11/04
この考え方のおかげでフルスタックエンジニア？として、現在もIT業界に在籍しています。
業界にいる中で、対応力の高い方は多くこの記事に近しい考え方を持っていると感じています。

初心者を卒業できている（といいな）状況での振り返りでした。
[UE4] C++で動的メッシュ生成

# 環境
- OS：Ubuntu 16.04 LTS
- UE4バージョン：4.22.1
- エディタ：Visual Studio Code

# はじめに
UE4でメッシュを動的に生成する必要があり、以下の記事を参考に実装したので、その手法を紹介する。

- [UE4: ProceduralMeshComponent 入門](https://usagi.hatenablog.jp/entry/2017/05/27/000800)
- [UE4/C++: メッシュのマテリアルやテクスチャーをC++コードで制御する方法](https://usagi.hatenablog.jp/entry/2017/07/26/115603)

結果（再生→動的メッシュ生成）
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356592/f52cad51-5120-7499-2dfb-eb7916fc913b.png)
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356592/f814b032-3cba-5b57-25e3-681390fd5d7a.png)




# 動的メッシュ生成方法

1. <プロジェクト名>.Build.cs の PublicDependencyModuleNames.AddRange に "ProceduralMeshComponent" を追加する
1. 以下のC++アクタークラスを作成する（ヘッダはデフォルトのままで問題ない）

    ```MyActor.cpp
    #include "ProceduralMeshComponent.h"
    
    AMyActor::AMyActor()
    {
    	UProceduralMeshComponent* mesh; // 動的メッシュを保持するポインタ
    	mesh = CreateDefaultSubobject<UProceduralMeshComponent>(TEXT("generated-mesh")); // 動的メッシュ生成
    	RootComponent = mesh; // RootComponentに設定する
    
    	FString materialPath = "/Game/M_Tech_Hex_Tile_Pulse";
    
    	// メッシュにマテリアルを設定する
    	// マテリアルインスタンスを利用するときはUMaterialをUMaterialInstanceに変更する
    	mesh->SetMaterial(0, Cast<UMaterial>(StaticLoadObject(UMaterial::StaticClass(), nullptr, *materialPath))); 
    
    	// 動的メッシュ用の変数
    	TArray<FVector> vertices; // 頂点群
    	TArray<int32> indices; // インデックス群
    	TArray<FVector> normals; // 法線群（今回は空っぽのままだが、立体を作成するときには設定しないとエッジ部分が変になる）
    	TArray<FVector2D> texcoords0; // テクスチャー座標群
    	TArray<FLinearColor> vertex_colors; // 頂点カラー群（今回は空っぽのまま）
    	TArray<FProcMeshTangent> tangents; // 接線群（今回は空っぽのままだが、立体を作成するときには設定しないとエッジ部分が変になる）
    
    	// 頂点群設定
    	vertices.Add(FVector(-600, 200, 400)); // 左上
    	vertices.Add(FVector(-600, 200, 200)); // 左下
    	vertices.Add(FVector(-600, 400, 200)); // 右下
    	vertices.Add(FVector(-600, 400, 400)); // 右上
    
    	// インデックス群生成（三角形ポリゴンを反時計周りに設定）
    	// 1つ目の三角形ポリゴン
    	indices.Add( 0 );
    	indices.Add( 1 );
    	indices.Add( 2 );
    	// 2つ目の三角形ポリゴン
    	indices.Add( 2 );
    	indices.Add( 3 );
    	indices.Add( 0 );
    
    	// テクスチャー座標群設定
    	texcoords0.Add(FVector2D(0, 0)); // 左上
    	texcoords0.Add(FVector2D(0, 1)); // 左下
    	texcoords0.Add(FVector2D(1, 1)); // 右下
    	texcoords0.Add(FVector2D(1, 0)); // 右上
    
    	// メッシュ生成
    	mesh->CreateMeshSection_LinearColor( 0, vertices, indices, normals, texcoords0, vertex_colors, tangents, true );
    }
    ```

1. 動的メッシュを生成するcppファイルに以下を記述して動的メッシュを生成する

    ```cpp
    AMyActor* a = GetWorld()->SpawnActor<AMyActor>(FVector(0,0,0), FRotator(0,0,0));
    ```

1. 上記処理をブループリントから呼び出す

# 結果
結果は冒頭で示した画像のようになる。  


# 最後に
ヒトやモノをデータ化＆解析してみたい、という方。
３D技術と深層学習を組み合わせて、何か面白いサービスを作ってみたい！、という方。

弊社では一緒に働いてくれる仲間を大募集しています。

ご興味がある方は下記リンクから是非ご応募ください！
https://about.sapeet.com/recruit/

# 参考
[UE4: ProceduralMeshComponent 入門](https://usagi.hatenablog.jp/entry/2017/05/27/000800)
[UE4/C++: メッシュのマテリアルやテクスチャーをC++コードで制御する方法](https://usagi.hatenablog.jp/entry/2017/07/26/115603)
質問箱をOSS(オープンソース)にしてみた

# peing-質問箱-のクローン(OSS)

ソースコードはこちら
https://github.com/seiyatakahashi/peing-questionbox-clone

[クローン質問箱](https://qubox-app.herokuapp.com/)の現状はこんな感じです。
![質問箱](https://s3-us-west-1.amazonaws.com/4chat/sread/FireShot+Capture+058+-+qubox+-+%E8%B3%AA%E5%95%8F%E7%AE%B1+-+qubox.org.png "質問箱")

## 質問箱とは
みなさん[peing-質問箱-](https://peing.net/)をご存知ですか?twitterで2017年ごろから流行っている匿名で質問ができるwebサービスのことです。このサービスは個人開発をしているせせり氏が開発したサービスで公開１ヶ月で1億アクセスに達したそうです。

匿名で質問できるという機能はとても面白いと思いました。なのでこれをオープンソース化して、もっといろんな機能をつけていきたいと考えています。

___

### デプロイ deploy
誰でもカンタンにデプロイできるようにしましたので是非みなさんもお使いください。
まずはgitからファイルをダウンロードしてください。

``` git clone git@github.com:seiyatakahashi/peing-questionbox-clone.git ```

ダウンロードができたらダウンロードしてきたフォルダに移動する

``` cd peing-questionbox-clone ```

herokuにログインをする

``` heroku login ```

heorku でプロジェクトを作成する

``` heroku create 作りたいアプリ名 ```

heorku にアップロード

``` git add . ```

``` git commit -m "all" ```

``` git push heroku master ```

アップロードしてら、データベースにマイグレード

``` heroku run rails db:migrate```

環境変数の設定

```  heroku config:set APP_NAME="アプリの名前"```
```  heroku config:set APP_NAME_EN="アプリの英語の表記名"```
```  heroku config:set API_KEY="ツイッターのAPI KEY"```
```  heroku config:set API_SECRET="ツイッターのAPI シークレット"```
```  heroku config:set TOKEN="ツイッターのAccess token"```
```  heroku config:set SECRET="ツイッターのaccess token secret"```
```  heroku config:set CURRENT="自分ののツイッターのID"```
```  heroku config:set DESCRIPTION="サイトの情報"```
```  heroku config:set KEYWORDS="サイトのキーワード"```
```  heroku config:set GOOGLE_ANALYTICS="Google アナリティクスのID"```


___

### 今後つけたい機能
##### 決済機能
質問したい人がお金を払って質問された人がお金をもらえる機能。
##### 複数のSNSログイン
現在twitterでのログインしかできなのでfacebookやlineなどを加えたいです。
##### ネイティブアプリ化
railsをapi化させて、iosやandroidのようなネイティブなアプリケーションを作りたいです。


---

### 参考
cssのデザインはほとんど、こちらのソースコードを使用しております。
・qiita: 質問箱をOSSにしてみた
https://qiita.com/Syo_pr/items/2aa7e5e34726fae30b29


・github: CloneQuestionBox
https://github.com/syoou/CloneQuestionBox
create-react-app で 絶対パス(absolute path) をwebpack に頼らず設定する #react 

ReactでAbsolute Pathを設定するときに以前と変わっていたので共有も含めて更新！

どういうことかというと
以下のようなファイル構成のときに

```
|- src
 |- components
  |- Profile
   |- index.jsx
  |- common
   |- Avatar.jsx
```

Profileの`Index.jsx`から`Avatar.jsx`を参照するときに

```
import Avatar from '../common/Avatar'
```

のように書かなければならないが、以下の設定をすることで

```
import Avatar from 'common/Avatar'
```
とかけるようになる！

### 過去
`.env` ファイルを作って以下のように定義していた

```javascript:.env
NODE_PATH=src
```

### 現在
```javascript:jsconfig.json
{
  "compilerOptions": {
    "baseUrl": "src"
  },
  "include": ["src"]
}
```

これまで通り開発しようとしたらすぐに分からず1~2時間ほどハマっていた（汗）

しっかりと公式ドキュメント見ていくべきだった。。
<img width="711" alt="スクショ.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94541/32820966-791a-8155-d91b-4e334ddaf8a1.png">

参照先: https://facebook.github.io/create-react-app/docs/importing-a-component#absolute-imports
herokuのpipelineのReview Appsの自動ビルドで失敗した

何がきっかけかわからないけど、ビルドが失敗するようになった。

以下は`app.json`の一部抜粋

```app.json
"buildpacks": [
    {
      "url": "heroku/php"
    },
    {
      "url": "heroku/node"
    }
  ],
```
こんな感じで書いておいたら、こんなエラーが出てビルドが失敗してた。

> error fetching custom buildpack https://buildpack-registry.s3.amazonaws.com/buildpacks/heroku/node.tgz

このURLにアクセスしたら、AccessDeniedって言われたのでheroku側からしかアクセスできないのか知らないけどbuildpackのurlと違うなと思って**ショートハンドやめて**直接リポジトリを指定した。

以下のように変えた。

```app.json
"buildpacks": [
    {
      "url": "heroku/php"
    },
    {
      "url": "https://github.com/heroku/heroku-buildpack-nodejs"
    }
  ],
```

で、ビルド通ったのでそのメモをここに残す。
Railsのproduction環境でeager_autoload!でハマった

正確に言うとgemで使っているクラス名をModelで使ってしまい、gemが正常に読み込まれなくなってしまっただけです。

Rails5のプロジェクトをproductionで実行すると以下のエラーが発生しました。

```
$ bundle exec rails s -e production
vendor/bundle/ruby/2.4.0/gems/actionmailer-5.2.3/lib/action_mailer.rb:61:in `eager_load!': undefined method `eager_autoload!' for Mail:Class (NoMethodError)
```

まず、eager_load!って何ですか？

```ruby:config/enviroments/production.rb
  # Eager load code on boot. This eager loads most of Rails and
  # your application in memory, allowing both threaded web servers
  # and those relying on copy on write to perform better.
  # Rake tasks automatically ignore this option for performance.
  config.eager_load = true
```

なんかパフォーマンスが良くなるらしい。
次に、RailsのActionMailerにおいてMail:Classにeager_autoload!メソッドがないと言われてしまっています。ActionMailerはMailというgemを使っているのでそれを確認しました。

```ruby:mail-2.7.1/lib/mail.rb
  # This runs through the autoload list and explictly requires them for you.
  # Useful when running mail in a threaded process.
  #
  # Usage:
  #
  #   require 'mail'
  #   Mail.eager_autoload!
  def self.eager_autoload!
    @@autoloads.each { |_,path| require(path) }
  end
```

ありました。。。
そこでActionMailerでMailクラスを確認すると、、、

```ruby:
pry(ActionMailer)> Mail.superclass
=> ActiveResource::Base
```

なぜかActiveResourceクラスになっていました。
このプロジェクトではDB無しでActiveResourceを使っているのですが、
app/modelsを確認すると「mail.rb」がありました。。。。

## gemなどで定義されているクラスに気をつけよう
言い訳をすると、
　・config/enviroments/development.rbだとconfig.eager_loadがfalse
　・かつ今回の開発ではメール機能は特に使っていなかった
　・複数人で開発しておりクラス名などの設計の部分までガバナンスを効かせていなかった
といったことからデプロイ作業の時に初めてこの問題が顕在化しました。
rubyでジャンケンできるようにしてみた。

今日は皆さんご存知のじゃんけんをrubyで作ってみました。
コードはこちらです！

```rb
#じゃんけんをプログラミングでできるようにしてみました。

JANKEN = ['rock', 'scissors', 'paper']
$opponent = ''

def play_janken
  # 相手の手はランダムで、自分の手を入力で決めます
  $opponent = JANKEN.sample
  puts 'あなたは何を出す？'
  own = gets.chomp

  return 'あいこ' if index(own) == index($opponent)

  if index(own) == 0
    compare(1)
  elsif index(own) == 1
    compare(2)
  elsif index(own) == 2
    compare(0)
  end
end
# 出した手のインデックスを返します。
def index(a)
  JANKEN.index(a)
end
# じゃんけんの勝敗を返します。
def compare(i)
  return '勝ち' if index($opponent) == i
  '負け'
end
```

<b>今後の改善点</b>
opponent変数はplay_jankenとcompareで使う為グローバル変数にしたが、グローバル変数はあまり使わない方がいいと聞いたので使わないコードを模索中。
インデックスでなく、要素を直接比較できればその分コードが減るのでその実装を構想中。
UbuntuでHFS+を一般ユーザーで読書可能にする

Macでよく使われるHFS+フォーマットのディスクを，Ubuntuで一般ユーザーで読み書き可能な状態でマウントする方法をまとめておきます．
検証環境：Ubuntu 18.04 LTS

#インストール
``hfsprogs``と``bindfs``が必要なので，インストールしておきます．

```shell

sudo apt install hfsprogs bindfs
```

#マウント
`/dev/sdd1` を `/media/HFS_Disk/` にマウントするとします．このとき， `/dev/sdd1` を一旦 `/media/HFS_Root/` にマウントしてから，それを `/media/HFS_Disk/` にマウントし直すことで一般ユーザーでの読み書きを実現します．（HFS_Rootではroot権限がないと書き込みができません．）

```shell

sudo mount -t hfsplus -o force,rw /dev/sdd /media/HFS_Root
sudo bindfs -u $(id -u) -g $(id -g) /media/HFS_Root /media/HFS_Disk
```

#アンマウント
`HFS_Disk`をアンマウントしてから`HFS_Root`をアンマウントして完了です．

```shell

sudo umount /media/HFS_Disk
sudo umount /media/HFS_Root
```

# 参考元
- http://ryo1miya.hatenablog.com/entry/2015/08/15/172448
- http://ryo1miya.hatenablog.com/entry/2017/03/30/181732
Ruby で、とある変な if 文を綺麗に書けるか考えた

言語の機能をなるべく使うという条件で、シンプルに書くことを目指す[^2]。

[^2]: 判定基準はまだうまく言語化できていないです...

* 人に読みやすいかということはこだわらない
* 文字数にこだわるわけでもない

# 課題
* `fetch_a` でオブジェクトが取れればそれの `x`, `y` で作れる `Hash` を、
* 取れなければ `fetch_b` を試して取れればそれの `x`, `y` で作れる `Hash` を、
* どちらもダメなら `nil` を返す

（空想ではなく、実際に見たコードを一部省略したものです）

```ruby
if a = fetch_a
  { x: a.x, y: a.y }
elsif b = fetch_b
  { x: b.x, y: b.y }
else
  nil
end
```

`if` の中で代入するのは rubocop style 的に NG だそうなので、なんとかできないかなと思った。

この課題については、やりたいこと自体がかなり複雑すぎるなので、書き方を改善すればいいという問題ではない気がしたが、気にしない　[^1]。

[^1]: たとえば、 「`{ x: x, y: y }` を返すメソッドを、 a, b それぞれのクラスに実装する」とか？



# 思いついた案
```ruby:instance_eval使う
(fetch_a || fetch_b)&.instance_eval { { x: x, y: y } }
```

`instance_eval` は長いのが嫌いなので tap にしてみる。

```ruby:instance_evalの代わりにtap
(fetch_a || fetch_b)&.tap { |v| break { x: v.x, y: v.y } }
```

`v` の名前づけに悩む（3回書くので、丁寧にすれば長くなるし）が、変わらない文字数でできそう


Ruby 2.7 なら Numbered parameters を使うこともできそう

```ruby:tap+NumberedParameters
(fetch_a || fetch_b)&.tap { break { x: @1.x, y: @1.y } }
```
分子を表示させる雑記　その２

GW明けますた

というわけで即ドン

```protos.py
import math
# ベクトルの成分
def point(a,b,c,d,e,f):
    x=float(a)-float(b)
    y=float(c)-float(d)
    z=float(e)-float(f)
    return x,y,z

# 角度の計算
def arg(a,b,c,d,e,f):
    cos=(a*b+c*d+e*f)/(((a*a+c*c+e*e)**0.5)*((b*b+d*d+f*f)**0.5))
    degr=math.degrees(math.acos(cos))
    return degr

# 外積の計算
def cross(a,b,c,d,e,f):
    cx=(c*f)-(d*e)
    cy=(d*e)-(a*f)
    cz=(a*d)-(b*c)
    return cx,cy,cz

# comの読み込み
A1=input()
with open(A1,encoding='utf-8') as B1:
    txt1 = B1.read()

C=txt1.split()

# 原子番号の読み込み
A2=input()
with open(A2,encoding='utf-8') as B2:
    txt2 = B2.read()

D=txt2.splitlines()#B[n].split()でn行目の数字を全部配列に

del C[:(C.index('Required')+3)]#分子の手前までを削除

M = [(C[i]) for i in range(0,int(len(C)),4)]#原子の抽出
X = [(C[i]) for i in range(1,int(len(C)),4)]#X座標の抽出
Y = [(C[i]) for i in range(2,int(len(C)),4)]#Y座標の抽出
Z = [(C[i]) for i in range(3,int(len(C)),4)]#Z座標の抽出

f = open('××××××', 'a')

for i in range(len(D)):
    E=D[i].split()#i行目に書かれた数字をリストに、上書きできる
    if (len(E))<=1:#中にある数字の数が1以下のとき
        f.write("No" + " \n")

    elif (len(E))>=3:#中にある数字の数が3以上のとき
        x1,y1,z1=point(X[int(E[0])],X[int(E[1])],Y[int(E[0])],Y[int(E[1])],Z[int(E[0])],Z[int(E[1])])
        x2,y2,z2=point(X[int(E[2])],X[int(E[1])],Y[int(E[2])],Y[int(E[1])],Z[int(E[2])],Z[int(E[1])])

        if (len(E))==4:#中にある数字の数が4なので、二面の角度を計算
            x3,y3,z3=point(X[int(E[3])],X[int(E[1])],Y[int(E[3])],Y[int(E[1])],Z[int(E[3])],Z[int(E[1])])
            cx1,cy1,cz1=cross(x1,x2,y1,y2,z1,z2)
            cx2,cy2,cz2=cross(x2,x3,y2,y3,z2,z3)
            degr2=arg(cx1,cx2,cy1,cy2,cz1,cz2)
            f.write(str(degr2) + " °\n")

        else:#中にある数字の数が3なので、角度を計算
            degr1=arg(x1,x2,y1,y2,z1,z2)
            f.write(str(degr1) + " °\n")

    else:#中にある数字の数が2なので、距離を計算
        x1,y1,z1=point(X[int(E[0])],X[int(E[1])],Y[int(E[0])],Y[int(E[1])],Z[int(E[0])],Z[int(E[1])])
        bond=float((x1**2+y1**2+z1**2)**0.5)
        f.write(str(bond) + " Å\n")

f.close()
```

前よりもざっと20行ほどダイエットに成功しましたよー

で、ランダムに数字をtxtに記入するプログラムをぽちりぽちりしてー

よいしょ！としたら、

エラーです！

なんで？

```err.py
OSError: [Errno 22] Invalid argument \u202a・・・・
```
内容的に"\u202a・・・・" なんてpathねぇよ！

というエラーなのはわかるんですが、誰もそんな名前のpathを指定した覚えねぇよ！

結果的に

```syuu.py
f = open(r"×××××", "a")
```
とすることで回避しましたー

うーん、もう少しスマートにできないものか・・・・

そもそも二面角の計算が合っているのか不明というネ!

距離と角度はきちんとできているので、まぁだいじょーぶでしょう

タブンネ

まだまだ道のりは遠い・・・

以上！
DataBindingとLiveDataで設定した値が反映されない

# 何がしたかったのか
Dialogで表示する内容を動的に変えたかった。
Dialogのレイアウトを作成し、DataBindとLiveDataで表示する内容を設定したかった。

# なぜ反映されなかったのか
DataBindでLiveDataを使うにあたってLifecycleOwnerを設定しないと反映されない。
Fragmentのレイアウトでは設定していたがDialogのDataBindで設定し忘れていた。

# どうしたか
DialogのDataBindオブジェクトにsetLifeycleOwner()してあげたら反映されるようになった。
こんなことで1日悩んでしまっていたのがなんとも。
[Windows]ネットワーク上のexeを実行したときの警告ダイアログを出ないようにする



# やりたいこと
リモートデバッグをするときに、デバッグ対象が別のexeをたたく場合などに、いちいち警告ダイアログが出て、デバッグの効率がわるいので、ダイアログを出ないように設定したい。

# やり方
・コントロールパネルを起動
　([Win]+[R] → [control]と入力しenter)

・[インターネットオプション]を開く

・[セキュリティ」タブを開く

・[レベルのカスタマイズ]を開く

・[その他]の中の[アプリケーションと安全でないファイルの起動]を「有効」にする。

・OKを押す。

# 19/10/25追記
バッチで自動で上記手順を行う方法はこちらを参照。

**[Windows/バッチ] リモートデバッグするときのIPアドレス変更やインストール、設定等々一気にやってしまいたい**
https://qiita.com/tera1707/items/4483b67bae0db0f9c783
[WPF]スライダのツマミをスライドしたときに設定できる値をとびとびの値(0,50,100,150,・・・等)にしたい

# やりたいこと

スライダのツマミをスライドしたときに設定できる値をとびとびの値(0,50,100,150,・・・とか)にしたいが、それらしい設定ができるプロパティがない。どうにかして簡単にできないか？

# やり方
スライダーに含まれる「Tick」を使う。
さらに具体的には、プロパティ「TickFrequency」「IsSnapToTickEnabled」を使う。

# サンプル
例えば、値が1～65535のスライダで、ツマミをスライドしたときに5000刻みで値を変化させたいときは、下記のように書く。

```a.xaml
        <Slider Name="MySlider" 
                Maximum="65535" Minimum="1"
                TickFrequency="5000" IsSnapToTickEnabled="True"
                SmallChange="1"
                LargeChange="1"/>
        <!-- SmallChangeは「矢印キーを押したときの値の変化量」。-->
        <!-- LargeChangeは「マウスでつまみの横の余白の線(実際はリピートボタン)をクリックしたときの値の変化量」。-->
        <!-- ツマミをスライドしたときとはまた別。(ここでは、参考のために書いているがなくてOK。) -->
```

やっている内容としては、

- Tick(目盛り表示)を、とびとびにしたい刻みの値に設定する。→TickFrequency
- スライダのツマミを、Tickの値に合わせて変化するよう設定する。→IsSnapToTickEnabled

のみ。

# 参考

Slider Class
https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.controls.slider?view=netframework-4.8

WPF4.5入門 その36 「Sliderコントロール」
https://blog.okazuki.jp/entry/2014/08/15/220915
Laravel セッション切れ「The page has expired due to inactivity」の回避策

# app/Exceptions/Handler.php

```php

public function render($request, Exception $e)
    {

        if ($e instanceof \Illuminate\Session\TokenMismatchException)
        {
            return redirect()
                    ->back()
                    ->withInput($request->except('password'))
                    ->with([
                        'message' => 'Validation Token was expired. Please try again',
                        'message-type' => 'danger']);
        }   

        return parent::render($request, $e);
    }

```
Python3 初心者　forによる反復処理

pythonはイテレータ（イテレーションごとにリストや辞書から要素を一つずつ取り出して返すこと）がよく使われているが、そのようにしているのはデータがどれくらいのサイズなのかなどを知らなくてもデータを操作できる。そのようなものはforを使ってやれば楽にデータを取り出して処理することができる。

```py
animals=['dog', 'cat', 'elephant', 'snake']
for animal in animals:
    print(animal)

dog
cat
elephant
snake
```

これはまずanimalsが何かを定義した後それに名前をつけていると考えてくれるといい。だからanimalは全ての値を読み込むことが可能になる。もしここでforを使わないとどうなるのか

```py
animals=['dog', 'cat', 'elephant', 'snake']
print(animals)

['dog', 'cat', 'elephant', 'snake']
```

これだとリスト自体を読み込んでしまっていることになっているので要素を一つ一つ読み込んで取り出すことができない。このようなリストはイテラブルなためforを使った時にこのような処理ができる。辞書などの時はkeysとvaluesのどちらかが読み取られるの？と考えることもあるかもしれない。それは普段の辞書と同じで両方好きな時に返すことが可能になる。

```py
animals={'Hello': 'dog', 'Bob': 'cat', 'hat': 'elephant', 'King': 'snake'}
#ここではkeysを読み取りたい時後ろにkeys（）と書いているがかかなくてもよし
for name in animals.keys():
    print(name)
#valuesを読み取りたい時
for animal in animals.values():
    print(animal)
#items()を読み取りたい時
for item in animals.items():
    print(animal)
```

で可能になります。またforもwhileとにtリルこともありwhileと同じようにbreakやcontinueなどを使うことができます。
getoptsがどのように動作しているのか

# はじめに
最近、シェルスクリプトを組む機会が多くgetoptsを使ってオプション解析をしてはいたのですが、なんとなくで使っていました。
ですが今回、getoptsの動作を調べてみて目から鱗が落ちたので、書き残しておきます。

また、getoptsを使ったオプション解析の動作についても説明を書きました。
なぜ、あのコードで動くのだろうと思っている方はぜひ読んで下さい。

# getoptsの動作
まずは、getoptsの動作から説明します。

## 基本動作
```my_command.sh
#!/bin/bash
getopts abc opt
echo "オプション: $opt"
```
これに実行権限を与えて`./my_command.sh -a`を実行すると、

```
オプション: a
```
と表示されます。

getoptsを使うと、コマンドの引数に与えられたものが、getoptsの第一引数に含まれていた場合、第二引数に代入されます。
上のスクリプトの場合、`my_command.sh`に与えられた引数が`-a`だったため、`a`という文字がoptという変数に代入されました。

## オプション以外のものが渡された場合
では`./my_command.sh -z`の場合はどうでしょうか。

この場合、`z`という文字はgetoptsの第一引数`abc`の中に含まれていません。なので、getoptsはエラーメッセージを吐き、?という文字がoptに代入されます。ただし、終了ステータスは`0` (正常終了) になります。
下が実行結果。

```
./my_command.sh: illegal option -- z
オプション: ?
```
一行目のエラーメッセージを表示させたくないときは、`getopts abc opt > /dev/null 2>&1`などとして、メッセージを捨てて下さい。

## オプションが2つ渡された場合
オプションが2つ渡された場合はどうでしょう。
`./my_command.sh -a -b`
このコマンドを実行した結果は下のとおり。

```
オプション: a
```
`a`のみを渡したときと変わっていません。なぜならgetoptsは１つずつしかオプションを読み込めないからです。

２つとも読み込むためには下のように、getoptsを2回実行する必要があります。

```my_command.sh
#!/bin/bash
getopts abc opt
echo "オプション: $opt"
getopts abc opt
echo "オプション: $opt"
```
`./my_command.sh -a -b`を実行します。


```
オプション: a
オプション: b
```
このとき、渡すオプションを`-ab`としても、実行結果は変わりません。
ちゃんとオプションを読み込めていることがわかります。

## オプションが渡されなかった場合
上のほうで、コマンドに渡すオプションがgetopts第一引数に入っていなくても、正常終了すると書きました。
なので、

```my_command.sh
#!/bin/bash
getopts abc opt > /dev/null 2>&1
echo "ステータスコード: $?"
echo "オプション: $opt"
```
というコマンドを`./my_command.sh -z`で実行すると、

```
ステータスコード: 0
オプション: ?
```
と表示されます。

一方で、オプションを渡さなかった (`./my_command.sh`のみを実行した)場合、

```
ステータスコード: 1
オプション: ?
```
になり、異常終了となります。

# whileと組み合わせる
getoptsを使ってオプション解析をしているqiitaの記事を見てみる[^1][^2]と、whileを使って行っているものが見られます。
[^1]: [bash によるオプション解析] (https://qiita.com/b4b4r07/items/dcd6be0bb9c9185475bb)
[^2]: [bash: コマンドライン引数のオプション解析(optgets)](https://qiita.com/laikuaut/items/adf35ecb14c55f6fde92)

こんな感じ。

```my_command.sh
while getopts abc opt
do
  case $opt in
    # オプションの処理
  esac
done
```
なぜこれが動くのでしょうか。
シェルスクリプトの動作がわかっていれば当たり前なことかもしれませんが解説します。

## whileの動作
while文は下のような形を取ります。

```sh
while コマンド
do
  処理
done
```
そして、コマンドの終了ステータスが異常終了だった場合、while文を抜けるという動作になっています。

## whileとgetoptsを組み合わせる。
ここで、先ほどのgetoptsを使ったwhile文を考えてみましょう。

```my_command.sh
while getopts abc opt
do
  case $opt in
    # オプションの処理
  esac
done
```
whileの後に`getopts abc opt`とあるので、getoptsが異常終了するまでオプションの読み込みを繰り返しています。
例えば、`./my_command.sh -abz`として実行した場合、`opt`という変数には、`a`、`b`、`z`という文字が順番に入って`do ~ case`文が実行されます。
そして、getoptsの読み込めるオプションがなくなったとき、getoptsは異常終了するので、whileを抜けます。

以上の動作によって、オプションの解析ができるというわけです。
まとめると、下のようなスクリプトを書けば、コマンドのオプション解析をすることができるのでした。

```bash
#!/bin/bash
usage() {
  echo "Usage: $(basename $0) [-a] [-b] [-c]"
  exit 1
}

while getopts abch opt
do
  case $opt in
    a ) echo "option a" ;;  # aのときの処理
    b ) echo "option b" ;;  # bのときの処理
    c ) echo "option c" ;;  # cのときの処理
    h ) usage ;;  # h: ヘルプを表示
    \? ) usage ;;  # ?: オプションがgetoptsの第一引数に含まれていない場合
  esac
done

shift $((OPTIND - 1))
```

# おわりに
getoptsを使ってコマンドを作れるとかっこいいので、みなさんも作ってみてください。
【PHP8.0】演算子.と+の優先順位が変わる

PHP7.3現在、演算子`+`、`-`と`.`の優先順位は同じです。
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26088/95ce426c-1dfb-44f9-0ada-d997ce6e9dd2.png)

すなわち左から右に評価されます。

```php
	echo 1 . 2 + 3 . 4;
	
	echo ((( 1 . 2 ) + 3 ) . 4 ) ; // これと同じ
```

マニュアルでもわざわざ[例を挙げて解説](https://www.php.net/manual/ja/language.operators.precedence.php)しています。
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26088/cd5fdd19-cb6a-bd19-294b-962edfe34c91.png)

さて2019年3月に[Change the precedence of the concatenation operator](https://wiki.php.net/rfc/concatenation_precedence)というRFCが提出されました
2019/05/07現在は投票中のステータスですが賛成多数で、PHP8で上記の動作は変わることになりそうです。
演算子の追加削除はよくあることですが、優先順位の変更というのは他言語含めてもなかなか見ることのないレアなイベントではないでしょうか。


# Change the precedence of the concatenation operator

## Introduction

`+`、`-`、そして`.`は長年にわたる問題です。
それは左から右に解釈されます。

```php
echo "sum: " . $a + $b;
 
// こう解釈される
echo ("sum: " . $a) + $b;
 
// こうではない
echo "sum :" . ($a + $b);
```

このRFCでは、この動作をより直感的に、問題が出にくくなるようにすることを目的としています。


## Proposal

現在、`+`、`-`、`.`の各演算子は優先順位が同じです。
これらは、単純に左から右に評価されます。

これは直感に反します。
一般に、数字ではない文字列を足したり引いたりすることはほとんどありません。
PHPが整数を文字列にシームレスに変換できることを考えると、文字列連結が先に来ることが望ましいでしょう。

従って、このRFCでは`.`に、`+`・`-`より低い優先順位を与えることを提案します。
具体的には、新しい優先順位は`<<`・`>>`のすぐ下になります。


## Backward Incompatible Changes

`.`の後に、括弧を使わず`+`、`-`を使用している式全てが影響を受けます。
例として、`"3" . "5" + 7`は`42`ではなく`"312"`になります。

これは、予告や警告なしに出力が変更されるという点で微妙な動作変更ですが、コードを静的解析して、この問題が発生する箇所を全て見つけることは簡単にできます。
私の知るかぎり、この問題が発生することは稀であり、そして大抵は最初から間違っています。

Nikitaが[MLで言及した](http://news.php.net/php.internals/105442)ように、既存のOSSへの影響は事実上ありません。
見つかったものは全て単なるバグです。
つまり、全体的に影響は非常に小さいということになります。

## Proposed PHP Version

PHP7.4でE_DEPRECATEDを発生させ、PHP8で動作を変更します。


## 投票

投票開始は2019/04/30、投票終了は2019/05/14です。
2019/05/07現在、PHP8で動作変更する提案は賛成23反対3で、ほぼ確実に受理されます。
PHP7.4でDeprecatedにする提案は賛成23反対4で、こちらもおそらく受理されます。


## NikitaのML

またNikitaか。

Composerパッケージの[上位2000件を調査](http://news.php.net/php.internals/105442)したところ、影響を受けるコードは僅か[5件しかありませんでした](https://gist.github.com/nikic/a4df3e8e18c7955c2c21cf6cdb4cbfaa)。
しかも5件とも修正後の優先順位を想定したコードで、つまり現状ではバグっています。

```php
$this->errors->add( 'unknown_upgrade_error_' . $errors_count + 1, $string );
```

例を一つあげると、上記コードは`add('unknown_upgrade_error_5', $string)`のような文字列を与えたいのだと思われますが、実際は`add(1, $string)`になります。

今回のRFCが通ると、想定していたであろう動作にエンバグすることになります。


# 感想

考えてみたら、むしろどうして今まで同じだったんだ、って感じですね。
優先順位が同じであるという仕様と、文字列と数値を自由に行き来できるという仕様が相まって、PHPで`.`と`+`を同時に使った演算は、ぱっと見から予想できない結果になることがありました。
今回のRFCが通ると、そのあたりの動作がすっきりすることになります。

もっとも、そういったややこしい演算には普通は括弧を使っているから、実害は全くないはずですけどね。


ところでDeprecateにする提案に"The second (secondary) voting requires a 50%+1 majority."って書いてあるんだけど、[50%の投票は廃棄された](https://qiita.com/rana_kualu/items/38c9917f634bc7767f1b#abolish-narrow-margins)んじゃなかったのか？
Leetcode #55: Jump Game

We will stop only if the jump length from the current position is zero and the current position is the furthest we can jump from any preceding position.

```swift
func canJump(_ nums: [Int]) -> Bool {
    if nums.isEmpty {
        return false
    }
    var maxReach = 0
    for i in 0..<nums.count - 1 {
        if maxReach < nums[i] + i {
            maxReach = nums[i] + i
        }

        if nums[i] == 0 && maxReach == i {
            return false;
        }
    }
    return true
}
```
AWSome Day受講メモ

[AWS Innovate](https://aws.amazon.com/jp/about-aws/events/aws-innovate/sessions/)(2019年4月8日 ~ 5月7日開催)で[AWSome Day](https://aws.amazon.com/jp/about-aws/events/2019/awsomeday/)をオンライン受講できたので、受講した内容を簡単にまとめる。

AWSome Dayは４セッションが公開されており、各30分の２時間程度で受講完了できる。

##セッション1： AWSのグローバルインフラストラクチャとネットワークおよびコンピューティング
- １リージョンごとに２つ以上のAZで構成されている。
- １つのAZは1-6個のDCで構成されている。<-これはAWS InnovateのLiveセッション[開発者視点でのウェブサイトホスティング入門 on AWS](https://aws.amazon.com/jp/about-aws/events/aws-innovate/sessions/#usecase08)で話してた）
- ELBがいつのまにかALB(Application Load Balancer)とNLB(Network Load Balancer)に別れてた、L7スイッチとか確かに高かったし嬉しい機能。

そういえばMultiAZを簡単に設定することができるようになったけど、オンプレで複数拠点で相互に通信できるネットワークを組むとかあまり想像したくない。

##セッション2： ストレージとデータベース
- S3は複数AZにまたがって冗長化している
- RDSでレプリケーションを張った場合、レプリカ側にもコピーされるところまでトランザクションを保持するのでマスターとレプリカでデータにずれは発生しない

ElastiCacheなんてのもいつ間にか出てた。まぁredisがあれだけ流行ってたらAWSでも提供始めるよね。

##セッション3： AWSのセキュリティの基本
- インスタンスのファイアウォール -> セキュリティグループ
- サブネットのファイアウォール -> ネットワークACL
- ユーザの権限(AWSサービスのアクセス権限） -> IAM
- AWSアカウントのルートユーザーのアクセスキーは作成しない（もしあるなら削除）
- 基本的に操作はIAMで作成した管理者アクセス権を持ったユーザーで行う

[IAMのベストプラクティス](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/best-practices.html#lock-away-credentials)

##セッション4： Well-Architected Frameworkと料金の話
- [Well-Architected Framework](https://d1.awsstatic.com/International/ja_JP/Whitepapers/AWS_Well-Architected_Framework_2018_JA_final.pdf) -> ベストプラクティス集
- ベストプラクティスの質問を活用することで改善点、リスクを把握できる
プログラミング学習記録80〜詳解JavaScript DOM編〜

##今日やったこと
- ドットインストール「JavaScript基礎文法編」復習
- ドットインストール「詳解JavaScriptオブジェクト編」復習
- ドットインストール「詳解JavaScript DOM編」

3倍速で復習しました。
ほとんど理解している状態での復習なので、３倍速でも特に問題なく進められました。

オブジェクト編も２周してみて、ようやく大体理解できるようになりました。

１周目は＃２３の例外処理の意味がよくわからなかったのですが、２周目で「これは便利だ！」と思いました。

例外処理を行うと、エラーが出ても処理が止まらずに最後まで実行できるようになります。

コードが複雑になればなるほど、途中で実行が止まることがよくあるので、そういった意味でこれは便利だなと思いました。

あと、DOM編を動画視聴のみですが、一通り見てみました。

以前、ドットインストールのタイピングゲームを作ったときにちょっと理解できていなかったところが理解できるようになりました。

やはり最低限の基礎は身につけておくべきですね。

ただ、これでドットインストールのJavaScriptのカリキュラムになるアプリ、ゲームは理解できるようになると思うので、明日からまた１つずつ作っていきたいと思います。

それでは、明日も引き続き頑張ります。

おわり
ドローン操作システムの概要

# はじめに
このページは，

[ドローン操作システムを作ろう](https://qiita.com/hsgucci/items/86eedb5555b4234ee0e7)

の１ページです．
全体を見たい場合は上記ページへお戻りください．

# 概要
今回はdronekitの話ではなく，
メインである「ドローン操作システム」のシステム構成について，紹介します．


# ドローン操作システム

今回の企画で最終的に作る物は，次の図のようなシステムになります．

![drone_control.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256470/0034859c-375f-a7d5-32cc-c91c0f98a1e6.png)

ドローン本体にRaspberry Piなどの　[コンパニオン・コンピュータ](http://ardupilot.org/dev/docs/companion-computers.html)　を搭載しています．
**コンパニオンとは，「添乗員」「同乗者」「連れ」「仲間」を意味しています．**
<font color="red">旅館やホテル，展示会でサービスをする女性じゃないですよ！(^^;)</font>

コンパニオン・コンピュータが認識や判断を行う**大脳**となり，
フライトコントローラが姿勢制御や移動などの運動を司る**小脳**となって，
体全体を動かすことになります．

コンパニオン・コンピュータは，

- 5G・LTE・3Gなどのセルラー回線
- LoRaなどのLPWA
- WiFi，Bluetooth，ZigBeeなどの2.4GHz無線

などの手段をUSB接続などで持っていて，
**インターネットまで接続できるようになっている**という前提としています．

地上にいる操縦者は，ＰＣやスマホ・タブレットでWebブラウザを開いて，
ドローンを遠隔操作します．

映像伝送なども考えると，5G・LTEが最も望ましいのですが，
2019年4月現在の時点では，
<font color="red">**地上移動局であるセルラー回線を空中で利用することは電波法に抵触** </font>します．
早期の解禁が望まれますね．

従って，実機ドローンで実験する際には，
別のインターネット接続の手段を考えておく必要があります．
ただし，

- 2.4GHzでは頑張っても50m程度しか届かないし，ネット接続はLTEルータなどを利用する必要がある．
- 920MHzを利用するLPWAは，電波の送信時間に制約があるので，1秒間に1～10回という頻度の通信はできない．映像伝送も無理．

問題も山積みです．

---
ここから下の章は，最終目的「ドローン操作システム」とは無関係です．
単純にシステムの理解を深めるための比較として書きました．

# テレメトリでの遠隔操作

以前の記事，[dronekit-python を使ってみる(実機編)](https://qiita.com/hsgucci/items/e72ef6c172b9d2e62d72)で最後にやった作業は，
以下の図のようになります．
![telemetry.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256470/f7905edd-50ff-0b43-5e6a-a7757c46e53e.png)

したがって，Pythonとdronekitを使っているものの，
やっている事自体は「フライトモードの変更」「Guidedで緯度経度指定」なので，
MissionPlannerが持っている機能です．

dronekitのサンプル[microgcs.py](https://qiita.com/hsgucci/items/5f16bd161d1fb9c5683f#%E3%82%B5%E3%83%B3%E3%83%97%E3%83%ABmicrogcspy)が良い例ですが，
PythonベースでGUIのあるアプリ作成を頑張れば，
「MissionPlannerのようなソフトウェア」を自作することも可能ですね．


# ROSを使う際

ROSでドローンを操作したい理由のほとんどは，SLAMが目的でしょう．
その場合，測域センサ(LIDAR)や奥行きカメラ()などのデータ処理をさせるには
Raspberry Piのような非力なコンピュータでは力不足です．

図のようにCore i7などの高性能CPUを持ったベアボーンＰＣを搭載することになるでしょう．


![mavros.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256470/607b0eb7-be04-185c-e138-8a6464b4a7af.png)

ROSからardupilot/PX4系フライトコントローラへアクセスするためには，
[mavrosというROSパッケージ](http://wiki.ros.org/mavros)　が用意されているので，
これを利用することになります．

もちろんdronekitを使って，独自のパッケージを作ることもできますが，
少々大変かと思われます．


# おわりに

今回は脇道にそれて「システム構成」についての解説でした．
次回は本来の目的に戻ってプログラミング関連をやっていきます．
今年の言語はRust その５９

# 今年の言語はRust その５９

Rustを学びます

Rustの日本語ドキュメント 2nd Edition
https://doc.rust-jp.rs/book/second-edition/

オリジナル(英語)
https://doc.rust-lang.org/book/


## 実行環境

```sh
$ cargo -V
cargo 1.33.0 (f099fe94b 2019-02-12)

$ rustup -V
rustup 1.17.0 (069c88ed6 2019-03-05)

$ rustc --version
rustc 1.33.0 (2aa4c46cf 2019-02-28)

$  cat /proc/version
Linux version 4.14.97-74.72.amzn1.x86_64 (mockbuild@gobi-build-64002) 
(gcc version 7.2.1 20170915 (Red Hat 7.2.1-2) (GCC)) 
#1 SMP Tue Feb 5 20:59:30 UTC 2019

$ uname -a
Linux ip-10-100-0-8 4.14.97-74.72.amzn1.x86_64 
#1 SMP Tue Feb 5 20:59:30 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

$ cat /etc/\*release
NAME="Amazon Linux AMI"
VERSION="2018.03"
ID="amzn"
ID_LIKE="rhel fedora"
VERSION_ID="2018.03"
PRETTY_NAME="Amazon Linux AMI 2018.03"
ANSI_COLOR="0;33"
CPE_NAME="cpe:/o:amazon:linux:2018.03:ga"
HOME_URL="http://aws.amazon.com/amazon-linux-ami/"
Amazon Linux AMI release 2018.03

```

## 19. 高度な機能

通常なら飛ばして後から考えますが、今回は全写経が目的なので、
理解朧げでもひたすら写経して進んでいきます。


### 19.4 高度な型


#### 型エイリアス

```rust
fn main() {

  type Kilometers = i32;

  let x: i32 = 5;
  let y: Kilometers = 5;

  println!("x + y = {}", x+y);
}
```


#### never型は絶対に返らない

__返さない__ ことを明示することが可能？

```rust
fn bar() -> ! {
} 

```

したが具体例なのでが、よくわからない。。

```rust
impl<T> Option<T> {
  pub fn unwrap(self) -> T {
    match self {
      Some(val) => val,
      None => panic!("called Option::unwrap() on a None value")
    }
  }
}
```



イエス！


あと、5/8にRustの最新本がでるみたいです! 気が付いてラッキー！ (現在5/7)

[実践Rust入門[言語仕様から開発手法まで] 単行本（ソフトカバー） – 2019/5/8](https://amzn.to/2VdAQ6y)

<a href="https://www.amazon.co.jp/%E5%AE%9F%E8%B7%B5Rust%E5%85%A5%E9%96%80-%E8%A8%80%E8%AA%9E%E4%BB%95%E6%A7%98%E3%81%8B%E3%82%89%E9%96%8B%E7%99%BA%E6%89%8B%E6%B3%95%E3%81%BE%E3%81%A7-%CE%BAeen/dp/4297105594/ref=as_li_ss_il?_encoding=UTF8&psc=1&refRID=KADG0R1CJZD9Y07B3P7E&linkCode=li2&tag=peace098beat-22&linkId=52fef8a307968a1010a3375899274077&language=ja_JP" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4297105594&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=peace098beat-22&language=ja_JP" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=peace098beat-22&language=ja_JP&l=li2&o=9&a=4297105594" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

※アフェっときます
CircleCIのsave_cache、restore_cacheについて


## はじめに

最近、CI/CD周りの構築に関心があり、CircleCIについて少し触ってみました。
そこで、キャッシュ周りについて簡単なメモを残しておきたいと思います。

## save_cache

下記のように、pathとkeyを設定する事でキャッシュできる。
また、keyの指定時にchecksumを用いて、yarn.lockをSHA256でhash化しています。

```yml

version: 2
jobs:
  build:
    docker:
      - image: circleci/node:10.8.0
    working_directory: ~/hoge
    steps:
     ...do something
      - save_cache:
          key: v1-hoge-{{ .Branch }}-{{ checksum "yarn.lock" }}
          paths:
            - ~/hoge/node_modules

```


## restore_cache

save_cacheで指定した同じkeyを用いて、キャッシュをリストアします。
こうする事により、キャッシュしたnode_modulesを使用することができます。
※yarn.lockの中身に変更があれば、hash値も変わるので、キャッシュされたnode_modulesは使用されません。

```yml

steps:
  - restore_cache:
      key: v1-hoge-{{ .Branch }}-{{ checksum "yarn.lock" }}

```

## 参考

https://circleci.com/docs/2.0/caching/#cache-expiration
SQLで通し番号をつけたくなった

# 概要
タイトル通り、SQLでデータを成形する際に複数のカラムをkeyとして通し番号がつけたくなりました。
意外とすんなりできる方法が見つかったため、備忘録として残しておきます。
なお筆者は普段Hiveでクエリを流しているため、他とお作法が異なる部分があったら申し訳ないです。

# 設定
次のようなtestテーブルが存在する場合を考えます。

| dt       | hour | minute |
|---|---:|---:|
| 20190401 |    0 |      0 |
| 20190401 |    0 |      0 |
| 20190401 |    0 |     10 |
| 20190402 |    4 |     50 |
| 20190402 |    4 |     50 |
| 20190403 |   22 |     40 |
| 20190403 |   22 |     50 |

# 今までの方法
testテーブルに存在するdt, hour, minuteの3つのカラムをkeyとして通し番号が欲しい場合、今まではWITH句を使ってSELECT DISTINCTでdt・hour・minuteを選択し、row_numberで連番を振ったテーブルをJOINしていました(頭の悪い方法なのでクエリは省略)。

# 今回の方法
通し番号を順番と読み替え、dense_rankを使えば解決することに気がつきました！

```sql:serial.sql

SELECT
  dt
  ,hour
  ,minute
  ,dense_rank() OVER (ORDER BY dt, hour, minute) AS serial_number
FROM
  test
ORDER BY
  serial_number
```

結果はこうなります。

| dt       | hour | minute | serial_number |
|---|---:|---:|---:|
| 20190401 |    0 |      0 |             1 |
| 20190401 |    0 |      0 |             1 |
| 20190401 |    0 |     10 |             2 |
| 20190402 |    4 |     50 |             3 |
| 20190402 |    4 |     50 |             3 |
| 20190403 |   22 |     40 |             4 |
| 20190403 |   22 |     50 |             5 |

MySQLだと8.0以降のver.でWindow関数が実装されたようですね。
Window関数を使っているため実行速度は担保されないものの、今までのJOINクエリよりは良さそうです。

# まとめ
SQLだと細かな作業が引っかかったりします。
自分以外にも困っている方がいるかもしれないので、よろしければ参考にしてください。
あと、もっと上手い方法があったら切実に教えてください...。
[Python]LineMessageAPIのemoticon送信方法

デコードデコードエンコードデコード

##やりたいこと
LineMessageAPIをつかった通知で絵文字を送信したい。（Python版）

##結果
```python
import codecs

code = "1000A5"
bin = '0' * (8 - len(code)) + code
bin = codecs.decode(bin,'hex_codec').decode('utf-32BE').encode('utf-8').decode('utf-8')
```

##参考
https://github.com/line/line-bot-sdk-php/issues/54
https://qiita.com/hisaharu/items/613baad81a4161c3c6c2
wp-adminでWP APIをJSから扱う

wp-adminからWP APIをJSからコールする方法を試したので覚書。

## WP APIをコールする際の注意点

認証が必要なAPIは、`X-WP-Nonce`をヘッダーで送る必要がある。

## wp-api.jsのimport
nonceの生成などをよしなにしてくれるのでimportしておく。
ついでにPOSTリクエストにjqueryを使うのでこちらもいれておく。

```php
add_action('wp_enqueue_scripts', 'add_scripts' );
add_action('admin_enqueue_scripts', 'add_scripts' );

function add_scripts() {
  if ( is_user_logged_in() ) {
    wp_enqueue_script( 'jquery' );
    wp_enqueue_script( 'wp-api' );
    wp_enqueue_script( "custom_js", plugins_url( 'libs/scripts.js', __FILE__ ), array( 'jquery', 'wp-api' ) );
  }
}
```

## libs/scripts.js
リクエスト処理部分。
`wp-api.js`を入れていると、`window.wpApiSettings`という値がwp-adminでは定義されている様子。
これにWP APIのパスとnonceが入っているので使う。

```javascript
const settings = window.wpApiSettings
const requestObj = {
    url: settings.root + 'wp/v2/posts',
    method: 'POST',
    beforeSend: function ( xhr ) {
      xhr.setRequestHeader( 'X-WP-Nonce', settings.nonce );
    },
    body: { /* post params */}
}
jQuery.ajax( requestObj )
  .then( result => console.log( result ) )
```

wp-api.jsをちゃんと使えばjQueryもいらない気はする。
ただ、Backbone.js触ったことがないのでそれはまた時間ができたときにでも。
random sleep 

-gistの連続更新で500系のエラーが出る為、数十ミリウェイトする用。

```js
let fn={}
fn.sleep=t=>new Promise(d=> setTimeout(d,t));
fn.rsleep=(min=70)=>{
 let time=min+~~(Math.random()*min)
 return fn.sleep(time)
}
```
```js
fetch(...).then(calc).then(d=>fn.rsleep(70)).then(...)
```
Chainerで可変長の入力を正しく扱う

# はじめに

ディープラーニングでは、各入力データの長さが一致していないと色々と不都合があり、入力に文（単語列）などを扱う場合は度々この問題が発生します。

この記事では、Chainerで可変長入力を正しく扱うためのテクニックを紹介します。（主に著者の忘記録用ですが）


# 前提：なぜ入力データの長さが一致していないと問題なのか？

そもそもなぜ入力データの長さが一致していないと問題なのでしょうか？
その理由は、「計算を高速に実施するために、numpy・cupy上の行列演算を使いたいから」です。

ディープラーニングではよくミニバッチ学習が採用されますが、このミニバッチ単位で効率よく損失の計算ををしたいわけです。この時にミニバッチ内の各入力を１つずつ読んでいてはあまりにも非効率です。

```python
for x in x_lst:
  h = self.encoder(x)
  （以下略）
```

この計算を高速化するために、numpyやcupyを使用します（なぜ高速になるのかはここでは解説しません）。

```python
import numpy

x = numpy.array(x_lst)
h = self.encoder(x)
```

ただし、入力の長さがそろっていないと行列化できません。上記の例の x_lst に含まれる各要素の長さが一定でないと、numpy.arrayで落ちてしまうわけですね。


# 可変長入力の扱い方
可変長入力を扱うときは、以下の３つのテクニックを用いるのが直感的で簡単です。

1. padding
2. embedding
3. masking

ほかにもreshapeを駆使することでmaskingの代わりにすることもできますが、本記事での解説は省きます。

paddingとembeddingは単純かつ簡単で、本記事以外にも多数の解説があります。maskingも単純なのですが、よくミスをしてしまいがちです。maskingを適当にやってしまうと、正しい計算が行われなくなる危険性があります。

## １：padding
まず長さが足りていない入力に適当な値を埋めることで、無理やりnumpy.arrayを通します。

```
[
[4, 2, 5]
[9]
[6, 3, 7, 1]
]
↓padding
[
[4, 2, 5, -1]
[9, -1, -1, -1]
[6, 3, 7, 1]
]

```

paddingについては、[ディープラーニングフレームワークで可変長の入力を扱うときのTips](https://qiita.com/koreyou/items/1350f831341f4ce47d66)でわかりやすく紹介されています。

Chainerでは、`functions.pad_sequence`モジュールを利用するのが良いでしょう。

## ２：embedding
embeddingする際にpaddingで適当に埋めた値に対しては、基本的にゼロベクトルを与えてやりましょう。

Chainerの`link.EmbedID`では、ゼロベクトルを返す値をignore_labelオプションで指定することができます。
paddingする値を-1、ignore_label=-1 としてやるのが一般的なようです。

## ３：masking
計算を進めていく中で、要所要所に`function.where`によるmaskingを入れて、paddingに相当する部分をゼロにしましょう。たとえば、ゼロが入るとNaNが発生する割り算やlogを含んだ計算後で、ネットワーク内の学習対象である重み行列との演算前に、maskingの処理を入れるのが妥当です。

```python

import numpy
import chainer.functions as F

x = F.log(x + 0.0001) # NaaN回避のため、微小値を加算
x = F.where(mask, x, numpy.full(x.shape, 0., numpy.float32))
```

※変数maskはxと同じshapeを持つnumpy.boolの行列です。
Chainer の whereに関しては[公式ドキュメント](https://docs.chainer.org/en/stable/reference/generated/chainer.functions.where.html)を参照してください。


ここで問題となるのは、maskをどのように作るかです。

まず最初に思いつくのは`x.data != 0`ですが、これまでの計算の結果、偶然ゼロが発生していたりすると危険です。またDropout関数を噛ませていると、paddingした箇所とDropoutした場所を判別することは困難です。


解決策の１つは、embeddingした時点でmaskを作成し、通常の入力に対するforwardの計算に合わせてmaskも更新していくことです。

```python

x = self.embed(inputs)
mask = numpy.absolute(x.data) > 0.

x = F.dropout(x, 0.1)
x = F.reshape(x, shape)
mask = F.reshape(mask, shape)
（中略）

x = F.log(x + 0.0001)
x = F.where(mask, x, numpy.full(x.shape, 0., numpy.float32))
```

更新中は、maskがbool型である点に気を付けましょう。和や積などに対してbool型に対応したnumpyライブラリを使いましょう。
たとえば、以下のような形になります。

```python
# x1, x2: 入力側の値
# x: 出力側の値
# m1, m2: x1, x2のmask
# x の maskを計算したい

x = F.sum(x1 * x2, axis=-1)
mask = numpy.all(numpy.logical_and(m1, m2), axis=-1)
```

# まとめ
- Chainerで可変長入力を扱うときは、padding, embedding, masking
- maskingでミスが発生しやすい
- embeddingした時点でmaskを作り、forwardの計算に合わせてmaskを更新していく