OmniAICreator/Qiita-1.07M huggingface dataset:
Route53を利用した障害時のDNS自動切り替え

サーバー障害時にDNSを切り替えて予備系に流したり、メンテ中の表示を出すのに自動でDNSを切り替える事ができないかな...と思い立ってやってみました。

#使うもの

+ AWS Route53

#費用

AWSエンドポイント対しては50件までは無料なはずです。AWS外の場合は$0.75/月のようです。

トラフィックフローの場合は$50/月なのでフェイルオーバーだけの目的であれば、月約100円で安心が買えます。

>* 新規および既存のお客様は、AWS アカウント内にあるか、AWS アカウントにリンクされた最大 50 個の AWS エンドポイントに対してヘルスのェックを無料で利用できます (オファー)。

https://aws.amazon.com/jp/route53/pricing/

#設定方法

## ヘルスチェック

DNSの切り替えるための死活監視のために、まずはRoute53のヘルスチェックの設定をします。

+ 「ヘルスチェックの作成」を選択します。
+ 環境設定で名称を入れ、モニタリングの対象にエンドポイントを選択します。

<img width="605" alt="スクリーンショット_2019-02-25_10_55_28.png" src="https://qiita-image-store.s3.amazonaws.com/0/14768/6fffecb6-4c8b-e285-c35e-690d03d08fc6.png">

+ エンドポイントの監視の部分にはチェック対象のIPアドレスを設定します。

<img width="605" alt="スクリーンショット_2019-02-25_10_55_28.png" src="https://qiita-image-store.s3.amazonaws.com/0/14768/fc1e68d4-c507-c3a2-bd62-05f3080b19e6.png">



## DNS設定

### プライマリー側
+ TTLは切り替えを考慮して60secが推奨のようです。「1m」を押すと60が入ります。
+ Routing Policyに「Failover」を設定し、メインのFailover Rocord Type に「Primary」を設定します。Seit-IDは自動作成されます（特に変更する必要は無いようです）
+ Associate With Health Check に「Yes」を設定し、先ほどヘルスチェックで設定した名称を入れます。

<img width="420" alt="スクリーンショット_2019-02-25_10_58_37.png" src="https://qiita-image-store.s3.amazonaws.com/0/14768/3c726768-6e4c-57e8-606c-7c9df838ace1.png">

### セカンダリー側
+ セカンダリー側も同じサブドメインで設定します。
+ TTLは切り替えを考慮して60secが推奨のようです。「1m」を押すと60が入ります。
+ Routing Policyに「Failover」を設定し、メインのFailover Rocord Type に「Secondary」を設定します。

<img width="414" alt="スクリーンショット_2019-02-25_10_58_44.png" src="https://qiita-image-store.s3.amazonaws.com/0/14768/fa0938de-7126-ddcb-42bc-def1ba523373.png">

+ セカンダリーは生きている前提なのでAssociate With Health Check は「No」で良いかと思います（節約）

# テスト方法

サーバーを落とす方法もありますが、ヘルスチェックの「高度な設定」で「ヘルスチェックステータを反転」にチェックを入れる事でDNSの切り替わりが確認できると思います。

<img width="737" alt="スクリーンショット_2019-02-25_11_04_02.png" src="https://qiita-image-store.s3.amazonaws.com/0/14768/7a66bf56-34b9-358e-c2b2-2e80b012d5fd.png">

# ごにょごにょ

ヘルスチェックはICMP Pingが使えないので、ルータなどの場合はどこか監視用のTCPポートを開けておく必要があります。また、HTTPの場合200が返ってくるのが条件なので、適当に設定して404等になっているとヘルスチェック失敗になりますのでご注意ください（知らなかった。

ただ、これをうまく利用すると、特定のHTMLファイルが無い時にはDNSの向き先が変わるような設定ができるので保守時などにも使えるような気がします。

# 参考

https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/dns-failover.html
Laravelコマンド一覧


# プロジェクトの作成
```terminal
バージョン指定してプロジェクトを作成
$ composer create-project 'laravel/laravel=8.*' アプリ名
```

# ログイン機能の作成
```terminal
$ composer require 'laravel/ui:*'
$ php artisan ui bootstrap --auth
$ npm install && npm run dev
$ npm run watch
```



# Modelの作成
```terminal
$ php artisan make:model モデル名
```

# Controllerの作成
```terminal
$ php artisan make:controller コントローラー名
```

## フォルダを指定してControllerを作成
```terminal
$ php artisan make:controller フォルダ名/コントローラー名 --resource
```
--resourceとつけることでController内のメソッドが自動で生成されます。



# Middleware
```terminal
$ php artisan make:middleware ミドルウェア名
```

# Policy
```terminal
$ php artisan make:policy ポリシー名
```

# Event
```terminal
$ php artisan make:event イベント名
```

# Listener
```terminal
$ php artisan make:Listener リスナー名
```

# migrate（DB関連）
#データベースに初期データを入れる
```terminal
$ php artisan make:seeder シーダー名
```
# マイグレートする(DBに対してtable情報を反映させる)
```terminal
$ php artisan migrate
```
DBに対してtable情報を反映させます

# テーブルのロールバック
```
$ php artisan migrate:rollback 
```
一回ずつrollbackします。

# テーブルのリセット
```terminal
$ php artisan migrate:reset
```
DBに対してmigrateしたものをrollbackできます。

#ルーティングの確認
```terminal
$ php artisan route:list
```
URIなどの一覧を表示してくれます。

# サーバーに接続
```terminal
$ php artisan serve
```

# キャッシュクリアコマンド
```terminal
$ php artisan cache:clear
$ php artisan config:clear
$ php artisan route:clear
$ php artisan view:clear
```
Docker for Windows チート

Windows環境で、Vagrant から Dockerにお引越ししてみた :relaxed:

Vagrantと比べると、環境構築が嘘のように早い！！軽い！！ファイル小さ！取り回し楽！

でも、for Windowsは、コンテナ入るときと、マウント一手間必要みたい。

```bash

### バージョン
docker version

### テスト
deocker run hello-world

### イメージダウンロード
docker pull %image名%
docker pull centos

### イメージ一覧確認 新旧
docker images
docker image ls

### イメージ削除
docker rmi %Image ID%

### イメージからコンテナ作る
docker create -it %image名%

### イメージからコンテナ削除
docker rm %コンテナID or コンテナ名%
docker rm --force %コンテナID or コンテナ名%

※スペース区切りで複数消せる

### コンテナ一覧確認
docker container ls -a

### コンテナ開始
docker start %コンテナID or コンテナ名%

### コンテナ停止
docker stop %コンテナID or コンテナ名%

### コンテナ入る
docker exec -it %コンテナID or コンテナ名% /bin/sh
winpty docker exec -it myapp bash

### コンテナ出る
Ctrl + p + q

docker run -it %image名%　bin/sh

### マウント git-bash windows　※[Settings]で追加設定必要
docker run -d -p 80:80 --name myapp -v /$PWD:/var/www/html php:7.2-apache

※コンテナ作った後にマウントとか、マウント場所変更とかできないらしい。
　再度作り直すか、結構変更していて難しい場合は一度docker commitして
イメージ作ったりしてからマウントしたりするらしい。

### コンテナ全部強制的に消す
docker rm $(docker ps -aq) --force


```

#### Windowsはちょっとめんどい？ マウント追加設定
![image.png](https://qiita-image-store.s3.amazonaws.com/0/364471/e02a8e86-372d-9ab2-083a-f95f4ecc978f.png)


![image.png](https://qiita-image-store.s3.amazonaws.com/0/364471/b9ad282d-3b54-2c1b-c1ad-b240c4833c27.png)


###独自イメージ作成

```
docker build -t %作りたいイメージ名% .　--no-cache
```

###Docker Hub　にイメージプッシュ
```sh

#タグ付け
docker tag 1e16ds4dctfs %アカウント名%/%リポジトリ名%:%タグ名%
#プッシュ
docker push %アカウント名%/%リポジトリ名%
```

### git-bash でエイリアス追加
```
vi ~/.bash_profile

alias d="docker"
alias wde="winpty docker exec -it"
alias dcls="docker container ls -a"
alias dils="docker image ls"

```
Linuxの仮想環境構築手順（その1 ホストサーバ編）

# Linuxの仮想環境構築手順（その1 ホストサーバ編）
Linuxではkvm(Kernel-based Virtual Machine)というハイパーバイザー（コンピュータを仮想化するソフトウェア）が利用できます。これによって1台のPCに何台もの仮想サーバを構築出来きるのでリソースを無駄なく使えます。

## CentOS7をインストールしてkvm環境を構築する
CentOSとはLinuxディストリビューションの一つのRedhatOSのクローンであり、Redhatは商用版、CentOSは無料版という位置づけと覚えておけばいいでしょう。今回はこの無料版のCentOSをインストールして仮想環境を作っていきます。

**必要なソフトとインストールしたver.一覧**

| 項目          | 構築した時のver.                     |
| ------------- | ------------------------------------ | 
| CentOS        | CentOS Linux release 7.5.1804 (Core) | 
| libvirt       | 0.10.2                               | 
| QEMU          | 0.12.1                               | 
| GNOME関連     | 多すぎて省略                         | 

--------

### メディアの準備
"CentOS Download"でググってCentOSの公式サイトからダウンロードページに移動してイメージを取得する。下記のようなファイルを取得後、インストールDVDを作成する。作成方法は"CentOS DVD　作成"でググれば出てくる。

`CentOS-7-x86_64-DVD-1810.iso`


### CentOS7のインストール
インストール時、最後の方で出てくるタイプをVirtualization Hostを選択する。

```OSインストール後、GUI環境もインストールする

このままだとコマンドラインでしか仮想マシンを管理出来ないので、GNOMEデスクトップをインストールしてランレベルを5にしてVirtual Machine Managerというツールをインストールする。

CLIで仮想マシンを管理する事は可能ですが、結局VNCなどのツールが必要だし、今後ゲストOSの保守をリモートで実施するケースを考えるとGNOME+xrdpの組み合わせがいいと思います。
```
```ちなみにVirtualization HostとGNOMEデスクトップと同時にインストール出来れば下記GNOMEデスクトップインストールの手順はいりません。CentOS6では出来た気がするけど7でやり方がよくわからないので知っている人いたら教えてください（懇願）```

### GNOMEデスクトップのインストール
DVDからyumでインストールします

**yumの設定(レポジトリ設定ファイル作成)**

```shell
# cd /etc/yum.repos.d
```
```shell
vim media.repo
```
```bash:/etc/yum.repos.d/media.repo
[media]
name=CentOS-7
baseurl=file:///mnt/cdrom
gpgcheck=0
gpgkey=file:///mnt/cdrom/RPM-GPG-KEY-CentOS-7
```

その他のレポジトリ設定ファイルを一時退避(方法は色々あるのでこの辺は各自適当でOK)

```shell
mkdir old
```
oldフォルダにmedia.repo以外を移動する


**Cent 7.5のmediaを入れてyumのレポジトリにする**

Mediaのマウント

```shell
mkdir /dev/cdrom /mnt/cdrom
```
```shell
mount /dev/cdrom /mnt/cdrom
```
yumインストール

```shell
yum groupinstall "GNOME Desktop"
```
```shell
yum install virt-manager
```
GUIで起動（ランレベル5）させる

```shell
systemctl set-default graphical.target
```
## ブリッジの設定
今後ゲストサーバを作成した後、インストールしたPCの外にあるノードと通信するためにはネットワークの設定が必要ですが、ブリッジが簡単でおすすめです。

```shell
nmcli c add type bridge autoconnect yes con-name br0 ifname br0
```
```shell
nmcli c modify br0 ipv4.method manual ipv4.addresses "192.168.xxx.xxx/24" ipv4.gateway "192.168.xxx.xxx"
```
```shell
nmcli c add type bridge-slave autoconnect yes con-name br0-slave ifname eno1 master br0
```
```ifnameはip aコマンドを実行し実際のnicの名前を調べて入れる```

```shell
systemctl restart network.service
```
**サーバを再起動して準備完了（その2ゲストサーバ作成編に続く）**
pybind11入門(2)

[前回](https://qiita.com/lucidfrontier45/items/872c38b5eec08e3800d7)はpybind11の簡単なビルド周りを試したので今回はデータ構造(STLコンテナ)を試してみる。[公式doc](https://pybind11.readthedocs.io/en/stable/advanced/cast/stl.html)によると以下のように自動的にデータ構造のマッピングをやってくれるらしい。

```
- list <--> std::list, std::vector, std::array
- tuple <--> std::pair, std::tuple
- dict <--> std::map, std::unordered_map
- set <--> std::set, std::unordered_set
- str <--> std::string
```

## ソースコード

今回はPython側からtupleのlistを渡してそれをC++でstd::unordered_mapに変換し、Pythonに戻す関数を作ってみる。

```cmake:CMakeLists.txt
cmake_minimum_required(VERSION 3.2)
project(pybind_test VERSION 0.2.0)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
add_subdirectory(pybind11)
pybind11_add_module(mymodule module.cpp)
```

```module.cpp
#include <utility>
#include <string>
#include <pybind11/pybind11.h>
#include <pybind11/stl.h>

auto make_dict(const std::vector<std::pair<std::string, int32_t>> &items){
    std::unordered_map<std::string, int32_t> d;
    for (const auto &item: items){
        d[item.first] = item.second;
    }
    return d;
}

PYBIND11_MODULE(mymodule, m)
{
    m.doc() = "my test module";
    m.def("make_dict", &make_dict, "");
}
```

C++側では`std::vector<std::pair<std::string, int32_t>>`のようにしてPythonで言う`List[Tuple[str, int]]`を受け取り、`std::unordered_map<std::string, int32_t>`を返すことでPythonの`Dict[str, int]`に変換される。なお、STLコンテナの自動変換を利用する場合は`pybind11/stl.h`が必要。

buildして実行してみるとちゃんとdictが作られる。

```py
import mymodule
mymodule.make_dict([("a", 1), ("b", 2), ("c", 3)])
>> {'c': 3, 'a': 1, 'b': 2}
```

[公式doc](https://pybind11.readthedocs.io/en/stable/advanced/cast/index.html)によると他にも

- datetime <--> std::chrono
- Python func <--> C++ func
- NumPy array <--> Eigen

などの自動変換にも対応しているとのこと。
【Java】文字列のパディング

文字列が指定の桁数になるようにパディングしたい時は、**「String.format」**メソッドを使用します。

##String.format

###文字列の空白埋め

```java:padding.java
import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        String result5keta = blankPadding5keta();
        String result10keta = blankPadding10keta();
        System.out.println(result5keta);
        System.out.println(result10keta);
    }

    // 5桁で空白埋め
    private static String blankPadding5keta(){
        String str = "123";
        String paddingStr = str.format("%5s", str);

        return paddingStr;
    }

    // 10桁で空白埋め
    private static String blankPadding10keta(){
        String str = "12345";
        String paddingStr = str.format("%10s", str);

        return paddingStr;
    }
}
```
```:結果
  12345
     12345
```



###文字列の0埋め


```java:padding.java
import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        String result5keta = zeroPadding5keta();
        String result10keta = zeroPadding10keta();
        System.out.println(result5keta);
        System.out.println(result10keta);
    }

    // 5桁で0埋め
    private static String zeroPadding5keta(){
        String str = "123";
        String paddingStr = str.format("%5s", str).replace(" ", "0");
        
        return paddingStr;
    }

    // 10桁で0埋め
    private static String zeroPadding10keta(){
        String str = "12345";
        String paddingStr = str.format("%10s", str).replace(" ", "0");
        
        return paddingStr;
    }
}
```


```:結果
00123
0000012345
```
私がExcelを勉強してできるようになったこと。

#Lv.4&5を見るだけでいいとおもいます。

#Lv.1 ゼロ→Excel specialistをとるまで。

関数を覚える。
↓
**vlookup**使う
↓
ド○クエみたいにレベルアップ機能を作る。
↓
後輩がExcelで分析した時に
「経験値」が入るようにする。

同期の間で**誰がどれだけ**
**頑張っているか**
客観的な指標を作る。

#Lv.2 specialist→expertをとるまで

なんだかんだ**ピボット**を作るために
データを加工していけばいいんだなぁ
↓
売上をカテゴリー毎に集計する
↓
分析開始。

#Lv.3 expert→Master→Youtube

エクセルマクロ達人養成塾
（無料の範囲のみ）
↓
**VBA**っていうプログラミングがExcelに入ってたんだ。
へぇ〜

#Lv.4 Youtube→クマの本

VBAに関するクマの本を読む
↓
**Lv.1&Lv.2**をボタン3つで
２０秒程かけて
**自動でPCに**やってもらう。
↓
「売上Top10の項目に関して、
どの週にどの年代が
買っているのか」も出せるようにする。

#Lv.5 クマの本→カエルの本

ExcelとOutlookの連携について学ぶ
↓
Lv.4で出た
顧客分析結果から
↓
今買う確率の高い人を
データベースから自動抽出
（買いそうにない人の除外）
↓
抽出した顧客ごとに
**メール**のアドレスと文面を
**自動作成**
↓
送信可能な状態にスタンバイする




















Lv.6
売上データから
個々のスタッフがどの分野に強いか
分析する
↓
自動転職用
文面作成システムを実装
↓
個々のスタッフにメールで自動送信
IntelliJやRubyMineをJetbrains Toolboxに移行したらAlfredで探せなくなったのを直した

Toolbox管理にしたら不便になったのでメモ

# TL;DR
1. Toolboxアプリの右上の六角形のアイコンから設定画面に行く
2. `Tools Install location` という項目のパスを `/Applications` に変更
3. 探せる！

# なぜか
Toolboxがインストールしてくれるとパスは `~/Application Support/` 配下の深い深いところに置かれてしまう。

Alfredのデフォルト設定だとアプリケーションは `/Applications` 配下のアプリを出してくれるっぽいのでそっちに置いてあげればすべて解決。

# Alfred側をいじる方法でもOK
起動中のIDEのアイコンをdockから右クリックし、置かれているパスを確認してToolboxディレクトリ配下をAlfredの検索対象ディレクトリとする方法でもアリ。

Alfredの検索パスは以下の設定項目から設定できる。

```
Alfred Preferences -> Features -> Default Results -> Search Scope 
```

@uasi さん情報提供ありがとうございます！
Window関数によるシンプルな累計の仕方の模索

仕事で累計を求める必要が生じた。さんざん悩んだ結果、簡単にできることを知ったため、忘備録として残す。

|ItemCode |date |siire  |syukka  |
|--: |:-: |--: |--: |
|A  |2019-02-01 16:45:31|100  |0  |
|A  |2019-02-02 18:02:35|50  |150  |
|A  |2019-02-03 16:15:00|50  |25  |
|A  |2019-02-04 18:11:06|25  |50  |

このような表（`zaiko_hyou`）があったとして

|ItemCode |date |siire  |syukka  |zaiko|
|--: |:-: |--: |--: |--:|
|A  |2019-02-01 16:45:31|100  |0  |100|
|A  |2019-02-02 18:02:35|50  |150  |0|
|A  |2019-02-03 16:15:00|50  |25  |25|
|A  |2019-02-04 18:11:06|25  |50  |0|

という表にしたいとき、とりあえずview(`v_zaiko_hyou`)を作成して当日の在庫増減を算出。

|ItemCode |date |siire  |syukka  |toujitu_zaiko|
|--: |:-: |--: |--: |--:|
|A  |2019-02-01 16:45:31|100  |0  |100|
|A  |2019-02-02 18:02:35|50  |150  |-100|
|A  |2019-02-03 16:15:00|50  |25  |25|
|A  |2019-02-04 18:11:06|25  |50  |-25|

作成したview(v_zaiko_hyou)のtoujitu_zaikoに対し、window関数を用いて累計を行うことで在庫数が表現できる。

```mariadb:zaiko.sql
SELECT 
    *,
    SUM(toujitu_zaiko)(PARTITION BY ItemCode ORDER BY date )AS zaiko,
FROM 
    v_zaiko_hyou
```
direnv で java を切り替える

[direnv](https://direnv.net/) は、ディレクトリごとに環境変数を切り替えられるツールで、複数のプロジェクトを並行開発している場合などに便利です。

Mac なら、以下のような関数を `~/.direnvrc` に定義しておくと・・・

```shell
# ~/.direnvrc
use_java() {
    if [ "$#" -ne 1 ]; then
    echo "usage: use java VERSION" >&2
    return 1
  fi
  local v
  v="$1"
  if [ "$v" -le "8" ]; then
    v="1.$v"
  fi
  export JAVA_HOME="$(/usr/libexec/java_home -v "$v")"
  PATH_add $JAVA_HOME/bin
}
```

各プロジェクトでは、こんな風に書くだけでOK

```shell
# [プロジェクトのディレクトリ]/.envrc
use_java 11 # JDK 11 を使う
```

なお、direnv には `use_hoge` を `use hoge` と書ける、（微妙に）便利な機能があるので、こうも書けます。

```shell
use java 11
```

なお、Java以外の言語については `use` が標準で提供されています。


https://github.com/direnv/direnv/blob/master/stdlib.sh
https://github.com/direnv/direnv/blob/master/man/direnv-stdlib.1.md
ストアドプロシージャ - 入門

備忘録

## プロシージャ作成～使用の流れ
○プロシージャ作る
→プロシージャ実行する（呼ぶとも言う）

関数・メソッドと同じ感覚

## 早速作る
前に環境を作ろうね
sqlserver2014　management studio があれば作れるよ


## 作る
```sql:作成.sql
 create procedure trial01
 as 
 select '1'
```
プロシージャができる　出力は「1」
プロシージャは接続先DBの直下にできるよ
直下以外に作りたい場合は、sqlserver画面の左上の[使用できるデータベース]をいじろうね

## 使う
```sql:実行.sql
exec trial01
```
実行される
`出力：1`

## 作る - 引数を使う
テーブル（table01）に引数２つ（id,cd）を渡す事とする
引数のidとcdに合致する条件のレコードを出力

```sql:引数.sql
create procedure trial02 (@id int, @cd int)
as
select *
from table01
where id = @id and cd = @cd
```
「 () 」はなくても動く

## 使う - 引数
```sql:使用-引数.sql
exec trial02 1000,9999
```
id=1000,cd=9999のレコードを出力する
`出力：id:1000 cd:9999 nm:花田 jnd:男 updym:202010
　　　 id:1000 cd:9999 nm:浜口 jnd:男 updym:202010
　　　 id:1000 cd:9999 nm:岡田 jnd:女 updym:202012`

## コード変更
```sql:変更.sql
alter procedure trial02
as
select * from table05
```
「alter procedure」で変更できる

または、trial02の階層を開いて右クリック、[変更]で中身開いて変更した後、実行で変更がされる

## 他
「as」以下はbegin~endとかでもok
SSLエラーが出ないSSL自己証明書を作る手順

自己認証局を作り、その認証局にSSL自己証明書を発行してもらいましょう。
自己認証局の証明書はクライアントにインストールする必要があります。

## 自己認証局

### 認証局の秘密鍵を作る
`openssl genrsa -des3 -out ca.key 2048`

### 認証局の証明書を作る
`openssl req -x509 -new -nodes -key ca.key -sha256 -days 36500 -out ca.pem`
組織名だけでOK。

### クライアントに認証局の証明書をインストール
MacOSならキーチェーンアクセスで「システム」に登録→「常に信頼」に設定
他OSはよしなに。

## SSL自己証明書

### SSL証明書の秘密鍵を作る
`openssl genrsa -out server.key 2048`

### CSRを作る
`openssl req -new -key server.key -out server.csr`

### マルチドメイン(SANs)を設定する
SANs設定ファイルを作る

```text:server.ext
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names

[alt_names]
DNS.1 = hoge.local
DNS.2 = fuga.local
```

### SSL証明書を作る
`openssl x509 -req -in server.csr -CA ca.pem -CAkey ca.key -CAcreateserial -out server.crt -days 36500 -sha256 -extfile server.ext`
PHP デバッグ

```php
error_log(print_r($params, true), 3, "/tmp/debug.log");
```

```php
echo "<pre>";
var_dump($params);
echo "</pre>";
```
#Xdebugの設定で全文表示されない場合

```php
ini_set('xdebug.var_display_max_children', -1);
ini_set('xdebug.var_display_max_data', -1);
ini_set('xdebug.var_display_max_depth', -1);
var_dump($params);
```
Google Spread Sheetのファイル日時を自動で特定のセルに書き込むスクリプト

# これは何？
Google Spread Sheetのファイル更新日をスプレッドシート上のセルに自動で書き込むスクリプトの紹介。

# スクリプトの追加方法
1. **[Tools] > [Script editor]** を選択。
<img width="497" alt="Screen Shot 2019-02-25 at 9.58.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/61221/fcce2d98-9dea-80a5-ac70-3f346c858f2d.png">

2. 表示されるエディタに以下のコードを貼り付ける
表示場所、文字列の色を変えたい場合は以下の2つの変数を変更する。
・`target_cel`: 表示するセルを指定
・`cel_color`: 表示する文字列の色を指定

```javascript
function onEdit(e) {
  insertLastUpdated()
}
function insertLastUpdated() {
  var target_cel = 'E1'
  var cel_color = 'black'
  var updated_date = Utilities.formatDate(new Date(), 'JST', 'yyyy/MM/dd HH:mm:ss')
  var user_name = Session.getActiveUser().getEmail()
  var new_title = '更新日：' + updated_date
  if(user_name != "") new_title += ' by ' + user_name
  new_title = '(' + new_title + ')'
  SpreadsheetApp.getActiveSheet()
   .getRange(target_cel)
   .setValue(new_title)
   .setFontColor(cel_color)
}
```

3. 名前をつけて保存をして、実行権限を付与する
再生ボタン（以下の画像の赤丸）をクリックすると、

- ファイル名の決定を促される
- 実行権限の付与の許可を求められる

のでファイル名を決定し、実行権限の許可を与えてください。
<img width="825" alt="Screen Shot 2019-02-25 at 10.01.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/61221/e35f9307-9354-d0ba-a466-8aef5ba0fb0c.png">

以上で、`target_cel`に指定したセルに、変更があった時に変更日時が自動で挿入されるようになります。
Macbookにhomebrewを使わないでgnuplotをインストールする

macbookにgnuplotをインストールしました。
多くの記事ではAquaTermとX11をインストール後（インストール方法は簡単でわかりやすい記事がたくさんあるのでそちらを参考にしてください）、

```
$ brew install gnuplot -–with-aquaterm --with-x11
```

で難なくインストールが完了するようですが、稀に

```
Error: invalid option: -–with-aquaterm
```

とエラーが出てしまう人がいるみたいです。どうやらインストールしたはずのAquaTermがhomebrewから見えていないのが原因であるようですが、どうやったらhomebrewから見えるようになるのか自分は知らなかったため（初学者でお恥ずかしい限りです。ご存知の方教えていただけたら嬉しいです）、ソースからgnuplotをインストールすることにしました。

以下のページからgnuplotをダウンロードします
https://sourceforge.net/projects/gnuplot/files/gnuplot/

downloadsディレクトリにダウンロードされましたので、

```
$ cd ~/downloads/gnuplot-5.2.5
$ ./configure --with-readline=builtin --with-aquaterm
$ make
$ sudo make install
```

とします。これで無事gnuplotが使えるようになりました。
pybind11入門(1)

Open3DやDlibのソースコードを読んでいるとpybind11という何やらすてきなものを使ってPythonのライブラリを作っているので試してみた。

## 準備

cmakeを使用します。pybind11はヘッダーだけのライブラリで、github (https://github.com/pybind/pybind11/releases) などからダウンロードして以下のようなディレクトリ配置にします。


```
project top
|- CMakeLists.txt
|- pybind11/ 
|- mymodule.cpp
```


## ソースコード

`mymodule.cpp` には以下のように書きます。

```c++
#include <pybind11/pybind11.h>

int add(int a, int b)
{
    return a + b;
}

PYBIND11_MODULE(mymodule, m)
{
    m.doc() = "my test module";
    m.def("add", &add, "add two numbers");
}
```

`PYBIND11_MODULE` というマクロを使用してPythonモジュールを作成できます。引数の1つめの`mymodule`はモジュールの名前で最終的に作成するライブラリのファイル名と揃える必要があります。 (`mymodule.cpython-37m-x86_64-linux-gnu.so` のような名前になる場合は `mymodule`)

2つ目の引数 `m` はマクロ内でのみ使用するもので、その後のように `m.def` を使用して関数を登録します。

これをビルドする際には次のような `CMakeLists.txt` を作成します。

```cmake
cmake_minimum_required(VERSION 3.2)
project(pybind_test VERSION 0.1.0)

add_subdirectory(pybind11)
pybind11_add_module(mymodule mymodule.cpp)
```

このままビルドするとデフォルトのPythonが使用されます。vritualenvやcondaで作った特定のバージョンのPython環境に対してビルドしたい場合は事前にその環境をactivateするか、 `cmake -DPYTHON_EXECUTABLE=path/to/python ..` のように指定します。 LinuxでPython3.7に対してビルドすると`mymodule.cpython-37m-x86_64-linux-gnu.so` というファイルができます。これをPYTHONPATHが通っている場所(例えばカレントディレクトリ)におけばimportできます。

```python
import mymodule
mymodule.add(1, 10)
>> 11
```

## ソースファイルの分割

プロジェクトが大きくなったり、もともとあるC/C++のコードを利用したいというときに全てのコードを `mymodule.cpp` に書くわけには行きません。ソースコードを複数に分割する場合には次のようにします。

```
project top
|- CMakeLists.txt
|- pybind11/ 
|- mymodule.cpp
|- lib.cpp
|- lib.hpp
```

```c++:lib.hpp
int add(int a, int b);
```

```c++:lib.cpp
#include "lib.hpp"

int add(int a, int b)
{
    return a + b;
}
```

```c++:mymodule.cpp
#include <pybind11/pybind11.h>
#include "lib.hpp"

PYBIND11_MODULE(mymodule, m)
{
    m.doc() = "my test module";
    m.def("add", &add, "add two numbers");
}
```

```cmake:CMakeLists.txt
cmake_minimum_required(VERSION 3.2)
project(pybind_test VERSION 0.1.0)

set(CMAKE_POSITION_INDEPENDENT_CODE ON)

add_subdirectory(pybind11)

add_library(test lib.cpp)

pybind11_add_module(mymodule mymodule.cpp)
target_link_libraries(mymodule PRIVATE test)
```

ポイントは`add_library`を使用してPythonと関係ないライブラリを作成したあと、`target_link_libraries`でpybind11で作ったmoduleとそれを結合します。もちろん`pybind11_add_module`で全てのソースファイルを指定しても良いのですが、こちらのほうが通常のC/C++用ライブラリとPython用ライブラリの両方ができるので何かと便利だと思います。


## 参考

公式doc: https://pybind11.readthedocs.io/en/stable/index.html
[UE4]クック処理にブレークを張りたい場合Commandletを使う

クック時の挙動を確かめたい時、Editorからパッケージ化している場合は違うプロセスで立ち上がってしまい処理が追いづらいのでCommandletからクック処理を起動することでブレークを張りながらデバッグができます。

# クック処理用のCommandlet

以下のような引数をUE4Editor.exeに渡すことで単体のクック処理を実行できます。

**UE4Editor.exe [対象の.uproject] -run=cook -targetplatform=[対象のプラットフォーム] -map=[対象のマップ]**

```c:Cook_command例
UE4Editor.exe D:\projects\TestProject\TestProject.uproject -run=cook -targetplatform=Windows -map=/Game/NewMap
```

targetplatformに各種プラットフォームを入れることができるので特定のプラットフォームの挙動を追うことが可能です。また、UnrealVSを入れている場合はuproject以降の引数をStartup Projectの引数入れることでデバッグ付き実行が可能です。
![2019-04-10_17h21_02.png](https://qiita-image-store.s3.amazonaws.com/0/363894/423ec717-d7d8-7b25-9e79-7611b091ae49.png)

# ブレークを貼る場所

ブレークを貼るのはCookCommandletのMainあたりからなど。
.\Engine\Source\Editor\UnrealEd\Private\Commandlets\CookCommandlet.cpp

    /* UCommandlet interface
     *****************************************************************************/
    int32 UCookCommandlet::Main(const FString& CmdLineParams)
    {
            COOK_STAT(double CookStartTime = FPlatformTime::Seconds());
            Params = CmdLineParams;
            ParseCommandLine(*Params, Tokens, Switches);


# 参考リンク
- **UnrealVS 拡張 | Unreal Engine**
http://api.unrealengine.com/JPN/Programming/Development/VisualStudioSetup/UnrealVS/

- **コンテンツのクック処理**
http://api.unrealengine.com/JPN/Engine/Deployment/Cooking/

- **How to step through cooking process on debug Mode? - UE4 AnswerHub** 
https://answers.unrealengine.com/questions/444744/how-to-step-through-cooking-process-on-debug-mode.html
過去のバージョンではAnswerHubで紹介されているNewCook関数にてブレークが可能
UIPercentDrivenInteractiveTransitionでアニメーションを連続実行する

記事の内容はこちらを参照してください。
https://mishimay.github.io/e6be076f06b3e792c3f2/
<!--




# やたいこと
  - ジェスチャに連動させて画面遷移させたい 
    - `UIViewControllerAnimatedTransitioning`, `UIPercentDrivenInteractiveTransition` 使用
  - 画面遷移のアニメーションは、1つのアニメーションが終わってから別のアニメーションを実行させたい

UIViewControllerAnimatedTransitioningとUIPercentDrivenInteractiveTransitionの実装サンプルは `UIVIew.animate` を1回使って1つのアニメーションをさせるものばかりで意図した動きにならなかったため、他の実装を探しました。

## 試したこと1: UIVIew.animateのcompletionで次のアニメーション実行

コード

```swift
            let duration = transitionDuration(using: transitionContext)
            UIView.animate(withDuration: duration / 2, delay: 0, animations: {
                toViewController.view.alpha = 0.1
            }) { (finished) in
                UIView.animate(withDuration: duration / 2, delay: 0, options: [], animations: {
                    toViewController.view.alpha = 1
                }) { (finished) in
                }
            }
```

### 結果
画面遷移には1つ目のアニメーションが使われ、画面遷移が終わってから2つめのアニメーションが開始


## 試したこと2: UIView.animateのdelayで2つめのアニメーションを遅らせる

コード

```swift
            let duration = transitionDuration(using: transitionContext)
            UIView.animate(withDuration: duration / 2, delay: 0, animations: {
                toViewController.view.alpha = 0.1
            }) { (finished) in
            }

            UIView.animate(withDuration: duration / 2, delay: duration / 2, options: [], animations: {
                    toViewController.view.alpha = 1
            }) { (finished) in
            }
```

### 結果
画面遷移開始時は1つめのアニメーションが終わった状態になっており、画面遷移のアニメーションには2つめのアニメーションが使われる


# 解決策
@kishikawakatsumi さんによるスタック・オーバーフローの回答で、アニメーションを連続指定できる `UIView.animateKeyframes` を知りました。

https://ja.stackoverflow.com/questions/38571

これを使うことで思ったとおりの動きになりました。


```swift
            UIView.animateKeyframes(withDuration: transitionDuration(using: transitionContext), delay: 0, options: [], animations: {
                UIView.addKeyframe(withRelativeStartTime: 0, relativeDuration: 0.5) {
                    toViewController.view.alpha = 0.1
                }
                UIView.addKeyframe(withRelativeStartTime: 0.5, relativeDuration: 0.5) {
                    toViewController.view.alpha = 1
                }
            })
```


# 注意点
ジェスチャの途中でUIPercentDrivenInteractiveTransitionの `finish()` を呼んでもアニメーションが連続で実行されずに最終的な状態へ直接アニメーションしました。

~~これは `update(_:)` を小刻みに呼ぶことで解決しました。
ただ `DispatchQueue.main.asyncAfter` であらかじめすべてのupdateをスケジュールすると正確な時間に実行されないのか動きがカクカクになったため、1回updateを行ったら次をスケジュールして実行、という実装に変えたらうまくいきました。~~

なぜか `UIPercentDrivenInteractiveTransition` の `.completionCurve` を指定することで解決しました。


# 環境
Swift 4.2
iOS 12.1


-->
新人エンジニア向け 処理フローに分解する手順

## 最近未経験新人の育成を始めて感じたこと

できることとできないことがはっきりと分かれていることに気が付いた。

できること

- 既存のソースコードをコピペしてきて、ちょっと書き換えればできる処理のとき。

できないこと

- コピペできる既存のソースコードがない処理のとき

## 未経験新人が苦手な部分はどこか？

つまり、言われた仕様通りのコードが書けない。
特に、未経験でオンラインとかスクールとかの「とりあえずプログラミング研修やりました」の新人には多い。
研修を受けているのだから、変数代入など、プログラムの書き方の部分で困る人はいない。
では、その新人はどこで困っているのか？

---

経験豊富なエンジニアは、プログラミングをするうえでどのように考えているのか。
まず、ユーザーの要件がプログラムになるまでにはいくつか過程がある。

1. 要件を整理する
2. 要件にあった機能を考える
3. 機能にあった処理フローを考える
4. 処理フローにあったプログラムコードを考える

つまり、要件定義→外部設計→内部設計→開発と同じである。

このような話をすると、ウォーターフォールなんか古いとか言いだす人がいるかもしれないが、アジャイルだって、スクラムだって、どのような開発方法であっても、この部分がなくなっているわけではない。
それぞれをガチガチのドキュメントにすることはなくなっただけで、各個人の頭の中では同じことが行われている。

では、経験豊富なエンジニアと、新人エンジニアの違いの大きな差は、なにか？
コードの書き方をある程度分かっているのだとすれば、「機能にあった処理フローを考える」の部分になることになる。

新人の多くは、プログラミング＝ソースコードを書く考えており、それ以外のことをおろそかにしやすい傾向にある。
それに対して、経験豊富なエンジニアは、頭の中で完結させてしまうので、新人エンジニアの手本となりにくい。

---

ここから本題である、経験豊富なエンジニアが、この「機能にあった処理フローを考える」方法は何かをまとめる。

基本的には大きな処理を段階を踏んで細かくしているだけである。具体的には、

1. 入力と出力をはっきり定義する
2. 機能を分岐のない3~4個程度の大きなフローに分解する
3. 分解したフローの入力と出力を定義する
4. 大きな処理フローを分岐のある小さい処理フローに分ける

となる。ほとんどやっていることは1番と3番・2番と4番で同じである。
巨大な機能の場合さらに3番4番のフローを何回も行い細かくしていくことになる。

---

まずは、「入力と出力をはっきり定義する」ところである。
要求されている機能の入力と出力をはっきりさせないとその先の処理は書きようがない。

例として、「スーパーのPOSレジ」で考えてみる。
客がレジで買い物をするには以下の動作が必要である。

1. 店員がバーコード（複数）を読み取る
2. 客が代金を払う
3. 店員がお釣りを払う

で、POSレジが担当するのは、合計金額を計算して、お釣りを計算するところである。

では、この部分の入力は何か？出力は何になるか？
入力になるのは、「バーコード（複数）」と「代金」である。
出力になるのは「お釣り」である。

---

次に、「機能を分岐のない3~4個程度の大きなフローに分解する」ところである。
できるだけ直列のわかりやすい単位で分解するのがおすすめである。

例の場合は

1. バーコードの読み取りを行い単品額を求めるの繰り返し
2. 合計額を計算する
3. 投入された代金をよみとりお釣り額を計算する
4. お釣りを排出する

---

次に、「分解したフローの入力と出力を定義する」ところである。
未経験の新人はここを特におろそかにしやすい。自分で分解したフローなのだから自分が一番把握しているはずである。
その入力と出力が定義できないということは、そもそもフロー自体が間違っている可能性が高い。

例の1番「バーコードの読み取りを行い単品額を求める」を考えると、入力：バーコード（一個）、出力：単品額、となる。
当然すべてのフローで定義しこれで全体の入力・出力と一致するかまで確認する。

1. バーコードの読み取りを行い単品額を求めるの繰り返し
    - 入力：バーコード（一個）
    - 出力：単品額
2. 合計額を計算する
    - 入力：単品額の集まり
    - 出力：合計金額
3. 投入された代金をよみとりお釣りを計算する
    - 入力：合計金額
    - 入力：投入された代金
    - 出力：お釣り額
4. お釣りを排出する
    - 入力：お釣り額
    - 出力：○○円札何枚
    - 出力：□□円玉何枚

入力一つで、出力が複数になる場合も、入力が複数で、出力が一つになる場合もある。

---

最後にやることは、「大きな処理フローを分岐のある小さい処理フローに分ける」である。
この段階で分岐を含む細かい処理を決めていく。
どの言語を使うかによりどのくらい細かい粒度で書くかが変える必要があるが、処理自体は変化しない。
経験豊富なエンジニアはこのレベルは無意識でやってしまっていることが多い。

例の「お釣りを排出する」の場合は、

- 入力のお釣り額が○○より大きいなら、○○円札を1枚追加、お釣り額から○○引く、の繰り返し
- 入力のお釣り額が□□より大きいなら、□□円玉を1枚追加、お釣り額から□□引く、の繰り返し

となり、ソースコードに近いものとなる。

---

## 最後に

つまり、新人が仕様を読んで、コードが書けないのは、その間にある処理フローをそもそも作れないところにある。
処理フローを考えることこそがプログラミング上達の一番の近道である。
php-master-changes 2019-02-24

今日はソースコード内の ISO-8859-8 なヘブライ文字をエスケープシーケンスに置き換える修正、標準に準拠していない sprintf() への対応コードの削除、インデントの修正、openssl のテストの修正があった！

# 2019-02-24
## petk: Replace Hebrew characters with escape sequences
- https://github.com/php/php-src/commit/6926cf356e4aaa73dab4bcab1f703edb72b1b37c
- [7.4~]
- ext/calendar で、ISO-8859-8 エンコードのヘブライ語の文字をエスケープシーケンスに置き換え
- コンパイルエラーが起きたりファイルを UTF-8 として保存しようとするとコード変わっちゃったりするので、ということらしい
- 以前に[同様の主旨の修正](https://github.com/php/php-src/commit/99fdf5916eccbd72c10cc4d84693e677996b1229)がある

## petk: Remove unused PHP_AC_BROKEN_SPRINTF and AC_ZEND_BROKEN_SPRINTF
- https://github.com/php/php-src/commit/b33fa18eabf22d79a21aa95e7fa099fad2574142
- [7.4~]
- 使われていない m4 マクロ PHP_AC_BROKEN_SPRINTF と AC_ZEND_BROKEN_SPRINTF を削除
- 元々 sprintf() が標準に準拠していない環境向けに php_sprintf()、 zend_sprintf() で差し替えるようになっていたのが、今更いらないだろうということかな

## bukka: Use spaces instead of tabs in bug 77390 test
- https://github.com/php/php-src/commit/c814b34b1dc43af47280910d2ebc44f6adc26589
- [7.2~]
- ext/openssl で、あるテストのインデントにタブが使われていたのをスペースに修正

## bukka: Print empty string in test for but 77390 just once
- https://github.com/php/php-src/commit/01c00953ff07b3b9414c446c6872b047b23afe24
- [7.2~]
- ext/openssl で、[#77390](https://bugs.php.net/bug.php?id=77390) のテストで 1 回だけ空文字列が出力されるよう修正
- なんかこのコード意図が不安になる修正だな……
- 7.4 以降では[前日に無効化するコミット](https://qiita.com/sj-i/items/4930b9975f1f2930f3cd)があった奴、この修正でアカンやろかという話みたい

## bukka: Revert "Disable bug77390.phpt"
- https://github.com/php/php-src/commit/043ce4c8a1fa6f1ee0f9e9fd236559d67c7fea77
- [7.4~]
- [前日の修正](https://qiita.com/sj-i/items/4930b9975f1f2930f3cd)をリバート
- ↑の修正でアカンかったら Win / AppVeyor でのスキップでどうすか、と[コメント](https://github.com/php/php-src/commit/139492b1ae67efe541f88f8d1f3183e40ad7636d#commitcomment-32447820)が入ってる
PythonファイルExe化ソフトPyInstallerの使い方メモ

下記ページに書いてある通りそのままです。
オプションだけ備忘録として残します。
参考:[Pyinstaller で Python スクリプトを Windows で実行可能な .exe にする](https://qiita.com/kounoike/items/128f3294362a229005d7)

    インストール
        pip install pyinstaller

    使い方
        pyinstaller.exe [python file]
        同ディレクトリのdist以下にexeファイル(他dllも)が生成される

    オプション リンク
        --onefile:dllをexeファイル一つにまとめる
        --clean:前回ファイルを削除してから実行
        --windowed:実行時windowが開かないようにする


補足
メモとった当時はpython3.6.1非対応でしたが今は3.7までサポートしています。
[reddit](https://www.reddit.com/r/Python/comments/9etu94/pyinstaller_34_has_been_released_and_it_supports/)
[PowerApps Tip's]Screen上のコントロールをいともたやすく配置する

PowerApps の画面上に配置したコントロール。右端にそろえたり、画面の中央に配置したり、がとても簡単に実施できるんですけど、ご存知ですか？
そう、まるでPowerPointのように。

存外、知らないヒトがいたのでネタにしておきます。

#配置を操る(←↑・↓→）
![メディア1.gif](https://qiita-image-store.s3.amazonaws.com/0/215892/af27932d-898a-c3b5-20b0-33660a144529.gif)

位置を操作したい対象を選択（クリック）した状態で、メニューバーの[ホーム]タブにある「配置」から表示されるメニューを選択することで、上下左右中央、自動的にピタッと移動します。
![01.PNG](https://qiita-image-store.s3.amazonaws.com/0/215892/27871e3d-e34f-a871-be26-94696f23366e.png)

中央揃えにしたい場合は、[左右中央揃え]と[上下中央揃え]ですね。

#前後を操る（前面・背面）
![メディア2.gif](https://qiita-image-store.s3.amazonaws.com/0/215892/c3dfddec-8ace-fdca-2707-45c254b11004.gif)

前面・背面は、前述「配置」の左にある「再配列」から選択します。

#補足（複数コントロール選択時）
なお、上記のイメージ後半では複数コントロール（ボタンと四角アイコン）を選択した状態で「配置メニュー」を操作しています。一目瞭然だと思うのですが、ボタンが四角アイコンの領域内で移動しています。
つまり、選択の仕方で配置操作は結果が異なる、ということです。パーワーポイントですよねー。

#まとめ
- コントロールの位置は「配置」メニューで簡単に位置移動できる
- 前面・背面は「再配置」メニューから
- コントロールの選択順序等によって「配置」メニューの結果が異なる

PowerPoint で同様の操作したことがある方はピンとくるかと思います。この便利機能、知ってると生産性が変わってくるハズなので、是非マスターしましょう。


それでは、皆さま、素晴らしい Power Platform Life を！
AndroidアニメーションでViewを操作する

## やりたいこと
画面を表示すると、説明View２秒表示し、１秒かけて透過しながら消えていく。
という動きを実装したい。

## 方法３つ
以下を使ってViewをアニメーションを実装する。

- ViewPropertyAnimator
- View Animation (anim)
- ObjectAnimator (animator)

これらを１つずつ使い同じ動作を実装する。

## ViewPropertyAnimator

特徴は、Viewに直接コードで記述できるためお手軽だ。

```kotlin
view.run {
    visibility = View.VISIBLE
    postDelayed({
        animate().alpha(0f).setDuration(1000).withEndAction { visibility = View.GONE }
    }, 2000)
}
```

`postDelayed`で２秒待機させ、`animate()`で透過をイジっていく。
`withEndAction`は言葉のとおり最後に行うアクションね。

コードだとサッと試せて楽だが、アニメーションが複雑になっていくと記述もカオスになっていくのが難点。

## View Animation (anim)

animフォルダにxmlでアニメーションを記述し、ソースで読み込む

```kotlin
view.run {
     visibility = View.VISIBLE
     val animation = AnimationUtils.loadAnimation(context, R.anim.alpha_fadeout)
     postDelayed({ startAnimation(animation) }, 2000)
 }
```

```xml:anim/alpha_fadeout.xml
<alpha
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="1000"
    android:fillAfter="true"
    android:fromAlpha="1.0"
    android:interpolator="@android:anim/decelerate_interpolator"
    android:toAlpha="0.0"
    />
```

`AnimationUtils`を使ってxmlを読み込んでいる。
xmlを作成するのは手間だが、xmlを見るとアニメーションの流れが分かりやすいし、複雑になっても混乱しない。

## ObjectAnimator (animator)

ObjectAnimatorは直接ソース内にクラスを宣言してアニメーションを記述する事も可能だが、今回はxmlで書いてみる。

```kotlin
AnimatorInflater
        .loadAnimator(context, R.animator.alpha_fadeout)
        .run {
            setTarget(view)
            addListener(object : Animator.AnimatorListener {
                override fun onAnimationRepeat(anim: Animator?) {}

                override fun onAnimationStart(anim: Animator?) {
                    view.visibility = View.VISIBLE
                }

                override fun onAnimationEnd(anim: Animator?) {
                    view.visibility = View.GONE
                }

                override fun onAnimationCancel(anim: Animator?) {}
            })
            start()
        }
```

```xml:animator/alpha_fadeout.xml
<set
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:ordering="sequentially"
    >
    <objectAnimator
        android:startOffset="2000"
        android:duration="1000"
        android:propertyName="alpha"
        android:valueTo="0f"
        />
</set>
```

`AnimatorInflater.loadAnimator`でアニメーションxmlを読み込んでいる。
また、`addListener`でアニメーション前/後にViewの表示を操作している。
listenerに関しては、もっと短く記述できる方法があるが、今回はとりあえずそのまま使う。

## 備考
自分の中でなんとなく使っていたアニメーションを記事に書き出すことで理解できた。

アニメーションを書くとき、コード(java/kotlin)で直接書く派とxmlで書く派に分かれるとはず。

コードではサクッと書けるが、複雑になると見づらい。
XMLではファイルを作るのが面倒だが、再利用できるし複雑になっても強い。

まぁ好きな方で書けばいいさー

## 参考
Animation resources  |  Android Developers https://developer.android.com/guide/topics/resources/animation-resource
自分のTIL閲覧ツールを作成しました

# TIL閲覧ツールを作成しました

## 初めに
初カキコです。
<a href="https://github.com/various3211workd/mel"><img src="https://github-link-card.s3.ap-northeast-1.amazonaws.com/various3211workd/mel.png" width="460px"></a>
## TILとは  
Today I Learning（今日学んだこと）の略。  
毎日の少しの学びを記録していく。

## 動作環境
#### Windows10 pro
完全なパスを取得するのにこだわりの技術を使用しているのでその部分を他の環境にも対応しないといけない。

## コマンドオプション

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/367377/25332319-aceb-4162-2565-6b4d9aab1579.png)

### TIL登録
私のTIL構成

```powershell

PS>tree /f
C:.
│  README.md
├─c
│  └─compile
│          README.md
├─firebase
│      README.md
├─powershell
│      import_VisualStudio_code.md
├─Rust
│  ├─json
│  │      README.md
│  ├─std_fs
│  │      README.md
│  └─termcolor
│          README.md
└─security
    ├─cdb
    │      README.md
    ├─process_hollowing
    │      README.md
    └─rp++
            README.md
```

登録するには以下のコマンドを入力する

```powershell
PS>mel init
[ o ] Init Complete
```

今いるディレクトリ下の***.mdで終わるファイルを登録することができる。

## 登録しているTILを見る
```powershell
PS>mel list
[ <3 ] Can Use Commands!!

[ 0 ] /compile/README.md
[ 1 ] /firebase/README.md
[ 2 ] /powershell/import_VisualStudio_code.md
[ 3 ] /TIL/README.md
[ 4 ] /json/README.md
[ 5 ] /std_fs/README.md
[ 6 ] /termcolor/README.md
[ 7 ] /cdb/README.md
[ 8 ] /process_hollowing/README.md
[ 9 ] /rp++/README.md
```

## TILを見る  
2パターンの使い方がある。

1. 番号を指定する  
mel listで出力された左側の数値を指定することで出力できる

```powershell
PS>mel -n 1 # 1番を指定して出力する
# firebase

## Deploy
deployするときの手順メモ

$ npm run build
$ npm run generate
$ firebase deploy

...

},
logout() {
  firebase.auth().signOut()
  .then(() => {
    this.setUser(null)
  }).catch((error) => {
    alert(error)
  })
},
```

2. pathを指定する  

```powershell
PS>mel /cdb/README.md
# CDB

## 主要コマンド一覧
'''
? - help view
'''
```

## 日々の悩み
詰まったところ。


こんなコードになってしまった。

```rust
for entry in WalkDir::new(".").into_iter().filter_map(|e| e.ok()) {
    if entry.file_name().to_string_lossy().ends_with(".md") {
      let path = PathBuf::from(String::from(entry.path().display().to_string()));
      let cwd = canonicalize(&path).unwrap();
      match cwd.into_os_string().into_string() {
        Ok(aa) => {
          // create full path
          let path_vec: Vec<&str> = aa.split("\\").collect();
          let mut index = 0;
          for p in path_vec[3..path_vec.len()].into_iter() {
            jsontree.push_str(&p);
            if index != path_vec.len() - 4 {
              jsontree.push_str("/");
            }
            index += 1;
          }
          jsontree.push_str("&");
        }
        Err(e) => {
          panic!("{:?}", e);
        }
      }
    }
  }
```
pathBufで所得した値をstringに変換するのにかなり手間取った。  
こういった値
`C:/path`
がほしいところ
`"C:/path"`
という形になってしまうことがあり、無理やり`match`にかけて結果として取れた値を使用しているのが不格好だ。
この辺りをもっと改善していきたい。


あと`aa`という変数名はやめた方がいいと思いました。

## 終わりに
* もう少しRustっぽく書けるようになりたいと思った。
* 文章に`。`が多いわね
とあるエンジニアの問題意識 2019-02-24


# レットブルを飲んで1日頑張る。これを実践しているエンジニアは多い。

成分的にはカフェイン効果だけ。コーヒーと同じ。エネルギーの先取りと枯渇の繰り返し。

多分皆、理解した上で飲んでいるのだろう。儀式。おまじない。イチローがバッターボックスに立つ前の動作といおうか。

エンジニア 仕事 <https://t.co/78b5ZXHdv4> 
# もし自分がパーティーの主催者なら。自分を呼ぶかどうか。ギリギリセーフ。もしくはギリアウト。

人当たりが良い。傾聴のスキルあり。清潔感はなくはない。名刺を持たない。様々なライラックの結果、服装や行動が奇異に見える。なかなかの凹凸。

怪物ではなく。良い珍獣でありたい。

エンジニア <https://t.co/9iGyFGexPS> 
# エンジニア はプログラミングばかりしていてモテない問題。一般的な面白い話題が出来ない。

だけど大きな問題じゃない。面白い話ができなくても別の戦略がある。人の話を聞くこと。傾聴スキルを磨く。

これはディフェンシブな戦略で成功率は比較優位。少なくとも明石家さんま的トーク戦略よりは。 <https://t.co/fDVjRLIsxf> 
# エンジニアの恋愛。合コンはそもそも難しい。恋愛テクやコミュ力を総動員しても成約率は雀の涙ほど。

競合相手は体育会系の男。彼らには子供の頃からひたすらに積み上げたコミュ力の経験値がある。同じフィールドで勝負してもなかなか勝ち目がない。

エンジニア は別戦略で戦う方が良い。 <https://t.co/fDVjRLIsxf>

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/631








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
MWC Barcelona 2019 --- hololens2周りのメモ

公式blog: [Microsoft at MWC Barcelona: Introducing Microsoft HoloLens 2](https://blogs.microsoft.com/blog/2019/02/24/microsoft-at-mwc-barcelona-introducing-microsoft-hololens-2/)
https://twitter.com/mskkpr/status/1099723734959702016

この記事はTMCNでの、MWCパブリックビューイングのYoutube Liveからと上記公式blogからの情報をもとに書かれています。
又、著者はあまりxRに詳しくなく、英語もあまり得意ではないため間違っている可能性もあります。その場合は教えていただけると嬉しいです。
**現在、疲れたのでとりあえずメモだけ公開していますが多分あとで書き直します。多分。**
[![tipmona](https://img.shields.io/badge/tipme-%40tipmona-orange.svg)](https://twitter.com/share?text=%40tipmona%20tip%20%40Cj-bc%2039)  [![monya/mona](https://img.shields.io/badge/tipme-%40monya/mona-orange.svg)](https://monya-wallet.github.io/a/?address=MBdCkYyfTsCxtm1wZ1XyKWNLFLYj8zMK3V&scheme=monacoin)  [    ![tipkotone](https://img.shields.io/badge/tipme-%40tipkotone-orange.svg)](https://twitter.com/share?text=%40tipkotone%20tip%20%40Cj-bc%2039)

---


# 基本性能系

* 解像度: 23px/degree → 47px/degree
* 視野角: 二倍に

# 虹彩認証

* 虹彩認証による`Windows hello`

# ハンドトラッキング

* ポリゴンレベルでの認識をしている（？） -- 詳しいことはわからんが、てのモデルにはメッシュが貼られていた。
* ホログラムを触るのを検知可能
* ホログラムの拡大縮小・回転・移動が可能
* 全ての指のトラッキング。デモではホログラムのキーボードを弾いていた！
* 手のひらの検知。デモでは鳥を手のひらに乗せていた



# ハンドジェスチャー

* Pintch

つまむ、引っ張る、pinch、手の平にものをのせる

# 音声認識

* Windowを見て`Follow me`と喋るとそのwindiwが自分を追従する


# UI系

* 手のひらを返す動作で球体が出現、それを押すことでパネルが出現しその中から立体が出現、それを直に押すとアプリの移動？
* `Follow`しているWindowは他のアプリに移動しても追従を続ける模様。
* **ピンチして動かすスライダー**
* **押して動かすスライダー**
* **そのまま押せるボタン**


# アイトラッキング

* ブラウザのスクロール
* Windowの指定（`Follow me`のやつ）

# ディスプレイ部分のフリップアップ

ディスプレイ部分のフリップアップ。

# Dynamics 365 Guide

https://twitter.com/mskkpr/status/1099731936023592962

* `Remote assist`と`Layout`アプリケーションがHololens2用に使用可能
* ホログラムで、実物に合わせてガイドを出す


# 提携企業(?アプリケーション等作っている会社?)

## Spatial

* 離れたところにいる人と一緒に働けるようにする
* Roomに入ると、上半身のみの相手のホログラムと半透明なボードがあり、同じ部屋にいるかのようにお互い歩き回ることができる。

# =========== **ここから下は書きかけ** ==========


#　発売関連

* 発売時期: 今年
* [preorderリンク](https://www.microsoft.com/en-us/hololens/buy)
* 日本もpreorderに含まれるが、HPは作成中とのこと

## 価格帯

* $3500
* 265リモートアシストバンドル$125/month~?(公式:`Bundles including Dynamics 365 Remote Assist start at $125/month.`)




---

# カスタマイズ
https://twitter.com/mskkpr/status/1099732300680577026

* 一例: Trimble社の、ヘルメットとの



# Azure Kinect Developer Kit (DK)

The Azure Kinect DK is a developer kit that combines our industry-leading AI sensors in a single device

3Dでの空間認識
USB-C
使用例: 病院の個室につけ、患者さんが動いたのを検知するなど（

* [preorderリンク](https://azure.microsoft.com/en-us/services/kinect-dk/)





# Azure Mixed Reality Services

# 提携企業？として出てきた企業

* Epic games: Unreal Engineでのサポート





# 

# Remote rendering

あんまわからん

https://twitter.com/mskkpr/status/1099733329962782720
読みやすいコードの書き方

初投稿になります、Khmerです。
プログラムに関する情報のメモ代わりに使う予定ですが、他の人の役に立つことがあれば幸いです。
では記事の本題へ。

## リーダブルコード
先日「[リーダブルコード](https://www.oreilly.co.jp/books/9784873115658/)」なる本がプログラマの間で有名だということを耳にし、さっそく読んでみました。この本は「読みやすい」コードの書き方について書かれています。技術面に関しては一切触れられていません。

## コードの読みやすさ
人が書いたコードは、書いた本人はわかりやすいと思っていても、他人が見るとわかりにくいということはよくあることです。さらにいうと、書いた本人ですら月日が立つと全く何が書いてあるかわからないといったことは、コードを書いたことのある人であれば一度は経験があるのではないでしょうか？コードが読みやすさは修正や追加を行う上でかなり重要です。読みやすいコードと読みにくいコード、どちらも書けるのであれば、多少時間が多くかかったとしても、前者を選んだほうが後々確実にメリットがあるというものです。この本では様々な観点から読みやすいコードの書き方について書かれていますが、そのなかで私が今後特に注意しようと思ったものをいくつか紹介します。

## 変数や関数の命名
1. 性質を具体的に表し、誤解を生まない単語を用いる。 
stop(停止)よりもkill(停止後再開不可)やpause(停止後再開可能)を、filter(条件による抽出)よりもselect(条件合致を抽出)やexclude(条件合致を除外)を用いる。
2. 変数を用いるスコープに応じて、長さを調節する。  
スコープが広い場合はその場で理解できるように、長くても良いのでわかりやすい名前をつける。逆にスワップ操作など、一画面内の数行でしか用いない関数などは必要最低限で十分である。
3. 使用する上で注意すべき情報は名前に取り入れる。  
単位や加工処理の内容など。
4. 大文字や記号に意味を含める。  
末尾のアンダースコアの有無によってローカル変数とメンバ変数を区別するなど。
  
## コメントの書き方
1. コードから読み取れない情報を必要最低限の言葉で表す。  
説明対象から読み取れる内容や、冗長な書き方は不要。
2. そのコードを書いた背景、考えなどを示す。  
定数とその値の意味や、改善の必要性など。
3. 複雑なコードには全体像の説明を行う。
4. 結果がわかりにくい関数には具体例を交えた説明を与える。  
他の動作を連想させない具体例を用いるようにする。
5. 引数の説明を行う。  
特にbool値は明確にその意味を示す。

## コードの単純化
1. ネストを深くしすぎない。  
エラーチェックなどは早い段階で行う。関数中では関数を返す(return)、ループ中では処理のスキップする(continue)、などを利用する。
2. 中間結果を表す変数を避ける。
3. 変数への書き込みを最小限に抑える。  
複数の変数の変化を考慮するのは大変である。
4. 変数のスコープを小さくする。  
グローバル変数などスコープの広い変数を使用する際はその必要性を検討すべきである。

## コードの構成
1. 下位問題(コード全体の目的とは直接的には無関係な問題)を抽出し、別の関数として実装する。  
全体が見通しやすい。テストや修正もその関数単体に対して行うことができる。下位問題は汎用コードとして別のコードに適用できる可能性もある。
2. １つのタスクの作業内容を小さくする。  
3. タスクを１つずつこなす。  
複数のタスクを同時に行うコードは読みにくい、応用しづらい。
4. 目的を満たす最小限のロジックに基づいてコードを書く。  
余分な機能はテスト作業やバグの発生源の増加などにつながる。
5. デフォルト値は初めに設定する。


## 最後に
書籍では具体例などを交え、大変わかりやすく書かれています。ページ数も２００ページと読みやすい量なので、気になった方は是非読んでみてください。
スマホでGit

# スマートフォンでGitを使ってみる

## Termuxをインストール

Termuxとは……AndroidでLinuxのようなシェルを使えるようになるすごいアプリ

[Playストア](https://play.google.com/store/apps/details?id=com.termux)からインストール

## 初期設定・Gitをインストール

```bash
$ termux-setup-storage
$ pkg update
$ pkg install git
```

## 実際に使用してみる

Githubで適当なリポジトリを作成

Git用のURLをコピー

※PC版サイトを有効にする必要あり
![github.jpg](https://qiita-image-store.s3.amazonaws.com/0/283013/f744c905-ab2d-534b-efa5-75d07786b6cb.jpeg)


```bash
$ cd /storage/shared
$ mkdir Git
$ cd Git
$ git clone https://github.com/[Username]/[Reponame].git (さっきコピーしたURL)
```

ファイルを編集する
`~/storage/shared/`以下に配置したのでTermux以外のアプリからも編集できる

```bash
$ git add -A
$ git commit -m "test commit"
$ git push
```

これでGithub側のファイルも更新されていたら成功

## おまけ

PCと同様に`~/.netrc`を記述することでGithubのログインをスキップできる

```text:.netrc
machine github.com
  login [Username]
  password [Password]
```
OpenModelicaはLinux版の方が高速

# OpenModelicaの速度比較　Win vs Linux

OpenModelicaはLinux版の方が速いことを教えてもらったため簡単に比較してみる

# 環境
PC : LifeBook WU2/C3
OS : Windows10 Home
CPU : intel core-i7-8565U 
メモリ : 16GByte デュアルチャンネル(DDR3)

WSL
Linux : "18.04.1 LTS (Bionic Beaver)"


OpenFOAM : 両環境ともにOpenModelica 1.13.2

## 比較モデル1

以下のように簡単なモデルの速度を比較する
OMShell上から計算すればCコード生成から計算結果出力までの詳しい各工程の計算時間が表示されるがOMEdit上の挙動を確認したいので
手動ストップウォッチで計測する

```test.mo
model test

end test;
```
## 比較モデル2

以下のように複雑なモデルについても比較する
Modelica.Fluid.Examples.IncompressibleFluidNetwork
![image.png](https://qiita-image-store.s3.amazonaws.com/0/244254/b531d323-4454-1abe-0927-eca28033a9d1.png)


## 結果
単位はsec

| モデル       |      Windows10 |    Linux(Ubuntu)    |
|:-----------------|------------------:|:------------------:|
| 比較モデル1     | 10.4 | 5.2 |
| 比較モデル2     | 30.6 |  24.0 |

## 所感
Linux版の方が常に5sec程度速い。
完全に推定だが、定型のコンパイル動作がありその箇所だけが速くなっているのかと思う。
確かOpenModelicaはminGWを使ってCコードをコンパイルしていると思うので、Linuxのネイティブ環境だと速くなるのは理解できる。
しかし、その後の計算はあまり変わらないためあまりLinuxを使うモチベーションにはならなかった。
特にWSL起動→OMEdit起動がとても遅く、何故か起動するだけでCPUファンがうるさいくらい回るのであまり使う気にならない。

しかし、PC環境次第でもっと差が出ると思うので速さを求める人にはオススメする。
Vue.jsでレトロゲーを作る（作りたい）

# Vue.jsでレトロゲーを作る
※構想段階
Vue.jsの勉強がてらに作成する。
Firebaseも勉強したいので混ぜたいなぁ。ハイスコア管理とか

## 前提
開発環境：

- ~~codepen (無料版)~~
- github.ioに置く
- Vue.js
- 画像はSVG
- ~~音楽はbase64でソース上に置く（codepen無料版の為）~~
- BGM/ジングル/効果音はマルチブラウザを考えてmp3で置く
- スマホ対応の為、Swipe操作/キーボード/マウスに対応予定


## codepen
やめます。codepenサーバがbase64変換した物資に耐えられないようです。
github.ioあたりを検討。
(そもそも、開発環境をWebサービスに取るのが非常識だったんですね。Vue.js DevToolsも使えないし)
nodejs, yarn, Parceljs, webpackなどの環境周りや学習コストが嵩む。前提崩壊中。。

## github.io
ここにおく。

## 設計
Vue.jsやWebComponentがよくわかっていない状態ですが、体当たりで設計。

```text
・RoundMapデータを裏で持ってそれの更新で画面側と連携する
・仕様として同一座標にはひとつしかオブジェクトはない
・壁以外は動くので、一つ一つの要素をSVGのComponentとして
 ・座標
 ・状態（出口に入ったか、鎖の長さなど）
 を持たせる。
```

## ここにソースを貼る

```javascript
```
[Python3]アルファベットを数字に対応付ける

プログラマ脳を鍛える数学パズルを解いていて，覆面算の問題で手間取ったのでメモします．

模範解答はrubyで以下のように書いていました．

```ruby:ruby
e = expression.tr(chars.join(), num.join())
```

pythonでは以下のように書きます．

```python:python
e = expression.translate(str.maketrans(''.join(chars), ''.join(map(str, num))))
```

str.maketrans()はstr.translate()に使える変換テーブルを返します．引数を2つ取る場合，同じ長さの文字列でなければなりません．
str.translate()は与えられた変換テーブルに基づいて文字列を構成する各文字をマッピングし，マッピング後の文字列のコピーを返します．


# サンプル

```python:sample.py
string = 'helloworld'
chars = list(set(list(string)))
num = [i for i in range(len(chars))]
print(''.join(chars), ''.join(map(str, num)))
print(string.translate(str.maketrans(''.join(chars), ''.join(map(str, num)))))
```

```
redlwoh 0123456
6133545032
```

文字列helloworldの重複なしの文字をsetを使って取り出してますが，順序は保存されないので実行するたびに得られる数字が変わることに注意です．
Swift4でUIImageの反転


##実装コード

```swift:UIImage+flip.swift
import UIKit

extension UIImage {

    let scale = 1.0

    //上下反転
    func flipVertical() -> UIImage {
        UIGraphicsBeginImageContextWithOptions(size, false, scale)
        let imageRef = self.cgImage
        let context = UIGraphicsGetCurrentContext()
        context?.translateBy(x: 0, y:  0)
        context?.scaleBy(x: 1.0, y: 1.0)
        context?.draw(imageRef!, in: CGRect(x: 0, y: 0, width: size.width, height: size.height))
        let flipHorizontalImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return flipHorizontalImage!
    }

    //左右反転
    func flipHorizontal() -> UIImage {
        UIGraphicsBeginImageContextWithOptions(size, false, scale)
        let imageRef = self.cgImage
        let context = UIGraphicsGetCurrentContext()
        context?.translateBy(x: size.width, y:  size.height)
        context?.scaleBy(x: -1.0, y: -1.0)
        context?.draw(imageRef!, in: CGRect(x: 0, y: 0, width: size.width, height: size.height))
        let flipHorizontalImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return flipHorizontalImage!
    } 

}
```

##使用方法

extensionで実装していますので以下のように呼び出せます。

```swift
let flipImage = image.flipVertical()
let flipImage = image.flipHorizontal()
```