OmniAICreator/Qiita-1.07M huggingface dataset:
MySQLの起動からユーザ作成&権限付与まで

#この記事の内容
初めてMySQLを触ったので備忘録
以下3つの内容に関して記載する
・MySQLを立ち上げる
・ユーザーを作成する
・権限を付与する

#環境
mysql: ver 8.0.16 for osx10.13 on x86_64 (Homebrew)
OS:MacOS HighSierra 10.13.6

#MySQL立ち上げ
インストール部分は省略(Homebrewでインストール可能)
ターミナルを起動して以下のコマンドを入力してmysql.serverを立ち上げる

```
mysql.server start
```

以下の内容が表示されれば起動成功

```
Starting MySQL
.. SUCCESS! 
```

次にmysqlに接続
現在ユーザーは作成していないため管理ユーザー-rootで接続する

```
mysql -uroot
```
以下のように

```
>mysql 
```
と表示されれば接続成功
なお、接続を解除する方法はいくつか存在して、いずれかのコマンドを実行する

```
>mysql quit
>mysql exit
>mysql \q
```

#ユーザーを作成する
現在はrootでログインしているので、新規にユーザを作成する
ユーザーを新規に作成するためには以下のコマンドを入力する

'user'はユーザ名
'localhost'はホスト名
'password'はパスワード

```
CREATE USER 'user'@'localhost' IDENTIFIED BY 'password";
```

以下のコマンドでユーザ一覧を表示できる。
作ったユーザーが一覧に存在していれば作成成功

```
SELECT user,host FROM mysql.user
```

作成したユーザーでログインするためには以下のコマンドを実行

```
mysql -u user -p
```

そうするとpasswordの入力を求められるので先ほどのpassを入力することでログイン可能
現在ログインしているユーザを確かめるには以下のコマンドを実行

```
SELECT user()
```
ログインの際に用いたuserが表示されていればログイン成功

#権限を付与する
作成したユーザーは何も権限を持たないため、権限を付与する。
権限は細かに設定可能であり、データベース、テーブル単位で設定も可能
今回は全ての権限を与えるよう設定する。

GRANTのコマンドを使用するのだが、ググったサイトの大半のサイトに記載されてる内容ではうまくいかなかった。
おそらくMySQLのバージョンアップにともないコマンドの仕様が変更されたのではないかと考えられる。

以下のコマンドで全ての権限をuserに付与可能
database名,table名にはアクセスを許可したいものを入力する
database名,table名にはワイルドカード[*]も使用可

```
grant all privileges on [database名].[table名] to 'user'@'localhost';
grant all privileges on [database名].* to 'user'@'localhost';
```

現在はお試しで触っているので権限をALLとしているが、
権限の細かな変更に関してはまた必要になったタイミングで記事にしようかと思います。
Google系ライブラリ（TensorFlowやGoogle Cloudなど）のabseil-pyによるlogging汚染を回避する

# 概要

Pythonで `import tensorflow` すると、`logging`のロガーの出力が消える。
この問題はTensorFlow 1.14.0以降に存在するらしい。
（筆者は1.14.0で確認）

また、TensorFlowの他にも、Google Cloud Client Library (`import google.cloud`)などでも発生するらしい。

原因は、これらのライブラリが内部で利用しているabseil-pyがルートロガーのハンドラを書き換えるため。

* TensorFlowのissue: https://github.com/tensorflow/tensorflow/issues/26691
    * workaround: https://github.com/tensorflow/tensorflow/issues/26691#issuecomment-500369493
* abseil-pyのissue: https://github.com/abseil/abseil-py/issues/99
    * 類似issue: https://github.com/abseil/abseil-py/issues/102

abseil-pyはGoogle内で標準的に使われているライブラリらしく、Google系のライブラリだと内部でこれを使っているっぽい。

# 問題の再現
```python:tf_log.py
import logging

import tensorflow as tf


logger = logging.getLogger(__name__)


def main():
    logger.info('some log')


if __name__ == "__main__":
    logging.basicConfig(level=logging.INFO)

    main()
```

```shell-session
$ python tf_log.py

```

何も表示されない

# 修正
ルートロガーからabseil-pyによってセットされたハンドラを削除する。

abseil-pyはwarning以上のレベルのログをstderrに出すようにする機能も勝手にONにするらしいので、それもついでにOFFにする。

このコードは
https://github.com/tensorflow/tensorflow/issues/26691#issuecomment-500369493
より。

```python:tf_log.py
import logging

import tensorflow as tf

try:
    import absl.logging

    # https://github.com/abseil/abseil-py/issues/99
    logging.getLogger().removeHandler(absl.logging._absl_handler)
    # https://github.com/abseil/abseil-py/issues/102
    absl.logging._warn_preinit_stderr = False
except ImportError:
    pass


logger = logging.getLogger(__name__)


def main():
    logger.info('some log')


if __name__ == "__main__":
    logging.basicConfig(level=logging.INFO)

    main()
```

```shell-session
$ python tf_log.py
INFO:__main__:some log

```

ログが出るようになった
AWS Cloud9、ハマりポイントその2

以前の[AWS Cloud9、踏み台経由設定でのハマりポイント](https://qiita.com/ataru_mix/items/757dadc453a8d399b470)に続き、久しぶりにAWS Cloud9でハマったので共有しておきます。

ある日、いつものようにCloud9を使おうとすると、![FireShot Capture 315 - c9-lightsail - AWS Cloud9 - ap-southeast-1.console.aws.amazon.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224954/89351e7d-fc3f-b03b-1e74-2e55bb5559d7.png)
"Environment Error Unable to access your environment"と見慣れないエラーが出て接続できなくなりました。"authorization issues"というけどキーを変えた覚えもないし、としばし思案。
とりあえずCloud9の"Environment details"を開いて眺めると。![FireShot Capture 316 - View environment - ap-southeast-1.console.aws.amazon.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224954/1fe297fb-c251-128a-29f8-03ef50e6882e.png)
Node pathを見た瞬間に思い出しました。
昨日、nvm uninstallでnode.jsのv8,v10,v12それぞれの最新版以外をごっそりお掃除したことを。
Cloud9設定のEdit→SSH server connection→Advanced settingsで
![FireShot Capture 317 - Edit environment - ap-southeast-1.console.aws.amazon.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224954/66597ca3-0875-ea71-7209-ba4798772e9e.png)
"Node.js binary path"を現在生きているバイナリに合わせるとあっさり復旧。
これ、エラーメッセージに改善の余地ありですね。
初めて使った『さくらエディタ』を使いやすくするために行ったこと

# 1. いきさつ
普段使いのエディタは Atom だが、勤務先は Atom のインストール許可が下りていないので、代わりに（許可されている）さくらエディタを初めて触った。
時間が無かったので、さくらエディタの設定を疎かにコーディングしたら、（当たり前だけど）単純ミスが多くて作業時間が長引いたため、ちゃんとエディタの設定することにした。

# 2. 使用エディタ
さくらエディタ V2(Unicode版)
https://sakura-editor.github.io/download.html

# 3. 設定後のエディタ画面
C/C++エディタ時に以下のような画面にする。
![サクラエディタ完成例1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211753/7f380d77-ff4c-b04d-de8f-cfc4da91524d.png)

設定したいポイントは、以下の通り。

 - 1つのウィンドウ内に複数タブを表示する
 - 分割ウィンドウでスクロールを同期しない
 - ドラッグ & ドロップ編集しない（意図しない編集を避ける）
 - TABキーを押すと半角4文字分空白を挿入する
 - 空白行は行頭で改行する
 - 行末の空白は自動削除する
 - 行番号を表示する
 - カーソルを十字線表示にする（インテンド確認しやすくする）
 - 文字色を変える（画面上のコードを読みやすくする）
 - 入力補助設定（リストから候補を選べる）

# 4. 設定画面の開き方
## 4.1. [共通設定(C)]
メニューバーの[設定(O)]→[共通設定(C)]をクリックするか、[CTRL]+[6]キーを押して開く。
## 4.2. [タイプ別設定一覧(L)]→[C/C++]の設定
メニューバーの[設定(O)]→[タイプ別設定一覧(L)]をクリックするか、[CTRL]+[4]キーを押して開く。リストの[C/C++]を選択して[設定変更(S)]ボタンを押す。

#5. 設定
## 5.1. 1つのウィンドウ内に複数タブを表示する
[共通設定(C)]→[タブバー]タブの設定画面を開く。[タブバーを表示する(D)]項目と[動作モード]項目にチェックを入れる。
![共通タブ_タブバー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211753/1a1d20e6-552a-9f91-42a0-000aaa1a2b13.png)
## 5.2. 分割ウィンドウでスクロールを同期しない
[共通設定(C)]→[ウィンドウ]タブの設定画面を開く。[分割ウィンドウ]項目のチェックを外す。
![共通タブ_ウィンドウ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211753/200ed8b3-4a31-982e-7f99-8b7665459a58.png)
## 5.3. ドラッグ & ドロップ編集しない
[共通設定(C)]→[編集]タブの設定画面を開く。[ドラック & ドロップ]項目のチェックを外す。
後は好みで、[コピー]項目→[コピーしたら選択解除(R)]にチェックを入れる。[上書きモードは上書きしない(N)]チェックを入れる（使用感を確認して変更する）。
![共通タブ_編集.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211753/c5ec72ac-f503-e0d1-0efd-1a9cbd9daa93.png)
## 5.4. TABキーを押すと半角4文字分空白を挿入する
[C/C++]設定→[スクリーン]タブ設定画面を開く。[TAB幅(T)]の数値が4を確認した後、[SPACEの挿入]にチェックを入れる。
![タイプ別設定_C言語_スクリーン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211753/fd5f2a87-8126-177b-3af1-2e1c0e23fed2.png)
## 5.5. 空白行は行頭で改行する。行末の空白は自動削除する
5.4.と同じ画面で、[自動インテンド(U)]と[改行時に末尾の空白を削除(E)]にチェックを入れる。
## 5.6. カーソルを十字線表示にする
[C/C++]設定→[カラー]タブ設定画面を開く。[カーソル位置縦線]を選択して、[色分け/表示(D)]項目にチェックを入れる。
この段階で行番号も表示する。行番号を表示するために、[行番号]を選択して、[色分け/表示(D)]項目にチェックを入れる。
![タイプ別設定_C言語_行番号.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211753/d8a7fc16-cf10-1fee-4ab2-83b02537db60.png)
## 5.7. 文字色を変える
### 5.7.1. 文字色の統一
初期設定では色の指定が多いと判断したので、文字色を統一する。5.6. 同じ[カラー]タブ設定画面で[テキスト]を選択して、[文字色統一]ボタンを押す。統一したい項目のリストが表示されたら、[全チェック]ボタンを押して、[OK]ボタンを押す。同様に[背景職統一]も行う。
### 5.7.2. 文字色を変える
[強調キーワード1]を選択して、青色にする。[太字]にチェックを入れる。
[半角数値]、[シングルコーテーション]、[タブルコーテーション]を選択して、それぞれ赤色にする。。
[コメント]を選択して、緑色にする。
その他、[選択範囲]、[対括弧の協調表示]、[EOF]、[正規表現キーワード]など、自分が色とコード上で表示しているものが覚えやすくなるように変更する。
## 5.8. 入力補助設定
[C/C++]設定→[支援]タブ設定画面を開く。[入力補完機能]項目で[単語ファイル]のパスを求められるので、予め作成したテキストファイル(.txt)を登録する。
登録すれば、[CTRL]+[スペース]キーを押せば、下図のような候補を出せる。
![入力補完.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211753/d8d280fe-f05a-90e2-47cc-f2e47db4bc41.png)
## 5.9.その他 
[全般]タブの設定（設定後、使用感の確認が必要）
[カーソル]項目をチェックする。
タスクトレイに置く必要はないと思うので、[タスクトレイ]項目のチェックを外す。
![共通タブ_全般.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211753/73059b4c-724d-577c-5530-b2325439c5e3.png)

2019/7/14 編集済み
ユーザと紐付けしたモデルから投稿を保存するのに躓いたので。備忘録として

#はじめに
Qiita初投稿の初心者です。
間違いやもっとこうした方がいいなどツッコミ等お気軽に入れて頂ければと思います。
※冷やかしっぽいの普通に傷つくのでご勘弁下さい。

#開発環境
・Ruby 2.5.5
・Rails 5.2.3
・エディタ VSCode

#前提
・deviseを使ってUserモデルを作成ユーザ登録、ログイン機能実装済みです。
・UserProfileモデルを作ってUserモデルと1:1で紐付けを行っています。
（登録したユーザのプロフィール情報を保存します。）
・更にPostモデルを作って1:nでUserProfileモデルと紐付けを行っています。
(登録したユーザの投稿を保存します。)

※モデル設計が正しいかどうかは初心者なのでご了承下さい。

```Ruby:user.rb
class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
  devise  :database_authenticatable, :registerable,
          :recoverable, :rememberable, :validatable

  # user_profleモデルと1:1の紐付け
  has_one :user_profile, dependent: :destroy
end
```
※UserProfileモデルとPostモデル共にバリデーションなどは実装してません。

```Ruby:user_profile.rb
class UserProfile < ApplicationRecord
    # userモデルと1:1の紐付け
    belongs_to :user
    # postモデルと1:nの紐付け
    has_many :posts, dependent: :destroy
end
```
```Ruby:Post.rb
class Post < ApplicationRecord
    # user_profileと1:nの紐付け
    belongs_to :user_profile
end

```

#今回の本題
・PostControllerのcreateアクションで保存しようとすると。

```Ruby:posts_controller.rb
  def create
    @post = Post.new(post_params)
    if @post.save!
      redirect_to user_profiles_path
    else
      redirect_to new_post_path
    end
  end
```
この様に保存しようとすると保存できませんでした。

```
ActiveRecord::RecordInvalid (バリデーションに失敗しました: User profileを入力してください):
  
app/controllers/posts_controller.rb:20:in `create'
```
因みにsave!の『！』はちゃんと何かあった際にスルーせず例外を発生させてくれます。
詳しくは他の方のブログ等にお任せします。

・エラーを見るとPostモデルと紐付けているUserProfileがない。と言われました。


#解決

・Userモデルに紐ついているUserProfileモデルを呼び
それを@post.user_profileに代入する事でPostモデルに入っているuser_profile_idに値が入りちゃんと保存されました。

```Ruby:posts_controller.rb
  def create
    @post = Post.new(post_params)
    @post.user_profile = current_user.user_profile
    logger.debug(@post.inspect)
    if @post.save
      redirect_to user_profiles_path
    else
      redirect_to new_post_path
    end
  end
```

(logger.debug(調べたい変数.inspect)とするとログで変数に何が入っているか確認できます。)

・UserProfileControllerも同様でした。

```Ruby:user_profiles_controller
  def create
    @user_profile = UserProfile.new(user_profile_params)
    @user_profile.user = current_user
    if @user_profile.save!
      redirect_to user_profiles_path
    else
      redirect_to new_user_profile_path
    end
  end
```

#以上です。
・初投稿で慣れてないので変な感じになっていたら言ってください。
・初心者が書いているコードなので参考になるかはわかりませんが誰かの参考になれたら幸せです。
PHPのini_setについて

PHPの設定をいじることができる。
php.iniほど多くのオプションを指定することは出来ない。

よく使いそうなエラー出力を中心にメモ。

##display_errors
1(true)又は0(false)で、PHPエラーの画面表示・非表示を設定できる。

```PHP:PHP
ini_set("display_errors", 1);
//エラーを画面に表示する
```

##error_reporting
出力するエラーのレベルを設定する。
[定義済み定数]
(https://www.php.net/manual/ja/errorfunc.constants.php)

```PHP:PHP
ini_set("error_reporting",E_ALL);
//すべてのエラーを表示する
```

##log_errors
"on"又は"off"で、エラーログを保存するかどうかを決める。
基本的には、保存先を指定するerror_logプロパティと併用する。

```PHP:PHP
ini_set("log_errors","on");
//エラーを保存する。
ini_set("error_log","/log/error.log");
//エラーを/log/error.logに保存する。
```

##error_log
エラーログの保存先を指定する。
上記のlog_errorsと併用する

```PHP:PHP
ini_set("log_errors","on");
//エラーを保存する。
ini_set("error_log","/log/error.log");
//エラーを/log/error.logに保存する。
```

##date.timezone
タイムゾーンを設定する。

```PHP:PHP
ini_set("date.timezone", "Asia/Tokyo");
//タイムゾーンを東京にセット。
```

[参考記事]
(https://www.deep-blog.jp/engineer/archives/13312)
シェルスクリプトで、ログファイルを別階層へ同期し、一般ユーザでも参照可能にする

ログを一般ユーザでも参照可能にするために、直近2ヶ月分のファイルを別階層へ同期するシェルスクリプトを作成しました。
2ヶ月分のファイルを同期し、同期先に3ヶ月分のファイルが作成されたら、最古ファイルを削除します。


まず、同期先と同期元のパスのみを記載したファイルを作成します。

```log_path.txt

#記載方法：[同期元] [同期先]
#同期元と同期先の間はスペースを空けて記載して下さい。
/var/log/cron /home/common/log/cron
/var/log/maillog /home/common/log/cron
.
.
.

```


上記のファイル内のパスを読み込む形でシェルスクリプトを作成します。

```log.sh

#!/bin/bash

#同期元・同期先のパスを記載したファイルを読み込む
file='/home/common/log/log_path.txt'

#同期元パスを抽出
rsync_from=(`awk '!/^#/{print $1}' "${file}"`)

#同期先パスを抽出
rsync_to=(`awk '!/^#/{print $2}' "${file}"`)

#現在の年月を取得
y_m=`date '+%Y%m01'`

#ループで回す
for((i=0;i<${#rsync_from[@]};i++))
    do
        #1ヶ月前のログファイルが存在すれば、
        if test -e ${rsync_from[i]}-${y_m}; then

            #1ヶ月前のログファイルを同期する
　　　　　　　rsync -acv --numeric-ids ${rsync_from[i]}-${y_m} ${rsync_to}-${y_m}

            #作成した同期ファイルに一般ユーザの読み込み権限を付与する
　　　　　　　chmod 744 ${rsync_to[i]}-${y_m}
        fi

        #最新のログファイルを同期する
        rsync -acv -numeric-ids ${rsync_from[i]} ${rsync_to[i]}

        #作成した最新の同期ファイルに一般ユーザの読み込み権限を付与する
        chmod 744 ${rsync_to[i]}-{y_m}

        #同期先ファイルが３件あれば、最古ファイルを削除するため、ファイルの古い順に並べ、ファイル数を取得
        file_count=`ls -1 ${rsync_to[i]}* | wc -l`

        if test $file_count=3; then
            most_old_file=`ls -ltr ${rsync_to[i]}* | head -1 | awk '{print $9}'
            rm $most_old_file
        fi
done
```

###使用したコマンドの説明

- awk
同期元・同期先のパスを記載したファイルからパスを切り取るのに使用しています。
<a href="https://www.atmarkit.co.jp/ait/articles/1706/02/news017.html">【 awk 】コマンド（基本編）――テキストの加工とパターン処理を行う</a>

- rsync
ファイルを同期するのに使用しています。
cpコマンドよりHDDにかかる負荷が少なく済みます。
<a href="https://www.atmarkit.co.jp/ait/articles/1702/02/news031.html">【 rsync 】コマンド（その1）――ファイルやディレクトリを同期する</a>

- chmod
作成した同期先ファイルのパーミッションを変更するのに使用しています。
<a href="https://www.atmarkit.co.jp/ait/articles/1605/23/news020.html">【 chmod 】コマンド――ファイル／ディレクトリのパーミッション（許可属性）を変更する</a>

- lsコマンドのオプション
 - `-l` パーミッションや作成日時など詳細情報を表示する
 - `-t` 更新時間順に並べる
 - `-r` 逆順で表示する


###シェルスクリプトの説明
- `#!bin/bash`
 - シバンといい、bashスクリプトを指定しています。<br>
   この指定により、シェルスクリプトを実行する際に、使用しているシェルがzshなどのbash以外のシェルでも、bashスクリプトを直接実行できます。

- `${#rsync_from[@]}`
 - 配列の要素数を表しています。<br>
   配列：`${配列名[インデックス]}`<br>
   配列の要素数：`${#配列名[@]}`
　 
- `test -e`
  ファイルが存在するか確認しています。<br>
<a href="https://www.atmarkit.co.jp/ait/articles/1807/05/news041.html">【 test 】コマンド（基礎編）――ファイルの有無などを判定する</a>


##途中で困ったこと
 クーロンで実行しようとすると、削除に失敗してしまいました。
 その原因は、ここでした！↓

```
most_old_file=`ls -ltr ${rsync_to[i]}* | head -1 | awk '{print $9}' 
```

最古ファイルを取得するために、lsコマンドで詳細表示して、逆順にした先頭行の1行を取得してから、ファイル名を切り取っているのですが、ファイル名を切り取る箇所で失敗していました。

lsコマンドは、クーロン上とコマンドラインとでは表示が異なり、クーロン上では「年」が表示されません。
そのため、最初はawkコマンドで10番目のフィールドを指定していたのですが、年が表示されないため、
フィールドが1つ減るので、9番目のフィールドを指定しなければならなかったのでした。

##クーロン実行時に注意すること
シェルスクリプトをクーロンで実行する際には、

- コマンドの出力の違い
- パスは絶対パスで指定すること
- 環境変数
- シェルスクリプト自体に実行権限を付与すること

に注意する必要があります。
Alexa-Hosted スキルで S3 にアップロードした音楽を再生する

Amazon 開発者アカウントさえあればスキル開発ができる Alexa-hosted スキル。
AWS アカウントも不要でとても便利なのですが、S3 に置いた音楽を SSML を使って再生するときにハマってしまったので、回避策を書いておきます。

ちなみに、公式ドキュメントには、画像を扱う場合のことしか書いてありません（2019/07/13現在）。ハッカソンの時に、せっかく作った音楽を再生できない！ってすごく焦ったんですよねー。

- [Alexa-hostedスキルを使用してスキルをエンドツーエンドで作成する > メディアファイル](https://developer.amazon.com/ja/docs/hosted-skills/build-a-skill-end-to-end-using-an-alexa-hosted-skill.html#media)

# ハマるポイント
- アップロードする mp3 ファイルは、事前に変換しておく必要があります。
  - https://www.jovo.tech/audio-converter を使うと、Web ブラウザーだけで変換できちゃいます。
  - 公式ドキュメントはこちらです。[音声ファイルをAlexaに適した形式に変換する](https://developer.amazon.com/ja/docs/custom-skills/speech-synthesis-markup-language-ssml-reference.html#h3_converting_mp3)

変換に失敗していると、シミュレーターのスキルI/OのJSON入力に、以下のようなエラーが表示されます。

```json
"error": {
  "type": "INVALID_RESPONSE",
  "message": "Invalid Audio Content for requestId amzn1.echo-api.request.XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX. Error: The audio is not of a supported MPEG version"
}
```

- Alexa-hosted では S3 にファイルをアップロードできますが、Public にはできません。
  - Access Denied ってなります。
  - 公式ドキュメントにある通り、署名付きURLを作成して、60秒以内にアクセスする必要があります。

- 音楽を再生するために使う SSML は XML です。XML は &（アンパサンド）をエスケープする必要があります。
  - エスケープしていないと、シミュレーターで「スキルが正しく応答できませんでした」と表示されます。

シミュレーターのスキルI/OのJSON入力には、以下のようなエラーが表示されます。

```json
"error": {
  "type": "INVALID_RESPONSE",
  "message": "Invalid SSML Output Speech for requestId amzn1.echo-api.request.XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX. Error: Fatal error occurred when processing SSML content. This usually happens when the SSML is not well formed. Error: Unexpected character '=' (code 61); expected a semi-colon after the reference for entity 'X-Amz-Credential'\n at [row,col {unknown-source}]: [1,187]"
}
```


# 回避策

mp3 は変換してからアップロードしましたよね？

[ask-adk-core](https://github.com/alexa/alexa-skills-kit-sdk-for-nodejs) を ver. 2.5.0 以上にしておけば、Alexa.escapeXmlCharacters() で SSML の XML をエスケープできるようになっています。

2019/07/13 時点では、ver 2.6.0 が最新なので、まず package.json を編集して、

```json:package.json
 "dependencies": {
    "ask-sdk-core": "^2.6.0",
```

index.js で Alexa.escapeXmlCharacters() を使います。

```javascript:index.js
const Alexa = require('ask-sdk-core');
...
handle(handlerInput){
    const soundUrl = Util.getS3PreSignedUrl("Media/sample.mp3");
    const speechText = `音声ファイルを再生します。<audio src='${Alexa.escapeXmlCharacters(soundUrl)}'/>`;
```

[Alexa Hostedスキルでmp3ファイルを再生する場合のTIPS](https://forums.developer.amazon.com/questions/207849/alexa-hosted%E3%82%B9%E3%82%AD%E3%83%AB%E3%81%A6mp3%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E5%86%8D%E7%94%9F%E3%81%99%E3%82%8B%E5%A0%B4%E5%90%88%E3%81%AEtips.html?childToView=210197#answer-210197) にもコメントとして書いておきました。
同じ文字を2回入力したときだけ「YES」、同じ文字じゃない、または3回だと「NO」

#課題内容
同じ文字を2回入力したときだけ「YES」、
同じ文字じゃない、または3回だと「NO」と
結果が出力されるプログラムを作成してください。


#ソースコード
```php
<?php
// Your code here!
//ここに評価したい文字を入力
$str = "hogehoge";
//ここに評価したい文字の頭文字を入力
$moji = mb_substr($str,0,1);
// ","（カンマ）で分割
$parts = explode($moji, $str);



unset($parts[0]);
$i = count($parts);



//区切った文字列を配列に格納
for($o=1; $o <= $i; $o++){
    $array[$o] = $moji.$parts[$o]."\n";
    //print($array[$o]);
}

//偶数か奇数か判定
if($i%2==0) {
    for($o=1; $o <= $i; $o=$o+2){
        $k = $o + 1;
        if($array[$o] !=  $array[$k]){
            echo("NO");
            exit;
        }
    //ここまで回れば偶数かつ同じ文字との比較に成功
    }
    echo("YES");
} else { 
    echo("NO");
    exit;
}

?>
```
Laravelのテストメソッド毎にconfigを設定する

テスト対象のコードの中に、configを取得して使用するコードがある場合の対応方法

## テストごとにconfigをセットできる
例えば`config/app.php` にある`name` を取得するコードがあるとする

```php
$name = config('app.name');
```

テストコードを書く際に、ここの値により処理が変わることをテストしたい場合、テスト毎にconfigを値を設定できる

```php
use Illuminate\Support\Facades\Config;

// 省略

public function test1() {
    // ここでテストコードで取得するconfigをセットする
    Config::set('app.name', 'app_name');

    $name = Config::get('app.name'); // app_nameが取得できる
    
    // 処理

    $this-assertTrue(true); // テスト
}

public function test2() {
    // configがセットされていない場合
    Config::set('app.name', '');

    $name = Config::get('app.name'); //  ""になる
}

```

### tinkerで動作を確認

```php
$ php artisan tinker
Psy Shell v0.9.6 (PHP 7.2.14 — cli) by Justin Hileman
>>> Config::get('app.name');
=> "Laravel"
>>> Config::set('app.name', 'app_name');
=> null
>>> Config::get('app.name');
=> "app_name"

// こちらでもok
>>> config('app.name');
=> "app_name"
```

## 参考
[固有のconfig値を設定する](http://recipes.laravel.jp/recipe/149)
バッチファイルを誤って起動しないようにするおまじない

本番環境でバッチファイルをついうっかりダブルクリックやEnterで誤って起動してしまい真っ青になる経験は誰しもがあるのではないでしょうか？（あるよね？）

誤って起動しても事なきを得るためのおまじない（コード）がこちらです。

```
:: コマンドライン引数に1を渡していないと終了する
if "%1" neq "1" (
	exit /b
)
```

ダブルクリックではコマンドライン引数が渡されないので、
これを処理の頭に書いておくと次処理に行かず終了してくれます。

引数と比較する値は別に1じゃなくてもなんでもよいです。

ちゃんと実行したいときはこのように引数を渡して実行します。
`>hoge.bat 1`

他のバッチファイルやプログラムから実行するのではなく、人が実行するのならchoiceコマンドを使うのもアリです。

```
choice /c YN /M "実行しますか？"
if %ERRORLEVEL% equ 1 goto exec
exit /b

:exec
～処理～
```

choiceコマンドはyかnの入力をメッセージ付きで促せるコマンドです。
yを押すとERRORLEVEL変数に1が入るので上記のような記述が可能です。

```
>choice /c YN /M "実行しますか？"
実行しますか？ [Y,N]?Y

>echo %ERRORLEVEL%
1

>choice /c YN /M "実行しますか？"
実行しますか？ [Y,N]?N

>echo %ERRORLEVEL%
2
```

ご安全に！
なぜうまくいかないの？と思ったときのチェックポイント

[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしているerika_zです。

プログラミングの学習を始めて約１ヶ月が経ちました。
Progateで基礎的なインプットをしてから、アウトプットの段階に入りました！
具体的には、HTMLとCSSで簡易的な逆求人サイトを作成しています。



#はじめに

プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください。

アウトプットを始めると、合っているはずなのに、なぜかうまくいかない時があります。
今回は、そんな時に確認する点について、ご紹介します。

#チェックポイント


###スペル
要素名や属性名の綴りが間違っている場合があります。
すごく単純なミスですが、誰にでも起こりえるミスです。
スペルが違うと正しく認識されないため、思い通りに進みません。

###全角スペース
CSSなどで空白を空ける部分があります。
その場合、半角スペースを入れなければいけません。
スペースの大きさは見た目では、わかりにくいため見つけることが困難でしょう。
日本語をに入力する設定ではスペースが全角になるので、文章を打った直後は特に注意しましょう。


###終了タブ
終了タブが抜けてしまっている場合があります。
付け忘れたり、編集している間に消してしまったりするかもしれません。
また、divが重なると、どの終了タグがどこに対応しているのか、判断しずらくなるため気を付けましょう。



#まとめ

普段は当たり前にできている部分のミスをご紹介しました。
そんな単純なミスをするはずがないだろうと、ほかの原因を探すことで結果的に無駄な時間がかかってしまうかもしれません。
パパっと確認することで、単純なミスでつまずくことを防げるでしょう。
工程別　DB設計まとめ


各工程の中でどこまでのデータベース設計を実施するべきかを明確に意識できるよう設計内容をまとめる。
#役割
DB設計はソフトウェア開発においてデータベースモデルを作成する作業である。
各工程において以下を設計する。
■要件定義：概念データモデル
■基本設計：論理データモデル
■詳細設計：詳細データモデル

#要件定義
データモデルはITの知識がないと難しいため、SEがベース案を作るべきであるが、成果物のレベル感（やり過ぎ、やらなさ過ぎ）には注意が必要である。業務フローを分析した結果抽出されたデータを漏れなく捕捉するイメージである。
####概念データモデルの作成
①概念データモデル図の作成
・静的なビジネスの全体像を把握することが目的である
・データモデルの抽出　静的な管理対象を5W1Hで抽出
　※モデル例 ・・・ 「顧客」「社員」「店舗」「注文履歴」
・データの種類、主な項目を捉える。モデルだけだとわかった気になるが、バリエーションや範囲などの議論に至らず考慮モレが発生しやすくなるため注意すること。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/461222/d7914c00-e77f-276c-1985-4effe730a6b9.png)

②データディクショナリの作成
・ER図を作成する過程で出てきた項目を名前や意味を整理する。
・ホノニム（同音異議）、シノニム（異音同義）の標準化、データの範囲を定義する。

#基本設計
DOA(Data Oriented Approach)の思想をベースに正規化技法を用いてデータモデルを整理する。
####論理データモデルを作成する
①ER図の作成
　①-1 エンティティの作成・正規化
　・要件定義で補足したデータを整理・統合し、エンティティを作成する。
　　（四角形の形　角あり→独立エンティティ　角丸→依存エンティティ）
　・抽出したエンティティを元に、属性(attribute)を決める。
　・補助ツールを使うと便利
　（私はこれを使わせてもらっています。https://a5m2.mmatsubara.com/）
　①-2 正規化
　　目的：データの重複をなくし整合性をもってデータを取り扱えるようにデータベースを設計すること
　　第一正規形：繰返しのデータ項目の組などの集合体を分離する
　　第二正規形：キーの従属関係を洗い出し、部分従属な関係を分離する
　　　　　　　　→明細テーブルに分割する場合がこのパターンがよくある
　　第三正規形：キー以外の従属関係を洗い出し、キー以外の全ての項目がキーに完全従属するように
　　　　　　　　従属関係を分離する。また複数のエンティティから類似の正規系グループが発生した
　　　　　　　　時には統合を検討する。
②最適化作業
　リレーションを意識し、エンティティを見直すことで重複するデータを排除するとともに、業務ルールやプロセスを確認する。
③一般化作業
　データベース構造をビジネス視点から見直す→ビジネス視点でのエンティティの分離
④安定性検証作業
　変化に強いデータ構造の目線で検証（ビジネスルールが変わったときに耐えられるか）

#詳細設計
論理データモデルを実際のDBMSを使用することを前提に、物理の構造とアクセス方法を決定する。
####物理データモデルを作成する
①表内と表間の定義
　①-1 カラム設計
　　名称、データ型、長さ、空白値（NULL値）の扱い、ドメイン（定義域）設計
　①-2　参照制約の定義
②セキュリティの設定
　・ビューの作成（データの安全を保護）
　・ユーザごとに利用可能な表やアクションを制限
③性能向上のための構造定義
　③-1　パフォーマンス考慮
　　・インデックス設定
　　　　カーディナリティ（カラムのデータ種類）が低い項目にインデックスを作成しても使われない可能性が高い
　　　　レコードを大量に追加、削除すると→インデックスが変わる
　　・非正規化（テーブルアクセスの観点から）
　③-2　DBアクセス設計
　　・コミットのタイミング
　　・排他制御
　　・デッドロックの回避→ロックの順番を決めておく
④データの移行設計
　レガシーシステムがある場合は検討する

#RDBMSへの実装
①データベースアクセスはライブラリなどを提供し共通化する。
CONNECT,DISCONNECT,COMMIT,ROLLBACK

②データ操作命令はSQL文を利用する
■オプティマイザの仕様
　Oracleは10g以降ルールベースはなく、コストベースオプティマイザのみサポートされる
　（データ件数、偏り、分布を加味してSQLを最適化している）

■NULLのソート順→DBMS次第 
　Oracleの場合　order by（昇順）にするとNULLは先頭　order by オプション　NULLS FIRSTで制御可能である。
Fortran で queue を作ってみた

## 動機

Fortran には色々なデータ構造が実装されていないので、今回は簡単な queue を実装してみることにしました。無限多相型 class(*) を用いて、Java の総称型のようなことができるかと試してみましたが、うまくいかなかったので今回は integer 型に対する queue で妥協しました。他の型で使いたい場合は適宜変更してください。一応 Fortran 2008 で書いてみましたが、普段は Fortran 90 までの知識しか使っていないので使いこなせていません。

## queue とは

queue はデータ構造のひとつであり、先入れ先出し (FIFO) でデータを保持します。つまり、データを取り出すときは、先に入れたデータから取り出されます。 queue にデータを入れることを enqueue 、 queue からデータを取り出すことを dequeue と言います。

## 環境

macOS Sierra (10.12.6)
GNU Fortran (GCC) 6.3.0

## プログラム

実際に実装したのが以下のものです。

```fortran:queue.f08
module mod_queue

  type t_node
    integer :: item
    type(t_node), pointer :: prev => null()
    type(t_node), pointer :: next => null()
  end type t_node

  type t_queue
    integer :: num = 0
    type(t_node), pointer :: head => null()
    type(t_node), pointer :: tail => null()
  end type t_queue

contains

  function new_node(item) result(node)
    implicit none
    integer, intent(in) :: item
    type(t_node), pointer :: node

    allocate(node)
    node%item = item
    return
  end function new_node

  subroutine enqueue(queue,item)
    implicit none
    type(t_queue), intent(inout) :: queue
    integer, intent(in) :: item
    type(t_node), pointer :: node

    node => new_node(item)
    if (associated(queue%head)) then
      node%prev => queue%tail
      queue%tail%next => node
    else
      queue%head => node
    end if
    queue%tail => node
    queue%num = queue%num+1
    return
  end subroutine enqueue

  function dequeue(queue) result(item)
    implicit none
    type(t_queue), intent(inout) :: queue
    integer :: item
    type(t_node), pointer :: node

    item = queue%head%item
    node => queue%head%next
    deallocate(queue%head)
    queue%head => node
    if (associated(node)) then
      node%prev => null()
    else
      queue%tail => null()
    end if
    queue%num = queue%num-1
    return
  end function dequeue

end module mod_queue
```

また、実装できているか確認するために以下のプログラムも書きました。

```fortran:test_queue.f08
program test_queue
  use mod_queue
  implicit none
  type(t_queue) :: queue
  integer :: i, n = 5

  do i = 1, n
    call enqueue(queue,i)
    write(*,'("enq: ",i0," size: ",i0)') i, queue%num
  end do

  do while (queue%num > 0)
    write(*,'("deq: ",i0," size: ",i0)') dequeue(queue), queue%num
  end do

  stop
end program test_queue
```

実行結果は以下のとおりです。

```
enq: 1 size: 1
enq: 2 size: 2
enq: 3 size: 3
enq: 4 size: 4
enq: 5 size: 5
deq: 1 size: 4
deq: 2 size: 3
deq: 3 size: 2
deq: 4 size: 1
deq: 5 size: 0
```

多分実装できていると思います。

## 追記

不必要な部分を削り、よりオブジェクト指向な書き方に変更しました ([ソースコード](https://github.com/ue1221/fortran-utilities/blob/master/fortran08/queue.f08)) 。
Google Apps Scriptをローカルで開発するツールclaspとTypeScriptのセットアップ手順

最近個人的にclaspを使ってGASを書くことが多いので、TypeScriptで書く際のセットアップ手順をまとめました。

## プロジェクトの作成

```shell
$ mkdir clasp-sample
$ cd clasp-sample
$ git init
$ hub create -p
$ npm init -y
$ npm i --save-dev @google/clasp @types/google-apps-script @types/node @typescript-eslint/eslint-plugin @typescript-eslint/parser eslint eslint-config-prettier eslint-plugin-prettier prettier

$ npx clasp login

Logging in globally...
🔑 Authorize clasp by visiting this url:
https://accounts.google.com/o/oauth2/v2/auth?xxxxxxxx

Authorization successful.
Default credentials saved to: ~/.clasprc.json (/Users/shike/.clasprc.json).

$ npx clasp create --title="clasp sample" --rootDir=src
Clone which script?
❯ standalone
 docs
 sheets
 slides
 forms
 webapp
 api
 
 Created new standalone script: https://script.google.com/d/xxxx/edit
 Cloned 1 file.
 └─ src/appsscript.json
```

TypeScriptで開発するからには、型定義とリントを使って安全にスムーズに開発したいので、型定義とESLint+Prettierを入れます。

## tsconfig.jsonの作成

プロジェクトルートにtsconfig.jsonを以下のように作ります。

```tsconfig.json
{
  "compilerOptions": {
    "lib": ["esnext"],
    "types": [
      "@types/node",
      "@types/google-apps-script"
    ]
  }
}
```

## appssscript.jsonの修正

次に、srcディレクトリにあるappsscript.jsonのタイムゾーンの設定を東京に変更しておきます。

```src/appsscript.json
{
  "timeZone": "Asia/Tokyo",
  "exceptionLogging": "STACKDRIVER"
}
```

## ESLint / Prettierの設定

最後にESLintとPrettierの設定をします。

プロジェクトルートに`.eslintrc.js`と`.prettierrc.js`を作成します。

```.eslintrc.js
module.exports = {
  extends: [
    'eslint:recommended',
    'plugin:prettier/recommended'
  ],
  plugins: [
    '@typescript-eslint',
    'prettier'
  ],
  parser: '@typescript-eslint/parser',
  parserOptions: {
    sourceType: 'module',
    project: './tsconfig.json'
  },
  rules: {
    'prettier/prettier': [
      'error',
    ],
  }
}
```

```.prettierrc.js
module.exports = {
  printWidth: 120,
  semi: false,
  singleQuote: true,
  trailingComma: 'es5'
}
```

あとはsrc配下に.tsファイルを作り、そこに実際のGASのコードを書いていくだけです。

## おわりに

出来上がったGASはclaspのコマンドライン`clasp push`一つでデプロイでき、同時にトランスパイルも自動でしてくれるので、煩わしいbabelやらwebpackやらの設定がいらないのは、環境構築が簡単で素早く実装に入れるので非常に良いですね。

何と言ってもTypeScriptによる型定義の恩恵がとても大きく、GASのAPIの補完がゴリゴリに効くのでとても快適に開発できます。
Fortran 90/95 のきまりごと【implicit none って何？】

# はじめに

ここでは、<font color="Red">__Fortranの初心者がつまづきそうなきまり__</font>のみをピックアップして記載しています。

「これも載せた方がいい！」や「間違ってるよ！」ということがあればコメント等で教えていただければと思います。

この記事の方針としては__「厳密なきまりを全て載せる」のではなく__、初心者が最低限知っておくべきことのみを取り上げている点をご了承いただければと思います。

こちらも参考にどうぞ！

前々回の記事：[Fortran 90/95 で "Hello, world!"][1]
[1]:https://qiita.com/TakuroKoike/items/954a49ff21479e1379fe
前回の記事：[Fortran 90/95 で コメントアウトをする & ループ処理で足し算][2]」
[2]:https://qiita.com/TakuroKoike/items/fe886c14a44d9d4c3bbe


# プログラムの構成

Fortran 90/95 におけるプログラムの構成はこんな感じです。

```fortran:
program プログラムの名称
    宣言文（変数の宣言 など）
    実行文
end program プログラムの名称
```

`program`文から始まり、`end`文で終わるプログラムを__主プログラム__と言います。
一般的なプログラムは、この主プログラムと副プログラムからなります（副プログラムについては後日）。
なお、宣言文は実行文よりも先に書かなければなりません。


# `program`文

`program`文には、プログラムの名称を記述します。
省略することもできますが、プログラムの可読性を良くするために、書いた方がbetter。


# プログラム名と変数名のきまり

名称の決め方は、以下の決まりがあります。

  - 先頭の文字は英字のみが使える
  - 2番目以降の文字には英数字と下線記号`_`が使える
  - 大文字・小文字の区別はしない

特に、3番目については、例えば変数`answer`と`Answer`と`ANSWER`は同じものとして扱うということです。
気をつけましょう。

<font color="Red">__NGな名称の例__</font>

 - `2nd_answer` ：先頭に数字があるのでNG
 - `Sum1-Sum2` ：`-`（マイナス）は使えないのでNG
 - `good.choice` ：`.`（ピリオド）は使えないのでNG
 - `こたえ` ：変数名として2バイト文字（日本語など）は使えないのでNG



# implicit none って何？

さて、一旦数学の話をしましょう。
例えば、二次方程式の解の公式を思い出すと

```math
ax^2 + bx +c =0
```

の解は

```math
x = \frac{-b \pm \sqrt{b^2-4ac}}{2a}
```

となります。
このとき、数学が得意な人は、無意識に「$a,b,c$は実数の定数、$x$は変数だな」と思います。

また、数列の和の公式

```math:
\sum_{i=1}^{n} k = \frac{1}{ \ 2 \ } \ n \ (n+1)
```

を見たときには「$i,k,n$は整数だな」と、あらかじめ指定されずとも暗黙の了解で思うわけです。

こんな風に、Fortran 90/95 （またはレガシーなFORTRAN） にも暗黙の了解があります。

それは、「暗黙の変数の型に関する規約」で

  - 変数の先頭がアルファベット順で i から n までの範囲の文字であれば__整数__
  - それ以外は__実数__

というものです。

この規約、昔は便利だったようです。
しかし、現在は思わぬエラーを防止するために、「暗黙の変数の型に関する規約」を無効にする宣言文を用いることが強く推奨されています。
それが`implicit none`です。


# おわり

お疲れ様でした。
もし良ければ他の記事も見てみてください！

前々回の記事：[Fortran 90/95 で "Hello, world!"][1]
[1]:https://qiita.com/TakuroKoike/items/954a49ff21479e1379fe
前回の記事：[Fortran 90/95 で コメントアウトをする & ループ処理で足し算][2]」
[2]:https://qiita.com/TakuroKoike/items/fe886c14a44d9d4c3bbe
フィボナッチ数列を出力するプログラミング

#課題内容
フィボナッチ数列を出力するプログラミングを作ってください。

#ソースコード
```php
<?php
// Your code here!
$a=1;
$b=0;
$c=0;

for($c=$a+$b; $c < 100;){
 echo $c=$a+$b;
  //bの値をaに代入
  $a=$b; 
  //計算結果cをbに代入
  $b=$c;
 echo ",";
}
?>
```
プログラミング初心者の備忘録ーHTML編

# はじめに
[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしているMaomao Maoです。

プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください。

今回は、HTML編での学びをまとめようと思います。

## HTMLについて
HTMLでは、テキストにタグをつけていくことになります。
タグで囲むことにより、文字が見出しやリンクと言った意味を持つことになります。

*・見出し*
見出しには、headingの__h__を使います。
数字によって文字の大きさが変わってきますので、重要性に応じて使い分けることができます。
*・段落*
段落には、paragraphの__p__を使います。
*・コメント*
テキストをプラウザに表示せずに、メモしたい時は__--__を使います。

```
見出し大
<h1>見出しテキスト</h1>
見出し小
<h2>見出しテキスト</h2>
段落
<p>基礎編ではHTMLのタグについて学びます</p>
コメント
<!--メモする内容-->
```
*・リンクを作成する*
リンクを作成するには、__a__を使います。
飛び先を指定する場合には、hrefを追加します。

```
リンク
<a>実際にプラウザに表紙されるテキスト</a>
<a href="リンクの飛び先">プラウザに表示されるテキスト</a>
```

*・画像を表示する*
画像を表示するには、imgを使います。
この時、終了タグは不要です。

```
画像
<img src="画像のURL">
```
*・リストを作成する*
リストを作成するには、__li__を使います。
__ul__で囲むと、黒い丸
__ol__で囲むと、数字になります。

```
黒い丸のリスト
<ul>
 <li>テキスト</li>
 <li>テキスト</li>
</ul>

数字のリスト
<o/>
 <li>テキスト<li>
 <li>テキスト<li>
</ol>
```
readline-syncを使ってJavaScript(Node.js)でターミナルからの入力を受け取る

###使用環境
macOS 10.14 
Node.js 8.11.1
npm 5.6.0

###npmの初期化
npm長らく使ってなくて、
package.jsonが狂ってしまっていたので
一度削除し、再度初期化しました。

```
$npm init
```
「yes？」と聞かれるまではブランクのまま実行キー押下。

###requireも狂っていたので、再インストールしました
```
$npm install require
```
##readline-syncを使って複利計算式を作ってみる
余談ですが株式投資の勉強中なので複利計算式を作りました。
多分、ググればその類のツール出てきそうですが作りました。

今回Node.jsを利用したのは、javascriptをターミナルから実行したかったからです。

>ちなみに**JSC**を使うことでもjavascriptをターミナルから実行できるみたいです。
macOSのやつですが。
JSC : https://qiita.com/wnoooo/items/ef88433e84b79e362a8d

###readline-syncのインストール

```
$npm install readline-sync
```
###readline-syncの基本的な使い方
```howto.js
//readline-syncの読み込み
var readLineSync = require("readline-sync");

//ターミナルでの入力を受け取る
var input = readLineSync.question("入力してください。");
```

今回作った複利計算のコードです。
本記事は、**readline-sync**の使い方のご紹介なので
コードに関する説明はありません。

```calc.js
var readline = require("readline-sync");

function hukuri() {
    var motode = readline.question("元手は何円ですか？数字のみ入力してください。");
    let nenri = readline.question("想定年利は何％ですか？数字のみ入力してください。");
    let unyo = readline.question("想定運用年数を数字で入力してください？");

    motode = parseFloat(motode);
    nenri = parseFloat(nenri);
    unyo = parseFloat(unyo);

    nenri = 1 + (nenri / 100);

    for(var i = 0; i < unyo; i++) {
        let nen = i + 1;
        motode = motode * nenri;
        console.log(nen + "年目:" + motode + "円");
    }

    console.log(unyo + "年で" + motode + "円になります。");
}

hukuri();

```

あ、ちなみに当たり前のことですが**Node.js**なので実行は

```
$node JSファイル名
```

です。


>参考: https://www.npmjs.com/package/readline-sync
Manjaro Linux on Hyper-V で画面解像度を変更する

## はじめに

ArchWiki で GRUB 設定のやり方は出てくるのですが、起動時に一瞬だけ指定サイズになって Greeter 画面では 1024x768 にもどってしまいます。
Manjaro ではビデオドライバの入れ替えをやらないと反映されませんでした。

## 環境

### Host

Windows 10 Pro Version 1903

### Guest

Manjaro Linux 64bit Version
Linux 4.19.56-1-MANJARO x86_64
MATE 1.22.1

## 手順

### VESA ドライバ削除

```console
sudo mhwd -r pci video-vesa
```

### ドライバインストール

```console
sudo pamac install xf86-video-fbdev
```

### grub 設定変更

#### /etc/default/grub 変更

`GRUB_CMDLINE_LINUX_DEFAULT` の行を見つけて変更します。

```config
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash video=hyperv_fb:1920x1080"
```

#### 設定反映

```console
sudo update-grub
```

ゲストマシンを再起動すると反映されました。

## 参考

* [Hyper-V - ArchWiki](https://wiki.archlinux.org/index.php/Hyper-V#Setting_Resolution)
* [A solution for setting up graphics drivers for Manjaro VM on Hyper-V - Newbie Corner - Manjaro Linux Forum](https://forum.manjaro.org/t/a-solution-for-setting-up-graphics-drivers-for-manjaro-vm-on-hyper-v/68500)
DockerとAWS CLIを利用してAWS Layerを作成する

DockerとAWS CLIを利用して任意のパッケージを含めたAWS LambdaのLayerを作成する手順のメモ。

Dockerコンテナ内でパッケージインストールからzip作成まで完結させるので、マシン環境を無闇に汚さずに済む、再現性に優れる、というメリットがある。

## 前提環境

```shell
$ bash --version
GNU bash, version 4.2.46(2)-release (x86_64-redhat-linux-gnu)
（中略）

$ docker version
Client:
 Version:           18.06.1-ce
 （中略）

$ aws --version
aws-cli/1.16.198 Python/3.6.8 Linux/4.14.123-86.109.amzn1.x86_64 botocore/1.12.188
```
 
## 手順

ここでは、Python3.7ランタイム向けのLayerを作成する手順を紹介する。
作業はすべて同一の作業パスで行う。

### Dockerfile作成

以下のファイルをファイル名`Dockerfile`で作成。
ファイル内の`[Package1] [Package2] ...`部分にはインストールしてLayerに含めたいパッケージを記載。
例えば`requests`と`lxml`の最新版を含めたい場合は`pip install -t ./python requests lxml && \`と書く。

```Dockerfile
FROM python:3.7
WORKDIR /work

CMD apt update && \
    apt install -y zip && \
    mkdir python && \
    pip install -t ./python [Package1] [Package2] ... && \
    zip -r ./zipdir/layer.zip python
```

### zipファイル作成

以下のコマンドを実行してDockerfileを利用したイメージのビルドとコンテナ実行を行い、Layerにアップロードするzipファイルを作成。

```shell
$ docker build -t aws_layer_zip .
$ docker run -v "${PWD}":/work/zipdir aws_layer_zip
```

### Layer作成

以下のコマンド実行を実行して、Layerにzipファイルをアップロード。

```shell
$ aws lambda publish-layer-version \
    --layer-name hoge-layer \
    --zip-file fileb://${PWD}/layer.zip \
    --compatible-runtimes python3.7
```

python3.7ランタイムのLambdaで利用可能なLayerが作成できた。

以上
【Kotlin】タイマーを使ってみて詰まった所【AndroidStudio】

少し詰まった所があったのでメモしときます。
・タイマー処理内でビューを更新する場合ハンドラー使わないとダメっぽい。

ビルドは通るけどすぐ落ちる
logは出せるみたいビュー更新はNG

```kotlin:MainActivity.kt
package com.example.wifiautoswitching

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.os.Handler
import android.widget.TextView
import java.util.*
import kotlin.concurrent.schedule

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        setContentView(R.layout.activity_main)
        val messageView: TextView = findViewById(R.id.textView)
        //val mHandler = Handler()
        var x = 0

        var timerCallback1: TimerTask.() -> Unit = {

            var str = Integer.toString(x)
            //mHandler.post{messageView.text = str}
            messageView.text = str
            System.out.println(str)
            x++
            //this.cancel()
        }
        Timer().schedule(0, 1000, timerCallback1)

    }
}

```

これでビュー更新ができる

```kotlin:MainActivity.kt
package com.example.wifiautoswitching

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.os.Handler
import android.widget.TextView
import java.util.*
import kotlin.concurrent.schedule

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        setContentView(R.layout.activity_main)
        val messageView: TextView = findViewById(R.id.textView)
        val mHandler = Handler()
        var x = 0

        var timerCallback1: TimerTask.() -> Unit = {

            var str = Integer.toString(x)
            mHandler.post{messageView.text = str}
            //messageView.text = str
            System.out.println(str)
            x++
            //this.cancel()
        }
        Timer().schedule(0, 1000, timerCallback1)

    }
}

```
VSCODEの拡張機能で素敵なワークスペースの色変えに出会ったので布教したい(Peacock)

先日、VSCODEを可愛く、おしゃれにする拡張機能(`Peacock`)に出会った（一目惚れ）ので、布教というなの変更方法の備忘録として投稿します🐥

#  出会い
先輩から見せてもらったTwitterの投稿で一目ぼれしました…
https://twitter.com/ayatokura/status/1177655260212387840

↓実際に私が設定した画面
<img width="1440" alt="スクリーンショット 2019-07-13 21.46.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413382/8cc1da27-40f4-904d-2891-e9588a2b96c2.png">


# 設定してみる

何はともあれ、一目惚れした`Peacock`を早く設定したいってことで設定をしてみる

1. Visual Studioコードで拡張機能のサイドバーパネルを開く
2. `Peacock`と検索する
3. `インストール`をクリック  
（この時点で気づくと思いますが、色が何種類もある…！素敵）  
<img width="1440" alt="スクリーンショット 2019-07-13 17.57.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413382/5a54c7e8-8f04-bf9e-3458-087ea12507bd.png">
4. Visual Studioコードを再読み込み  
※公式には、必要に応じてと記載があるので再起動してくださいとか出たら再起動してください
5. ワークスペースがある人は、ワークスペースを開いてください  
ワークスペース何それ？とかワークスペースないよって人は、何かファイルを開けばOKです！
6. `command` (windowsの場合は、`control`) +`Shift`+`P`もしくは、`表示>コマンドパレット`でコマンドパレットを開いてください  
<img width="234" alt="スクリーンショット 2019-07-13 21.31.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413382/de71623e-b97e-99bc-dfde-fa6cdb7d0935.png">  
7. `favo`と入力して`Peacock:Change to a Favorite Color`を選択する
<img width="599" alt="スクリーンショット 2019-07-13 21.39.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413382/0c5c73c9-0a86-f983-a7a9-a392b5cd4b16.png">

8. 色を変更する

完了〜！！！
自分の好きな色、言語もしくは実際に作業しているワークスペースの言語に合わせて色を変えるのも素敵だと思います✨
ワークスペース毎に色が変えられるようなので、この言語（ワークスペース）はこの色！って決めるのも楽しいかと思います☺️
<img width="1440" alt="スクリーンショット 2019-07-13 21.46.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413382/180a4826-985e-297a-80df-31177f2343b5.png">

### 公式サイト
公式サイトは下記になります〜！
(公式サイトって表現で合っているかは不安)

[Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=johnpapa.vscode-peacock)
[GitHub](https://github.com/johnpapa/vscode-peacock)

### 編集履歴
2019/7/16 記載漏れを追記
Leetcode #322: Coin Change

```swift
func coinChange(_ coins: [Int], _ amount: Int) -> Int {
    var dp = Array(repeating: Int.max, count: amount+1)
    dp[0] = 0
    for i in stride(from: 1, through: amount, by: 1) {
        for coin in coins {
            if i < coin || dp[i-coin] == Int.max {
                continue
            }
            dp[i] = min(dp[i], dp[i-coin]+1)
        }
    }
    return dp[amount] == Int.max ? -1 : dp[amount]
}
```
AWS 『Amazon Route 53 (Route53)』

![route53-300x150.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343290/73fb3e54-6e4b-00ea-8ed2-3f773d423f08.png)

#Route53とは？
> 可用性と拡張性に優れたクラウドのドメインネームシステム (DNS) ウェブサービスです。

参照：[Amazon Route 53](https://aws.amazon.com/jp/route53/)

#DNSとは何か？
![darknet-3588402_1920.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343290/37aeaef5-b991-73da-37d4-42f679d1438c.jpeg)

__『www.example.com』__のような人間が読みやすいドメイン名を__『192.0.2.1』__のようにコンピュータが読みやすいIPアドレスに変換するサービスのことです。

IPアドレスは各コンピューターの住所を表しています。しかし、人間からすると__『183.79.250.123』__という数字だけでは、よくわかりません。そこで__『www.yahoo.co.jp』__のようにドメイン名を設定する事で、このサイトは日本にあるyahooという会社のサイトだと理解することができます。

例）

- ブラウザくん：`www.example.com`のindex.htmlというファイルが欲しい！！
- DNSくん：`www.example.com`のIPアドレスは`192.0.2.1`だよ！
- ブラウザくん：ありがとう！`192.0.2.1`のサーバーさん、index.htmlというファイルをください！！

という感じになります。

#Route53主要機能
## ドメイン管理
使用可能なドメイン名を検索して登録したり、既存のドメイン名を移転してRoute53で管理することができます。

<img width="1017" alt="スクリーンショット 2019-07-13 20.41.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343290/5584023e-7477-11db-ceed-a69f99d73aa8.png">

例）

- ユーザーくん：新しくWebサイトを作りたいんだけど、このドメイン名`micropig.com`は使えるのかな…?
- Route53くん：そのドメイン名`micropig.com`は使えないけどこのドメイン名`americanmicropig.com`なら使えるよ！
- ユーザーくん：ありがとう！じゃあ`americanmicropig.com`を登録しといて！

##

## トラフィックルーティング
![away-1015268_1920.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343290/10441b37-7817-5471-30b9-052eb486bcdb.jpeg)

Route53には7種類のルーティングポリシーがあり要件に応じて、適切なトラフィックルーティングを指定することで、可用性や応答性の高いシステムを構築することができます。この記事ではルーティングポリシーの一部をご紹介します。

###位置情報ルーティングポリシー
ユーザーの位置情報に基づいて、トラフィックを誘導します。

例）

- ユーザーくん(日本在住)：`www.example.com`にアクセスしたい！
- Route53くん：これは日本からアクセスされたトラフィックだから日本語のコンテンツが配置された`192.0.2.4`のサーバーに誘導しよう！

###フェイルオーバールーティングポリシー
アクティブ側システムのヘルスチェックが失敗した時に、スタンバイ側のシステムへルーティングします。

例）

- ユーザーくん：`www.example.com`にアクセスしたい！
- Route53くん：いつもなら`192.0.2.1`のアクティブ側のサーバーに誘導するんだけど、このサーバーに障害が起こっているから、今回は`192.0.2.4`のスタンバイ側のサーバーに誘導しよう！

#他にもたくさんの機能があるけども・・・
簡単にまとめると
__『ドメイン名とIPアドレスの関連性を管理して、状況に応じてトラフィックを適切にルーティングしてくれるサービス』__
ということですね！

#リファレンス
- [Amazon Route 53](https://aws.amazon.com/jp/route53/)
- [AWS再入門2018 Amazon Route 53（DNS）編](https://dev.classmethod.jp/cloud/aws/2018-aws-re-entering-route53/)
- [5分でわかる　Route53](https://recipe.kc-cloud.jp/archives/7581)
- [【徹底解説】AWS Route53はAWS各種サービスに最適なDNSです！](https://style.potepan.com/articles/9942.html)
- [【AWS入門】DNSとRoute53](https://lab.sonicmoov.com/development/aws/aws-dns-route53/)
- [【AWS】Route53とは。DNSとは。【150日目】](https://www.nyamucoro.com/entry/2018/03/12/211713)
Expressをテンプレートエンジンなしで立てる

# Expressをテンプレートエンジンなしで立てる

タイトルの通りです。
Node.jsのサーバを作成する際にexpress-generatorを使うことは多いと思いますが、

```
npm i -g express-generator
```

引数に`--no-view`を追加すればpugやejsフォルダが生成されず、純粋にAPIサーバのテンプレが作れます。


```:
express test_server --no-view
```


今まで知らなかった・・・
公式に書いてあります。
https://www.npmjs.com/package/express-generator#command-line-options
Leetcode #416: Partition Equal Subset Sum

```swift
func canPartition(_ nums: [Int]) -> Bool {
    var total = 0
    for num in nums {
        total += num
    }
    if total % 2 != 0 {
        return false
    }
    var state = [String: Bool]()
    return helper(nums, 0, 0, total, &state)
}

private func helper(_ nums: [Int], _ index: Int, _ sum: Int, _ total: Int, _ state: inout [String: Bool]) -> Bool {
    let str = "\(index),\(sum)"
    if let value = state[str] {
        return value
    }
    
    if sum * 2 == total {
        return true
    }
    
    if sum * 2 > total || index >= nums.count {
        return false
    }
    
    let foundPartition = helper(nums, index+1, sum, total, &state) || helper(nums, index+1, sum+nums[index], total, &state)
    state[str] = foundPartition
    return foundPartition
}
```
PowerShellをダブルクリックやドラッグアンドドロップで実行したい。

#PowerShellを.Batのように使うメモ
PowerShellがオジちゃんたちに受け入れられない理由の一つに「ダブルクリックで実行できない」「ドラッグアンドドロップで実行できない」というのがあります。

いや、設定すればできるけどね。

ちなみにダブルクリックで実行できないのはPowerShellなんでもできるからです。
レジストリの書換からファイルのネットワーク送信まで何でもござれなので。

### 忙しい人向け
.ps1ファイルのショートカットを作成し、ショートカットのリンク先の先頭に以下を追加
``powershell -NoProfile -ExecutionPolicy RemoteSigned -File ``

## 手順
1. ps1ファイルのショートカットを作成する。
2. ショートカットのプロパティを開く
3. ps1ファイルのパスが記載されたリンク先に「コマンド」を追加する

上記の手段でバッチな操作が可能。
コマンドは必要に応じて書き換える必要があるので下で解説します。

### 追加するコマンドについて
おそらく毎回おまじないのように使うのは以下のコマンド
``powershell -NoProfile -ExecutionPolicy RemoteSigned -File
``
これをショートカットのリンク先の先頭に追加します。

ざっくり説明すると……

- ``powershell``
    - PowerShellを起動
- ``-NoProfile``
    - オプションでデフォルトのプロファイルを指定
- ``-ExecutionPolicy RemoteSigned``
    - オプションで実行ポリシーを指定
- ``-File``
    - オプションで実行する.ps1ファイルを指定


``-ExecutionPolicy RemoteSigned``に関してPowerShellのデフォルトではps1ファイルの実行が許可されていないので一時的に許可するというオプションになります。

``-File``の指定先がローカルでない場合は``-ExecutionPolicy``の設定を``Unrestricted``に変更して下さい。

### 状況に応じて追加するオプション

- ``-NoExit`` 
    - Script終了後、ウィンドウを残す。
- ``-WindowStyle Hidden`` 
    - Script実行時、ウィンドウを立ち上げない。
    - 正確には立ち上げた瞬間、隠れるというのが正しい気も・・・
- ``-NonInteractive``
    - Script実行時、ユーザーの入力を受け付けない。
- ``-NoLogo``
    - Script開始時、著作権情報を表示しない。

``-File``のあとに追加すると駄目なので注意

## パラメータの受け取り方
上記を設定することで、ダブルクリックでの実行やドラッグアンドドロップでの実行が可能になります。

ドラッグアンドドロップしたファイルはパス情報が[System.Object]の配列として＄Argsに格納されます。

以下確認用のScript

```Test1.ps1
echo "実行されました。"
$Args | foreach{
    echo $_.GetType()
    $item = Get-Item -LiteralPath $_
    echo "パラメータ：" $item.FullName
}
echo "終了しました。"
```

```実行結果
実行されました。

IsPublic IsSerial Name      BaseType
-------- -------- ----      --------
True     True     String    System.Object

パラメータ：
D:\[test] サンプル 1.txt

IsPublic IsSerial Name      BaseType
-------- -------- ----      --------
True     True     String    System.Object

パラメータ：
D:\[test] サンプル 2.txt

終了しました。
```

### 注意点
#### Argsの並び順が不定
ルールがありそう…だけど順序が重要な場合は基本的には受け取ったあとにソートが必要。
#### ファイル名にスペース
正確にはPowerShellのハマりポイントなんですけど、ファイル名に半角スペース等の文字が含まれている場合、そのままパラメータとして渡すと区切り文字として解釈されるケースがあります。
Path情報として引数に渡す際には``-LiteralPath ``オプション等を行うようにしてください。

詳しくは[公式](https://docs.microsoft.com/ja-jp/powershell/module/Microsoft.PowerShell.Core/About/about_PowerShell_exe)を見てください。
mermaid入門の入門

# mermaid

【Qiitaでも使える】テキストから図が生成できるMermaidでAWS構成図をつくる

https://qiita.com/b-mente/items/b17275090176d63d1d69


VSCodeでMermaidを扱う為の便利な拡張機能あれこれ

https://qiita.com/sato_kana/items/2a13f19017576488f017

mermaidを使ったmarkdown資料作りメモ(VS Codeの場合)

https://qiita.com/ZOOSHIMA/items/693ee8fd93146dd69b0e

markdownでシーケンス図を書こう

https://qiita.com/konitech913/items/90f91687cfe7ece50020

Markdownで書いたmermaidのflowchartをpng形式でexportする
https://qiita.com/orange5405/items/9baebdb09b40da86da65

GitHubのMarkdownファイルでMermaid記法がサポートされたので作図まとめてみました。

https://qiita.com/narita1980/items/2cc69fc1d481e4ee6b08

mermaid.jsが素晴らしいけどなかなか使ってる人見かけないので実例晒す(追記あり)
https://qiita.com/uzuki_aoba/items/a01f8b0b52ced69c8092

Gitbookインストール
https://qiita.com/tukiyo3/items/fd6b3a3c501cfd9e872f

mermaid.jsでリオレウスを倒す
https://qiita.com/suzuki_sh/items/659d12380c83108d49bb


エクセルでシーケンス図書くのやめませんか？mermaidが便利ですよ
https://qiita.com/naoki114/items/f46082e488fcb1562662#_reference-6071c106c7587b0dee6d

DDDのUMLをMermaidで書いてみる🧜‍♀️ - Mermaid入門

https://qiita.com/miyuc/items/c66e08319829aa959977

【Mermaid】ER図の作成方法

https://qiita.com/P-man_Brown/items/33834fe6dd4833dc1809

ER図を基本からまとめてみた【mermaid】

https://qiita.com/kanfutrooper/items/6ae4d2e78679b83e57ac

ER図の作図について、 Draw.io, PlantUML, Mermaid を比較してみる。（VSCode拡張機能など）

https://qiita.com/ryamate/items/3779418172c4f5a83212

マーメイド#25 結局マーメイドってどうなんですか？

https://qiita.com/hirokiwa/items/21c66407a6e7439e7141


# 文書履歴(document history)
ver. 0.01 初稿 2019020713
ver. 0.02 URL追記　20230224

### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。

####  Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
pandasの使い方

#pandasの使い方を少しずつ書いていきます。
##pandasでの保存方法と読み取り方法

(200829追記)
AI QUEST 2020に応募してみました。
前処理能力がない実力不足を感じました。
入門試験で、使った前処理も追記していきます。雑多な感じになってしまします。

```Python:Pandas
import pandas as pd

#pandasデータフレームに読み込む。注意点はエクセル2010はutf-8では、保存できなくて、shift-jisなので、encoding="SHIFT-JIS"を入れること。

df = pd.read_csv("dataset_****.csv",encoding="SHIFT-JIS")


#　dfにpandasデータフレーム名を入れる。

df.to_csv("df.csv")
```
##リストの作り方
```Python:Pandas
#モジュールのインポート
import pandas as pd

#リストを作成
x = [-6.836951,-5.927641,-5.907641,-5.476121,-4.387844]
y = [-1.826294,0.054874,0.024874,0.336462,-0.818773]

#pandasデータフレームを作る。indexは列名。columnsがカラム名。
#ここは、列名x,yのデータフレームができている。

d = pd.DataFrame(data = [x,y],index = ['X','Y'] )
print(d)

#データフレームに、.Tをつけると、転置される。
D =d.T

print(D)

```
データフレームdをプリントすると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336017/ba7a3252-c915-1b2d-7eee-e04c803a24ec.png)

データフレームDをプリントすると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336017/b51c1bf8-c56e-71d4-c4a7-7bd0b69a5912.png)



##文字列の中に含む文字を特徴量として追加する方法

この例では、amenitiesという列名の中に、いろいろな文字列が入っている中から、TVという文字列があるもののデータを選んで、新しいTVという列を作って、pandasのデータフレームに、TVという文字列がある場合は1を入れます、ない場合は0が入ります。

文字列を含む列を`pandas`のデータフレームで指示します。`df["amenities"]`
文字列を指定するメソッドは、`.str.contains`
そこで、`(文字列、`regex=True)* 1`で、最後の`*１`がなければ、`True`、`False`が入ります。最後に`*1`をつけると、1,0が入ります。機械学習やるためには、最後に`*1`を入れて、1,0のワンホットにした方が良いと思います。


```python
df["tv"] = df["amenities"].str.contains("TV", regex=True)* 1

```

##欠損値の処理方法

```python
#pandasのインポート
import pandas as pd

#pandasデータフレームに読み込む。注意点はエクセル2010はutf-8では、保存できなくて、shift-jisなので、encoding="SHIFT-JIS"を入れること。
data = pd.read_csv("dataset_****.csv",encoding="SHIFT-JIS")

#データ構造のプリント
print(data.shape)

#欠損値のある行の数をカウントする
print(data.isnull().sum())

#カウントしたデータを、リストに入れる
data_insul_sum = data.isnull().sum()

#リストをpandasデータフレームに入れる
data_missing = pd.DataFrame(data=data_insul_sum) 

#データフレームを保存する
data_missing.to_csv("missing_****.csv")



```















##Pandasでグラフを作る。

Pandasのplotの全引数を解説
https://own-search-and-study.xyz/2016/08/03/pandas%e3%81%aeplot%e3%81%ae%e5%85%a8%e5%bc%95%e6%95%b0%e3%82%92%e4%bd%bf%e3%81%84%e3%81%93%e3%81%aa%e3%81%99/
ここを見ましょう。






```
Atomのキーバインドを変更する

 # Atom でキー割り当てを変更する。

 + Atomメニューから環境設定を選択する。
 + キーバインドを選択する。
 + 変更したいキーの左側のマークをクリックしてコピーする。
 + キーマップファイルと記載されている部分をクリックして、ファイルに貼り付ける。
 + F2で行削除を行いたい場合は下記に変更する。

```
‘atom-text-editor:not([mini])’:
‘f2’: ‘editor:delete-line’
```
Macで利用するAtomが文字化けする。

 # Macで利用するAtomでファイルを開いたら文字化けする。

いつも日本語で開いているファイル（SJIS)のファイルをAtomで開いたら文字化けしてしまっている。
文字コードを自動で判定してくれるパッケージをインストールする。

 + helpからwelcome guide を開く
 + Install a package を選択する。
 + auto-encoding を検索してインストールする。
 + インストールが終わったらAtomを再起動する。
OSSを利用して s3fs みたいにマウントしたい

# Alibaba cloud で ossfs を利用してマウントする

まずはマウント後に書き込みさせるIDを調べる。

```
id apache
uid=48(apache) gid=48(apache) groups=48(apache)
```
mountポイントはわかりやすいように /mnt にフォルダを作る。
ルート権限で実行
webについては、 /var/www/html/image に画像を保存する。

```
cd /mnt
mkdir var_www_html_image
chown -R apache:root var_www_html_image
chmod 600 var_www_html_image
ln -s /mnt/var_www_html_image /var/www/html/image
```
でパーミションを設定しながらマウント実行。

```
/usr/local/bin/ossfs  jcast /mnt/var_www_html_image -ourl=http://oss-cn-beijing.aliyuncs.com -oallow_other -omp_umask=007 -ouid=48 -ogid=0 -odefault_permission=750
```

OSSインストールは下記参照
https://techblog.sbcloud.co.jp/2018/01/16/oss-as-local-filesystem/