OmniAICreator/Qiita-1.07M huggingface dataset:
Mac環境でOpenCVをmakefileを使ってコンパイルする方法

#背景
Windows環境でOpenCVのスクリプトを書いていた時は、VisualStudioだったので設定でincludeフォルダとlibフォルダのそれぞれのパスと必要なlibファイルを設定すればビルドすることはできます。
この5年くらいはmacでの開発が多かったので、OpenCVをすぐ使いたいと思った時にPythonを使って `pip install opencv-python` でパッケージをインストールすれば使っています。

で、C++でmacで使おうと思った時にどうやってダウンロードと設定すればいいのかがよくわからんかったのでまとめてみました。


#方法

### Homebrewを使ってopenCVをインストールする

```
brew install opencv
```
`/usr/local/Cellar/opencv/` 配下にダウンロードされます。 includeフォルダパスは `/usr/local/Cellar/opencv/4.1.1_2/include/opencv4/` 、 libフォルダパスは `/usr/local/Cellar/opencv/4.1.1_2/lib/` でそれぞれにヘッダーファイルとlibファイルが格納されています。



### 表示に使う画像

![mikan.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288206/9b309d33-d6b6-cb93-f115-a123b77e8f9c.jpeg)
みかん星人です。 

### コードを作成する

```c++
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/highgui.hpp>

int main(int argc, const char* argv[]) {

　　　　　//モノクロ画像で格納
	cv::Mat image = cv::imread("./mikan.jpg" , 0);
	if (image.empty()) {
		std::cout << "read error.\n";
		return -1;
	}
    

	while (true){
		const int key = cv::waitKey(1);
                //[q] を押すと終了 
		if (key == 'q'){
			break;
		}

		cv::namedWindow("Image", cv::WINDOW_AUTOSIZE);
		cv::imshow("Image", image);
	}

	cv::destroyAllWindows();
	
   return 0;
}
```

### makefile を作成する

コマンドでパスの設定をする必要があるので下記のコマンドを打って出力ファイルを作成することができます。

```shell
c++ main.cpp -o main -I/usr/local/Cellar/opencv/4.1.1_2/include/opencv4/ \ 
-std=c++11 \
-L/usr/local/Cellar/opencv/4.1.1_2/lib/ \
-lopencv_core -lopencv_highgui -lopencv_imgcodecs
```

毎回このコマンドを打ってデバッグするのは結構面倒です。ここにopencv以外の外部ファイルを追加したい場合はこれよりも長くなります。長くなるとどこでビルドがエラーになっているかわかりにくい :tired_face:
なのでmakefileを作ってマクロ化します。

```makefile
CXX = c++
CXXFLAGS =  -I/usr/local/Cellar/opencv/4.1.1_2/include/opencv4/
LDFLAGS = -L/usr/local/Cellar/opencv/4.1.1_2/lib/
LDLIBS =  -lopencv_core -lopencv_highgui -lopencv_imgcodecs
CXXVERSION = -std=c++11

main: main.cpp
	$(CXX) $< -o $@ $(CXXFLAGS) $(CXXVERSION) $(LDFLAGS) $(LDLIBS)

clean :
	rm main
```

`CXXVERSION = -std=c++11` とあるのですが、最新のopenCV4系では明示する必要があります。c++の構文が`c++11`、`c++14`、`c++17`とバージョンアップしていてopenCVの構造がc++11以上の構文で書かれているっぽいです。そのため指定しないとエラーになります。

makefileができれば `make` コマンドだけで出力ファイルが作られます。

```
make
./main
```

### 結果
<img width="515" alt="スクリーンショット 2019-10-13 19.17.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288206/b0da3d54-7cd6-7bc6-6a35-ae5e49e6908b.png">

キーボード[q]を押すと閉じます。

### おわり
makefileあるとコマンド一つなので楽です。


#参考になりそうなリンク
- [IDEを使わずにOpenCVを使ったC++ソースファイルをビルドする](https://qiita.com/hsmtknj/items/0f56e3317cd0f2ae056a)
  - タイトルがそれっぽいのですが書き方はあまり参考にしていないです。
- [waifu2x を OSX で動かしたメモ](https://qiita.com/iwag@github/items/c9ee44eb55c7c9fb0d32)
  - 題材はOpenCVではないですがこっちが参考になります。
ubuntu 16.04にAdobe PDF readerインストールする

# 自分用のメモ
windowsのadobeで作成したpdfファイルを読むときに、やはりデフォルトのevinceだとコメントの表示にいろいろ不具合があるらしい。おとなしくAdobe PDF readerインストールすることにした。

## 本体のインストール
```bash
$ sudo add-apt-repository "deb http://archive.canonical.com/ precise partner"; sudo apt-get update
$ sudo apt-get install adobereader-enu
```
/opt/Adobe/Reader9/にてインストールされる。

## 日本語フォントのインストール
```bash
$ wget http://ardownload.adobe.com/pub/adobe/reader/unix/9.x/9.1/misc/FontPack910_jpn_i486-linux.tar.bz2
$ tar xavf FontPack910_jpn_i486-linux.tar.bz2
$ sudo bash ./JPNKIT/INSTALL 
```
あとはaccept入力しenter打てばOK。

ubuntu 18.04も多分いけるじゃないかと。また今度試してみる。
【PHP】gzip圧縮されたCSVをSplFileObjectで直接処理する

# テスト用gzipファイルの準備

```bash
$ cat << EOF > test.csv
> id,name
> 1,ほげ
> 2,ふが
> 3,ぴよ
> EOF
$ gzip -c test.csv > test.csv.gz
```

# 実装

```php
<?php
// gzipファイルのダウンロード
$url = 'http://localhost/test.csv.gz';
$ch  = curl_init($url);

$tmp = tmpfile();

curl_setopt_array($ch, [
    CURLOPT_URL  => $url,
    CURLOPT_FILE => $tmp,
]);

curl_exec($ch);
$tmp_path = stream_get_meta_data($tmp)['uri'];

// CSVとして読み込み
$file = new SplFileObject('compress.zlib://' . $tmp_path);
$file ->setFlags(SplFileObject::READ_CSV);

if(0 === strpos(PHP_OS, 'WIN')) {
    setlocale(LC_CTYPE, 'C');
}

foreach($file as $row){
    var_export($row);
}
```

# 実行結果

```
array (
  0 => 'id',
  1 => 'name',
)array (
  0 => '1',
  1 => 'ほげ',
)array (
  0 => '2',
  1 => 'ふが',
)array (
  0 => '3',
  1 => 'ぴよ',
)
```

---
ハマったので備忘。
[Android] カメラのライト制御 (パーミッション不要)

## 概要
APIレベル23 / Android 6.0 / Marshmallowから、従来手法では必要だった"android.permission.FLASHLIGHT"のパーミッション不要でカメラのライトのON/OFF制御が出来るようになっています。この対応方法について説明します。

## コード
android.hardware.camera2.CameraManagerを利用します。サンプルコードを以下に記載しますが、とっても簡単に対応出来ます。

```java:FlashlightTorchCOntroller
import android.annotation.TargetApi;
import android.content.Context;
import android.hardware.camera2.CameraManager;

import androidx.annotation.NonNull;
import android.os.Handler;

@TargetApi(23)
public class FlashlightTorchController {

    private CameraManager cameraManager;
    private String cameraID;
    private boolean SW;

    public FlashlightTorchController(Context context) {

        SW = false;
        cameraManager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE);

        // カメラマネージャーにトーチモードのコールバックを登録
        cameraManager.registerTorchCallback(new CameraManager.TorchCallback() {
            // トーチモードが変更された時の処理
            @Override
            public void onTorchModeChanged(@NonNull String cameraId, boolean enabled) {
                super.onTorchModeChanged(cameraId, enabled);
                // カメラIDをセット
                cameraID = cameraId;
                // SWに現在の状態をセット
                SW = enabled;
            }
        }, new Handler());
    }

    public void toggle() {

        if (cameraManager == null || cameraID == null)
            return ;

        cameraManager.setTorchMode(cameraID, !SW);
    }
}
```
docker-composeでredmine4.0.4を構築してみる


## 構築環境
- Mac macOS Mojave 10.14.6
- docker 19.03.2
- docker-compose 1.24.1

## 環境構築
### 1.フォルダ構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308893/b854f06a-46c8-97dc-c52c-453f182d64c9.png)

### 2.ymlファイルの作成
```yml:docker-compose.yml
version: '3.7'

services:

  redmine:
    image: redmine:4.0.4-alpine
    environment:
      TZ: Asia/Tokyo
      REDMINE_DB_POSTGRES: db
      REDMINE_DB_DATABASE: redmine
      REDMINE_DB_USERNAME: redmine
      REDMINE_DB_PASSWORD: password
    restart: always
    ports:
      - "8080:3000"
    depends_on:
      - db
    volumes:
      - ./redmine/files:/usr/src/redmine/files

  db:
    image: postgres:12-alpine
    restart: always
    environment:
      TZ: Asia/Tokyo
      REDMINE_DB_DATABASE: redmine
      POSTGRES_USER: redmine
      POSTGRES_PASSWORD: password
    ports:
      - "5432:5432"
    volumes:
      - ./postgresql/data:/var/lib/postgresql/data
      - ./postgresql/initdb:/docker-entrypoint-initdb.d
```

### 3.docker-composeの実行
```console
$ docker-compose up -d
```

### 4. デフォルトデータの流し込み
```console
docker exec {コンテナ名} bundle exec rake redmine:load_default_data RAILS_ENV=production REDMINE_LANG=ja
```


## 番外編（ハマりポイント）
上記のdocker-compose.ymlで実行したら、以下のエラーに。。。

ホスト側のフォルダがマウントできないとのこと。
```console
Creating network "redmine404_default" with the default driver
Creating redmine404_db_1 ... error

ERROR: for redmine404_db_1  Cannot start service db: b'Mounts denied: { errno = [EACCES]; call = getattrlist; label = /Users/hogehoge/Documents/docker/redmine404/postgresql/data }'

ERROR: for db  Cannot start service db: b'Mounts denied: { errno = [EACCES]; call = getattrlist; label = /Users/hogehoge/Documents/docker/redmine404/postgresql/data }'
ERROR: Encountered errors while bringing up the project.
```
ネットを調べるとDocker Desktop にてコンテナと共有するフォルダを指定しておかないと
いけないとか。今回は、/User/ 配下の為設定はできている模様。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308893/21ee6730-5a82-0fdd-3bd7-b54079ddb930.png)

色々調べていると、ホスト側の共有フォルダにアクセスができなくなっていた。
chmodでアクセス権をイジった時に間違って設定したのか？？
上位フォルダから削除して再作成したら、コンテナは無事起動した。

しかし、今度は、管理者パスワード変更が終わらない。。
諦めてブラウザ閉じて、再接続してみるとパスワード変更完了のメッセージ、なぜ？
とりあえず良しとする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308893/d53fe372-2ed0-01d7-c208-db1470510020.png)

## 参考サイト
- [Docker Docs - Compose file version 3 reference(ymlファイルの書き方)](https://docs.docker.com/compose/compose-file/)
- [Docker docs - Use volumes(ボリュームの概要について)](https://docs.docker.com/storage/volumes/)
- [Docker Composeでボリューム作成](https://qiita.com/reflet/items/5c0a488494c7d6904084)
- [最新の Redmine 4 を Docker 公式イメージで運用する](https://qiita.com/bezeklik/items/b9d75ee74e0ae4c6d42c)
合併前市町村の財政データを、合併後の数値に一括してまとめるための手順

h21,4,1〜h30,10,1までの変更
これを使えば平成30年度までの段階の最新行政コードに過去の自治体の行政コードをならしてから、必要な実数字の合計値を単一の行政コードにまとめてくれる。

```code.r
install.packages('tidyverse')
library(tidyverse)
#dbとしてダウンロードデータを読み込んでおく
new_admin <- str_replace_all( db$area_code, c(
'40305' = '40231', 
'04423' = '04216', 
'09367' = '09203', 
'03305' = '03216', 
'12402' = '12239', 
'11445' = '11246', 
'43201' = '43100', 
'23304' = '23238', 
'17344' = '17212', 
'11226' = '11203', 
'09321' = '09203', 
'32401' = '32203', 
'03422' = '03209', 
'32304' = '32201', 
'23481' = '23213', 
'23482' = '23213', 
'23483' = '23213',
'01439' = '01472',
'01488' = '01520',
'14209' = '14150',
'42388' = '42202',
'42389' = '42202',
'15441' = '15202',
'20449' = '20202',
'09365' = '09203',
'09366' = '09203',
'09368' = '09203',
'10427' = '10421',
'45362' = '45205',
'45301' = '45201',
'43341' = '43100',
'43385' = '43100',
'11446' = '11232',
'11461' = '11232',
'11462' = '11232',
'22503' = '22221',
'46441' = '46225',
'46442' = '46225',
'46443' = '46225',
'11421' = '11210',
'11424' = '11210',
'11425' = '11210',
'22361' = '22207',
'12325' = '12231',
'12328' = '12231',
'23421' = '23237',
'23422' = '23237',
'23423' = '23237',
'25381' = '25204',
'19361' = '19368',
'19362' = '19368',
'40541' = '40210',
'40543' = '40210',
'40545' = '40210',
'40546' = '40210',
'23603' = '23207',
'35504' = '35203',
'23521' = '23236',
'23521' = '23236',
'25482' = '25203',
'25483' = '25203',
'25501' = '25203',
'25502' = '25203',
'25503' = '25203',
'25504' = '25203',
'40222' = '40230',
'40462' = '40230',
'40463' = '40230',
'20581' = '20201',
'20589' = '20201',
'03487' = '03202',
'01559' = '01558',
'23345' = '23233',
'04603' = '04205',
'10363' = '10202',
'10303' = '10201',
'33201' = '33100'))

temp <- db[, 12]　#ただし、dbの12列目に必要な実データがある場合（地方財政統計調査でDBをAPIからダウンロードして、メタ情報なし、セクションヘッダフラグなしでダウンロードした場合は12列めにvalueが来るので）
temp <- cbind(new_admin,temp) #合併前の数に関して合併した自治体を同一行政コードにして数値を貼り付ける
temp<- temp %>% group_by(new_admin) %>% summarise(sum(value))
 #平成30年以降の行政コードに統一した形で、各自治体を単一の合計値にまとめる。年度別にする場合は、年度のコードを付けた形でデータフレームを分けて、最後にadminをつかって数値の名寄せを行えば単一自治体に対して、年度別に横に並ぶデータが作れる。
```
パッケージマネージャpacmanでデータベースの同期が失敗した場合の解決法

# Debug
pacmanでパッケージ(ソフトウェア)の更新をかけた。

```
# pacman -Syu
```

すると次のようなエラーメッセージが吐かれた。

```
:: Synchronizing package databases...
error: failed to update core (unable to lock database)
error: failed to update extra (unable to lock database)
error: failed to update community (unable to lock database)
error: failed to update archlinuxfr (unable to lock database)
error: failed to update synchronize all databases
```

次のコマンド打てば解決！(2歳児)

```
# rm /var/lib/pacman/db.lck
```

## まとめ
結局pacmanでパッケージの更新をかけるときは、OS単位で?存在しているパッケージの[リポジトリ](https://www.archlinux.org/packages/)を参照してシステム内のデータベースと同期を図ります。この際に生成されるのが上記のファイル`db.lck`であり、通常はpacmanの当該プロセス終了後に自動的に削除されますが、それが何らかの原因により残ってしまった場合、次のファイル作成の際にエラーを生じ、今回のようにパッケージの更新が失敗してしまいます。そのため無事更新するためには、前の更新の際に作成されていた`db.lck`を手動で削除してしまえばいいよ、といったことでした。
素数の列挙

## 概要
素数の列挙に関しては多くのアルゴリズムが考案されていますが、ある自然数が自身以下の素数で割り切れるかを判定することで素数判定を行う実装例を記載します。ナイーブな実装なのでそれなりに低速ですが、大体10^5以下の素数であればこれで列挙できるかと思います。

## 実装例
```python
# 自然数m以下の素数を返す
def prime_numbers(m):
    # 素数を保持するset
    primes = set()

    # 2以上m以下の素数を数え上げる
    n = 2
    while n <= m:
        # 自身より小さい全ての素数で割り切れなければ、素数とみなせる
        if all(n % i != 0 for i in primes):
            primes.add(n)
        n += 1

    return primes
```

## 実行結果
```bash
# m = 100の場合
{2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97}
```

## 参考
[素数列挙について](https://uwitenpen.hatenadiary.org/entry/20111203)
[最速の素数列挙プログラム C#](https://qiita.com/asksaito/items/8fe448d21b394eb35582)
https://projecteuler.net/problem=7
jQueryを書けるようになりたい

## はじめに

デザイナーだけどjQueryを書けるようになりたいのでjQueryについて疑問に思ったことや調べたこと、作ったものの記録をしていこうと思います。

### jQueryレベル
* プラグインを設置するのはできる。
* プラグインをちょっと改造することもある
* if文とかfor文とかはなんとなく分かる。
* かなり昔に素のjavascriptを学習しようとして挫折した。
* プログラム言語についてあまり理解していない。

### そもそも何してる人なの
* 普段はWebと印刷物のデザインをしている。
* HTML,CSS(SCSS)を主に使っている。
【MySQL】CSVインポート　CSVエクスポート　mysqldump

MySQLで、

- CSVインポート
- CSVエクスポート
- mysqldump（書き出し）
- mysqldump（読み込み）

のコマンド、たまに使うけど毎回「なんだっけ、、？」となる上に、同時に叩くことが多いので、一箇所に集約

# CSVのインポート
```sql
load data local infile "ファイル名"
into table テーブル名 
fields terminated by '区切り文字'
optionally enclosed by '囲み文字'
(column1, column2);   # 読み込みたいカラム名
```

以下のようなエラーが出て失敗する場合は、

```
ERROR 1148: The used command is not allowed with this MySQL version
```

`--local-infile=1`をつけてmysqlクライアントを起動すればいい
（参考：[MySQL :: MySQL 5.6 リファレンスマニュアル :: 6.1.6 LOAD DATA LOCAL のセキュリティーの問題](https://dev.mysql.com/doc/refman/5.6/ja/load-data-local.html) ）

# CSVのエクスポート
```sql
select フィールド名
from テーブル名 
into outfile ’出力したいファイル名’ 
fields terminated by '区切り文字'
optionally enclosed by '囲み文字';
```

以下のようなエラーが出て失敗する場合は、

```
ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
```

ローカルのmysqlとかならば以下のような対処で
[[ MySQL ] データをCSVでエクスポートしようとして、secure-file-privに引っかかった件 - Qiita](https://qiita.com/bohebohechan/items/207e87786b1e30f60abe)


# mysqldump（書き出し）
mysqldumpの出力結果は、結局のところそのデータベースやテーブルの状態を再現するための「SQL文」であることを念頭に置く。
オプションは適宜調べる。
よく使うのは、`-d`：定義のみのdump、`-t`：テーブル作成しない、`-n`：DB作成しない、だろうか。

## すべてのDBをdump

```bash
mysqldump -u USER_NAME -p -h HOST_NAME -A -n > OUTPUT_FILE_NAME
```

## DBを指定してdump
```bash
mysqldump -u USER_NAME -p -h HOST_NAME DB_NAME1 > OUTPUT_FILE_NAME
```

複数DB指定したい場合は以下のように（`-B`オプション）

```bash
mysqldump -u USER_NAME -p -h HOST_NAME -B DB_NAME1 [DB_NAME2 ...] > OUTPUT_FILE_NAME
```

## テーブルを指定してdump

```bash
mysqldump -u USER_NAME -p -h HOST_NAME DB_NAME TABLE_NAME > OUTPUT_FILE_NAME
```
複数テーブル指定したい場合は以下のように

```bash
mysqldump -u USER_NAME -p -h HOST_NAME DB_NAME TABLE_NAME1 [TABLE_NAME2 ...] > OUTPUT_FILE_NAME
```


# mysqldump（読み込み）
## bashからmysqlコマンドで
```bash
mysql -u USER_NAME -p -h HOST_NAME DB_NAME < OUTPUT_FILE_NAME
```

## mysqlクライアントが起動している状態でsource
mysqlクライアントをすでに立ち上げている場合だとこっちも便利

```sql
mysql> source OUTPUT_FILE_NAME;
```

# TODO
たいてい毎回こういうコマンドをコピペして微妙に書き換えて実行するので、タイポしたりして失敗してフラストレーション溜まる…
DB名とかテーブル名とか入力させる対話式のシェルスクリプト作るのもありかも。

# 参考
[mysqldumpまとめ - Qiita](https://qiita.com/PlanetMeron/items/3a41e14607a65bc9b60c)
[【MySQL】CSVファイルをインポートするコマンド - Qiita](https://qiita.com/Tamucha/items/c65ae417877ae01b132c)
Bot Builder v4 のデバッグでハマった話

# 1.はじめに
.NET のテンプレートを利用すると簡単にbotを作れるらしいという話を聞いてやってみたが、「デバッグできねー！」という状態に陥ったのでその解決策のメモです。

# 2.環境
  - Windows 10
  - Visual Studio Community 2017 Version 15.9.16
  - Bot Framework v4 SDK Template for Visual Studio (Version 4.5.1)

# 3.Bot用のプロジェクト作成
[Microsoftの公式ドキュメント](https://docs.microsoft.com/ja-jp/azure/bot-service/dotnet/bot-builder-dotnet-sdk-quickstart?view=azure-bot-service-4.0)や[BEACHSIDE様のブログ記事](https://blog.beachside.dev/entry/2018/07/18/190000)を参考にC#のBotプロジェクトを作成します。

# 4.デバッグの実行
プロジェクト作成後、[F5]キーでデバッグ実行すると以下のようなエラーになってしまいます。
![vs_error.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228736/8d663075-9597-67ce-7d8e-5db9405cee26.png)

このメッセージに書いてある通り、Visual Studioの修復を実行しましたが、エラーが消えませんでした。

# 5.デバッグ設定の変更
APS.NETのデバッグの[公式ドキュメント](https://docs.microsoft.com/ja-jp/visualstudio/debugger/how-to-enable-debugging-for-aspnet-applications?view=vs-2019)を参考に以下のようにプロジェクトのデバッグ設定を変更してうまく動くようになりました。

[ソリューションエクスプーラー]上の[プロジェクト名]-[Properties]をダブルクリックして開き、[デバッグ]タブを選択すると以下のような画面が表示されます。
![vs_properties_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228736/4cf17316-bcb0-7165-f434-1943e8365a56.png)

起動を「IIS」に変更します。(以下は変更後の画面)
![vs_properties_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228736/e3411c19-4cbc-fb17-53d6-77fb8553c90f.png)



# 6.デバッグする
上記の設定が完了したら[F5]キーを押してデバッグしてみてください。以下のようなWebページが立ち上がるはずです。
![bot_web.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228736/7d097738-5dd9-cd59-4c5a-5207e7e1b2a6.png)


Bot Framework Emulatorを起動させ、[Open Bot]ボタンを押します。
Bot URLに「<起動したWebページのURL>/api/messages」と入力し[Connect]ボタンを押します。
![bot_emu.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228736/ecb7900a-238f-7658-17dc-7e0b78638cbb.png)

無事接続できるとBotがオウム返ししてくれます。
![bot_emu2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228736/e728de7e-16d1-9e6e-2f86-ea9644edc89b.png)


-------------
以上です。
jupyterで間違って関数消してしまった…！

# こんな方向け
jupyterはとりあえずコードを書き殴るために使っていて、セル実行回数が1000とかいってる
作った関数を間違って消してしまって見れない


# jupyterの機能

タブバーに表示されているEditからUndo cell operationをクリック
セルの内容は変わらずにセル全体に対して行なったコピーや削除だけ戻るので、戻して復元しないか確かめましょう。

![スクリーンショット 2019-10-13 18.12.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223757/43a749c8-c080-a665-b676-197edf5c8942.png)


# python標準ライブラリのinspect

どれだけRedoしても戻らない！という方のうち、こまめに再起動とかリフレッシュしない方でまだ関数が実行できる状態ならpython標準ライブラリで関数の中を見れます。

```
import inspect
print(inspect.getsource(関数名))
```

セルの再起動しちゃうともう二度と帰って来ないのでセルを削除する時はちゃんと考えてから消しましょうね…
Macからラズパイにリモート接続

![起動画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140953/602f6878-4d23-1b62-79bd-0279c34b2889.jpeg)
(久々に起動して喜ぶラズパイの画)

## 概要
毎回やり方忘れるので自分用メモ。
ラズパイにケーブルでキーボードやモニタと繋げて使うことができるけど、結構かさばるし面倒。
自分のPCからリモート接続(SSH接続/VNC接続)する方法について記載する。

#### 動作環境
Raspberry Pi 3 Model B+
MacOS Mojave

## ネットワーク設定
まずはラズパイのネットワークを接続するPCと同じルータに接続して、同じプライベートネットワーク内にする。

#### 確認
とりあえずpingで疎通確認

```
$ ping raspberrypi.local
```

出力結果

```bash
PING raspberrypi.local (192.168.2.103): 56 data bytes
64 bytes from 192.168.2.103: icmp_seq=0 ttl=64 time=2.206 ms
64 bytes from 192.168.2.103: icmp_seq=1 ttl=64 time=3.783 ms
64 bytes from 192.168.2.103: icmp_seq=2 ttl=64 time=2.889 ms
...
```

OK。

## SSH接続
ラズパイのターミナルだけ使いたい場合はこちらを使用。

#### 事前準備
(初回のみ)
ラズパイの初期設定はSSH接続が無効になっているため有効にする。
**左上のメニューアイコン > 設定 > Raspberry Piの設置 > インターフェース** に設定画面がある。

#### 接続する
ラズパイの初期設定において
ユーザー名は **pi**
ホスト名は **raspberrypi**

そのため以下のコマンドで接続することができる。

```bash
$ ssh pi@raspberrypi.local
```

IPアドレスを指定して接続することも可能。

```bash
$ ssh pi@xxx.xxx.xxx.xxx
```

IPアドレスが分からない場合、`$ arp -a`のコマンド打った中にあるリストのどれかなので、全部↑に当てはめて接続できるか試してみる。

パスワードを求められるので、入力すれば接続は完了。
ユーザー名がraspberrypiになっていることを確認する。

```bash
pi@raspberrypi:~ $ 
```


## VNC接続
VNC(Virtual Network Computing)。
ラズパイのOSの画面(GUI)も使いたい場合はこちらを使用する。

#### 事前準備
(初回のみ)
ラズパイ側でVNCサーバーのソフトをインストールする。
今回は**tightvncserver**を利用。やり方はググると出てくるはず。

mac側では **システム環境設定 > 共有 > 画面共有** にチェックをつけ、有効にする。
また、 **アクセスを許可:全てのユーザ** に設定を変更する。

#### 接続する

ラズパイ側で

```
$ tightvncserver
```

のコマンドでVNCサーバーを立ち上げる。
ラズパイ起動時にtightvncserverが立ち上がるように設定することも可能らしい。やったことないけど。

mac側ではVNCクライアントソフトはデフォルトで入っている。
macのFinderを起動してメニューから **移動 > サーバーへ接続**

サーバアドレスの欄に

```
vnc://raspberrypi.local:5901
```

またはIPアドレスを用いて

```
vnc://xxx.xxx.xxx.xxx:5901
```

を入力。
パスワードを求められるので、入力すれば接続は完了。
ラズパイの画面が表示される。

とりあえず本題はここまで。

## 余談
電源はコンピュータからでも問題ないので、PCとラズパイつなぐ電源用のUSBケーブルさえ持っておけば、あとはSSH接続&VNC接続してラズパイの画面を開くことができる。

今回はLANケーブルが家にあったので、ルータとラズパイを繋いでネットワークに繋げた。
Wifi設定は初回のみしてしまえば次からは無線で繋げられる。

LANケーブルがない場合でも、microSDをPCにさすことができれば直接設定を書き込む方法はあるっぽい。
[Raspberry Piの無線LANをmicroSDで設定する - Qiita](https://qiita.com/mascii/items/0d1a280ac58ed8f6f999)
[Raspberry Pi3(ラズパイ3)をキーボードなし/LANケーブルなしで初期設定する - Qiita](https://qiita.com/Videolink/items/d28c1d6378a3d9d3624f)

以下はワイヤレス(Bluetooth)キーボードつなげる場合のメモ。

1. キーボードの電源ON
2. **Fnキー+Bluetooth(＊)キー** を押下
3. ラズパイ画面右上の **Bluetoothアイコン > Add Device > 該当のデバイスを選択 > Pair**

おしまい。
【Rails】renderを使った時のリロード対策

## はじめに
登録画面(new) → 登録処理(create)の遷移のとき
以下の画像のフォームから登録をするときに
バリデーションに引っかかって登録画面に戻り、ページをリロードしたらエラーでた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375365/e2918ded-5321-d9a4-b20a-dc5f9466dd07.png)


原因は登録処理のURLでページをリロードしたため。
renderで登録画面に戻ってもURLは登録処理のままで更新されない。
renderはあくまでもビューを表示するだけっぽい。


## 解決方法
JavaScriptで登録画面を読み込む時にURLを書き換える

```ruby:sample.js
function addToNewUrl() {
  let path = location.pathname;
  let pattern = /^.*\/new.*$/

  // URLが正しければ変更は不要
  if(path.match(pattern)) return;
  
  // URLを変更
  history.replaceState('', '', `${ path }/new`)
}
```

以下のようにして実行

```ruby:new.html.slim
javascript:
  window.onload = addToNewUrl();
```


## まとめ
少しでも参考になれば幸いです。
【iOS】ScrollView上で、UITextFieldのフォーカスを切り替えた際にUITextFieldが隠れないようにする

嵌ったのでメモしておきます。。

# 概要
ScrollView上に複数のUITextFieldが縦に並んでいる画面で、キーボードを表示したままフォーカスしているUITextFieldを切り替える

ScrollViewに触れずに、UITextFieldに対するフォーカスを切り替えられるタイプもスコープ。(キーボード上に戻るボタンと進むボタンが乗ってる、↓のようなToolbarがついててそれでフォーカスを切り替えるイメージ)

![toolbar.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202627/abcd61a3-57c8-69eb-1cf8-ab2c704ce9cc.png)

その際に、フォーカスしているUITextFieldが隠れないようにしたい(当然単にキーボード表示をする際にも隠れて欲しくない)

# 対応内容
キーボードが表示/非表示になる際に、以下のNotificationが飛ぶので、その中でscrollViewのinsetを切り替える事で対応できました。

- keyboardWillShowNotification
- keyboardWillHideNotification

## 実装

```
override func viewDidLoad() {
    super.viewDidLoad()

    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShown(_:)), name: UIResponder.keyboardWillShowNotification, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHidden(_:)), name: UIResponder.keyboardWillHideNotification, object: nil)
}

@objc private func keyboardWillShown(_ notification: Notification?) {
    guard let userInfo = notification.userInfo as? [String: Any],
        let keyboardInfo = userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue else {
        return
    }
    
    // Keyboardの高さ分、scrollViewのbottomに対してinsetsを指定する
    let keyboardSize = keyboardInfo.cgRectValue.size
    let scrollInsets = UIEdgeInsets(top: 0, left: 0, bottom: keyboardSize.height: right: 0)
    scrollView.contentInset = scrollInsets
    scrollView.scrollIndicatorInsets = scrollInsets
}

@objc private func keyboardWillHidden(_ notification: Notification?) {
    // insetsを元に戻す
    scrollView.contentInset = .zero
    scrollView.scrollIndicatorInsets = .zero
}
```

`keyboardWillShowNotification` は名称的にキーボードが表示される時に通知されるように見えますが、
実際はキーボードを表示したまま別のUITextFieldにフォーカスした際も通知されるようです。


そのため、UITextFieldのフォーカスを変更した際に、キーボードのタイプが異なるためにキーボードの高さが変わってしまった場合も再度その高さを取得、Insetsを設定することが可能なため、上記を実装しておけば

- キーボードが表示されるタイミング
- キーボードを表示したまま、別のUITextFieldにフォーカスを変更
    - その結果キーボードの高さが変わる場合も含む

の両方に対して対応できるようでした。

## 嵌った点
最初、keyboardInfoを `keyboardFrameBeginUserInfoKey` から取っていたんですが、
これだとどうもキーボードを表示したままフォーカスを変更した際に、正しくキーボードの高さを取れないようで
フォーカスしているUITextFieldがキーボードに隠れてしまうことがありました。

https://developer.apple.com/documentation/uikit/uikeyboardframebeginuserinfokey
https://developer.apple.com/documentation/uikit/uikeyboardframeenduserinfokey

beginはおそらくキーボードの表示前にキーボードの高さを取っており、
そのためフォーカス変更前のキーボードの高さを取ってしまっていたため、正しくInsetsが更新できていなかったのかなーと思っております😥
キーボードの高さが変わる可能性がある場合はもちろん、そうでない場合もendで取得する方が安全そうですね。。

## まとめ
https://developer.apple.com/library/archive/documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/KeyboardManagement/KeyboardManagement.html
この手法を見つける前にも色々と試したのですが、どれも今ひとつ決まらず、最終的に上記のApple公式ドキュメントのおかげで解決したという...orz
迷ったらまずは公式ドキュメントを当たってみる癖が大事ですね😓
【playfab】クライアントAPIで手持ちのアイテム情報を全部精査

playfab、クラウドスクリプトの方ばっかりいじってたらクライアントAPIの方で少し躓く。
自分の手持ちアイテムとその情報を全て精査する方法で少し詰まったので記載。

プレイヤーの手持ちのアイテムを取得する方法として、PlayFabClientAPI.GetUserInventoryを呼ぶ。その結果が「result」と名前にしたとして…

+ 型はGetUserInventoryResultとなるので他のと間違わないように注意
+ 「result.Inventory」でインベントリ全体の情報
+ Inventoryの中のものは「ItemInstance型」として取得

あとは個々にパラメータを取れた。


```C

    public void getInventoryAll()
    {
        PlayFabClientAPI.GetUserInventory(new GetUserInventoryRequest(), result =>
        {
            foreach(ItemInstance item in result.Inventory)
            {
                Debug.Log(item.ItemId);
                Debug.Log(item.DisplayName);
                Debug.Log(item.CustomData["skillLv"]);  //skillLvというカスタムデータを取得する場合
            }
        }, error => Debug.Log(error.GenerateErrorReport()));
    }


```

GetUserInventoryResultはこちらに情報が。ItemInstance型配列ってのも書いてましたね。。。
https://docs.microsoft.com/en-us/rest/api/playfab/client/player-item-management/getuserinventory?view=playfab-rest#getuserinventoryresult

解決のきっかけになった質問。てかplayfabじゃなくてunityコミュニティにあった。
https://answers.unity.com/questions/994665/accessing-instances-in-object-array-playfab.html
vue.jsのvue-cli 3.0系でプロジェクトを作成して、firebaseにデプロイする

今までやった事のまとめです。

# プロジェクト名を決める

例えばhogehoge01とします。

# 環境整備(PC側)

以下のコマンドを実行し必要なリソースが実行できることを確認する

```powershell
node -v # v10.16.3
npm -v # 6.9.0
vue --version # 3.12.0
firebase --version # 7.5.0
```

vue-cliはnpm install -g @vue/cliでインストール
firebaseはnpm install -g firebase-toolsでインストール
どちらもバージョンが頻繁にアップされるので、作業前に最新版の確認あるいはアップデートを行う。なおこの時点でPC上にフォルダは作成しない。後述のvue-cliを用いたvueプロジェクトの作成タイミングでフォルダが作成される事、各種モジュールは-g を付与してグローバルにインストールを行うため、あらかじめプロジェクト用のフォルダを作成する必要がない事が理由。

なおフォルダが生成され次第、vscodeのワークスペース設定などをしておくとこの後便利。

# 環境整備(firebase側)

[Firebase console](https://console.firebase.google.com/)より新規プロジェクトを作成する。プロジェクト名はhogehoge01。

この時、firebaseのロケーションを指定する事。そうでなければ、後述のfirebase initの際にFirestore,Functionsを有効にするときに、既定のロケーションが指定されていないからエラー、と言われる。

また、空のFirestoreを作成しておかないと、同じくfirebase initの際にエラーと言われる。

# vue-cliを用いてvueプロジェクトの作成

```
vue create [プロジェクト名]
```

vue init [プロジェクト名]は古いのでvue create [プロジェクト名]でプロジェクトを作成します。この際、既定の設定ではなくマニュアル導入を選択しRouterとVuexにチェックを入れる事。

この工程が終わると

```
npm run serve
```

を実行し、http://localhost:8080/ でサイトが確認できるため、念のため確認する。問題なければ

```
npm run build
```
でデプロイを生成しておく。

# firebase initによるfirebase設定追加

```
firebase login
firebase init
```

でfirebaseの設定を行う。なおfirebase init時にはHostingに加えてFirestoreとFunctionsを有効にする。また、パブリックディレクトリの設定をpublicからdistに変更しておくこと。distはnpm run buildコマンド実行時のファイルの公開先であり、これとfirebaseの設定を合わせなければ、vueで作成したプロジェクトをfirebase上で公開することは出来ない。

この設定を忘れても、もう一度firebase initをするか、生成されたfirebase.jsonを編集すれば問題ない。

問題なくコマンドが終了したら、

```
firebase serve
```

で確認ができる。この後、

```
firebase deploy
```

が通れば公開終了。今後は

```
npm run serve
npm run build
firebase serve
firebase deploy
```
でデプロイまで実施する。

# ソース管理

(この手順は必須ではない)

[GitHub](https://github.com/)などにソース管理のためにリポジトリを用意する。なお、readme.mdなど含めてリポジトリを作成すると初回コミットの際に差分エラーが出るので、素の状態で作成する事を推奨。あとはgithubのアナウンスに従ってプッシュ。

```
echo "# [PJ名]" >> README.md
git init
git add README.md
git commit -m "first commit"
git remote add origin https://github.com/[ユーザー名]/[PJ名].git
git push -u origin master
```
C言語の復習（if文）

if文っていうとこれが頭によぎりますｗ
https://www.youtube.com/watch?time_continue=51&v=CvNlpnM79n4
はい、すみません・・・。

では、本題入ります。
if文を書いてて初心者の僕がつまづいた所を書きます。


```c

#include<stdio.h>
int main (void)
{
 int aa;
 printf("数字を入力してね。");
 scanf("%d", &aa);
 if(aa>0)
 if(aa % 2 == 0)
 puts("偶数ですね。");
 else
 puts("奇数ですね。");
 else
 puts("ちゃんと入力しやがれ");
 return 0;
}
```

このような形にすると2で割り切れたら偶数とだして、割り切れなかったら奇数とだして、
もしその数字が数字じゃないものが入力したら入力を促す形のプログラムなんですが、
僕がひっかかったところは、このプログラムをちゃんと｛｝で囲った場合どうなるかってとこです。
そこで出来た回答がこちらです。

```c
#include<stdio.h>
int main(void)
 {
 int aa;
 printf("数字を入力してね。");
 scanf("%d", &aa);
 if(aa>0){
 if(aa % 2 == 0) {
 puts("偶数ですね。");
 }
 else{
 puts("奇数ですね。");
 }
 }else{
 puts("ちゃんと入力しやがれ");
 }
 return 0;
 }
```


どこまでが(aa>0)が必要なのかっていうものが肝でした。
良いエディタならこういうことを考えなくても自動でやってくれそうなんですけどね。
こんなことで僕は半日考えてしまうはめになりましたよｗ

もし、僕のようなことに悩まれた初心者の方の参考になれば良いかなと思います。
でわでわ～ノシ
Wine使いのマカーはCatalinaにしちゃダメ！（非対応）

#先日macOS Catalinaが出たので・・・
「おっ、アップデート出てるやん、したろ」とポチッとした。

##WineでTera Termを使いたかった
ところが動かない。brewでupgradeなどやりつつ実行せど、wine: Bad CPU type in executable。
Tera Term自体は64bit版だ。

#原因
WineはCatalina非対応だったというオチ。
<img width="516" alt="スクリーンショット 2019-10-13 17.23.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507225/50c8d37d-de67-2f65-fd52-d462e8e8b4d3.png">

#教訓
OSのアップデートの際は、影響を確認しましょう。
リスクの洗い出しは仕事じゃなくても大事だよ。
WebXRのARサンプルを動かすまでにやったことメモ

# はじめに
[immersive-webのサンプル](https://immersive-web.github.io/webxr-samples/proposals/)を試したかったのですが、そのままだと動かなかったので、色々やって見たときのメモです。

# localhostで確認できるように準備をする
下記によるとlocalhostでもhttpsでないといけないようなのでlocalhost+httpsの環境を整える必要があります
https://blog.plainteract.net/WebXR-Device-Api-Demo-1/

### 自己証明書作成
下記を参考に自己証明書を作成しました
https://qiita.com/clown0082/items/551d7c081ff6b41b1717

### VSCodeのLiveSeverの設定
LiveSeverを入れてない場合は下記の拡張機能をいれます
https://marketplace.visualstudio.com/items?itemName=ritwickdey.LiveServer

設定は下記の記事のsetting.jsonを参考にしてください(こちらにも自己証明書の作成部分がありますがWindowsでGitBashなどを使っているとパスの解決でこけたりしました)
https://qiita.com/ma2shita/items/297c812a6cd09b5e82c8#settingsjson-%E3%82%92%E6%9B%B8%E3%81%8F

### PCとAndroidを接続する
下記を参考にします
https://developers.google.com/web/tools/chrome-devtools/remote-debugging/?hl=ja

PCからAndroidが検出されてないとなったときはADBコマンドの`adb devices`を実行すると自分はうまくいきました

# ブラウザ設定
WebXRは標準でONになっていないので下記を参考にブラウザの設定
https://qiita.com/arika_nashika/items/e194ede7ed89a7e591a7

# サンプルのソースコードを修正する
ポリフィルをいれる必要があるのでその作業を行うだけです

### 必要なものダウンロード
サンプル本体は下記
https://github.com/immersive-web/webxr-samples

ポリフィルは下記
https://github.com/immersive-web/webxr-polyfill

### 修正手順
* ポリフィル(buildフォルダ)をサンプル本体のほうにコピーする
* VSCodeでサンプルのフォルダを開く(LiveServerを使うので)
* サンプル本体内のhtmlを修正する(proposals/phone-ar.html と proposals/phone-ar-hit-test.html)
headタグの最後に下記を追加

```html
<script src="/build/webxr-polyfill.js"></script>
```

`<script type="module">~</script>`の中の最初の行に下記を追加

```javascript
var polyfill = new WebXRPolyfill();
```

* LiveServerを起動する(このとき127.0.0.1の部分をlocalhostに置き換えてください)
* PCとAndroidを接続してAndroidでURLを開いて動作確認

## 終わりに
とりあえずサンプルが動作するところまでは確認できました。
完全にメモ状態ですのでこの部分どうするの？みたいなのがあればコメントいただければと思います。
【Systematic Trading】 Risk Parity Weight

# Risk Parity
* リングオンリーのRisk Parity(Equal Risk Contribution)ポートフォリオのウェイトを算出
* 過去リターンを用いて推定リスクを算出


```python

# 合計ウェイト＝１
def weight_sum_constraint(x):
    return x.sum() - 1.0

# ロングオンリー
def weight_longonly(x):
    return x

# リスク寄与
def rc(weight, covmat):
    weight = np.array(weight)
    variance = weight.T @ covmat @ weight
    sigma = variance ** 0.5
    mrc = 1 / sigma * (covmat @ weight)

    rc_ = weight * mrc
    rc_out = rc_ / rc_.sum()
    return rc_out

# 目的関数（各構成要素のリスク寄与が同じ）
def riskparity_objective(x):
    variance = x.T @ covmat @ x
    sigma = variance ** 0.5
    mrc = 1 / sigma * (covmat @ x)
    rc = x * mrc
    a = np.reshape(rc, (len(rc), 1))
    risk_diffs = a - a.T
    sum_risk_diffs_squared = np.sum(np.square(np.ravel(risk_diffs)))
    return sum_risk_diffs_squared


def riskparity(covmat):
    x0 = np.diag(covmat)

    constraints = ({'type': 'eq', 'fun': weight_sum_constraint},
                   {'type': 'ineq', 'fun': weight_longonly})
    options = {'ftol': 1e-20, 'maxiter': 800}
    result = minimize(fun=riskparity_objective,
                      x0=x0,
                      method='SLSQP',
                      constraints=constraints,
                      options=options)
    # print(result.success)
    return result.x
```

ウェイト計算例
* インプットデータ
 * df_ret:リターンデータ（dataframe）
 * ポートフォリオ構築に求めるリターン日数：２５２日
 * 時点：2018/12/31

```python
lookback = 252
d = '2018/12/31'
result_weight = {}

ret0 = df_ret[:d][-1 * lookback:]

# 共分散行列
covmat = ret0.cov()

# ウェイトを算出
result_weight[d] = riskparity(covmat)

# dictionary→dataframeにし、列名を整理
DF_weight_port = pd.DataFrame.from_dict(result_weight).transpose()
DF_weight_port.columns = df_ret_set.columns
```

* インプットが共分散行列なので、ヒストリカルリターンからのdf.cov()以外に、Shrinkageなど、工夫を凝らした共分散行列を用いる場合でも、上記プログラムに変更の必要はないはず
* 60/40やその他ポートフォリオ構築方法との比較の実証分析を今後アップ予定。。。
Excel と Azure SQL を使って、業務システムを作成する。(Tips2)

# アカウントの取得画面を作成する
Excel、Access、Azure SQL を使って、クラウドにデータを置いて共有データベースシステムを作成する。

なんだか、もっともらしいこと言ってるけど、どんな手順で開発を進めていくか？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93227/cfe8bd10-2446-67b4-6004-075c5e27ac99.png)

まずは、ユーザー登録用の「アカウント取得画面」を作成する。

(1) 入力項目は、できる限り少なく、メールアドレス、パスワード、ニックネームの3項目にする。
(2) Webサーバーは、Azure App Service を利用する
(3) Webページの CSSフレームワークは、Bootstrap を使ってスマホ対応にする。
(4) Visual Studio Web Form(VB)で Azure SQL と接続してWebページを作成する。

## アカウント取得画面

[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93227/fac2452b-7d4f-dd66-fedb-d65e753c17f5.png)](http://ganso.azurewebsites.net/members/account)


[アカウント登録画面 (ganso.azurewebsites.net/members/account)](http://ganso.azurewebsites.net/members/account)

```vb:account.aspx
<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" runat="server">
  <asp:MultiView ID="MV" runat="server" ActiveViewIndex="0">
    <asp:View ID="V1" runat="server">
    <div class="form-horizontal">
       <h3>アカウント登録</h3>
       <hr />
       <div class="form-group">
         <asp:Label class="col-sm-2" ID="Label2" runat="server" Text="メールアドレス"></asp:Label>
         <asp:TextBox class="col-sm-8 form-control" ID="TxtMail" runat="server" placeholder="exsample@email.com"></asp:TextBox>
       </div>

       <div class="form-group">
         <asp:Label class="col-sm-2" ID="Label1" runat="server" Text="ニックネーム"></asp:Label>
         <asp:TextBox class="col-sm-8 form-control" ID="TxtName" runat="server" placeholder="ニックネーム"></asp:TextBox>
       </div>

       <div class="form-group">
         <asp:LinkButton class="col-md-2 btn  btn-link" ID="BtnCancel" runat="server" PostBackUrl="../Default.aspx">キャンセル</asp:LinkButton>
         <asp:Button class="btn btn-lg btn-primary btn-block" ID="BtnAccount" runat="server" Text="登録する" />
       </div>
    </div>
    </asp:View>
  </asp:MultiView>
</asp:Content>
```

まだ、画面を作っただけで、動作しません。

このあとは、次の手順ですすめます。
(1) 登録したメールアドレスに、仮パスワードを送信
(2) ログイン画面の作成
(3) ログイン画面の認証処理

いろいろな開発手法があるのですが、下記の点を考慮して作成しています。

- シンプルナコード
- VBA と類似したコード
- スマホに対応する


### 開発環境と実行環境
開発は、できる限り無料環境で行う。
Azure SQL データベースは、有料(500円/1ヶ月)になる。

### 私の開発環境
- Windows 10
- Excel 2016
- Access 2016
- Windows Edge / Chrome などのプラウザ
- Visual Studio 2017
- Azure の利用契約

普段は、Access Excel の VBA ばかり記述しているので、Webアプリ言語は苦手です。
Visual Studio なら VB が使えるので、普段と同じような記述ができる。
そう思って、このような環境を選択しました。

### 実行に必要な環境
- Windows 10
- Excel 2007 ～ 2019 のいづれかのバージョン
- Access 2007 ～ 2019 のどれかのバージョン（無料ランタイム版でも可）
- Windows Edge / Chrome などのプラウザ（アカウント登録用）

### 開発の順番
1.アカウントの取得画面
2.Access による汎用データベース
3.Excelでの柔軟な利用方法の提案

#### 関連投稿（Excel と Azure SQL を使って、業務システムを作成する）
(1) [開発宣言](https://qiita.com/muramoto_jp/items/8a1c0a1a00f204caca72)
(2) アカウントの取得画面を作成する
pythonで時間データの処理

#pythonで時間データを1時間ごとにまとめたい
###下準備

```python
import datetime
```

###文字列からdatetimeに①

```python

data['datetime']=datetime.datetime(data['datetime'])
```

###文字列からdatetimeに②

```python

data['datetime']=pd.to_datetime(data['datetime'])
```

###何時か？を取り出す。

```python

data['hour']=data['datetime'].dt.hour
```
###datetimeをtimeに

```python

data['time']=data['datetime'].dt.time
```
###timeに日時(dt1)を加えてdatetimeにする
```python

d1 = datetime.date(year=1, month=1, day=1)
datetime.datetime.combine( d1,data['time'][0])
```

###一時間ごとに区切って数がわかる。
```python

data.groupby(pd.Grouper(key='datetime', freq='1h')).groups
```


##参考
[pandasで日付・時間の列を処理（文字列変換、年月日抽出など）](https://note.nkmk.me/python-pandas-datetime-timestamp/)
[Pythonで経過時間や日時（日付・時刻）の差分を測定・算出](https://note.nkmk.me/python-datetime-timedelta-measure-time/)
[dtの使い方](https://pandas.pydata.org/pandas-docs/stable/reference/series.html#datetimelike-properties)
Djangoでwebサービスを作る3

#モデルを作っていく
※モデルは会員情報などをデータベースに登録する際に必要になるもの。

##projec/\<apprication名>/models.pyをいじる
今回はこんな感じでユーザー情報を作りました。

```
from django.db import models

class User(models.Model):
	name=models.CharField('UserName',max_length=20)
	pass=models.CharField('Password',max_length=20)
```
##データベースに反映させる
ターミナルで以下を実行

```
#Djangoにモデルの作成・変更を伝える
python manage.py makemigrations <apprication名>　
#実際に反映する
python manage.py migrate
```
##projec/\<apprication名>/forms.pyをいじる

```
from django import forms
from .models import User

class UserCreateForm(forms.ModelForm):

	class Meta:
		model=User
		fields='__all__'　#('UserName','Password')
```
##project/\<apprication名>/views.pyをいじる

```
from .forms import <class名>
from django.shortcuts import redirect

def <関数>(request):
	#送信内容を基にフォームを作る
	form=UserCreateForm(request.POST or None)
	
	#method=POST(送信ボタンを押下)時、入力内容に問題がなければ
	if request.method=='POST' and form.is_valid():
		form.save()
		return redirect('<アプリケーション名>:index')
		
	#通常時のページアクセスや入力内容に誤りがあればまたページを表示
	context={
		'form':form
	}
	return render(request,'<アプリケーション名>/login.html',context)
```
テンプレートにcontextを渡す。

##htmlファイルを修正

```
  <form action="" method="POST">     #actionにはデータを格納するURLを指定する
  {{ form.as_p }}　　　　#formnの情報から入力欄を自動で生成(pタグで呼び出す)
  <button type="submit">Login</button>
  {% csrf_token %}                      #攻撃対策
</form>
```
GETはURLに情報を含むもの、POSTは入力内容に情報を含むもの


#おまけ(汎用ビューで作ってみる)
ユーザー登録機能を修正
##projec/\<apprication名>/views.pyをいじる

```
from django.urls import reverse_lazy
from .models import User　　#(models.pyで定義した『User』を持ってくる)

class LoginView(generic.CreateView):　　#generic.CreateViewを継承
	model = User                    #作成したいモデル
        template_name = '<apprication名>/login.html'
	form_class = UserCreateForm　　　#モデルに使うフォーム
	success_url = reverse_lazy('<apprication名>:index')　#データ追加に成功した場合にリダイレクト
```

##project/\<apprication名>/urls.pyをいじる

```
    path('login/', LoginView.as_view(), name='login'), #上で定義したclassを指定
```
#(ちょっとてこずったので詳細ページ作りもまとめます)
まずviews.pyは普通に作成

##project/\<apprication名>/urls.pyをいじる

```
path('detail/<int:pk>/', views.DetailView.as_view(), name='detail')
```
※<int:pk>とは、データの持っているプライマリキーのことです。
　int型の変数pkにキーを格納し、対象となるデータへのアクションをできるようにします。

##htmlファイルを修正
htmlファイルにプライマリキー付きのパスを書く時の記述例です

```
<a href="{% url '<project名>:<表示したいhtmlファイル名(拡張子無し)>' group.pk %}">
```
※ group.pk はgroupのプライマリキーを指す。(groupってなんでしょうか。。たぶんmodels.pyで定義したclass名の全小文字かな?といった感じ)

追加、削除、更新、一覧表示はどれも汎用ビューで簡単に作れます。

##管理画面で実際に登録されたユーザを確認
###スーパーユーザー

```
python manage.py createsuperuser
python manage.py runserver
http://localhost:8000/admin
```
ユーザ名とメアドとパスワードを登録します。

###\<apprication名>/admin.pyをいじる

```
from .models import User

admin.site.register(User) #models.pyで定義した『User』を持ってくる
```

###\<apprication名>/models.pyをいじる
追加。管理画面がわかりやすくなる

```
def __str__(self):
    return self.name　#nameは同ファイル内の変数
```
とりあえずvue-cliを使っているけどrender: h => h(App)って何なん!?

###対象読者
```main.js
new Vue({
  render: h => h(App),
}).$mount('#app')
```
とりあえずvue-cliを使っているけど上記のソースの意味が分かっていない人

##公式ドキュメント見ようぜ(自戒)
[ここ](https://jp.vuejs.org/v2/api/index.html#vm-mount)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466621/89f0de6a-a655-8640-bb99-85178270e67d.png)

vue使い始めの頃はめっちゃ使いましたね。el。
vue-cliではelを使わなくなったので、代わりに.$mountを使って('#app')にマウント(ソースをはめ込み)しますよ！って事。

##('#app')ってどこ?
public>index.htmlを見てください。

```index.html
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
    <title>vue-practice-shop</title>
  </head>
  <body>
    <noscript>
      <strong>We're sorry but vue-practice-shop doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
    </noscript>
    <div id="app"></div>
    <!-- built files will be auto injected -->
  </body>
</html>
```
built files will be auto injectedって書いてありますね。ここにマウントされますよって事。

##ソースでも確認
確かに、index.htmlのbuilt files will be auto injectedコメントの直下にapp.jsというソースがマウントされています。
app.jsというのはapp.vueが変換されたものなので、これは納得ですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466621/586b394f-defb-a96d-f35d-fcb3c6779646.png)

##残りの部分(Vueのインスタンスを作成)

```main.js
import App from './App.vue'

new Vue({
  render: h => h(App),
})
```

始めてみる構文かもしれないですが、これもやっている事としては
>①./App.vueの中身をレンダリング
>②その中身をVueのルートインスタンスにしているだけ

です。

##結局このソースって一言で言うと何してるの？
App.vueをレンダリングして、index.htmlのid=appにはめ込んでるだけ。以上。
ぜひお役に立てば幸いです。
PHP 関数　if / foreach / for

PHPの関数について、特に理解に時間のかかったif/foreach/forforeachについてまとめてみた。

###foreach
配列を反復処理するための便利な方法。

#####書き方は2種類
- foreach (array_expression as $value){
    処理内容     }

fruitの配列を作りひとつづつ表示

```php:コード
$fruits = array("banana","apple","peach");

foreach($fruits as $fruit){
  echo $fruit;
}
```

```php:結果
banana\apple\peach\nec2-user:~/environment/php_practice (master) $
```



- foreach (array_expression as $key => $value){
    処理内容     } 

```php:コード
$colors = [
  "peach"=>"pink",
  "apple"=>"red",
  "grape"=>"purple"
  ];
foreach($colors as $name => $color){
   echo $name, "の色は" ,$color, "です";
}
```
```php:結果
peachの色はpinkですappleの色はredですgrapeの色はpurpleですec2-user:~/environment/php_practice (master) 
```

###for
ループ処理



for (式1; 式2; 式3)｛
　　　　　　　　処理内容　　｝



最初の式(式1)は、ループ開始時に無条件に 評価(実行)される。 
各繰り返しの開始時に、式2が評価され、 その式の値がTRUEが場合、ループは継続され、括弧内の文が実行される。値がFALSEの場合、ループの 実行は終了する。 
各繰り返しの後、式3が評価(実行)される。 


1から10までを順番に表示する。

```php:コード
for ($i = 1; $i <= 10; $i++) {
    echo $i;
}
```

```php:結果
12345678910ec2-user:~/environment/php_practice (master) $ 
```
変化式のところで、i++は、iを1ずつ増加させるということ。
i++は　iに1を足していくということ。
i++」は「i=i+1」と同じなので
2つ飛びで増加させる場合は「i=i+2」と記述する。

補足
上記のコードで結果で合計値を表示したい場合は、

```php:コード
for($i=1; $i<=10;$i++){
   $num+=$i;
}
echo $num;
```
num=num+iと同じ意味

##まとめ

今回は、３つの関数についてまとめてみたが、PHPにはまだまだたくさん関数があるし、
自分でも関数を作ることができるので、そちらについても勉強しまとめていこうと思う。
C++11 アプリに CMake or Meson 既存ビルドツールを使って Qt5 で GUI を追加するメモ

# 背景

* すでに CMake/Meson あたりで CLI C++11 アプリを作っていて, Qt5 を追加したい.
* そんな凝った GUI を作る必要はない(主にデバッグ用に GUI を追加したい)
* imgui とかで UI もいいが, Qt5 も使いたいときがある(フォントのアンチエイリアスや, UI レスポンスの良さ, Webview 使いたいなど).
* Qt Studio とか, MOC コンパイラとか, qmake とか使いたくない
* UI デザイナとか使いたくないし, 使う理由もあまなりない. imgui, Jetpack Compose, Swift UI のように declative に UI を C++ でゴリゴリ記述したい.

## Signal/Slot

Qt5 から, C++11 lambda で signal/slot が記述しやすくなっています.

https://wiki.qt.io/New_Signal_Slot_Syntax

`QObject::connect` で直接記述することにより, Q_OBJECT な class を作る必要もなくなりそうな気がします(-> MOC コンパイルが不要になる)

## UI の記述

.cpp にベタがきします. ImGui を使っている方にはこのほうがやりやすいかと思います.

.ui を実行時に読み込んで GUI を作ることもできます.

https://doc.qt.io/qt-5/designer-using-a-ui-file.html

## Qt

オフィシャルのドキュメントが参考になります.

https://doc.qt.io/qt-5/cmake-manual.html

実務的なアプリの設定としては, Appleseed renderer の Appleseed Studio の設定が参考になります.

https://github.com/appleseedhq/appleseed/blob/master/src/appleseed.studio/CMakeLists.txt

## Meson

Qt5 用の設定がありますので, これを使います.

https://mesonbuild.com/Qt5-module.html

今回は moc の設定などは不要ですが, 必要だったとしてもそれほど手間をかけずに moc 対応できますね.
 
## Prebuilt package

最近の Qt SDK は変なインストーラータイプになり, またパッケージ自体も 1~2 GB と無駄に大きいです.
Linux(Ubuntu)であれば apt で SDK は一応入りますが, Windows では Qt5 SDK 単体が欲しいですね.

Qt5 の必須ライブラリのプレビルドを配布しているのがありますので, こちらを利用しましょう.

https://github.com/martinrotter/qt5-minimalistic-builds

### DLL のコピー

特に(?) Windows の場合, plugin dll などが .exe の場所 or 環境変数で設定されている場所にインストールする必要があります.

https://wiki.qt.io/Deploy_an_Application_on_Windows

windeployqt というツールで, ファイルを一式セットアップしてくれるコマンドがありますが, 

https://doc.qt.io/qt-5/windows-deployment.html

これはコピー元のフォルダはビルド時に固定で引数設定できないため, たとえば 

https://github.com/martinrotter/qt5-minimalistic-builds 

で配布されている qt prebuilt を使おうとしても, 配布物に含まれている windeployqt.exe は動きません.

CMakeList.txt に必要なファイルコピー操作を直接記述するのがよさそうかもです.
以下のような感じで postbuild コマンドで, .dll などコピーできます.

```
if (MSVC)
  file(GLOB QT5_DLLS "${QT5_INSTALL_PREFIX}/lib/*.dll")
  add_custom_command(TARGET example-app
                     POST_BUILD
                     COMMAND ${CMAKE_COMMAND} -E copy_if_different
                     ${QT5_DLLS}
                     $<TARGET_FILE_DIR:example-app>)
endif (MSVC)
```

## まとめ

CMake で既存ビルドツールに Qt5 で GUI を追加することができました.
MOC, UI など使わない形でも UI を追加できました.

## References

* Build with CMake https://doc.qt.io/qt-5/cmake-manual.html

## TODO

* [ ] QML を試す.
* [ ] リソースファイルや, app パッケージングを整備する
シリコンバレーでF8に参加した時の話

先日社内でちょっとした勉強会をした時のスライドですが、シェアします

[SpeakerDeck](https://speakerdeck.com/yutafujii0/f8-2019nican-jia-sitasirikonbarefang-wen-falsegan-xiang)


シリコンバレーに訪れて最も驚いたのはF8ではなく現地でのふとした出会いでした。
Airbnbでシェアハウスに泊まったんですが、
そこに４０代のおばさんがいたんですよね。PCではソリティア開いてました

夜そのおばさんはタバコ吸いながら、「君はプログラマーなんだ。何の言語？」と聞いてきます。
知らないかもだけどRuby on Railsと言うやつですと回答すると、

「知ってるわよ。私は今Bootstrapやってるわ。HTML, CSSをやってRailsを書いて、今それらをintegrateしているこのフレームワークがとてもmake senseだと思うの。これ終わったらインターンとして仕事を紹介してもらう予定よ」

と言うのです。それだけじゃなく

「Pythonもここらの人はやってるわ。Andrew Ngの講義も受けてたんだけど、流石にあれは途中で止まってるわ」

と。

日本だと知らない人も多いですが、Andrew NgのMachine Learning講座はMLやる人なら誰でも知ってる最も有名なビデオです（CouseraでStanfordの講義として開講。ちなみに僕も修了しましたが8,000円程度なのにめちゃくちゃ役に立ちます。初期的なMLのプロマネくらいにはこれで十分なくらい）

[Cousera > Machine Learning by Stanford](https://www.coursera.org/learn/machine-learning)

本業の生業でもない４０代の人がこのレベルでIT知識を持っていることに驚愕してしまった瞬間でした。
この部分にシリコンバレーと日本の最も大きな差を見た気がしました。

ではまた。
python3とSeleniumをつかってchromeを立ち上げる方法

# python3とSeleniumをつかってchromeを立ち上げる方法

selemiumとpython3を使った方法

## インストール

- Python 3系

[Python 3　public](https://www.python.org/downloads/windows/)
[インストール解説サイト](https://www.python.jp/install/windows/install_py3.html)
※Pathに追加しよう

- Selenium_ブラウザを操作するライブラリ

[PythonでSeleniumを操作する](https://kurozumi.github.io/selenium-python/index.html)

```:cmd
pip install selenium
```

※Seleniumサーバーのダウンロードは不要

## chromedriver.exe　chromeドライバーのインストール

[ChromeDriver - WebDriver for Chrome](https://chromedriver.chromium.org/downloads)

- 自分のブラウザのバージョンに合わせてダウンロードする
- 設定＞ヘルプ＞chromeについて
- windowsの場合chromedriver_win32.zipをダウンロードする
- エラーで使用できなくなったら新しいものに更新すること

## サンプルコード01

```python:sample.py
from selenium import webdriver

def sample(d):
    d.get('https://www.google.com')


if __name__ == '__main__':
    """
    コマンドラインからの呼出し
    """
    d = webdriver.Chrome(executable_path='chromedriver.exe')
    sample(d)

```

実行方法

```:cmd
python sample.py
```

## サンプルコード02

```python:

# タイムアウトとクッキー削除
# - dはWebドライバのインスタンス
# - 画面表示するまでに時間がかかるものはタイムアウトを長くしておく必要がある
# - クッキーを削除すると、複数画面で別のユーザでログインなどが可能
d.implicitly_wait(60)
d.delete_all_cookies()

# ボタン押下_JavaScriptでクリックイベントを操作している時はこれで押下
btn = d.find_element_by_id("btn_id") #ボタンのIDを取得
d.execute_script("arguments[0].click();", btn) #ボタンを押下

# 入力項目に文字を入力する
name = d.find_element_by_id("name_id")
name.send_keys("名前")

```
自宅のTime capsule(Airport Express/ Extreme)にSSH経由で接続する方法

# 背景
うちではApple Time capsuleをGateway RouterとしてISPとのPPP接続、WiFi routerとして利用している。自宅サーバ用にいくつかのportをforwardしているが、それはいつも自宅環境內部からAirport Utilityを利用して実施していたが、自宅外部からこれを実施するのに少し検索したので備忘としてまとめておく

(全く知らなかったがAppleってもう[WiFi router作るのやめたんだって](https://9to5mac.com/2018/04/26/apple-airport-cancellation/)ね。。)

# やり方
## 前提
自宅環境に外部からSSH経由でアクセスできるServerが存在している(こいつをSSH port forwardingの踏み台にしてTime capsuleにアクセスする)

## 手順
1. `ssh -L 5009:<Time capsule IP>:5009 <自宅踏み台サーバIP>`
2. `AirPort Utility`を開く
3. File -> Configure Other. IPには`127.0.0.1`を指定. PasswordにはRouterのPasswordを指定

# 参考
https://medium.com/@sdenike/configure-your-remote-airport-extreme-via-ssh-tunnel-bfdb04db2bbc
３慣性モデルで工作機械の制御系を設計する(1)モデル定義（リライト）

## はじめに
最初の記事はわかりにくいと感じたので、書き直すことにしました。
回転系と直同系の変換とか、余計な要素が入っているので、無駄に難しくなってる感じがしたのです。

今回の記事では、「セミクローズドフィードバック」の制御系について書いていこうと思います。

工作機械は加工対象を工具で削るものがほとんどです。工作機械を大きなロボットアームとすると、先端は工具が占有しているので、位置センサーに類するものは搭載できなくなります。なので、先端部にはセンサーがなくて、途中のどこかに位置センサーを置いた制御系を考えます。
![IMG_5995.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211702/00c55bea-41cd-1942-729e-84789f6c193a.jpeg)
図1　1軸のモデル
こんな感じです。位置センサーはM2にあります。こういう絵でかくと倒立振子のようですが、
同様にM2を動かして、M3が思った位置に移動するように制御します。

そんなわけで、「フルクローズドフィードバックだ！」と言っているものでも、実際には工具やらロボットハンドやらの乗ってる部分とフィードバックセンサの乗ってる部分が完全に一致することはないので、上記のような制御系になります。

## 制御対象
まずは制御対象がどんな運動方程式になるか、考えてみましょう。3慣性系なので以下の図のような形になります。

![674AFD47-D20E-40A5-B234-3E981C13304D.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211702/d0d13e46-194c-b185-2da4-947c138865ab.jpeg)
図2 3慣性モデル

M1からM3まで3つの慣性があります。
M1はモータの回転子に相当する部分です。モータが発生する力をfとします。モータにエンコーダがついていればx1は観測できます。

M2はモータの出力軸から位置センサーを取り付ける部品までの間の伝達関数を1つの慣性で表しています。位置センサーがあるので、x2は観測できます。

M3はセンサがないので、シミュレーションでは位置がわかりますが、実際は工作機械の加工物の品質でしかわかりません。

この系の特徴は以下のとおりです。
- M1に力を与えて制御する
- M3の位置が位置司令と一致するようにする
- M3は観測できない
- M2の位置は観測できる
- M1の位置は観測できる
- kxxはバネ係数
- Dxxは粘性係数

この3つの慣性をバネ要素Kxxと粘性摩擦Dxxで接続したものになります。

## 運動方程式
続いてM1からM3の質量に対する運動方程式を立てます。

``` math
\begin{align}

\frac{d^2x_1}{dt^2}-D_{12}(\frac{dx_1}{dt}-\frac{dx_2}{dt})-K_{12}(x_1-x_2)&=f(t) \;(1)\\

\frac{d^2x_2}{dt^2}-D_{12}(\frac{dx_2}{dt}-\frac{dx_1}{dt})-K_{12}(x_2-x_1)&=D_{23}(\frac{dx_2}{dt}-\frac{dx_3}{dt})+K_{23}(x_2-x_3) \;(2)\\

\frac{d2x_3}{dt^2} &= D_{23}(\frac{dx_3}{dt}-\frac{dx_2}{dt})+K_{23}(x_3-x_2) \; (3)\\
\end{align}

```

## 実数値の定義
変数の値を決めます。
実際の値として取れるのは質量のMxだけです。KxxとDxxは実験的に求める必要があります。

シミュレーションやらで数値解析をするために値を定めます。
M1 = 0.5 [kg]
M2 = 100 [kg]
M3 = 40 [kg]
K12 = 0.9
K23 = 0.6
D12 = 0.1
D23 = 0.05 

## まとめ
今回は運動方程式と実数値の定義をしました。
次回は状態方程式を作ります。

## 参考文献
野波健蔵　編著　「制御理論の基礎」　東京電機大学出版局