OmniAICreator/Qiita-1.07M huggingface dataset:
Symfony4 Doctrineでconvert関数を使う

#DQLユーザー定義クラスを適当なServive内とかに作る
```
<?php
namespace App\Service\Doctrine;

use Doctrine\ORM\Query\AST\Functions\FunctionNode;
use Doctrine\ORM\Query\Lexer;
use Doctrine\ORM\Query\Parser;
use Doctrine\ORM\Query\SqlWalker;

class Convert extends FunctionNode
{
    protected $dateExpression;

    protected $fromTz;

    protected $toTz;

    /**
     * {@inheritdoc}
     */
    public function getSql(SqlWalker $sqlWalker)
    {
        return sprintf("CONVERT(%s USING %s)",
            $sqlWalker->walkArithmeticPrimary($this->field),
            //$sqlWalker->walkSimpleArithmeticExpression($this->using), // or remove USING and uncomment this
            $sqlWalker->walkSimpleArithmeticExpression($this->charset)

            );
    }

    /**
     * {@inheritdoc}
     */
    public function parse(Parser $parser)
    {
        $parser->match(Lexer::T_IDENTIFIER);
        $parser->match(Lexer::T_OPEN_PARENTHESIS);
        $this->field   = $parser->ArithmeticPrimary();
        // adopt use bypass validate variable of parse by using AliasResultVariable ...!!
        $this->using   = $parser->AliasResultVariable();
        $this->charset = $parser->AliasResultVariable();
        $parser->match(Lexer::T_CLOSE_PARENTHESIS);
    }
}

```
参考：https://github.com/beberlei/DoctrineExtensions/tree/master/src/Query/Mysql

##定義した関数を登録
```config\packages\doctrine.yaml
doctrine:
        dql:
            string_functions:
                convert: App\Service\Doctrine\Convert
```
##使用する
```
$qb->andwhere('convert(i.etcField USING utf8) like :etcField')->setParameter('etcField','%TEST%' );
```
[React] useEffectで無限ループしてしまう

useEffectを使うと無限ループしてしまったので、記事として残しておく。

#コード
以下のようなコードを使うと無限ループとなる

~~~typescript
import React, { useEffect, useState } from 'react';

export default function Study() {
  const [count, setCount] = useState(0);

  // status変更毎にcallback関数を実行
  useEffect(() => {
    setCount(count + 1);
  }, [count]);

  return <div>{count}</div>;
}
~~~

##原因
useEffectのcallback関数でStateを変更しているにもかかわらず、第二引数にStateを渡していることが原因。
流れは以下の通り。
1. Study()を呼ぶ
2. useEffect()が呼ばれる
3. setCount()でcountを増やす
4. countが変更されたのでuseEffectが呼ばれる
5. 以下3と4の繰り返し

##解決法
useEffectの第二引数を空にするとマウント・アンマウント時しか呼ばれなくなる。

~~~typescript
import React, { useEffect, useState } from 'react';

export default function Study() {
  const [count, setCount] = useState(0);

  // status変更毎にcallback関数を実行
  useEffect(() => {
    setCount(count + 1);
  }, []);

  return <div>{count}</div>;
}
~~~
GitHub Readme StatsのMost Used Languagesで特定の言語の非表示方法とハマりポイント

GitHubのプロフィールをいい感じにしてくれる[GitHub Readme Stats](https://github.com/anuraghazra/github-readme-stats)のMost Used Languagesで特定の言語を非表示にする方法で少しハマったので共有します。

![Screen Shot 2020-09-19 at 11.54.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359782/bd2bed6e-9968-7478-babf-c967d1d3dda5.png)

今回はJupyter Notebook、C#、TeX、ShaderLabを非表示にします。

# 結論

クエリに隠したい言語を追加すればOKです。

```markdown:README.md

<a href="https://github.com/anuraghazra/github-readme-stats">
    <img align="left" src="https://github-readme-stats.vercel.app/api?username=tetsuzawa&count_private=true&show_icons=true" />
</a>
<a href="https://github.com/anuraghazra/github-readme-stats">
    <img align="left" src="https://github-readme-stats.vercel.app/api/top-langs/?username=tetsuzawa&hide=jupyter%20notebook,shaderlab,tex,c%23&langs_count=9" />
</a>
```

# 説明

素の設定は以下のようになっています。

```markdown:5行目

<img align="left" src="https://github-readme-stats.vercel.app/api/top-langs/?username=tetsuzawa" />
```

![Screen Shot 2020-09-19 at 11.54.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359782/c0d419bd-45cd-714f-560e-35106632c934.png)

これに`hide=XXX,YYY`の形式で言語を追加します。

ポイントは空白は`%20`、#は`%23`のようにエスケープすることです。（大本の[Readme](https://github.com/anuraghazra/github-readme-stats)に言語指定の一覧が無く、ハマりポイントでした）

```markdown:5行目

<img align="left" src="https://github-readme-stats.vercel.app/api/top-langs/?username=tetsuzawa&hide=jupyter%20notebook,shaderlab,tex,c%23" />
```
![Screen Shot 2020-09-19 at 11.55.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359782/1bbb2118-a330-b810-ef52-4d3d919523ec.png)

非表示にしたぶん表示数が減ってしまったので`langs_count=N`のクエリで調整します。

```markdown:5行目

<img align="left" src="https://github-readme-stats.vercel.app/api/top-langs/?username=tetsuzawa&hide=jupyter%20notebook,shaderlab,tex,c%23&langs_count=9" />
```

![Screen Shot 2020-09-19 at 11.56.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359782/629ad5e1-0159-e45e-b25f-a56e4312a56e.png)

以上です。

# 参考

[GitHub Readme Stats を利用してGitHubプロフィールをカッコよくする](https://qiita.com/zizi4n5/items/f8076cb25bbf64a9bc1c)
《未経験→webエンジニア》実務5日目

昨日投稿できなかったので、今日投稿します。

## この記事の目的
自分がやったこと、知らなかったこと、やるべきことを明確にし
1日あたりの成長速度を速める。


## 【今日やったこと】
APIテスト
イシューに上がっている軽微な内容の修正

## 【知らなかったこと】
・APIのレスポンスは、コントローラーに種別で作られている
・メモ帳のデフォルト設定で””が逆さになっており、エラーが起きる
・現在いるブランチ名はVScodeの左下に表示されている！

知らなかったテストbreakman→セキュリティ系のテストを行ってくれる
今回の案件では、breakman,rspec,rubocopの3段階でテストする
expected: "期待されている文言" got: "実際の文言"

ここが違わないかをチェックする
API文言の修正だけでなく、ステータスコードもセットで直すようにする
HTTPのステータスコードhttps://qiita.com/terufumi1122/items/997e24dde87f807e3944
[laravel]Mysqlとの接続メモ

#前提条件
Mysqlはインストール済、dbをcreate済、環境はMacOS

##設定
###config/database.php
```
return [

    'default' => env('DB_CONNECTION', 'mysql'),

    'connections' => [

        'mysql' => [
            'driver' => 'mysql',
            'url' => env('DATABASE_URL'),
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', '※接続するデータベース名'),
            'username' => env('DB_USERNAME', '※ユーザ名'),
            'password' => env('DB_PASSWORD', '※パスワード'),
        ],
]
```
###.env
```
DB_USERNAME=※ユーザ名
DB_PASSWORD=※パスワード
```
##接続確認
```
$ php artisan serve
```
正しく接続してなければエラーが返ってくる。
##所感
.envはdatabase.phpを上書きするようだ。本番環境に置く時に.envでパラメータ上書きして使うのかな？
env コマンドの出力結果をソートして環境変数を確認する（環境変数のソート済み出力）

> Linux/macOS で定義済みの環境変数を確認しようと `env` コマンドを実行したら順番がバラバラなのでソートしたい。

[「env ソート」でググって](https://www.google.com/search?q=env+%E3%82%BD%E3%83%BC%E3%83%88)も、ピンポイントの記事がなかったので、自分のググラビリティ（備忘録）として。

## TL; DR <sub><sup>（今北産業）</sup></sub>

> `env` コマンドにはソート・オプションはありません。
> パイプ渡しして、`sort` コマンドでソートする必要があります。

  ```bash:env をソートする例
  env | sort
  ```

- [オンラインで動作を見る](https://paiza.io/projects/qemuZl_plkJ6O1A6_7LpFA) | Ubuntu @ Paiza.IO

## TS; DR

ソート・オプションがありそうでなかった。

```shell-session:Debian
$ # バージョン
$ env --version | head -n1
env (GNU coreutils) 8.30

$ # ヘルプを確認 → 項目がない
$ echo "$(env --help)" | grep sort
```

```shell-session:macOS
$ # バージョン
$ echo "$(man env)" | tail -n1
BSD                             April 17, 2008                             BSD

$ # マニュアル（man env）から確認 → 項目がない
$ echo "$(man env)" | grep sort

```
bashでファイル名の探索とその備忘録

# 概要

Bashで現在のディレクトリから上の階層へ向かってファイル名での探索を行いたい。
今回は、とある目的からpackage.jsonを探索することにしています。
普段bashで開発することが少ないため、補足にbashではまったことをメモしています。

# 環境
- bash

# 探索方法

探索のイメージは、こんな感じで上位の階層に向かって、ファイルが見つかるまで`ls`を繰り返して探索します。

```bash
$ ls ./package.json
$ ls ./../package.json
$ ls ./../../package.json
$ ls ./../../../package.json
```

# 完成したもの

```bash
#!/bin/bash

# カレントディレクトリから上の階層へ向かってファイルの探索を行う
# 現在居るディレクトリからのファイルのPathを${findFile}にセットする
#
# Examples:
#   fileSerachClimb 'package.json'
#   echo ${findFile}
#   unset findFile
# Args:
#   $1 - 検索するファイル名
# Return:
#   0 - Error 
function fileSerachClimb(){
    # 探索するファイル名
    local fileName=$1
    # 現在のPathを保存
    local cd=`pwd`
    # 上の階層への探索の上限を取得
    local repeatCount=$((`echo -n ${cd} | sed -e 's@[^/]@@g' | wc -c`-1))

    # ループの回数
    local count=0
    # ループした回数分`../`を結合
    local climbStr=''

    while [[ ${repeatCount} -ge ${count} ]]; do
        # lsで対象のファイルが存在するかチェック
        if [[ ${count} -eq 0 ]]; then
            ls ./${fileName} >& /dev/null
        else
            climbStr="../"${climbStr}
            ls ${climbStr}${fileName} >& /dev/null
        fi

        # lsが成功したらfindFileにPathを格納する
        if [ $? = 0 ]; then
            findFile="${climbStr}${fileName}"
            break
        fi
        count=$((${count}+1))
    done
    return 0
}
```

# 補足

- bashの関数は`return`で文字列を返せない
  - globalな変数(`fildFile`)にセットすることで関数の外側でも参照できる
  - 探索失敗したときは、0を返すようにする
- 関数内の`local`は、関数内のみで使える
  - localで定義しないとglobal変数にセットされてしまうので注意
  - global変数に定義して使い終わったものは、globalを汚染しない様に`unset`してしまうのがオススメ
- 基本的に`ls`はエラーになるので、`>& /dev/null`はエラー内容を出力しないようにしている

# おわり

以上です。もっといい方法があれば教えていただければ嬉しいです。
[React] useEffectの使い方

React HooksのuseEffectを使うことになったので、記事にしてみた。

# 使い方
###第二引数に値を渡す

~~~typescript
import React, { useEffect, useState } from 'react';

export default function Study() {
  // テスト用に適当に作ったStateをセット
  const [status, setStatus] = useState('クリック前');

  /*
   * 第一引数にcallback関数を入れる
   * 第二引数に指定した値が変更されるたびにcallback関数が呼ばれる
   * ↓の場合は、テスト用Stateの値が変更されるとconsoleにstatusの値が出る
   */
  useEffect(() => {
    console.log('statusの値が' + status + 'に変更されました');
  }, [status]);

  // クリックするとstatusが変更されるボタンを返す
  return (
    <div>
      <button onClick={() => setStatus('クリック後')}>status変更ボタン</button>
    </div>
  );
}
~~~

今回、useStateは一度しか呼ばれないと思う。（statusが一度しか変更されないため）
何度も呼び出せるか確認したい場合は以下のサイトで一番上の例が参考になる
https://qiita.com/keiya01/items/fc5c725fed1ec53c24c5

### 第二引数を空にする
マウント・アンマウント時のみ、callback関数を実行することができる。

~~~typescript
import React, { useEffect, useState } from 'react';

export default function Study() {
  /*
   * 第一引数にcallback関数を入れる
   * 第二引数に指定した値が変更されるたびにcallback関数が呼ばれる
   */
  useEffect(() => {
    console.log('マウント・アンマウント時だけ実行');
  }, []);

  return <div>テスト</div>;
}
~~~
GNU GPL(GNU General Public License)

応用情報技術者平成29年春期 午前19


オープンソースライセンスのGNU GPL(GNU General Public License)の説明のうち，適切なものはどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/33c425fb-7825-e1e8-f8c3-5accf41e5886.png)

１、GNU GPLは、
フリーウェア運動を具現化するために考案されたオープンソースライセンスです。GPLのもとで配付されたソフトウェアが何者かに独占されることを排除し、ソフトウェアが全ての利用者にとって自由であり続けられるようにすることを目的としています。

※GPLであるソースコードの派生物：
　GPLでは、派生物のライセンスもGPLにしなければならないとされている。これはライセンスの伝搬性と呼ばれている。
　派生物とは、ソースコードそのものの改変物だけでなく、ソフトウェアをリンクしたものや、ソフトウェアの依存性を持つ成果物のことをいう。

　GPLの派生物がGPLでならなければならない理由は、GPLはコピーレフトの考え方を具現化したものだからである。GPLによりソフトウェアの自由が保障される。

　※コピーレフト(Copyleft)とは、プログラム(もしくはその他の著作物)を自由(自由の意味において。「無償」ではなく)とし、加えてそのプログラムの改変ないし拡張されたバージョンもすべて自由であることを要求するための、一般的な手法の一つです。


２、二次著作物
GPLライセンスされた著作物を使用または変更・改変して作成した著作物を配布した場合、有償・無償に関わらず、その二次著作物には無条件にGPLライセンスが適用されることになります。すなわち、その二次著作物が自由に使用されることを、下流の受領者に対して認めなければなりません。

３、別のプログラムのソースコード
GPLであるソースコードの実現する機能を利用する，別のプログラムのソースコードを作成すると，GPLが適用されるるか？
⇒「別のプログラムのソースコード」がGPLライセンスでなければ、それが組み込まれたプログラムにはGPLが適用されません。

ここはGPLで実現した機能を利用して、別の物を作成すると、派生物ではないですので、別の物がGPLかどうかがその物により決めますね。


参照：

https://www.ap-siken.com/kakomon/29_haru/q19.html

ライセンスの伝搬性
http://ossforum.jp/node/798

コピーレフトって何
https://www.gnu.org/licenses/copyleft.ja.html
AWS CLIを使ってECRに自前Dockerイメージを登録する

##やりたいこと
ローカルで作成したDockerイメージをAWS CLIを使ってECRにプッシュする

##前提
・AWS CLI バージョン2
・Dockerイメージ作成済

##登録手順
ここに記載したのは下記公式サイトを自分なりにまとめたものです。

https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/docker-basics.html#use-ecr

###前準備
- aws configure
aws cliを利用するときに`aws configure`を実施して、認証情報を設定しておく必要があります。
これはAWS CLIをセットアップする方法で、下記４つの情報の入力を求められます。

    - アクセスキーID
    - シークレットアクセスキー
    - AWSリージョン
    - 出力形式

configureするとき、下記のように`--profile`を指定しておくことで設定情報を再利用できます。
ここでは、`prf-name`という名前にしました。

```
aws configure --profile prf-name
```
これを設定しておくとawsコマンドを使用するときに下記のような感じで`--profile`で作成した設定情報を指定してやれば、自分がどこにアクセスしたいのか簡単にコマンドに教えることができるわけです。

```
aws s3 ls --profile prf-name
```
`--profile`の指定がないと下記のように認証情報を特定することができないのでまずは`aws configure`してね、と注意されます

```
Unable to locate credentials. You can configure credentials by running "aws configure"
```

作成したprofileのリストを確認したい場合は下記を実行します。設定した名前を忘れてしまったときに便利です。

```
aws configure list-profiles
```



###Amazon ECRリポジトリを作成する

```
aws ecr create-repository --repository-name [your-repository-name] --region [region] --profile [prf-name]
```
`your-repository-name`: 好きなリポジトリ名
`region`: リージョン名（例：ap-northeast-1）
`prf-name`:profile名

公式サイトには記載がないですが、`--profile`を記載していないと、さきほどの認証エラーメッセージが表示されてしまいます。


###イメージにタグをつけ、Amazon ECRにプッシュする

１． Amazon ECRリポジトリを作成する
ここでは"hello-repository"を作成します。

```
aws ecr create-repository --repository-name hello-repository --region [region]
```
`region`: リージョン名（例：ap-northeast-1）
出力：

```
{
    "repository": {
        "registryId": "aws_account_id",
        "repositoryName": "hello-repository",
        "repositoryArn": "arn:aws:ecr:region:aws_account_id:repository/hello-repository",
        "createdAt": 1505337806.0,
        "repositoryUri": "aws_account_id.dkr.ecr.region.amazonaws.com/hello-repository"
    }
}
```

２．前のステップの repositoryUri の値で hello-world イメージにタグを付けます。

```
docker tag hello-world aws_account_id.dkr.ecr.region.amazonaws.com/hello-repository
```

３．aws ecr get-login-password コマンドを実行します

```
aws ecr get-login-password --profile [prf-name] | docker login --username AWS --password-stdin [aws_account_id].dkr.ecr.[region].amazonaws.com
```
`prf-name`:profile名
`aws_account_id`：AWS アカウントを一意に識別する 12 桁の数値
`region`: リージョン名（例：ap-northeast-1）

出力：

```
Login Succeeded
```

４．前のステップの値 repositoryUri を使用して、Amazon ECR にイメージをプッシュします。

```
docker push aws_account_id.dkr.ecr.region.amazonaws.com/hello-repository
```

イメージタグをつけたい場合は下記のように指定します。

```
docker push aws_account_id.dkr.ecr.region.amazonaws.com/hello-repository:v1.0.0
```

５．プッシュしたイメージの確認
`list-images`を使って、プッシュしたイメージを確認

```
aws ecr list-images --repository-name hello-repository --region [region] --profile [prf-name]
```
`prf-name`:profile名
`region`: リージョン名（例：ap-northeast-1）
MVCモデルを理解する

**ユーザーインタフェースをもつアプリケーションソフトウェアを実装するためのデザインパターンです。**
**「Model」「View」「Controller」の3つの役割から構成されています。**

##処理の流れのイメージ
**「View」 ⇄ 「Controller」 ⇄ 「Model」**

##Model(モデル)
ビジネスロジック部分です。
Controllerから呼び出され、DBへのアクセスを行います。
データの登録・更新やデータの検索を行い、データを加工し、
Controllerlにデータを渡します。

##View(ビュー)
Modelで処理したデータをControllerを通じて受け取り、
ユーザーへ表示する画面を作成し出力します。

##Controller(コントローラー)
Viewからのリクエストに応じてModelを呼び出します。
Viewから取得したデータをModelに渡したり、
Modelから取得したデータをViewに渡す橋渡し的な役割を担います。

##MVCモデルのメリット
・3つの役割に分割することで、どのような処理をどの部分に書けば良いかわかりやすいです。
・ソースに修正が入る際に、影響範囲を狭く抑えることができます。
・画面部分の実装が得意な開発者とビジネスロジック部分の実装が得意な開発者で
 作業分担が可能になり、開発効率が上がります。

##よくある残念な状態
・Controllerから1つのモデル(ビジネスロジック)を呼び出し、
 その中で色々な処理をやり過ぎた結果、1つの巨大なメソッドが出来上がる。
Windows Terminal 上でwebpack-dev-serverとdocker-composeを同時に起動し別のペインに表示


# 仕様

- WindowsTerminalの別々のペインに、フロントのwebpack-dev-serverとバックのdocker-composeを起動する。
- 下の画像のような感じ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15972/07a025eb-f656-10fe-e7f2-f1f3bd0f6c8a.png)


# コード

## 1.npm-scriptにwebpack-dev-serverを起動するコマンドを設定

- srv:w というコマンド名を定義。

```json:package.json
  "scripts": {
    "srv:w": "webpack-dev-server & webpack"
  },
```

## 2.Windows Terminal実行バッチ

- パスは可読性の為、変数に設定。
- 「C:\Develop\Project1\」をプロジェクトルートとする。
- プロジェクトルート配下に、「front」、「back」のディレクトリを配置。
- 「front」にフロントのリソース（webpack含む）を配置。
- 「back」にバックのリソース（docker-composeを含む）を配置。

```bat:run_all.bat

@echo off
::=================
:: パスの定義
::=================
set PROJECT_DIR=C:\Develop\Project1\
set FRONT_DIR=%PROJECT_DIR%front\
set BACK_DIR=%PROJECT_DIR%back\

::===================================================================
:: WindowTerminalでwebpack-dev-serverとdocker-comoseを別々タブで実行
::====================================================================
wt -d %FRONT_DIR% cmd /k npm run srv:w ; split-pane -V -d %BACK_DIR% cmd /k docker-compose up 

```

- 上記のバッチを起動すると、WindowsTerminalが立ち上がり、別々のペインでサーバとコンテナが起動する。

## 備考

- WindowsTerminalをコマンドラインから実行する記事は、以下。

-[▶ 参考：Windows Terminalをコマンドで実行し、更に、その中でコマンド実行。](https://qiita.com/SFITB/items/3044145e62457e896983)
【jQuery】少しでも高速にするための、DOMの変数化

#初めのコード
```sample.html
<div class="btn" id="question">問題</div>
```

```sample.js
$('#question').on('click',function() {
  $('#q4').click(function(){
    $(this).before('<p>前のテキスト</p>');
    $(this).prepend('<p>要素内の前のテキスト</p>');
    $(this).append('<p>要素内の後のテキスト</p>');
    $(this).after('<p>後のテキスト</p>');
  });
});
```

#修正後のコード

```sample.html
<div class="btn" id="question">問題</div>
```

```sample.js
  $('#question').on('click',function() {
    const places = ['前', '要素内の前', '要素内の後', '後'];
    const html = [];

    for(var i=0; i < places.length; i++) {
      html.push(`<p>${places[i]}のテキスト</p>`);
    }

    $(this).before(html[0])
           .prepend(html[1])
           .append(html[2])
           .after(html[3]);
  });
```

毎回、DOMにアクセスするのではなくて変数化しました。
アサーションチェッカ、シミュレータ、静的コード解析ツール、テストカバレージ分析ツール

応用情報技術者平成29年春期 午前18 

ホワイトボックステストにおいて，プログラムの実行された部分の割合を測定するのに使うものはどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/208d718d-4130-7dc0-3711-0fabe0e6b210.png)

１、アサーションチェッカ
アサーションチェッカは、
　・プログラムの正当性を検査するために、
　・変数間で論理的に成立する条件が満たされているか
をチェックするツールです。

２、シミュレータ
シミュレータは、
　・プログラムを現実に実行するのではなく、
　・コンピュータプログラム上で模擬実行をするため
のツールです。

３、静的コード解析ツール
静的コード解析ツールは、
　・構文チェッカ，
　・コードオーディタ(auditor 監査)，
　・モジュールインタフェイスチェックツールなど
のプログラムを実行しない状態でプログラムの検証を行うツールです。

４、テストカバレージ分析ツール
テストカバレージ分析は、
　・テストの網羅率(カバレッジ)を定量的に測定するため
のツールです。
網羅率は、ソフトウェアの品質やテスト妥当性を評価する際の指標になります。


参照：
https://www.ap-siken.com/kakomon/29_haru/q18.html
Eclipse  ステップ実行（1行ずつ実行）

# ステップ実行
デバッグ中にプログラムを１行ずつ実行すること

1.デバッグを実行して中断状態にする。
中断状態にするために、ブレークポイントを設定する必要がある。
デバッグボタンを押すとブレークポイントでデバッグ中断状態になる。
※必ず保存すること

2.ステップ実行

（再開ボタン）F8 を押すと次のブレークポイントにジャンプしてしまう。



再開。実行を再開する。F8キー
中断。実行を中断する。
停止。デバッグを終了する。⌘＋F2

ステップイン。現在の行のメソッドの内部に入り、停止する。F5
ステップオーバー。現在の行を実行し、次の行で停止する。F6
リターンまで実行。現在のメソッドの終了（return）まで実行し、呼び出し元に戻って停止する。F7
フレームにドロップ。「デバッグ」ビューで指定したスタック・フレームまで実行位置を戻す（巻き戻し）。
※指定行まで実行したい場合は、エディタ上で実行したい行を右クリックして「指定行まで実行」を選択する。
Rails 6で認証認可入り掲示板APIを構築する #14 seed実行時間の表示

←[Rails 6で認証認可入り掲示板APIを構築する #13 認証ヘッダの付与](https://qiita.com/rf_p/items/ba0348fc2271cbb8e79f)

# 完成図

```powershell
$ rails db:seed 
-----user start-----
count from: 0
count to: 10
3.4542s
-----user end-----
-----post start-----
count from: 0
count to: 13
0.1095s
-----post end-----
3.5883s
```

# seedsファイルの編集

まずはcontrollerの修正と同じく、postはuserから生成するため、user_seeds.rbから作っていきます。

```rb:db/seeds/user_seeds.rb
# frozen_string_literal: true

unless User.exists?
  10.times do |i|
    email = "test#{i + 1}@example.com"
    User.create!(email: email, password: "password",
                 uid: email, provider: "email", name: Faker::Name.name)
  end
end
```

とりあえず10ほぼユーザーを生成してみましょう。

続いて、post_seeds.rbを上記で生成したユーザーに所属させる形で生成します。

```rb:db/seeds/post_seeds.rb
# frozen_string_literal: true

unless Post.exists?
  users = User.all
  users.each do |user|
    Random.rand(0..3).times do
      user.posts.create!(subject: Faker::Lorem.word, body: Faker::Lorem.paragraph)
    end
  end
end
```

全ユーザーを取得し、0から3件ランダムで投稿を生成します。
`Random.rand(x..x)`はseedでよく使う手法なので覚えておくと良いです。

# db/seeds.rbの編集

```rb:db/seeds.rb
# frozen_string_literal: true

seed_models = %i[user post]

all_process_time = Benchmark.realtime do
  seed_models.each do |model|
    puts "-----#{model} start-----"
    puts "count from: #{model.to_s.classify.constantize.count}"
    process_time = Benchmark.realtime do
      require "./db/seeds/#{model}_seeds"
    end
    puts "count to: #{model.to_s.classify.constantize.count}"
    puts "#{format('%.4<time>f', time: process_time)}s"
    puts "-----#{model} end-----"
  end
end
puts "#{format('%.4<time>f', time: all_process_time)}s"
```

```powershell
$ rails db:seed 
-----user start-----
count from: 0
count to: 10
3.4542s
-----user end-----
-----post start-----
count from: 0
count to: 13
0.1095s
-----post end-----
3.5883s
```

modelが増えてきて処理時間が伸びてきたら、どこがボトルネックになっているのか調査しやすくなるはずです。

# 続き

→[Rails 6で認証認可入り掲示板APIを構築する #15 pundit導入](https://qiita.com/rf_p/items/6ab38a354c8f31b164db)
【[連載目次へ](https://qiita.com/rf_p/items/a846553c11571f4177eb#%E7%9B%AE%E6%AC%A1)】
Rasperry Pi 4のCPUでDeep Learningを高速化


私たちは、**マルチコアCPU**や**SIMDアーキテクチャ**のHW性能を引出す**組込みSW最適化技術**をコアコンピタンスとするスタートアップを目指す有志集団です。

Raspberry Pi 3/4の**CPUだけ**でどれくらいDeep Learningを高速化できるかに挑戦しています。

過去、Chainerやdarknetといったフレームワーを対象としていましたが、現在はONNX runtimeの高速化に挑戦しています。

現時点での結果は以下の通りです。
![compare.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507949/75d11daa-e53a-8e8c-787a-522335ae13bf.png)
<blockquote class="twitter-tweet"><p lang="ro" dir="ltr"><a href="https://twitter.com/onnxruntime?ref_src=twsrc%5Etfw">@onnxruntime</a> on RPi4(CPU Only) <br>MobileNetV3(Image clasification)<br>MobileNetV2-SSDLite(Image detection) <br>Original vs. Accelerated<a href="https://twitter.com/hashtag/RaspberryPi?src=hash&amp;ref_src=twsrc%5Etfw">#RaspberryPi</a> <a href="https://twitter.com/hashtag/Python?src=hash&amp;ref_src=twsrc%5Etfw">#Python</a> <a href="https://twitter.com/hashtag/DeepLearning?src=hash&amp;ref_src=twsrc%5Etfw">#DeepLearning</a><a href="https://t.co/wvBLn9Tfes">https://t.co/wvBLn9Tfes</a></p>&mdash; Project-RAIZIN (@ProjectRaizin) <a href="https://twitter.com/ProjectRaizin/status/1303332099684933633?ref_src=twsrc%5Etfw">September 8, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

もともとMicrosoftやFacebookがプロジェクトを推進しているだけあって、数倍の高速化は難しいですが、im2colやgemm、Activation関数などをチューニングすることでなんとかパフォーマンスを2倍にすることができました。

その他にもいろいろなモデルのデモ動画を公開しています。
[Youtubeチャンネル](https://www.youtube.com/channel/UCUN7YULZBV8cIBP67mNUoyA)

## 私たちのこだわりポイント
<DL>
 <DT>1. Raspberry PiのCPUだけを使用してDeep Learningを実行する<DT>
 <DT>2. 32bit版Rasbianを使用する<DT>
  <DD>まだ64bit版Raspbianに対応できていない...</DD>
 <DT>3. 既存モデルをそのまま使用する
  <DD>私たちで量子化/枝刈り/蒸留などの軽量化を行わない(そもそもできない...)</DD>
 <DT>4. 計算精度を可能な限り変えない</DT>
</DL>

## 高速化アプローチ
高速化アプローチは以下に示すような一般的なものです。

<DL>
 <DT>a. コード最適化</DT>
 <DT>b. マルチコア並列化</DT>
 <DT>c. SIMDベクトル化</DT>
 <DT>d. ソフトウェアパイプライン</DT>
 <DT>e. メモリ効率化</DT>
</DL>

一般的な項目を、プロファイルを取りながら**少しでも速くもう少しでも速く**と空雑巾を絞るがごとく突き詰めていく姿勢がほかにない私たちの特徴的なところだと思っています。

### 記事の最後に
今回は、結果の紹介にとどまってしまいましたが、忘備録を兼ねて各項目毎に技術資料をまとめて、随時公開していきたいと考えています。
VST3プラグイン制作記事　目次

これまで書いてきたVST3プラグイン制作に関する記事です。

* [VST3のサイレンスフラグについて](https://qiita.com/aike@github/items/8f4550be6a003ebbe3aa)
* [VST3の32bit/64bit処理対応について](https://qiita.com/aike@github/items/2b0ae0610aaa110df1cd)
* [VST3のバイパス実装について](https://qiita.com/aike@github/items/68eb5b906f2825840faf)
* [VST3のテストについて その１](https://qiita.com/aike@github/items/a17234584efc690139d6)
* [VST3のテストについて その２](https://qiita.com/aike@github/items/3366ccb9dd4b9f297302)
* [VST3でTabViewっぽいビューを定義する方法](https://qiita.com/aike@github/items/8942f04d1a29b1725469)
* [VST3でGUIサイズ変更可能なプラグインの作り方](https://qiita.com/aike@github/items/3cb0a0a91591b1d69f94)
* [VST3の用語について その１](https://qiita.com/aike@github/items/4253a5a7d7936b0b03af)
* [VST3の用語について その２](https://qiita.com/aike@github/items/b4983755d8a05898ffb0)
* [VST3 VSTGUIのUI定義ファイルTips](https://qiita.com/aike@github/items/c32048d9cd6f2611010f)
* [VST3 FL Studio使用時のVSTGUI再描画バグについて](https://qiita.com/aike@github/items/30d45608c0b90efa2d9f)
* [VST3 VSTGUIのスタンドアロンライブラリについて](https://qiita.com/aike@github/items/0e685759af0200588104)
* [VST3プラグインでProcessorからControllerへバイト列メッセージを送る例](https://qiita.com/aike@github/items/0ebfc60faee3ced98f96)
Windows Terminalをコマンドで実行し、更に、その中でコマンド実行。


# 仕様

1. コマンドラインからWindows Terminalを実行。(wtコマンドにて実行）
2. 項番1で起動したTerminal内でコマンドを実行(cmd /k にて実行）


```bat:run_on_wt.bat

::　形式
wt  -d [ディレクトリパス] cmd /k [コマンド]

:: 例
wt -d C:\command\ cmd /k dir
```

# 備考

- 上記は「settings.json」のプロファイルが未指定なので、コマンドプロンプトで実行。
- **-dで指定するディレクトリ**は**ダブルクォテーション（""）で括らない**。括るとエラーになる。
- 「cmd /k」というcmdの**「/k」オプション**がないと、画面に何も表示されない。
- 「cmd」もない以下の状態だと、**['dir' の起動時にエラー 0x80070002 が発生しました]**が表示される。

```bat:fail.bat

:: エラー
wt -d C:\command\ dir

:: エラー
wt -d "C:\command\" cmd /k dir

::表示なし
wt -d C:\commnad\ cmd dir

```

# 参考

- [MS公式：Windows ターミナルにコマンド ライン引数を使用する](https://docs.microsoft.com/ja-jp/windows/terminal/command-line-arguments?tabs=windows)
- [StackOverflow:Start window's terminal from CLI and pass in an executable command to run
](https://stackoverflow.com/questions/62825144/start-windows-terminal-from-cli-and-pass-in-an-executable-command-to-run)
WebシステムにおけるCDN(Contents Delivery Network)

応用情報技術者平成29年春期 午前12

WebシステムにおけるCDN(Contents Delivery Network)に関する記述として，適切なものはどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/82c262f1-7336-8092-f39f-f4336ad3573e.png)

１、CDN(Contents Delivery Network)は、主にWebシステムにおけるコンテンツ配信の高速化・効率化を目指して最適化された配信インフラのことです。

CDNは、
　・キャッシュサーバの活用や
　・トラフィック分散、
　・ルーティングの工夫で
　・ネットワーク負荷を低減し、
　・ユーザにより速くコンテンツを届けられるように
構築されています。
ノードとなるサーバは、様々な地域に設置されており、ユーザからのリクエストに応じて、迅速かつ効率的な配信が行われるよう機能しています。

CDNは、
　・Webサイトだけでなく、
　・音楽や動画(ストリーミングを含む)などのマルチメディアコンテンツ、
　・大容量データの配信
を安定的に配信する手段として用いられています。

２、Web3層構成の説明
Webサーバ，アプリケーションサーバ，データベースサーバの三つの構成要素に分けることによってコンテンツの検索を容易にすると同時に，システムの拡張性も高める。

３、SNS(Social Networking Service)の説明
コミュニティ型のWebサイト及びネットワークサービスによって，人と人とのつながりを促進するコンテンツを共有する。

４、プラグインやアドインの説明
動画再生や音楽再生に必要なプログラム部品をインターネット経由で入手し，Webブラウザに組み込む。

参照：
https://www.ap-siken.com/kakomon/29_haru/q12.html
[解決]Dockerエラー'ERROR: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?'が出た時の対処法

## これを解決します
[vagrant@localhost ~]$ sudo docker version
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
##方法

```
$ sudo groupadd docker
```



```
$ sudo usermod -aG docker $USER
```
再度ログイン

```
$ newgrp docker 
```

```
$ sudo docker version
```


daemonのエラーが出てなければ解決

参考
https://docs.docker.com/engine/install/linux-postinstall/
https://stackoverflow.com/questions/21871479/docker-cant-connect-to-docker-daemon
プログラムを圧縮した状態でフラッシュメモリに格納する時間

応用情報技術者平成29年春期 午前11

15Mバイトのプログラムを圧縮した状態でフラッシュメモリに格納している。プログラムの圧縮率が40%，フラッシュメモリから主記憶への転送速度が20Mバイト／秒であり，1Mバイトに圧縮されたデータの展開に主記憶上で0.03秒が掛かるとき，このプログラムが主記憶に展開されるまでの時間は何秒か。ここで，フラッシュメモリから主記憶への転送と圧縮データの展開は同時には行われないものとする。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/705b13e7-d4c4-efb7-41e6-b023cfb3a991.png)


１、プログラムの圧縮率が40%

・データ圧縮率とは、データを圧縮した際に、圧縮後のデータが元のデータのどのくらいの情報量に減ったかを表す割合。圧縮後の量の元の量に対する割合を100倍したパーセンテージで表すことが多いが、削減された量の元の量に対する割合とすることもある。

例えば、100MBのファイルが10MBに圧縮された場合、10/100の0.1（百分率で10%）を圧縮率とする場合と、（100-10）/100の0.9（同90%）を圧縮率とする場合がある。

つまり、この概念は、逆な二つ理解がありますね。

２、１５MBバイトのPGMは圧縮したのサイズ、or 圧縮する前のサイズ？
ここの理解は、圧縮する前のサイズの可能性が高いですね。
後ろにすぐ圧縮率４０％の説明が付きますので。

上記の二つを踏まえて、
１）、仮に、データ圧縮率の40％は、圧縮後のデータが圧縮前のデータの割合の表現とすると、
・圧縮前のデータ：１５MBバイト
・圧縮後のデータ：１５×４０％＝６MBバイト

①フラッシュメモリから、主記憶に転送の時間
６／２０＝０．３秒

②主記憶で展開の時間
６×０．０３＝０．１８秒
　
上記①と②合わせて、０．４８秒です。

２）、仮に、データ圧縮率は、情報量の減ったとすると
１５MB×0.6＝９MBバイト
①フラッシュメモリから、主記憶に転送の時間
９／２０＝４．５秒

②主記憶で展開の時間
９×０．０３＝０．２７秒

上記①と②合わせて、０．７２秒です。
イの０７５秒と似てるだけど、やっぱり違いますね。


ですが、もしイは０．７２とすると、どうしよう？？？
「圧縮後の量の元の量に対する割合を100倍したパーセンテージで表すことが多い」ということがあるので、上記１）の計算結果０．４８を選ぶと、正確と判定される可能性が高いだろう。


参照：

https://www.ap-siken.com/kakomon/29_haru/q11.html

データ圧縮率  【 data compression ratio 】 
http://e-words.jp/w/%E3%83%87%E3%83%BC%E3%82%BF%E5%9C%A7%E7%B8%AE%E7%8E%87.html
Pythonによる画像処理100本ノック#4 大津の二値化（判別分析法）

## はじめに
どうも、らむです。
二値化に用いる閾値を自動で決定する手法である大津の二値化（判別分析法）を実装します。

## 4本目：大津の二値化
二値化は画像を白黒の2色のみのモノクロ画像に変換する処理です。なお、閾値を決めておき、閾値未満の画素値は白、閾値以上の画素値を持つ画素は黒に置き換えます。ここまでは、前回の二値化にて説明しました。
今回はこの閾値を自動で決定する手法を取り扱います。

大津の二値化では閾値によってクラスを2つに分割します。
この2つのクラスにおいて分離度が最大となるときの閾値を二値化のときの閾値とします。
分離度の計算に必要なパラメータは以下の式によって算出できます。

分離度：$X = \dfrac{\sigma _{b}^{2}}{\sigma _{w}^{2}}$

クラス内分散：$\sigma _{b}^{2} = \dfrac{\omega _{0}\omega _{1}}{(\omega _{0}+\omega _{1}) ^2} (M _{0}+M _{1}) ^2$

クラス間分散：$\sigma _{b}^{2} = \omega _{0}\sigma _{0}^{2}+\omega _{1}\sigma _{1}^{2}$

クラス0,1に属する画素数：$\omega _0,\omega _1$

クラス0,1に属する画素値の分散：$\sigma _0,\sigma _1$

クラス0,1に属する画素値の平均：$M_0,M_1$

画像全体の画素値の平均値：$M$

クラス0,1に属する画素値の合計：$P_0,P_1$

まとめると、閾値が0から255の場合で分離度を256回計算し、分離度が最大となるような閾値を求めればいいです。

```otsuBinarization.py
import numpy as np
import cv2
import matplotlib.pyplot as plt
# from statistics import variance
import statistics as st
plt.gray()


def otsuBinarization(img):
  # 画像コピー
  dst = img.copy()
  # グレースケール化
  gray = cv2.cvtColor(dst, cv2.COLOR_BGR2GRAY)

  w,h = gray.shape
  Max = 0

  # 画像全体の画素値平均
  M = np.mean(gray)

  # 閾値256値全てに適用
  for th in range(256):
    # クラス分け
    g0,g1 = gray[gray<th],gray[gray>=th]

    # 画素数
    w0,w1 = len(g0),len(g1)
    # 画素値分散
    s0_2,s1_2 = g0.var(),g1.var()
    # 画素値平均
    m0,m1 = g0.mean(),g1.mean()
    # 画素値合計
    p0,p1 = g0.sum(),g1.sum()

    # クラス内分散
    sw_2 = w0*s0_2 + w1*s1_2
    # クラス間分散
    sb_2 = ((w0*w1) / ((w0+w1)*(w0+w1))) * ((m0-m1)*(m0-m1))
    # 分離度
    if (sb_2 != 0):
      X = sb_2 / sw_2
    else:
      X = 0

    if (Max < X):
      Max = X
      t = th

  # 二値化
  idx = np.where(gray < t)
  gray[idx] = 0
  idx = np.where(gray >= t)
  gray[idx] = 255

  return gray


# 画像読込
img = cv2.imread('image.jpg')

# 大津の二値化
mono = otsuBinarization(img)

# 画像保存
cv2.imwrite('result.jpg', mono)
# 画像表示
plt.imshow(mono)
plt.show()
```

<img width="300" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519081/6e6ca74e-7b7c-a641-553c-7280c2f12d1d.jpeg">　<img width="300" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519081/dfb9b39c-d832-0a7e-63d1-e5f21195295a.jpeg">　<img width="300" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519081/06d92ab6-7ece-7807-59ca-cf9beae571e8.jpeg">


画像左は入力画像、画像真ん中は手動で閾値を128に設定したときの出力画像、画像右は今回の出力画像です。
自動で閾値を決めて二値化してもさほど違和感の無い画像が出力されていますね。
余談ですが、私の実装では画像全体の画素値平均Mは使ってないですね。

## おわりに
もし、質問がある方がいらっしゃれば気軽にどうぞ。
imori_imoriさんの[Github](https://github.com/yoyoyo-yo/Gasyori100knock/blob/master/Question_01_10/answers_py/answer_2.py)に公式の解答が載っているので是非そちらも確認してみてください。
それから、pythonは初心者なので間違っているところがあっても優しく見守ってコメントしてあげてください。
【JavaScript】【DOM操作】appendChild( )でHTML要素を追加



#書き方

```
[親要素].appendChild(追加要素);
```


#サンプルコード
以下のようなリストがあるとします。

```html:example.html
<ul id="menuList">
    <li>coffee</li>
    <li>tea</li>
</ul>
```
↑に`<li>greenTea</li>`を以下のコードで追加します。

```javascript:example.js

// 親要素
var menuList = document.getElementById('menuList');

// 追加する要素を作成
var li = document.createElement('li');
li.innerHTML = 'greenTea';

// 末尾に追加
menuList.appendChild(li);
```

■結果
親要素の最後の子要素として追加されます。



```html:example.html
<ul id="menuList">
　　<li>coffee</li>
　　<li>tea</li>
　　<li>greenTea</li>
</ul>
```

#参照
[MDN web docs](https://developer.mozilla.org/ja/docs/Web/API/Node/appendChild)
Keycloak認可機能のデータモデル

Keycloakの認可機能には多くの独自の概念が登場するため、全体像を理解するには時間がかかる。Keycloakを調査をする過程で、これらの独自概念を整理するためにデータモデル図（ER図）を作成したため、認可機能概要の説明とともに紹介する。

なお実際の認可機能の利用例として、以下の記事ではKeycloakを使った認可ルールの登録と認可判定の動作の検証を説明している。

+ [Keycloakの認可機能の使い方（RBAC編）](https://qiita.com/unhurried/items/78feead6063b698e933a)
+ [Keycloakの認可機能の使い方（OAuth2スコープ編）](https://qiita.com/unhurried/items/7656512c04e51c941480)


#### Keycloakの認可機能の概要

* 保護対象のオブジェクトをResource（もしくResourceを細分化したScope）として定義する。
  * Resource（もしくはScope）はClientとして登録したResource Serverに従属するモデルとなる。
* Resource（またはScope）のアクセスに必要な条件をPolicyとして登録する。
  * Role-Based Policyなど、典型的なアクセス制御モデル（Role-Based Policyの場合はRBAC）を実現するためのビルトインPolicyが提供されている。
  * その他に、JavaScriptで任意のロジックをPolicyとして登録できる、JavaScript-Based Policyもサポートされている。
* 保護対象オブジェクト（ResourceまたはScope）とアクセス条件（Policy）をPermissionというモデルを登録することで紐づける。

#### データモデル（ER図）

<img src="https://gist.githubusercontent.com/unhurried/9ae0db89ac8838a5333072fa88aafc0a/raw/0825131458b8f2c00f9d584b5136620e52c01c33/authorization.svg">

#### 参考

* [Core Concepts and Terms](https://www.keycloak.org/docs/latest/server_admin/index.html#core-concepts-and-terms)
* [Authorization Services Guide](https://www.keycloak.org/docs/latest/authorization_services/index.html)
壁埋込み型無線LANルータ、ACON WAP-102Sを動かす

# はじめに
[Shigezone](https://www.shigezone.com/) で売られている埋込み型無線LANルータ、[ACON WAP-102S](http://www.acon.com/upload/media/product/comm/catalog/WAP-102S-JP.pdf) がお値段以上の性能でしたので、簡単に使い方をまとめました。
![s_IMG_20200916_213041779.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679798/f750f4e3-1ac9-fb71-67fe-e64b3acc954a.jpeg)

## 電源
この製品は壁のコンセントに埋め込むことを想定しているのか、電源はPoE経由です。PoEインジェクタを持っていない方は、箱を開けて5Vを投入すれば動きます。
![102s_brd.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679798/5e054d11-f6ab-5460-be52-a66c45cff5ab.jpeg)


箱を開けて一番上の基板を外し(コネクタのみですので引っ張れば外せます)、4ピンのコネクタ(J6)の1,2番(外側)に+5V、3,4番にGNDを入れれば動きます。無線LANのランプが付くまで2,3分かかります。WANポートにネットワークケーブルがささっていないと、動かないかもしれません(未確認)。
![s_IMG_20200916_211836076.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679798/48dae7f9-2946-ce8d-8215-f9de59a04f76.jpeg)


## 設定画面を開く
デフォルトでは、WANポート側はDHCPクライアントでIPアドレスを取得して、無線LAN側は192.168.2.0/24にルーティングされるようになっています。本体は192.168.2.1が割り当てられています。
192.168.2.1をブラウザで開くと、設定画面が出てきますので、admin/adminでログインできます。
![102s_web.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679798/317dd867-4776-c208-775d-6081a34223dd.jpeg)

## 基本的な性能
- ちゃんと確認していませんが、MediatekのMT7620あたりが載っていそうです。設定画面から取得できるログから、DRAMが64MB載っているのが確認できます。メモリがそれなりに載っているのが嬉しいです。
- アクセスポイント向け製品のためか、PPPoE接続やVPNなどの機能はありません。アクセスポイントとルーティングのみです。
- 最近の家庭用ルータでは省略されている、DHCPサーバにMACアドレスを見て特定IPアドレスを振る機能がついていて、ちょっと便利です。

## ちょっと特徴的な設定 
設定内容は普通の家庭用ルーターと同じですが、SSIDが8つも登録できて、SSIDごとに接続可能ポート・特定URLのブロック・帯域を制限する機能がついています。
![102s_spd.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679798/f47deeab-c169-966e-1f18-97d8fc9f6f08.jpeg)
子供用のタブレットの閲覧制限、ネットワーク接続する家電に余計な接続されたくない、などクライアントごとの細かい制限に使えそうです。
プロセッサの省電力技術の一つーパワーゲーティング

応用情報技術者平成29年春期 午前9

プロセッサの省電力技術の一つであるパワーゲーティングの説明として，適切なものはどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/fcb38a2e-7da2-773d-abff-d1ebd272aabf.png)


１、パワーゲーティングは、
動作していない演算回路ブロックに対して、クロック信号の供給停止だけではなく電源を遮断し、電流を削減する半導体の低消費電力技術です。

・クロックゲーティング
　パワーゲーティングと似た低消費電力技術。こちらは演算に関与しない不要ブロックへのクロックの供給を止めることで電力消費を抑える技術です。


２、マルチVDD技術の説明
仕事量に応じて，プロセッサへ供給する電源電圧やクロック周波数を変える。


３、クロックゲーティングの説明
動作していない回路ブロックへのクロックを停止する。


４、Intel CPUのターボモードの説明　Turbo mode
マルチコアプロセッサにおいて，使用していないコアの消費電力枠を，動作しているコアに割り当てる。


参照：
https://www.ap-siken.com/kakomon/29_haru/q9.html
MailCatcher起動時に「port 1080 Are you already running MailCatcher\?」のエラーが出た

# 目的

- MailCatcher起動時のエラー「~~> ERROR: Something's using port 1080. Are you already running MailCatcher?」の解決方法をまとめる

# 前提情報

- 下記記事の作業中にエラーが発生した。
    - [AWS EC2 AmazonLinux2インスタンスにMailCatcherを導入する]()

# 解決方法

- 下記コマンドを実行してMailCatcherのプロセスナンバーを確認する。

    ```terminal
    $ sudo lsof -i -P | grep "1080"
    ```
- 下記の様に出力された場合「14154」や「14525」がプロセスナンバーとなる。

    ```
    1 S  1000 14154     1  0  80   0 - 60421 core_s ?        00:00:23 mailcatcher
    1 S  1000 14525     1  0  80   0 - 60365 core_s ?        00:00:22 mailcatcher
    ```
- 下記コマンドを実行してMailCatcherのプロセス停止する。

    ```terminal
    $ sudo kill プロセスナンバー
    ```
- 下記コマンドを実行してプロセスが停止したことを確認する。（何も出力されなければプロセスが停止している。）

    ```terminal
    $ ps -le | grep mailcatcher
    ```
- これでMailCatcherは停止しているので再度、起動を行うコマンドを実行する。
    
# 重要

- 本作業を実行し、MailCatcherのプロセスが動いていないにもかかわらず「~~> ERROR: Something's using port 1080. Are you already running MailCatcher?」が表示される時はMailCatcher起動コマンドのIPアドレスが間違えている可能性がある。
- 今一度MailCatcherの起動コマンドのIPアドレスに誤りがないか確認してみよう。
- ローカルIPアドレスとグローバルIPアドレスを取り違えたりしていないか確認してみよう。
プログラム構造ーリエントラント(Reentrant，再入可能)、リユーザブル(Reusable，再使用可能)、リカーシブ(Recursive，再帰可能)、リロケータブル(Relocation，再配置可能)

応用情報技術者平成29年春期 午前7

プログラムの特性に関する記述のうち，適切なものはどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/8709f4df-7d93-8eb0-2f7f-80991fd6d7da.png)


プログラム構造によって生じる特性には次の4つがあります。
１、リエントラント(Reentrant，再入可能)
　　プログラム内で使用する変数部分を各プロセスごとに割り当てることで、複数のプロセスで同時に使用できる特性。

　　よりよい方法として、モジュール性とデータのカプセル化の性質の利用があります。複数のスレッドから同時に呼び出されても正しく動作する関数を「リエントラント (再入可能)」関数と呼びます。再入可能な関数を作成するには、その関数にとって何が正しい動作なのかを把握することが必要です。

　　複数のスレッドから呼び出される可能性のある関数は、再入可能にしなければなりません。そのためには、関数のインタフェースまたは実装方法を変更する必要があります。

　　リエントラントの問題は、メモリーやファイルなどの広域的な状態におかれているものをアクセスする関数で生じます。それらの関数では、広域的なものをアクセスする場合、スレッドの適当な同期機構で保護する必要があります。

２、リユーザブル(Reusable，再使用可能)
　　主記憶へのプログラムの展開を初回実行時のみ行い、それ以降はロードせずとも何度でも正しく使用できる特性。

　　プログラムがメインメモリに読み込まれて実行された後、そのまま再び先頭から同じように実行し直すことができる性質を表す。実行時に自らのコードを書き換えたり、内部の状態を表す変数などを変更し（たままにし）ないなどの条件が必要となる。

３、リカーシブ(Recursive，再帰可能)
　　プログラム中において自分自身を呼び出すことができる特性。

４、リロケータブル(Relocation，再配置可能)
　　プログラムを主記憶上のどの位置においても正しく実行できる特性。

　　命令が参照するメモリ上の位置の指定を、その命令が置かれている現在位置からの相対位置や、プログラム先頭からの相対位置などで指定するようにしておけば、プログラムをメモリのどこに置いても正常に動作する。このようなプログラムのことをリロケータブルであるという。


ーーーーーーーーーーーーーーーーーーーーーー
補足

リアルタイムシステムにおいて，複数のタスクから並行して呼び出された場合に，同時に実行する必要がある共用ライブラリのプログラムに要求される性質はどれか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/16a80116-7e8c-d56b-44ab-32b9e5ffedc2.png)


１、共用ライブラリは、
1つのプログラムを複数のプロセスが共用する前提で作られます。

共用とすると、PGMごと、変数は別々で割り当てないと、混乱になってしまいますね。

特にリアルタイムシステムにおいては、他のプロセスがライブラリを解放するのを待つようでは処理が遅延し、システムとして致命的となるため「リエントラント(再入可能)」なプログラム構造である必要があります。

リエントラント(Reentrant，再入可能)とリユーザブル(Reusable，再使用可能)の違いは、
　・リエントラントは、プロセスごと、変数のメモリが用意される。
　　PGMがひとつ、DATAはプロセスごと持つ

　・リユーザブルは、そもそも、変数が変更されたりなどはないので、再度利用できる（共通関数などのように考えられる）

参照：

https://www.ap-siken.com/kakomon/28_haru/q7.html

https://www.ap-siken.com/kakomon/29_haru/q7.html


リエントラント (再入可能)
https://docs.oracle.com/cd/E19455-01/806-2732/guide-3/index.html


リロケータブル(Relocation，再配置可能)
http://e-words.jp/w/%E3%83%AA%E3%83%AD%E3%82%B1%E3%83%BC%E3%82%BF%E3%83%96%E3%83%AB.html#:~:text=%E3%83%AA%E3%83%AD%E3%82%B1%E3%83%BC%E3%82%BF%E3%83%96%E3%83%AB%E3%81%A8%E3%81%AF%E3%80%81%E8%BB%A2%E5%B1%85%E5%8F%AF%E8%83%BD,%E3%82%92%E3%83%AA%E3%83%AD%E3%82%B1%E3%83%BC%E3%82%BF%E3%83%96%E3%83%AB%E3%81%A7%E3%81%82%E3%82%8B%E3%81%A8%E3%81%84%E3%81%86%E3%80%82

リエントラント
https://ja.wikipedia.org/wiki/%E3%83%AA%E3%82%A8%E3%83%B3%E3%83%88%E3%83%A9%E3%83%B3%E3%83%88
プログラミング技術向上

プログラミングスキルの向上、という言葉の定義は人それぞれあると思いますが、例えば「簡潔にコードを書けた」とか「できないことができる・・・ようになった」とか。

今回は「できないことができる・・・ようになった」例をご紹介。

【できるようになった事】
・ Django でデータベース内を検索し、必要なデータのみを抽出できるようになった
・ Django でデータベースの書き換えができるようになった
・ Django でメールを送れるようになった
・ Djnago に定額課金のカード決済ができるようになった
・ Twitter API が使えるようになった
・ ボットが定期的にデータベースにアクセスし、必要な情報を抽出できるようになった
・ 改めて Django にはない Rails 、 Laravel の CRUD はすごいな、と思った

Django ・・・ Python製の Webフレームワークなどの<a href="https://otona-party.com/">大人パーティー</a>
AWS-Athena エラーメッセージ「no viable alternative at input 'create external'」の原因・対処法

#この記事の内容
AthenaでCreate Tableした時に「no viable alternative at input 'create external'」エラーメッセージが出たので原因と対処法をご紹介します。

#エラー背景
S3にcsvのデータを設置して、Athenaで以下のCreate Tableクエリを実行しました。

```sql
CREATE EXTERNAL TABLE test_table (
 col1, 
 col2
) 
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' 
LOCATION 's3://test-bucket/';
```

すると、エラーメッセージ(構文エラー)が出ました。

```sql
no viable alternative at input 'create external'
```

#原因
[Amazon Athena ユーザーガイド](https://docs.aws.amazon.com/ja_jp/athena/latest/ug/athena-ug.pdf)を見てみると、
・テーブル名、カラム名にアンダースコア(_)以外の特殊文字を使用している。
・カンマ(,)が抜けている。
などがエラー原因として考えられるようです。

今回の場合は、カラムの文字形式を指定しないのが原因でした。
カラム名の後ろに「string」を追加して、クエリを修正して実行してみると成功しました。

```sql
CREATE EXTERNAL TABLE test_table (
 col1 string, 
 col2 string
) 
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' 
LOCATION 's3://test-bucket/';
```

#最後に
細かいとこですが、AthenaのCreate-Tableの形式を守らないとエラーになりますね。


#参考文献
[Amazon Athena ユーザーガイド](https://docs.aws.amazon.com/ja_jp/athena/latest/ug/athena-ug.pdf)
PyTorchのモジュールでlibcusparse.so.10がないと言われる

自分用メモ

OS : Ubuntu 18.04 LTS
PyTorch : 1.5.0, 1.6.0
CUDA : 10.2
NVIDIA-driver : 440

もともとは，PyTorch Geometricをimportしたときに起きたエラー．公式の通りにインストールしたのにおかしいな...と思ったが，結論から言うと，NVIDIA-driverはちゃんとインストールされていたが，NVCCがインストールされていなかったため．

# 症例
```
import torch_geometric.transforms as T

OSError: libcusparse.so.10: cannot open shared object file: No such file or directory
```

>tensorflow-gpuで libcublas.so.10.0のImportError
https://qiita.com/Uejun/items/fbb579374eafab8633d6

こちらも似たような症例だが，単にパスを通すだけで済むらしい．しかし，私のパソコンには，どこを探しても，libcusparse.so.10なるライブラリはなかった．
 公式のissueにこのようなものがあった．

> libcusparse.so.10 error when importing
https://github.com/rusty1s/pytorch_geometric/issues/1092

問題の状況は違うけど，`/usr/local/cuda/lib64`下に，libcusparse.so.10があること，また，`$ nvcc -V`がちゃん通ることが必要なようである．私の場合，`$ nvcc -V`がそもそも通っていなかった．このコマンドを叩いたときには，

```
$ nvcc -V

Command 'nvcc' not found, but can be installed with:

sudo apt install nvidia-cuda-toolkit
```
と表示されたが，`$ sudo apt install nvidia-cuda-toolkit
`では目的のライブラリは入らなかった．それ以前に，cuda10.2をインストールする必要があるらしい．

# 解決策
　cuda10.2を入れ直す．

```
$  sudo apt purge nvidia-cuda-* 
```

の後（なくてもいけるが念の為），[公式](https://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html#ubuntu-installation)をもとに，cuda10.2をインストールする．これに関しては，各デバイスごとに違うと思うので割愛．この後，.bashrcに

```
export PATH="/usr/local/cuda/bin:$PATH"
export LD_LIBRARY_PATH="/usr/local/cuda/lib64:$LD_LIBRARY_PATH"
```

を書き込んだら，`$ nvcc -V`が通り，PyTorch Geometricも使えるようになった．また，libucusparse.so.10.0などのモジュールがある場合は`$ ln -s libucusparse.so.10.0 libucusparse.so.10`などの対処で行ける場合もあるらしいが，自分の場合はエラーが起きた．
勉強日誌14日目(午前の部)

仕事で最近早起きしてたせいか早起きが癖に
今日は予定があるので朝から勉強。

開始！
（）内は前回結果

正答率　69%　（46%）

host -t mx .com
.comのメールサーバの情報を問い合わせる

systemd-resolved
systemdで名前解決を管理するデーモンプログラム

dig //.//.// any
DNSサーバに登録されている　//.//.// の情報を全て表示するコマンド

dig -t soa
DNSサーバに登録されている　ドメインのゾーンに関する情報確認

正答率　87%　（74％）
192.168.0.0
192.168.255.255
クラスCのプライベートアドレス

64
Ipv6のユニキャストアドレスのサブネットプレフィックス数

224.0.0.0
239.255.255.255
IPアドレスのクラスDのアドレス範囲

ICMP
IPのエラーメッセージや制御メッセージを転送するプロトコル

21
FTPの制御用プロトコル


32
IPv4のアドレス長（ビット）
【Vue.js】propsをHTMLの属性値に渡すときはv-bindを使う

## propsをHTMLの内容に渡すとき
子コンポーネント側では特に注意点はありません

```
<template>
  <p>{{ text }}</p>
</template>
```

## propsをHTMLの属性値に渡すとき
子コンポーネント側でv-bindを使う

```
<template>
  <p :class="text">テキスト</p>
</template>
```

## Twitterアカウント
Twitterも更新していますので、よかったらフォローお願いします！
[Twitterアカウントはこちら](https://twitter.com/flat_ito)
2つの自然数の最大公約数を求めるーユークリッドの互除法

応用情報技術者平成29年春期 午前6


次の流れ図の処理で，終了時のxに格納されているものはどれか。ここで，与えられたa，bは正の整数であり，mod(x，y)はxをyで割った余りを返す。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/697328f6-7837-7c68-48a7-e54c5fa47f62.png)


アルゴリズムは「ユークリッドの互除法」と呼ばれ、2つの自然数の最大公約数を求める手法の一つです。

アルゴリズム自体は、それほど複雑ではないですね。
ただ、流れのループ１に「ｙ＝0」は私が
　　ｙに0を付与するとの理解
でしたが、
この問題文には、それが違います。
意味としては、
ｙが0にイコールかを判断することです。

参照：
https://www.ap-siken.com/kakomon/29_haru/q6.html
Markdown でリンクを貼り付けるときに自分が使っている方法

おはようございます。
今回は「Markdown でリンクを貼り付けるときに自分が使っている方法」を紹介しようと思います。
もっといい方法があるよ、という方がいらっしゃいましたら、コメント欄で是非共有いただければと思います。

## まえがき

Markdown でリンクを張り付けるとき、サイトのタイトルと URL を取ってこないといけないですよね。
Chrome の場合だと、 URL は `Ctrl+L` でアドレスバーにフォーカスを当ててからの `Ctrl+C` でコピーすれば楽なのですが、タイトルを取るときに私は少々てこずりました。
ブログ記事などでブログのタイトルになっている場合は、そのタイトルをコピペしたらいいのですが、そうでない場合・・・
タブを右クリックしても何も出てこなくて困りました😭からの仕方なく手打ちするとか😥

## 私がどうやっているか

くだらないかもしれませんが、開発者ツールで中身見たら全部わかるだろう、と気づきました。
`F12` を押下し、 `Console` タブを選択して次のコマンドを入力すれば、タイトルが取得できます。

```javascript
console.log(document.title);
```

さらに、 Markdown でリンクを貼る際は `[リンク名](URL)` と記載するので、次のようにすればもっと簡単になります。

- ECMAScript 6 の場合

```javascript
console.log(`[${document.title}](${document.URL})`);
```

- ECMAScript 5 の場合

```javascript
console.log('[' + document.title + '](' + document.URL + ')');
```

よろしければ使ってみてください。
数学における漸化式(recurrence relation =再帰関係式)

応用情報技術者平成29年春期 午前5

次の数式は，ある細菌の第n世代の個数f(n)が1世代後にどのように変化するかを表現したものである。この漸化式の解釈として，1世代後の細菌の個数が，第n世代と比較してどのようになるかを説明しているものはどれか。

　f(n＋1)＋0.2×f(n)＝2×f(n)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/99f4ac55-2137-d515-50a0-65b925dd28ac.png)


１、数学における漸化式（ぜんかしき、英: recurrence relation; 再帰関係式）は、各項がそれ以前の項の関数として定まるという意味で数列を再帰的に定める等式である。 ある種の漸化式はしばしば差分方程式 (difference equation) と呼ばれる。

つまり、漸化式は、別名は再帰関係式ですね。
よって、問題文の数式を整理して、

　f(n＋1)＋0.2×f(n)＝2×f(n)
　f(n＋1)＝2×f(n)－0.2×f(n)
　f(n＋1)＝1.8×f(n)

計算式の表現する変化は「1世代後の個数"f(n＋1)"は、第n世代の個数"f(n)"の1.8倍に増える」になりますね。

**＜＜間違いしやいところ＞＞**
ポイントとしては、「漸化式」の理解ができるかですね。
つまり、問題文の式を整理すべきかのこと。

私は、「漸化式」とすると、整理せず、問題文のままべきと思いました。
問題文の数式ままとすると、
・1世代後の個数"f(n＋1)"は、第n世代の個数"f(n)"の２倍になる
・ただ、その中20％が死ぬ
でしょう。


参照：
https://www.ap-siken.com/kakomon/29_haru/q5.html

漸化式
https://ja.wikipedia.org/wiki/%E6%BC%B8%E5%8C%96%E5%BC%8F
WRD（Word Rotator's Distance）で文書間の距離（類似度）を計算する

# 背景
文書（テキスト）間の類似度を計算する処理は、検索やレコメンドなど様々な分野で使われていると思います。
現在（2020年9月時点）、文書間の類似度を計算する方法は、次のようにコサイン類似度から計算する方法と、距離から計算する方法の大きく2種類に分類することができます。両者とも、単語の分散表現を利用するというのが前提にあります。

1. 単語の分散表現を利用して文書をベクトル化し、そのベクトル空間上で文書間のコサイン類似度を計算する
2. 文書に含まれる単語の分散表現をベクトル空間上にマッピングし、そのベクトル空間上で文書間の距離を計算する。

1の手法については、文書に含まれる単語の分散表現の（加重）平均を取り、各文書をベクトル化します。そして、そのベクトル空間上でコサイン類似度を計算するという手法です。[クックパッド](https://techlife.cookpad.com/entry/2019/02/20/120219)や[マイクロアド](https://developers.microad.co.jp/entry/2018/11/15/153652)をはじめ、実際のビジネスの現場でも幅広く使われています。
2の手法については、[WMD(Word Mover's Distance)](http://proceedings.mlr.press/v37/kusnerb15.pdf)という手法が一番有名だと思います。まず、文書に含まれる単語の分散表現をベクトル空間上にマッピングします。そして、ある文書に含まれる単語群と別の文書に含まれる単語群の距離を計算し、距離の長さによって類似度を測るというものです。[gensim](https://radimrehurek.com/gensim/auto_examples/tutorials/run_wmd.html)にWMDを計算する関数が用意されており、比較的簡単に実装することができます。

# WRDとは
[WRD](https://arxiv.org/abs/2004.15003v1)はWMDを改良したアルゴリズムで、東北大学の乾研究室が発表したものです。WRDの特徴は、**単語の分散表現のノルムと偏角を分けて考える**というところにあります。具体的には、**ノルムは単語の重要度を表し偏角は単語の意味を表す**と考え、これらを別々に取り扱っています。別々に取り扱う方法については、論文に掲載されている下記の図をご覧頂ければイメージが付きやすいと思います。

<img width="300" alt="スクリーンショット 2020-06-26 11 56 45" src="https://user-images.githubusercontent.com/40833046/85815895-b48ed300-b7a4-11ea-84aa-3b6f49a57130.png">

上記の図の通り、文書に含まれる単語の分散表現を超級平面上に射影します。その際、点の大きさをノルムに比例したものとします。こうすることで、重要度が高い単語は点が大きくなり、重要度が低い単語は点が小さくなります。そして、ある文書に含まれる単語群と別の文書に含まれる単語群のアライメント[^1]を取るのに必要な力を距離、とWRDでは定義します。つまり、意味が異なる単語同士の場合であっても、重要度が高い場合は距離が長くなりますが重要度が低い場合は距離はさほど長くなりません。結果的に、意味が似ている文書間はWRDが小さくなり、意味が似ていない文書間はWRDが大きくなります。

詳細は[論文](https://arxiv.org/abs/2004.15003v1)をご覧下さい。繰り返しになりますが、**単語の分散表現のノルムと偏角を分けて考える**というのは画期的な考え方だと思います。背景で紹介した文書のベクトル化でも、結局はノルムと偏角を混ぜて考えていますので。

# WRDの実装
実装が公開されていなかったので、実装をGitHubに公開しました。是非、試してみて下さい。計算コストが高いという欠点はありますが、文書をベクトル化してコサイン類似度を計算するという方法よりも精度は高くなると思います。

https://github.com/kenta1984/wrd

[^1]: 単語と単語の対応関係を取ること
Rustに入門してみた

新しいプログラミング言語に触れてみようと思い、Rustにチャレンジしてみました。2020年で最も人気にあるプログラミング言語となったそうですね。[infoQ：Rustが最も人気のあるプログラミング言語トップ20に](https://www.infoq.com/jp/news/2020/07/rust-top-20-language/)

## Rustの特徴
- 高速な実行環境
- 安全な文法
- Performance、Reliability、Productivityの３つに力を入れたシステムプログラミング言語

## 利用例
- FirefoxのCSSエンジン、Dropbox
- [日本で Rust を利用している会社一覧](https://github.com/fnwiya/japanese-rust-companies)
 - （こんなまとめがあるんだ…初めて知った）  

# 1. 準備
Hello, Worldを実行できるようにWindows環境上にRustの実行環境を用意してみます。

## 試した環境
- Windows ver.1903
- Visual Studio Code 1.49.1
- Rust 1.46.0

## セットアップ
1. [Microsoft C++ Build Tools](https://visualstudio.microsoft.com/ja/visual-cpp-build-tools/)をインストール
2. [Rust](https://www.rust-lang.org/ja/learn/get-started)をインストール
 - CUIでインストールが進みます。
3. Visual Studio Codeでの[Rust用拡張機能](https://marketplace.visualstudio.com/items?itemName=rust-lang.rust)をインストール

# 2. 実際に実行する
## Hello Worldを試す
`cargo new`コマンドを利用してRustのパッケージを作ります。

``````console:コンソール
> cargo new hello
```

できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34410/82f4d98b-33dd-f0de-500c-85346f2588e6.png)

`cargo run`コマンドでコンパイルをして実行！

```console:コンソール
> cd hello
> cargo run
   Compiling hello v0.1.0 (D:\Develop\code-writing\rust\hello)  
    Finished dev [unoptimized + debuginfo] target(s) in 1.22s
     Running `target\debug\hello.exe`
Hello, world!
```

## for文のプログラム
for文と関数を使ったプログラムを書いてみます。

```rust:hello.rs
fn main() {
    for i in 1..=10 {
        println!("Hello, {} world!", to_ordinal_string(i));
    }
}

fn to_ordinal_string(n: usize) -> String {
    let s = match n % 10 {
        1 => "st",
        2 => "nd",
        3 => "rd",
        _ => "th",
    };
    format!("{}{}", n, s)
}
```

リリースモードでコンパイルして実行してみました。

```console:コンソール
> cargo run --release
   Compiling hello v0.1.0 (D:\Develop\code-writing\rust\hello)
    Finished release [optimized] target(s) in 0.67s                                      
     Running `target\release\hello.exe`
Hello, 1st world!
Hello, 2nd world!
Hello, 3rd world!
Hello, 4th world!
Hello, 5th world!
Hello, 6th world!
Hello, 7th world!
Hello, 8th world!
Hello, 9th world!
Hello, 10th world!
```
## イミュータブル、参照による所有権の借用
Rustの特徴である標準で変数がイミュータブル（不変）であること、所有権という概念についてもコードを書いてみました。

```rust:hello.rs
fn main() {
    // イミュータブル、不変でエラーとなる
    // let x = 1;
    // x = x + 1;
    //
    // ミュータブル、可変
    let mut x = 1;
    x = x + 1;
    println!("{}", x);

    //シャドーイング
    let y = 1;
    let y = y + 1;
    println!("{}", y);

    //参照による所有権の借用
    let s = "Welcome to Japan".to_string();
    myprint(&s);
    myprint(&s); // 共有参照のため2回目にアクセスしても大丈夫
}

fn myprint<T: std::fmt::Display>(msg: &T) {
    print!("{}", msg);
}
```

上記のようにRustでは所有権の概念を使い不要なメモリ領域を開放しているため、Javaなどの他言語にあるようなGC（ガベージコレクション）による速度低下や、CやC++にあるメモリ開放漏れによるメモリーリークが発生しない安全な仕組みを実現しています。

ミュータブルな変数はプログラミングスタイルになれないと最初は難しいですが、先に挙げたVSCodeの拡張機能を入れておけば、静的にコード解析をしてくれるため、随時エラーをあげてくれます。それで段々慣れていくことが出来そうですね。

# まとめ
今回はRustに入門してみました。
コーディングを始めるまでの環境準備や、最初の実行などにはまることもなく、すんなりスタートすることができて、快適でした。参考図書の本を開いて、文章込みでここまでで１時間くらいでしょうか。一番時間がかかったのが、C++ Build Toolsのインストール時間だったと思います。

# 参考図書
- [Software Design (ソフトウェアデザイン) 2020年6月号](https://amzn.to/3cd7dHH)
 - ちょっと試してみたいときのSDの特集はとても助かりますね。いつもありがとうございます。