OmniAICreator/Qiita-1.07M huggingface dataset:
Macのカレンダーアプリから全イベントをテキストで取り出すJXA（JavaScript for Automation）

## MacのカレンダーApp内の全予定をテキストで取り出す
　Macのカレンダーアプリ（Calendar.app)から、指定したカレンダー内の全イベントをテキスト形式
 （yyyy/mm/dd hh:mm - hh:mm Summary)
で取り出して、テキストエディットAppに書き出す JXA（JavaScript for Automation） ができたので
とりあえずソースを公開します。

## ソースのアップデート

　最初に公開したソースは、できた！としてとりあえず版でした。
その後、使い勝手など以下の改善をしました。

* カレンダー選択のダイアログがカレンダーアプリに隠れていたのを前に出す
* 出力結果が日付順になるようにソート
* カレンダー名と出力件数を表示する
* カレンダー名をドキュメントの名前にセットする

## 使用上の注意
　**繰り返しは解釈していません** （Summury の後に ">>" があれば繰り返しの予定で、繰り返しの情報が iCal形式の定義情報が付加されています）
　件数が多いカレンダーでは、とっても時間がかかるようです。
その際は、全件出力している for 文を適当な件数（ 0~199 など）に分割して処理すれば良いと思います。

## 参考になったサイト

* [Mac : JavaScript for Automation (JXA) 例文辞典](http://www.openspc2.org/reibun/JXA/Yosemite/)
* [JavaScriptによるMacの自動操作入門の情報まとめ](https://blog.s0014.com/posts/2016-08-04-osxjs1/)


## ソース

```Javascript:ical2txt_java.scpt
// カレンダーアプリ（Calendar.app)から、指定したカレンダー内の全イベントをテキスト形式
// （yyyy/mm/dd hh:mm - hh:mm Summary)
// で取り出して、TextEdit.app に書き出すJXA（JavaScript for Automation）
var app = Application.currentApplication()
app.includeStandardAdditions = true

var iCal = Application("Calendar")
iCal.activate()
var calNames = []
for (item in iCal.calendars) {
	calNames.push(iCal.calendars[item].name())	// カレンダー名を取り出す
}
delay(2)
app.activate()
var iCalName = app.chooseFromList(calNames, {		// カレンダー名の選択
	withPrompt: "抽出するカレンダーを選んでください。",
    defaultItems: [calNames[1]]
	})
var Events = iCal.calendars[iCalName].events
var result = []
for (ev in Events) {		// 指定されたカレンダー内の全てのイベントを取り出す
	var startDT = YMDHM(Events[ev].startDate())
	var endDT = YMDHM(Events[ev].endDate())
	var timeStamp = startDT + " - " + endDT.slice(-5)
	var sum = Events[ev].summary()
	try {var reccur = Events[ev]. recurrence() }
	catch(e) {}
	if (reccur !== null) { sum = sum + " >> " + reccur }
	result.push(timeStamp + " " + sum)
}
result.sort()		// 日時の順にソートする
var sortedText = result.join('\n')
var textEdit = Application("TextEdit");
textEdit.activate()		// TextEdit を起動する
var doc = textEdit.Document(); // 新規にドキュメントを作成
textEdit.documents.push(doc); //　画面に表示する
doc.text = sortedText		// TextEdit に結果をセットする
// doc.name = String(iCalName)  // ドキュメント名をセット（セットすると保存ができなくなるので、コメントアウト）
app.activate()
app.displayDialog("「" + String(iCalName) + "」から予定を " + result.length + " 件抽出しました。")
textEdit.activate()

function YMDHM(wDate) {
	var yy = wDate.getFullYear()
	var mm = ("0" + (wDate.getMonth() + 1)).slice(-2)
	var dd = ("0" + wDate.getDate()).slice(-2)
	var hh = ("0" + wDate.getHours()).slice(-2)
	var min = ("0" + wDate. getMinutes()).slice(-2)
	return yy + "/" + mm + "/" + dd + " " + hh + ":" + min
}

```
git commitするまでの流れ

[git commit するまでに自分がやっていること](https://gist.github.com/kurotaky/5483492) に影響され、自分の方法もまとめてみました。

編集後、git statusで変更部分を確認。

```
$ git status
```

差分を確認

```
$ git diff
```

追加ファイルが有る場合は git add -N してから差分を確認

```
$ git add -N hoge.txt
$ git diff
```


内容確認しながら細かくaddする

```
$ git add -p
# y(yes), n(no) でaddするかどうか選択できる。
# s でさらに細かくできる
```

git statusで確認

```
$ git status
```

自分がインデックスに追加したものが意図しているものかどうか、

```
$ git diff --cached
```

コミットする(-v をつけるとコミットメッセージを書く時に差分が表示される)

```
$ git commit -v
```

statusが想定した状態になっているか確認

```
$ git status
```


コミットが新しく追加されているか確認

```
$ git log -n 2
```

直前のコミットの内容が正しいか確認する

```
$ git log -p -1
```
FLOCSSとBEMを比べてみた所感

FLOCSSはFoundation/Layout/Objectに分割し、更にObjectをComponents/Projectに分割しています。

Objectの分割について判断が分かれるようですが、私の理解では以下の通りです。

- Componentは独立して存在できる単位
- Componentを複数Componentによって構成してはいけない
- 複数Componentで構成するものはProject

このObjectの分割に似た設計でBEM(Block/Element/Modifier)があります。

- Block: 独立して存在できる単位
- Element: Blockの構成要素で独立して存在できない
- Modifiler: 装飾

これらを比べると以下の違いがあることがわかります。

FLOCSS

- 独立して存在できないものを定義する概念はない
- 独立して存在するComponentとそれをまとめるProjectを区別している

BEM

- 独立して存在できないものを定義するElementがある
- 独立して存在できるBlockは複数Blockで構成することも可能でそれもBlock

個人的には以下の理由でFLOCSSのObjectの分割よりもBEMの方が良いと感じました。

- 独立しては存在できないが、他の要素で共通する部分をElementとして表現可能
- ElementがBlockになるよりもComponentがProjectになる事の方が多そうなため、BEMの方が変更に強い
pandas で 最大値を抽出しその値を変更する

まず、
output_filesというディレクトリ(フォルダ)に
data.csvという名前のcsvファイルをつくる。

中身は
apple, 4
banana, 5
orange, 15
となっている。

```:data.csv
apple, 4
banana, 5
orange, 15
```

このcsvファイルから、
数値が最大である15を抽出し、
その15に1を加えて16に書き換える事を目標とする。


```py:
import pandas as pd

#data.csvの最大値を+1する関数
def rewrite_pop():
    # data.csvを読み込み、最大値をpop_fur_couに格納する
    df = pd.read_csv('output_files/data.csv', names=['fru_name', 'count', ])
    pop_fur_cou = int(df.iat[df['count'].idxmax(), 1])
    # 最大値であるpop_fur_couを+1する
    pop_fur_cou += 1
    # 1増えた数値をdata.csvに上書きする
    df.iat[df['count'].idxmax(), 1] = pop_fur_cou
    df.to_csv('output_files/data.csv', index=False, header=False)

rewrite_pop()
```

```py:
df.iat[df['count'].idxmax(), 1] = pop_fur_cou
```

は

```py:
df.loc[df["count"].idxmax(), "count"] = pop_fur_cou
```
の方がいいかも。。。
【隙間時間でBlender】環境構築 編

## 環境構築
※Mac環境での説明になります。

### ダウンロードとインストール
[Blender公式サイト](https://www.blender.org/)からBlender本体をダウンロードします。

<img width="1008" alt="スクリーンショット 2020-02-29 21.01.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252756/e988179d-dd99-ad02-91b9-8bc625ef8244.png">


ダウンロード完了後、dmgファイルを開き、指示に従ってアプリケーションフォルダへ移動させます。

無事インストールに成功したら、マウントしたdmgファイルのアンマウント、dmgファイルの削除を適宣行ってください。

### 日本語化
`Edit > Preferences...`から環境設定Windowを開きます。
<img width="276" alt="スクリーンショット 2020-02-29 21.15.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252756/b30caca0-9a11-2337-975d-b809da87c851.png">
`Interface > Translation`にチェックを入れます。
また、Translation項目内のInterfaceにチェックを入れることでインターフェイスの表示言語が変更されます。
このとき、New Dataにチェックを入れてしまうと、生成するオブジェクト名が２バイト文字になってしまい、思わぬエラーにつながってしまう場合があります。
<img width="772" alt="スクリーンショット 2020-02-29 21.13.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252756/65bde996-2389-100b-c734-8960cec7763d.png">

### フォントの変更
変更可能なフォントは２種類あります。

- UIフォント
- 等幅フォント

日本語化と同様、Preferencesウィンドウを開きます。
`インターフェイス > テキストレンダリング`から、変更したい箇所のフォントを選択します。

今回は`System/Library/Fonts/ヒラギノ丸ゴ ProN W4`を設定しています。
<img width="529" alt="スクリーンショット 2020-02-29 21.35.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252756/b3afb8d7-9af5-5a69-1128-1706ac543925.png">
<img width="772" alt="スクリーンショット 2020-02-29 21.40.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252756/2df496fc-97cd-ab94-089a-f97f657463e1.png">

## 参考
https://blender-cg.net/download-install/
https://blender-cg.net/nihonngoka/
[Oracle Cloud] OCI DBCS ORA-28001 パスワード有効期限切れが起きたときに解除する方法

# はじめに

Oracle Cloud Infrastructure(以下OCI)には、Oracle DB のマネージドサービスがいくつかあります。今までオンプレミスで使ってきた Oracle DB と同じような操作感で扱うことのできる Database Cloud Service では、Default でパスワードの有効期限が設定されています。この存在を知らないまま本番運用をしてしまうと、ある日いつのまにかパスワードの有効期限が切れて、Oracle DB へ接続できなくなります。・・・自分の検証環境で一度やらかしてしまいました。忘れないために記事を書きます。



# 有効期限が切れるとどうなるの？

  `ORA-28001: the password has expired` 発生して、Oracle DB へ接続が失敗します。以下は、Go言語で出力されているログです。

```
Feb 29 17:06:19 runner-00001702e4c2 app_id=ocid1.fnapp.oc1.phx.aaaaaaaaagkp665ioxdui2ecjijcte6ij7c42fbajkh5idepo7tiwrfjnd2q,fn_id=ocid1.fnfunc.oc1.phx.aaaaaaaaaax6eejesdal35gjf6ognxlys2xbk3q2lkssmj3uhb3a6nofvyxq 2020-02-29T08:06:19.504Z	ERROR	serless_get-image-metadata/func.go:121	ORA-28001: the password has expired
```



# パスワード変更とロック解除

SSH で oracle ユーザーへスイッチします

```
[opc@serverlessdemo ~]$ sudo su - oracle
Last login: Sat Feb 29 09:07:08 UTC 2020
[oracle@serverlessdemo ~]$ 
[oracle@serverlessdemo ~]$   
```



SQL*Plus で接続します

```
[oracle@serverlessdemo ~]$ sqlplus / as sysdba

SQL*Plus: Release 18.0.0.0.0 - Production on Sat Feb 29 09:15:19 2020
Version 18.7.0.0.0

Copyright (c) 1982, 2018, Oracle.  All rights reserved.


Connected to:
Oracle Database 18c Standard Edition 2 Release 18.0.0.0.0 - Production
Version 18.7.0.0.0

SQL>
```



自分の環境は、マルチテナント環境なので、該当のユーザーが存在する PDB に接続

```
alter session set container=sugi;
```



sugi user の PROFILE 確認します

```
select username,profile from dba_users where username = 'SUGI';
```



実行例

sugi ユーザーは、DEFAULT プロファイルを使用していることが分かります

```
SQL> select username,profile from dba_users where username = 'SUGI';

USERNAME
--------------------------------------------------------------------------------
PROFILE
--------------------------------------------------------------------------------
SUGI
DEFAULT


SQL>
```



DEFAULT PROFILE の詳細を確認します

```
select PROFILE,RESOURCE_NAME,RESOURCE_TYPE,LIMIT from dba_profiles where resource_name = 'PASSWORD_LIFE_TIME';
```



実行例

`60` 日となっています。構築したタイミング、バージョンにもよって日数は変わってくるかもしれません

```
SQL> select PROFILE,RESOURCE_NAME,RESOURCE_TYPE,LIMIT from dba_profiles where resource_name = 'PASSWORD_LIFE_TIME';
DEFAULT 
        ,PASSWORD_LIFE_TIME              ,PASSWORD,60
```



ロックされたユーザーの新パスワードを設定します

```
ALTER USER SUGI IDENTIFIED BY a7h#fa_JYbdiu976FafytoOuiybla;
```



実行例

```
SQL> ALTER USER SUGI IDENTIFIED BY a7h#fa_JYbdiu976FafytoOuiybla;

User altered.

SQL>
```



アカウントをアンロックします

```
ALTER USER SUGI ACCOUNT UNLOCK;
```



実行例

```
SQL> ALTER USER SUGI ACCOUNT UNLOCK;

User altered.

SQL>
```





Default Profile の有効期限を無期限に変更します

```
ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;
```



実行例

```
SQL> ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;

Profile altered.

SQL>
```



確認

```
SQL> select PROFILE,RESOURCE_NAME,RESOURCE_TYPE,LIMIT from dba_profiles where resource_name = 'PASSWORD_LIFE_TIME';
DEFAULT 
        ,PASSWORD_LIFE_TIME              ,PASSWORD,UNLIMITED
```



これで、Oracle DB への接続が出来るようになります。
goenvでGolangのバージョン管理（最新版のGolangを使う）

`golang` を使った開発のため、バージョン管理を導入したときの手順を書きます。

## goenv について

**goenv** は Golang のバージョン管理ツールです。

https://github.com/syndbg/goenv

pyenv や rbenv など、他のバージョン管理ツールと同じようなものです。

## 環境情報

* macOS Catalina 10.15.3
* zsh 5.7.1 (x86_64-apple-darwin19.0)

## goenv インストール

goenv のソースをリポジトリから取得する。 

```console:zsh
$ git clone https://github.com/syndbg/goenv.git ~/.goenv
```

次は bash の場合 `.bashrc`、zsh の場合 `.zshrc` の設定をしていきます。 

## goenv パス設定

`goenv` を使うためのパスを通します。


### .zshrc

`$ vim ~/.zshrc` で編集開始。

```.zshrc:.zshrc
...
export GOENV_ROOT=$HOME/.goenv
export PATH=$GOENV_ROOT/bin:$PATH
eval "$(goenv init -)"
export PATH="$GOROOT/bin:$PATH"
export PATH="$PATH:$GOPATH/bin"
...
```

## GOPATH 設定

go を使う時に必要な `$GOPATH` を設定しておきます。

### .zshrc

`goenv` のパス設定のあとに追記します。

`$ vim ~/.zshrc` で編集開始。

```.zshrc:.zshrc
...
export GOPATH=$HOME/go
...
```

設定すると、`$HOME/go` 以下にパッケージ等がインストールされていくようになります。
(`go get -u github.com/go-sql-driver/mysql`  したものとか。)



## 設定反映

```consoe:zsh
$ exec $SHELL
```

## Go インストール

```
$ goenv install -l
Available versions:
  1.2.2
  1.3.0
  1.3.1
  ...
  1.11.4

...

$ goenv install 1.11.4
...
Installed Go Darwin 64bit 1.11.4 to /path/to/.goenv/versions/1.11.4
```

## 利用する Go バージョンの指定

環境によってバージョン切り替えます

```
# global の設定
$ goenv global 1.11.4

# 特定リポジトリ以下のバージョンを指定する場合
$ cd /path/to/repository
$ goenv local 1.9.7
```

これで、好きな場所、好きなバージョンで `go` を使えます。
複数アカウントのCloudtrailのログを集約する

2020/02/29現在、Cloudtrailは自動的にONとなっていてイベント履歴
という機能で90日保管され、古いものから削除する仕様となっています。

Cloudtrail自体に保管する「イベント履歴」は無効化／削除することはできません。
S3などにログ出力する機能があり、こちらはON/OFF、削除、更新することが可能です。
また、自動ONの場合はS3のオブジェクトに対するアクセスのような
一部イベントは記録しない仕様となっています。（設定変更により記録可能）

今回は本番、開発など複数のアカウントに分割している環境化において
Cloudtrailの監査ログを1つのアカウントに集約していきます。
## 利用するアカウント
アカウントID　123456789012　稼働環境のアカウント
アカウントID　123456789013　ログ蓄積アカウント

## ログ蓄積アカウント(123456789013)の準備
ログを蓄積するためにバケットを作成します。
・バケットの「パブリックアクセスブロック」をOFFにする
・他のアカウントからアクセスできるようにバケットポリシーを設定する

**バケットポリシー設定**
バケット名は「kaikusakari-cross-acount-cloudtrail」とする

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AWSCloudTrailAclCheck20131101",
            "Effect": "Allow",
            "Principal": {
                "Service": "cloudtrail.amazonaws.com"
            },
            "Action": "s3:GetBucketAcl",
            "Resource": "arn:aws:s3:::kaikusakari-cross-acount-cloudtrail"
        },
        {
            "Sid": "AWSCloudTrailWrite20131101",
            "Effect": "Allow",
            "Principal": {
                "Service": "cloudtrail.amazonaws.com"
            },
            "Action": "s3:PutObject",
            "Resource": [
                "arn:aws:s3:::kaikusakari-cross-acount-cloudtrail/AWSLogs/123456789012/*"
            ],
            "Condition": {
                "StringEquals": {
                    "s3:x-amz-acl": "bucket-owner-full-control"
                }
            }
        }
    ]
}
```

## ログ出力をONにする
稼働環境（123456789012）でログ出力をONにする。
ログ出力時にバケット名を入力する欄があり上で指定したバケットを入力する。

## リスク
バケット名、プレフィックス、アカウントIDが他者に漏洩した場合は
（もしくは総当たりなどを受けた場合は）他アカウントのCloudtail
ログがバケットに入ってしまう可能性があります。
nodenvでインストール可能なバージョン `nodenv install -l` を更新しようとしてハマったのでメモ

nodenvは少し前にインストールしており、brewで入れたのかgitで入れたのかも把握していませんでした。

おそらくbrew listで見つからず、パスは以下の通りだったためgitで入れたのだと思います。

```
$ which nodenv
/Users/okamoto/.nodenv/bin/nodenv
```
インストール可能なバージョンの更新方法は[公式のこちら](https://github.com/nodenv/nodenv#updating-the-list-of-available-node-versions)で以下のコマンドを実行すべきと書いてあります。

```
$ cd ~/.nodenv/plugins/node-build
$ git pull
```

しかし、 `~/.nodenv/plugins/node-build` というパスは存在していません。

doctor実行してみました。

```
$ curl -fsSL https://github.com/nodenv/nodenv-installer/raw/master/bin/nodenv-doctor | bash
Checking for `nodenv' in PATH: /Users/okamoto/.nodenv/bin/nodenv
Checking for nodenv shims in PATH: OK
Checking `nodenv install' support: /usr/local/bin/nodenv-install (node-build 4.6.3)
Counting installed Node versions: 2 versions
Auditing installed plugins: OK
```

node-buildを疑っていましたが、インストールされていました。

以下のnode-buildのreadmeを見るとインストール方法が書いてありました。
https://github.com/nodenv/node-build#installation

```
# As a nodenv plugin
$ mkdir -p "$(nodenv root)"/plugins
$ git clone https://github.com/nodenv/node-build.git "$(nodenv root)"/plugins/node-build
```

この通り実行し、改めてdoctor実行しました。

```
$ curl -fsSL https://github.com/nodenv/nodenv-installer/raw/master/bin/nodenv-doctor | bash
Checking for `nodenv' in PATH: /Users/okamoto/.nodenv/bin/nodenv
Checking for nodenv shims in PATH: OK
Checking `nodenv install' support: multiple
  You seem to have multiple `nodenv-install' in the following locations.
  Please pick just one installation and remove the others.
  
  /Users/okamoto/.nodenv/plugins/node-build/bin/nodenv-install
  /usr/local/bin/nodenv-install

Counting installed Node versions: 2 versions
Auditing installed plugins: OK
```

複数入っていると指摘されているので元々入っていたほうを削除し、doctorを再実行します。

```
curl -fsSL https://github.com/nodenv/nodenv-installer/raw/master/bin/nodenv-doctor | bash
Checking for `nodenv' in PATH: /Users/okamoto/.nodenv/bin/nodenv
Checking for nodenv shims in PATH: OK
Checking `nodenv install' support: /Users/okamoto/.nodenv/plugins/node-build/bin/nodenv-install (node-build 4.7.0-10-gb4ec27b0)
Counting installed Node versions: 2 versions
Auditing installed plugins: OK
```

指摘がなくなりました。

`nodenv install -l` を実行しインストール可能なバージョンが更新されていることが確認できました。

次からは以下のコマンドで更新できると思います。

```
$ cd ~/.nodenv/plugins/node-build
$ git pull
```
pyenv pipenv 関連コマンド一覧

忘れないようにメモ。

##pyenv
```terminal
//インストール可能なpythonのバージョン一覧
$ pyenv install --list

//pythonインストールコマンド
$ pyenv install (任意のバージョン)

//バージョンの設定(ローカルの場合、現在のdirに反映)
$ pyenv local (任意のバージョン)

//バージョンの設定(グローバルの場合、全体に反映)
$ pyenv global (任意のバージョン)

//バージョンの確認
$ python --version

//インストール済みバージョン一覧
$ pyenv versions
```

##pipenv
```terminal
//パッケージのインストール
$ pipenv install (パッケージ名)

//パッケージのインストール(バージョン指定有)
$ pipenv install (パッケージ名)==(任意のバージョン)

//開発環境だけで使うパッケージをインストール
$ pipenv install --dev (パッケージ名)

//Python本体のバージョンを指定してインストール
$ pipenv --python (任意のバージョン)

//pipenvで作った環境内でshellを起動
$ pipenv shell

//仮想環境のpathを確認
$ pipenv --venv

//パッケージのセキュリティ脆弱性検出
$ pipenv check

//パッケージの依存グラフの表示
$ pipenv graph
$ pipenv graph --reverse
```

##アプリの起動/起動スクリプト[scripts]
```terminal
//pipenv run startでsample.pyを起動する例
[scripts]
start = "python sample.py"

$ pipenv run start
```
brewで入れたnodenvをfish shellで使う

brewでnodenvをインストールします。

```
brew install nodenv
```

`~/.config/fish/config.fish` に以下を追記します。

```
eval (nodenv init - | source)
```

※fish shellでは `eval "$(nodenv init -)"` を使えないため注意です。

最後に以下を実行し問題ないことを確認します。

```
$ curl -fsSL https://github.com/nodenv/nodenv-installer/raw/master/bin/nodenv-doctor | bash
```

## 参考にしたページ

- [nodenv/nodenv: Manage multiple NodeJS versions.](https://github.com/nodenv/nodenv)
- [fishでのevalの設定方法 - emahiro/b.log](https://ema-hiro.hatenablog.com/entry/20170523/1495519890)
rails generate が動かないときの対処

`rails g`で以下のようなエラーで動かない場合

```
/var/share/sample/vendor/bundle/ruby/2.2.0/gems/spring-1.3.6/lib/spring/client/run.rb:98:in `gets': Interrupt
    from /var/share/sample/vendor/bundle/ruby/2.2.0/gems/spring-1.3.6/lib/spring/client/run.rb:98:in `verify_server_version'
    from /var/share/sample/vendor/bundle/ruby/2.2.0/gems/spring-1.3.6/lib/spring/client/run.rb:56:in `run'
    from /var/share/sample/vendor/bundle/ruby/2.2.0/gems/spring-1.3.6/lib/spring/client/run.rb:37:in `warm_run'
    from /var/share/sample/vendor/bundle/ruby/2.2.0/gems/spring-1.3.6/lib/spring/client/run.rb:26:in `call'
    from /var/share/sample/vendor/bundle/ruby/2.2.0/gems/spring-1.3.6/lib/spring/client/command.rb:7:in `call'
    from /var/share/sample/vendor/bundle/ruby/2.2.0/gems/spring-1.3.6/lib/spring/client/rails.rb:24:in `call'
    from /var/share/sample/vendor/bundle/ruby/2.2.0/gems/spring-1.3.6/lib/spring/client/command.rb:7:in `call'
    from /var/share/sample/vendor/bundle/ruby/2.2.0/gems/spring-1.3.6/lib/spring/client.rb:26:in `run'
    from /var/share/sample/vendor/bundle/ruby/2.2.0/gems/spring-1.3.6/bin/spring:48:in `<top (required)>'
    from /var/share/sample/vendor/bundle/ruby/2.2.0/gems/spring-1.3.6/lib/spring/binstub.rb:11:in `load'
    from /var/share/sample/vendor/bundle/ruby/2.2.0/gems/spring-1.3.6/lib/spring/binstub.rb:11:in `<top (required)>'
    from /var/share/sample/bin/spring:16:in `require'
    from /var/share/sample/bin/spring:16:in `<top (required)>'
    from bin/rails:3:in `load'
    from bin/rails:3:in `<main>'
```

springを以下のコマンドで停止させると解決できました。

```
bundle exec spring stop
```
docker概要

# コンテナの前提知識

従来型と仮想サーバと比較しながら見ていく

## 従来のアプリケーション実行環境

- CPUやメモリ、ディスクが搭載されたハードウェアを購入
- OSをインストール
- (複数の)アプリケーションをインストール

ひとつのハードウェアにひとつのOSがあり複数のアプリをインストールして使用

## 仮想サーバ

- CPUやメモリ、ディスクが搭載されたハードウェアを購入
- OSをインストール
- Hypervisorをインストール
    - VMwareやXen,Hyper-Vなどが有名
- 複数のOSをインストールし、それぞれのOSの上にアプリケーションをインストール

ハイパーバイザーは複数のバーチャルサーバを実行することができる
EC2などの仮想サーバもバーチャルサーバとして実行されている
OSまるごとのバックアップの取得ができる

## コンテナ

- CPUやメモリ、ディスクが搭載されたハードウェアを購入
- OSをインストール
- コンテナエンジン、またはコンテナデーモンをインストール
    - コンテナデーモンはコンテナを実行できるものでDockerが有名
- **OSはインストールせず、**アプリケーション(コンテナ)をインストール

ひとつのコンテナに複数のアプリケーションを入れることはできない
コンテナのOSはホストOSのカーネルを共有しており、カーネルまで含めて仮想化しているバーチャルサーバと比べると動作が軽量である
コンテナのOSと異なっていてもLinuxのカーネルは互換性があるため、互換性の範囲内であればアプリケーションは動作する
実行前のコンテナをコンテナイメージと呼ぶ

Linuxイメージ:ファイルシステムとライブラリ
OS:ファイルシステムとライブラリと**カーネル**

# コンテナのコンセプト

- Dockerのデーモンをホストマシンにインストール
    - Dockerデーモンはコンテナイメージを実行したりネットワーク周りを管理したり、コンテナ全般の管理を行う
- Dockerクライアントをインストール
    - Dockerクライアントはデーモンに対して指示を出す
    - ホストマシンにインストールしてもいいし、別のマシンにインストールしてもよい
    - ビルドコマンドを実行したり、コンテナイメージを作成してレジストリという領域にイメージをアップロードしたりする
        - レジストリはDockerhubなどが有名
        - AWSではElastic Container RegistryというプライベートなDockerイメージのアップロード場所をサービスとして提供

# Docker使い方の流れ

- `docker pull`でイメージをダウンロードし修正
- `docker push`でコンテナをアップロード
- デーモンに対して`docker run`
- デーモンはレジストリからイメージをダウンロードしてきてコンテナを実行する

# 引用

https://www.youtube.com/watch?v=DS5HBTMG1RI
numpy その1

ndarray n次元のアレイ

```py:1
import numpy as np

arr = np.array([[1, 2, 3], [4, 5, 6]])
print(arr)
```

```:1の実行結果
[[1 2 3]
 [4 5 6]]
```

アレイのデータタイプを指定できる。
何ビットの型を利用するか。
ビット数を指定することで確保するメモリ量を調整することができます。

```py:2
import numpy as np

a = [1, 2, 3]

ndarray = np.array(a, dtype='float32')
print(ndarray.dtype)

ndarray = np.array(a, dtype='int32')
print(ndarray.dtype)
```

```:2の実行結果
float32
int16
```

データタイプの変更

```py:3
import numpy as np

a = [1, 2, 3]

arr = np.array(a, dtype='int32')
arr2 = arr.astype('float32')

print(arr2.dtype)
```

```:2の実行結果
float32
```
fatal: bad config line 1 in file /home/ユーザー名/.gitconfigというエラー

プログラミング初心者です。
下記のサイトを参考にrailsで作成したアプリをAWSで公開しようとしていたところ表題のようなエラーが発生しました。

(デプロイ編①)世界一丁寧なAWS解説。EC2を利用して、RailsアプリをAWSにあげるまで
https://qiita.com/naoki_mochizuki/items/814e0979217b1a25aa3e

```
[ユーザー名|rails]$ git clone git@github.com:~~~~~~~~~~~~
```
のところで、

```
fatal: bad config line 1 in file /home/ユーザー名/.gitconfig
```
という、エラーが発生しました。指示通り、/home/ユーザー名/.gitconfigのファイルを見てみると、１行目にコピペしたハイフンをそのままにしていたので、消去したら、正常にgit cloneできました。

```
-----------------------------　←ここが不要！！！
[user]
  name = your_name
  email = hoge@hoge.com

[color]
  ui = true

[url "github:"]
    InsteadOf = https://github.com/
    InsteadOf = git@github.com:
-----------------------------　←ここが不要！！！
```
このハイフンも必要と勘違いしていました。
【Udemy Python3入門+応用】　9.まずはprintで出力

**※この記事はUdemyの
「[現役シリコンバレーエンジニアが教えるPython3入門+応用+アメリカのシリコンバレー流コードスタイル](https://www.udemy.com/course/python-beginner/ "現役シリコンバレーエンジニアが教えるPython3入門+応用+アメリカのシリコンバレー流コードスタイル")」
の講座を受講した上での、自分用の授業ノートです。
講師の[酒井潤](https://twitter.com/sakaijun "酒井潤")さんから許可をいただいた上で公開しています。**

##■並べてprint
#####◆スペースを挟んで並列させる
```python:print_arrange_space
print('Hi', 'Mike')
```
```:result
Hi Mike
```
`print()`で文字列と文字列を`,`で区切ると、スペースをはさんで並列される。

#####◆任意の文字列を挟んで並列させる
```python:print_arrange_sep=''
print('Hi', 'Mike', sep=',')
```
```:result
Hi,Mike
```
`sep=''`で文字を指定すると、その指定された文字を挟んで並列される。

<br>

##■文字列の終わり方を指定する
#####◆終わり方を指定する(例：改行)
```python:print_end_\n
print('Hello', end='\n')
print('Hello', end='\n')
```
```:result
Hello
Hello
```
`end=''`でprintで出力する文字列の終わり方を指定できる。
`\n`は「改行」の意味。

#####◆`end=''`を記述しなかった場合
```python:print_end_nothing
print('Hello')
print('Hello')
```
```:result
Hello
Hello
```
`end=''`を記述しないと改行して終わる。

#####◆`end=''`内の文字列を指定しなかった場合
```python:print_end_''
print('Hello', end='')
print('Hello', end='')
```
```:result
HelloHello
```
`end=''`を記述した上で、`''`の中身を何も書かないと、何も挟まずに並列される。
【JavaScript】JSのオブジェクトの書き方【初心者】

#超初心者向けです。

```index_3.html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <script src="js/jquery-3.4.1.min.js"></script>
</head>
<body>
  <h1>object更新</h1>

  <script>
    
    // 定数を設定して配列を代入する
    const person = {
      id: 1,
      name: "suzuki",
      age: 29,
    };

    // 配列の中の名前をtanakaに変更する場合
    person.name = "tanaka";

    // 関数を定義して、コンソールに配列の中身をそれぞれ表示させる処理を書く。
    const write = () => {
      console.log(person.id);
      console.log(person.name);
      console.log(person.age);
    }
    // 実際に関数を実行
    write();

  </script>
</body>
</html>
```
膨大なデータの処理が予想されるとき、SQLでその処理を済ませた方がパフォーマンスを維持できる

## 言いたいこと
膨大なデータの処理が予想されるとき、SQLでその処理を済ませた方がパフォーマンスを維持できる

## クラウドファウンディングサイトを例にしてみる

目的：パトロンをたくさん持っているプロダクトから降順で表示したい

この場合、controller上でデータを取り出し計算する方法と、取り出した時点ですでに計算されている状態にする方法の二択が考えられる。もちろん後者の方がいい。

```rb

products = self.joins(:patrons).group(:product_id).select('count(patrons.product_id) as patron_count').order('patron_count desc')
```
【超初心者向け】ターミナル操作　ファイルの移動　違うディレクトリへ


ダウンロードしたファイルを
別のディレクトリorファイルへ移動させたい時！！
ターミナルでやろうとして失敗した経験から。


【移動させたいファイルの場所】
Users/ユーザー名/Downloads/ダウンロードしたファイル/移動させたいファイル!!

【移動先のファイルの場所】
Users/ユーザー名/workspace(ここに移したい！！)


まずは

```
$cd ディレクトリ名
```
で、移動させたいファイルのいる階層までいく。

今回ならば、[ダウンロードしたファイル]のところまで。
〜〜確認方法〜〜〜〜〜〜
$ pwd 
と入力すると、
$Users/ユーザー名/Downloads/ダウンロードしたファイル
と表示されていればOKです。
〜〜〜〜〜〜〜〜〜〜〜〜

そこで,以下のように入力してください。

```
$mv 移動させたいファイル ../../workspace
```
これでOKです。

違う階層のファイルへ移動させるには
【../】が必要になります。

階層を一つ上がるごとに【../】が一つ必要です。
今回の場合ですと
階層を２つ上がるので【../】を2つ付けています。
〜〜〜〜〜〜〜〜
移動させたいファイル 
↓
ダウンロードしたファイル　
↓
Downloads
(ここと同じ階層にworkspace=移動先のファイルがある！！)
〜〜〜〜〜〜〜〜
pandas series その1

Seriesは一次元のデータ構造体である。

```py:1
import pandas as pd

series = pd.Series([3, 6, 9])
print(series)
```

```:1の実行結果
0    3
1    6
2    9
dtype: int64
```

左端の列にindexがある。

indexをかえる場合は下記の様に書く

```py:2
import pandas as pd

names = ["田中", "山田", "高橋"]

series1 = pd.Series(names)
series2 = pd.Series(names, index=['a', 'b', 'c'])

print(series1)
print(series2)
```

```:2の実行結果
0    田中
1    山田
2    高橋
dtype: object
a    田中
b    山田
c    高橋
dtype: object
```
小学生のみなさんへ、場合の数「2020年度京都大学理系学部数学第5問」にチャレンジしてみて下さい。

組合せ問題(ラテン方陣)です。

大学入試数学問題集成＞【５】

https://mathexamtest.web.fc2.com/2020/202010541/2020105410100mj.html#top-0105




~~読売新聞＞第5問の方です。
https://www.yomiuri.co.jp/nyushi/sokuho/k_mondaitokaitou/kyoto/mondai/mondai/1317021_5050.html~~


上と同じです。解答がpdfの12ページ目にあります。

京大数学 過去問ライブラリー＞2020年度 京都大・理系数学5

https://www.densu.jp/kyoto/20kyotospass.pdf#page=5


# 解けたら見て下さい。
youtubuのコメントにある「小林百合さんの方法」でいいと思いますが、偶然でしょうか？


https://www.youtube.com/watch?v=MTtVism1doQ

# 参考
~~読売新聞＞第5問の解答
https://www.yomiuri.co.jp/nyushi/sokuho/k_mondaitokaitou/kyoto/kaitou/kaitou/1317516_5051.html~~

リンク切れ(20221109)
~~東進ハイスクール＞講評PDF
http://27.110.35.148/sokuho/data/2020/1c/m02/m1c202001s0.pdf~~

Latin square(wikipedia)のNumber n=4

https://en.wikipedia.org/wiki/Latin_square#Number

ラテン方陣,ラテン方格 (wikipedia)

https://ja.wikipedia.org/wiki/%E3%83%A9%E3%83%86%E3%83%B3%E6%96%B9%E6%A0%BC


https://ja.wolframalpha.com/input/?i=4%21*4%21&lang=en

#勉強中参考文献


https://www.amazon.co.jp/dp/toc/4254114443/ref=dp_toc?_encoding=UTF8&n=465392



https://www.amazon.co.jp/dp/toc/4431708979/ref=dp_toc?_encoding=UTF8&n=465392
# 要望→解決済み
~~どなたか、全組み合わせのプログラムを作って証明してもらうと助かります。~~
例）16マスに、順に1から4を入力する。4の16乗通りをチェックする。1〜4行1〜4列全てに、1、2、3、4があればOK


スタック・オーバーフローで教えてもらいました。
(参考)

https://ja.stackoverflow.com/questions/73763/python-%e3%81%aeitertools-permutations%e3%81%ae%e4%bd%bf%e3%81%84%e6%96%b9%e3%82%92%e6%95%99%e3%81%88%e3%81%a6%e4%b8%8b%e3%81%95%e3%81%84-%e5%85%a8%e9%83%a8%e3%81%ae%e7%b5%84%e3%81%bf%e5%90%88%e3%82%8f%e3%81%9b%e3%81%ae%e4%bd%9c%e3%82%8a%e6%96%b9%e3%82%92%e6%95%99%e3%81%88%e3%81%a6%e4%b8%8b%e3%81%95%e3%81%84
【jQuery】複数のセレクタを指定する方法

#「$("p, span, .title")」といった感じで、「,」で区切る

```html:index_3.html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <script src="js/jquery-3.4.1.min.js"></script>
</head>
<body>
  <h1>p, span, titleクラスの色を指定して変更します。</h1>
  <p>これはpタグです</p>
  <span>これはspanタグです</span>
  <div class="title">これはtitleクラスです</div>
  <div class="title">これはtitleクラスです</div>

  <section>ここはセクションタグです</section>
  <div class="noTitle">これはtitleクラスではありません</div>
  <script>
    // まとめてセレクタを指定する
    $("p, span, .title").css('background-color', 'blue');
    $("p, span, .title").css('color', 'white');
  </script>
</body>
</html>
```
Laravelでバージョンを指定してプロジェクト作成

#はじめに
Laravelで新規プロジェクトを作成するときにバージョン指定の仕方が気になったので調べてみました。
最新バージョンではなく好きなバージョンを使いたいときに使用してください。

また、Laravelはバージョンによって必要なPHPのバージョンや使える機能が変わってくるので気をつけてください。

#実行環境
- mac
- composerがインストールされていて使用できる


#バージョンを指定してプロジェクト作成する方法
create-projectの後にバージョンを指定する

```
composer create-project "laravel/laravel=バージョン" プロジェクト名
```

例えば、Laravelのバージョンが```6.0系```で```sample-project```という名前のプロジェクトを作成したい場合

```
composer create-project "laravel/laravel=6.*" sample-project名
```
プロジェクトが作成された後に

```
cd sample-project
```


```
php artisan -v
```

でバージョンを確認

#バージョンを指定しないでプロジェクト作成する方法
ついでにバージョンを指定しないでプロジェクトを作成する方法も記載しておきます。

以下のコマンドを実行する

```
composer global require "laravel/installer=~1.1"
```

以下のコマンドでlaravel installerがインストールされていることを確認する

```
laravel -v
```
これで```laravel new```コマンドが使えるようになります。

プロジェクトを作成したいディレクトリに移動してプロジェクトを作成するためのコマンドを実行する

```
cd ディレクトリ名
laravel new プロジェクト名
```

これで最新バージョンのLaravelプロジェクトが作成されます。
【jQuery】時間を取得してHTMLに表示させる


```html:index_2.html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <script src="js/jquery-3.4.1.min.js"></script>
</head>
<body>
  <div id="label"></div>
  
  <script>
    const date = new Date();
    const hour = date.getHours();
    const minute = date.getMinutes();
    const second = date.getSeconds();
    const label = `今の時刻は${hour}時${minute}分${second}秒です`;
    // document.querySelector('#label').innerHTML = label;

    const write = () => {
      document.querySelector('#label').innerHTML = label;
    }
    write();

    // コンソールに表示させたい場合
    // console.log(label);
  </script>
</body>
</html>
```
java nio.Files


javaでファイル読込処理をしたいと思ったときに、nio.Filesパッケージが便利そうだったので調べてみた


# Pathインスタンスの作成

```
Path path = Paths.get(ファイルパス);
```

# ファイル読込
ファイルの全行をリストで取得する
内部的には、１件ずつ回してリストに追加しているだけみたい
文字コードはデフォルトではUTF-8
それ以外を指定する場合は、Charset.forNameで設定する

```
List<String> list = Files.readAllLines(path, Charset.forName("Shift-Jis"));
```

ファイルを１件ずつ読込む
LinesはStreamを返すので、そのまま編集可能

```
Files.lines(path, Charset.forName("Shift-Jis")).forEach(System.out::println);
```

# ファイルのプロパティ取得

ファイルサイズ

```
Files.size(path);
```
【Respec】エラー文uninitialized constantの解決法


## 結論
テストを行うcontroller.rbファイルととspecファイルないにあるテストを記述するファイル名が同じであることをチェックする。


```
app/controller/hogehoge/products_controller.rb
```


```
spec/controllers/hogehoge/products_controller_spec.rb
```

この様に、テストを行うコントローラ名とテストを記述するファイル名は同じにしなければいけない。
anacondaとpycharmによるpython3開発環境セットアップ


# 概要

* ローカルにPython3開発環境を用意する場合
* 端末買い替え、端末支給などで端末が変わった場合、速攻環境設定できる用のメモ
* ライブラリとか揃えるの面倒なのでanacondaを利用
* IDEはPycharmを利用。VSCodeよりよさそう。

# 導入

* [anaconda](https://www.anaconda.com/distribution/#download-section)

 * 2G以上領域を必要とするので注意
 * 結構時間かかる

* [Pycharm](https://www.jetbrains.com/ja-jp/pycharm/download/#section=mac)

# 初期設定

 * インタプリタの場所が設定されていないのでanacondaの場所を探してセット
 * 条件によってはデフォルトはUsersの下だったりする。私の場合はoptにあった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57350/61de9808-94ea-5200-25ee-1b2f8eac5889.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57350/1c6b3d21-1cbb-a157-d5c5-ba157f3a3856.png)

* anaconda3のインタプリタ設定が登録されているはず

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57350/b8a6843b-f26f-658a-d416-c1614772f6fa.png)

* 使いたいフレームワークを左から選択
* 素のPythonの場合はPurePythonを選択
* [create]を押してプロジェクトを作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57350/45f41aa8-93f8-4fec-4ac4-3c5e5858a452.png)

# 動作設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57350/1de11997-1b6b-e2bf-dc30-c865575671b7.png)

* ファイル名とファイルの種類を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57350/dde1300f-297e-a927-c87e-5a64566b7fd2.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57350/304a02e6-12b6-c29c-9616-cd7fd1889bdb.png)

* ファイルが作成される

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57350/e62566c1-8a75-85f4-6fbe-b6485354a1a2.png)

* 動作テスト用コードを作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57350/100b93f5-97e5-b7c5-b816-7b12d66b8b2c.png)

* 動作設定を[Run][Edit Configurations...]
* [Add New Configuration][Python]から選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57350/6e2e74a5-23fc-c5a0-dda1-bcadbc94935b.png)

* 以下のように設定して[OK]を押す

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57350/876bb86d-10b0-ed07-b353-d401aeb76419.png)

# 動作確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57350/555fc2ca-933b-717a-6b8b-d048c6c7fae2.png)

* 再生ボタンを押して動作を確認
* ⌘+Rで再実行可能

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57350/e3ab127b-81e4-156a-905b-cb82f51fd006.png)


* これでひとまず基本設定は完了
【jQuery】日付や時間を取得してHTMLに表示させる


```html:index.html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <script src="js/jquery-3.4.1.min.js"></script>
</head>
<body>
  <div id="date">
    日付：
  </div>
  <div id="time">
    時間：
  </div>
  
  <script>
    const date = new Date();
    const jpDate = date.toLocaleDateString();
    const jpTime = date.toLocaleTimeString();

    document.querySelector('#date').innerHTML += jpDate;
    document.querySelector('#time').innerHTML += jpTime;

    //consoleに表示する場合
    // console.log(jpDate);
    // console.log(jpTime);
  </script>
</body>
</html>
```
as:を使った任意のprefix_path作成方法

'as:'って皆さん使ってますか？

私は今回初めて使いました。
railsではprefix_pathを使ってlink設定などできる便利なすぐれものですが、
このpathの設定が抜ける時があります。

resouseなどを使ってroute設計している場合は特に意識をせずprefix_pathは設定されていますが、

例えば以下のコードで設定すると、prefixが設定されません。

```rails:routes.rb

  get '/sell/edit/:id', to: 'sell_items#edit'
  patch '/sell/edit/:id', to: 'sell_items#update'

```

[![Screenshot from Gyazo](https://gyazo.com/8205c26a12028d44c47fca217dc1bc3d/raw)](https://gyazo.com/8205c26a12028d44c47fca217dc1bc3d)

as:を使ってpathを設定することが可能です。
記述例は、
`get '任意のurl', to: '任意のコントローラー#任意のアクション', as: '任意のprefix_path'`


```rails:routes.rb

  get '/sell/edit/:id', to: 'sell_items#edit', as:'edit_sell_item'
  patch '/sell/edit/:id', to: 'sell_items#update'

```
[![Screenshot from Gyazo](https://gyazo.com/d3eaa96240e3551a94e0a193a67fffb2/raw)](https://gyazo.com/d3eaa96240e3551a94e0a193a67fffb2)

出てこなかった、edit_sell_item_pathがでてきました！
これを使ってform_withなどのURI設定にご活用ください。

また、このような発見があった時にアウトプットしていきます！

目指せ週一更新！
【解決済】Intentで表示したGoogleMapsに指定したカスタムラベルが表示されない

## Intentで表示したGoogleMapsにカスタムラベルが表示されない！？
ある日突然AndroidアプリからIntentでGoogleMapsを起動するとカスタムラベルが表示されていた箇所に緯度経度のような値が表示されている状態となっていた
GoogleMapsのバージョンを落として確認するとカスタムラベルが表示されるため、新しいバージョンのGoogleMapsで発生していると思われる

Google Maps Intents for Android
https://developers.google.com/maps/documentation/urls/android-intents

## 調べてみた
Google Issue Trackerに投稿はあるようだがまだ修正が行われていない様子
https://issuetracker.google.com/issues/129726279?enable_mat=true

Stack Overflowにも投稿がありGoogle Issue Trackerにコメントとスターをつけてほしいと書かれている様子
https://stackoverflow.com/questions/55078219/geo-intent-label-not-showing-in-google-maps-app

## 検証

Google Issue Trackerに投稿されていた指定をそのまま実装して確認

```java
geo:0,0?q=-33.8666,151.1957(Google+Sydney)
```

#### GoogleMaps ver9.56.7で表示した場合
Google Sydneyが表示されている
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/380332/75d4a773-9b8c-c0b6-1698-cbec72e40cd8.png" width="320">

#### GoogleMaps ver10.35.2で表示した場合
Google Sydneyが表示されていない
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/380332/8fefaeeb-e0bd-9815-e6e4-f754fd300eb0.png" width="320">

## 結果
やはり古いバージョンのGoogleMapsでは問題なく表示されていた
2019年4月2日にGoogle Issue Trackerへ投稿されているが2020年2月時点ではまだ修正されていない様子

対応方法が見つからないのでGoogle Issue Trackerを定期的に確認して修正されるのを待つしかないのだろうか…

## 2022/01/28 追記

Google Issue Trackerを確認するとversion 11.12から解消していると投稿されており、自身の端末で現時点での最新版（version 11.14.3）にて動作を確認したところ問題は解消されていることを確認
【保存版】環境構築不要！Google Colaboratoryで始める「ゼロから作るDeepLearning」

## 「ゼロから作るDeepLearning」とは？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591117/9f5ca44b-931d-46e2-749e-202d0f52d997.png)

DeepLearningの理論非常に丁寧に説明している良書です。ライブラリに頼らず理論を理解してゼロから実装するので、「DeepLearningの理論をしっかりと理解したい！」という人におすすめです。ですが、Pythonの文法の説明は少ないので、ある程度入門書などでPythonの基礎を習得していないと理論は理解できてもプログラムを理解するのは難しいかと思います。

以下から購入できます。
https://www.amazon.co.jp/dp/4873117585/ref=cm_sw_em_r_mt_dp_U_dEFvEb1FVX4AK

## プログラムをGoogle Colaboratoryで動かしたい
https://github.com/oreilly-japan/deep-learning-from-scratch
上記のGithubにそれぞれの章のサンプルコードが載っているのですが、これをローカルに落として環境構築するのは初心者にはちょっととっつきにくいかと思いました。そこで、今後この書籍を読む方の参考になればと思い、Googleアカウントさえあれば誰でもすぐに使えるGoogle Colaboratoryを使ってサンプルコードを全て動かせるようにしました。

## 要約
以下では簡単に各章の要約をして、サンプルコードと解説動画のリンクを貼っています。サンプルコードがわからない方はYoutubeの解説動画を参考にしてみてください。
プログラムはノートブックの左上にある「Playgroundで開く」を押すと自身の環境で実行が可能となります。

### 第1章 Python入門　
Pythonの基本的な文法の紹介とNumpyやMatplotlibといったライブラリの使用方法が解説されています。

プログラム: https://colab.research.google.com/drive/1zVMbegg1G2ZMCj6paGkHbQdEgfhl8uHI
解説動画: https://youtu.be/ZxY7nmUtqs0

### 第2章 パーセプトロン
ニューラルネットの基本となるパーセプトロンについて解説されています。また、パーセプトロンを使ってANDゲート、ORゲート、NANDゲート, XORゲートの実装を行います。

プログラム: https://colab.research.google.com/drive/1Vw2JIZP797Su3AeECVC0M7_G8UoYSwNL
解説動画: https://youtu.be/o6K4o7MyitM

### 第3章 ニューラルネットワーク
パーセプトロンからニューラルネットワークの構築を学習します。その中でステップ関数、シグモイド関数、ReLu関数などの活性化関数の紹介を行い、最後に実際にニューラルネットワークを構築し、手書き文字の認識を行います。

プログラム: https://colab.research.google.com/drive/1xckYBNOaRYojHrJVy6-D8O57bcjW8v4P
解説動画: https://youtu.be/5vTIwRY5pNk

### 第4章 ニューラルネットワークの学習
訓練データから最適な重みパラメータを獲得することを目指します。二乗和誤差、交差エントロピー誤差といった損失関数、効率よく学習を行うミニバッチ学習、勾配を利用して関数の最小値を見つける勾配法について学習します。

プログラム: https://colab.research.google.com/drive/1lszsWsHO0E8nZWHQLjsytjSFJD_-C6dB
解説動画: https://youtu.be/3zMOJCZONpA

### 第5章 誤差逆伝播法
前章で行った数値微分による実装は簡単であったが、時間がかかるのが難点だったため、効率よく計算を行う誤差逆伝播法について学びます。

プログラム: https://colab.research.google.com/drive/19mWo7Y945L-YsoDAyCXJjXJ5N8djon5_
解説動画: https://youtu.be/5YFpLspKPxw

### 第6章 学習に関するテクニック
SGD以外のパラメータ更新手法を学ぶ、またBatch NormalizationやDropoutなどの学習のテクニックを学びます。

プログラム: https://colab.research.google.com/drive/1z_VGltBzsvI0zMZGwuqriaQRyi8G1ylV
解説動画: https://youtu.be/vQKoJlhUfP4

### 第7章 畳み込みニューラルネットワーク
画像認識の精度をより高めるためにCNNについて学びます。

プログラム: https://colab.research.google.com/drive/1g1gJC9k1WePSJbmJZ993xetur9U2d0LC
解説動画: https://youtu.be/Qi1Uzh3rXe8

### 第8章 ディープラーニング
ディープラーニングの歴史や未来について学びます。

プログラム: https://colab.research.google.com/drive/11EbbCtHDI-qvqyl0Dp3zQGJN3zKrQdkR
解説動画: https://youtu.be/kcRPPF4zvx4

## 最後に
YouTubeで機械学習を中心に技術書のレビューや解説動画を上げていこうと思っています。またIT系に行くなら知っておいた方がいい企業の紹介もやっています。YoutubeとQiita更新のモチベーションに繋がるため、いいね、チャンネル登録、高評価をよろしくお願い致します。
ちょっとYoutubeの方が音声にノイズが入りすぎていて聞き取りづらいので、近々アップロードし直す予定です🙇‍♂️
YouTube: https://www.youtube.com/channel/UCywlrxt0nEdJGYtDBPW-peg
Twitter: https://twitter.com/tatelabo
[curl & HTTP の仕様でした] Flask with uWSGI を HTTP で動かすと、ファイル投稿時に綺麗に 1 秒遅延する

Twitter 転生した記念に Qiita 始めてみます。

~~タイトルのとおりですが、Flask を uWSGI @ HTTP で動かすと、ファイル投稿時に綺麗に 1 秒遅延する現象を確認しましたので、再現手順を紹介します。~~

これは `curl` の仕様で `Expect: 100-continue` ヘッダを付けてリクエストを発行するようになっていて、サーバにファイルを投稿していいかどうかお伺いを立てるために 1 秒待つということのようです。[^1]

```bash
$ curl -v -s -XPOST -F file=@LICENSE localhost:5002
* Rebuilt URL to: localhost:5002/
*   Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 5002 (#0)
> POST / HTTP/1.1
> Host: localhost:5002
> User-Agent: curl/7.54.0
> Accept: */*
> Content-Length: 1271
> Expect: 100-continue
> Content-Type: multipart/form-data; boundary=------------------------ebc5516179fb0a6c
>
* Done waiting for 100-continue
< HTTP/1.1 200 OK
< Content-Type: text/html; charset=utf-8
< Content-Length: 20
<
* Connection #0 to host localhost left intact
Took: 0:00:01.011157
```

これは HTTP/1.1 に準拠したものであるとのことです。[^2]

uWSGI は `Expect: 100-continue` のハンドリングに対応しており、 ini ファイルに以下の行を追加すると良いそうです。 [^1]

```ini
http-manage-expect = 1
```

# 実験設定

https://github.com/akeyhero/uwsgi-http-is-slow

上記リポジトリの通り、

1. Flask を単独で起動した場合
2. Flask を HTTP 設定の uWSGI を介して起動した場合
3. Flask を uwsgi プロトコル設定の uWSGI を介して起動した場合

に関して実験を行っています。

## 1. Flask を単独で起動した場合

単に

```bash
$ flask run --host=0.0.0.0
```

で起動した場合です。

## 2. Flask を HTTP 設定の uWSGI を介して起動した場合

uWSGI を

```ini
http = 0.0.0.0:80
```

を含む設定で起動した場合です。

## 3. Flask を uwsgi プロトコル設定の uWSGI を介して起動した場合

uWSGI を

```ini
socket = /socket/uwsgi.sock
```

を含む設定で起動した場合です。

## バージョン

```
Flask==1.1.1
uwsgi==2.0.18
```

# 実験結果

それぞれ `curl` を使ってファイルを POST したときのレスポンス時間は以下のとおりです。
ここで、確認されている限りファイルは何でも良いので、 リポジトリの `LICENSE` ファイルを使っています。

|                           | レスポンス時間 |
|:--------------------------|-------------:|
| 1. Flask 単独             |        0.067 |
| 2. Flask w/ uWSGI @ HTTP  |        1.063 |
| 3. Flask w/ uWSGI @ uwsgi |        0.062 |

Flask を uWSGI @ HTTP で起動した場合のみ、レスポンス時間がちょうど 1 秒遅くなっていることが見て取れます。

今回は試行回数一回のデータを掲載していますが、何度やっても概ねこのレスポンスタイムになります。

*※ 冒頭で説明したとおり、ここで 1 秒待っている主体は `curl` であって、 `Flask` や `uWSGI` ではありません。*

# おわりに

~~Flask 単独だとこの現象は発生しないので、おそらく uWSGI が原因なんじゃないかという事で適当に [issue](https://github.com/unbit/uwsgi/issues/2129) を投げましたが、ひょっとしたら Flask のせいかもしれないし、合わせ技一本で発生しているのかもしれないし、よく分からないです。~~

~~詳しい方がいらっしゃいましたらぜひともご教示ください。 :bow:~~

uWSGI のコントリビュータに教えてもらいました。[^1]
とても勉強になりました。

[^1]: https://github.com/unbit/uwsgi/issues/2129#issuecomment-592935917
[^2]: https://gms.tf/when-curl-sends-100-continue.html
【AWS 認定試験】1ヶ月でアソシエイトレベルの認定を3冠した話

# はじめに

この記事では、いかにして約一ヶ月ほどの期間でアソシエイトレベルの認定試験を合格したのかを紹介いたします。

認定試験合格したスケジュールです。[認定資格取得状況](https://www.certmetrics.com/amazon/public/transcript.aspx?transcript=GJMX3D412MQ4165K)

- 2020年1月13日：AWS Certified Developer - Associate (DVA)
- 2020年2月2日：AWS Certified Solutions Architect - Associate (SAA)
- 2020年2月15日：AWS Certified SysOps Administrator - Associate (SOA)

# 動機

今までの業務ではAWSを主に分析やETL処理といった用途で扱ってきましたが、新しい業務ではAWSの基本的なサービスを抑える必要がありました。そこで、AWSの勉強の１つのマイルストーンとして認定試験の合格とし、勉強をはじめました。このとき勉強していたのがDVAのみでした。

勉強の過程でアソシエイトレベルの模擬試験をすべて受験してみたところ、すべてスコアが合格圏内だったためすべての認定資格を取得することを目指しました。

なので最初は認定資格を3つも合格する予定ではありませんでした。

# 経歴

模擬試験でのスコアがすべて合格圏内ということは業務で手広くAWSのサービスに触れているからなのでは？ と思われる方もいらっしゃると思います。

しかし、私は業務でデータエンジニア、データサイエンティストといった職種の業務を担当することが多く、触ったことがある AWSサービスはかなり偏っておりました。

ちなみに認定資格の勉強を始める以前に使ったことのあるサービスは以下になります。

- S3
- AWS Athena
- EMR
- EKS
- AWS QuickSight
- AWS CodeBuild
- AWS Glue

認定資格を持っている人にはわかるかもしれませんが、この中で認定試験で頻出するサービスはS3とCodeBulidくらいでした。

したがって、正直0からのスタートといっても過言ではありませんでした。

# 勉強方法

## デベロッパー アソシエイト

最初に取得したデベロッパーアソシエイトを合格するまでの勉強方法についてまとめた記事が以下になりますのでこちらを参照ください。勉強に要した時間は2週間ほどだったと記憶してます。

[AWS 認定Developer Associate に合格するまで]([https://qiita.com/yoshiyama_hana/items/8ea41e756036ca098c4b#%E5%8B%89%E5%BC%B7%E6%96%B9%E6%B3%95](https://qiita.com/yoshiyama_hana/items/8ea41e756036ca098c4b#勉強方法))

成績は805点(720点合格)



## ソリューションアーキテクト アソシエイト

デベロッパーアソシエイトに合格してから2週間ほどの期間を空けてから受験しました。

その間ずっと勉強していたのかといわれるとそうではなく、きちんと勉強したのは試験前日と前々日だけで、

勉強内容は[ソリューションアーキテクトアソシエイト分野の問題集](https://aws.koiwaclub.com/)を解いただけでした。

成績は820点(720点合格)



## SysOps アドミニストレーター アソシエイト

こちらも前回の認定資格を合格してから2週間ほどの期間を空けてから受験いたしました。

前回同様、きちんと勉強したのは試験前日と前々日だけで、

勉強内容は[SysOpsアドミニストレーターの分野の問題集](https://aws.koiwaclub.com/)を解いただけでした。

成績は745点(720点合格)

元々この分野には苦手意識があったため点数が低かったのだと思います。



## 勉強内容のまとめ

アソシエイトレベルでは問われる基礎的な部分はどの試験でも変わらず、変わっているのはどのAWSサービスが出題されやすいかだけだったように感じました。

なので、もしもアソシエイトの資格を持っているならば他のアソシエイトレベルの資格も簡単に取得できるのではないかと思います。

# 成果物

勉強の過程で自分なりに各サービスのポイントをまとめたノートを作成いたしました。

そのときの成果物が以下になります。(随時更新します)
みなさまの受験勉強の一助になれば幸いです。

- [【AWS認定試験対策】EC2のポイントまとめ](https://qiita.com/yoshiyama_hana/items/1fef71430f11729a56e2)

- [【AWS認定試験対策】VPC、Route53のポイントまとめ](https://qiita.com/yoshiyama_hana/items/fd087f9a19538b8f6667)

- 【AWS認定試験対策】DBサービスのポイントまとめ(Qiitaにて執筆中)

- 【AWS認定試験対策】Lambdaのポイントまとめ(Qiitaにて執筆中)

- 【AWS認定試験対策】その他サービスのポイントまとめ(Qiitaにて執筆中)

# 所感

## 悪かったこと

- 認定資格を受験した目的は「AWSの基本的なサービスを抑えて業務に活かす」ということだったのですが、段々と試験に合格するための勉強となってしまっており完全に目的を履き違えてしまったなと反省しております。

  もっと試験合格のための勉強だけでなく、各AWSサービスのハンズオン等を行い経験する機会を設ければよかったなと感じました。

## 良かったこと

- AWSのサービス名を聞いてそれが大体どんなことをするサービスなのかほとんど把握できるようになりました。
  今までちんぷんかんぷんだった同僚の話にも参加できるようになったのは大きな成果だと思います。
- 私の所属する組織ではAWS認定資格を取得している人数がとてつもなく少なかったのですが、私が短期間で複数のAWS認定資格の合格したことを知った先輩・後輩が刺激を受けて積極的に認定資格の受験に励むようになりました。(知っているだけでも来月の3月に5名が新たにAWS認定試験を受験されるそうです。)

正直、後者は想定していなかった影響でした。かなりミクロな世界ですが、自分が行動すれば組織の動き方も変わる貴重な経験になりました。
pythonでエラトステネスの篩を実装してみた

pythonとアルゴリズムの勉強かねがね、素数判定器「エラトステネスの篩」版を実装してみました。

https://qiita.com/redmeteor777/items/023e8b70b061d8a8b423

↑だと14～15桁までの数値が素数かどうか1秒以内で判定できるのですが、複数値の素数確認をする場合はいちいち割り算をし直すため処理時間がかさんでしまいます。

AtCoder Beginner Contest 084
D - 2017-like Number
https://atcoder.jp/contests/abc084/tasks/abc084_d

こちらの過去問では「要求を満たす素数の数」が求められるため、「要求範囲内にある素数を導出」という用途のロジックを作成した…というのが今回の実装です。

10 ** 5までの素数を0.3～0.4秒程度で導出できましたので、とりあえず満足です。

※指定値がnp.arrayの対象外になっていたので修正しました。

```sieve_of_eratosthenes.py
import datetime
import numpy as np

def sieve_of_eratosthenes(numbers):
    """指定された値までの素数を導出する関数.
    戻り値：
    素数のリスト
    """
    # 2から指定値までのndarrayを作成
    checker_np = np.array(range(2,numbers + 1))

    # 素数を格納するリストを作成
    prime_list = []

    while len(checker_np) != 0:
        # リストの先頭（この値は必ず素数）を抽出
        _x = checker_np[0]
        # 取り出した値を素数リストに格納
        prime_list.append(_x)
        # ndarrayの中身のうち、抽出した素数で割り切れる値を除外
        # ※先頭の値が必ず最小の素数になる
        checker_np = np.delete(checker_np, np.where(checker_np % _x == 0))

    return prime_list

# 入力値
numbers = 10 ** 5

start_time = datetime.datetime.now()
print(sieve_of_eratosthenes(numbers))
end_time = datetime.datetime.now()

# 処理速度を確認
print(end_time - start_time)
```
Call for Code 2020 に参加しよう！

# Call for Codeとは？

自然災害の抑止、災害の危険を検知＆対応、そして自然災害から回復するための支援などをテクノロジーを使って立ち向かおう、という世界規模のハッカソンです。

---

# 参加者は？
既にコーディングができる開発者、スポンサーになりたい企業、または気候変動を懸念する市民のどなたでも、行動を起こすことができます。
AI、IoT、クラウドコンピューティングなどの技術を使用して、より持続可能な未来を育むソリューションを作成しましょう。
Call for Codeは3年目を迎え、企業、専門家、人道的および国際的な組織、慈善パートナー、有名人の支援を受けています。 一丸となって戦っていきましょう。

---

# Call for Code 2020のテーマは？
気候変動がテーマです。
[紹介動画](https://www.youtube.com/watch?v=P05zIHTveDo)

例えば気候変動とそれがもたらす影響にはこのようなものがあります。

1. 過去130年間で、世界の平均気温は0.85℃上昇しました。
2. 海水温の上昇や氷が融け事により、海面は19 CM上昇しました。
3. 地球温暖化は、山火事や干ばつなどの、より頻繁で激しい自然災害を引き起こしています。

---

## “The climate emergency is a race we are losing, but it is a race we can win.”
– UN Secretary-General António Guterres

---

# 優勝者には何があるの？
1. $ 200,000 USDの賞金
2. グローバルで開催されるCall for Code受賞者の発表会へ招待
3. Linux Foundationのオープンソースプロジェクトサポート
4. ソリューションへの指導と投資の機会を得ることができます。
5. Code and Response™によるサポートを得られます。

--- 

# スケジュールは？
1. 2020/2/26 キックオフ(←Done)
2. 2020/3/22 成果物受付開始
3. 2020/7/31 成果物提出期限
4. 2020/10月 優勝者発表

---

# ジョーレンからも参加します！
![fromIOS.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154110/75c9dfab-bf9c-051f-f01b-7a0b7f367449.jpeg)


---

#何はともあれやってみましょう！

---

参考サイト
公式サイト(https://callforcode.org/)
IBMサイト(https://developer.ibm.com/callforcode/resources/)
xpathの使い方


(1)XPathの取得

Chromeのdeveloppers toolから取得する

![32.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150223/4285c852-a077-8afb-e781-97f9f0230f4e.jpeg)


(2)Pythoコード例

```python:
xpath='//*[@id="kobetsu_right"]/div[4]/table/tbody'
table_text=browser.find_element_by_xpath(xpath + '/tr[3]/td')
```
【エラー】pandas_datareaderでiexから株価取得

#エラー内容
ValueError: The IEX Cloud API key must be provided either through the api_key variable or through the environment variable IEX_API_KEY

#エラーの意味
IEXから株価を取得するには、IEX Cloud ConsoleからのAPIキーが必要。それをIEX_API_KEYとして環境変数に登録して欲しい。

参考: https://pandas-datareader.readthedocs.io/en/latest/remote_data.html#remote-data-iex

#IEX Cloud Console登録
[IEX Cloud Console](https://iexcloud.io/) に無料で登録し、APIキーを取得。

#そのあと
APIキーをIEX_API_KEYに登録し、再起動。終了。
conda intallでバージョン指定

# conda intallでバージョン指定
tensorflowの1.0.0が必要になった際は、以下のように解決しました。

```
conda install -c conda-forge tensorflow=1.0.0
```


# 参考文献
https://stackoverflow.com/questions/43897765/how-do-i-upgrade-to-tensorflow-1-0-using-anaconda
Go Basic認証

HTTP Basic認証の概要とGo標準パッケージ`net/http`を用いた実装をまとめる。

## BASIC認証とは

HTTPで定義される認証方式の一つ。
クライアントは、クライアントID(ユーザー名)とクライアントシークレット(パスワード)の組み合わせをコロン “:” でつなぎ、Base64エンコードした値を、Authorizationヘッダーにセットしてサーバーへ送信する。
これをサーバー側は受け取り、事前に登録されたクライアントIDとクライアントシークレットの組み合わせに一致するか検証する。一致した場合は、リクエストを処理する。一致しなかった場合は、ステータスコード401を返却する。
## Go標準パッケージ`net/http`での実装

### クライアント側

```go:client.go
package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
	"time"
)

func main() {
	// クライアント生成
	client := &http.Client{Timeout: time.Duration(30) * time.Second}
	// リクエスト定義
	req, err := http.NewRequest("GET", "http://localhost:8080/basic_auth", nil)
	if err != nil {
		log.Fatal(err)
	}
	// 認証情報をセット
	req.SetBasicAuth("client_id", "client_secret")
	// リクエスト実行
	resp, err := client.Do(req)
	if err != nil {
		log.Fatal(err)
	}
	defer resp.Body.Close()

	b, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(string(b))
}
```

### サーバー側

```go:server.go
package main

import (
	"fmt"
	"log"
	"net/http"
)

// Basic認証
func checkAuth(r *http.Request) bool {
	// 認証情報取得
	clientID, clientSecret, ok := r.BasicAuth()
	if ok == false {
		return false
	}
	return clientID == "client_id" && clientSecret == "client_secret"
}

func main() {
	http.HandleFunc("/basic_auth",
		func(w http.ResponseWriter, r *http.Request) {
			// 認証失敗時
			if checkAuth(r) == false {
				w.Header().Add("WWW-Authenticate", `Basic realm="SECRET AREA"`)
				w.WriteHeader(http.StatusUnauthorized) // 401
				http.Error(w, "Unauthorized", 401)
				return
			}
			_, err := fmt.Fprintf(w, "Successful Basic Authentication	\n")
			if err != nil {
				log.Fatal(err)
			}
		},
	)
	log.Println(http.ListenAndServe(":8080", nil))
}
```