OmniAICreator/Qiita-1.07M huggingface dataset:
NuxtJS+TypeScriptの開発記録 (3) Vueコンポーネントのテスト時エラー

[前回](https://qiita.com/noonworks/items/a8396e947580165b2934)までで環境構築が済んだので開発を進めていたが、テストで妙なエラーが出るようになった。

```
モジュール '@/components/Counter.vue' が見つかりません。
```

![VSCodeのエラー画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171645/758fe33d-01e7-5ac9-718f-1e933d9d7813.png)

パスにコンポーネントは存在しているし、Nuxtのテストサーバー上で問題なく動作している。また、コンポーネント以外の（モデルクラスなどの）テストは問題ない。

## 先に結論

1. テストのファイルを`Counter.spec.vue`に変更
2. テストのファイルをVueのSFCに変更
3. Jestの設定変更

## 原因（推測）

Jestの設定で、以下のように`transform`を指定している部分がある。

```json:package.json（抜粋）
"jest": {
  "transform": {
    "^.+\\.ts$": "ts-jest",
    ".*\\.(vue)$": "vue-jest"
  }
}
```

テストファイル`Counter.spec.ts`のエラーは

1. `.ts`なので`ts-jest`で処理される
2. `.vue`ファイルを`import`しようとする
3. `ts-jest`が`.vue`ファイルをインポートできない

という流れなのではないか？

（[前々回](https://qiita.com/noonworks/items/78b2b520e3cd2ad80ebf)で環境を作ったばかりのとき、エラーは起きなかった。その後`vue-property-decorator`を使ってクラススタイルで書くようになってから、このようなエラーが起こるようになった気がするが、関係あるのだろうか……？）

## 対策

原因が推測通りなら、**テストファイルも`vue-jest`で処理されるようにしてしまえばよい**はずである。

`Counter.spec.ts`のファイル名を`Counter.spec.vue`に変更する。それだけだと文法エラーで怒られるが、以下のように`script`タグで囲ってやればOK。

```vue:Counter.spec.vue
<script lang="ts">
import { mount } from '@vue/test-utils';
import Counter from '@/components/Counter.vue';

describe('Counter', () => {
  test('is a Vue instance', () => {
    const wrapper = mount(Counter);
    expect(wrapper.isVueInstance()).toBeTruthy();
  });
});
</script>
```

デフォルトだと`.vue`はテストファイルと認識されないため、Jestの設定を変更する。

```json:package.json（抜粋）
"jest": {
  "testRegex": "(/__tests__/.*|(\\.|/)(spec))\\.(vue|ts)$"
}
```

Jestの`textRegex`のデフォルト値`(/__tests__/.*|(\\.|/)(test|spec))\\.[jt]sx?$`を`*.spec.ts`と`*.spec.vue`が該当するように変更した。

これでVSCode上のエラーも実行時のエラーも消え、無事にテストできるようになった。
CakePHPのビルトインWebサーバー起動出来ない時はこれかも！

#はじめに
出来たことをすぐ忘れてしまうので書かせてください。:bow:
`$`はコマンドの前に書いてあるだけなので打たないでください。:bow:
#これしたい
CakePHPのビルトインサーバー起動したい！
`$ php ./bin/cake.php server`
とか
`$ bin/cake server`
いうコマンドの実行

#エラー例

```
PHP Fatal error:  require(): Failed opening required '/Users/***/***/******/mycakeapp/vendor/autoload.php' 
....一部省略....
bin/cake.php on line 5
```
:frowning2:binフォルダのcake.phpの5行目にvendorフォルダにあるautoload.phpを読み込みたいって書いてあるのに読み込めません
:relaxed:ないもん！インストールでつまづいたのに強行突破しようとして！:imp:


```
Problem 1
....一部省略....requires ext-intl ....一部省略....
```
:frowning2:intlありません
:relaxed:ないもん！

#解決(!大事！)
私は`intl`が入れば無事に出来ました。
段階をおって説明します。
ちなみに`intl`入れたらcakePHPのプロジェクトも入れなおしてください。
入れなおしてターミナルも再起動した方がいいかと思います。

####intlってなに？
:relaxed:国際化用拡張モジュールです。詳細は以下URL↓
https://www.php.net/manual/ja/intro.intl.php

####intlってどうすれば入れられるの？
:relaxed:PHP 5.3.0 以降に勝手に入っているからそれ以降のPHPを入れればいいの！詳細は以下URL↓
https://www.php.net/manual/ja/intl.installation.php

####macのHomebrewで入れたいのどうすればいいの？
:relaxed:PHP 5.3.0 以降入れればいいの！詳細は以下URL↓
https://qiita.com/Yorinton/items/67e377406fa2a55dbb87

:relaxed:もう少し詳しく説明するね！
`$ php -m | grep intl`
ってやって`intl`が入っていないだろうから入れるの。

:relaxed:[PHP](https://www.php.net/)みて最新何があるかなって見るの。PHP 7.2.26 Releasedっとか書いてあったので以下うつの
`$ brew install php@7.2`

:relaxed:終わったら使えるようにパス通すように以下うつの

```
$ echo 'export PATH="/usr/local/opt/php@7.2/bin:$PATH"' >> ~/.bash_profile
$ echo 'export PATH="/usr/local/opt/php@7.2/sbin:$PATH"' >> ~/.bash_profile
$ source ~/.bash_profile
```

:relaxed:入ったかな？って確認するの`intl`って出てきたらOKなの！
`$ php -m | grep intl`


#最後に
ちゃんと理解して進まないとほんとダメですね(/ω＼)
Apacheでアクセスログを取ってみる。

※MacOS
#Apacheってなに
**Webサーバのソフト** のこと
HTMLや画像、動画などの静的コンテンツを返してくれるもの

# 今回使用するファイル

```
Apache_Test
  ├── app.js
  ├── node_modules
  │   └── たくさんあるから書かない 
  ├── package.json
  └── httpd.conf 
```

# Installation
```
$ npm init -y
$ npm i express fs morgan
```

# 実際にやってみる
##処理内容

```app.js
const app = require('express')()
const morgan = require('morgan')
const fs = require('fs')
const port = process.env.PORT || 8080

let accessLogStream = fs.createWriteStream(__dirname + '/access.log', {flags: 'a'})
app.use(morgan('combined', {stream: accessLogStream}))
app.get('/', function (req, res) {
  res.send("Hello Node.js!")
})
app.listen(port, ()=> console.log("Port number is "+ port))
```
##走らせる

```
$ node app.js
Port number is 8080.
```

##ローカルサーバにアクセス
`localhost:8080`
![スクリーンショット 2020-01-03 2.39.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520523/1bb3ec74-7608-a3d0-99e1-9ec23a3868c8.png)

このように app.js で指定した文言が表示されていればアクセスは成功

#アクセスログ取得
今回設定したポート番号へのアクセスを計測する。
## httpd.confの設定

```config
NameVirtualHost *:8080
Listen 8080
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"
```
このconfigファイルではログの出力形式を指定することができる。

今回は　`%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"`

```
%h   リモートホスト名
%l   クライアントの識別子
%u   認証ユーザー名
%t   リクエストを受信した時刻
%r   リクエストの最初の行
%>s  最後のレスポンスのステータス
%b   HTTPヘッダを除くレスポンスのバイト数
%{Referer}i     サーバが受信したリクエストヘッダのReferer
%{User-Agent}i  サーバが受信したリクエストヘッダのUser-Agent
```
とする。

##もう一度走らせる

```
$ node app.js
Port number is 8080.
```

##もう一度ローカルサーバにアクセス
ファイル構造を確認してみると、、、 `access.log`というファイルが吐き出されているはず！

##access.logの確認
httpd.conf で指定した通りにアクセスログが吐き出されている。

#終わり
今回使用したコードは[こちら](https://github.com/taiga248/qiita/tree/master/Apache_Test)
GitでCommitしたら結月ゆかりに褒めてもらう

成果を出したのに褒めてもらえないのは悲しいので，結月ゆかりさんに褒めてもらうことにしました．
内容としては，Gitのコマンド拡張とPowerShellのコマンドを用いて，Gitのcommit後に音声を再生させます．

# 出来たもの
<blockquote class="twitter-tweet" data-partner="tweetdeck"><p lang="ja" dir="ltr">コミットしたら褒めてもらいたいからゆかりさんに褒めてもらった <a href="https://t.co/UOfv9LiRuz">pic.twitter.com/UOfv9LiRuz</a></p>&mdash; Acon (@AconCavy) <a href="https://twitter.com/AconCavy/status/1212768042716811264?ref_src=twsrc%5Etfw">January 2, 2020</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# 環境および素材
- OS: Microsoft Windows 10 Home version 18363
- Git: version 2.24.1.windows.2
- 音声ファイル

# 作り方
Gitのコマンド拡張を作り，Gitのcommitの後にPowerShellのスクリプトから音声を再生させるスクリプトを実行します．

Gitのコマンド拡張については、[Gitオリジナルのコマンドを作成する](https://qiita.com/icoxfog417/items/1d3ccec32d32bdaadc92)の記事を参考にしました．
Windowsの場合，`C:\Users\YourAcount\bin`を作成し，このフォルダに対して環境変数のPathを指定する必要があります．
その後，`bin`フォルダの中に`git-ycommit`というファイルを作成し，以下を実装します．

```sh:git-ycommit
#!/bin/sh
# git commitのコマンドに引数をそのまま渡す
git commit "$@"

# D:\Hoge\Music\good_commit_Yukari.wavのところに音声ファイルのパスを指定します．Cドライブじゃなくても動作します．
powershell -Command "(New-Object Media.SoundPlayer \"D:\Hoge\Music\good_commit_Yukari.wav\").PlaySync();"
```

# 使い方
gitのリポジトリが存在する場所にて，`commit`コマンドの代わりに`ycommit`コマンドを実行すると，gitのcommitの後に指定した音声ファイルが再生されます．
例えば，`git ycommit -m "HogeHoge"`

# 補足
今回はVOICEROID2 Editorから生成した音声ファイル(.wav)を使いましたが，音声ファイルならば再生できるはず(未検証)．
ガツガツ進捗を生んで褒めてもらいましょう．
M5StickC +PIR HATで動体検出してAmbientに書き出す


[地味すぎてわかりづらいおうちハック](https://note.com/sitopp/n/n7bdf82ec31d6)、6日目です。
コードがあるので今日はqiitaに書きます。

今日の分は「何かに使った」という形に至らなかったのですが、パーツとして後々使えそうなので、忘れないように書き留めておきます。

なお余談ですけれども、秋葉原の千石電商のM5コーナーに寄るたびに何か買っていたところ、先日ついにすでに持ってるHATの2個目を**間違えて**買ってしまいました。
300円ちょっとだから別にいいや、という感覚でよく見ずに。。。
ブックオフで**ゴルゴ31の未読巻をゲットしたと思ったら、すでに持ってるやつだった**、という現象によく似ていますね！(^o^) ほんまや！

## 作ったもの

人感センサーを使い、近くで何かが動いたら、
Ambientに書き出してグラフ化する。

## 部品、開発環境

部品：
[M5StickC](https://www.switch-science.com/catalog/5517/) ¥1980
[M5STickC用PIR Hat (AS312搭載)](https://www.switch-science.com/catalog/5756/) ¥286

開発環境：
Mac Book Air 11-inch (Mac OS = High Sierra )
Arduino IDE 1.8.9


## 作り方

1. Ambientのアカウントを作成する
[（参考：Ambientを使ってみる）](https://ambidata.io/docs/gettingstarted/)
2. M5StickCの開発をするためのArduino IDEのセットアップ
  [（参考にさせていただいたサイト「くらつきねっと」様）](https://kuratsuki.net/2019/07/m5stickc-%E3%81%A7%E9%96%8B%E7%99%BA%E3%82%92%E8%A1%8C%E3%81%86%E3%81%9F%E3%82%81%E3%81%AE-arduino-ide-%E3%81%AE%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97/)

3. Arduino IDEにAmbientのライブラリをインストール
  [（Ambient公式ブログを参考に）](https://ambidata.io/docs/esp8266/#library_import)
4. M5StickCにコードを書き込む
Arduino IDE＞ファイル＞スケッチ例＞M5StickC > HAT > PIR のコード
+
Ambient公式ブログの[「M5StickCで小型環境センサ端末を作る」＞「Wi-Fi に接続して、データをクラウドに送信する」](https://ambidata.io/samples/m5stack/m5sitckc/)
を参考に書きました。

```PIR.ino
#include <M5StickC.h>
#include "Ambient.h"

#define uS_TO_S_FACTOR 1000000  /* Conversion factor for micro seconds to seconds */
#define TIME_TO_SLEEP  1       /* Time ESP32 will go to sleep (in seconds) */

WiFiClient client;
Ambient ambient;

const char* ssid = "自分の使うWifiのSSIDをここに書く";
const char* password = "上記のパスワードを書く";

unsigned int channelId = 100; // 自分のAmbientのチャネルIDに置き換える
const char* writeKey = "abcdefgh"; // 自分のAmbientのライトキーに置き換える


void setup() {
  // put your setup code here, to run once:
  M5.begin();
  M5.Lcd.setRotation(3);
  M5.Lcd.fillScreen(BLACK);
  M5.Lcd.println("PIR TEST");

  pinMode(36,INPUT_PULLUP);
}

void loop() {

  M5.Lcd.setCursor(60, 20, 4);
  M5.Lcd.println(digitalRead(36));
  
  WiFi.begin(ssid, password);  
  while (WiFi.status() != WL_CONNECTED) {  
    delay(500);
    Serial.print(".");
  }
  Serial.print("WiFi connected\r\nIP address: ");
  Serial.println(WiFi.localIP());

  ambient.begin(channelId, writeKey, &client); // チャネルIDとライトキーを指定してAmbientの初期化

  // 人感センサーの値をAmbientに送信する 
  if (digitalRead(36) == 1) {
    ambient.set(1,digitalRead(36));
  }

  ambient.send();

  esp_deep_sleep(TIME_TO_SLEEP * uS_TO_S_FACTOR); 

}
```



## 動作状況

<a href="https://youtu.be/4n_DNEzvdHk">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173392/8b6921c2-4019-3f6f-f6a0-5e5b763ebf36.png" width=50%>
</a>

Ambientに書き出したグラフ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173392/1a3fb076-774e-3744-5347-233e19801f30.png)

1=周囲に動くもの有り
0=なし


# 気づき

Ambientに書き出す代わりに、IFTTTのwebhookをリクエストしたり、MQTTのパブリッシャーを叩くと、いろんなアクションに繋げられそう(^o^)

今日はここまで。明日は技術書典8のvoiceflow本の原稿に専念するため、「年末年始 #地味すぎてわかりづらいおうちハック」連続投稿は一旦おやすみしますー。
Laravel6 備忘録 −ユーザー認証(Auth)−

# ユーザー認証

Laravel6からはLaravel5.9以前から使えていた```php artisan make:auth```コマンドが使えないため、以下の手順で設定する


## 環境

||バージョン|
|:-----:|:-----:|
|PHP|7.2.9|
|Laravel|6.8.0|
|Node|8.11.4|
|npm|6.4.0|


```terminal:terminal
## phpのバージョン
vagrant@homestead:~/code/myapp$ php -v
PHP 7.2.9-1+ubuntu18.04.1+deb.sury.org+1 (cli) (built: Aug 19 2018 07:16:54) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.2.9-1+ubuntu18.04.1+deb.sury.org+1, Copyright (c) 1999-2018, by Zend Technologies
    with blackfire v1.22.0~linux-x64-non_zts72, https://blackfire.io, by Blackfire

## laravelのバージョン確認
vagrant@homestead:~/code/myapp$ php artisan --version
Laravel Framework 6.8.0

## nodeの存在確認
vagrant@homestead:~/code/myapp$ node -v
v8.11.4

## npmの存在確認
vagrant@homestead:~/code/myapp$ npm -v
6.4.0
```


## 手順
vagrantでsshログインしてアプリケーションのルートフォルダへ移動

laravel作成時のマイグレーションファイルをmigrateする
(auth用のuserテーブルのマイグレーションファイルはすでに作成されている)

```terminal:terminal
vagrant@homestead:~/code/myapp$ php artisan migrate
```

パッケージの```laravel/ui```をcomposerで追加する

```terminal:terminal
vagrant@homestead:~/code/myapp$ composer require laravel/ui --dev
```

vue,react,bootstrapから利用するものに合わせてインストールする

```terminal:terminal
## 認証機能を利用する場合は--auth必須
## 認証機能を利用しない(単純にUIにvue,react,bootstrapを利用したい場合)は--authは不要

## vueの場合
vagrant@homestead:~/code/myapp$ php artisan ui vue --auth

## reactの場合
vagrant@homestead:~/code/myapp$ php artisan ui react --auth

## bootstrapの場合
vagrant@homestead:~/code/myapp$ php artisan ui bootstrap --auth
```

これで```package.json```に指定したものが追加される

```json:package.json
{
  "devDependencies": {
        "axios": "^0.19",
        "bootstrap": "^4.0.0",
        "cross-env": "^5.1",
        "jquery": "^3.2",
        "laravel-mix": "^4.0.7",
        "lodash": "^4.17.13",
        "popper.js": "^1.12",
        "resolve-url-loader": "^2.3.1",
        "sass": "^1.20.1",
        "sass-loader": "7.*",
        "vue": "^2.5.17", // 追加された
        "vue-template-compiler": "^2.6.10" // 追加された
    }
}
```

npmで必要なパッケージをインストールする

```terminal:terminal
vagrant@homestead:~/code/myapp$ npm install
vagrant@homestead:~/code/myapp$ npm run dev
```

完了

# 注意

導入以前に、デフォルトで作成されている```resource/js/app.js```や```resource/sass/app.scss```を移動していたり削除していたりすると、上記作業中にエラーが発生する
これらはvue,react,bootstrapを導入する際に```resource/sass/app.scss```,```resurece/js/app.js```が必須ファイルであるため
【SQL】メモ２(データ挿入(INSERT)、データ削除(DELETE)、テーブル削除(DROP))

###0.目的
SQL構文の忘却防止のため。


###１．データの新規登録
*__形式:
INSERT INTO テーブル名(項目名1,,,項目名N) VALUES(値1,,,値N);__*

```sql
-- normalタイプで名前がディモルフォドン、n_src1,n_src2がともに0のものを新規登録
INSERT INTO tbl_dino(dname0,type0,n_src1,n_src2)
 VALUES('ディモルフォドン','normal',0,0);
```

```sql
-- ディモルフォドンが登録されているか確認
SELECT*FROM tbl_dino WHERE dname0='ディモルフォドン' and type0='normal';
```

|id|dname0|type0|n_src1|type1|n_src2|type2|
|---|---|---|---|---|---|---|
|25|ディモルフォドン|normal|0||0||

###2．データ削除(DELETE)

```sql
-- id=25を削除
DELETE FROM tbl_dino WHERE id=25;
```
####確認
```sql
-- ディモルフォドンが登録されているか確認
SELECT*FROM tbl_dino WHERE dname0='ディモルフォドン' and type0='normal';
```
####結果
__Result: 0 rows returned in 5ms__

##3．テーブル削除(DROP)
__形式:__
*__DROP TABLE テーブル名;__*


__テーブルの内容確認__

```sql
SELECT * FROM tbl_type;
```

|id|type0|
|---|---|
|1|normal|
|2|rare|
|3|epic|
|4|regend|
|5|unique|

####上記テーブルを削除
```sql
DROP TABLE tbl_type;
```

###確認
```sql
SELECT * FROM tbl_type;
```
__結果__
*__Result: no such table: tbl_type
At line 1:
SELECT * FROM tbl_type;__*
JavaのHashMapのソースを読む

いい加減ハッシュテーブルは実装レベルで理解しくべきということで，ざっと読んだときの気付きをメモしておく。10年前は読めなかったけど，今回はさくっと読めた。(読んだのは，Adopt Open JDK 13)

テーブル内部では以下のクラスでデータが管理されていた。要するにClosed Addressingで実装されている。

    static class Node<K,V> implements Map.Entry<K,V> {
        final int hash;
        final K key;
        V value;
        Node<K,V> next;
        /** 中着 */
    }

余談だが，Eclipse Collection(10.1)のUnifiedMapもOpen Addressingだったが，こちらはポインタでチェインせずに配列でチェインしていた。Open Addressingのようにメモリのキャッシュを効かせたいことが理由の様子。

ハッシュ値の計算。
要素数が少ないときには，下位ビットだけで格納場所が決まってしまうことを避けるため，上位ビットも使えるように下位16bitに上位16bitのXORをとっていた。

    static final int hash(Object key) {
        int h;
        return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
    }

ハッシュテーブルの引き方。
テーブルの要素数nから1引いたものとAND演算した値をindexとしていた。

    if ((p = tab[i = (n - 1) & hash]) == null)
        tab[i] = newNode(hash, key, value, null);

ちなみにテーブルの要素数(上記のtab.length)数は，2の倍数になっているようで，そこから-1すると全てのビットが立つので，下位ビットを残す演算になっている様子。
Google Apps Script でのJestテストコードの書き方

# 前提

開発環境の構築や設定は、以前に投稿した記事を参考にして構築されているものとします。
[Google Apps Script の開発環境構築方法](https://qiita.com/winuim/items/8a3f025f3bba57cbad87)

# DocumentAppを利用したサンプルコード

```typescript:example.ts
// Google Apps Script Services
function createDocument(): string {
  const doc = DocumentApp.create("Hello, world!");
  doc
    .getBody()
    .appendParagraph("This document was created by Google Apps Script.");
  return doc.getId();
}

export { createDocument };
```

# jest.config.jsの設定
jest.config.jsを下記のように変更します

```javascript:jest.config.js
module.exports = {
  preset: "ts-jest",
  testEnvironment: "node",
  globals: {
    Logger: {},
    DocumentApp: {} // <- 追加
  }
};
```

# テストコード(パターン1)
クラスを定義せずに直接mock化する方法

```typescript:example.test.ts
import { createDocument } from "../src/example";

describe("example.ts test", () => {
  test("createDocument", () => {
    DocumentApp.create = jest.fn().mockImplementation(name => {
      return {
        getBody: jest.fn().mockImplementation(() => {
          return {
            appendParagraph: jest.fn().mockImplementation(text => {})
          };
        }),
        getId: jest.fn().mockReturnValue("1234567890")
      };
    });
    const expected = createDocument();
    expect(expected).toBe("1234567890");
  });
});
```

# テストコード(パターン2)
mockクラスを定義してmock化する方法
※ファイルへの追記処理をローカルファイルへ追記するエミュレート処理も追加

```typescript:example.test.ts
import { createDocument } from "../src/example";
import fs = require("fs");

class BodyMock {
  _doc: DocumentMock;
  constructor(doc: DocumentMock) {
    this._doc = doc;
  }
  appendParagraph(text: string): void {
    fs.appendFile(this._doc._name, text, err => {
      if (err) {
        throw err;
      }
    });
  }
}
class DocumentMock {
  _name: string;
  constructor(name: string) {
    this._name = name;
  }
  getBody(): BodyMock {
    return new BodyMock(this);
  }
  getId(): string {
    return "1234567890";
  }
}

describe("example.ts test", () => {
  test("createDocument", () => {
    DocumentApp.create = jest.fn().mockImplementation(name => {
      return new DocumentMock(name);
    });
    const expected = createDocument();
    expect(expected).toBe("1234567890");
  });
});
```
MacにKerasを導入する際に気をつけるべきこと

#はじめに
MacにKeras(tensorflow)導入時に，色々と突っ掛かったので，その備忘録としてまとめました．

#環境
Mac OSX  Mojave(10.14.6)
Python3.7.3

#tensorflowとkerasのインストール

以下のコマンドをターミナルで実行．pipのバージョンが古いとうまく機能しないので，**先にpipのバージョンを上げておく必要があります**

`pip install --upgrade pip
pip3 install --upgrade tensorflow
pip3 install keras`

上記のあと，実際にpython3を立ち上げて動作を確認してみます．

```
Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 16:52:21) 
[Clang 6.0 (clang-600.0.57)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow
>>> import keras
Using TensorFlow backend.
>>> 
```
無事導入ができました．

#mnist.load_data()がうまくいかない
```
import keras
from keras.datasets import mnist
(train_images, train_labels), (test_images, test_labels) = 
mnist.load_data()
```
などと言う表記でおなじみのmnistですが，python3でmnist.load_data()を行うと，以下（省略表記ですが）

```
Exception: URL fetch failure on https://s3.amazonaws.com/img-
datasets/mnist.npz : None -- [SSL: CERTIFICATE_VERIFY_FAILED] 
certificate verify failed: unable to get local issuer certificate 
(_ssl.c:1056)
```

とのエラーが出る．これはcifar10.load_data()なんかでも同様です．[こちら](https://qiita.com/orangain/items/0a641d980019fd7e0c52)を参照に解決しました．
原因は
>macOSに標準でインストールされているOpenSSLが古すぎるため、Python 3.6以降ではmacOS用のインストーラーにはOpenSSLが同梱され、システムのOpenSSLは参照されなくなりました

とのこと．
以下のコードをターミナルで実行することでcertifiモジュールをダウンロードしそこに含まれるルート証明書を参照可能になります．

`cd /Applications/Python\ 3.7/Install\ Certificates.command
`
#今後
Pythonでの深層学習については，[こちら](https://qiita.com/Kuma_T/items/7b3e11ebea69743d4f88)のまとめを参考にさせてただきました．
また問題が発生したら随時更新していきます．
Haskellことはじめ～パターンマッチ～

#### Maybe値
- Maybe値は`Just`または`Nothing`のいずれかの値を返す  
例えば、null値が与えられて処理の続行が不可能な場合、`Nothing`を用いて処理落ちを防ぐことができる。

#### パターンマッチ
- 値がパターンにマッチするかしないかを評価する
- 関数として複数定義することで上から順番にパターンマッチの評価を行う
- ワイルドカード`_`は必ずマッチする
- 変数は必ずマッチする※パッチした上で変数に値を格納する
- パターンマッチによって複合的な値から結果の値を取り出せる

```sample.hs
-- パターンマッチの例
inc (Just x) = x + 1
inc Nothing = -1
-- 関数を複数定義したパターンマッチ
advance 'a' = 'b'
advance 'b' = 'c'
advance 'c' = 'd'
-- ワイルドカードを使ったパターンマッチ
advance _ = 'x'

-- 引数が0ならNothingをそうでなければJust値を返すnotZero関数を定義
notZero 0 = Nothing
notZero x = Just x
```

実行結果

```
# パターンマッチの例
*Main> inc (Just 9)
10
*Main> inc Nothing
-1

# 関数を複数定義したパターンマッチ
*Main> advance 'a'
'b'
*Main> advance 'b'
'c'
# ワイルドカードを使ったパターンマッチ
*Main> advance '0'
'x'

# 引数が0ならNothingをそうでなければJust値を返すnotZero関数を定義
*Main> notZero 0
Nothing
*Main> notZero 1
Just 1
```

#### ガード
- `if else`みたいなやつは別の記法が用意されているらしい

```sample.hs
-- ガードを使わないバージョン
-- 0以上だったら平方根を返す関数safeSqrtを定義
safeSqrt x = sqrtBool (x >= 0) x
-- True ならsqrtを実行
sqrtBool True x = Just (sqrt x)
sqrtBool False _ = Nothing

-- ガードを使って実装するとこんなにシンプルに
safaSqrtG x
  |  x >= 0 = Just (sqrt x)
  |  otherwise = Nothing

-- ガードの構文
関数名
 | 条件1 = 処理1 -- if
 | 条件2 = 処理2 -- else if
 | otherwise = それ以外の場合の処理 -- else
```
実行結果

```
# パターンマッチで実装
*Main> safeSqrt (5)
Just 2.23606797749979
*Main> safeSqrt (-5)
Nothing

# ガードを使って実装
*Main> safaSqrtG (5)
Just 2.23606797749979
*Main> safaSqrtG (-5)
Nothing
```
PjMとしてプロジェクトを回すためにやっている実践的な12のアクション

# 概要

普段はバックエンドのエンジニアをしているが、最近ヘルプでプロジェクトマネージャー（PjM）としてサポートする機会があった。実践的なPjMとしてこなすべきアクションが具体化されているのをあまり見たことがなかったので自分がやっていることを書き出してみた。
PjM何して良いか分からんという人の手助けになればと思う。

# 背景

自分はNTTデータグループのSIerから現職のWeb系自社開発に転職したので、古き良きSIerにおけるウォーターフォールの上流工程と、アジャイル、スクラムな開発のどちらも経験したことがある。ただPMとしての資格（PMPなど）を取っているわけではないのであくまで自己流であるが、実践的にやってきて良かったことなので大きく間違ってはいないと思っている。

# 前提

後述するアクションはアジャイルな開発と言いながらも多数のステークホルダーや大規模システムを開発することを想定している。逆にスモールな開発ではtoo muchな作業であるものもあるので良い塩梅で必要なアクションをこなす必要がある。

# アクション

大きく分けてプロセスとタスクに関するアクションがある。プロセスは見える化と改善が主な作業でタスクは優先度づけを行う必要がある。

## プロセス

### (1) WBSを作成する
大規模な開発だったりステークホルダーが多い開発では誰が何をいつまでにやる必要があるのかを見えるようにしておく必要がある。そのためWBS(Work Breakdown Structure)を作成しておく必要がある。これを作成してwatchすることで現状が遅れているのか進んでいるのかプロジェクトが今どういった状況なのかを把握することができる。詳細なタスクはチケット化して管理しても良い。

### (2) 進捗は毎日確認する
WBSを作成しても更新されなければ意味がない。進捗は毎日朝会、夕会、デイリースクラムなどで確認すると良い。特に進捗が遅れているときはなぜ遅れているかを早期に発見するために必要になる。

### (3) 情報は常に整理して最新化する
更新するのは進捗だけではない。仕様や外部調整など最新のものが常にどこにあるかわかる状態にしておく必要がある。情報はwikiなどに雑に配置するのではなく、例えば次のように情報の階層構造を意識して整理する必要がある。認識齟齬や情報の不明瞭さによる手戻りを防ぐ。

```
プロジェクトDir
  - Product Core
    - コンセプト
    - KGI/KPI
    - リーンキャンバス
    - ユーザーインサイト/ペルソナ
    - ドメイン知識
  - Development
    - ...
  - Operation
  - Security
  - Meeting
```

### (4) PDCAを回す
プロジェクトにこれをやれば100%成功するのはないと思っている。それはメンバーの成熟度も毎回変わるしステークホルダーも変わるからだ。ただ失敗の確率を下げることはできる。悪いところがあれば振り返り改善していくと良い。手法はKPTでもSSSでも良いし、タイミングはプロジェクトが未成熟なうちは週次で振り返り、レトロスペクティブなどのタイミングで行うと良い。問題点についてはNext Actionを決めて改善していく。

## タスク

タスクは優先度を決め、誰が担当しているかを明確にし、いかにdone状態に持っていくかが重要になる。


`優先度`

まずは優先度を決める必要がある。優先度は下記のような項目をこなすことで明確になってくる。

### (5)全てのタスクの内容を把握しておく
タスクの内容は開発者に丸投げするのではなく概要でも良いので何をやっているかを把握するようにする。分からないところは開発者に確認する。そうすることでタスク間の依存関係を把握することに繋がってくる。

### (6) ステークホルダーの多いタスクは優先度を高くする
特に外部との連携が必要なタスクなど外部依存でボトルネックが発生しそうなタスクは優先的に対応し、早めにタスクのボールを渡しておく必要がある。これはギリギリでタスクを消化しようとしても外部リソースの状況に依存してどうやっても消化できないような状況が発生しうるためである。

### (7) タスクの依存関係を把握する
どのタスクを消化することができればどのタスクに着手できるといったタスク間の依存関係を把握しておく。依存関係を把握しておくことができれば並行してタスクが消化できるかどうかを考慮することができるようになる。

### (8) ボトルネックタスクは早く消化する
これも依存関係とほぼ同じだが、ボトルネックタスクを消化できないと後続のタスクも消化が遅れてしまうため、タスク消化の障害となるようなタスクは優先度をあげて着手、完了する必要がある。

### (9) 不確実性の高いタスクは早めに検証する
hogehogeの調査や外部要因で完了できるか分からないような不確実性の高いタスクは早めに調査や事前実施を行う。例えば新しい技術を導入するときのアーキテクチャ検証や新規アプリの申請などは早めに実施して不確実性を下げておく必要がある。フィジビリティをあげておくことでスケジュール不安を解消することができる。

`ステータス`

優先度を決めたタスクはdoneになるまでステータスをおう必要がある。

### (10) タスクのボールが誰か明確にする
タスクの実行者は誰なのかを明確にすることで進捗を正確に把握することができる。複数の人が担当してやっとdone条件を満たすようなタスクの場合はタスクを細分化することも必要である。

### (11) タスクはin progressを増やすのではなくdoneにしていく
in progressのものが大量にある状況は注意が必要である。進捗中となっていてもそのタスクが何パーセント完了しているか把握することが難しいからだ。またタスクは進捗中のものを増やすのではなく着実に完了していったほうが精神的にも健全な状態を保つことができる。


## その他

### (12) メンバーに責務を押し付けない
プロセス、タスクに関するもの以外で重要なことがある。各タスクは実行者が担当するにせよ最終的な責務はPjMにある。単純に開発者のマンパワーに頼って「頑張ってください」というのはPjMとして無能である。PjMは代替手段がないかスコープ調整、スケジュール調整、アサイン調整などを行い進捗が健全に回る状態を保つように努力する責務がある。進捗が遅れているものについては適宜メンバーに声をかけて一緒に解決し、不安を取り除いていく必要がある。

# まとめ

記載したもの以外にも細々としたものはあるが、結局PjMはプロジェクトの状態を把握していかに不確実な状態を排除していくことに責任をもち、開発者オネシャスではなく健全な状態でプロジェクトが回るように最大限努力する必要があると思う。そうすることで高いQCDを保ち継続可能な開発を行いユーザーに良いものを提供することに繋がるのではないかと思う。
Azure Web App for Containers で スケールしたりリスタートしてもファイルを永続化する方法


Azure Web App for ContainersとはAzureが提供するPaaSでWebアプリケーションの入ったDockerイメージを簡単に動かすことができるサービスです。
デフォルトではWebアプリケーション実行中にユーザーからアップロードされたファイルやプログラムが作ったファイルなどを永続化して保持することができませんが、設定を変更することでファイルの永続化をすることができ、インスタンスを増やしても共通のストレージを見ることができます。

# WEBSITES_ENABLE_APP_SERVICE_STORAGEの環境変数をtrueにする
Azure Web AppのConfigurationで、Application settingsとして環境変数をセットできるので、そこでWEBSITES_ENABLE_APP_SERVICE_STORAGEをtrueにセットします。これで永続ストレージが有効になります。

[![Image from Gyazo](https://i.gyazo.com/974f40a444746fc82c4018edae9580df.png)](https://gyazo.com/974f40a444746fc82c4018edae9580df)

# /homeディレクトリ以下に保存したいファイルを設置する。
Azure Web App for Containerは上記の環境変数をtrueにすると、Container起動時に/homeディレクトリに永続ストレージをVolumeとしてアタッチします。そのため、/homeディレクトリ以下にファイルを保存するとその他のインスタンスからでもそのファイルが参照できるようになります。

/homeディレクトリにファイルを保存するように変更する方法として、以下の方法が考えられます。

1. アプリケーション側で/homeディレクトリにファイルを保存するように変更する
2. コンテナの起動スクリプトでファイルの保存先となるディレクトリから/home以下にシムリンクを貼る

1の方法はそのままなので説明は省くとして、2の方法でシムリンクを貼るときにわざわざDockerfileではなく、起動スクリプトで貼るようにしている理由ですが、Dockerfile内で/homeディレクトリにシムリンクを貼ってもContainer起動時にVolumeがアタッチされると/homeディレクトリへのシムリンクが削除されてしまうからです。

# 終わりに
これでAzure web app for containersでもユーザーがアップロードした画像をローカルに保存するだけで、他のインスタンスからでも参照できるようになります。
WordPressやEC-CUBEのようなOSS CMSを使う場合には重宝するので、ぜひ参考してください。


#参考
https://blogs.msdn.microsoft.com/waws/2017/09/08/things-you-should-know-web-apps-and-linux/#NoStorage
aws DR クラウド構成例

multi-azはdrにならない？
https://aws.koiwaclub.com/forums/topic/multi-az%E3%81%AFdr%E3%81%AB%E3%81%AA%E3%82%89%E3%81%AA%E3%81%84%EF%BC%9F/

ディザスタリカバリを考慮したクラウド構成例
https://aws.amazon.com/jp/cdp/cdp-dr/

AWS資格試験問題に対応するためにも下記は全部読んだ方がいいかも
https://aws.amazon.com/jp/cdp/
System Eventsでエラーが起きました: Docker Quickstart Terminalにはキー操作の送信は許可されません。（1002）

#はじめに
こんなことあったよ！
根本的対策ではないけど一応投稿しようといったものです。
前回一度でも正常にDockerを起動したことがある方が対象になると思います。
最終的に使用するものはVirtualBoxです。
DockerでVirtualBoxを使っている方が対象です。
一応macですが今回に関してほぼ関係ないかと、、、

あと…
Docker自体の記事も書いているのでもしよかったらみてください。
https://qiita.com/sachiko-kame/items/35e0cf07d117c3b92613

#事象
:woman:『久々にDocker触れてみようかな。まずはDockerフォルダのDocker Quickstart Terminalをクリック』
<img width="225" alt="スクリーンショット 2020-01-03 0.40.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133940/138e2a4a-4294-92be-c66c-52104aa055b3.png">

:woman:ターミナルが出たら、、次はコマンド打つんだよな〜うふふふふ、、、え？

<img width="423" alt="スクリーンショット 2020-01-03 0.42.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133940/f3489ccd-3915-5f1b-4d8a-6882948bcb61.png">


```
System Eventsでエラーが起きました: Docker Quickstart Terminalにはキー操作の送信は許可されません。
System Eventsでエラーが起きました: Docker Quickstart Terminalにはキー操作の送信は許可されません。（1002）
```
とりあえず検索以下URLヒット！
:woman:あ〜許可されていなかっただけか、、じゃ許可と！
https://forums.docker.com/t/error-trying-to-start-docker-quickstart-terminal/67623

やりましたよ！証拠画像(こういうのをエビデンスというのですよね←知ったか)
<img width="607" alt="スクリーンショット 2020-01-03 1.11.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133940/170efa24-3fc2-3fb3-c248-8a6369491ffe.png">


:woman:再度クリック！、、、え同じエラー〜〜〜〜:frowning2:
:woman:エラーをなおしたいのではないDockerを使いたいんだ！←は？

#強行突破
:woman:VirtualBoxから開いてみよう！！停止を実行に、、、(実行は写真には写っていない右上のボタン設定の隣の隣のところ)
<img width="425" alt="スクリーンショット 2020-01-03 0.48.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133940/8bfd460c-8757-7b2e-c724-fe53ae3cbd36.png">
<font color=red>※実行して処理が終わるまで待ってください</font>

:woman:通常のターミナルを起動してと、

`$ docker-machine start default`

:woman:動いた、動いた。
あとは立て続けに

```
$ docker-machine env default
$ eval "$(docker-machine env default)"
$ docker run hello-world
```

:woman:動いてるな

#私はこう思った
:woman:どっちかでしか開けない？　←は？
:woman:キー操作の許可はってことはキーでクリックがダメってことでしょ！(｡･ω･｡)　←お？
:woman:だからあっているんだ！　←ま、そういうことにしといてやるか！

:woman:あと、こっちからも起動できたかも？？こっちから操作したことないのでわかりませんが、、、
<img width="224" alt="スクリーンショット 2020-01-03 1.06.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133940/a42f43b2-2153-ec0b-4465-fbe3af220caa.png">
フリーソフトで良い感じの論文用EPS画像を作る

# はじめに
備忘録です．

論文執筆の時期ですね．
論文の図をjpやpng形式で作って，仕上がりのPDFの画像が汚くなったことありませんか？
それを回避するためにベクタ形式の画像を作りたいけどIllustrator持ってないよ...って時に，この記事は役に立つかもです．

Ubuntuでの利用として説明します．


#使うソフト

- LibreOffice Impress

Ubuntuに最初から入っている無料のPower Pointみたいなソフトです．

- Inkscape

"ベクター画像のプロフェッショナルなエディターです."
引用元：[Inkscape](https://inkscape.org/ja/)

# やり方

1. LibreOffice Impressでいい感じの図を作成
いい感じの図を作ってください．直線などを引きたいときは，先の幅が0.0より大きくしてください．そうしないと，Inkscapeに入れるときに線が見えなくなってしまいます．

1. エクスポート
画像ができたら，「ファイル」から「エクスポート」を選んでEPS形式で保存します．
なお，この時は
「カラー形式」→カラー
「バージョン」→レベル2
「圧縮形式」→なし
でOKです．これで，余白がたくさんありますがとりあえずEPSの画像ができます．


1. Inkscapeにインポート
さっき保存した画像ファイルを右クリックしてInkscapeから開きます．開くときにいろいろ設定が出てきますが，
「クリップ先」→チェックしない
「Popplerを使用してインポートする」→チェックしない
「近似グラデーションの精度」→2.0(一番低くて良い)
「テキストの扱い」→テキストをテキストとしてインポート
「名前がもっとも近いインストールフォントでPDFフォントを置き換える」→チェック
「画像を埋め込む」→チェック
でOKです．デフォルトで大丈夫かも．

1. トリミング
画像として残したいところだけをトリミングします．
まず，「矩形ツール」でトリミングしたい領域を選択します．(ちなみに，初期設定は見づらいので黄色の半透明などに設定すると良いです．)
「選択ツール」に切り替えて、shiftを押しながら元の画像とさっきの領域をクリックして選択状態にします．
そして，［オブジェクト］→［クリップ］→［設定］でトリミングします．

1. 保存
「ファイル」→「保存」で，
「フィルターエフェクトをラスタイズする」→チェック
ラスタイズ解像度　300
エクスポートオフジェクトのサイズを使用」→チェック
でOKです．

1. 完成
完成です！これでいくら拡大してもジャギジャギしない画像ができました．
【Git】GitHub Flowのざっくりまとめ

## はじめに
**GitHub Flow**という、GitHubが推奨するGitの使い方があると知ったので流れをまとめました。

※当記事中の画像は以下から拝借しています。
[公式ガイド](https://guides.github.com/introduction/flow/)

## GitHub Flowに従った開発の流れ
### 1.ブランチを切る
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483292/d319c799-2c5f-f840-daf2-2905f257cb79.png)

- **master**ブランチは常にデプロイ出来る状態を維持
- ブランチを切るのは**master**から
- ブランチ名は何の機能を作成・修正しているのかが分かるような名前にする

### 2.こまめにコミットする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483292/313b7ba2-4ebb-7983-f736-4b9b9eed873b.png)

- ファイルを作成・編集・削除するたびにコミットする
- コミットメッセージは他人が理解できるように書く

### 3.プルリクエストを開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483292/2ced3b5b-7030-78bd-009a-fda8bc331d53.png)

- コードが完成したとき以外にも、アイデアの共有・立ち往生してヘルプやアドバイスが欲しいときなどに使用する

### 4.コードレビューする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483292/51d16d14-468a-9c9a-1a61-508a4798416d.png)

- コーディングスタイルが正しいかどうか
- テストも問題なく通るかどうか

### 5.デプロイする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483292/20a7590c-d0df-dcb7-19a4-05ad8b6d5483.png)

- GitHubでは**master**にマージする前に、ブランチから本番環境でテスト出来る
- そのテストで問題が発生したら、元の**master**を本番環境に戻す**ロールバック**が出来るので安心

### 6.マージする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483292/33c722a8-7c93-bd4c-2a48-3e5a291135a2.png)

- **5**のテストに問題なければ、作成したコードを**master**にマージする

### 7.以後機能毎に繰り返し
**1~6**を繰り返して開発を進める。

## おわりに
最後まで読んで頂きありがとうございました:bow_tone1:

どなたかの参考になれば幸いです:relaxed:

## 参考にさせて頂いたサイト（いつもありがとうございます）
- [Understanding the GitHub flow · GitHub Guides](https://guides.github.com/introduction/flow/)
bashのdate関数を使ってjobの実行時間を計測する。

#bashを使って計算時間を出力したい
数値計算を行う方にとって長いジョブを実行する待ち時間を有効に使うことはとても重要である。私は長いジョブを実行する間に論文を読んだり、気分転換をするなどしている。数値モデルを使う場合などは、細かい条件を変えた場合に待ち時間はだいだいは把握できるが、正確に何分図っているか把握できていないことに気が付いた。そのため、似たようなモデルを実行することを想定して、ジョブが終了するまでに何分かかったか出力するシェルスクリプトを書いてみることにした。

#環境
Oracle VirtualBox 6.0.14
CentOS-7x86_64-DVD-1908 linux redhat64bit

#実際にやったこと
**date**関数を使ってこのシェルスクリプトを書いてみた。
以下のように記述することでdate関数から特定の変数を出力させることができます。

```
starttime=$(date)          #デフォルト
starttimeh=$(date +'%H')   #時間0~23
starttimem=$(date +'%M')   #分0~59
starttimes=$(date +'%S')   #秒0~59
starttimej=$(date +'%j')   #日0~365
```
これをつかってジョブを始めた時間と終了した時間を引き算して何時間何分何秒かかったか出力させ
ます。

```
#speedtest
#starttime
starttime=$(date)
starttimeh=$(date +'%H')
starttimem=$(date +'%M')
starttimes=$(date +'%S')
starttimej=$(date +'%j')
#
#execute job
dclfrt test.f && ./a.out && python notify.py 
#
#output how long does it take to execute jobs
endtimeh=$(date +'%H')
endtimem=$(date +'%M')
endtimes=$(date +'%S')
endtimej=$(date +'%j')

j=$(($endtimej-$starttimej))
h=$(($endtimeh-$starttimeh))
m=$(($endtimem-$starttimem))
s=$(($endtimes-$starttimes))
if [ $((h)) -lt 0 ]; then
    j=$(($j-1))
    h=$(($h+24))
fi
if [ $((m)) -lt 0 ]; then
    m=$(($m+60))
    h=$(($h-1))
fi
if [ $((s)) -lt 0 ]; then
    m=$(($m-1))
    s=$(($s+60))
fi
echo "starttime=$starttime"
echo "endtime=$(date)"
echo "caltime=$j(days)$h(hours)$m(min)$s(s)"

# source ./auto.bash

```

#補足：よりいい方法があったので
Line Notifyというサービスを使うとジョブが終了したことをLineに通知させることができます。
Pythonをつかってコードを書いている方がいたのでこれを参考にしました。
https://qiita.com/aoyahashizume/items/13848b013daa18f6461b
これを取り入れることでdate関数をつかって前のジョブ計算から何分くらいかかるか正確に把握したうえでLine通知がくるまで休憩するなどすることができます。
AnacondaでPythonの64bit環境を32bit環境に変更する

#はじめに
Qiita初投稿です。よろしくお願いします。
AnacondaでPythonの32bit環境を作り、32bitでコンパイルされたDLLを読み込んで作業していました。
（Python32bit環境の作り方はこちらを参照。[Anacondaで32bitのPython環境を作る](https://qiita.com/flowphantom/items/940db2ec8327e2c48cb0))
するとあるとき、<b>`OSError: [WinError 193] %1 は有効な Win32 アプリケーションではありません。`</b>というエラーが出るようになりました。
どうやらPythonの環境が32bitから64bitに変わってしまっていたようで、
これを解決するためにPythonの64bit環境を32bit環境に変更します。

#Pythonの環境を確認する
現環境のPythonが64bitなのか32bitなのかを確認します。
Pythonを起動して「MSC v.1916 32 bit」なら32bit、「MSC v.1916 64 bit」なら64bitです。

```
$ python
Python 3.7.5 (default, Oct 31 2019, 15:18:51) [MSC v.1916 64 bit (AMD64)] :: Anaconda, Inc. on win32
```

上記の場合は64bitです。
他に、sys.maxsizeを調べるという方法もあります。
Pythonを起動してsysをimport、sys.maxsizeを表示させます。
32ビットでは 2^31-1 = 2147483647、64ビットでは 2^63-1 = 9223372036854775807 になります。

```python:maxsize.py
import sys
print(sys.maxsize)
```

#condaの設定を確認・変更する
`conda info`コマンドでcondaの情報を表示し、platformを確認します。

```
$ conda info

　　 ... 省略
               platform : win-64
　　 ... 省略

```

`set CONDA_SUBDIR=win-32`でCONDA_SUBDIRをwin-32に設定し、再度platformを確認します。

```
$ set CONDA_SUBDIR=win-32 
$ conda info

　　 ... 省略
               platform : win-32
　　 ... 省略
```

#Pythonを再インストール
Pythonを再インストールします。といっても `conda update --all`するだけです。

```
$ conda update --all

    ...省略
python             pkgs/main/win-64::python-3.6.9-h5500b~ --> pkgs/main/win-32::python-3.6.8-h9f7ef89_7
    ...省略
```

win-64からwin-32に変わっていることがわかります。

#Python環境の変更を確認する
Pythonを起動して確認します。

```
python
Python 3.6.8 |Anaconda, Inc.| (default, Feb 21 2019, 18:28:22) [MSC v.1916 32 bit (Intel)] on win32
```
「MSC v.1916 32 bit」となっていたらOK
【Python初級】関数内の変数とスコープ（関数内の処理が関数外で反映される場合と反映されない場合）

Pythonで関数内の変数スコープに関する理解が曖昧だったので、同じような点でつまずいた人のために共有します。
述べたいことは、__関数の引数として用意された変数に対して、その変数に丸ごとの代入を行う場合は新しくローカル変数が定義されたものとして扱われ、変数の要素に代入を行う場合はそのままグローバル変数として扱われる__という違いがあるので注意ということです。

以下のコードでは関数内で２つのリストlist_aとlist_bを操作していますが、グローバル変数として扱われ、関数の外にも影響を及ぼしているのはlist_bのほうだけです。

```py
def func(list_a, list_b):
    list_a = list_a + ['hoge']
    list_b[1] = list_b[1] + 10


a = [1, 2, 3]
b = [5, 6, 7]

func(a, b)
print(f"a={a}, b={b}")
func(a, b)
print(f"a={a}, b={b}")
```

出力は以下になります：

```
a=[1, 2, 3], b=[5, 16, 7]
a=[1, 2, 3], b=[5, 26, 7]
```
Pythonでは関数内の"a=..."の形の式は、__関数の中にのみスコープを持つローカル変数aが新たに定義されたもの__として扱われます。したがって関数func内のlist_a = list_a + ['hoge']では、左辺のlist_aは新たにローカル変数list_aを定義したものとして扱われています（右辺のlist_aは関数の引数として与えられ、関数の外にもスコープを持つ変数です）。よって、関数の外のaには何の影響もありません。

一方でlist_b[1] = list_b[1] + 10では、両辺のlist_b[1]は、__すでに定義されている__変数list_bの1番目の要素として扱われなければいけません。今回の例ではlist_bは関数funcの引数であり、関数外部ですでに定義された変数です。よって、funcによる処理が関数外部の変数bに反映されています。

ndarrayやpandas.DataFrameなど他のtypeの変数に関しても同様です。
経験0知識0の非エンジニアがフリーランスになるまで（前）

# 前置き
　今年からフリーランスのエンジニアとして働くことになりました。
　エンジニアとしてのキャリアは、常駐派遣型の開発者から始まり、web系の製作会社や複数の事業を展開する事業会社の社内SEを経て今に至ります。
　エンジニアになる前は新卒で入社したメーカーで知的財産管理の仕事をしていました。特許や商標などを取ったり管理したりするいわゆる企業の関節部門です。
　そんな僕の経験がこれからエンジニアを目指す人、フリーランスを目指している人の参考になれば幸いです。

## エンジニアになる前（〜2012/2）
　新卒で東京の機器メーカに就職。知財管理部に配属されます。将来は弁理士になりたいなあとか考えていました。
　ちなみにこの時のITスキル(?)といえば、IE、Word、Excel、PowePoint。くろーむ？何それ状態です。手持ちの武器が乏しすぎますね。
　経緯は割愛しますが、弁理士を目指すにあったのモチベーションが薄れ、ある時からエンジニアという人種に妙に憧れを持つようになり、転職することを決めました。
　ただ、どうすればエンジニアになれるのかよく分からない。
　とりあえず、「ITエンジニアといえばPCに詳しい人」という非エンジニアにとってあるある思考を発揮し、PCのパーツを一式揃えてそれは大きいデスクトップPCが出来上がりました。
　これでプログラミングの勉強をします。ちなみに家には普通の買ってきたノートPCがありましたが、当時の僕の目にはそんなものは入りません。

## エンジニアになるために
### 言語（入口）の選択
　これはプログラミングの勉強を始める多くの人が抱える悩みではないでしょうか。調べれば調べるほどたくさんの言語があり、何から始めればいいのか分からない。こういう時は原点に戻るに限ります。
　僕は職業としてエンジニア（当時は、プログラマー！）になりたかったので、世にある求人情報の必須スキル、歓迎スキル、業務内容などを片っ端から見ていきました。その中に業務未経験者歓迎な求人ではJavaに関係する求人が多く見られました。ということでJava、始めます。
　
今ほどネット上での学習ツールなど多くなく、書籍を中心に半年ほど現職の就業後に続けていましたが、イマイチよくわからん。

変数？箱ね。
配列？箱の集まりみたいなもん？
関数？道具かな
public?…static?…void?おまじないか何かかな？
args［］…さっき習った配列、なんで中身ないの？

悶々とする日々。
独学の挫折ポイントとはこういうところなのでしょう。全部publicでいいじゃんて考えちゃう。

### SIerに転職（2012/2〜2013/8）
　このままでは心が持たないので、独学はしつつも環境を変えることに考えをシフト。とりあえず未経験でエンジニアになそうな求人に応募します。
　そしてなんとか客先常駐のエンジニア（SIer）として内定をいただきました。給料は下がりますがそれも仕方なかろうと割り切ることでエンジニアになれました。
　
## エンジニアとして最初の仕事
　入社したというものの実務スキルは無いに等しいので、研修を受けます。やはりJavaですね。
入社当初3ヶ月の研修のはずが1月半ほど経過したところで営業から唐突に、「面談」の予定が入ったと告げられます。そして面談に臨むもスキルシートには実務経験2年の記載。見覚えのない過去参画プロジェクトの情報。抱える一抹の不安。

　そんなことを数回こなしたところで面談をパスし現場に入ることが決まります。

　そしていくつかの現場を渡り歩き終電間近まで働きながらもスキル不足を補うために毎朝就業前に2時間ほど勉強時間を確保していましたが、心身ともにこの頃が一番キツかったです。
　その後1年半ほど経った頃、SIerという多重請負の構造（多い時は5次請）や安月給、会社への募る不信感など諸々の理由から現状に見切りをつけ、受託メインのweb制作会社への転職を決めました。

## ここまでで得たこと
- Java
- JSP
- tomcat
- JavaSevlet
- HTML
- javascript
- jsとJavaは違う
- 多重請負の闇
- OSSを頑なに導入しない勢の存在


[経験0知識0の非エンジニアがフリーランスになるまで（後）](https://qiita.com/akm-y/items/c4251be63ff43aa8619a)

[まとめはこちら](https://qiita.com/akm-y/items/5f6d78e15c2c9c232c5b)
転職日記１日目

自分はこのQiitaを使って、転職までに行った活動を可能な限り投稿するとともに、

その日に行ったプログラミングの勉強のアウトプットの場として活用していきたいと思います。

現在28歳の自分ですが、この先の将来のことを考えて小売業からエンジニアになることを決意しました。

ネットだと自分と同じ年齢で異業種からエンジニアになったかたや現在活動中の方をよく見ます。

その人たちの記事や、やっていることをみて負けていられないと自分も思います。

へたくそな文章ですが、自分もそういう方たちと一緒に頑張っていこうと思います。

よろしくお願いします。
Unityを使い始めて3ヶ月

45歳、プログラムまったく初心者です。
初めてゲームを作ってみたけどちょっとハードルを上げすぎました。
一応、将棋のようなチェスのようなものが完成しました。
コマの移動、ターンのところで結構苦労しました。

2020年は少しハードル下げて一歩一歩進んで行きます。
![スクリーンショット 2020-01-03 0.04.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560721/58ce1a5d-c5b9-baf5-63a5-5980c622187c.png)
米国防総省（DoD）におけるDevSecOps（第1章）#DevSecOps

原文・参照先資料
[DoD Enterprise DevSecOps Reference Design - DoD CIO](https://dodcio.defense.gov/Portals/0/Documents/DoD%20Enterprise%20DevSecOps%20Reference%20Design%20v1.0_Public%20Release.pdf?ver=2019-09-26-115824-583)

# 1 はじめに
## 1.1 背景
 DevSecOpsは、ソフトウェア開発(Dev)、セキュリティ(Sec)、運用(Ops)を統合することを目的とした組織的なソフトウェアエンジニアリングの文化と実践である。DevSecOpsの主な特徴は、ソフトウェアライフサイクルのすべてのフェーズ(計画、開発、構築、テスト、リリース、デリバリ、デプロイ、運用、監視)でセキュリティを自動化、監視、適用することによって、成果とミッションバリューを改善することです。DevSecOpsを実践することで、従来のソフトウェアライフサイクルに対する品質とセキュリティの改善を実証することができます。

・平均実稼働時間:新しいソフトウェア機能が必要になってから実稼働に移行するまでにかかる平均時間
・平均リードタイム:新しい要件の提供と導入にかかる時間
・導入速度:新しいバージョンのアプリケーションを本番環境に導入する速度
・導入頻度:新しいリリースを本番環境に導入できる頻度
・本番環境の障害発生率:本番環境でソフトウェアに障害が発生する頻度
・平均リカバリ時間:本番段階のアプリケーションが障害からリカバリするまでにかかる時間

さらに、DevSecOpsプラクティスによって次のことが可能になります。
・アプリケーション・ライフサイクル全体にわたって、リスクの特徴づけ、監視、軽減を完全に自動化
・セキュリティの脆弱性とコードの弱点に対処できる速度でのソフトウェアのアップデートとパッチ適用

　DevSecOpsプラクティスは、アプリケーションのセキュリティ、安全な導入、および安全な運用を、ミッションの目標と密接に連携させて実現します。DevSecOpsでは、自動化されたユニットテスト、機能テスト、統合テスト、セキュリティテストを通じて、テストとセキュリティがシフトレフトされています。セキュリティと機能が同時にテストされ、構築されるため、DevSecOpsの重要な差別要素です。さらに、いくつかのセキュリティ機能（Sec）は、サイドカーコンテナを介して開発者（Dev)の介在なしに自動的にアプリケーションに注入されます。

##1.2 目的
　この文書の主な目的は、DoD DevSecOpsソフトウェアファクトリをインスタンス化するために使用できる反復可能なリファレンスデザインを提供するために、主要な設計コンポーネントとプロセスの論理的な説明を提供することです。

このドキュメントの対象読者は次のとおりです。
・DoDエンタープライズDevSecOps強化コンテナを構築し、DevSecOps強化コンテナアクセスサービスを提供するDoDエンタープライズDevSecOps機能プロバイダー
・DevSecOpsソフトウェアファクトリとそのプログラムの関連パイプラインを管理(インスタンス化と維持)するDoD組織のDevSecOpsチーム
・DevSecOpsソフトウェアファクトリーを使用してミッションアプリケーションの開発、セキュリティ確保、運用を行うDoDプログラムアプリケーションチーム
・認可された職員(Authorizing Officials (AOs))

DoD Enterprise DevSecOps リファレンスデザインでは、DevSecOpsチームが開発対象のプログラムアプリケーション機能に適したテンプレートを選択するため、一連の強化されたDevSecOpsツールとデプロイメントテンプレートを活用しています。たとえば、これらのテンプレートは、特定のプログラミング言語や、Webアプリケーション、トランザクション、ビッグデータ、人工知能(AI)などのさまざまな種類の機能に特化しています。プログラムはDevSecOpsテンプレートとツールセットを選択します。プログラムはこれらを使用して、DevSecOpsソフトウェアファクトリと、ミッションアプリケーションの継続的インテグレーションと継続的デリバリ(CI/CD)を可能にするパイプラインをインスタンス化します。

このリファレンスデザインは、次のドキュメントと連携しています。
• DoD Cloud Computing Strategy [1]
• DoD Cloud Computing Security Requirements Guide [2]
• DoD Secure Cloud Computing Architecture (SCCA) [3]
• Presidential Executive Order on Strengthening the Cybersecurity of Federal Networks
and Critical Infrastructure (Executive Order (EO) 1380) [4]
• National Institute of Standards and Technology (NIST) Cybersecurity Framework [5]
• DoD Container Hardening Security Requirements Guide [6]

##1.3 範囲
　このドキュメントでは、部門全体でDevSecOpsをスケールするためのリファレンス設計について説明します。DevSecOpsは業界で確立された成熟した能力であり、すでに政府の一部で使われています。このDoDリファレンス・デザインは、製品に依存しない設計、ソフトウェアチームが使用するための実行ガイダンスを提供します。ビジネス・トランザクション、C2、組み込みシステム、ビッグ・データ、人工知能(AI)などのビジネスシステム・ソフトウェアと兵器システム・ソフトウェアの両方で、新しい機能の開発と既存の機能の維持に適用できます。
本書では、ポリシーや物資調達は扱いません。

## 1.4 ドキュメントの概要
マニュアルの構成は次のとおりです。
・第１章では、このドキュメントの背景、目的、範囲について説明します。
・第2章では、基本的な原則を述べるとともに、この参照設計を開発する際になされた仮定について説明します。
・第３章では、DevSecOpsライフサイクル、DevSecOps採用を支援する4つの主要機能、DevSecOpsソフトウェアファクトリとそのエコシステムの技術アーキテクチャについて説明します。
・第４章では、DevSecOpsエコシステムのツールと、ソフトウェアのライフサイクルフェーズに沿った活動について説明します。
・第５章では、DoDエンタープライズDevSecOpsサービスについて説明します。このセクションの対象読者は、DoD Enterprise DevSecOps機能プロバイダーです。
・第６章では、DevSecOpsソフトウェアファクトリとエコシステムを構築するための、DoDプログラムのリファレンス設計について説明します。
RaspberryPi4で機械学習を始めた。

####はじめに
Raspberry Pi4で　機械学習をはじめて、躓いた点、気づいた点を備忘録として残すことにした。
初心者ですので　用語の統一性がなかったりや表現のあいまいなところがあります。
ほとんどが　参考文献やWebからの情報を意味不明なまま写経している状態です
####対象
これからRaspberryPi4で機械学習を始めたい方。
####参考文献
RaspberryPiではじめる機械学習
OpenCVとPythonによる機械学習プログラミング
(Machine Learning For OpenCV Intelligent 
image Processing With Pythonの日本語訳）
####Softwareのインストール
参考文献にしたがってnumpy,matplotlib,pandas,sklearn,OpenCV,などを
インストールします。
pip と　apt　のどちらでもインストールはできるようです。
インストールに要する時間は　pip>>aptでした。
OpenCVもバージョンにこだわりがなければインストールできます。
（Web情報のスクリプトをTerminal画面にコピペしてインストール）
Tensorflowはインストール失敗。原因不明
（インストール中の警告内容が理解できていません）

####参考書籍ML4OpenCVについて
本屋で立ち読みして良さそうなので購入しました。
すこし書籍を読み進めるとMac,Windowsが対象でAnacondaをインストールした上で
しかもjupyterで丁寧に学習できそうでした。jupyterはRaspberryPiでは簡単には
インストールできないようですがjupyter公式ホームページなどでインストールは
可能とのことなので挑戦しました。
インストールしたあとに、アドレス、パスワードを初期設定ファイルに書き込めば
Terminalから起動できます。
ついでに　画面左上イチゴアイコンー＞設定ー＞MainMenuEditorを開いて
カテゴリーを選択して新しいアイテムから　Name:Jupyter Command:jupyter notebook
Launch in TerminalにCheckをいれるとメニューからjupyterを起動できます。
（左側のアイコン枠のところに表示したいアイコンをDragするとMenuでもそのアイコンが
表示されます）
これで　書籍のSampleCodeも開くことができましたが　numpyのバージョンをCheckする
箇所がありNumpyのバージョンが1.18以上が必要と叱られてしまいました。
（書籍の内容は素晴らしく初心者にわかりやすいと思いました。）
普通にaptでRaspberryPiにNumpyをインストールするとNumpyのバージョンは1.16.2。
Anacondaを使っている場合はNumpyのバージョンが1.18以下ではupdateが必要とのことでした。
またOpenCVの公式ページでは　仮想環境の導入を推奨していたので、これも挑戦。
そのまま写経で問題なしでした。
（このあたりでmicroSDのバックアップも考慮）
機械学習では練習解析用のビックデータが用意され、例えばBrestCancerの
数万枚の画像データの解析も可能です（Kaggleなどにユーザー登録は必要）
一方で数時間も大量データにアクセスして記憶装置は大丈夫かと少し心配にはなります
またRapberryPi上で学習する参考文献は”RaspberryPi”と明記されたものの方がわかりやすいと
思いました。
####最後に
raspberryPiはOSを含めて進化が早いと実感しました。
（いつも間にか　日本語変換Mozcのインストールが不要になっていました！）
学習を始めたばかりの画面ですが画面のコピーを添付しておきます。
####参照したもの
jupyter公式ホームページ
OpenCV公式ホームページ
多数のRaspberryに関するblogなど　参考になり感謝しています
RaspberryPiではじめる機械学習　金丸隆志　著
OpenCVとPythonによる機械学習プログラミング
(Machine Learning For OpenCV Intelligent 
image Processing With Pythonの日本語訳）
Micheal Beyeler 著



![2020-01-02-210925_1920x1080_scrot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435503/aa6518e4-a490-f419-7048-4d1594a94037.png)
ログイン～メルマガ購読サンプルを作ってデータ移行ごっこをしてみた -設計編-


## 今日のテーマ
過去に関わっていた業界でEC関係がいくつかあったので、そのポート
フォリオになります。

## どうやって
通常の業務情報は使えないので、インターネット＋経済産業省から出ている
図を読み取って項目を作っていきます

## 利用する資料
テーブル構造は、すでに出回っている国家資格の過去問題を利用します
今回は、以下の条件にします

|項目名  |内容 | 
|---|---|
|試験名  |応用情報処理技術者試験  |
|年度  |平成21年度春期  |
|問題区分  |午後問題  |
|問番号  |6  |


https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2009h21_1/2009h21h_ap_pm_qs.pdf

以下の”用語”を引用

|機能名 |
|---|
|顧客管理 |
|商品管理 |
|注文管理 |

資格とは別に次の用語を追加する

|機能名 |
|---|
|メルマガ管理 |

それぞれの項目を最小限で国家試験の問題分と用語から以下のように用意する
＊サンプルとしてなので、簡易化

顧客管理の要件
メールアドレスとパスワードでログイン
注文情報に連携するための顧客番号を保持する
名前とふりがなを表示情報として用意する

|顧客管理 |
|---|
|顧客番号 |
|顧客名 |
|顧客名(ふりがな) |
|メールアドレス |
|パスワード |
|登録日時 |

商品管理
単価と商品名をセットにして、サイトで販売することができる
登録日時と更新日時を表示用情報として保持する
商品カテゴリIdを用意して、飲食や服装、家電などの各種カテゴリを設定することができる

|商品マスタ |
|---|
|商品Id |
|商品名 |
|商品カテゴリId |
|価格 |
|登録日時 |
|更新日時 |

|商品カテゴリマスタ |
|---|
|商品カテゴリId |
|商品大カテゴリId |
|商品カテゴリ名 |

注文管理
注文Id...1注文毎で同じ番号
注文明細Id.１注文内の商品ごとに振られる番号
配送料金....注文内でかかる車で配送する際の、料金
登録日時....注文処理が実行されたときの日時
更新日時....注文処理後に、配送完了やキャンセルされた場合に更新される日時

|注文 |
|---|
|注文Id|
|顧客Id|
|配送料金|
|ステータス|
|登録日時|
|更新日時|

|注文明細 |
|---|
|注文Id |
|注文明細Id |
|商品Id|
|個数|
|ステータス|
|登録日時 |
|更新日時 |

メルマガ管理
顧客IdとメールマガId＋送信するメールアドレスを紐づける

|メルマガ |
|---|
|メルマガId |
|顧客Id |
|メールアドレス|

*メルマガマスタも必要だが、実装内


## データ移行元
オープンソースであるシステムのEC-CUBEのCSVを仮想設定


## データ移行先
アプリ機能（画面側)
・ログイン画面（Idとパスワード)
・トップ画面
　ログインしている顧客名の表示
　商品一覧を表示する
・商品詳細情報画面
　商品の詳細情報を表示する
　注文処理を実施する
・注文確認画面
　商品詳細画面で注文した商品の一覧が表示する
・注文完了画面
　注文完了メッセージと注文Idを表示する
・注文履歴画面
  過去に表示した注文履歴を表示する

ここに書いていないけど、実装するもの
＊管理画面


## 次回
実装編として、データ移行する画面と簡易画面をローカルかクラウドサービスを使って作っていく予定

2020/01/02 記入中
特定のディレクトリ内の .DS_Store を検索・削除する

## 検索

カレントディレクトリ内の`.DS_Store`を検索する

```sh
find . -type f -name '.DS_Store'
```

## 削除

カレントディレクトリ内の`.DS_Store`を全て削除する

```sh
find . -type f -name '.DS_Store' | xargs rm -rf
```
Q#言語で簡単に、量子コンピューティングをDockerで実行する

**Q#** は、Microsoftが開発している量子コンピューティング用プログラミング言語です。

[Q\# プログラミング言語 \- Microsoft Quantum \| Microsoft Docs](https://docs.microsoft.com/ja-jp/quantum/language/?view=qsharp-preview)

2020年現在、私のような一般のプログラマには量子コンピュータを使ってプログラミングする方法はありません。しかし Q# には量子コンピューティングのシミュレーション機能が含まれており、また Q# はOSSとして開発されているため、**Q# を使うことで誰でも量子コンピューティングを体験できます** 。Q# の実行環境はDocker Imageでも提供されていて、WindowsはもちろんLinux上でも実行できます。

なお Q# のプログラム自体は既存の"古典的な"コンピュータ用プログラミング言語(C言語、Go言語、Lazy K等)とは全く異なる体型を持っていて、一般の古典的プログラマには超絶に難しいのですが、ただ Q# を動かすだけなら簡単にできます。**Q# の文法や機能などは本稿では一切説明しません。私もまだ一切分からないからです** 。

## 環境
- Docker 19.03.4
- Q# 0.10.1912.501
- Python 3.7.5

## Q# プログラムの記述
こちらが Q# のHello Worldプログラムです。`MyNamespace.Main`というoperationを定義しています。

```csharp:main.qs
namespace MyNamespace {
  operation Main () : Unit {
    using (register = Qubit()) {
      Microsoft.Quantum.Intrinsic.Message("Hello, Q#");
    }
  }
}
```

Q# は、他の古典的プログラミング言語から呼び出して利用します。
下記はPythonから`Main` operation を呼び出す例です。

```python:main.py
print("Hello, Python!")

import qsharp
qsharp.get_workspace_operations()

from MyNamespace import Main

Main.simulate()
```

## Dockerで Q# 実行環境の構築
Q# の実行には本来Python等のセットアップも必要で面倒なのですが、全部入りの[docker iamge](https://github.com/microsoft/iqsharp/blob/pull/v0.10.2001.111/images/iqsharp-base/Dockerfile)がMicrosoftの Container Registryから提供されているため、簡単に実行できます。

```Dockerfile:Dockerfile
FROM mcr.microsoft.com/quantum/iqsharp-base:latest

WORKDIR /app
COPY . ./
```

```yaml:docker-compose.yml
version: '3'
services:
  q:
    build: .
    volumes:
      - ./:/app
```

### 実行
上記`Dockerfike`と`docker-compose.yml`ファイルを作成した後にbuildすれば、Q# が動きます。

```bash
$ docker-compose build
$ docker-compose run q python main.py
```
`Hello, Python!`と`Hello, Q#`とが両方表示されれば成功です。

Git管理する場合は、gitignoreに`obj/`を登録しましょう。

```:.gitignrore
obj/
```

以上で Q# を動かすことができました。

## まとめ
Q# は簡単に動かすことができます。量子コンピューティングの時代は目前まで来ています。

もし Q# や量子コンピューティングに興味を持ったら、上記の実行環境を片手に[Microsoftのドキュメント](https://docs.microsoft.com/ja-jp/quantum/?view=qsharp-preview)を読んでください。
<script>のdefer属性、async属性の意味

#htmlから外部にあるjsファイルを読み込みたいときの適切な処理
javascriptについて[MDN Web Docs](https://wiki.developer.mozilla.org/ja/)で勉強したことを振り返るために投稿。

##htmlとscriptは適切なタイミングで読み込まないとダメ
スクリプトを外部から読み込むときにはhtmlのscriptタグにに属性を追加することがエラーを回避できる。

##defer属性とasync属性
この二つの属性がスクリプトのブロッキングを回避するやつ

###async属性
ページのレンダリングをブロックせずにスクリプトをダウンロードして、ダウンロードし終わると直ちに実行する。
複数のスクリプトがある場合特定の順序で実行される保証はなし、ダウンロード完了順？
ページの表示を邪魔しない。スクリプト同士が依存していない場合はおすすめ。

###defer属性
ページに現れた順でスクリプトを実行。つまり書かれた順。スクリプト同士が依存しているならこっち、対応するスクリプトは最初に実行するように。
【SQL】メモ1(テーブル作成(CREATE TABLE)、参照(SELECT)、条件の指定(WHERE))、更新(UPDATE))

###目的
時々忘れるので自分用のメモとして保存。
データが恐竜チックなのは、完全に趣味。

###1.テーブルの作成(CREATE)
*__形式：__*
*__CREATE TABLE テーブル名(項目名1 データタイプ,,,項目名N データタイプ);__*

```sql
CREATE TABLE tbl_dino(id INTEGER PRIMARY KEY AUTOINCREMENT
,dname0 TEXT
,type0 TEXT
,n_src1 INTEGER
,type1 TEXT
,n_src2 INTEGER
,type2 TEXT);
```


###2.全てのレコードを表示(SELECT )
__形式：__
*__SELECT * FROM テーブル名;__*

``` sql
-- 全カラムの全レコードを表示
select * from tbl_dino;
```
実行結果

|id|dname0|type0|n_src1|type1|n_src2|type2|
|---|---|---|---|---|---|---|
|1|ベロキラプトル|normal|0||0||
|2|ステゴサウルス|normal|0||0||
|3|アパトサウルス|normal|0||0||
|4|ノドサウルス|rare|0||0||
|6|ティラノサウルス|epic|0||0||
|7|ユタラプトル|rare|0||0||
|8|インドミナスレックス|regend|6|epic|1|normal|
|9|ノドパトサウルス|epic|4|rare|3|normal|
|10|ドラコレックス|normal|0||0||
|11|アンキロサウルス|normal|0||0||
|12|ケントロサウルス|epic|0||0||
|13|トリケラトプス|rare|0||0||
|14|ステゴケラトプス|epic|13|rare|2|normal|
|15|トリケラトプス|normal|0||0||
|16|ドラコケラトプス|regend|15|normal|10|normal|
|17|エルリコサウルス|epic|0||0||
|18|イリタトル|normal|0||0||
|19|スコミムス|normal|0||0||
|20|スコタトル|rare|19|normal|18|normal|
|21|ステゴディアス|regend|9|epic|2|normal|
|23|アンキロサウルス|epic|0||0||
|24|アンキトロサウルス|regend|23|epic|12|epic|

###3.条件を指定して、情報を表示(WHERE)

__形式：__
*__SELECT 列名1,,,,列名N FROM tbl_dino WHERE 条件;__*

```sql
-- type0が'epic'のid,ｄname0を表示
SELECT id,dname0 FROM tbl_dino
 WHERE type0 = 'epic';
```

実行結果

|id|dname0|
|---|---|
|6|ティラノサウルス|
|9|ノドパトサウルス|
|12|ケントロサウルス|
|14|ステゴケラトプス|
|17|エルリコサウルス|
|23|アンキロサウルス|

###4.指定の条件のレコードを更新(UPDATE)
__形式:__
 *__UPDATE テーブル名 SET 列名1=値1,,,,列名n=値n WHERE 条件__*


```sql
-- id=1のレコードを表示(確認のため)
SELECT * FROM tbl_dino WHERE id = 1;
```
変更前

|id|dname0|type0|n_src1|type1|n_src2|type2|
|---|---|---|---|---|---|---|
1|ベロキラプトル|normal|0||0||

```sql
-- id=1のdname0,type0を変更
UPDATE tbl_dino SET dname0='veloki',type0='norm'
 WHERE id = 1;
```
変更結果

|id|dname0|type0|n_src1|type1|n_src2|type2|
|---|---|---|---|---|---|---|
1|veloki|norm|0||0||
Access denied for user 'root'@'localhost' (using password: YES) と戦って諦めた話

#概要
H２DBからローカルのMySQLに移行して開発をしようとしてハマった話です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314481/98f27a92-6db3-5a6e-00ab-feafe205e131.png)


#環境
- SpringBoot2
- MySQL Ver 8.0.17

#エラー内容
パスワードがうんチャラで怒られてます笑

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314481/3febe79b-107b-49fc-d163-6a5a5d9ebcc2.png)

#やったこと
##WorkBenchでパスワード再設定する

ダメでした。。

##MySQLサーバー立て直す

ダメでした。。

##パスワードの設定を消す

できました。。。。！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314481/18b15e3d-d7c9-b96b-c6af-d0b3b576b44a.png)


#結論
とりあえずデフォルトがパスワード設定してないから、最初はパスワード入れないでアクセスすべし。
アクセスできたらパスワードを設定すべし！！