OmniAICreator/Qiita-1.07M huggingface dataset:
Pythonで運動方程式を解く(odeint)

#この記事は

python(正確にはscipy)のodeintというライブラリを使って運動方程式を解きます。anacondaで入れたpython3.6.3を使っています。


運動方程式(二階微分方程式)を解いていますが、一階の微分方程式など他の微分方程式にも応用可能です。

#Pythonで運動方程式を解きたい



##人生とは
簡単な運動方程式を解きたい場合が人生の中では出てくる。
特に、解いて運動の様子をplotしたい場合がある。
その時人はどうするか

今回はpythonのライブラリ"odeint"を用いて楽してプロットすることを目的にする。

##odeint

おでんitに見える。
ODE integralのことだと思う。
ODE=Ordinary Differential Equation (常微分方程式)

公式reference
https://docs.scipy.org/doc/scipy/reference/generated/scipy.integrate.odeint.html

odeというライブラリもある
https://docs.scipy.org/doc/scipy/reference/generated/scipy.integrate.ode.html

調べるとどうやらもっと新しいpackage"solve_ivp"があるらしく、こちらが推奨されている。いつかこれについても記事を書きたい。
https://docs.scipy.org/doc/scipy/reference/generated/scipy.integrate.solve_ivp.html#scipy.integrate.solve_ivp

ちなみにodeintと、他二つ(ode, solve_ivp)では引数の順番が違うというエグい仕様になっている。混同しないように気をつけよう。

#今回解きたい運動方程式

運動方程式なら何でも良いのだが、今回は簡単な投げ上げを解く。

```math
m\ddot y=-rv+mg
```

odeintで二階微分方程式を特には、二つの一階微分に直す必要がある。例えば今回の場合は

```math
\dot y=v \\
m\dot v=-rv+mg
```
という式を実際にはodeintで解く。

#コード

##全体の流れ

コードの流れは以下の通り
1. 必要なライブラリを読み込む
2. 解きたい微分方程式を記述する
3. 初期条件等を決めて方程式をodeintに解いてもらう
4. 結果を描く

###準備

まず、色々ライブラリを入れる。

```python:import
import numpy as np #numpy
from scipy.integrate import odeint #odeint
import matplotlib.pyplot as plt #to draw graphs
```

###微分方程式を書く

そして、微分方程式を定義する。
空気抵抗r,質点の質量mは次のステップで定義される。
重力定数gは変更しないので今回はここで定義している。

```python:function
def func(s, t, r, m):
    
    y, v = s #sは変数yとvの組
    g=9.80665 #m/s^2
    dsdt = [v, (-r*v-m*g)/m]
    return dsdt 
```

###初期条件を決めて、微分方程式を解いてもらう

空気抵抗r,質量mを決め、初期条件を決めて微分方程式を解く。
sol = odeint(func, y0, t, args=(r,m))の最後の引数について、一点注意。
args=(r,m)のようにリストを渡すので、引数が一つの場合はargs=(r,)のようにしなければならない。今回は困らないが、他の運動方程式を解く場合には注意。

```python:solve
r=12
m=100
y0 = [0,10]#位置0から初速10で投げ上げ
t = np.linspace(0, 7, 201)#時刻0から7まで、201step刻みで計算する

sol = odeint(func, y0, t, args=(r,m))
```

###結果を図に描く

結果を可視化してみよう。



```python:visualize
plt.plot(t, sol[:, 0], 'b', label='y')#yについてplot
plt.plot(t, sol[:, 1], 'g', label='v')#vについてplot
plt.legend(loc='best')#レジェンドを付ける
plt.xlabel('t')
plt.grid()#格子を付ける
plt.show()
```

そうするとこんな図が得られるはず。

![Unknown.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420242/45226f4d-0930-b958-9418-75ea519f1a7f.png)

##この次は

最初はtを0から100までなどと変更して終端速度を確認したり、あるいは斜めに投げ上げた場合の問題を解いたりするのがコードを理解する良い練習問題になると思う。
【Rails環境構築】MySQL2が原因で「bundle install」失敗した時の対処法

# はじめに
Railsの環境構築をローカルでしようと*rails new*からはじめたところ、`bundle install`ができずに引っかかったため備忘録として残しておきます。

# 環境
OS               : Mac OS Catalina 10.15.1
Ruby            : 2.6.3p62
Rails             : 6.0.1
Homebrew : 2.1.16
Bundle        : 1.17.2

# エラー

```
$ bundle install

省略（gemのインストール）

Installing mysql2 0.5.2 with native extensions
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

省略

An error occurred while installing mysql2 (0.5.2), and Bundler cannot continue.
Make sure that `gem install mysql2 -v '0.5.2' --source 'https://rubygems.org/'` succeeds
before bundling.

```
ざっくり解釈した限りだと、「mysql2 0.5.2のインストール時にnative extention(CやC++で書かれるMySQLの拡張のライブラリ)のビルドに失敗したので、bundleの前に`gem install mysql2 -v '0.5.2'`で確認してください」とのことですが、私の場合root権限でこのコマンドを打っても解決せず...


# 解決法
結論から言うと、「**ビルド時にOpenSSL公開鍵のPATH指定が必要**」と「**`bundle config`でPATHオプションをLDFLAGS、CPPFLAGSで別々に指定**」で解決しました。

##1.公開鍵のPATH確認
```
brew info openssl

省略

For compilers to find openssl@1.1 you may need to set:
  export LDFLAGS="-L/usr/local/opt/openssl@1.1/lib"　　　　　　←　ここ使用
  export CPPFLAGS="-I/usr/local/opt/openssl@1.1/include"　　　←　ここ使用

省略

```

##2.それぞれPATHを指定
```
$ bundle config --local build.mysql2 "--with-cppflags=-I/usr/local/opt/openssl@1.1/include"
```

```
$ bundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl@1.1/lib"
```
それぞれ、「build.mysql2の現在のローカル値を置き換えています」と返答がきます。

##3. bundle install （ここで終了）
```
$ bundle install
```
私の場合はこれで解決し、「*rails new*」でも問題なく作成できました。

# 失敗or解決に直接繋がらなかったコマンド
## 1. PATHの両指定
```
bundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl/lib --with-cppflags=-I/usr/local/opt/openssl/include"
```
## 2.mysqlの再起動
```
$ sudo mysql.server restart
```

# その他
公開鍵、LDFLAGS、CPPFLAGSなど知識やAppleの独自TLS背景などまだまだ勉強不足でした💦
表記や解釈ミスなどあればご指摘頂けますと幸いです。

# 参考
こちらの記事がなければ解決できませんでした（本当に助かりました）。
https://qiita.com/fukudakumi/items/463a39406ce713396403
https://qiita.com/akito19/items/e1dc54f907987e688cc0
http://woshidan.hatenadiary.jp/entry/2017/01/21/150948
GoogleフォントをIEで使う

Googleフォント、日本語フォントにも対応してますます便利になりました。

しかしそれと同時期にIE（Edgeも）非対応になっています。Qiitaでも言及しているひとがいました。
<https://qiita.com/umeume66/items/e8982e90c02cfe2f4be4>

対処法は自前でフォントをダウンロードして eot に変換するなどさまざまあります。

が、自分は Typekit の [Web Font Loader](https://github.com/typekit/webfontloader) を使うのがもっとも手軽と考え、その方法を採ることにしました。

## Web Font Loaderの導入

もっとも簡単な導入方法はHTMLのbodyタグの末尾に以下を貼り付けることです。

```html
<script src="https://ajax.googleapis.com/ajax/libs/webfont/1.6.26/webfont.js"></script>
<script>
  WebFont.load({
    google: {
      families: ['Noto Sans', 'Noto Serif']
    }
  });
</script>
```

いちおう解説すると、１行目のscriptタグで Web Font Loader 本体を読み込み、２行目で Google フォントから "Noto Sans" と "Noto Serif" の2フォントを読み込んでいます。

## パフォーマンス向上

しかし、上の書き方ではレンダリングをブロックしてしまいます。

よって、最初はフォールバック先のフォントで表示しておいて、遅れて Googleフォントを適用させる（いわゆる **Lazy loading**）のが望ましいでしょう。

そのためにはasync属性をつけるなりして、非同期で webfont.js をロード後、続くコードを実行するなりが推奨されます。このあたりはお気に入りのものを使用してください。公式サイトにも `document.write` を使った例があります。

Web Font Loader は Google フォント以外にも font.com やローカルにホストした Web フォントなどにも対応しており、この用途だけでは少し余分かもしれません。CDNで配信しているとはいえ、フットプリントをどうしても軽くしたいのであれば別の手段を探すのがよいでしょう（ただ、その要求下で eot ファイルをCDNでなく自前配信することは考えにくいと思います）。
QualityForward用Node.jsライブラリのバージョンアップ（1.0.3）

[QualityForward](http://bit.ly/35DU0CP)はテスト管理をクラウドで提供しています。そして、多くのクラウドサービスと同様にAPIを提供しています。現在、下記のデータを取得または新規作成、更新、削除できます。

- プロジェクト
- テストケース
- テストサイクル
- テストフェーズ
- テスト結果
- テストスイート
- テストスイートバージョン
- ユーザ

これらのデータを扱うためのNode.jsライブラリを開発しています。1.0.3での対応範囲を紹介します。

## 使い方

npmパッケージとして公開していますので、package.jsonで指定して取り込んでください。APIキーはプロジェクトの設定で取得できます。

```js
import { QualityForward } from 'qualityforward-node';
const API_KEY = '0aa...340';
const client = new QualityForward(API_KEY);
```

## 各データの取得が可能に

上記で示した各データがオブジェクトになりました。

- プロジェクト / Project
- テストケース / TestCase
- テストサイクル / TestCycle
- テストフェーズ / TestPhase
- テスト結果 / TestResult
- テストスイート / TestSuite
- テストスイートバージョン / TestSuiteVersion
- ユーザ / User

## テストスイートの取得

例えばテストスイートの取得は次のように行います。

```js
const testSuites: TestSuite[] = await client.getTestSuites();
```

## テストケースバージョンの取得

テストケースバージョンはテストケースに紐付くので、次のように行います。

```js
for (let key in testSuites) {
  const testSuite = testSuites[key];
  const versions = await testSuite.getVersions();
}
```

## テストケースの取得

さらにテストケースはテストケースバージョンから取得できます。

```js
for (let k in versions) {
  const version = versions[k];
  const testCases = await version.getTestCases();
  if (testCases.length === 0) continue;
}
```

このように階層的な構造になっているので注意してください。

## テスト結果の取得

テスト結果を取得する場合も階層的に取得する必要があります。テストフレーズ -> テストスイートアサインメント -> テストサイクル -> テスト結果といった具合です。

```js
const testPhases: TestPhase[] = await client.getTestPhases();
for (let testPhase of testPhases) {
  if (testPhase.test_suite_assignments.length === 0) continue;
  const testSuiteAssignment = testPhase.test_suite_assignments[0];
  const testCycles = await testSuiteAssignment.getTestCycles();
  if (testCycles.length === 0) continue;
  const testResults = await testCycles[0].getTestResults();
  // console.log(testResults[0])
}
```

## まとめ

1.0.3で、QualityForwardのデータについて一通り取得できるようになりました。今後、データの作成であったり、集計などに便利なメソッドを追加していきます。コードは[goofmint/qualityforward-node](https://github.com/goofmint/qualityforward-node)で公開しており、MIT Licenseとなっています。

[QualityForward](http://bit.ly/35DU0CP)
Object.assign()で深い部分もコピーしたい！

# やりたいこと

```javascript
Const  State = {
    name: ‘Hanako’,
    stay: {
        Japan: {
              Hiroshima: ‘実家’,
              Karuizawa: ‘別荘’,
               },
        America: {
              NewYork: ‘別荘’,
              Arizona: ‘おじいちゃんち’
                 }
          }
};
```

これのKaruizawaを'実家２'にしたコピーが欲しい！
StateのstayのJapanのKaruizawaが書き換わるのはいやだ

**Object.assign()は浅いコピーのため、一回のコピーでご丁寧に入れ子の中までコピーはしてくれません。**


今の状態で、State2を定義して、Stateをコピーした後、Karuizawaの中身をみると、

```javascript
Const State2 = Object.assign({}, State);
Console.log(State.stay.Japan.Karuizawa);
-> 別荘
```

試しに、State2.stay.Japan.Karuizawa に'実家２'を代入してみます。

```javascript:失敗例１
State2.stay.Japan.Karuizawa = ‘実家2’;
Console.log(State.stay.Japan.Karuizawa);
-> 実家2
```

これだと、最初のStateの中のKaruizawaが'別荘'ではなく、'実家２'に書き変わってしまっています。
そうじゃない。Karuizawaが'別荘'のバージョンと'実家２'のバージョンの二つが欲しい、書き変わってほしくないので、このコピーは失敗です。

```javascript:失敗例２
State2= Object.assign({}, State);
State2.stay.Japan= Object.assign({}, State.stay.Japan, { Karuizawa: ‘実家2’} )
Console.log(State.stay.Japan.Karuizawa);
-> 実家2
```

↑このパターンも書き変わってしまいます。失敗・・・

では、成功例はというと、

```javascript:成功例
State2= Object.assign({}, State);
State2.stay = Object.assign({}, State.stay);
State2.stay.Japan = Object.assign({}, State.stay.Japan);
State2.stay.Japan = Object.assign({}, State.stay.Japan, { Karuizawa: '実家２'});
```
一旦ここまで丁寧にコピーしてやります。
それぞれの中身をみてみましょう。

```javascript
console.log(State2);
=>{ name: 'Hanako',
  stay:
   { Japan: { Hiroshima: '実家', Karuizawa: '実家２' },
     America: { NewYork: '別荘', Arizona: 'おじいちゃんち' } } }

console.log(State2.stay.Japan.Karuizawa);
=>実家２

console.log(state.stay.Japan.Karuizawa);
=>別荘
```

**Stateの方のKaruizawaは '別荘' のままです。書き変わってません！成功です！！**

シャローコピーで粘りたい方は、この方法おすすめです。
wordpress 構築のちょっとした話

案件で、初めてwordpressの構築を任せていただきました。勉強になることばかりで楽しんでいます。
自分の整理がてら、学んだことをまとめてみます。

# 関数化
例えば、カスタム投稿でACFのデータを取得する際は、なるべく細かく関数化して分けておく。そして、作った関数たちを組み合わせる。
関数化しておくと、再利用ができるし、同じフィールドの値に関して統一性ができてスッキリするので、便利とのこと。
（アーカイブページと記事詳細ページなど複数回そのデータを使うような場合。一度きりしか使わないのであれば、コードが増えるのでいらない）

例えば、カスタム投稿ページにて投稿記事一つを出力する場合。
`記事のタイトル`の他に`テキスト1`と`テキスト2`の値があったとする。

```php:custom-post.php
<?php
// テキスト1を取得する
function get_post_text1 ()
{
 if ($text1 = get_field('text_field1')) {
  return '<p>' . $text1 . '</p>'; 
 }
}

// テキスト2を取得する
function get_post_text2 ()
{
 if ($text2 = get_field('text_field2')) {
  return '<p>' . $text2 . '</p>';
 }
}

function get_new_post ()
{
 echo '<p>このページでは記事を紹介します。</p>'

 the_title(); // タイトルの出力 
 echo get_post_text1(); // text_field1の値を出力
 echo get_post_text2(); // text_field2の値を出力
}
```

# 引数
また、`the_title();`は引数に、値の前後に出力したい値を指定することでマークアップごとに出力できる。

```php
<?php
echo the_title('タイトルの前に表示したいテキスト', 'タイトルの後に表示したいテキスト', 'boolean:出力するかどうか');
```
これを利用することで、同じ値でもマークアップを変更して出力することができる。
例えば、アーカイブページと記事詳細ページで、同じ値だけどクラス名が異なっているときに使用する。

```php
function get_post_text1 ($before_html, $after_html) {
 if ($text1 = get_field('text_field1')) {
  return $before_html . $text1 . $after_html;
 }
}

// archive.php
echo get_post_text1('<p class="archive__description>"', '</p>');
// single.php
echo get_post_text1('<p class="single__description -strong>"', '</p>');
```

あとは、引数に`get_the_ID();`を指定することで、関数内とか、ループ内でも自由にデータとってくることができるのかな〜。
この辺りが、まだわかっていないのでまた理解したらまとめよ。
Seabornで前のグラフが残ってしまう時


# 解決策

SeabornはMatplitlibのラッパーライブラリである。
よって、Matplotlibの方で前回のグラフを消してあげればよい。

```py
from matplotlib import pyplot as plt

# これをグラフ描画前にやって、リセットする
plt.clf()
```

以上の`plt.clf()`を加えれば良い。
【Laravel開発ノート】ドメインを設定するポイント

##1.目的
ローカル環境で「http://192.168.10.10/」→「http://weibo.test」と表示したい。

##2.設定のポイント
###2.1 「.env」ファイル

```
APP_DEBUG=true
APP_URL=http://weibo.test
```

###2.2 「homestead.yaml」ファイル

```yaml
sites:
    - map: weibo.test # <--- ここ！
      to: /home/vagrant/code/Laravel/public 
```

###2.3 「/etc/hosts」ファイル

```
$ vim /etc/hosts
```

最後の一行に以下の内容を追加

```
192.168.10.10 weibo.test
```
python3.6 centos7 に インストールして helloworld♪

# python を ダウンロードしようぜ


```

sudo yum install -y https://centos7.iuscommunity.org/ius-release.rpm
sudo yum install python36u python36u-libs python36u-devel python36u-pip


```

チェック


```

python3.6 -V

```
 


# pip のパスも通す

バージョン管理するのに必要。

```

which pip3.6
sudo ln -s /bin/pip3.6 /usr/bin/pip
pip --version

```






# helloworldしよぜっ☆ hoge.py を作る

vim hoge.py

```

import time

print("Hello World!!")
time.sleep(3)

```


## 実行

```

python3.6 hoge.py

```


これであなたもぴゃーそんマスター！
DynamoDBをJson形式でエクスポート・インポート

Amazon DynamoDBのデータをエクスポートする方法はいろいろとあります。
Pythonを使ったツールだと[dynamodb-json](https://github.com/Alonreznik/dynamodb-json)、[DynamoDBtoCSV](https://github.com/edasque/DynamoDBtoCSV) あたりが星多めですね。

本記事ではシェルスクリプトでJSON形式でデータをエクスポート・インポートする手軽な方法をまとめます。

### 使用ツール
- [bash](https://www.gnu.org/software/bash/) （Macの3.x系で動作確認）
- [AWS CLI](https://aws.amazon.com/jp/cli/)
- [jq](https://stedolan.github.io/jq/)

### 実行前確認
下のコマンドでテーブル内容を取得できることを確認します（追加で指定が必要な環境もあります）。

```sh
aws dynamodb scan --table-name ［テーブル名］
```

### エクスポート
AWS CLIを使ってJSON形式でエクスポートするシェルスクリプトです。
--queryを使って特定のデータのみを出力することも可能です。

```sh:export-data.sh
# 第一引数でテーブル名をセット
table_name=${1:-null}

if [ $table_name = "null" ]; then
    echo "export-data.sh [table_name]"
    exit
fi

# AWS CLIでエクスポート
aws dynamodb scan \
    --table-name ${table_name} \
    --output json \
> ${table_name}.json
```

テーブル構造が簡単で、Excelなどで編集したい場合は、下のように列名を指定してCSV形式で出力することもできます（Number列 「id」、String列「name」の例）。

```sh:CSV形式でエクスポート
aws dynamodb scan \
    --table-name ${table_name} \
    --query "Items[*].[id.N,name.S]" \
    --output json \
| jq -r '.[] | @csv' \
> ./${table_name}.csv
```

### インポート
インポートはひと手間かかり、ファイルを一行ずつ読み込んでアップサートすることになります。

```sh:import-data.sh
# 第一引数でテーブル名をセット
table_name=${1:-null}

# テーブル名指定で1テーブルのみ処理
if [ $table_name != "null" ]; then
    while IFS= read -r item; do
        aws dynamodb put-item --table-name "${table_name}" --item "$item"
    done< <(jq -c '.Items[]' < "./${table_name}.json")
    exit
fi
```

### 参考
シェルスクリプトでテーブルスキーマごと複製したい場合は下の記事が参考になります。

- [既存のDynamoDBのテーブルを複製するシェルスクリプト](https://qiita.com/yufu/items/03a19a425f275cdc3281)
wordpress5.3で管理画面にエラーメッセージが出た時の記録

# 状況
wordpress5.3にてテーマを適用したら
管理画面上にエラーメッセージが表示された。


# エラーメッセージ

```error.sh

Warning: Declaration of border_link_list::walk($elements, $max_depth) should be compatible with Walker::walk($elements, $max_depth, ...$args) in example/functions.php

```

# 対応方法
検索すると早々と英語圏では質問が飛んでおり、本家サイトにも詳細がありました。
5.3になったタイミングでクラスのパラメータが変わった模様です。

[本家解説](https://make.wordpress.org/core/2019/10/09/wp-5-3-introducing-the-spread-operator/)

解説によるとこの変更ではサイトがダウンする可能性は低く、パフォーマンスがアップするとのこと。

後述の影響のあるクラス関数を検索するとバッチリ記述があり
今回は使っていない機能が残っていたので削除して解決しました。
自分の場合はwalk()関数を使用していました。

# 影響のあるクラス、関数

Walker
walk()
paged_walk()
WP_User

has_cap()
wpdb

prepare()
_WP_Dependency

__construct()
Automatic_Upgrader_Skin

feedback()
Bulk_Upgrader_Skin

feedback()
WP_Ajax_Upgrader_Skin

error()
feedback()
WP_Upgrader_Skin

feedback()

※影響を受けるテストクラスのリスト
WP_UnitTestCase_Base

assertQueryTrue()
MockAction

filterall()
Tests_WP_Customize_Manager

capture_customize_post_value_set_actions()
Tests_WP_Hook_Do_Action

_action_callback()

# 参考ページ
[フォーラム](https://wordpress.org/support/topic/declaration-incompatible-with-walker/)
[本家解説](https://make.wordpress.org/core/2019/10/09/wp-5-3-introducing-the-spread-operator/)
AWS Windows サーバーがリモートデスクトップで手が滑りワンクリックで文鎮化?! 救済手段はあるのだろうか...

(2019/11/29更新) コメント欄にインバウンドポートが開放されていなくてもブラウザでPowerShellを動かす機能がAWSにありましたので参考になさってください！
・　・　・　・　・

下図の場所(Windows Securityの"Incoming Connections"チェックボックス)を誤ってクリックしてリモートデスクトップが切断、再接続不能になり、文鎮化...
ドメインに参加しておらずグループポリシーによるスタートアップ時の強制配信もできず、他のリモートツールもインストールされておらず、クラウドから蒸発させるしか道は残されていないようでした。英語で検索すると他の人も困っているようで、
https://serverfault.com/questions/919736/windows-server-2012-unblock-windows-firewall-ec2
のようなリカバリー手段もなくもなさそうですが、現実的なのだろうか。
一つ可能性を考えたのは内部IPで別のWindows サーバーを構築し内部IPからリモートデスクトップを行う方法。ただし、画面の説明通り、"Public Network"としてしか元々認識されていなければ（初期のデフォルト値では）アウトですよね...
ドメインに参加しておらず内部ネットワークとしての認識もされておらず外部ネットワークのみで運用している場合は【危険】！
バックアップから戻しをできるようにしておく重要性を実感しました。
別のツールを入れていても通信自体がブロックされてしまうようなので、
バックアップからの戻しが一番現実的なのか。
とりあえず私物のAWSだったので文鎮化したサーバーを丸ごと消しました。
事象の再現ができるか試してみたところ見事に再現ができた
（再現させて画像のキャプチャをしたのですが・・・）。
恐るべしWindows Security！
![截屏2019-11-2609.47.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/c96b2d06-2fa6-3b0e-4621-aec7d04927f9.png)

パブリックネットワークの扱いでドメインにも参加させておらず、
Blocks all incoming connections... にチェック入れると終・わ・り！！
トルツメにframeやらNSLayoutConstraint使うとかお前はミスターアンモナイトかｗｗｗｗｗｗ

初投稿です。温かい目でみてください。

現場でframeやらNSLayoutConstraintを変数化して弄ってトルツメを実現しているのが余りに多いので可読性を上げるためにもStackViewを使用して短いコードで書いちゃおうという記事です。


#ログイン時と非ログイン時でレイアウトを変更したい！
例えばログイン時は会員メニューにアクセスできるが非ログイン時はそもそもメニューを出したくないなんてレイアウト

![圧縮用.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415441/11351296-31e6-4768-4933-4407d980452d.gif)

こんな感じですね。


そしてコードですがこちらです。

```swift:viewcontroller.swift
    @IBAction func eventButton(_ sender: Any) {
        UIView.animate(withDuration: 0.3) {
            self.hiddenLabel.isHidden = !self.hiddenLabel.isHidden;
            self.hiddenView.isHidden = !self.hiddenView.isHidden;
        }
    }
```


```objective_c:viewcontroller.m

- (IBAction)eventButton:(id)sender {
    [UIView animateWithDuration:0.3f animations:^{
        self.hiddenLabel.hidden = !self.hiddenLabel.isHidden;
        self.hiddenView.hidden = !self.hiddenView.isHidden;
    }];
}

```

以上です。

viewやらラベルをhiddenにするだけでトルツメできてます。

#方法
StackViewにいれて自動でレイアウトを変更することによってトルツメを実現しています。
![スクリーンショット 2019-11-26 7.45.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415441/1c4ec3ba-2775-5c18-cdcd-969c09cc4dcd.png)

上部のラベルの制約ですが、
![スクリーンショット 2019-11-26 7.46.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415441/30684a12-1ef7-41d0-7d8f-ba21a2b79730.png)
どの機種であっても幅を変えたくないので高さを30に固定。
上、右、左にsuperViewに０でConstraintを設定しています。

下部のビューの制約ですが、
![スクリーンショット 2019-11-26 7.49.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415441/f288dc53-ea8b-20ad-856c-e9d2b0c96899.png)
機種の大きさによって幅を動的に変えたいのでsuperViewの1/11の大きさに。
下、右、左にsuperViewに０でConstraintを設定しています。

そして真ん中のビューですが、
![スクリーンショット 2019-11-26 7.53.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415441/5142ebd8-3b7b-a2ad-4613-d4aba35ceea1.png)
上Constraintを上部ラベルに、
下Constraintを下部ビューに０で設定しています。

これによって上部と下部がなくなった場合次にsuperViewのtopとbottomがくるので自動的に紐付けされhiddenのみでトルツメができるというわけです。

#最後に
実はstackviewがめちゃくちゃ嫌いだったんですがトルツメするにあたってはこれ以上便利なものはないので好きになりました。
~~無料で~~SQLCipher使いたい彷徨える人に

環境
OS        : macOS Catalina
SQLCipher : 4.2.0
SQLite    : 3.30.1
Openssl   : 1.1.1d

SQLiteを暗号化/復号化したくてSQLCipherのコンパイル手順を探していたけど、
情報が散り散りになっていて、手順を**確実に**忘れるのでキーリングの設定から
コンパイル完了までをまとめてみました。

手順の中にOpenSSLのインストール方法は書いていません。
僕の場合はHomebrewを使ってインストールしました。
ちなみに、元々OpenSSL1.1が入っていたようなので、SQLCipherのconfigureを
する際に、オプションで1.1.1dのフォルダを見に行くようにしているので、ちゃんと
最新版のフォルダを見に行っているか確認願います。

拙い英語で説明を書いたので、記述ミスや誤字脱字等ありましたらご指摘お願いします。

SQLCipher Community Editionのコンパイル手順
https://github.com/ponono-ponono/configure_SQLCipher/wiki
【Unity】セーブとロード簡単に実装してくれるManagerクラスを作ってみた

#UnityのPlayerPrefsが使いづらい…
Unityで使える**PlayerPrefs**を使っている方は多いと思います、自分も初めて使った時は感動して多様しました（笑）
ですが**PlayerPrefs**を使っていくうちに「アレ？なんか使いづらくね？」と気づくわけです。

#PlayerPrefs何が使いづらい？
* まず大量のセーブに向いていない点です。例えば100個の値を保存したい場合100回**PlayerPrefs**を呼び出す必要性があるわけです。
* int型、float型、string型しか保存できない。
* どこに保存してあるかよくわからない。

などなど割と使いづらい点があるわけです。

#Libraryを使用
独自Libraryを作成しましたのでこれを使ってセーブやロードを使用と思います。

#使える機能
*  セーブ
*  ロード
*  フォルダ内に存在するファイル数を取得<br>
これらの機能を備えています。

#とりあえずSingletonさせたい
とりあえずSingletonさせたいので[**ここ**](https://github.com/Soumakakami/SingletonMonoBehaviour)から**SingletonMonoBehaviour**をダウンロードしてください。

#コード

```c#:SaveLoadManager.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using SKLibrary.SaveAndLoad;

public class SaveLoadManager : SingletonMonoBehaviour<SaveLoadManager>
{
   //ここにセーブフォルダを追加すれば楽になるかも
	public enum SaveFolder
	{
		Audio	= 0,
		Stage	= 1,
		Save	= 2
	};

	public void Save(object _saveObject, string _fileName,SaveFolder _saveFolder)
	{
		SaveLoadSystem.Save(_saveObject, _fileName,_saveFolder.ToString());
	}

	public object Load(string _fileName, SaveFolder _saveFolder)
	{
		return SaveLoadSystem.Load(_fileName, _saveFolder.ToString());
	}
	
	public int ReadFiles(SaveFolder _saveFolder, string _extension = "*.binary")
	{
		return SaveLoadSystem.ReadFiles(_saveFolder.ToString());
	}
}

```

#まとめ
まだまだ拡張の余地があると思うので今後もアップグレードしようと思います。

#追記
セーブしたい場合[Serializable]をクラスにつけないとエラーがでます。
Deep Learning for ENGINEER

JDLA Deep Learning for ENGINEER
https://www.jdla.org/business/certificate/?id=certificate_No04

# 推薦図書

ＡＩ白書　２０１９ (編)独立行政法人情報処理推進機構
AI白書編集委員会 角川アスキー総合研究所
https://www.amazon.co.jp/dp/4049110148/

人工知能は人間を超えるか ディープラーニングの先にあるもの
角川EPUB選書(著)松尾 豊 KADOKAWA
https://www.amazon.co.jp/dp/4040800206/

深層学習　機械学習プロフェッショナルシリーズ
(著)岡谷 貴之 講談社
https://www.amazon.co.jp/dp/B018K6C99A/

ディープラーニング活用の教科書 (監修)JDLA
(編集)日経クロストレンド 日経BP社
https://www.amazon.co.jp/dp/4296100548/


ビジネスパーソンのための人工知能入門
(著)巣籠悠輔、マイナビ出版
https://www.amazon.co.jp/dp/483996551X/


AIをビジネスに実装する方法 「ディープラーニング」が利益を創出する
(著)岡田陽介、日本実業出版社
https://www.amazon.co.jp/dp/4534056265/

ロボット・AIと法
(著)弥永真生ら、有斐閣
https://www.amazon.co.jp/dp/4641125961/

https://www.jdla.org/wp/wp-content/uploads/2019/09/JDLA_Eシラバス_2020版.pdf
シラバス中の推薦図書での網羅率を確認中。

そこにないものは、各認定セミナの教材にあると推測。
plunkerでtensorflow.js その24

#概要

plunkerでtensorflow.jsやってみた。
倒立振子、学習してみた。

#参考にしたページ

https://qiita.com/ohisama@github/items/85cc25dc654a27ca7845

#成果物

http://embed.plnkr.co/cLpO3knMmZjsOAHSkKb2/

以上。
obnizとNode-REDを連携した活用法

#概要
　日頃、[obniz](https://obniz.io/ja/)を[Node-RED](https://nodered.jp/)と連携して使っています。この組み合わせで利用されている記事を見かけないので、私の活用法をご紹介します。

#活用法
　obnizには[サーバレスイベント](https://obniz.io/ja/doc/obniz_cloud/about_event)というサービスがあります。
　obnizで定期的にセンサデータを取得したい場合、外部から定期的にhttp requestが必要になってきます。この「外部から定期的に」をobnizクラウドに設定するだけで自動で実行してくれる仕組みが「サーバレスイベント」です。※注意点として、１日のトリガ数は最多で120回に制限されています。

　サーバレスイベントには次のようなトリガーを設定できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/d12ca877-48f9-4287-b2fc-19896d3bdec7.png)

　「定期的に」だけならこのサーバレスイベントだけ実現可能だと思います。自分の場合、外部サービス（Web API等）をトリガとして動かしたいことがありました。
　サービスの連携といえば**Node-RED**ですね。ということで、Node-REDからobnizのプログラムを動かす仕組みを作ってみました。

##サーバレスイベントの設定
　obnizの開発者コンソールを開くと、画面左側に「サーバレスイベント」という項目があるので、これを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/ef9fbf60-778e-548e-c5ba-163211433814.png)

次に、サーバレスイベントを新規作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/f87114bd-ea6a-a378-c421-500df2ba9b03.png)

サーバレスイベントの設定で注意するところは、きっかけの項目を**Webhook**にすることです。他は実行するWebAPPにサーバレスイベントで実行したいobnizのリポジトリを選択します。記入が終わったら「作成ボタン」を押して確定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/69db0f4c-3e1c-2d07-1cb0-40ffab589a04.png)

##サーバレスイベントの実行確認
　サーバレスイベント作成後、次のような画面となります。画面右の「テスト実行ボタン」を押して{"status":"OK"}と表示されれば設定完了です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/a2c0a692-ca5f-7c68-0b8c-00eb1e70630e.png)

　後ほど、EndpointのURLをNode-REDで使用するので、メモ帳などにコピーしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/b6dedba2-c4ac-6c7b-9614-50e93b016c56.png)


##Node-REDのフローを作る
　Node-REDでは外部サービスからのトリガを受けて、http requestを行います。
http requestを利用するには次のようなフローを作成します。今回は外部サービスからのトリガの代わりに、injectノードを使用しています。injectノードは周期的にトリガをかけることや、ノード横のボタンを押すと事でトリガをかけることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/03973c82-8809-1a51-d441-fe284955e103.png)

　http requestノードの設定を開き、URL欄にサーバレスイベントのEndpointに記載されたURLを入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/8fc13173-fe38-ceb9-1bac-5a19dd406e81.png)

　URLの設定後デプロイを行い、injectノードのボタンを押すとサーバレスイベントに登録されたプログラムが実行されます。Node-REDのデバッグコンソールを確認し、{"status":"OK"}と表示されていれば正常に実行できていることになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/3128b3c8-368e-a9e8-17d1-ecf2a5ac7fed.png)

#おわりに
　obnizで何か動かす事はとっても楽しいと思います。Node-REDと組み合わせればできることの範囲が広がり、楽しいこともいっぱい増えると思います。
　例えば、「今日の最低気温がxx℃を下回っていたら、yy時にエアコンの電源をobnizで入れる」とか面白そうですね（^^）
Githubの使い方を忘れないようにメモする。

#とりあえずgitを使う
そもそもgitを使おうと思ったのは、就活用として必要なのでは？と言うこととあまりにもtwitterの強い人たちがGitHubやらなんやら言っていあせってました。くそおお！！！自分もつかいたい！！

そんなこんなで使い始めようと決意。まず、GitとGitHubの違いって何？みたいなレベルなのでその段階から調べることにしました。
↓を参考にしました。
https://t.co/g9Bp31FtKM?amp=1

目標は以下の環境でコードを書いてgithubにpushすること
windows10
vscode
python3.7
コマンドプロンプト
gitのダウンロード（調べれば出てくる）

#gitにpushするまでの流れ

GitHubの使い方
①コードを書く「保存）
②コマンドプロンプトでコードが書いてある（cd）フォルダを開く
③git init　（すでにレポジトリがあるときはいらない）
④git add 書いたファイルの名前～.py
⑤git commit -m "なんかコメント"
⑥録GitHubでニューレポジトリを作る。（すでにレポジトリがあるときはいらない）
⑦GitHubページに書いてある。git remote addの所をコピペ（すでにレポジトリがあるときはいらない）
⑧git push -u origin master

完了

#まとめ
今回でGitHubを完全に理解したわけだが（嘘です）もっとgitの理解を深めたいのでまたなんかあったら書きます。それでは、また。

チャオ！！！！！
対象のポリゴンを中心にした数メートルの正方形のポリゴンを取得

対象のポリゴンを中心にした数メートルの正方形のポリゴンを取得するには
どうSQLを書けばいいのでしょうか。
ポリゴンの重心をSTCentroid()で取得するという風に思っています。
ST～関数と使ってできるのかなと。

最近システム開発をはじめました。
よろしくお願い致します。
Movable Type 備忘録

#コメントアウト
```
<mt:ignore>ここは出力されない</mt:ignore>
```

#カテゴリの条件分け
サブカテゴリがある場合でもそのカテゴリが指定されていないと条件は実行されない。

```
<mt:IfCategory name="カテゴリ名">
  <mt:ignore>ここに各種記述</mt:ignore>
</mt:If>
```

#ブログIDによる出し分け
```
<MTIf name="blog_id" eq="1">
  <mt:ignore>ここに各種記述</mt:ignore>
</MTIf>
```

#複数条件で絞る
ブログIDが1か2の場合

```
<MTIf name="blog_id" like="^(1|2)$">
  <mt:ignore>ここに各種記述</mt:ignore>
</MTIf>
```
※like="1|2"とすると blog_id が 11や12のものまで出てくるので注意


#各種パス
```
<mt:BlogSitePath> ブログのサイトパス  https://www.example.com/　(最後の / スラッシュもつく）
<mt:CGIPath>ブログのCGIパス 
<mt:AdminCGIPath>MTのCGIのパス https://www.example.com/cgi-bin/mt/
```

#モジュール読み込みで変数を指定する
```
<MTInclude module="モジュール名" hensu_mei="hogehoge">
```
で指定した場合は、「モジュール名」側のモジュールで、

```
<MTIf name="hensu_mei" eq="hogehoge">
<!-- 条件に当てはまる -->
<MTElse>
<!-- 条件に当てはまらない -->
</MTIf>
```
という形で取得可能

#カスタムフィールドに値が入っていたら値を表示
```
<mt:Unless tag="カスタムフィールド">
<mt:カスタムフィールド />
</mt:Unless>
```
#カスタムフィールドのチェックボックスにチェックが入っていたら実行
```
<mt:If tag="chkHogeHoge">チェックボックスにチェックがされていたら表示</mt:If>
```

# 読み込みモジュール先で変数を使う
```
<mt:SetVars>
url=<mt:BlogURL>
hogehoge=hage
</mt:SetVars>

<mt:include module="HageModule">
```
HageModule

```
<mt:Var name="hogehoge">
```

#プラグインでカスタムフィールドに複数のチェックボックスを利用したい
http://www.koikikukan.com/archives/2018/12/13-000300.php

#出力ファイル名のアーカイブマッピングでの指定について
https://www.movabletype.jp/documentation/mt6/appendices/archive-file-path-specifiers.html
機械学習・AIプロジェクトの要素を整理する手法をまとめてみました

機械学習やAIのプロジェクトを始めたり進めたりするのに，いわゆる "PoC祭り" になってしまうことがありますが，何とか回避できないかといろんな人たちが分析・コミュニケーション手法を作っていますので少し調べてみました．たぶん網羅はしていないのでその点はご容赦ください．

## 海外の手法
###[The Machine Learning Canvas](https://www.louisdorard.com/machine-learning-canvas)
公開の日付が見つけられませんでしたが，たぶん老舗です．書籍なども出ているようです．
ぱっと見でどこに何を書くのか分かりにくいですが，要素は充実しています．明らかに技術者寄りの作りになっています．
後で出てくる「機械学習キャンバス」もそうですが，初期の手法は非MLとの比較が含まれているのが面白いです．
![The Machine Learning Canvas](https://images.squarespace-cdn.com/content/v1/5206b718e4b0bdc26006bae2/1473867227758-7JUXUIVLOOJTZQVZOPO4/ke17ZwdGBToddI8pDm48kC2Ou1MO9kamcKms_rlnXOx7gQa3H78H3Y0txjaiv_0fDoOvxcdMmMKkDsyUqMSsMWxHk725yiiHCCLfrh8O1z4YTzHvnKhyp6Da-NYroOW3ZGjoBKy3azqku80C789l0uaXNx80D0McfB72Ma0lflo0nlext0JZ61zpqcjChfkagJk728J7DlqVoX33-EFZ3Q/image-asset.png?format=2500w)
出典: [Machine Learning Canvas &mdash; Louis Dorard](https://www.louisdorard.com/machine-learning-canvas)

###[AI Project Canvas](https://towardsdatascience.com/introducing-the-ai-project-canvas-e88e29eb7024)
要素数や配置を含め，ほとんど[ビジネスモデルキャンバス](https://www.strategyzer.com/canvas)そのままですね．
技術を書き込む部分がほぼなく，PMが使うイメージが近い気がします．
![AI Project Canvas](https://miro.medium.com/max/1650/1*lgK0qOUGBLBym71QjHmuSw.jpeg)
出典: [Towards Data Science](https://towardsdatascience.com/introducing-the-ai-project-canvas-e88e29eb7024)

## 国内の手法
###[機械学習キャンバス](https://www.slideshare.net/nishio/01-68382174)
これも結構前から公開されています．リーンキャンバスをベースとしているよう．
従来手法(手動／非機械学習)との差異の説明に重点を置いており，"Why machine learning?" という点に納得感を持たせられる作り．みんなで問題を整理するというより，専門家でない人に説明するのに向いていると思います．
![機械学習キャンバス](https://image.slidesharecdn.com/0-161108063247/95/01-3-638.jpg?cb=1478586797)
出典: [SlideShare](https://www.slideshare.net/nishio/01-68382174)

###[AI Lean Canvas](https://ainow.ai/2017/01/18/107055/)
これもリーンキャンバスがベース．他の記事を見てても日本はリーンキャンバス好きですよね．
明らかにサービス提供者寄りで，課題設定や価値提供の部分が手厚いのが特徴です．
![AI Lean Canvas](https://ainow.ai/wp-content/uploads/2016/01/AI-Lean-Canvas.png)
出典: [AINOW](https://ainow.ai/2017/01/18/107055/)

###[機械学習プロジェクトキャンバス](https://mitsubishi-chemical-hd-dx.github.io/canvas/)
これは私たちが制作・公開したもので，ビジネスモデルキャンバスがベースになっています．
ユーザ企業が公開したという特徴を受けて，運用時を含むなどユーザ寄りの内容になっています．
![機械学習プロジェクトキャンバス](https://mitsubishi-chemical-hd-dx.github.io/images/MLPC.png)
出典: [mitsubishi-chemical-hd-dx.github.io](https://mitsubishi-chemical-hd-dx.github.io/canvas/)

##まとめ
イントロでは "PoC祭り" と書きましたが，たぶんいくつかの観点でこういうものが作られていると感じました．

- 必要な要素をきちんと挙げないと機械学習・AIのプロジェクトが始められない／続けられない
- ビジネス現場に価値を届けられるかを事前に知りたい
- 従来の技術でなく機械学習・AIを使う理由を理解／説明したい
- 技術者とビジネス現場，サービス提供者とユーザのコミュニケーションを円滑にしたい

AI関係の講演やコラムでも，いわゆる翻訳人材が足りないという声を良く聞きますが，人材教育だけでなく，こういった分析手法も翻訳問題を解決できるのではと思います．こういう自助的なアプローチはもっと発展してほしいですね．
オーストラリア本土の収容センター位置と人口 / Number of People in Onshore Immigration Detention Centers in Australia

English below 
&darr;&darr;&darr;&darr;&darr;&darr;&darr;&darr;

下は2019年02月19日のオーストラリア本土の移民収容センター人口の地図。沖合いにある移民収容センターが含まれません。この地図はPythonのGeopandas、Cartopy、Matplotlib、とJupyter Labで全部作られました。僕はこれをMonochrome Mapping Competitionに提出しました。Jupyterファイルが[このリンク](https://github.com/biskwikman/immi-map-aus)である：

![aus-immi-detention-map-bw-jp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282576/fbfe3846-b531-4ea7-0f5e-cd5d07b9bb76.png)

日本語上記
&uarr;&uarr;&uarr;&uarr;&uarr;&uarr;

This is a map showing every onshore immigration detention center in Australia and their population as of February 28th 2019. This does not include offshore immigration detention centers. This map was done completely in Python, using Geopandas, Cartopy, Matplotlib, and Jupyter Lab. I originally made it in color, and then made the black and white version for the Monochrome Mapping Competition, which I ended up liking better. The jupyter notebook files for this project can be found [here](https://github.com/biskwikman/immi-map-aus)

![aus-immi-detention-map-bw-en.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282576/95a61ead-76c1-d4ec-4a81-9d372d503db3.png)
Rustでunixtimestampを扱う

# 目的
Redisに時間を書き込んでやりとりする場合、時間を文字列に変換する必要があるのですが、時刻表現のフォーマットがバラバラなのが嫌なので、unixtimestampを使いたいです。
時刻はchronoのDateTimeを使います。

# プログラム

```rust:Cargo.toml
[package]
name = "unixtimestamp_test"
version = "0.1.0"
edition = "2018"

[dependencies]
chrono = "^0.4"
```

```rust:main.rs
use chrono::prelude::*;

fn parse_str_to_utc(src: &str) -> DateTime<Utc> {
    let mut iter = src.split(".");
    let secs =  iter.next().unwrap_or("0").parse().unwrap_or(0);
    let nanos = iter.next().unwrap_or("0").parse().unwrap_or(0);
    Utc.timestamp(secs, nanos)
}

fn parse_utc_to_str(src: &DateTime<Utc>) -> String {
    format!("{}.{}", src.timestamp(), src.timestamp_subsec_nanos())
}

fn main() {
    let now: DateTime<Utc> = Utc::now();
    let text = parse_utc_to_str(&now);
    let now2 = parse_str_to_utc(&text);
    assert_eq!(now, now2);

    println!("{}", now);
    println!("{}", text);
    println!("{}", parse_str_to_utc("0"));
    println!("{}", parse_str_to_utc("1.1"));
    println!("{}", parse_str_to_utc("1.100000000"));
}
```
```text
2019-12-02 23:56:41.596503200 UTC
1575331001.596503200
1970-01-01 00:00:00 UTC
1970-01-01 00:00:01.000000001 UTC
1970-01-01 00:00:01.100 UTC
```
[Golang][競プロ]子ども達に大福を分け与える問題について解説してみた

# はじめに

今日は、競技プログラミングをしてみたので、回答のロジックについて共有致します。
なお、競技プログラミングサービス側の規約もありますので、**問題文は全く違うものを用意**しておりますが、もし万が一コンプライアンスに問題があれば、ご連絡頂けると嬉しいです。

# 問題

おばあさんは、大福を`N`個持っています。
2人の孫が遊びに来たので、大福を分けてやることにしました。
標準入力で大福の数`N`を与えられた場合、2人の孫はいくつずつもらえるでしょう？
ただし、大福の数が奇数だった場合、孫のどちらかが多くなってしまいケンカになりかねないので、その場合はおばあさんが1つ食べるとします。

# 回答

問題文の稚拙さは、ご容赦ください。笑
それでは、僕の回答について共有致します。

## コード

```golang:回答したコード
package main
import "fmt"
func main(){
    var i int
    fmt.Scanf("%d", &i)
    r := i / 2
    fmt.Println(r)
}
```

## 解説

今回は、かなり初歩的な問題だったかと思います。
おそらく、標準入力の受け取りと出力の確認を兼ねた、ウォーミングアップといったところでしょうか。
では、簡単ではございますが、解説していきます。

### `fmt.Scanf`関数で標準入力を取得

[以前書いた記事](https://qiita.com/riotam/items/dd4bf971757754ae7665)でも共有させて頂いた、この方法で行いました。
色々な方法がありますが、記述量も少なく直感的に使える関数で、個人的には好きな関数です。笑

### おばあちゃんが1つ食べるのはスルーしたロジック

今回は、`N`が奇数なら-1、偶数ならそのまま、2人に分けても良いかとも思いましたが、思い切ってスルーしました。
多くの言語で同じ挙動を見せるかと思いますが、いわゆる「除算の商」は整数のみになります。

この特性を利用して、シンプルに割り算しただけにしました。
（奇数の場合は、商は少数にならずに切り捨てられるため。）

# さいごに

今回はこれで終わります。
何かあれば、ぜひお気軽にコメント頂けると嬉しいです。
最後までありがとうございました。
Serverless VPC AccessでGAE（Standard）からCloud Memorystore使ってみた

# いまきたさんぎょう
GAE(Standard)で
Cloud Memorystoreに
アクセス出来るよ

# 注意
Serverless VPC Accessはbetaです。
いつの間にか変わっていても私のせいじゃないです。

# Serverless VPC Accessとは
GAE（かCloud Functions）から、VPC内のリソースに、プライベートIPアドレスでアクセス出来るようになります
詳しくは[公式ドキュメント](https://cloud.google.com/vpc/docs/configure-serverless-vpc-access?hl=ja)を読んでください。

## で、具体的に何できんの？

* CloudSQL
* Cloud Memorystore
* GCEサーバー

などのVPC中にあるリソースを、外部に公開することなく、GAE（やCloud Functions）からアクセスすることが出来るようになります。

また、GAEの2nd Generation(Python3.7)では、1st Generation(Python2.7)で使えたMemcacheが使えなくなっていますが、その代替としても
[言及されています](https://cloud.google.com/appengine/docs/standard/python3/python-differences?hl=ja#memcache)。


# Cloud Memorystoreで使ってみる
GAE(Python3.7+Standard)から、Serverless VPC AccessでCloud Memorystoreを使ってみました。

## VPCの準備
gcloudなりConsoleなりでVPCを作ってください。
後述の理由で、Serverless VPC Access試すだけならSubnetは作らない方が楽です。

## Serverless VPC Accessの準備

Serverless VPC Accessで「[IP 範囲は、VPC ネットワーク内の既存の IP アドレス予約と重複してはいけません](https://cloud.google.com/vpc/docs/configure-serverless-vpc-access?hl=ja#creating_a_connector)」らしいので、IPアドレスの範囲はいい感じに設定してください。

ちなみに、IPアドレスの範囲が被っていると、GCE Subnetに下のようなエラーが出ます。
> "Invalid value for field 'resource.ipCidrRange': '10.147.0.0/28'. Extended subnetworks in auto subnet mode networks cannot overlap with 10.128.0.0/9." 

## Cloud Memorystoreの準備
作ったVPC内にCloud Memorystoreを[作ります](https://cloud.google.com/memorystore/docs/redis/creating-managing-instances?hl=ja)。

Connection propertiesに
* IPアドレス
* ポート
が表示されるので、メモっておきます。

## GAEの準備
GAE Standardでも、[GAE Flexibleからのアクセス](https://cloud.google.com/memorystore/docs/redis/connect-redis-instance-flex?hl=ja)と同様に、利用出来ます。

```
# -*- coding: utf-8 -*-

from flask import Flask, request
import os
import redis

app = Flask(__name__)


redis_host = os.environ.get('REDISHOST', 'localhost')
redis_port = int(os.environ.get('REDISPORT', 6379))
redis_client = redis.StrictRedis(host=redis_host, port=redis_port)

@app.route('/hoge', methods=['GET'])
def hoge_request():
    value = redis_client.incr('counter', 1)
    return str(value), 200
```

app.yaml

```
runtime: python37
service: default
entrypoint: gunicorn handlers:app --workers=1

env_variables:
  REDISHOST: CloudMemorystoreのIPアドレス
  REDISPORT: CloudMemorystoreのポート

vpc_access_connector:
  name: "projects/projectのID/locations/asia-northeast1/connectors/コネクタの名前"

handlers:
- url: /hoge
  script: auto

```

requirements.txt

```
flask
gunicorn
redis
```

デプロイ
[公式ドキュメントにもあるように](https://cloud.google.com/appengine/docs/standard/python3/connecting-vpc?hl=ja)、**beta**を付ける必要があります（※）。

```
gcloud beta app deploy app.yaml
```

※betaつけないと、デプロイには成功しますが、デプロイ後のMemorystoreへのアクセス時に失敗します

## 結果
Redisにカウントが保存され、アクセスするたびにインクリメントされます。

```
> curl "https://エンドポイント.appspot.com/hoge"
8
> curl "https://エンドポイント.appspot.com/hoge"                                                                                                                                        
9
```

# その他
* GAEとServerless VPC Accessは同じリージョンである必要があります
 * リリースノートには無いですが、いつの間にかasia-northeast1で使えるようになっています
81. Search in Rotated Sorted Array II

#Problem

[problem](https://leetcode.com/problems/search-in-rotated-sorted-array-ii/)

#Submission
```python:submission.py
class Solution:    
    def search(self, nums: List[int], target: int) -> bool:
        if nums.count(target) > 0:
            return True 
        else:
            return False
```
targetの有無の判定だけでOKですね。
plunkerでtensorflow.js その23

# 概要

plunkerでtensorflow.jsやってみた。
自動運転を学習してみた。

# 参考にしたページ

https://qiita.com/ohisama@github/items/131cb5a4d0ed957ce643

# 成果物

https://embed.plnkr.co/ldL5Unt1KYkkdmeiyIk7/

以上。
plunkerでtensorflow.js その22

#概要

plunkerでtensorflow.jsやってみた。
7セグメントLEDを学習してみた。

#参考にしたページ

https://qiita.com/ohisama@github/items/a1b196599f90d4241c76

#成果物

https://embed.plnkr.co/3GMooy72AQ4DCyvQgwwR/

以上。
mLabを試してみる

[mLab](https://mlab.com)を試してみる

mLab：MongoDBのDBaaS環境
無料枠があるので試してみるしかない

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420245/872b5957-8f18-6b24-b9d5-f0977135782f.png)
まずは普通にアカウントを作成します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420245/dfb2fc05-5cee-02ed-66f7-c421ba62c09b.png)
一番左の無料枠を選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420245/cdea1d1f-d6fa-e18f-72e9-5ddccadee064.png)
適当にRegionを指定して。。
（SandBoxはもう立ててしまっているのでM30になっていますが、試したい方はTierをSandBoxにしてください）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420245/af2ffe25-f7c2-32d7-f049-a282bbd7232b.png)
Clusterが立ち上がりました。

接続情報を設定する

編集中
binding.pryでデバック  ❏Rails❏

#【その1】gemを追加
```ruby:Gemfile
gem 'pry-rails'
```

```
bundle install
```

<br>
いつものごとくサーバーを再起動します。

```
rails s
```

なぜなら、サーバーを起動した際にgemが反映されるからです。

#【その2】デバックしたいところにbinding.pry
```ruby:tweets_controller
def create
  Tweet.create(tweet_params)
  binding.pry
end
```

実際のページでcreateアクションを動かします。
投稿ができずに処理が止まるはずです。

#【その3】ターミナルで値を確認
ターミナルを見ます。
paramsと打つと、何が入っているのかわかります。

```terminal
[1] pry(#<TweetsController>)> params
=> <ActionController::Parameters {"utf8"=>"✓", "authenticity_token"=>"cFfq1a/zC8fMEriJKXNzupYtBniyVra94V7SKbl3I1vDa29/Lbiy5BI9ARlki7ASU9wZ6v77fYVZ69mPHtAs9A==", "tweet"=><ActionController::Parameters {"text"=>"ワッショイ！"} permitted: false>, "commit"=>"Create Tweet", "controller"=>"tweets", "action"=>"create"} permitted: false>
[2] pry(#<TweetsController>)> params[:text]
=> nil
[3] pry(#<TweetsController>)> params[:tweet][:text]
=> "ワッショイ！"
```

この場合textの値は二重括弧で囲われているため、params[:text]ではなく、params[:tweet][:text]で取得できます。

#【その4】exitで処理を再開する

```terminal
[4] pry(#<TweetsController>)> exit
```

exit忘れるとずっと処理が止まったままです。

---

<br>
####binding.pryを駆使して、デバッグに強くなろう！

<br>
ではまた！
deviseの超便利ヘルパーまとめ ❏Rails❏

#deviseのヘルパーメソッド

| メソッド | 機能 |
|:------|:----|
| current_user | 現在ログインしているユーザーのインスタンス |
| user_signed_in? | ユーザーがログインしているか |
| before_action :authenticate_user! | ログインしていない場合はログイン画面に遷移させる | 
| after_sign_out_path_for | ログアウト後のリダイレクト先を指定 |

#【current_user】
現在ログイン中のユーザーのレコードをインスタンスとして取得できるメソッドです。
モデル間でアソシエーションを組んでいる場合、子要素・親要素の取得も可能です。

```ruby
current_user.name
#ユーザーの名前

current_user.tweets
#ユーザーが保持するツイートすべて
```

#【user_signed_in?】
ログインしている場合true
ログインしていない場合false
を返します。

```
<% if user_signed_in? %>
  <div>
    <%= link_to "ログアウト", destroy_user_session_path, method: :delete %>
  </div>
<% else %>
  <div>
    <%= link_to "ログイン", new_user_session_path %>
    <%= link_to "新規登録", new_user_registration_path %>
  </div>
<% end %>
```

ログインしていたらログアウトボタンを、
ログインしていなかったらログインボタンと新規登録ボタンを表示させています。

#【before_action :authenticate_user!】
コントローラーの最初に記載することで、ログインユーザーのみに処理を実行させることができます。

```ruby:tweets.controller.rb
class TweetsController < ApplicationController
  before_action :authenticate_user!, except: [:index]

  def index
  end

  def new
  end
end
```

except(除く)・only(のみ)オプションがあります。

上の例だと以下2つは同じ意味です。
except: [:index]
only: [:new]

非ログインユーザーがnewアクションを実行した場合、ログイン画面に遷移します。

#【after_sign_out_path_for】
ログアウトした後にどの画面に遷移するかを指定できます。
URLでもprefixでも構いません。

```ruby:application_controller
def after_sitn_out_path_for(resource)
  '/users/sign_in'
end

def after_sitn_out_path_for(resource)
  new_user_session_path
end
```

<br>
deviseログイン機能の実装方法はこちらへ
>https://qiita.com/ITmanbow/items/50b8dd216d442dae21ea

<br>
ではまた！
leafletを鍛える。その25

#概要

leafletを鍛えてみた。
streetviewが足りないよね。

#参考にしたページ

https://github.com/Zverik/leaflet-streetview

#成果物

https://embed.plnkr.co/26CHGTG6Q9f22VPXMK3m/


以上。
orderメソッドでツイートを新しい順に ❏Rails❏

orderを使うと、データベースから取得した複数のレコードを並び替えることができます。
今回はツイートの投稿日が新しいものが上に来るようにします。

#使い方
```ruby
.order("カラム名 順序")
```
順序は、ASC（昇順）とDESC（降順）があります。

#使用例
```ruby:tweets_controller
def index
  @tweet = Tweet.all.order("created_at DESC")
end
```
allですべて取得し、それを投稿日の降順で並び替えます。

<br>
また、allは省略できます。

```ruby:tweets_controller
def index
  @tweet = Tweet.order("created_at DESC")
end
```
---

<br>
ではまた！
人生を可視化しよう

# 背景
じぶんリリースノートなる考えを[こちらの記事](https://www.konosumi.net/entry/2019/10/15/070000)で初めて知りました。詳細はリンク先で確認いただければと思いますが、私の勝手な解釈だとじぶんリリースノートとはリリースノートの形式に模した日記のようなものだという認識です。とても面白い試みで、私も似たようなことを是非やってみたいと思ったのが今回の試みの大きなきっかけです。ただ私の場合はパプリックなリリースノート形式にこだわりがないのと、仮にこれを1年間ぐらいやったときに過去1年間ふりかえるの辛そうだなと思ったので、自分なりのソリューションを考えました。

# やりたかったこと
私がやりたかったこととしては、人生において残しておきたい出来事やデータを記録しておくことです。残したいことの基準は特になく独断と偏見で決めていきます。今の段階で残そうとしているものは具体的に
- インプットしたこと（読書とか勉強）
- アウトプットしたこと（プログラムとか記事）
- 遊んだ記録（旅行とかゲーム）
みたいなのです。また、それに付随するメモやふりかえりなども残していこうと思います。基本的には実績ベースのことしか残しません。

データを残す以外にやりたかったことは次のようなことです。
- 1週間とか1ヶ月毎に気軽にふりかえりたい
- グラフとか使ってカッコよく可視化していきたい
- モバイルからでも気軽に入力できるようにしたい
- クラウド上に保存できる
- お金がかからない
- 保守が楽

以上を念頭にいい感じのソリューションを考えました。

# やったこと
最初は Git 使ってやろうだとかお手製のアプリを作ってやろうかとか考えたんですが、簡単な入力フォームと DB と BI ツールがあればやりたいことができるんじゃ...と気付きました。そんなありがちなものは既にサービスとして提供されているはずで、最終的には Google Cloud で提供されているサービスを組み合わせて実現しました。

## 概要図

![systemoverview.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445743/1a2b8972-15c4-fcea-f36b-ee93a6ff4aa3.png)

概要図としては以上のものになります。シンプルですね。流れとしては、暇なときに Google フォームにやったことをデータとして入力します。すると勝手に Google スプレッドシートにデータが保存され、保存されたデータも勝手に Google データポータル に連携されます。定期的にメールでダッシュボードを通知することもできるので、ダッシュボードを予め作っておけばわざわざ Google データポータルを開かなくとも1週間、1ヶ月のフィードバックがグラフとして参照できるという算段です。

## 入力フォーム
入力フォームは下記表のような構成にしました。何のデータを残したいかは人それぞれだと思うので、ここは自分の好きなように設定すればいいと思います。本当はカテゴリ分類は後の BI ツールのことも考えてドリルダウンができるよう階層化したかったのですが、Google フォームでやるには実現・保守ともに面倒くさそうだったので妥協しました。階層化すると入力も面倒になるのでそこはトレードオフかなと思います。Google フォームはフォームの編集が直感的でシンプルなので、カテゴリのメンテもとても簡単なところもいいです。また、入力フォームのアドレスをスマホに共有しとけばいつでも入力することができます。

項目名 | 項目説明 | 必須項目
--- | --- | ---
Title | やったことのタイトル | ○
Done at | やった日付 | ○
Influence | 人生における影響度（１〜５で表す） | ○
Category | カテゴリ分類 | ○
Description | やったことの詳細説明 | 
Link | 関連リンク | 

## できたもの
最終的なアウトプットはこんな感じのものになります。適当に覚えていた出来事を入れただけで、今のところデータ数はそんなにないです。ダッシュボードの見た目はセンスが残念なところですが、その割にはいい感じじゃないでしょうか。ここ1ヶ月は遊んでばっかりなのがよくわかりますね。
![dashboard_sample1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445743/a859f976-5d9f-7dc2-11bf-8f77a99b61f4.png)

ちなみに Google データポータルには「コミュニティ由来ビジュアル表示」というものがあり、サードパーティ製のグラフコンポーネントが使えます。その中に Timeline というものもあり、これを使うといままでの軌跡がとてもいい感じに可視化されます。まだデータ数が少ないのでさっぱりとしてますが、長いことデータを貯めていけばもう少し様になるのかなと思います。
![dashboard_sample2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445743/459bf157-b268-ecef-0553-bf2fd562d860.png)

# あとがき
まだちゃんと使い始めてないので、使い勝手はなんとも言えないですが、個人的には満足できるものができました。こういう風にグラフとして見られれば続けるモチベーションも上がるかなと思います。ちなみに、今回のものを実現する上では一切コーディングをしていません。いい時代になりましたね。今回は可視化ツールとして SaaS として提供されていたので Google データポータルを使用しましたが、 スプレッドシートのように形式的にデータを保存していれば Apache Superset などの BI ツールとも連携できるので他の選択肢もあるかなと思います。応用として ToDo 系のアプリやGoogle カレンダーで完了したタスクを API連携 や IFTTT などのアプリで連携すれば入力フォームもいらないようになるんじゃないかなと思いました。みなさんもぜひやってみてください。

追記：
1年間やってみました→https://qiita.com/kaku10/items/94f4574aeb5d2694c284
プログラミング学習3日目

この日記は昨日の学習記録です
<h1>Progate javaコース達成</h1>
取りあえずprogateのJavaコースを3日程で全て終わらせる事が出来た。
あまり理解しがたい箇所も多々あったので、明日からは「スッキリわかるJava入門　第２版」を学習していこと思う。

<h2>Progate JavaⅤ 学習内容</h2>
<ul>
<li>オブジェクト指向において重要なクラス継承のやり方と理解</li>
<li>親クラスのメソッドをsuper()で使用する方法</li>
<li>抽象メソッドの書き方、サブクラスでオーバーライド(上書き)、クラス型のフィールド理解</li>
</ul>


<h3>プログラミングなんて自分には出来るのだろうか？と悩んでいても始まらないので、この日記を見てくれている人は、自分と一緒にプログラミング学習を進めていこう！！！</h3>
LinuxでCPU温度を計測する


#環境
ubuntu 18.04.3 LTS

#catでtempファイルを直接表示
```
$ cat /sys/class/thermal/thermal_zone0/temp
58200
```
ディレクトリの "thermal" 以下はOSやCPUで違うため適宜読み替えが必要。

#lm_sensorsを使う
```
$ apt-get install lm-sensors
(省略)
$ sensors
coretemp-isa-0000
Adapter: ISA adapter
Package id 0:  +60.0°C  (high = +87.0°C, crit = +105.0°C)
Core 0:        +57.0°C  (high = +87.0°C, crit = +105.0°C)
Core 1:        +60.0°C  (high = +87.0°C, crit = +105.0°C)
```

#psensorを使う(GUI)
```
$ apt-get install psensor
(省略)
$ psensor
```

![Screenshot from 2019-11-26 05-38-36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367760/c3d98543-7f33-55a0-ed56-f0f1b81a7592.png)

チェックボックスにチェックを入れるとグラフ表示も可能

![Screenshot from 2019-11-26 05-42-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367760/a696083c-cb84-cc9e-c796-190348e2b162.png)

#xsensorを使う
```
$ apt-get install xsensors
(省略)
$ xsensors
```
![Screenshot from 2019-11-26 05-46-40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367760/695b6b67-c7c6-bd8f-a197-67bfa3c582ca.png)

#おわり
紹介したツールのインストールは他ディストリビューションでも基本的に同じ（未確認）
それぞれ大きな違いはなさそうなのであとは好みで。
HDDの温度も同時に見れるpsensorが便利。

参考サイト
https://wiki.archlinux.jp/index.php/Lm_sensors
https://www.addictivetips.com/ubuntu-linux-tips/check-cpu-temperature-on-linux/
https://www.cyberciti.biz/faq/how-to-check-cpu-temperature-on-ubuntu-linux/
Linux 作業メモ: 時間を進める/戻すコマンド


Linuxのシステム時間を進めたり戻したりするコマンド。テストの時に重宝するのでメモ。


  
<br>


#####基本的には使うのはこのコマンドのみでOK.

```
date --set="STRING"
```

  
<br>

- 例1. 時間を"4 DEC 2019 15:30:00"へ進めます。

```
# date
Mon Nov 25 11:41:16 PST 2019
# date --set="4 DEC 2019 15:30:00"
Wed Dec  4 15:30:00 PST 2019
```

<br>

- 例2. 時間を25 NOV 2019 11:45:00"へ戻します。

```
# date --set="25 NOV 2019 11:45:00"
Mon Nov 25 11:45:00 PST 2019
```
<br>
<br>

便利なので是非ご利用ください。
no space left on deviceエラーの対応

```sh
> docker exec front df -i
Filesystem                  Inodes   IUsed               IFree IUse% Mounted on
overlay                    3907584 3907459                 125  100% /
# skip
osxfs          9223372036854775807 3103606 9223372036851672201    1% /root/dev
/dev/sda1                  3907584 3907459                 125  100% /etc/hosts
# skip
```

## TL;DR;

- Inodes利用率100%になるとコンテナの立ち上げができなくなる
- :point_down: が一番効果あった

```shell
docker volume rm `docker volume ls -q -f dangling=true`
```

## 今回の `no space left on device` の原因

- 初回 `docker-compose up` 時に遭遇
- 原因がディスク容量不足ではない
    - 仮に容量不足なら`docker.app`の設定を変更するだけなので話が早い
- コンテナの中にINODESを食い尽くしているファイルは特に無い
    - フレッシュなオフィシャルイメージでコンテナ作る時点でInode使用率100%になっていたケース
    - そもそも削れるファイルが無いケース
    

## volume削除

一番効果あった。自分の場合は30%以上減らせた

```sh
# activeでないvolumesを確認する
docker system df
# dangling volumeのリストを確認
docker volume ls -q -f dangling=true
# 参照されてないvolumesを削除
docker volume rm `docker volume ls -q -f dangling=true`
```

## コンテナ削除

若干効果あった。自分の場合は利用率を10%弱減らせた

```sh
docker rm xxxx使ってないコンテナxxxxx
```


## イメージ削除

わずかに効果あり。1-2%削減
`docker system df`でactiveでないイメージが相当ある場合は試してもよいかもしれない

```sh
# danglingイメージや、<none> 表示になってるイメージを削除
docker rmi xxxx使ってないイメージxxxxx
```
Python3.8.0で「大石泉すき」を標準出力する & Windows 10における最低限の環境構築

この記事は[「大石泉すき」アドベントカレンダー](https://qiita.com/advent-calendar/2019/ohishi-izumi-suki) 1日目の記事となります。
1日目は、シンプルに「Pythonで大石泉すきと標準出力する」とします。

「大石泉って誰だよ」「大石泉すきって何だよ」となった方は、
是非[アドベントカレンダーの説明ページ](https://qiita.com/advent-calendar/2019/ohishi-izumi-suki)をご覧ください

## tl; dr

やっていることはただの標準出力です。

### 大石泉すきを出力する

#### 一行で

```Python:izumi_oneline.py
# 一行で 因みにコメントアウトは#で行います
print("大石泉すき")
```

#### メソッドを定義して

```Python:izumi_method.py
# メソッド定義
def izumi_love():
    print("大石泉すき")

izumi_love()
```

#### Classを定義し、他のPythonファイルから呼び出す

- クラス定義

```Python:izumi_class.py
# -*- coding: utf-8 -*-
# クラス定義
class Person:

    # コンストラクタ
    # 名前、苗字の順に設定する
    def __init__(self,first,last):
        self.first = first
        self.last = last

    # 関数 Personで定義した人間をすきと言う
    def love(self):
        return self.last+self.first+"すき"
```

- 実行クラス

```Python:izumi_output.py
# -*- coding: utf-8 -*-

# izumi_class.pyファイルに書かれた処理を読み込む。拡張子不要
import izumi_class

# 実行する
izumi = izumi_class.Person("泉","大石")
print(izumi.love())
```

### 実行結果

```Bash
> python izumi_oneline.py　// 一行で出力
大石泉すき
> python izumi_method.py　// 関数を実行し出力
大石泉すき
> python izumi_output.py　// 別のクラスで書いたクラスを呼び出して出力
大石泉すき
```

**大石泉すき**と出力するだけでも、色々な方法があることが分かりました。

## 準備

### 環境

Windows 10 Home Edition
64bit OS
コマンドラインはPowerShellで叩いてます

### セットアップ

### Python3.8.0のインストール

[公式](https://www.python.org/downloads/)にアクセス
2019年12月現在の最新版は3.8.0なのでこれをダウンロード
落としてきた.exeファイルをダブルクリックで起動。画面の指示に従い、インストールを行う

### 環境変数の変更

以下のパスをPath変数に登録する

- {インストールディレクトリ}
- {インストールディレクトリ}\Scripts

#### 罠

上記に記載のPathは
``C:\Users\{ユーザ名}\AppData\Local\Microsoft\WindowsApps``より上に**登録しなくてはいけません**。

この設定が正しく行われていない場合、

```Bash
> python
```

このコマンドを打つと、**Microsoft Storeが起動します。** [^1]
因みに以下のコマンドは**何も出力されません。** 

```Bash
> python -V
```

※正しい挙動は、下記**バージョンの確認**を確認のこと。

### バージョンの確認

```Bash
> python -V
Python 3.8.0 // 正しい挙動！

> pip --version
pip 19.2.3 from {インストールパス} (python 3.8)
```

## ところで何故Pythonなのか

今回別件で、Discord Botを作ってみたくなったので……という私の趣味によるものです。。

## おまけ：このアドベントカレンダーで初めてQiitaに何かを書く人へ

初日なので、アドベントカレンダー参加者でQiitaで記事を書いたことのない方に向けて、
記事を書くにあたって読んだほうがいいと思う記事を少し上げておきます。

- [良い記事を書くためのガイドライン](https://help.qiita.com/ja/articles/qiita-article-guideline)
Qiitaにおける良い記事とはどのようなものか、どういう書き方をすると分かりやすく見えるのか
そんなことが記載されています。

- [Qiita マークダウン記法 一覧表・チートシート](https://qiita.com/kamorits/items/6f342da395ad57468ae3)
Qiitaで見栄えよく記事を書くための書き方です。Markdownと呼ばれる記法を基に、独自の記法もあります。
この書き方は色んな所で使えるので、書けるようになるとこの先便利かと。

[^1]: [Microsoft開発者ブログ](https://devblogs.microsoft.com/python/python-in-the-windows-10-may-2019-update/)によると、May 2019 Windows Updateによりデフォルトで「python.exe」がインストールされるようですが、これを実行するとストアのPython 3.7のページに飛ばされるのだとか。おそらくこいつが悪さをしているようです。