OmniAICreator/Qiita-1.07M huggingface dataset:
VHDLによる簡単なディジタルフィルターの実験 / その1 / アナログ信号を取り込む

#1. 概要
まずはアナログ信号をAD変換してFPGAに取り込めるようにする。ADコンバーターはMicrochip社の[MCP3001](https://ww1.microchip.com/downloads/en/DeviceDoc/21293C.pdf)を使った。諸元は下のとおり。厳密な何かをするわけではないので何でもよい。

- 逐次比較
- 1チャンネル
- 10ビット分解能
- 外部リファレンス
- SPI通信
- VDD=V<sub>REF</sub>=2.7 Vのとき、サンプルレートは最大75 ksps、クロック周波数は最大1.05 MHz

取り込んだAD変換値は、R-2R方式のDAコンバーターでDA変換して確かめる。[こういう抵抗アレイ](https://www.marutsu.co.jp/pc/i/10749910/)があったのでそのまま使ったが、8ビットぶんしかないためAD変換値10ビットのうち上位8ビットだけをDA変換する。

FPGAはMAX10を使う。その評価ボードは[マルツオンラインにあるこれ](https://www.marutsu.co.jp/pc/i/598579/)を使う\(すでに販売終了\)。      

#2. ADコンバーター[MCP3001](https://ww1.microchip.com/downloads/en/DeviceDoc/21293C.pdf)を動かすためのVHDL

下のVHDLをコンパイルしてMAX10 FPGAに書き込む。SPIマスターモジュールは[Digi-Key TechForumで紹介されているこれ](https://forum.digikey.com/t/spi-master-vhdl/12717)をほぼそのまま使った。外部クロックは、評価ボードに載っている発振器\(48 MHz\)を使った。

ファイル一式: https://github.com/ti-nspire/VHDL_for_Quartus_Prime/tree/main/ad_converter_MCP3001_spi_ver_2

↓ こういう回路がFPGAの中に作られる。    
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193936/901a2cc0-e225-21eb-dda1-3b5fead34468.png)


#3. 全体の接続図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193936/a2e214d6-7d64-0f73-9d80-d154adac3cc3.png)


#4. 実行結果
サンプリング周波数は40 kHz、入力信号は1 kHz、1 V<sub>pp</sub>にした。黄色が入力、緑が出力。   
![scope_55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193936/134eae59-78a8-c160-8987-1bd45a9a7e95.png)
Unityで自動運転の車をバックさせる

<h1>概要</h1>
Unityで車のゲームを作成しています。
Unity Standard Aseetsのカーオブジェクトで，自動運転ができる，CarWayPointBasedを使用しています。
しかし，下のgifファイルの赤い車のように，前から壁などにぶつかると，そのまま進もうとして，動けなってしまいました。

![復帰なし.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1312991/d52c1039-b747-9c47-f65c-eef941be9efd.gif)

<h1>バック</h1>
CarAIControl.csのFixedUpdate関数ないにある
m_CarController.Move(steer, accel, accel, 0f);
を
m_CarController.Move(-steer, -accel, -accel, 0f);
に変更することで，CarWayPointBasedのカーオブジェクトをバックさせることができました。

![バック gif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1312991/1b5e53cf-d3e8-c0b2-0022-efe5d7d073b5.gif)

<h1>タグ付け</h1>
![wallタグ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1312991/3aa84fa6-24fa-d4bb-6582-a72ed32367df.png)


コースのガードレールの役割として，Cubeオブジェクトを使用していますが，このタグをwallに変更します。

<h1>大まかな流れ</h1>
今回は，CarWayPointBasedのカーオブジェクトがぶつかったオブジェクトのタグの名前がwallだった場合，カーオブジェクトをバックさせる形とします。

<h1>プログラム</h1>
CarAIControl.csのクラス上で，二つの変数を宣言します。。
wallタグに変更したCubeオブジェクトに，ぶつかった時に，trueに変更するwall_touch変数と，
ぶつかったあと，何秒かバックするため，Stopwatchクラスからtime変数を宣言します。

```
bool wall_touch = false;
Stopwatch time = new Stopwatch();
```

CarAIControl.cs内に既にあるOnCollisionStay関数に，ソースコードを付け足します。
ぶつかったオブジェクトの名前がwallだった場合，wall_touchの値をfalseからtrueに変更し，
time変数の計測をスタートします。

```
if (col.gameObject.tag == "wall")
{
    wall_touch = true;
    time.Start();
}
```

そして，FixedUpdate関数で，wall_touchの値がtrueだった場合，バックをおこない，3秒たったら，wall_touchの値をfalseに戻し，time変数を初期化し，普通の自動運転に戻る（elseの部分が実行される）仕様にしました。

```
if (wall_touch)
{
    m_CarController.Move(-steer, -accel, -accel, 0f);

    if (time.Elapsed > TimeSpan.FromSeconds(3))
    {
        time.Stop();
        wall_touch = false;
        time = new Stopwatch();
    }
    //Debug.Log(time.Elapsed);
    //Debug.Log(wall_touch);
}
else
{
    m_CarController.Move(steer, accel, accel, 0f);
}
```

<h1>テスト</h1>
実際に，自動運転している赤い車を壁にぶつけてました。
バックした後，普通に走りだしたので，やりたかったことはできたと思います。


<iframe width="560" height="315" src="https://www.youtube.com/embed/mvnMSbrUCD8" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>


<h1>参考にさせていただいたWebサイト</h1>
特定の時間ループを実行する方法
https://www.webdevqa.jp.net/ja/c%23/%E7%89%B9%E5%AE%9A%E3%81%AE%E6%99%82%E9%96%93%E3%83%AB%E3%83%BC%E3%83%97%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/973216817/

Unity Documentation スクリプトリファレンス Collider.OnCollisionStay(Collision)
https://docs.unity3d.com/ja/current/ScriptReference/Collider.OnCollisionStay.html
MacでEGGXを使う

# はじめに
EGGX/ProCALLとは、C言やFORTRAN言語用のグラフィクスライブラリです。
今回は、EGGXをMacにインストールする方法をご紹介します。これにより、わざわざVirtualBox上にCentOSを置いて...というようなめんどくさい環境構築をする必要がなくなります。
※M1では試してないので、できるかどうかわかりません。
# XCodeをインストール
App StoreからXcodeをインストールしてください。

# XQuartzをインストール
- 以下のリンク先から、XQuartz-◯.◯.◯.dmgをクリックしてダウンロードしてください。  
http://xquartz.macosforge.org/landing/
- XQuartz.pkgをダブルクリックしてください。  
    - 「〇〇は壊れているため...」といった警告が出るようであれば、こちらの記事を参照してください。  
https://560days.com/lab/2020/03/002587.php
- インストール完了後、下の「ログアウト」をクリックして、Macを再起動してください。

# EGGXをインストール
- 以下のリンクをクリックして、EGGXのインストーラをダウンロードしてください。  
http://ylb.jp/2014b/kisop2/eggxinstaller/eggx_installer.zip
- zipを解凍してください。
- 解凍されたeggx_installerをダブルクリックしてください。自動的にEGGXがインストールされます。
    - 「〇〇は壊れているため...」といった警告が出るようであれば、こちらの記事を参照してください。  
    https://560days.com/lab/2020/03/002587.php
    - 上記の方法でも警告が出る場合は、ターミナルを開いて以下のコマンドを実行してください。(bashのみです。zshを使用している方は、パスを指定してください。)
    - その後、再度eggx_installerをダブルクリックすると、Apple Scriptのエディタが出てくるので、右上の実行ボタン(矢印のやつ)をクリックしてください。Apple Scriptが実行されるはずです。
    - それでも治らない場合は、Virtual Box上にCentOSを載せてeggxをインストールする方法で頑張ってください。

```
xattr -rc (eggx_installerが保存されているパス)
```


- インストールが完了し、書類ディレクトリにEGGXというフォルダが追加されていれば完了です。
React Router v6 画面遷移先に値を送る

コンポーネント間での値の受け渡しについての記事です。

最初のページ（App.js）でLinkタグの属性stateで送りたい値を設定します。

```App.js 
import {
  BrowserRouter as Router,
  Routes,
  Route,
  Link
} from "react-router-dom";
import NextPage from './NextPage';

const App = () => {
return (
    <Router>
      <div>
        <Link to="/next" state={{test: 'test'}}>
         <h5>NextPage</h5>
        </Link>
        <Routes>
          <Route path="/next" element={<NextPage/>}>
          </Route>
        </Routes>
      </div>
    </Router>
  )
}

export default App;
```
画面遷移先のページ（NextPage.js）でuseLocation()でlocationを取得し、更にlocationからstateを取得します。
画面遷移先のページで```{"test": "test"}```が表示されます。


```NextPage.js
import React, { useState, useEffect } from "react";
import { useLocation } from "react-router-dom";

const NextPage = () => {
  const location = useLocation();
  return (
    <div>
      {JSON.stringify(location.state)}
    </div>
  )
};
```
git push時にエラーが発生した！ (fatal: Authentication failed ~, src refspec ~ does not match any.)

# はじめに
最近、大学入学時くらいに作成しただけしておいたgithubのアカウントをなんとかせにゃならんな～、と唐突に思った。
あとついでにDockerの知識確認もしたかったから、試しにDockerを使ってNext.jsのサンプルアプリでも立ち上げて、`git push origin main`してみたところ、記事タイトルのエラー発生。
しばらくハマったので戒めのために書いておくことにする。

# 環境
- OS: Linux(KDE neon 5.23.5)
- git version: なんか.22とか.23くらいの古いやつだったはず

# 発生したエラー
たしか下記の2つ。

```
fatal: Authentication failed for 'https://github.com/{your user name}/{your repository name}.git'
error: src refspec {your branch name} does not match any.
```

# 原因
原因は多分下の2つ。多分。

- push時に用いるgithubのパスワードが、アクセストークンとやらに変わっていた
- ローカルとリモートでブランチ名が違っていた（masterとmain）

超初歩的でくだらないミスなので恥ずかしい限り。

# 解決方法

### アクセストークンを取得する
パスワードの代わりに使用することになったアクセストークンとやらを取得する必要がある。
これはgithubのSettingsページから取得可能。

アカウントの`Settingsページ`へ行ったら、サイドバーにある`Developer settings -> Personal access tokens`へ。
`Personal access tokens`へ行ったら、`Generate new token`で新しくトークンを発行できる。

なにやら色々設定項目があるけども、それぞれ多分以下のような感じ。

- **Note**: トークンの使用目的（多分適当でいい）
- **Expiration**: トークンの有効期限（リポジトリに触りそうな期間を目安で設定すればよさそう）
- **Select scopes**: トークンに付与されるアクセス権限の設定（適当にrepoとdelete_repoにチェック）

はい。どうやらこれでGenerateして出てきたトークンをコピペして使用すればいいのかな。
ただネットで調べた感じ、いちいち長ったらしいトークンを入力するのは面倒って人が多いっぽい。
おまけにトークンは生成時に表示されるページで一度しか確認できないみたいだから、どこかに控えなくちゃいけない。
これが面倒な人は、ローカルのgitに登録するリモートURLに、トークンを追加してあげればいいみたい。
書き方は以下の通り。

```:.git/config
[remote ""origin]
        url = https://{access token}@github.com/{your user name}/{your repository name}.git
```

意外と単純。
ただこの方法は将来的に場合によってはセキュリティ的な問題になりやすいみたいだから、注意が必要かも。
個人で遊ぶ分にはまあどうってことなさそうではあるから、自分は気にしないけど。

### gitのブランチ名をmasterからmainに変更する
「githubのデフォルトがmainになったんだからgitも対応してくれよ（あるいは逆）」とは思ったけど、してくれないからとりあえず自分でブランチ名を変えるしかない。
これも単純で、ターミナルに以下のコマンドを打ち込めばいい。

```
git branch -m {old branch name} {new branch name}

#現在のブランチ名を変えたいなら引数短縮できて
git branch -m {new branch name}
```

今回だとmasterをmainに変えたいってことだったから、`git branch -m master main`とした。
これで多分エラーは出なくなると思う。一件落着。
「いちいち`git init`するたびに名前変えるのダルいな！」と思って、デフォルトのブランチ名変えようしたらハマった話もそのうち書くかも。

# おわりに
今回引っかかった原因は、どちらも情報としてはキャッチアップしてたのに、実際に手元で確認したり対応していないものだった。
特にgithubのデフォルトブランチ名がmasterからmainになる話なんかは結構大きかったから、やっぱりサービスの提供元からなにか大きな変更が発表されたら、しっかりとそれに対応しなくちゃいかんなー、とかなんとか。
とにかく今後こんなたわけたミスをしないように、情報には敏感に、対応は素早くを心がけたい所存。

あと、もう少し定期的にqiitaとかgithubとか更新しないとせっかく登録したのにもったいないから、そこもなんとかせねば。
【React】外部APIからデータを取得して表示する方法

## はじめに
　本記事は、プログラミング初学者が、学習を進めていて疑問に思った点について調べた結果を備忘録も兼ねてまとめたものです。
　そのため、記事の内容に誤りが含まれている可能性があります。ご容赦ください。
　間違いを見つけた方は、お手数ですが、ご指摘いただけますと幸いです。

##外部APIからデータを取得して表示する方法
Reactで、外部APIからデータを取得して表示するには、fetch()を使用し、以下のように記述します。

```.js
// Hookを使用しない場合
componentDidMount(){
        fetch("APIのURL")
            .then(response => response.json())
            .then(data => {
                this.setState({
                    character: data,
                    loading: false
                })
            })
           .catch(error =>　{
             console.error(error)
           }
        }


// Hookを使用した場合
 useEffect(() => {
     fetch("APIのURL")
            .then(response => response.json())
            .then(data => {
                this.setState({
                    character: data,
                    loading: false
                })
            })
           .catch(error =>　{
             console.error(error)
           }
        }, [])

```
fetchメソッドはComponentDidMount内で行います。

`fetch(APIのURI)`：APIを取得する

`.then(response => response.json())`：データ取得完了後、取得したPromise型の値をオブジェクト化

`.then(data => …)`：「…」に必要な処理を記述

`.catch()`: エラーの場合の処理を記述
ubuntuでディレクトリの変化を監視する


ubuntuでディレクトリの変化を監視するには`inotifywait`を使えばOK

インストール

```
sudo apt install -y inotify-tools
```

監視

```bash:${TARGET_DIRECTORY}を監視し続ける
inotifywait -r -m ${TARGET_DIRECTORY}
```

オプションの意味

```bash
$ inotifywait -h
	-r|--recursive	Watch directories recursively.
	-m|--monitor  	Keep listening for events forever.  Without
	              	this option, inotifywait will exit after one
```

#参考
[inotifywaitによるディレクトリの監視とスクリプト実行](https://qiita.com/acucumber/items/65ea2c90ebe9634521f9)
[Linuxでファイル・ディレクトリ監視を行う『inotify』](https://orebibou.com/ja/home/201504/20150416_001/)
VimでDeepL翻訳のプラグインを使う (無料版対応)

# deepl.vim

DeepLはGoogle翻訳よりも精度が高いとされる翻訳サービスです。
2021年7月よりDeepL API Freeという無料プランが追加されました。
1ヶ月あたり500,000文字まで使うことができます。

deepl.vimは、Vim、NeoVimの両方でDeepL翻訳を利用できるプラグインです。

https://github.com/ryicoh/deepl.vim

## デモ動画

https://user-images.githubusercontent.com/37844673/148679023-6814c111-6ada-4279-99ea-cd29afc6a1f3.mov

## インストール方法と使い方

### DeepLアカウント作成

まずは、DeepLのアカウントを作成します。作成はもちろん無料ですがクレジットカードが必要になります。

[deepl.com](https://www.deepl.com)

登録が終了したら次は`AuthKey`を取得します。

`AuthKey`はアカウントページの一番下から、`Authentication Key for DeepL API` の部分にあります。

[アカウントページ](https://www.deepl.com/pro-account/summary)

### curlのインストール

内部的にcurlを利用していますので、インストールしてください。

MacOSならbrewから入れられます。

```bash
brew install curl
```


### deepl.vimのインストール

[vim-plug](https://github.com/junegunn/vim-plug)を使う場合はvimrcに以下の１行を追加します。
設定には、deeplのFree用URLと先ほど取得した`AuthKey`とキーマップを設定します。


```vim:.vimrc
Plug "ryicoh/deepl.vim"

" フリー版のエンドポイントを指定
let g:deepl#endpoint = "https://api-free.deepl.com/v2/translate"

" 先ほどコピペしたAuthKeyを指定
let g:deepl#auth_key = "00000000-0000-0000-0000-000000000000:fx"

" キーマップを指定。t => CTRL+j で日本語変換、t => CTRL+e で英語変換するように設定します。
vmap t<C-j> <Cmd>call deepl#v("JA")<CR>
vmap t<C-e> <Cmd>call deepl#v("EN")<CR>
```

翻訳したい英語をvで選択した後に、t を押して CTRL+j を押すと、選択部分が日本語に変換されます。
キーマップの`t`は、元々は`f`同様に横方向の1文字検索に使うのですが、
`t`のあとがCTRLを押しながらの場合は特に何もしないため、このマッピングにしています。
翻訳を意味する`translation`の`t`と`japanese`の`j`か`english`の`e`と覚えてください。

### DeepL プロ版

プロ版を利用する場合は、エンドポイントを以下に設定してください。
プロ版の値段2022年1月現在で630円+従課金です。
1,000,000文字あたり2500円で、少しお高いような気も。。？

```vim:.vimrc
let g:deepl#endpoint = "https://api.deepl.com/v2/translate"
```
Power Query の「値の置換」にて列の値を使用する方法

Power Query エディタから「値の置換」を用いると列から特定の値を置換することができますが、指定できるのは文字列のみで、条件列を追加するときのように他の列の値を指定することができません。

そこでM式のクエリを直接編集して、置換後の値に列の値を指定する方法や、置換するための条件に数式を用いる方法について、下記テーブルを元データにして解説します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8721/4603e4d5-aa40-d3ba-6210-8d59ca7e4d38.png)

# 「値の置換」を使って ReplaceValue クエリを追加する

Col3 から 'empty' を検索して、 Col1 の値で置換させようとすると、「置換後」のテキストボックスに列名を指定したとしても、文字列として解釈されるため意図した結果になりません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8721/09739e1d-bf1c-a125-09d6-43155f22c683.png)

``` :クエリ
= Table.ReplaceValue(
        変更された型,
        "empty",
        "[Col1]",
        Replacer.ReplaceText,
        {"Col3"}
    )
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8721/10b6702f-bbe1-5409-73c8-d45cfde40aae.png)

# 置換する値に列名を指定する方法

[ReplaceValue](https://docs.microsoft.com/ja-jp/powerquery-m/table-replacevalue) の newValue 引数を each キーワードを使って書き換えると Col1 の値で置換する事ができます。

``` :クエリ
= Table.ReplaceValue(
        変更された型,
        "empty",
        each [Col1],
        Replacer.ReplaceText,
        {"Col3"}
    )
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8721/2a5b2161-d5f7-e2f2-daa7-7f571caeb140.png)

# 検索する値をif式で指定する方法

oldValue 引数に元の列名を使用すればReplaceValueの検索値に必ずヒットするようになるため、newValue 側でif条件式を詳しく記入することもできます。

``` PowerQuery:クエリ
= Table.ReplaceValue(
        変更された型,
        each [Col3],
        each if Number.Mod([Col2], 2)=0 
            then [Col3] 
            else [Col1] ,
        Replacer.ReplaceText,
        {"Col3"}
    )
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8721/15b6e7e0-a2c2-0cb0-3a05-f2b72f48421d.png)
Githubに画像を上げて自動的にwebpに変換するファイルホスティングサーバーを作る

## 画像ファイルのアップロード先
https://github.com/shimajima-eiji/__Backup_Images

## ソースコード
https://github.com/shimajima-eiji/__Backup_Images/blob/main/.github/workflows/convert_webp.yml

## 使い方
リポジトリに画像ファイルを上げる
以上！

## ymlでやっていること
1. webpパッケージをインストール
    1. (今回はUbuntu:latestを使っているので`sudo apt install webp`。Macなら`brew install webp`)
1. リポジトリ内のファイルを全てチェックして、見つけたファイルをwebpに変換する
    1. この時、webpに変換できなかったファイルは無視する(cwebpコマンドの挙動)
1. （詳細は後述）webp変換したらpush、変換していないなら何もしない

ソースコードは実際に運用しているスクリプトなので、チェックロジックをバシバシ入れていますが、やっている事は上記の通りです。
エッセンスを抽出すると`cwebp "(from)" -o "(to)"`の部分。

## 2022/01/11 追記。もっと簡単で直感的な方法
ymlはコマンドの集まりではなく、一つのshellファイルとみなして考えたほうがよさそうです。
Github Actionsの仕様を考えていましたが、保守性や教育コストを考えるとこちらの方がシンプルでした。

``` .yml
（中略）
# 説明のため、echoにしたが実際は処理がいっぱい
- name: sample
  run: echo 0  >file2webp.log

# webp変換した場合(結果が0以外)のみ処理する
- name: Commit files
  run: |
    if [ $(tail -n 1 file2webp.log) -ne 0 ]
    then
      rm file2webp.log  # 先にログファイルを消さないと、ログファイルもpushしてしまう
      git config --global user.email "${{ secrets.EMAIL }}"
      git config --global user.name "${{ secrets.USER ​}}"
      ​git add -A
      ​git commit -m "[Update]converted webp by Github Actions"
      ​git pull
      ​git push
      ​echo "[COMPLETE] convert to webp."
    ​else
      ​echo "[SKIP] No convert."
    ​fi
```

これなら、GithubActionsを知らなくてもif文で処理できます。
GithubActionsで変数を持たせると制御が分かりにくいので、今回のようにファイルに書き出して捨てた方が直感的でした。

## （非推奨）webp変換判定をGithubActionに渡す
まず、これがとんでもなく難しかったです。
まずshellの実行結果を受け取る必要がありますが、

- shellファイルは戻り値を持たない（実行結果は受け取れる）　　→ 0で正常終了、0以外で異常終了。ただし255件を超えると予期せぬ挙動が起こる可能性がある
- 出力を実行結果にする方法がある　→　他の出力が欲しいので使えない

という、強烈な問題があります。

次に、shellの結果を受け取れたとしても、Github Actionsで条件判定する方法とはまた別の話なので、これらを解決する方法が必要になりました。

### shellの結果を受け取る
急遽、shellスクリプト側に件数を出力する処理を追加しました。
GithubActionsのログに表示をさせたいのと、255件を超える数値を条件処理に使いたいのでどちらも満たせるのが`tee`コマンドです。
シンプルに0であればfalse、0以外であればtrueにして渡す方法もありましたが、shell側に責任を持たせるのは違うので、せめて意味のあるものとしてwebp変換した数を出力させるぐらいはやらせる事にしました。
shell側ができる精一杯の譲歩です。

### Github Actionsで条件処理
https://qiita.com/ljourm/items/556f5ccc8425891865de

ほぼこちらを参考にしました。
デバッグの方法を書いてもらっていたのがとても助かりました。

``` debug.yml
- name: output step context
  run: echo $CONTEXT
  env:
    CONTEXT: ${{ toJSON(steps.check_something) }}
```

この時の条件処理で欲しいのは「webp変換をしたファイルがあるのかどうか」だけなので、`tee`で作ったファイルを`tail -n 1`で取得すれば件数だけ取れるので、あとはtrue(success)=0 / false(failure)=0以外で取得すれば良いです。
従って、

``` convert_webp.yml
steps:
# （中略）
  # webpに変換したファイル数を取得（残念ながら仕様のため変換0でtrue / 変換したら1以上になりfalse)
  # 0/1〜を出力しているのはcurlしたスクリプトの最終出力で件数を表示している
  - name: result check
    id: result
    run: tail -n 1 file2webp.log
    continue-on-error: true
# （中略）
# webp変換した場合のみ処理する
  - name: Commit files
    if: steps.check_something.outcome == 'failure'
    run: ...
```

上記の方法で取得できます。
後は生成したファイルのrawを取ったり、ダウンロードをすれば良いです。[^1]
[^1]: 【作成したwebpファイルをダウンロードする】[WEBP変換ツール](https://lab.syncer.jp/Tool/Webp-Converter)とかがあるので、こちらを使った方が楽です。

## リポジトリの軽量化について
ここまでにリポジトリに画像を上げたらwebpに変換してくれる上、ファイルホスティングもしてくれるWebサーバーが手軽に作れます。
もし元ファイルが不要なら、

``` sh
git pull
git filter-branch --tree-filter "rm -fr ${元ファイルのpath}" HEAD
git reflog expire --expire=now --all
git gc --aggressive --prune=now
git push -f
```

を実施すると、元ファイルも履歴から削除できて多少軽量化できます。

### 注釈
【Java文法】リスト(List)

こんにちは、コイキングです。

本記事では'リスト(List)'について、説明したいと思います。

******

# 1. リスト(List)とは？
リストはJavaでデータ構造とデータを取り扱うためのコレクションフレームワークに属するインターフェースです。
配列のように**順序があるデータを格納するためのデータ構造**で、リストを実装しているクラスはArrayList, LinkedList, Vectorなどがあります。

# 2. ArrayList
## 1) アレイリスト(ArrayList)とは？
'ArrayListは**長さが変更できる配列'**のようなデータ構造です。
ArrayListのクラス内部を見れば**配列を使いデータを格納している**ことが分かります。

※ 長所
- 配列のように**インデクスを使い、速やかに要素にアクセスできます。**

※ 短所
- **長さが変わる際の処理に時間がかかる。**
　リストにデータを入れてみるとリストの内部のデータを格納する配列の長さを超える場合がある。この時長さを増やした新しい配列に既格納していたデータをコピーする処理が行われる。
- リストの**各要素の削除処理に時間がかかる**

※ 主に使われているところ
- リストに格納するデータの量が一定的で、データの入力・削除が少ないところ。
- データのアクセス速度が重要なところ。


## 2) データの挿入
add()メソッドを使いデータをリストに格納できます。

```
List<String> list = new ArrayList<String>();

list.add("ArrayList-String01");  // Index 0 
list.add("ArrayList-String02");  // Index 1
list.add("ArrayList-String03");  // Index 2
list.add("ArrayList-String04");  // Index 3
list.add("ArrayList-String05");  // Index 4
```

## 3) データの出力
### インデクスを指定して出力
get()メソッドにインデクス番号を渡して、データにアクセス・出力できます。

```
System.out.println("Index 2番のデータ出力 : "+ list.get(2));
```

### 全体データ出力(for-each)
拡張for文を使うと簡単に全体データが出力できます。

```
for (String str : list) {
    System.out.println("Using for-each : "+str);
}
```

### 全体データ出力(for文とインデクス番号)
for文とインデクス番号、get()メソッドを使い全体データを出力できます。

```
// ※ sizeメソッドにて、リストの長さが分かります。
for (int i=0; i<list.size(); i++) {
    System.out.println("Using for Index ["+i+"] : "+list.get(i));
}
```

### 全体データ出力(forEachメソッド)
forEach()メソッドを使うと簡単に全体データが出力できます。

```
list.forEach(str -> {
    System.out.println("Using forEach() : "+str);
});
```

## 4) データ更新
set()メソッドにインデクス番号と更新する値を渡して、データを更新できます。

```
list.set(1, "ArrayList-String020202"); 
printList(list);
```

## 5) データ削除
### インデクス番号を指定して削除

```
list.remove(1);
printList(list);
```

### 値を探して削除

```
list.remove(list.get(2));
printList(list);
```

### 全ての要素を削除

```
list.clear();
printList(list);
```

# 3. LinkedList
## 1) リンクドリスト(LinkedList)とは？
LinkedListはデータの格納を配列ではなく**'ノード(Node)'を使い実装したデータ構造で、ノードとノードが相互繋がっているような形でデータを格納します。

※ ノード(Node)とは？
以前のノードの参照値と次のノードの参照値、格納するデータを込めているオブジェクトを言います。

※ 長所
- データの入力・削除が速い

※ 短所
- データの検索に時間がかかる

※ 主に使われているところ
- データのアクセス・検索より入力と削除が多い場合使います。

※ データCRUDはArrayListと共通のメソッドを使いますので省略。


# 4. Vector
## 1) ベクター(Vector)とは?
VectorはArrayListのように**長さが変わる配列のようなデータ構造**です。
性能自体がArrayListの方がよいため、Vectorはあまり使われておりません。
ArrayListとの差は**Vectorの場合Thread-safeし、ArrayListはそうではないため、コードをThread-safeに実装する必要がある場合は使いますが、
現在、ArrayList生成時に synchronizedList()を引数として生成すると
ArrayListでもThread-safeなArrayListが生成できるため、使う理由はあまりないが、レガシーコードに使っている可能背があるため知っておくだけで良いかと思います。

```
// ※ 例示 : 
ArrayList arrayList = new ArrayList<>(Collections.synchronizedList(list));
```

※ データCRUDはArrayListと共通のメソッドを使いますので省略。

******

※ 例示コード
https://github.com/leeyoungseung/algorithmBasic/blob/master/algorithm/src/basic/B_11_List.java﻿

※ 韓国語のポストは以下のURLで確認できます。
https://koiking.tistory.com/83?category=1068655
集中力を維持するためのポモドーロタイマー

学内の学生主体で進めるプロジェクトで「ユーザの集中力を持続させるシステム」を構築する機会がありました。

その際にポモドーロタイマーを用いて休憩時間を管理してくれるアプリを作成致しましたので、その内容について少しだけ触れさせて頂きます。

まず今回使用したのはReact Nativeです。iosとandroidの双方に対応できるクロスプラットフォームフレームワークを使用したいという理由から使用しました。

![Screenshot_20220110-015520_project1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2488482/7170aeca-6619-6bd5-c219-5c5e1918db46.jpeg)

上の画像が実際のアプリ画面です。
左上にタスクに取り組む時間を、右上に休憩時間を打ち込み、開始ボタンを押します。

指定した時間が過ぎると端末が振動し、テキストが変化します。

![Screenshot_20220110-015956_project1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2488482/75caff98-951a-5b5d-9d11-d889c19243d3.jpeg)


簡単かつシンプルですが、作っていて楽しかったのでよし！！
JIS配列とUS配列を共存させる理想のキーボード設定（Windows）

# 目的
**ラップトップPCのキーボードはJIS配列だが外付けキーボードでUS配列を使いたい** 
という状況での使いやすい状態を目指す

# 方法

- [alt-ime-ahk](https://github.com/karakaram/alt-ime-ahk)をインストール
- [Ule4Jis](https://www.vector.co.jp/soft/winnt/util/se476294.html)をインストール
- 上記2つのプログラムをスタートアッププログラムに追加（キー配列はJIS配列設定のまま）

# どういう設定になるのか
- 【alt-ime-ahk】スペースキー横の`alt`や`変換/無変換`で英数・ローマ字切替（Macのように左を押すと英数，右を押すとローマ字モードになる）
- 【Ule4Jis】起動時にUS配列としてキーボードが認識される
    - JIS配列に戻したい時はタスクバーのアイコンから「エミュレーション停止」
- 【Ule4Jis】capsキーで英数/ローマ字切替

# 最後に
現状のベストプラクティスなので、改善案お待ちしてます
[この動画](https://www.youtube.com/watch?v=hJ_bX5EvCSg&list=TLPQMTAwMTIwMjIJ4nDr2QqqyQ&index=6)にあるソフトも便利ですね～
mac m1 dockerでエラーが起こるときに試したいこと

# 結論
dockerでパッケージをインストールしているときに、`• directory not found`というエラーが出てしまったことがあった。
結論として、今まではarm64を使っていたのだが、m1からamd64を使用していることからコンテナ内のディレクトリ構成が変わってしまったことが原因であった。
そのため、Dockerfileを作成する際には以下のように記述をする必要がある。

```
# --platform=linux/x86_64 をつける
FROM --platform=linux/x86_64 イメージ名
```
deviceを使わないrequest specの基本的なテスト（Userモデルver.）

# まずは超基本テスト

WebブラウザからWebサーバーへHTTPリクエストを送り、Webサーバーから正常なHTTPレスポンスが返ってくるとき、そのHTTPレスポンスのHTTPステータスコードは`200`を返します。

```spec/requests/user_spec.rb
require 'rails_helper'

RSpec.describe "Sessions", type: :request do
  describe "GET users" do
    let(:test_user) { create(:user) }

    before do
      session_params = { user: { email: test_user.email, password: test_user.password } }
      post "/login", params: session_params #コメント①
      get posts_path #コメント②
    end

    it "つぶやき一覧ページのリクエストが成功していること" do
      expect(response).to have_http_status(200)
    end
  end
end
```

**コメント①**
自分は`device`というgemを使用していないのでログインを手書きしました。（何やらdeviceを使えば`sign_in`というヘルパーメソッドを使ってこの部分を表現できるらしい）
自分の場合だと以下のコントローラーのように[:user]の中に[:email]を入れているのでそういう構造になるように`session_params`を設定しました。
この設定はこちら↓の記事を参考にさせていただきました。
[Rspecでサインインメソッドを共通化して切り出す(devise使わないとき)[system spec][request spec]](https://qiita.com/tanutanu/items/14b0a1729069b53aa5b8)

```users_controller.rb
def login
    @user = User.find_by(
      email: params[:user][:email],
      password: params[:user][:password]
    )
...省略...
end
```

**コメント②**
userはresourcesを使ってルーティングしているのでurlの指定が少し独特です。
_pathヘルパーを使ってコントローラ#アクションを指定するのに、以下の記事が大変参考になります。
[Railsのルーティングまとめ](https://qiita.com/srkw___/items/2f65ef53e06e86930faa)

#テストちょっと増やしてみる

```spec/requests/user_spec.rb
require 'rails_helper'

RSpec.describe "Sessions", type: :request do
  describe "GET users" do
    let(:test_user) { create(:user) }
    let(:test_post) { create(:post, user: test_user) } ########### 追加 ###########

    before do
      session_params = { user: { email: test_user.email, password: test_user.password } }
      post "/login", params: session_params
      test_post ########### 追加 ###########
      get posts_path
    end

    it "つぶやき一覧ページのリクエストが成功していること" do
      expect(response).to have_http_status(200)
    end

    it "つぶやきの内容を取得していること" do ########### 追加 ###########
      expect(response.body).to include test_post.content
    end
  end
end
```

ログインした後に`test_post`を作成してからpost一覧ページへ飛んでいます（`get posts_path`）。
これでつぶやきの内容がレスポンスでやってきたwebページに含まれているかテストしています。

post一覧ページへ飛ぶ（`get posts_path`）前に`test_post`と一行書いてあるのがポイントです。
今回は遅延評価の`let`を使用しているので、`test_post`が参照された時に`let`の行が実行されます。したがって、ここで`test_post`を加えないと`test_post`が作成されないままpost一覧ページへ飛んでしまうのでエラーになってしまいます。

# 参考
その他参考にさせていただいた記事です。ありがとうございました。
[Railsチュートリアル(3章〜8章) request specを用いた実装](https://qiita.com/Jwataru/items/2cac90cc9bca4f76bb11)
[rspecのrequest specでうまくいかない時の原因調査のちょっとしたハック](https://qiita.com/SoarTec-lab/items/9214150bae70f4b590b2)
GASでLINE Bot開発時のログ出力方法

# やりたいこと
GAS（Google App Script）でLINE Botを開発している際、エラーなどが起こってもログが見れない！ということがありました。

エディタ上で実行したGASのログはここから見れますが、ウェブアプリのログは見れないようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638864/bbeb199c-6bf7-1f98-6978-0b5a4c55abba.png)

GCPと紐づけることで、このように`Cloudのログ`項目が活性化しログが確認できるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638864/7c08bb40-9875-886b-dedf-2dd19e9b5afc.png)

# 実際にやってみる

まずGASのプロジェクトの設定を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638864/d3cffe92-6a66-3df6-7a00-8b0d3e2c0255.png)

「プロジェクトを変更」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638864/957e0fa8-2fd9-7d73-bb30-3e7f6cf7ddbe.png)

「こちら」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638864/85a16b20-4ace-7031-1c2a-aaf62d2805c7.png)

GCPが開くので、新しいプロジェクトを作成し、
[APIとサービス]→[OAuth同意画面]に移動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638864/0b8ae4f4-e4a6-bac1-443e-9cac553ebdee.png)

外部を選択して、「作成」を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638864/12ba0ec0-3c6b-3821-145f-f2ad3af87263.png)

「アプリ名」、「ユーザーサポートメール」、「メールアドレス」が必須ですが、適当に設定していきます。
他の必須じゃない情報は特に変更不要です。

公開ステータスをテストから本番に変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638864/2756cf48-85c6-5d4c-0836-813686e13ed9.png)

ダッシュボードに戻り、表示されているプロジェクト番号をGASの方に設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638864/fa31c49d-0b3c-d5f8-711f-962874972915.png)

アプリを再度デプロイしなおしてください。

認証が求められると思うので、認証してください。

これで、LINE上で発言するなどしてGASのWebアプリを動かします。

GCPの検索ボックスからログエクスプローラを検索して起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638864/14632410-3a2a-e858-3376-1532f5342384.png)

すると！
ログが表示されているはずです！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638864/f01aaad2-a62a-8f9e-2b6f-ea9ea4a963ed.png)

コチラの画面からもGCPに飛べますが、変なクエリが実行された状態で、うまくログが見れませんでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638864/7c08bb40-9875-886b-dedf-2dd19e9b5afc.png)

その場合は、「クエリをクリア」を押すとうまく表示されるかもしれません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638864/90c4aad8-33bf-9fe8-a100-c80ff8d1af1e.png)



これで皆さんの開発がはかどれば幸いです！
API Gateway のアクセスログを取得してみた

# はじめに

[前回の記事](https://qiita.com/sugimount-a/items/6b9b7bb39eca9592bf5a)では、API Gateway から直接 SQS に連携する方法を確認しました。Lambda を挟んでいない分シンプルになったメリットがありますが、Lambda 側でアクセスログを出すことが出来ません。そこで、API Gateway 側でアクセスログを出力することが出来ます。リクエストの Body などを含めた出力もできますので確認していきましょう。



# API Gateway の IAM Role 設定

AWS アカウントの中で、リージョン単位で共有される CloudWatch Logs の出力に使う IAM Role の設定が必要です。

API Gateway 用の IAM Role を作成し、ARN を設定しておきます。

![image-20220110003713646.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/47b940e2-a5fb-73c6-50a6-23344fa43140.png)



# API Gateway でログ設定

API Gateway の Stage 上の設定で、[Logs/Tracing] のタブがあります。これで設定を有効にすることで、CloudWatch Logs にアクセスログを出力できます。

![image-20220109233301536.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/b04b98af-f31e-8f13-8cc1-69d7ad12b8db.png)



また、Method 単位でも有効化が可能です。

![image-20220109235146884.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/9a248f7c-c8a3-2a51-24b1-624fa3b4aefa.png)



# CloudWatch Logs の確認

上記の設定で CloudWatch Logs に出力する準備ができました。簡単ですね。実際に API Gateway にアクセスしてログを確認してみましょう。curl で API Gateway にアクセスします。

```
> curl -s -H 'Content-Type:application/json' \
      -X POST \
      https://uuy6eahto0.execute-api.ap-northeast-1.amazonaws.com/prod/sqs-queue \
      -d '{"test1":"data1", "test2":"data2"}' | jq .
{
  "SendMessageResponse": {
    "ResponseMetadata": {
      "RequestId": "73de415b-ace3-5f5d-9b2d-1b0eadf1aa21"
    },
    "SendMessageResult": {
      "MD5OfMessageAttributes": null,
      "MD5OfMessageBody": "58fdfbfc48f868b6b9c50b3e8aa09894",
      "MD5OfMessageSystemAttributes": null,
      "MessageId": "8f194668-ad74-4207-b4c7-8b6bebdbf35b",
      "SequenceNumber": null
    }
  }
}
```



API Gateway の ID を調べます。

```
uuy6eahto0
```

![image-20220109235911008.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/d75ee42d-8094-861d-fbb1-44862a416696.png)





CloudWatch Logs 上で ID を使って検索してみると、Log Group が引っかかるのでこれをクリックします。

![image-20220110000055170.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/a9437d7a-fd5c-277f-133c-1a871e2adf91.png)



適当に Log Stream を選択します。

![image-20220110002648431.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/9ef5b879-2b6f-9f3e-2272-b260ff5bb83f.png)



API Gateway 上のアクセスログが出力されます。リソースのパスや、Request Body なども確認できます。

![image-20220110002904980.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/6aef0dc4-a840-25dd-4754-2e9c58dbe984.png)



 # この検証を通じてわかったこと

- API Gateway の CloudWatch Logs 用の Role は、リージョンで共有される  Role となる。東京リージョンにある複数の API Gateway のうち、1個の API Gateway で設定すれば、他の API Gateway にも設定が反映される。
- API Gateway の Request Body は、標準のアクセスログ出力機能で出力される。出力の仕方をカスタマイズしたい場合は、カスタムアクセスログの設定も可能
PHP8.1でPECLが使えなかったので修正した話


PHP8.1にバージョンアップしpeclでインストールを行おうとした際に発生した問題です．解決方法まで書いていきます．

### 基本情報
```
$ cat /etc/os-release
NAME="Ubuntu"
VERSION="20.04.3 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.3 LTS"
VERSION_ID="20.04"

$ php -v
PHP 8.1.1 (cli) (built: Dec 31 2021 07:26:20) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.1.1, Copyright (c) Zend Technologies
    with Zend OPcache v8.1.1, Copyright (c), by Zend Technologies
```

## 問題
MongoDBとの接続のためPHPのドライバーを入れる際に発生しました

```bash
$ sudo pecl install mongodb
PHP Warning:  foreach() argument must be of type array|object, null given in /usr/share/php/PEAR/Command.php on line 249
XML Extension not found
```

XML拡張機能が見つからないようです。

## 解決
ということでXML拡張機能をインストールします

```bash
$ sudo apt-get install php-xml php8.1-xml
```

---

最後に問題のあったコードを再度実行します

```
$ sudo pecl install mongodb
WARNING: channel "pecl.php.net" has updated its protocols, use "pecl channel-update pecl.php.net" to update
downloading mongodb-1.12.0.tgz ...
Starting to download mongodb-1.12.0.tgz (1,392,375 bytes)
...................................................................................................................................................................................................................................................................................done: 1,392,375 bytes
633 source files, building
```

問題なく実行できたのでOKです。
[Ruby] Stringクラスのinclude?メソッド

学習したことのアウトプットとして

# include?メソッド
Rubyの組み込みライブラリ
指定した値が含まれているかを判定するメソッド
指定した値が含まれている場合はtrueを、含まれていない場合はfalseを返り値として返す

### Arrayのinclude?メソッドを使用する場合
指定した値が、配列中に含まれているかを判定する

```ruby
a = [ "a", "b", "c" ]
a.include?("b")       #=> true
a.include?("z")       #=> false
```




### Stringのinclude?メソッドを使用する場合
文字列中に部分文字列が含まれていれば真を返す

```ruby
"hello".include? "lo"   #=> true
"hello".include? "ol"   #=> false
"hello".include? ?h     #=> true
```

※補足等がありましたらコメントいただけると幸いです
【覚え書き】Ubuntu 21.10で『NEUTRINO』を用いて『東北ずん子』氏とかに歌って頂く方法

[既に先駆者がいらっしゃる](https://qiita.com/momongaclub/items/fee4fa691f2cd1f8ea24)のだが、少しキャッチーな情報を自分で加えておく。

# お断わり
* 公式ページのニュースでも[簡易な解説](https://n3utrino.work/596/)は書いてある上、上述した先駆者の方の情報でも足りない方向けの記事 **ではない** 。
* ダウンロードした『[NEUTRINO](https://n3utrino.work/)』のファイル内容を弄れる事(テキストエディタがあればできる)。

# 「くそ長い、はよ言え。コマンドの意味は判るし、Typoもフツーに見付けれるし、自己責任はフツーだろ」な方向け
1. 『NEUTRINO』のダウンロードと展開。必要があれば初めのうちに好みの歌声ライブラリもダウンロード。
1. ついでに `sudo apt install gcc; pip3 install numpy scipy` もしておくと良いかと。
1. `cd /path/your/NEUTRINO/`
1. `find . -type f -name '*.sh' -exec sed -i -e 's/python/python3/g'`
1. `find . -type f -name '*.py' -exec sed -i -e 's|/usr/bin/python|/usr/bin/python3|g'`
1. `./NSF/conifg.py` ファイル内の `python_cmd` に代入する文字列を `python3` にしておく。
1. `./Run.sh` を叩いて様子見。 `./output/sample1_syn.wav` が生成されていれば問題無いでしょう。

なお『CUDA』や『[ROCm](https://rocmdocs.amd.com/en/latest/index.html)』については触れない。なぜなら *筆者の手持ちのマシンを新調する前に、お役所の福祉の窓口のお世話になる程度に大貧民と堕ちた* からである。

# 『NEUTRINO』実は『Sinsy』の血を継ぐフリーソフトウェア
https://twitter.com/SHACHI_NEUTRINO/status/1201856414844641280

曰く；
> 使用しているフレームワークはこちらになります。
Sinsy（http://sinsy.sourceforge.net）
WORLD（https://github.com/mmorise/World）
chainer（https://chainer.org）
NSF（https://github.com/nii-yamagishilab/project-CURRENNT-scripts）

という事でばっちり『Sinsy』の名が挙がっている。

実は[公式ページの簡易な説明](https://n3utrino.work/596/)での；
> 3.（NSFを使う場合のみ）Python及びpip、numpy、scipyをインストール
> 4.（NSFを使う場合のみ）nvidia-driverをインストール
> 5.（NSFを使う場合のみ）CUDA Toolkitをインストール

を飛ばして実行できるので筆者の様な、
「5年落ちハードのUbuntuマシン」
しか無い様な大貧民でも『NEUTRINO』に歌ってもらえる事を付け加えさせて頂く。

とはいえ、『NSF』の機能内でビデオカードを用いなくても個人的には及第点を越えた音声が生成されるので、
Python周りの環境整備をしておくと幸せなUbuntuでの『NEUTRINO』Pデビューを果たせるかと存ずる。

# 本題『東北ずん子』氏に歌ってもらう
とっても簡単だった。しかし改善・ハックできそうな所は割とある；

1. ダウンロードしたライブラリの `.zip` ファイル内にフォルダ(ディレクトリ)名が **全て大文字** のフォルダを **丸ごと** `NEUTRINO/model` に展開する。
1. `./Run.sh` の `ModelDir=` の値を、上の工程で入れたフォルダ(ディレクトリ)名に書き換える。
1. `./Run.sh` を実行。コーヒータイム。

これで『東北ずん子』氏の歌う『春が来た』が `./output/` 配下に出たらバッチグー！

ただし、
「毎度書き換えるのも少し使い辛いので、CLIラッパーを作っても良いのかもしれないなー」
と思った。


# WANT: 他調査したい事
* 『ROCm』で『CUDA』の実行いける？
* [『ROCm』の『Kernel module』(`amdgpu-dkms`)](https://rocmdocs.amd.com/en/latest/Installation_Guide/Installation_new.html#install-the-kernel-mode-driver-and-reboot-system)単体でも『CUDA』の処理はできるのかな？
  * XanModカーネル使いたい。

-------

※姉妹記事で「Ubuntuで創作活動を本気でやりたい方の為の記事」が[あったり](https://crieit.net/posts/ubuntu-desktop-midnight-maximum-tune)します。
【VScode】Draw.io


# プラグイン
![【VScode】図.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1483743/766da8c0-33b4-5252-5145-588ceee8581b.png)


# 参考文献
https://qiita.com/riku-shiru/items/5ab7c5aecdfea323ec4e
既存のGitHubリポジトリをクローンしてAndroid開発を始めるメモ（MacOS）

## はじめに

　この記事は、以前のチーム開発準備時に使っていたメモを、一部書き換えたものです。<br>
　GitHubのクローンするところから始めて、コミットをプッシュするところまで進めます。<br>
　Git/GitHubやAndroidStudioの導入は済んでいる前提です。<br>
## 手順
### GitHubから既存のリポジトリをクローンして開く
1. `command`+`space`でSpotlight検索を開き、`terminal`と打って出てきたターミナルを選択、起動してください。<br><br>

2. AndroidStudioProjectsフォルダ内に移動します。
自分の環境ではフォルダはユーザー直下（ターミナルを開いた状態でユーザーにいます）にあったので、`cd AndroidStudioProjects`と打って移動します。<br>
フォルダがない場合は`ls`や`pwd`コマンドなどを使って探してみてください。<br><br>

3. クローンする前にgitがあることを確認します。
`git`と打ってたくさんメッセージが出てきた場合は大丈夫です。 
`git clone [リポジトリのURL]`と打ってクローンします。<br>
この時、GitHubアカウントのログインを求められることがあります。
[アカウント名] （例:yuto5176）と[パスワード]を入力してください。  
クローンできた場合はAndroidStudioProjectsの階層下に`[リポジトリ名]`のフォルダが追加されているはずです。<br><br>

4. AndroidStudioを開き、`Open an Existing Project`からAndroidプロジェクトのフォルダを開きます。
自分の場合、場所は `[Macのユーザー名]/AndroidStudioProjects/[リポジトリ名]/Android`にありました。<br>
フォルダを開いたら、ビルドができるか確認します。
キーの`control`+`R`を押すか、AndroidStudio画面の上方にある三角のボタンを押してください。<br>

### コードを書き換える
　※ このメモを作った時点で作りたてのプロジェクトファイルだったため、
　　HelloWorldのメッセージを変えてもらうことで試してもらいました。

1. `option`+`f12`と打つか、左下にある`Terminal`を押してターミナルを開きます。先ほど開いたターミナルと同じものです。
<img width="389" alt="スクリーンショット 2021-10-14 16 09 51" src="https://user-images.githubusercontent.com/52201217/137278226-25df5498-bc6d-4746-a6e4-b82262b5f84f.png"/><br>
`git checkout -b [任意のブランチ名]`と打ってブランチを作り移動します。
`git branch`と打って作ったブランチにいることを確認してください。<br><br>

2. AndroidStudioに戻り`app/res/layout`の中にある`activity_main.xml`を開いてください。
<img width="297" alt="スクリーンショット 2021-10-14 16 09 16" src="https://user-images.githubusercontent.com/52201217/137278080-8acd9679-7c75-40f7-b2ad-81e5f26e8cab.png"/><br>
右上の`Design`の横にある`Code`のボタンを押しプログラムの表示にしてください。
<img width="463" alt="スクリーンショット 2021-10-14 16 08 25" src="https://user-images.githubusercontent.com/52201217/137278339-c6c9868e-c1f7-4fa7-92d5-d41a31e5b6f2.png"/><br>
HelloWorldと書いてある文を好きな文章に変えて保存してください。<br>

### 変更をコミットしてGitHubにプッシュする
3. 前章2で開いたターミナルに戻ります。<br><br>
`git add .`で全変更ファイルを追加し、<br>
`git commit -m "[任意の変更メッセージ]"`でコミットして変更を保存、<br>
`git push origin [先ほど作ったブランチ名]`でプッシュをしてGitHubに送ります。
<br><br>
GitHubを開いて`main`のボタンを押して作ったブランチがあれば完了です。
<img width="497" alt="スクリーンショット 2021-10-14 17 26 09" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583941/c11726c2-561e-8d31-c13a-16b44dc19651.png"/><br>


　ここまでが開発を始めるまでの手順です。
　作業が終わった時はプルリクエストを出してメンバーに見てもらってください。
　プルリクエストが通ればマージされて他メンバーの作業フォルダに反映させることができます。

## さいごに
　参考になる部分があれば幸いです。
　なにかありましたらコメントまでどうぞ。

## 書いた人の環境
　MacbookAir e2020
　macOS Catalina 10.15.6
　AndroidStudio 4.1.1
Windows Sandbox設定

# Windows Sandbox設定

## Windows Sandboxについて
Windows 10 1903以降の機能として、Sandboxが追加されました。
これは、Windows内に仮想のWindowsを作成できます。
この仮想Windowsで様々なアプリを安全にテストすることができます。

## Windows Sandbox有効化
[Windows の機能の有効化または無効化］からWindows サンドボックスを有効化します。

![Windows_Sandbox_有効化.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547019/fb995b8d-fd47-ec84-8c84-a1bd82fc0e1b.png)


設定後再起動すると、スタートメニューにサンドボックスが増えます。
この設定は初回のみで良いです。


## Windows Sandbox構成ファイル
詳細は公式ページの[Windows サンドボックス構成](https://docs.microsoft.com/ja-jp/windows/security/threat-protection/windows-sandbox/windows-sandbox-configure-using-wsb-file)を参照して下さい。
Windows Sandboxをデフォルト設定で起動する場合には、スタートメニューから起動するだけで良いですが、いつも使用する設定を使いたい場合には構成ファイル(.wsb)で指定できます。
また、起動時にスクリプト実行させることも可能です。

以下の設定の構成ファイルを作成してみます。

+ C:\workフォルダを共有化(書込み可能)
+ C:\SandboxScriptsフォルダを共有化(書込み不可)
+ C:\SandboxScriptsフォルダにあるNodejsInstall.cmdを起動時に実行
+ NodejsInstall.cmdでVSCodeとNode.jsをインストール

```Batchfile:NodejsInstall.cmd
REM Download Visual Studio Code
curl -L "https://update.code.visualstudio.com/latest/win32-x64-user/stable" --output C:\users\WDAGUtilityAccount\Desktop\vscode.exe

Install and run Visual Studio Code
C:\users\WDAGUtilityAccount\Desktop\vscode.exe /verysilent /suppressmsgboxes

REM Download Node.js
curl -L "https://nodejs.org/dist/v17.3.0/node-v17.3.0-x64.msi" --output C:\users\WDAGUtilityAccount\Desktop\node-x64.msi

REM Install Node.js
msiexec.exe /i "C:\users\WDAGUtilityAccount\Desktop\node-x64.msi" /norestart /passive
```

```xml:nodejs.wsb
<Configuration>
  <MappedFolders>
    <MappedFolder>
      <HostFolder>C:\SandboxScripts</HostFolder>
      <ReadOnly>true</ReadOnly>
    </MappedFolder>
  </MappedFolders>
  <LogonCommand>
    <Command>C:\Users\WDAGUtilityAccount\Desktop\SandboxScripts\NodejsInstall.cmd</Command>
  </LogonCommand>
</Configuration>
```

作成したnodejs.wsbファイルをダブルクリックするとSandboxが起動され、Node.jsのインストールまで自動で実行されます。
laravelシンボリックリンクしても画像が表示されない

# 画像アップロードの仕方
laravelでは画像をアップロードして保存する際に

```php
public function store(Request $request) {
    $filename = $req->imgpath->getClientOriginalName();
    $img = $req->imgpath->storeAs('', $filename);
}
```

のようにして保存できるのですが、その時のフォルダは

```
storage/app
```
になっているようです。僕が保存したときは上記のフォルダに保存されました。


#アップロードした画像を表示
表示はとても簡単です。

```php
<img src="{{ asset('storage/{ファイル名}') }}"/>
```

これで普通なら表示できるのですが、何も表示されないと思います。
理由は簡単`asset関数`はpublicフォルダを参照するからそもそもフォルダ違うよねということです。

ではどうするのか。
シンボリックリンクをしてあげましょう。

#シンボリックリンク
シンボリックリンクとは特定のフォルダへのエイリアスとかポインタのようなものだと思っていただければと思います。
laravelではシンボリックリンクは超簡単にできます。

```bash
php artisan storage:link
```
このコマンドを打つだけです。

```bash
$ls -la public

なんやかんやの表示　　　storage -> /Users/ryotakarita/Desktop/sample-upload-pic/storage/app/public
```

こんな感じで`storage->~~~`の部分が表示されていたらOKです。
さあ、これで問題なく表示されるでしょう！といいうことでリロード！
あれ、表示されない...


#本題
なぜ表示されないのでしょうか？
冒頭を見返していただくとわかると思いますが、アップロードしたファイルの保存先は

```
storage/app
```
です。
シンボリックリンクされているパスと違いますよね。

#解決策
保存する際の`storeAs関数`の第一引数に`public`を指定してあげる。
以下のようにするということです。

```diff_php
public function store(Request $request) {
    $filename = $req->imgpath->getClientOriginalName();
    $img = $req->imgpath->storeAs('public', $filename);
}
```

またはシンボリックリンクのリンク先を変更することでも解決できます。
変更の仕方は`config/filesystems.php`内の最後にある

```diff_php
'links' => [
        public_path('storage') => storage_path('app'),
    ],
```
のように修正してもできます。

一応これでもできるよという解決方法なのでいいやり方かどうかはわかりませんが。。。

また、リンク先を変更した際は

```bash
php artisan storage:link
```

を忘れないでください。
もしすでにリンクしている方は一度`publicフォルダ`内の`storage`（リンクされているやつ）を削除するとエラーなくできると思います。

# 最後に
なかなか解決に時間がかかりましたが少し理解が深まったのでよしとします。
間違い、ご指摘等ございましたらコメントにてご教授ください。
M5 StickCと心拍センサHATで脈拍、酸素飽和度（SpO2）を測る、但し医療機器ではない

#この記事でやったこと
M5StickC用の心拍センサHat（MAX30102搭載）を使って、脈拍、酸素飽和度を測れるようにします。
いわゆるパルスオキシメーター機能ですが、センサーは医療機器用ではないのであくまでこの数値は目安です。診断等に使用することはできません。

[M5StickC 心拍センサ Hat（MAX30102搭載）- スイッチサイエンス](https://www.switch-science.com/catalog/7232/)

![FGGEMd-VQAEMWfC.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641828/b77626c3-1e48-76c5-327c-f5877cef7ee6.jpeg)

#サンプルをちょっとだけアレンジ
[メーカー公式サイト](https://docs.m5stack.com/en/hat/hat_heart_rate)から、下記のサンプルプログラムを使います。
[Arduino Example Code / M5StickC Plus with HEART RATE HAT](https://github.com/m5stack/M5StickC-Plus/blob/master/examples/Hat/HEART_RATE_MAX30102/HEART_RATE_MAX30102.ino)

このサンプルプログラムはM5 StickC Plus用でした。私が用意したのは"Plus"のついてない普通のM5 StickCです。includeするライブラリをM5 StickC用にする必要があるので、少し修正します。
冒頭のinclude文を書き換えるだけ。

```
#include <M5StickC.h>      　　　　　　　// #include <M5StickCPlus.h>
```



これだけでも動きます。センサー部に指を当てると、脈拍のグラフが表示され、酸素飽和度(SpO2)とBPMが表示されます。
![FGGEMbEVIAIl0Ev.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641828/1405f317-17fb-1bc4-e0bc-5dfbd2593658.jpeg)

これでもいいんですが、表示の字が小さく見づらいですね。
PlusとCでは画面サイズも違うので、LCD設定を変えておきます。
M5StickCの画面サイズは160,80です。

```
  //set Lcd
  M5.Lcd.setRotation(3);
  M5.Lcd.setSwapBytes(false);
  Disbuff.createSprite(160, 80);       // Disbuff.createSprite(240, 135);
  Disbuff.setSwapBytes(true);
  Disbuff.createSprite(160, 80);       // Disbuff.createSprite(240, 135);
```

表示の数字がものすごく小さいので、文字サイズを変えておきます。。

```
    {
      Disbuff.setTextSize(2);           // added
      Disbuff.setTextColor(GREEN);
      Disbuff.printf("spo2:%d", spo2);
      Disbuff.setCursor(5,45);          // Disbuff.setCursor(60,25);
      Disbuff.printf("BPM:%d", beatAvg);
    }
```

これでとりあえず形にはなりました。
![IMG_0280.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641828/55b22392-82d9-4bd4-238f-250bda2fccdd.jpeg)
今は数値を表示するだけですが、記録するようにしてもいいですね。
その辺はまた。
Dynamics 365 Finance and Operations ~ Warehouse Management（倉庫管理）~

あまりこれまで倉庫管理モジュールを利用していなかったので調査してみました。倉庫管理の実機での設定・デモはしないのでご容赦ください。

#倉庫管理（Warehouse Management System）とは
・倉庫管理とは、倉庫に着目した管理の方法で倉庫業務全般を指します。
・倉庫管理と在庫管理の違いは、大きく分けると「管理対象・範囲」と「目的」の２つ。
・物流の倉庫管理には、大きく分けると「入庫」「出庫」「在庫管理」がある。
・倉庫管理システムは、倉庫内の動きを細かいレベル（棚とかパレットとか）で、またリアルタイムで確認することができ、ピッキングや検品の効率化を実現することが可能。

https://it-trend.jp/warehouse_management_system/article/difference-inventory_control

#倉庫管理の用語
共通系

|単語  |意味  |
|---|---|
|Warehouse Management System  |倉庫管理システム  |
|Warehouse Mobile Application  |倉庫モバイルアプリ  |
|License Plate  |パレット、Location、フォークリフトなどに対して割り当てられるユニークなID。在庫管理だと、保管分析コードグループで設定できるLocationレベルが最小単位だが、LPはよりきめ細かい単位で管理が可能になる。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375815/514d1680-c0ae-27aa-e3a2-bb7472760783.png)|
|Tracking Dimension Groups  |バッチ（1工程・製造ごとの）番号とシリアル（1製品ごとの）番号が設定可能。  |
|Unit Sequence Groups  |単位の構造化 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375815/b28c7f34-b750-f58c-d2a0-7d5ac19b7782.png)|
|Work  |倉庫の作業者の作業（出荷：倉庫の保管場所から取り出し（pick）/入庫：倉庫の保管場所に置く（put-away））のこと。さらにWork templateというのを使えば「何を、どのLocation Directiveを使って、どこに、どうやって」という感じで一連の倉庫の作業を効率的にテンプレ化できる。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375815/54f39251-b0f0-e77a-7a73-0d8bc6d27259.png)|
|Location Directive   |あるオーダーに対してpickやput-awayする場所を設定できるマスター。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375815/6296b3a2-c44b-ded0-53ff-4255eb2d2018.png)|
|Dock   |荷受け場（ドック）や出荷場（ドック）のこと。また、仕入先からの貨物を物流センターに入荷後、在庫保管することなく、そのまま仕分けを行い出荷する方法（積み替えだけする）ことを、Cross Dockingと言う。

・入庫系（Inbound）

|単語  |意味  |
|---|---|
|Registration   |まず荷物が倉庫に届いたら、開梱せずに「注文した製品かどうか」を箱に付いているバーコード（ASN）を読み取って確かめる。ASN（事前出荷情報）は「入庫予定日」「発注番号」「商品コード」「入庫数量」「製造ロット番号」「賞味期限」などの項目が含まれる。|
|Receipt   |Registrationを通過したら、入庫となる。Receiptの言葉の範囲が広いので、put-away（この倉庫のこの棚・パレットに置く）みたいなイメージが近いのかと。|

・出庫系（Outbound）

|単語  |意味  |
|---|---|
|Release to Warehouse  |出荷処理のために在庫の準備を整えるプロセスのこと（受注 ＞ Release to Warehouse ＞ 積荷・出荷）  |
|Waves  |Release to Warehouseされた注文の集まり  |
|Loads  |物理的なコンテナのこと（出荷処理の最大単位）。1つのLoad（物理的なコンテナ）の中に、複数のお客様向けのShipment（出荷伝票）が含まれる。さらに、1つのShipmentの中に、論理的なContainer（パッキングの単位）が含まれる。　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375815/cba555d0-efa0-ee37-84df-e2b656fa5142.png)|

・棚卸系（Cycling）
略

用語をまとめてイメージ化すると、こんな感じです。通常の受発注プロセスにPutaway、Wave、あたりのプロセスが加わった感じなのが分かるかと思います。あとは、冒頭のURLを見ても分かる通り、倉庫管理では「モノの動き」だけでなく「人の動き」にも着目しているので、労務管理のプロセスも加わるのですね。生産管理に近い感覚です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375815/a008d536-a9d3-1fa1-2e0a-43d2eaec24be.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375815/c7b1f720-8e71-4d9b-427d-f870b032d243.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375815/deeaf3d4-ce29-f846-4e83-915086cb4fca.png)
MacBookからRaspberry PiにSSH接続する

Raspberry Piを購入した電気電子工学科の大学生です。モニターを持っているものの有線のキーボードやマウスを持っていなかったのでMacBookからプライベートネットワーク内に存在し、外部に公開されていないRasberry Piに対して、SSH接続する方法を解説します。

https://www.raspberrypi.com/software/

## microSDカードにRaspberry Pi用のOSを書き込む




MacBookに変換ケーブルを使ってmicroSDカードを差し込みRaspberry Pi用のOSを書き込みます。

![スクリーンショット 2022-01-08 12.57.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1295942/e693ae45-1065-fade-90b9-eeea98eda691.png)

「 CHOOSE OS 」を選択


![スクリーンショット 2022-01-08 13.03.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1295942/704370cc-83e0-85aa-753d-de471b06a883.png)

「 Raspberry Pi OS (32-bit) 」を選択

![スクリーンショット 2022-01-08 13.04.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1295942/15989cac-14aa-d115-346e-dd24395a8a49.png)

「 Generic MassStorageClass Media - 31.0 GB 」

![スクリーンショット 2022-01-08 13.13.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1295942/87c0bc6e-b88b-57df-c595-281593eda247.png)

「 WRITE 」を選択　ここで書き込まれるまでしばらく待ちます。

## Raspberry PiにSSH接続できるようにする

boot配下にsshファイルを作成します。

```
$ touch /Volumes/boot/ssh
```
同じboot配下にwpa_supplicant.confファイルを作成します。

```
$ touch wpa_supplicant.conf
```

wpa_supplicant.confファイルにWi-Fiの設定をします。

```:wpa_supplicant.conf
country=JP
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
    ssid="ssid"
    psk="< パスワード >"
}
```

ここまで完了したらRaspberry PiにMicroSDカードを差し込みます。

## MacBookからRaspberry PiにSSH接続する

以下のコマンドでSSH接続します。パスワードはraspberryです。

```
$ ssh pi@raspberrypi.local
```

以下のコマンドからRaspberry PiのIPアドレスを調べて ssh pi@ ~IPアドレス~ でもSSH接続できます。

```
arp -a
```

## SSHしたあとにやること

OSのアップデートを行います。

```
sudo apt update
```

```
sudo apt upgrade
```

## Apacheのインストール

```
sudo apt install apache2
```

Raspberry Pi自身のIPアドレスを調べる。

```
ifconfig
```

ブラウザにIPアドレスを打ち込むとApacheの初期ページが表示されていると思います。


```
sudo raspi-config 
```

# 参考文献

https://qiita.com/murs313/items/81757bf8bc74b6b76cdf

・既にラズパイにSSH接続していた際のエラー対処

https://qiita.com/takeru56/items/9f8a214d79812d91badc
Flutter pod install エラー

# Exception: Error running pod install
> Error: CocoaPods's specs repository is too out-of-date to satisfy dependencies.
To update the CocoaPods specs, run:
  pod repo update
>
> Exception: Error running pod install


iOSビルド時のエラー。dependencies updateすると発生することが多い。
クリーンしてうまくいくときもあれば、そうでない場合もあったが、これやっとけば正解な手順がわかったのでメモ。

# 手順

1. `cd ios`
1. `ios/Pods/` と `ios/Podfile` `ios/Podfile.lock`手動で削除
1. `flutter run`
1. 必要ならば、`sudo arch -x86_64 gem install ffi` 一度やればよい
1.  `arch -x86_64 pod install --repo-update`
1. `flutter clean`
1. `flutter run`
【Java文法】メソッド

こんにちは、コイキングです。

本記事では'メソッド'について、説明したいと思います。

******

#1. メソッドとは?
メソッドは呼出すと**特定の動作を行い、その結果をリターンするコードの集まり**として、数学の関数のような役割を担います。

#2.メソッドの宣言
メソッド'[アクセス制御子] [リターンするデータ型] メソッド名(引数1, 引数2...){メソッドのコード... }'の様に宣言します。

## 1) 引数 X, 戻り値リターン X

```
public void printHello() {
    System.out.println("Hello!!!");
}
```

括弧'()'の内部に引数を宣言せず、戻り値がないため、'[リターンするデータ型]'にはvoidを使います。


## 2) 引数 O, 戻り値リターン X

```
public void printString(String str) {
    if (str == null || str.equals("")) {
        /*
        * こちらで使う returnは値をリターンせず、,
        * return以後のメソッド内部のコードが実行しないに解析。  
        * */
        return;  
    }
    System.out.println(str);
}
```

括弧'()'の内部に引数を宣言し([データ型] [引数名])、戻り値がないため、'[リターンするデータ型]'にはvoidを使います。


## 3) 引数 X, 戻り値リターン O

```
public int getRandomNumber() {
    return new Random().nextInt(100)+1;
}
```

括弧'()'の内部に引数を宣言せず、'[リターンするデータ型]'に宣言したデータ型の値をreturnキーワードを使い、メソッドの戻り値をリターンします。

## 4)  引数 O, 戻り値リターン O

```
public int getRandomNumberFromTo(int from, int to) {
    if (from <= 0 || to <= 0 ) {
        return 0;
    }
    return new Random().nextInt(to)+from;
}
```

括弧'()'の内部に引数を宣言し([データ型] [引数名])、'[リターンするデータ型]'に宣言したデータ型の変数をreturnキーワードを使い、メソッドの戻り値をリターンします。


#3. メソッドの呼出し
## 1) メンバーメソッド
'インスタンス.メソッド名()'でメソッドを呼出す事ができます。

※ staticとして宣言しないメソッドはクラスのインスタンスを生成しなしと呼出す事ができません。

```
// 1) 引数 X, 戻り値リターン X
method.printHello();
		
// 2) 引数 O, 戻り値リターン X
method.printString("Bye Bye");
		
// 3) 3) 引数 X, 戻り値リターン O
System.out.println(method.getRandomNumber());
int randomNum = method.getRandomNumber();
System.out.println(randomNum);
		
// 4) 3) 引数 O, 戻り値リターン O
System.out.println(method.getRandomNumberFromTo(5,10));
int randomNum2 = method.getRandomNumberFromTo(11,30);
System.out.println(randomNum2);
```

## 2) 静的(static)メソッド
静的メソッドはインスタンスを生成しなくても呼出すことができるメソッドです。
'クラス名.メソッド名()'又は'インスタンス名.メソッド名()'で呼出すことができます。

```
// インスタンスを生成しなくても使える。
System.out.println(B_08_Method.getHelloWorld());

// 静的メソッド
public static String getHelloWorld() {
    return "Hello World!!";
}
```

******

※ 例示コード
https://github.com/leeyoungseung/algorithmBasic/blob/master/algorithm/src/basic/B_08_Method.java

※ 韓国語のポストは以下のURLで確認できます。
https://koiking.tistory.com/80?category=1068655
【Linux】ファイル操作

# ファイルの作成
 まだ、ファイルを作っていないときに行う作業。

```
mkdir ＜ファイル名＞
```

ファイル作成後、そのディレクトリ内で作業を行う

# ディレクトリの移動
```
cd ＜ディレクトリ名＞