OmniAICreator/Qiita-1.07M huggingface dataset:
Docker Toolbox on Windows のDLリンクが見つからず少し焦った話

# 経緯
Windows8 で docker 使いたかったので、Docker Toolbox on Windows の[公式手順書](https://docs.docker.com/toolbox/toolbox_install_windows/)にアクセス。

![キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322115/ce499771-a188-6c36-888f-ae6eea1f20ce.jpeg)
[このページ](https://docs.docker.com/toolbox/)に行けとあるのでアクセス。

![キャプチャ2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322115/44930f58-371d-f6df-fb9a-2295c54f163f.jpeg)
ところが、DLリンクがどこにもない…

# 解決

良く見たら[ここのページ](https://github.com/docker/toolbox/releases)に行けば良いと書いてある
![キャプチャ3.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322115/0019cd95-f085-c15b-03f4-10f5749d2a87.jpeg)

アクセスする。
![キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322115/ba748b76-92f6-4ba8-b98a-9ce1a90c42c9.jpeg)
最新版バージョンの、exeファイルかpkgファイルをDLすればOK！
まあ手順書よく読めよって話なんですが、初学者の人とか英語苦手な人は詰まっちゃうだろうなーと思ったのでメモ。
[GAS] [clasp] claspでGAS管理した時のメモ

# GASって
Google Apps Scriptの略で、Googleが提供しているサーバーサイドで実行できるもの。
スプレッドシートと紐付けて置いたり、スタンドアロンとして独立させたりできる。
GoogleのPlatform上で実行するので、G SuiteやGCP環境との連携がほんと楽。

# 何のメモ？
GASのコードをGithubやbitbucketなどでソール管理したいってなった時に
claspを使ってローカル環境で開発して、デプロイできたり、Githubなどでも管理していて
その時に参考にしたリンクやcommandなどを載せておく。

# どんな時に役立つ？
そう言えば、この時どうするんだっけ？見ていたリンクどこだ！ってなった時に。

# よく使うcommand

| command  | 内容       |
|:------------:|:-------------------|
| clasp create            | GASプロジェクトの作成 （作成されるのはスタンドアロン）       |
| clasp pull              | GASプロジェクトからコードをローカル環境にpull |
| clasp push              | ローカル環境のコードをGASプロジェクトにpush  |
| clasp clone <scriptId>  | scriptIdのGASプロジェクトをローカル環境に持ってくる |
| clasp versions          | GASプロジェクトのバージョン一覧を表示　　　　|
| clasp version 'message' | messageを付けてバージョン作成           |
| clasp deplay [version]  | versionをGASプロジェクトにdeploy        |
※scriptIdの見方：File > Project properties > Info.
※バージョンをデプロイする時の実行順序： push ➡︎ version ➡︎ deploy

# リンク集
* 公式
 * https://developers.google.com/apps-script/guides/clasp
* Github
 * https://github.com/google/clasp
* 最初ここ見るとよき
 * https://qiita.com/rf_p/items/7492375ddd684ba734f8
 * https://codelabs.developers.google.com/codelabs/clasp/#0

# 困った時
## proxy配下ではログインできない問題
(最近のバージョンでは解消されている問題なので特にしなくても良いけど記録だけ)
https://github.com/axios/axios/issues/925
➡︎解決方法：https://www.npmjs.com/package/axios-proxy-fix

* axios-proxy-fixをインストール
* clasp内の「/usr/local/lib/node_modules/@google/clasp/node_modules/axios/」をrename
* インストールした「/usr/local/lib/node_modules/@google/clasp/node_modules/axios-proxy-fix」を「/usr/local/lib/node_modules/@google/clasp/node_modules/axios/」にrenameして、フォルダごとreplace
日付データの取り出し方あれこれ

###日付データの取り出し方
```
%Y  年4桁
%m  月2桁
%d  日2桁
%H  時2桁
%M  分2桁
%S  秒2桁
%X  時:分:秒 (%H:%M:%S と同じ)
%w  曜日番号。0(日曜日) 〜 6(土曜日)
```

###使い方
```
require "date"

day = Date.today
str = day.strftime("%Y-%m-%d %H:%M:%S")
puts str
# 2017-04-26 00:00:00
# Dateは日付情報までしか保持していないので、時刻部分は0で表示される。
```

参照：https://qiita.com/prgseek/items/c0fc2ffc8e1736348486#
OculusGo/Questの開発環境を整える方法 2019年5月版

2019/06/06追記：OculusQuestも同じ開発環境で開発できます。
2019/06/09追記：現在はこの手順ではうまくいかない

環境: Windows10 / Unity 2018.3.10f1 (64-bit)

注意：2019年6月9日現在、この手順ではうまくいかない
------------------------------

2019年6月9日にこの手順で再インストールしてみましたが、Build And Run すると以下エラーが出て実行できませんでした。

```
FormatException: Input string was not in a correct format.
...
System.Convert.ToInt32 (System.String value) (at <d7ac571ca2d04b2f981d0d886fa067cf>:0)
UnityEditor.Android.AndroidDeviceInfo.get_SDKVersion () (at <df7ba4d130594d168eec372b930522d4>:0)
```

以下手順は行わずに、https://qiita.com/Ichitar0/items/42efd6d153bbd175de1c を参考にUnity2019をインストールすることで実行できる環境を整えることができました。


手順
------------------------------

Oculusの開発者登録をして、OculusGoを 開発者モードにしておく
http://mogamitsuchikawa.hatenablog.jp/entry/2018/05/12/123422

OculusGOのADBドライバーを以下URLから取得してインストールしておく
https://developer.oculus.com/downloads/package/oculus-go-adb-drivers/

OculusGoの開発に使えるバージョンを確認
https://developer.oculus.com/documentation/unity/latest/concepts/unity-req/

OculusGoの開発に使えるUnity(2019/05時点では2018.3.10f1)をダウンロードしてインストール
https://unity3d.com/jp/get-unity/download/archive
　　インストール時に"Android"にチェックを入れる

※Unity 2018.3.x 以降は Unity に OpenJDK が同梱されるのでJDKを別途ダウンロードする必要はない

AndroidSDKの「Command line tools only」をダウンロードして適当なフォルダに解凍
https://developer.android.com/studio/
　　> この SDK Tools ですが、中身はほぼ空っぽで中に入っているsdkmanagerコマンドを使って
　　> SDKをセットアップする必要があります。
　　> が、Unity を使うのであればその操作は不要です。

Unityを起動して適当なプロジェクトを作成

Edit > Preferences > External Tools
　　Android SDK: 解凍して出来た"tools"の一つ上のパスを指定
　　UseEmbedded JDK: チェックON

File > BuildSetting
　　Androidに設定
　　SwitchPlatformボタンを押す

File > BuildSetting > Player Settings
　　OtherSettings
　　　　PackageName: プロジェクト名を適当に設定
　　　　MinimumApiLevel: Android7.0 (Lv24)
　　XR Setting
　　　　VirtualRealitySupotted:ON
　　　　VisualRealitySKDs:
　　　　　　Oculusを追加

OculusGoをUSB接続してOculusGoをかぶる
USBデバッグ許可のダイアログが表示されていれば許可を選択

File > Build And Run
　　apkファイル名は適当に指定
　　AndroidSDKが足りないというダイアログが何度か出るので、Update Android SDK を選択

OculusGoをかぶって、地平線だけが表示されるアプリが実行できていることを確認

以上。

参考URL
------------------------------

https://kurokuru.hatenablog.com/entry/2018/12/25/011613
http://mogamitsuchikawa.hatenablog.jp/entry/2018/05/10/225040
Leetcode #36: Valid Sudoku

```swift
func isValidSudoku(_ board: [[Character]]) -> Bool {
    for i in 0..<9 {
        var set = Set<Character>()
        for j in 0..<9 {
            if board[i][j] != "." {
                if set.contains(board[i][j]) {
                    return false
                } else {
                    set.insert(board[i][j])
                }
            }
        }
    }
    for i in 0..<9 {
        var set = Set<Character>()
        for j in 0..<9 {
            if board[j][i] != "." {
                if set.contains(board[j][i]) {
                    return false
                } else {
                    set.insert(board[j][i])
                }
            }
        }
    }
    for i in stride(from: 0, through: 6, by: 3) {
        for j in stride(from: 0, through: 6, by: 3) {
            var set = Set<Character>()
            for x in 0..<3 {
                for y in 0..<3 {
                    if board[i+x][j+y] != "." {
                        if set.contains(board[i+x][j+y]) {
                            return false
                        } else {
                            set.insert(board[i+x][j+y])
                        }
                    }
                }
            }
        }
    }
    return true
}
```
Python3 初心者　引数

# 位置引数
位置引数とは仮引数の先頭から処理をすることをいう。

```py
def sport(soccer, baseball, basketball):
    return {'soccer': soccer,  'baseball': baseball,  'basketball': basketball}

sport('James', 'Jones', 'Pogba')

{'soccer': 'James', 'baseball': 'Jones', 'basketball': 'Pogba'}
```

ここではsoccerにはJamesという文字が出てくる。そのように全ての引数がそのようにインプットされます。だけどこれは一つ一つの値を順番を覚える必要があるため大変ですよね？それを改善するためにキーワード引数があります！

# キーワード引数
（これから示していく引数の使い方は先ほど使用したsport関数をそのまま使います。

```py
sport(baseball='Jones', soccer='James', basketball='Pogba')

{'soccer': 'James', 'baseball': 'Jones', 'basketball': 'Pogba'}
```

このようにすれば全ての引数をわかる形で見ることができる。

# デフォルト引数
例えば'Pogba'はバスケの選手としては外せないけどサッカー選手と野球選手はたくさんいるから変更したいけどどうしようの時に使います。

```py
def sport(soccer, baseball, basketball='Pogba'):
    return {'soccer': soccer, 'baseball': baseball, 'basketball': basketball}

sport('Kagawa', 'Honda')
{'baseball': 'Honda', 'soccer': 'Kagawa', 'basketball': 'Pogba'}
```

もしデフォルト値を変更したい時は順番通りにやれば変更が可能になります。

# *による位置引数によるタプル
文字の前に＊を入れるとそこに書いている文字列をタプル化してくれる。

```py
def p_args(*args):
    print('Positional argument:', args)

p_args('A', 'B', 'C')
Positional argument: ('A', 'B', 'C')
#タプル化する前に引数を入れるとどうなるのか
def p_args_change(a, b, *args):
    print('I like:', a)
    print('I like:', b)
    print('I do not like:', args)

p_args_change('pizza', 'sushi', 'vagitable', 'banana', 'apple')
#　実行結果
I like: pizza
I like: sushi
I do not like: ('vagitable', 'banana', 'apple')
```

これと同様に辞書がある。辞書化するのはタプルと同じようにすればいいのだ。だが引数には**という風に変更しよう。そうすれば簡単にできる。
UnityでVR時にルームスケールでカメラが動くのを止めたい・3DoFにしたい

#はじめに
カメラの制御は基本的に切れないので、親オブジェクトで、
カメラの座標や回転を打ち消して無理やり止めるしか無い

**...なんてことはない。**
(昔はそうだったのかもしれない？)

#カメラ制御を切る(0DoF)
位置追従を切る。ただし最初に一瞬追従が働いて上書きされるので注意。
https://docs.unity3d.com/ScriptReference/XR.XRDevice.DisableAutoXRCameraTracking.html

```cs
XRDevice.DisableAutoXRCameraTracking(GetComponent<Camera>(), false);
transform.localPosition = Vector3.zero;
transform.localRotation = Quaternion.identity;
```

#ルーム位置制御のみを切る(3DoF)
360度動画向けに、頭の位置追従を切る機能がある。
https://docs.unity3d.com/ScriptReference/XR.InputTracking-disablePositionalTracking.html

```cs
InputTracking.disablePositionalTracking = true;
transform.localPosition = Vector3.zero;
transform.localRotation = Quaternion.identity;
```

#位置や回転だけほしい
TrackedPoseDriverという標準のスクリプトを使えば、任意のデバイスの回転・位置、あるいはそのどちらかだけ取れる。
なおUnity2019ではXR.LegacyInputHelpersに入っているらしい。

スクリプトの場合は以下のようにできる。

```cs
transform.localPosition = InputTracking.GetLocalPosition(XRNode.Head);
transform.localRotation = InputTracking.GetLocalRotation(XRNode.Head);
```

**注意: カメラ制御を切って、スクリプトからHMDの回転を取得してカメラを制御することはおすすめしない。**
**遅延により微妙に気持ち悪くなる。**

#参考文献
[Unity] VRのカメラトラッキングを切る
https://qiita.com/Urad/items/f6ea27682c3db86a2c04

Unity標準のVR機能（UnityEngine.XR）メモ
https://framesynthesis.jp/tech/unity/xr/
VBSからPowerShellへ　(2)エラー処理（例外処理） 

##try-catchで置き換える

以下のような、VBSでよく見るエラーが発生しても処理続行の形式は、

```
' エラー発生でも処理続行
On Error Resume Next

・・・
（処理A）
・・・

' 正常であれば「0」、それ以外はエラー
If Err.Number <> 0 Then
　・・・
　（処理B）
　・・・
End If
```

Powershellに変換する場合、JavaやC++のように例外処理のtry-catch構文で置き換えることができる。

```
# 例外が発生したら処理を終了
$ErrorActionPreference="Stop"

try {
　# 例外が発生する可能性のある処理
　・・・
　（処理A）
　・・・
} catch {
　# 例外が発生したときに行う処理
　・・・
　（処理B）
　・・・
} finally {
　# 例外が発生してもしなくても行う処理
　# finally {・・・}は必要なければ省略可能
　・・・
}
```

##ContinueとStopの違いに注意

なお、上記の「Stop」は、デフォルトは「例外が発生しても処理を続行」の「Continue」であるが、これは通常は使用しない。

なぜなら、「Continue」を指定した場合は、**スクリプトの実行において致命的な例外が発生した時しかcatchできない**が、「例外が発生したら処理終了」の「Stop」を指定した場合、何か例外が発生するとcatch {・・・}の処理が実行されるので、そうする方が無難なため。

・参考にさせていただいたページ
PowerShell例外処理
[http://capm-network.com/?tag=PowerShell%E4%BE%8B%E5%A4%96%E5%87%A6%E7%90%86]
AWS Amazon LinuxサーバにMySQLをインストールした際に詰まった箇所の備忘録

# はじめに
AWSのAmazon Linux 2にMySQL5.7をインストールしようとした際に詰まった（？）箇所が何点かあったので備忘録を。詰まった内容は以下の通りです。

### 行おうとした作業
1. AWSのVPC上に構築した仮想サーバにMySQLをダウンロード＋インストール
2. インストールしたMySQLにrootユーザでログインし、DBの初期設定を行う

### 発生した問題
1.デフォルトで入っているMariaDBとの競合でMySQLがインストールできない
2.MySQL 5.7のrootユーザに初期パスワードが設定されており、ログインできない

※本記事執筆時点(2019/05/11)での環境の内容になります。

# 1. MariaDBとの競合
Amazon Linux 2にはデフォルトでMySQLの後継となるMariaDBというオープンソースのDBソフトがインストールされており、私の環境ではMySQLのインストールに失敗していました。
以下の手順でMariaDBをアンインストール→MySQLをインストールで解決しました。

```
# MariaDBのアンインストール
$ sudo yum remove mariadb-libs

# MySQLをダウンロード + インストール
$ sudo yum localinstall http://dev.mysql.com/get/mysql57-community-release-el7-7.noarch.rpm
$ sudo yum -y install mysql-community-server
```

（とはいえ、WordPress用のDBなのでMariaDBのままでも良かったのかも・・・）



# 2. MySQL 5.7 rootユーザの初期パスワード
MySQL 5.7では初回起動時(systemctl start mysqldのタイミング？)でrootにランダムな初期パスワードが生成されるらしく、このパスワードが分からないためログインに失敗するという事態になりました。
これを解決するためにはMySQLのログファイルから初期パスワードを確認する必要があります。MySQLは/var/log/mysqld.log になります。ログファイル内から「temporary password」という文字列を検索し、付与されたrootユーザのパスワードを調べます。

```
# MySQLのログファイル内からrootユーザーに付与されたパスワードを検索
sudo cat /var/log/mysqld.log | grep 'temporary password'
[Note] A temporary password is generated for root@localhost: XXXXXX

#上記の「XXXXXX」の部分が初期パスワード
```

なお、MySQLのログファイルなので初回起動から時間が流れると、初期パスワードを付与した上記ログが無くなってしまうので、初回起動の操作とセットですぐ行うべき（というか普通そうするハズ）。

### 参考文献
[第10回　yum, rpmインストールにおけるMySQL 5.6とMySQL 5.7の違い](http://gihyo.jp/dev/serial/01/mysql-road-construction-news/0010)
[書籍：Amazon Web Services 基礎からのネットワーク&サーバー構築](https://www.amazon.co.jp/Amazon-Web-Services-基礎からのネットワーク-サーバー構築/dp/4822237443/ref=asc_df_4822237443/?tag=jpgo-22&linkCode=df0&hvadid=295686767484&hvpos=1o2&hvnetw=g&hvrand=9423457953838901833&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009308&hvtargid=pla-524383772630&psc=1&th=1&psc=1)
相互啓発AI（シンギュラリティを目指した空想アルゴリズムその1）

　この記事ではpython + TensorFlow + Keras +αで人工知能のアルゴリズムについて書いておりますが、実現できていないアイディアベースのものを書いています。
　今何かを解決したい人向きではないのでご了承ください。

　逆に今人工知能を研究してて今後のテーマを探している人は読んでみて情報提供か研究テーマにしてもらえると嬉しいです。

　Python + TensorFlow + Keras でディープラーニングを勉強しているのですが、簡単に試せてとても面白いと思います。

　ブロックのように層や関数を組み合わせて学習させて精度を確認して、ハイパーパラーメータ設定を調整するという流れが簡単にできることに感心します。

　ここまでできたら、強化学習でハイパーパラメーター設定もできてしまうんじゃないか？とも思います。

　ディープラーニングを実行するPythonコードとは別に、強化学習を実行するPythonコードを用意して、ディープラーニングを実行した後の精度によって、層の追加や関数の変更を行う。そうすれば、最適化された学習モデルがAIによって実現されるのではないでしょうか。

　人の脳も一つの部分のモジュールでできているわけではなく視床下部、偏桃体、海馬等複数のモジュールで成り立っています。AIも今後強いAIになっていく過程では複数のモジュールの組み合わせが必要になってくるのではないでしょうか。

　そしてそれはPythonで別の.pyモジュールを呼び出すというものではなく、別のプログラムを実行して、結果を参照し、次の行動を起こすというものになるのではないでしょうか。

　PythonでPythonを実行する方法などは普通に検索しても出てきませんが、RPAやⅭ言語など他の仕組みやプログラミングを介してでもできないものでしょうか。他のプログラミングを実行さえできれば、後はアルゴリズムとしては組み合わせでできると思います。

　下記の2017年のtechrunchの記事などは人工知能が人工知能プログラミングをするという壮大なことを書いているが、そんな大きな話ではなく、まずは一つのプログラムが別のプログラムを実行して、その結果によってテキスト編集するように定型的なコードを追加したり編集するという簡単（？）なことでもできないでしょうか。
https://jp.techcrunch.com/2017/01/20/20170119ai-software-is-figuring-out-how-to-best-humans-at-designing-new-ai-software/

　ただ、一度これが実現できるようになると指数関数的に人工知能は進化するかもしれないですね。それこそ複数モジュールが相互に啓発し始めることができるかもしれません。

　Pythonで他のPythonを実行したり、結果の文字列を読み込めたり、コードの文字列をインサートしたりする技術がないものでしょうか。情報などあればお教えください。よろしくお願いします。
xfs_freezeコマンドの使い方

#1 xfs_freezeコマンドとは?
XFSファイルシステムへのアクセスを中断もしくは再開させるコマンドです。
XFSファイルシステムを作成したあと、スナップショットを作成するため、
ファイルシステムへのアクセスを一時的に中断したい場合に使用するコマンドです。
なお、xfsファイルシステム自体は、スナップショットの機能はありません。


#2 検証環境
VMware Workstation 14 Player上の仮想マシンを使いました。
仮想マシンは、「最小限のインストール」->「開発ツール」を選択して作成しました。

```console:OS版数
[root@server ~]# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)

[root@server ~]# uname -r
3.10.0-693.el7.x86_64
```

```console:コマンド版数
[root@server ~]# xfs_freeze -V
xfs_freeze version 4.5.0
```

#3 オプション一覧

```
[root@server ~]# xfs_freeze
Usage: xfs_freeze [-V] [-f | -u] <mountpoint>
```


#4 事前準備(テスト用のXFSファイルシステム作成)
練習用にxfsファイルシステムを作成します。
まず、1Gのファイルを作成します。
なお、fallocateコマンドの使い方は、[ここ(すぐ忘れてしまう、仕事で使う技)](https://qiita.com/hana_shin/items/53c3c78525c9c758ae7c)を参照してください。

```console:ファイルの作成
[root@server ~]# pwd
/root
[root@server ~]# fallocate -l 1G disk.img
[root@server ~]# ls -l disk.img
-rw-r--r--. 1 root root 1073741824  5月 11 19:35 disk.img
```

作成したファイルをループバックデバイスとして登録します。
losetupコマンドの使い方は、[ここ(losetupコマンドの使い方)](https://qiita.com/hana_shin/items/90b3c6fb54b59ebba076)を参照してください。

```console:ループバックデバイスの登録
[root@server ~]# losetup -f /root/disk.img
[root@server ~]# losetup -l
NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE
/dev/loop0         0      0         0  0 /root/disk.img
```

ループバックデバイスに対してxfsファイルシステムを作成します。

```console:ファイルシステム作成
[root@server ~]# mkfs.xfs /dev/loop0
meta-data=/dev/loop0             isize=512    agcount=4, agsize=65536 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=262144, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
```

```console:マウント
[root@server ~]# mkdir /mnt
[root@server ~]# mount -o loop /dev/loop0 /mnt
```

```console:ファイルシステムの確認
[root@server ~]# df -ht xfs
ファイルシス   サイズ  使用  残り 使用% マウント位置
/dev/sda3         18G   15G  3.9G   79% /
/dev/sda1       1014M  174M  841M   18% /boot
/dev/loop1      1014M   33M  982M    4% /mnt
```

#5 実行例
作成したファイルシステムへのアクセス中断(-f)、再開(-u)を実行してみます。
まず、xfsファイルシステムへのアクセスを中断してみます。

```console:ターミナル1(アクセス中断)
[root@server ~]# xfs_freeze -f /mnt
```

もう1つターミナルを開きます。
touchコマンドを使って、作成したファイルシステムにファイルを作成してみます。
作成したファイルシステムへのアクセスが中断されているので、
touchコマンドが復帰してきません。

```console:ターミナル2
[root@server ~]# time touch /mnt/test.dat
```

xfsファイルシステムへのアクセス中断を解除します。

```console:ターミナル1(アクセス中断の解除)
[root@server ~]# xfs_freeze -u /mnt
```

アクセス中断を解除すると、touchコマンドが復帰してきます。
touchコマンド復帰まで、約2秒かかっていることがわかります。

```console:ターミナル2
[root@server ~]# time touch /mnt/test.dat

real    0m2.168s
user    0m0.000s
sys     0m0.001s
```

#Z 参考情報
[今から始めるRHEL 7 第2回 標準ファイルシステムとなったXFS](http://www.intellilink.co.jp/article/column/oss-rh02.html)
CLR20r3の追跡は素直に対象アプリをildasmで逆アセンブラすればいいわけじゃなかった

#この記事の趣旨
.NETFrameworkを使用したWindowsアプリケーションで発生した原因不明のエラー(CLR20r3)を追うのに、イベントビュアーの情報を頼りに、ildasmを活用して解決したよ、というお話

なのだけれども、コレが一筋縄では行かなかったので記録として残しておこう、というのが趣旨

##参考記事
イベントビュアーのログとildasmの基本的な使い方は、とても素敵な記事があるのでそちらを参照して欲しい

[CLR20r3と格闘 - なんとかする](http://blog-url.hatenablog.jp/entry/CLR20r3)

[.NETプログラム例外落ちイベント(CLR20r3)を読み取る - DD開発ROOM](http://dd-kaihatsu-room.blogspot.com/2012/02/netclr20r3.html)

ildasmの使い方とか、ログのどこを見れば良いかは大体この記事を参考にした


#今回のお題
```
発生元
MyApp1

要約
動作が停止しました

日付
‎2019/‎01/01 00:00

状態
報告されていません

説明
障害が発生しているアプリケーションのパス:	C:\***\MyApp1.exe

問題の署名
問題イベント名:	CLR20r3
問題の署名 01:	MyApp1.exe
問題の署名 02:	1.0.0.0
問題の署名 03:	5c99dc4b
問題の署名 04:	mscorlib
問題の署名 05:	4.7.3260.0
問題の署名 06:	5bb7bcb6
問題の署名 07:	3d05
問題の署名 08:	8
問題の署名 09:	System.ObjectDisposedException
OS バージョン:	10.0.17134.2.0.0.256.161
ロケール ID:	1041
追加情報 1:	2f26
追加情報 2:	2f26b8a453c9e4c8bc3727ee4d01ee95
追加情報 3:	8359
追加情報 4:	835918b60be548152332a262dd9aeb1d

問題の説明に役立つファイル
WERInternalMetadata.xml
```

#どこで引っかかったか？

MyApp1.exeの中を見て「問題の署名07」にある”3d05”がない！
と（心の中で）騒いでいたわけなのだ

結局
・mscorlib.dllをildasmで覗いて、問題が起きているメソッドを発見
・対象のクラスのコードが公開されていたのでだいたい原因を把握
・対象のクラスの使い方を見直して修正完了！
となった

#まとめ
イベントビュアーの情報から、実際にildasmで逆アセンブルするのは「問題の署名04」に出ているexeなりdllを対象としなければいけない

「**上から順番に、情報を解決していく**」ということが大切
当たり前といえば当たり前のことだが...
Eclipseプラグインしたのにインしたものが使えない

Eclipseマーケットでプラグインしたのに使えない！という状況に陥ったので備忘録。

結論だけ言うと**再起動**で解決です。

今回はEclipseの再起動なので上部タグのファイル→再開でOK。
Angular CLI でワークスペース作成後にやること

# prettierの設定ファイルの作成
```
touch src/prettierrc.json
```
```
{
  "singleQuote": true,
  "trailingComma": "all",
  "arrowParens": "always"
}
```

# Font Awesome を install
方法はいくつかあるが、Font Awesome公式ドキュメントのやり方で
https://fontawesome.com/how-to-use/on-the-web/using-with/angular

```
yarn add @fortawesome/fontawesome-svg-core @fortawesome/free-solid-svg-icons @fortawesome/angular-fontawesome
```

install後、src/app.module.ts のimportsにFontAwesomeModuleを追加

# normalize.cssをinstall
```
yarn add normalize.css
```
angular.jsonのprojects.[project name].architect.build.options.stylesにyarn addしたnormalize.cssを追加

```
"styles": [
  "src/styles.scss",
  "./node_modules/normalize.css/normalize.css"
],
```

# Webフォントの追加
最初はとりあえずNoto Sans JPを追加。
src/index.htmlのheadに追記

```
<link href="https://fonts.googleapis.com/css?family=Noto+Sans+JP" rel="stylesheet">
```

src/style.scssでfont-familyの設定

```
html,
body {
  font-family: 'Noto Sans Jp';
}
```
Leetcode #31: Next Permutation

First try failed at the case like [2,2,7,5,4,3,2,2,1]

```swift
func nextPermutation(_ nums: inout [Int]) {
    var index = 0
    for i in stride(from: nums.count-1, through: 1, by: -1) {
        if nums[i] > nums[i-1] {
            index = i
            break
        }
    }
    if index == 0 {
        nums = nums.sorted()
    } else {
        var tmp = nums.count - 1
        for i in stride(from: index + 1, to: nums.count, by: 1) {
            if nums[i] <= nums[index-1] {
                tmp = i-1
                break
            }
        }
        nums.swapAt(index-1, tmp)
        nums = nums[..<index] + nums[index...].sorted()
    }
}
```
STemWinの導入方法

[STM32F769lDisovery](https://www.st.com/ja/evaluation-tools/32f769idiscovery.html)のLCDを表示するMiddlewareであるSTemWinの導入時に躓いたので導入方法の備忘録です。

#※CubeMXにより自動的に生成されるようになったようです。
よってこの作業は必要なくなりました!

#動作環境
・Windows10 Home 64bit
・CubeIDE1.0.0
・STM32F769l Discovery
・STM32 HAL F7 V1.15.0

>おそらくEclipseベースのSW4やAc6についても同様に出来ると思います。

#導入方法
####1.CubeMX上での設定
Middleware>GRAPHICSのGraphics FrameworkからSTemWinを選択し、DisplayInterfaceを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283010/669f1985-a0dd-eac3-7ada-10fe9635bd81.png)
そしてPlatformSettingsやParameter Settingsなど各種設定を済ませて、自動生成をします。

>動作するために必要なperipheral機能はまだ未確認です。。とりあえずDiscoveryのデフォルトでプロジェクトを生成しました。

この時点でビルドをしても、たくさんのLCD表示系の関数がundefinedというエラーが吐かれると思います。
####2.静的ライブラリのコピー
undefinedエラーですが、ソースファイルがないことに気づくでしょう。
マニュアルやほかの人のブログをしっかりとみている人はわかると思いますが、STemWinは動的ライブラリ(.cや.h)ではなく、静的ライブラリ(.oや.a)で構成されています。
そして、なぜかCubeMXで自動で配置、リンクしてくれないため、自分で配置、リンクしなければなりません。
STM32Cube_FW_F7_V1.15.0\Middlewares\ST\STemWin\Lib　内にあります。
たくさん用意されていますね。

![スクリーンショット (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283010/0c8406a0-827b-0faf-27c5-1a4ba0704645.png)

>The library is compiled for CM4 and CM7 cores:
• With and without OS support.
• With size and time optimization
• Using ABGR and ARGB format
• The FPU is enabled.

とSTさんのマニュアルには書いてあります。
CMxのxがCoretxMの何シリーズか、OSとついているのはFreeRTOSで動かす用、ARGBはARGBを使用するかどうか、otとついてるのは高速化の最適化がされているようです。(未検証)
その中の自分の環境にあったものをプロジェクトに設置します。
どこにするかというと、プロジェクトのMiddleware/ST/STemWinにLibというフォルダを作成、その中です。
そして、設置した後.aファイルの頭に写真のようにlibを付けてください。(これが重要です。)
![スクリーンショット (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283010/b6ad4a1d-ecaa-9aed-5cdc-56d4f616f6f1.png)

####3.リンクさせる
ここが1番詰まりました
結論から言うと、プロジェクトのプロパティから、C/C++ビルドの設定のMCU G++ Linkerのライブラリーを設定します。まずは、下の検索ライブラリーパスで、2で設置したファイルのパスを設定します。
そのあと上のライブラリーの欄に2で設置したファイルの「lib」と「.a」を *なくした* ファイル名を設定してください。
libがついてたり、.aがついてたりすると、コンパイルが通りません。
また、2で語頭に追加した「lib」がファイル名に記載されてなかった場合もコンパイルに失敗します。
これで僕は2日くらい悩みました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283010/a52c536a-270d-0396-6aee-613ea1044e15.png)

####4.おわり
あとはプログラムをかいて動かすだけですよ。(出来てない


#おわりに
ということで雑ですが導入方法だけ書きました。
進捗があり次第、使い方についても少しづつ書いていきたいと思っています。





#参考
・[Getting Startマニュアル](https://www.st.com/resource/en/application_note/dm00089670.pdf)
Three.jsで超簡単にカスタムPostProcessing

#概要
絶賛開発中のThree.jsラッパーライブラリ[ore-three](https://github.com/ukonpower/ore-three-ts)に組み込みで作ったPostProcessing機能が結構気に入ったので、単体で公開しました。複数のポストプロセスをかけることも可能です。
[npm](https://www.npmjs.com/package/three-post-processing)からインストールできます。

[GitHub: three-post-processing](https://github.com/ukonpower/three-post-processing)
# インストール

## npm
```bash
$ npm i three-post-processing
```
### import

```javascript
import TPP from 'three-post-processing';
```

# 使い方
[サンプル（GitHub)](https://github.com/ukonpower/three-post-processing/tree/master/examples)
一つのポストプロセスは以下のオブジェクトで定義できます。

```javascript
{
  fragmentShader: //postprocess シェーダー,
  uniforms: //uniform変数
}
```

これを配列にして、three-post-processingに渡せばOKです。

```javascript
this.uniforms = {
  time:{
    value: 0
  }
}

let pp1 = {
  fragmentShader: require('./post-processing1.glsl'),
  uniforms:this.uniforms
};

let pp2 = {
  fragmentShader: require('./post-processing2.glsl'),
  uniforms:this.uniforms,
}

this.pp_params = [pp1,pp2];
this.tpp = new TPP(this.renderer,this.pp_params);
```

`render()`でレンダリングされます。

```javascript
this.tpp.render(this.scene,this.camera);
```

###シェーダー
ポストプロセスのシェーダーにはuniform変数`backbuffer`で一つ前のレンダリング結果が送られてきます。
uvは`vUv`で送られてきます。

```glsl:post-processing1.glsl
uniform sampler2D backbuffer;
uniform float time;
varying vec2 vUv;

void main(){
	vec3 c = texture2D(backbuffer,vUv).xyz;
	c = vec3(c.x);
	gl_FragColor = vec4(c,1.0);
}
```

```post-processing2.glsl
uniform sampler2D backbuffer;
uniform float time;
varying vec2 vUv;

void main(){
	vec3 c = texture2D(backbuffer,vUv).xyz;
	c += sin(vUv.x * 100.0) * 0.3;
	gl_FragColor = vec4(c,1.0);
}
```

## 結果

これが、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280075/c649c034-32bf-6787-fcb4-7c7804c4621c.png)

こうなりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280075/a00fcb6e-705d-5688-8436-1eb73274209d.png)

## おわり
よかったら使ってくださいね❤️
Ubuntuを起動するためだけにdocker-composeを使う（日本語化も）

Mac上でLinuxの練習をするために`ubuntu`の環境を構築したい。
ただそれだけのために`docker-compose`を使ってみました。

dockerコマンドより`docker-compose`の操作に比較的慣れているからというただそれだけの理由です。


### フォルダ構成
任意のフォルダを作成して、その中に以下を作っていくよー

```
.
├── docker-compose.yml
└── ubuntu
    └── Dockerfile
```

### 各ファイル
#### ubuntu/Dockerfile

```
FROM ubuntu:16.04

# 日本語化
RUN apt-get update \
  && apt-get install -y locales \ 
  && locale-gen ja_JP.UTF-8 \
  && echo "export LANG=ja_JP.UTF-8" >> ~/.bashrc
```

#### docker-compose.yml

```
version: '3'
services:
  ubuntu:
    build: ubuntu
    container_name: "ubuntu"
    tty: true
```

### 起動

ファイルの用意ができたらビルドします
（初回は時間がかかるよ）

```
$ docker-compose build
```

dockerを起動します

```
$ docker-compose up -d
Recreating ubuntu ... done
```

起動を確認します

```
$ docker-compose ps
 Name     Command    State   Ports
----------------------------------
ubuntu   /bin/bash   Up 
```

`ubuntu`にログインします

```
$ docker exec -it ubuntu bash
root@39f188f02ef7:/#
```

入れました！

以上です＾＾
コードのひよこ感 ～ .NETの文字列を添えて ～

# はじめに
コードについてあれこれ話し、思った何かをまとめたポエムです。

人間がコードを書くのもあと10年くらいかもしれませんが、現在コードを書いている方々、将来プログラムを書く人工知能にも「ひよこ感」は共有したいと思ったのでちょっとまとめてみる次第です。

# ひよこ感とは
**「ひよこ感」**というのは**「コードに対する伸びしろの予感」**です。

もう少し具体的に言うと、「とりあえず書いたコード」や「初心者のときに書きがちだなぁ」、「もっと効率が良い書き方あるんだけどなー」と思われがちなコードに働く直感でもあります。

ベストプラクティスに至る前段階のコード、とも言えるかもしれません。
（ベストプラクティスを知っていればこそ、ですが）

なお、「ちゃんとしてる感」を「にわとり感」、「やりすぎ感」を「やきとり感」「ひきにく感」と呼んだりしています。


# 例

たとえば「文字列に対して大小を無視した比較がしたい」ときのコードがイメージしやすいので並べてみます。

言語は C# で、Aがちりばめられたコードは「ひよこ感」が強い、Bなら「にわとりだなぁ」という印象になりやすいです。

```csharp:A
static void SomeFunc(string a, string b)
{
    if (a.ToLower() == b.ToLower())
    {
        ...
    }
}
```

```csharp:B
static void SomeFunc(string a, string b)
{
    if (string.Equals(a, b, StringComparison.OrdinalIgnoreCase))
    {
        ...
    }
}
```

## コードを見て思うこと
コードに対して考えることは色々ありますが、なんとなく考えているレイヤーが違う感じがします。

### A
- 大小考慮せず比較したいんだなー
- `.ToLower()` によって小文字化されたstringのインスタンスが作られるんだよなぁ。メモリ確保が行われるから遅くなりそうだなぁ。
- nullだったら例外起きるなぁ

### B
- `StringComparison`のところを見るとカルチャは考慮せずにバイナリ比較なんだな。
- 元の文字列はカルチャ揃ってるかな？ユーザー入力じゃないかな？
- 引数がnullだとどうなるんだっけ？

## どう書けばいいのか

- .NETの文字列を使用するためのベストプラクティス
https://docs.microsoft.com/ja-jp/dotnet/standard/base-types/best-practices-strings

これはやきとりではないでしょうか…
全部覚えてる人いないのでは…

# まとめ
あらゆる状況で人を悩ませるnullはやっぱりよくないので早くなくなってほしいですね！
早くnull許容型が基本になってほしい！
ASP.NET MVC5 で複数データの追加/更新をする

#エンジニアキャリア初のお金がもらえる開発
エンジニアになって初めての開発は社内で使う簡単なWebサイトの開発になりました。
言語はC#。ASP.NET MVC5を用いた開発。Pythonで書いてもいいよと言ってもらえましたが、業務で使う言語を優先。
DBサーバーとも連携してやっていく感じなので、勿論データの登録や削除をする機能が必要になってきます。
単体の登録は[EntityFrameworkを用いた自動生成](https://kazunori-kimura.github.io/how-to-develop-dot-net-apps/asp-101.html)があるので比較的簡単に達成。
（リンクはいい感じにまとめてあるサイトです）
いざ複数登録となった時に躓きに躓き、いろいろ調べまくったので忘備録的に残します。

#複数登録、削除の壁

#参考資料
やりたいこと
viewの複数データをコントローラーへわたす
参考になりそうなもの

http://kobarin.hateblo.jp/entry/2017/07/04/172018
https://codeday.me/jp/qa/20190118/149498.html


削除の方法
checkboxのidをりすとでとってまわす→git参照
https://codeday.me/jp/qa/20190129/183883.html
http://blog.nal-6295.biz/2013/12/20/asp-net-mvcccontroller%E3%81%A7%E8%A4%87%E6%95%B0%E3%81%AEcheckbox%E3%81%AE%E7%8A%B6%E6%85%8B%E3%82%92%E5%80%8B%E3%80%85%E3%81%AE%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%E7%8A%B6%E6%85%8B%E3%81%AEboo/


カレンダー
https://aspnet.keicode.com/controls/calendar.php
祝日は表示できるようにしたい→googleのapi取得する？
https://www.yoheim.net/blog.php?q=20160501
http://kobarin.hateblo.jp/entry/20121023/1350951942


https://www.atmarkit.co.jp/fdotnet/aspnetmvc3/aspnetmvc3_07/aspnetmvc3_07_02.html
この形式で3つくらいテキストボックスで十分な気がする

jquery datepicker
https://www.sejuku.net/blog/44165
https://stackoverrun.com/ja/q/7887722
https://qiita.com/haserror/items/de01d46fad1a54c61182

ちょこちょこ書き足します
AWS EC2にPHP7.3.2を入れたらTimezoneがおかしかった話

# 概要

- 1:Amazon Linux 2にPHP7.3.2を入れたら、、
    - OSのタイムゾーン設定はAsia/Tokyo
    - timezoneをAsia/Tokyoにしてるにも関わらずUTCの日時になる
    - 他のtimezoneに設定してもやっぱりUTCの日時になる
    - なお、pythonでは問題なかった
- 2:PHP 7.3.3にupdateしたら解決した
    - ちゃんとJSTな日時が取れた
 

## 1:Amazon Linux 2にPHP7.3.2を入れた

yumでインストールした。
OSのタイムゾーン設定はAsia/Tokyo。

```sh
$ strings /etc/localtime
TZif2
TZif2
JST-9
$ sudo cat /etc/sysconfig/clock 
ZONE="Asia/Tokyo"
UTC=false
$ sudo timedatectl
      Local time: 日 2019-03-31 11:46:36 JST
  Universal time: 日 2019-03-31 02:46:36 UTC
        RTC time: 日 2019-03-31 02:46:36
       Time zone: Asia/Tokyo (JST, +0900)
     NTP enabled: yes
NTP synchronized: no
 RTC in local TZ: no
      DST active: n/a
$ date
2019年  3月 31日 日曜日 11:46:51 JST
```

PHPのtimezoneをAsia/Tokyoにしてるにも関わらずUTCの日時になる。
なんでやの。

```
$ php -v
PHP 7.3.2 (cli) (built: Feb 15 2019 19:06:47) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.2, Copyright (c) 1998-2018 Zend Technologies
$ less /etc/php.ini | grep "date.timezone"
; http://php.net/date.timezone
date.timezone = Asia/Tokyo
$ php -a
Interactive shell

php > echo date_default_timezone_get();
Asia/Tokyo
php > echo date("Y/m/d H:i:s P");
2019/03/31 02:47:17 +00:00
```

他のtimezoneに設定してもやっぱりUTCの日時になる

```
$ php -a
Interactive shell
php > echo date_default_timezone_set("Asia/Taipei");
1
php > echo date("Y/m/d H:i:s P");
2019/03/31 03:15:01 +00:00
php > echo date_default_timezone_get();
Asia/Taipei
php > echo date_default_timezone_set("Europe/Berlin");
1
php > echo date_default_timezone_get();
Europe/Berlin
php > echo date("Y/m/d H:i:s P");
2019/03/31 03:15:45 +00:00
php > exit
$ date
2019年  3月 31日 日曜日 12:19:06 JST
```

なお、Pythonでは問題なかった。

```sh
$ python
Python 2.7.14 (default, Jul 26 2018, 19:59:38) 
[GCC 7.3.1 20180303 (Red Hat 7.3.1-5)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 
>>> from datetime import datetime
>>> datetime.now().strftime("%Y/%m/%d %H:%M:%S")
'2019/03/31 11:48:04'
```

```sh
$ python3
Python 3.7.2 (default, Feb 26 2019, 20:08:16) 
[GCC 7.3.1 20180303 (Red Hat 7.3.1-5)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from datetime import datetime
>>> datetime.now().strftime("%Y/%m/%d %H:%M:%S")
'2019/03/31 11:52:45'
```

ChangeLogをパッと見た限りではタイムゾーンのバグらしきものは見当たらず。
https://www.php.net/ChangeLog-7.php#7.3.3
　

## 2:PHP 7.3.3にupdateしたら解決

とりあえずよく分からんので、PHP 7.3.3にアップデートしたら問題は解消した謎。

```
$ sudo yum update
```

アップデート後

```php
$ php -v
PHP 7.3.3 (cli) (built: Apr  3 2019 18:43:11) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.3, Copyright (c) 1998-2018 Zend Technologies
$ date
2019年  5月 11日 土曜日 19:26:26 JST
$ php -a
Interactive shell

php > echo date_default_timezone_get();
Asia/Tokyo
php > echo date("Y/m/d H:i:s");
2019/05/11 19:26:39
php > 
```

問題なし。
いったい何だったんだろうか。
【Sourcetree】個人的お気に入り設定(Mac)

# 執筆時のSourcetreeのバージョン
>Sourcetree 3.1.2

# 設定

###「コミット後ただちにプッシュ」をデフォルトに
[Sourcetree]
→[環境設定]
→[コミット]タブを開く
→「コミット時にリモートのdefault/originにプッシュする」にチェックを入れる

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336656/32d8c29a-d87d-b980-d1ca-21647d4599b2.png)



###ステージング画面を分割しない
[ワークスペース/ファイルステータス]画面を開く
→画像の部分をクリック
→「ステージング無し」を選択
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336656/2a6c0d1f-644b-90f9-1442-7e0857244770.png)

###変更したファイルのパスの表記をスッキリさせる
[ワークスペース/ファイルステータス]画面を開く
→画像の部分をクリック
→「フラット表示（複数列）」を選択

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336656/69feb42d-bd5b-e922-863d-6e120c4c4d0a.png)

### ダークモード
[Sourcetree]
→[環境設定]
→[一般]タブを開く
→「テーマ」の項目の「ダーク」にチェックをつける

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336656/4dcdae31-dd55-e154-17db-fea7515f9e95.png)
Leetcode #29: Divide Two Integers

```swift
func divide(_ dividend: Int, _ divisor: Int) -> Int {
    if dividend == 0 {
        return 0
    }
    var isMinus = true
    if (dividend < 0 && divisor < 0) || (dividend > 0 && divisor > 0) {
        isMinus = false
    }
    var quotient = 1
    helper(abs(dividend), abs(divisor), abs(divisor), &quotient)
    return isMinus ? -quotient : quotient
}

private func helper(_ dividend: Int, _ currentValue: Int, _ divisor : Int, _ quotient: inout Int) {
    if currentValue * 2 == dividend {
        quotient *= 2
        return
    } else if currentValue * 2 < dividend {
        quotient *= 2
        helper(dividend, currentValue * 2, divisor, &quotient)
    } else {
        for i in 1..<quotient {
            currentValue += divisor
            if currentValue == dividend {
                quotient = quotient + i
                return
            } else if currentValue > dividend {
                quotient = quotient + i - 1
                return
            }
        }
    }
}
```
関数テンプレート経由で振り分ける


C++ において `std::pow` のオーバーロードの解決が曖昧になる場合を取り上げている記事を読みました。

> [C++ Builder 10.2 Tokyo > E2015 `std::pow(long double, int)`と `std::pow(double, int)` の区別が曖昧 > 対処](https://qiita.com/7of9/items/d8f0d635f72d49d9ef2d)

これを機にふと `std::pow` について眺めてみると、 C++03 では確かにこれは曖昧であるようですし、 C++11 でも曖昧です。

それはこのようなコードで試してみるとわかります。

```cpp:sample1.cpp
#include <iostream>

double foo(double) {
  std::cout << "double" << std::endl;
  return 0;
}

long double foo(long double) {
  std::cout << "long double" << std::endl;
  return 0;
}

int main(void) {
  foo(int());
  return 0;
}
```

ですが、 C++11 では `std::pow(int(), int())` といったように実引数の型が `int` である場合も特にキャストする必要はなく、最終的に `double pow(double, double)` を呼出します。 整数を与えた場合は `std::pow` と同名の関数テンプレートが一旦受け取って振り分けなおす仕組みだからです。

上の例を少し弄って表現するとこのような要領です。

```cpp:sample2.cpp
#include <iostream>

double foo(double) {
  std::cout << "double" << std::endl;
  return 0;
}

long double foo(long double) {
  std::cout << "long double" << std::endl;
  return 0;
}

#include <type_traits>

template<class T>
typename std::enable_if<std::is_integral<T>::value, double>::type
foo(const T& x) {
  return foo(static_cast<double>(x));
}

int main(void) {
  foo(int());
  return 0;
}
```

オーバーロードの解決規則は大変に複雑なのですが、大原則としては**型変換なしで型が完全に一致するものがあればそれが最優先**です。 完全一致がなければ型変換による一致を試す前にテンプレートが候補になります。 候補になった関数テンプレートの中で上手く振り分ければ、本来は曖昧なはずのオーバーロードも上手く解決できる場合があります。

ごく簡単な関数であれば振り分けなおしなどといった処置をするまでもなくひとつの関数テンプレート内で `if constexpr` で分岐してもよいと思うのですが、既存のオーバーロードに曖昧さがあることに気づいたときなどは、関数テンプレートを経由するというのは有用な手法足り得るので感心した次第です。
php-master-changes 2019-05-10

今日は不要コードの削除 sapi/litespeed の更新、ext/skeleton でのライブラリチェックコードのデフォルトコメントアウト、gd で新たなフィルタ IMG_FILTER_SCATTER を追加する修正があった！

# 2019-05-10
## petk: Remove unused functions
- https://github.com/php/php-src/commit/ec518aef10abb26db9c50dc9c4912386cbe94989
- [7.4~]
- 使われていない関数の削除

## George Wang: Updated LiteSpeed SAPI to 7.3.2 to allow request header value length up to 64K.
- https://github.com/php/php-src/commit/af4143753f49e93e52f203790468b73b9df6a979
- [7.2~]
- sapi/litespeed の更新
- リクエストヘッダの値の長さ格納フィールドが int16_t だったのを uint16_t にしている

## petk: Disable checking for library in the ext skeleton
- https://github.com/php/php-src/commit/071acf7b8429091fc77ce93a3a6f5ba4cf694623
- [7.4~]
- ext/skeleton/config.m4.in で、ライブラリのチェック部分をコメントアウト

## petk: Remove dead code from configure.ac
- https://github.com/php/php-src/commit/f7b62b115ef1dbcb75ff682f73778fb0868fba27
- [7.4~]
- configure.ac の不要コードを削除

## petk: Remove unused variable
- https://github.com/php/php-src/commit/1ab37041434ae7de2389461b41823ed6a5c1f7c9
- [7.4~]
- ext/openssl で、テストの不要変数の削除

## KalleZ: Implemented the gdScatter filter I wrote almost 10 years ago
- https://github.com/php/php-src/commit/bcd11a1dfbb520c6663d7737cf7e0fec93eb2d8a
- [7.4~]
- ext/gd で、IMG_FILTER_SCATTER フィルタの実装

## KalleZ: NEWS and UPGRADING for the scatter filter
- https://github.com/php/php-src/commit/f13fdeadd6df6d92645d4ded696663ffdf11299a
- [7.4~]
- ↑の NEWS と UPGRADING への追記
AndroidアプリのWebViewでデスクトップ向けサイトを、ピクセル数を変えずに表示する方法　～ Pixel Perfect on Smartphone ～

# 概要
- レスポンシブの逆です。デスクトップ向けに設計されたサイトを拡大も縮小もせず、Androidアプリ上に抱えたWebView上に表示する方法です
- 英語でいうとスマホ上に「Pixel Perfect」に表示します
- 当然、PC画面に比べ高解像度なスマホで表示すれば、文字や画像が小さくなります、でも今回は、それがやりたいこととなります。

# やり方

## Androidアプリ側

ポイントは以下の部分となる

```java
webView.setInitialScale(100);
webView.getSettings().setUseWideViewPort(true);
webView.getSettings().setLoadWithOverviewMode(true);
```

最小限のコードのみ

```java:MainActivity.java
public class MainActivity extends Activity {

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

        WebView webView = (WebView) findViewById(R.id.webview);
        webView.setWebViewClient(new WebViewClient());
        webView.setInitialScale(100);//<=これを忘れやすい

        WebSettings settings = webView.getSettings();
        settings.setUseWideViewPort(true);
        settings.setLoadWithOverviewMode(true);

    }
}
```

```xml:activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <WebView
        android:id="@+id/webview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"></WebView>
</LinearLayout>
```
## HTML側

```html:index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta name="viewport" content="width=device-width,initial-scale=1">
</head>
<body>
<div id="mybox" style="position:absolute;left:0px;top:0px;width:100px;height:100px;background-color: red">
</div>
</body>
</html>
```

## 結果

スマホのスクリーンショットをとると、ちゃんと**100px**ｘ**100px** で表示される！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170905/62e75582-c08d-5ee2-6445-b65cacde87b6.png)
Ruby on Railsの基礎

#Railsアプリケーションの開発を始める
##Railsアプリケーション作成
以下をターミナルで実行する。

```
rails new hello_app(アプリケーション名)
```

これにより、入力したアプリケーション名と同名のフォルダが作成され、その中に開発に必要なフォルダやファイルが用意される。

##サーバーの立ち上げ
Railsアプリケーションをブラウザで表示するためには、サーバーというものを起動する必要があります。

```
rails server
```

サーバーを起動した後、ブラウザで「localhost:3000」というURLにアクセスすると、初期画面が表示されるようになる。

##ページを作成する
```
rails generate controller home sample
```
新しいWebページが自動で作られ、
「localhost:3000/home/sample」というURLにアクセスできるようになる。

ページの作成には
**View(ビュー)**,**controller(コントローラ)**,**routing(ルーティング)**
の三つが必要である。

###View(ビュー)
ページの見た目を作るHTMLファイルのこと。
以上のコマンドによって自動的に作られた、app/views/home/sample.html.erbにある
sample.html.erb

```
<h2>Hello World!</h2>
<p>Hello World!</p>
```

このようにして見た目をデザインできる。

###Controller(コントローラ)
ページを表示するとき、Railsの中ではコントローラを経由してビューをブラウザに返す役割。
app/controllers/home_controller.rbにある
home_controller.rb

```
class HomeController < ApplicationController
 def sample 
//アクション
 end
end
```

ここでアクションとは、
コントローラと同じ名前のビューフォルダから、アクションと同じ名前のHTMLファイルを探してブラウザに返すこと。

###Routing(ルーティング)
Rails内ではコントローラを経由してビューを返していますが、ブラウザとコントローラを繋ぐ役割を担う.
また、、送信されたURLに対して「どのコントローラの、どのアクション」で処理するかを決める対応のこと。
app/config/route.rbにある
route.rb

```
Rails.application.routes.draw do

 get "home/sample" => "home#sample"
     　↑URL　　　　　　↑コントローラ名#アクション名
```
get "URL" => "コントローラー名#アクション名"」という文法で
書かれる。
これによって、ブラウザから「localhost:3000/home/sample」というURLが
送信されたときに、homeコントローラーのsampleアクションで処理されるようになる。
google colaboratory上でpdfファイルのテキスト変換処理を行う

```python:test.py
!pip install pdfminer.six

import os
import urllib.request

#pdfダウンロード
tkjkj='https://www.release.tdnet.info/inbs/'
pdf_url = '140120190509419830.pdf' #JPXの適時開示情報のページの開示資料pdf（サンプル）
url = str(tkjkj) + str(pdf_url ) 
pdfpath = "test.pdf"
os.system("wget -O " + str(pdfpath) + " " + str(url))

#pdf2txt.pyのダウンロード
py_url ='https://github.com/pdfminer/pdfminer.six/blob/master/tools/pdf2txt.py'
py_fn='pdf2txt.py'
os.system("wget -O " + str(py_fn) + " " + str(py_url))

#pdf2txt.pyを用いてpdfファイルをテキスト変換
lines = !pdf2txt.py { pdfpath }
txt = '\n'.join(lines)
print(txt)

```
前回[JPXの適時開示情報のページを参照閲覧するスクリプト](https://qiita.com/Fortinbras/items/d9a5c3698972a6352231)を書いたが、決算短信や業績予想の修正のリリースなどはXBRLファイルが付いているのでXBRLファイルを読み込んで値を取得する処理を施すとして、XBRLファイルの付いていないリリースをどうするか？ということで、今回はpythonのライブラリ「pdfminer.six」を利用してpdfファイル内の文章をテキスト情報に変換する方法を調べてみた。

pdfminer.sixには付属ファイルとして、pdf2txt.pyが付いているので、これを用いて読み込むpdfを指定すると、pdfファイルの中の文章を文字列に変換してくれる模様。

なおWeb上のpdfを指定すると、file not foundとエラーになるので、上記スクリプトでは一旦wgetコマンドでカレントディレクトリにpdfファイルをダウンロードしている。またgoogle colaboratory上で実行する場合は、githubのpdfminer.sixのページからwgetコマンドで、pdf2txt.pyをカレントディレクトリにダウンロードしている。

※google colaboratory上での実行イメージ↓
<img width="600" alt="test_pdf2txt.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/91974/6d2c419f-77ec-4c85-72b1-c864dc2cf02f.png">
AWS ソリューションアーキテクト-アソシエイトを取りたい


## 意気込み
AWSソリューションアーキテクト-アソシエイトを取って「私クラウドも分かるんです(ドヤ)」系ITコンサルになって年収5000兆円欲しい。
## 私のレベル感
新卒2年目ITコンサル（という名のシステム導入パワポ職人）。
大学時代の専攻は情報系とは一切関係無い。
昨年10月に応用情報を取得。
AtCoder水色。

## やったこと
### 読書
[徹底攻略 AWS認定 ソリューションアーキテクト – アソシエイト教科書](https://www.amazon.co.jp/%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5-AWS%E8%AA%8D%E5%AE%9A-%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%88-%E2%80%93-%E3%82%A2%E3%82%BD%E3%82%B7%E3%82%A8%E3%82%A4%E3%83%88%E6%95%99%E7%A7%91%E6%9B%B8/dp/4295005495/ref=asc_df_4295005495/?tag=jpgo-22&linkCode=df0&hvadid=295658337340&hvpos=1o1&hvnetw=g&hvrand=13939462607274489922&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009300&hvtargid=pla-595366187700&psc=1&th=1&psc=1)
参考書系の中で多分一番有名なやつだと思います。
クラウド知識皆無だったので（応用情報だけは持ってたので、サーバーとかネットワークとかはある程度分かっていたのですが）、AWSの全体感とか、各サービスがオンプレで言う所のどれに該当するのか、とかを手っ取り早く掴むのに役立ちました。ただ、やっぱり文字だけではイマイチ理解できない部分も多く眠くなったので、AWS触った事がない人は後述のハンズオンと組み合わせてやるのがベターかと思います。
### オンラインのハンズオン講座
GW10連休利用してこちらをやりました。
[手を動かしながら2週間で学ぶAWS基本から応用まで](https://www.udemy.com/draft/1706378/learn/v4/overview)
やっぱり実際にサービス触ってみるとサービスのイメージがだいぶ湧いてくるので、業務経験が一切ないという場合にはこういうハンズオン講座が大変役に立ちます。

※5月以降は新規受講できないようなので、今はこっちの方がいいのかも。
[これだけでOK！ AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座（初心者向け20時間完全コース）](https://www.udemy.com/aws-associate/?src=sac&kw=aws)
## 今後やる事
全体感は掴めたので後は
サンプル問題解く→分からなかった部分はAWS公式ドキュメントを読んで知識を深める/実際に触ってみて理解を深める
のループを繰り返して精度を上げていきたいと思います。
### 問題リソース
- [AWS公式のサンプル問題](https://aws.amazon.com/jp/certification/certified-solutions-architect-associate/)
  - サンプル問題が9問あるそうなので、まずはそれで腕試ししてみます。
- [「徹底攻略〜教科書」の付録問題](https://www.amazon.co.jp/%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5-AWS%E8%AA%8D%E5%AE%9A-%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%88-%E2%80%93-%E3%82%A2%E3%82%BD%E3%82%B7%E3%82%A8%E3%82%A4%E3%83%88%E6%95%99%E7%A7%91%E6%9B%B8/dp/4295005495/ref=asc_df_4295005495/?tag=jpgo-22&linkCode=df0&hvadid=295658337340&hvpos=1o1&hvnetw=g&hvrand=13939462607274489922&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009300&hvtargid=pla-595366187700&psc=1&th=1&psc=1)
  - 模擬試験1回分が付録として付いているので、問題演習のメイン題材にしていきたいです。
- [模擬試験](https://www.certmetrics.com/amazon/)
  - 1回の受験に2000円かかりますが、最新版での演習問題が手に入るのでこれもやります。後で復習できるよう、スクショを忘れないようにしましょう。

### 解説リソース
- [AWS初心者向け資料](https://aws.amazon.com/jp/aws-jp-introduction/#beginners)
    - AWS公式の初心者向け資料です。全体感が分からなくなってきたらこの辺を読んでみようと思います。
- [AWSサービス別資料](https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-service-cut/)
    - サービス別の詳細情報が集まっています。問題解いていく中で特定のサービスについての理解が足りていなかったら開いてみようと思います。
- [AWSドキュメント](https://docs.aws.amazon.com/index.html)
    - こちらもサービス別の詳細資料が集まっています。サービス別資料との違いはよく分からないです。開発者向けなのかな？

## スケジュール感
- ~5/19(日)：サンプル問題と付録問題を終わらせる。
- ~5/26(日)：模擬試験を終わらせる。2周目の読書をする。本試験申し込み。
- ~6/2(日)：2周目の問題演習。受験。

## その他
勉強の進捗とともに随時更新予定です。
スケジュール通りに動けるといいなぁ。
2019年に爆速でrocker/tidyverseにRSelenium入れてRからWebクロールしまくる件

#こんなもんさっさと出来るだろうと思ったら、案外つまづいたので手順だけまとめます。
書いてる人はMojave 10.14.4です。
なるべく各プラットフォームのパッケージマネジャをそのまま使います。

使うもの：rocker/tidyverse のコンテナ

## Dockerかもん。sudoを有効に
お好みでdockerfile弄る - https://qiita.com/kazutan/items/1af4d0c4defb4de4b7fb

```bash:On_the_Mac
docker run --rm -p 8787:8787 -e PASSWORD=PASSWORD -e ROOT=TRUE rocker/tidyverse
```

起動したら http://localhost:8787 を開く
id: rstudio
pass: PASSWORD


# こっからDocker内：RStudio まずターミナル
sudo有効になってるので、ターミナルから下記を撃ちまくる


## RStudioのターミナルから 1 - apt
```bash:run_inside_container/rstudio
sudo apt-get install -y chromium chromedriver fonts-noto-cjk default-jre curl
```

## RStudioのターミナルから 2 - Selenium stand alone server
https://www.seleniumhq.org/download/ から最新版を。
2019/5時点は "3.141.59" / selenium-server-standalone-3.141.59.jar

https://bit.ly/2TlkRyu がいつも最新版にリンクされてるらしい
一撃でダウンロードからの、乱暴に起動

```bash:getselenium
# ひっと　えんど
curl -O `curl https://bit.ly/2TlkRyu | grep -Eo "(http|https)://[a-zA-Z0-9./?=_-]*"`
# らーん
java -jar selenium-server-standalone*
```


# こっからR

##2019年、pacman使わないのは犯罪となった
```R:scrape.R
## このプロジェクト用
pacman::p_load(xml2, rvest, RSelenium)
## いつもの (load below project specifics, to avoid function masking issues)
pacman::p_load(dbplyr, tidyverse, jsonlite, lubridate, stringr, readr)
```


## extraCapabilities設定 / ファイルの自動ダウンロードもついでに設定
```R:scrape.R
eCaps <- list(
    chromeOptions = 
      list(
        prefs = list(  # ダウンロード時にダイアログ出さない設定
        "profile.default_content_settings.popups" = 0L,
        "download.prompt_for_download" = FALSE,
        "download.default_directory" = "~/extract_temp"
        ),
        # この'--no-sandbox'が無いとdockerコンテナごと設定変えないといけなくなる
        args = c('--no-sandbox', '--headless', '--disable-gpu', '--window-size=1200,1800')
      )
    )
``` 

```R:scrape.R
  # 起動済みのSeleniumサーバに接続 (rsDriverで直起動も出来るはず、なんだけどなんか機能しない)
  remDr <- remoteDriver(
    remoteServerAddr = "localhost",
    port = 4444L,
    browserName = "chrome",
    extraCapabilities = eCaps)
```

## 起動すっぞ
```R:scrape.R
remDr$open()
#こんな感じでログイン処理まとめた
win3login()
```

## 削るぞ削るぞ
```R:scrape.R
jan_list <- get_janlist() # 欲しいぞリスト取得

# Test run - single item
item <- win3_extract_item("9784199801907")
# １万件とか余裕だった。サーバ不可に気をつけて適度にウェイト入れる
results <- sapply(jan_list$jancode[1:10], win3_extract_item)
```

注意点
google-chrome入れちゃうと「古いバージョンにしろ(2019/5時点で73以下)とか言われてさまよう事になるので初めからchromiumだけ使う。
はじめて Qiita書きました。変なところあったら優しく教えてください。(びびり)

次はcronRで自動実行やります：
https://cran.r-project.org/web/packages/cronR/README.html

もちょい実用的なハウツーみたいなのも書きました：
https://qiita.com/taiyodayo/items/fca8f9185a684221a799
Ubuntuでupgrade保留されたときの対処

#環境
- Ubuntu Mate 16.04
- RaspberryPi3

#apt-get upgrade を保留されたときの対処法

何やらアップデートすることで必要のないパッケージが出て，それがアンインストールされるときに保留されるらしい．
以下のコマンドで無事アップデートできた．

```bash:bash.sh
sudo apt-get dist-upgrade
```
RaspberryPi3+UbuntuMateにいろいろ入れていく

#使いそうなソフトと入れておきたいソフト
##入れたもの
- vim

    戦争が起きるのでノーコメント
    `sudo apt-get install vim`
- gpp

    C++がコンパイルできるヤッタネ．
    `sudo apt-get install gpp`

##入ってたもの
主にプログラミング系
- ruby
- python2
- python3
- gcc

##ネタ枠
- sl

`sl`とうち間違えると汽車が走る．地味にうざいトラップ．
- nyancat

ねこかわいい

#まとめ

なんのための記事なのかわからなくなってしまった．
次回はDockerを入れていきたいです．
vagrant環境のboxをバックアップする方法

# 概要
vagrantの環境のboxを保存しておくことで、バックアップとして利用したり別のローカル環境にて同じvagrant環境を用意することができる。

# 手順

### 現在のvagrant環境からboxファイルを作成する。
VM nameを調べる。以下の場合は "default" がVM nameとなる。

```
$ vagrant status
Current machine states:

default                   running (virtualbox)

The VM is running. To stop this VM, you can run `vagrant halt` to
shut it down forcefully, or you can run `vagrant suspend` to simply
suspend the virtual machine. In either case, to restart it again,
simply run `vagrant up`.
```

以下のコマンドでboxファイルを出力

```
$ vagrant package [:VN_name] --output [:output_file_name].box
```

実行

```
$ vagrant package default --output ubuntu_trusty64_test.box
==> default: Attempting graceful shutdown of VM...
==> default: Clearing any previously set forwarded ports...
==> default: Exporting VM...
==> default: Compressing package to: /Users/user_name/ubuntu_trusty64/ubuntu_trusty64_test.box
```
`/Users/user_name/ubuntu_trusty64/ubuntu_trusty64_test.box` が出力され、バックアップが完了。

### 出力したboxファイルを使用してvagrant環境を構築する
vagrant用ディレクトリを作成

```
$ mkdir ubuntu_trusty64_test2
$ cd ubuntu_trusty64_test2
```

outputしたboxファイルを持ってくる

```
$ pwd
/Users/user_name/ubuntu_trusty64_test2
$ cp /Users/user_name/ubuntu_trusty64/ubuntu_trusty64_test.box .
$ ls -l
total 1018968
-rw-r--r--  1 yoshinomasayoshi  staff  521710999  5 11 17:46 ubuntu_trusty64_test.box
```

vagrant box addする。コマンドは

```
$ vagrant box add [:VM name] [:box file path]
```
実行

```
$ vagrant box add ubuntu_trusty64_test2 ubuntu_trusty64_test.box
==> box: Box file was not detected as metadata. Adding it directly...
==> box: Adding box 'ubuntu_trusty64_test2' (v0) for provider: 
    box: Unpacking necessary files from: file:///Users/user_name/ubuntu_trusty64_test2/ubuntu_trusty64_test.box
==> box: Successfully added box 'ubuntu_trusty64_test2' (v0) for 'virtualbox'!
```

確認

```
$ vagrant box list
ubuntu/trusty64       (virtualbox, 20190429.0.0)
ubuntu_trusty64_test2 (virtualbox, 0)
```

追加されているので、vagrantにてboxを利用する

```
$ vagrant init ubuntu_trusty64_test2
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.
```

構築完了。あとはvagrant upでいつも通り起動可能。

```
$ vagrant up
```

# 参考
http://vdeep.net/vagrant-package
ありがとうございますmm