OmniAICreator/Qiita-1.07M huggingface dataset:
Dockerの仕組みを理解するためのプロセスの概念を調べてみました

Dockerの勉強を進めるにあたって、Docker Engineの仕組みを理解するには、プロセスの概念を理解する必要がありましたので、プロセスの詳細について調べてみました。

コンテナは、コンテナの作成、起動、削除を管理するDocker Daemonと同じく、ホストOS上でプロセスとしての存在になります。ホストOS上のプロセスということで、他のホストOS上で単独実行アプリケーションと同様に、CPU、メモリ、ネットワークなどのリソースをホストOS経由でアクセスできますし、また、プロセスが終了すると、メモリに保持されているコンテナ上の操作データも一緒に消えるが当然なことがよく理解できました。

■プロセスとは
プロセスとは、HDDなどに格納されているバイナリーコードをOSのスケジューラーにより、メモリにロードされ、CPUを実行可能な状態となる、OS上でのCPUなどのリソース実行管理単位のこと。

■プロセスとスレッドの違いについて
1プログラム⇒1プロセス
1プロセスに複数のスレッドを動かすことが出来る（シングルスレッドとマルチスレッドがある）
スレッドがプロセス内の命令を実行する
1スレッドが1CPUコア使用する
1CPUに複数のCPUコアを含むことが出来る。

メモリー空間はプロセス単位で割り当てられる
スレッドが属するプロセスのメモリ空間を共有する

■シングルプロセスとマルチプロセスの違い
シングルプロセス：
　スレッド①：料理開始⇒ご飯を炊く⇒カレーを煮込む⇒お皿に盛る⇒料理終了
マルチプロセス：
　スレッド①：料理開始⇒プロセス②を起動⇒ご飯を炊く⇒プロセス②完了を待つ⇒料理終了
　スレッド②：カレーを炊く
# 【Webpack】Error: Compiling RuleSet failed: Properties enforce are unknown (at ruleSet[1].rules[0]: [object Object]) at RuleSetCompiler.error ( … /webpack/lib/rules/RuleSetCompiler.js:373:10)

たぶん webpack をアップデートしたときに起きたエラー。
原因は、webpack の設定ファイルの記述方法が古かったため。構造が違う。
公式マニュアル通りの記述にすることで解決できた。


## 修正前 (エラー)

構文チェッカー用の設定は外してある

```webpack.config.js
module: {
  rules: [
    {
      test: /\.js$/,
      exclude: /node_modules/,
      use: [
        {
          loader: 'babel-loader',
          options: {
            presets: ['@babel/preset-env'] // .babelrc に設定
          }
        }
      ]
    }
  ]
},
```

## 修正後 (正常動作)

```webpack.config.js
module: {
  rules: [
    {
      test: /\.js$/, // /\.m?js$/,
      exclude: /node_modules/,
      use: {
        loader: 'babel-loader',
        options: {
          presets: [
            ['@babel/preset-env', { targets: "defaults" }] // .babelrc に設定
          ]
        }
      }
    }
  ]
},
```

## 参考記事

* [javascript - Issue with Setting Up Webpack and Babel - Stack Overflow](https://stackoverflow.com/questions/64597135/issue-with-setting-up-webpack-and-babel)
OracleBronze　勉強記事２

#はじめに
最初の記事のはじめにを参照
https://qiita.com/miyanoShiho/items/ef6dd74478ee2c6a4fea
#今日間違えた問題の復習
##算術演算子について
()ついた四則演算の方が大きくなる
デフォルトの順番
・\*/（乗除）は+-(加減)よりも優先される。　*/　> +-の関係
・優先順位が同じ場合、左から右　左 > 右の関係
・括弧を使うとデフォルトの順番を変更できる
 括弧がない場合
　計算結果は変わらない
 括弧がある場合
　括弧がある場合とない場合でその箇所に増減が発生するのか検討する必要がある。
　 例) 括弧がある場合
       (A+B)\*C  = 順番：**①**(A+B)　②①\*C
      括弧が無い場合
     　A+B*C   =   順番：①B*C　②①+A
##INSTR
INSTR(文字列、検索文字列、文字の検索開始位置、文字の出現数)
※文字の検索開始位置の1は文字の先頭位置から検索
例) 「ABCDA」という文字列から、「A」という文字を2回探したい場合
INSTR(’ABCDA’,'A',1,2)
##TRIM
* TRIM(LEADING|TRAILING|BOTH from 文字)
    * LEADING 先行除去
    * TRAILING　後続除去
    * BOTH　両方
    
TRIM LTBで覚える。
MacからWinへのリモートデスクトップ

# RDPの設定

Win->Winへのリモートデスクトップはほとんど困ることがないけど、Mac->Winだと主にキーボード周りで変更しないとつらい。

1. Karabiner-Elementsで「ろ」を「￥」に変えておく

Windows用のキーボードではこの位置に「￥」があるけど、MacのキーボードはShiftを押しても押さなくても「_」になるので変えておく

https://knowledge.sakura.ad.jp/23355/

を参考に、適当なルールをインポートしておいて、そのjsonファイルを変更して次の記述を追加しておく。

```
    {
      "description": "「ろ」を「¥」に置き換える",
      "manipulators": [
        {
          "type": "basic",
          "from": {
            "key_code": "international1"  
          },
          "to": [
            {
              "key_code": "international3"
            }
          ]
        }
      ]
    },
```

2．RDP先のWinで「noyen.exe」を起動しておく

Macの「￥」とWinの「￥」はキーコードが違って、このままだとWinでバックスラッシュが入力できない。そこで、次のソフトを起動しておく。

https://github.com/stkchp/noyen

3．puttyなどのソフトは文字がぼやけて見えるので、その対策

Win側で設定を開いて、「ぼやけた表示のアプリを修正します」と検索して、下記のように「鮮明に表示」のオプションを「オフ」にする！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155552/afb6c45a-6a4c-b606-050a-b8f3f4836481.png)
【Webpack】"ERROR in ./node_modules/bootstrap/dist/js/bootstrap.esm.js 6:0-41 Module not found: Error: Can't resolve '@popperjs/core' in …"

bootstrap が依存しているパッケージ popper が[v2になった](https://blog.getbootstrap.com/2020/12/07/bootstrap-5-beta-1/#popperjs-v2)。
npm で Bootstrap v5 をアップデートした際、依存関係が適切に処理されなかった。
popper.js (v1) → @popperjs/core (v2) に手動で入れ替えて解決。

1. `npm uninstall popper.js`
2. `npm i @popperjs/core`

※ v1 は popper.js と拡張子のドットがあるが、v2 はドットなし
活性化関数一覧

モデルを組んでいるとき，活性化関数がそもそも何なのか，どう使い分けるのか混乱したので，メモ．リンク先が分かりやすい．

# そもそも活性化関数とは何なのか
入力と出力という一次関数の間に挟んだ，単純な非線形関数．
ディープニューラルネットワークの特徴．
なぜ必要なのか, 非線形なのか→[「複雑」をたくさんの「単純」に分解する〜順伝播は「1次関数」と「単純な非線形」の繰り返し \| Think IT（シンクイット）](https://thinkit.co.jp/article/14103)

#  活性化関数一覧
## 0. 結論
- 回帰問題における出力層→恒等関数
- 二値分類における出力層→シグモイド関数
- 多クラス分類における出力層→ソフトマックス関数
- DDNにおける中間層→ReLU関数（最新のものにSwish関数，Mish関数）

## 1. 恒等関数
**回帰問題における出力層**として用いる．
tensorflowでは，活性化関数を指定しないと恒等関数がデフォで指定される．

## 2. ステップ関数（階段関数）
かつては単純パーセプトロンの活性化関数として用いられていたが，以下のデメリットにより今は使われていない．
- 0か1しか出力できず，情報の大半が落ちる．
- x≦0において微分値が0となり，誤差逆伝播法によりパラメータの最適化ができない

[［活性化関数］ステップ関数（Step function）とは？：AI・機械学習の用語辞典 \- ＠IT](https://www.atmarkit.co.jp/ait/articles/2002/26/news010.html)
## 3. シグモイド関数

かつては中間層に用いられていたが，下記のデメリットにより使われなくなった
- 微分の最大値が0.25なので，誤差逆伝播の途中で勾配消失しやすい

また，シグモイド関数は二値分類問題における出力層として広く用いられている．メリット
- 0~1の間の確率値として利用できる．

[［活性化関数］シグモイド関数（Sigmoid function）とは？：AI・機械学習の用語辞典 \- ＠IT](https://www.atmarkit.co.jp/ait/articles/2003/04/news021.html)

## 4. tanh関数

最近まではシグモイド関数の後継として中間層で用いられていた．
メリット
- 微分の最大値が1なので勾配消失しづらい
デメリット
- 入力が極端に大きい，または小さいと，依然として勾配消失する

[［活性化関数］tanh関数（Hyperbolic tangent function： 双曲線正接関数）とは？：AI・機械学習の用語辞典 \- ＠IT](https://www.atmarkit.co.jp/ait/articles/2003/19/news015.html)

## 5. ReLU関数


現在，中間層に広く用いられている．tanh関数の後継．
メリット
- 正の入力値に対して微分値が常に1なので勾配が消失しない．
- 微分値が定数なので計算量が少なくて済む
デメリット
- 負の入力に対しては重みの更新がされない


[［活性化関数］ReLU（Rectified Linear Unit）／ランプ関数とは？：AI・機械学習の用語辞典 \- ＠IT](https://www.atmarkit.co.jp/ait/articles/2003/11/news016.html)

## 6. Swish関数


ReLUの後継として2017年に登場．まだ一般的ではないが，優れているとされている．
メリット
- 微分がReLUよりも滑らか


[［活性化関数］Swish関数（スウィッシュ関数）とは？：AI・機械学習の用語辞典 \- ＠IT](https://www.atmarkit.co.jp/ait/articles/2004/15/news018.html)

## 7. Mish関数

2019年，Swishの後継として登場．Swish関数とほとんど同じだが，滑らかさがやや増している．

[［活性化関数］Mish関数（ミッシュ関数）とは？：AI・機械学習の用語辞典 \- ＠IT](https://www.atmarkit.co.jp/ait/articles/2004/28/news017.html)

## 8. ソフトマックス関数
**多クラス分類における出力層**として用いられる．
シグモイド関数の一般化であり，複数入力と同じ数の出力を総和が1となるように返す．
[［活性化関数］ソフトマックス関数（Softmax function）とは？：AI・機械学習の用語辞典 \- ＠IT](https://www.atmarkit.co.jp/ait/articles/2004/08/news016.html)
シェルプログラミング

# 勉強の記録
シェルプログラミング 1/12
## 勉強した内容
- ファイルの権限を設定する。書き込み読み込みや実行操作など
- echo コマンド（文字を表示させる）
- read コマンド (変数を設定する）

## 何をベースに勉強してるか
- [N予備校 プログラミング入門](https://www.nnn.ed.nico/courses/668/chapters/9515)

## 内容の詳細
- シェルプログラミングで yes or no ゲームを作った。
久々にif文を書いて面白かった。

### わかったことについて
- ファイルの実行権限などを設定することでより一層、普段やってる事とつながってるんだなって思えてきました。

### むずかしかったよ
- ここが特に難しいとかはなかったですが、一人でディレクトリを作れってなってくると出来ないと思う…。

## 次回やる予定のこと
- 次回はネットワークについての授業だそうです。
Raspberry Pi OS 2021-01-11 Release-note 翻訳

(追記: 2021/3/27にRaspbian OS 2021-03-04がリリースされています)
https://qiita.com/utaani/items/168a101cd89045eb177a

https://downloads.raspberrypi.org/raspios_full_armhf/release_notes.txt

2021-01-11：

 - Chromiumバージョン86.0.4240.197が含まれました
 - Chromiumでスクリーンリーダーのサポートが有効になりました
 - Adob​​eが保守を終了したので、FlashPlayerが削除されました
 - Scratch 2にはFlashが必要だったため、削除されました
 - エプソンのプリンタードライバーを追加
 - 5秒後にUSBデバイスモニターのメッセージを非表示にするタイムアウトを追加しました
 - バグ修正-PulseAudio出力がモノラルだったのを修正
 - バグ修正-VLCでの再生開始時の短いオーディオの中断があったのを修正
 - バグ修正-一部のアプリケーションでPulseAudio設定の代わりに古いALSA出力設定が使用されていたのを修正
 - バグ修正-マルチチャンネルデバイスで使用するとPulseAudioボリュームコントローラーでクラッシュするのを修正
 - バグ修正-x86プラットフォームでバッテリーモニターを読み込めないのを修正
 - バグ修正-言語が変更された場合、スタートアップウィザードでのパスワードの設定が失敗してたのを修正
 - バグ修正-少数のデバイスでのChromiumビデオ再生のロックアップがあったのを修正
 - バグ修正-ChromiumGoogle Maps3Dビューアーティファクト
 - スロバキア語、イタリア語、ノルウェー語の翻訳が更新
 - RaspberryPiファームウェア70f1581eec2c036b7e9309f1af41c651fb125447
 - Linuxカーネル5.4.83
laravel6 メールキャッチャーを使ったメール送信時にエラーが発生した

# 目的

- laravel6とメールキャッチャーの組み合わせでメールの送信を実施したところエラーが発生したため解決までの経緯をまとめる

# 環境

- ハードウェア環境

| 項目 | 情報 |
| --- | --- |
| OS | macOS Catalina(10.15.5) |
| ハードウェア | MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports) |
| プロセッサ | 2 GHz クアッドコアIntel Core i5 |
| メモリ | 32 GB 3733 MHz LPDDR4 |
| グラフィックス | Intel Iris Plus Graphics 1536 MB |

- ソフトウェア環境

| 項目 | 情報 | 備考 |
| --- | --- | --- |
| PHP バージョン | 7.4.11 | Homebrewを用いてこちらの方法で導入→[Mac HomebrewでPHPをインストールする](https://qiita.com/miriwo/items/cd54077aad7e139cf518) |
| Laravel バージョン | 6.X | commposerを用いてこちらの方法で導入→[Mac Laravelの環境構築を行う](https://qiita.com/miriwo/items/adaaaeecae69d6392e08) |
| MySQLバージョン | 8.0.21 for osx10.15 on x86_64 | Homwbrewを用いてこちらの方法で導入→[Mac HomebrewでMySQLをインストールする](https://qiita.com/miriwo/items/ef6a064bc545fbea29d9) |

# 情報

- 筆者はDockerなどは使用せずに直接MacにLaravelの環境構築とメールキャッチャーのサーバを立てて検証を行っていた。
- メールキャッチャーは下記の方法でサーバを立てた。
    - [Laravel MailCatcherでメールを受け取る](https://qiita.com/miriwo/items/104e0a6584b8ff44b01e)

# エラーまでの経緯

1. laravel6のアプリでメール送信機能を作成した。
1. アプリからメールを送信した。

# エラーの内容

- 下記のエラーがブラウザ上に表示された。

    ```terminal
    Connection could not be established with host 127.0.0.1 :stream_socket_client(): unable to connect to 127.0.0.1:1025 (Connection refused)
    ```

- 下記画像ではsmtpのポート番号が1026になっているがこれは解決後、この記事のために意図的にエラーを発生させたため1026となってしまっている。みなさんの環境だと1025と表示されているはず。

    ![🧨_Connection_could_not_be_established_with_host_127_0_0_1__stream_socket_client____unable_to_connect_to_127_0_0_1_1026__Connection_refused_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/f1659081-23ec-fd05-181c-e1b05ac2551f.png)

# 解決までの経緯

- 下記コマンドを実行してメールキャッチャーをデフォルト設定で起動し直した。

    ```terminal
    $ mailcathcer
    ```

- laravelのアプリ名ディレクトリで下記コマンドを実行して設定のキャッシュをリセットした。

    ```terminal
    $ php artisan config:cache
    ```

- 問題は解決した。

# 本件でお困りの皆さんへ

- 筆者の場合メールキャッチャーが起動していなかったことが本件の原因であった。
- このエラーの場合、メールキャッチャーとlaravelアプリの通信がうまく行ってない状態である。
- 起動しているメールキャッチャーのsmtpポート、smtpのIPが何になっているのか、また、.envファイルのMAIL_PORTとMAIL_HOSTの記載が間違えていないかを確認しよう。
- 今起動しているメールキャッチャーの情報がわからなくなってしまったなら`$ mailcatcher`というコマンドを実行することでデフォルト設定でメールキャッチャーが再度起動する。（デフォルトだとsmtpポートは1025、 smtpのIPは127.0.0.1）
- .envファイルの記載が正しいようなら`$ php artisan config:cache`を実行して設定のキャッシュをクリアしてみよう。
Deep Learning technologyの碁　leela　をlinuxで

|噂ではleelaはアマチュア高段者、　しかしyoutubeでみると　プロの９段さえ　katagoが強すぎるので katagoに３目で打ってもらっている、つまりkatagoは１２段かな|
|:---|
|そのインストールちょい面倒くさいkatagoについては　次をご覧ください|

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211097/eb9cea73-064f-5fc4-659e-fafded93d1b3.png)


||
|:---|
|https://qiita.com/tyokai/items/6bab3d6e4feb78206425|

##自分は　endevour を使ってます、arch系です。　manjaroの場合は後ろに書いてます

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211097/57473f90-d07f-5877-4cdc-b491392ba3ab.png)


|戦わない奴らが笑うだろう。の歌詞はまさにドンピシャで拳を握りしめ、歯を食いしばっていた自分を思い出します。鏡の前に立つ泣き顔の自分への応援歌でした。(コメントより)|
|:---|
| https://www.youtube.com/watch?v=V2kKeyf6TyI|


https://www.sjeng.org/leela.html
からダウンロードすれば

windows
ubuntu
は簡単です

arch系endevourの場合は
Leela 0.11.0 for Arch/Manjaro
をダウンロードのあと

 xz -dc leela-0.11.0-1-x86_64.pkg.tar.xz | tar xfv -
で 
extractします




そうすれば

```
$ ls ダウンロード/usr/
bin  share

となっており
$ ./ダウンロード/usr/bin/LeelaGUI
でゲームできます



```


19路盤にして　
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211097/ee5cdacb-4e8c-8c1b-6d1b-55836e91d51a.png)

２万シュミレーションでも　強い強い
無限シュミレーションでは　子供扱いにされます



##manjaro の場合

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211097/6480073a-b272-abf9-6632-1508e850455e.png)

を
nautilus　で　クリックして　extractすると
全く自動的に

$ which LeelaGUI
/usr/bin/LeelaGUI

となります、恐ろしく便利、　がセキュリテイ的にちょっと怖い

$ ls -l /usr/bin/LeelaGUI
-rwxr-xr-x 1 root root 40876456 10月 16  2017 /usr/bin/LeelaGUI
となってるのでね

![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211097/8ecaf287-3cc7-0001-fd45-642fc487c5d9.jpeg)
Shopifyの製品、在庫、注文管理に最適なアプリ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705866/9886d966-dafa-63d6-d29c-f6d45cce9730.png)

ExcelまたはCSVインポートを利用して、商品、コレクション、顧客、割引、ドラフト注文、注文、支払い、ページ、ブログ、リダイレクト、メタフィールドなどを追加するプロセスを簡素化できるExcelifyアプリから始めましょう。また、ユーザーはWoocommerce、Magentoなどの他のeコマースプラットフォームからShopifyにデータを移行できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705866/af8af42d-15b3-d91e-3357-8014d06dff3c.png)


Hextomの一括商品編集とCSVインポートアプリを使用すると、商品とそのバリエーションの一括編集が簡単になります。価格、タグ、在庫、タイトル、説明、ベンダー、製品SKUを手動で一括編集したり、CSVファイルとExcelファイルをインポートしたり、将来の日時に、または毎日/毎週実行する一括編集タスクをスケジュールしたりできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705866/8a9dd670-1669-9c2b-fb6f-3495c2cb2ff8.png)


ShopPadInc。によるInfiniteOptionsは、カスタム製品オプションを追加し、バンドルを作成するための、最も有料のShopifyアプリの中で最も評価の高いアプリです。テキスト、数字、カレンダー、見本、チェックボックス、ドロップダウンメニューなど、無制限のカスタム製品オプションを柔軟に追加できます。製品バンドル機能を利用して平均注文額を増やすことを目的として、彫刻またはモノグラミング用に製品をパーソナライズするオプションを提供します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705866/b2ab2f6c-e8f4-251c-04fa-3f769c057a09.png)


低在庫アラートを付与する最高のShopify在庫アプリは間違いなくStoreBuilderによるStockBot低在庫アラートです。無料プランでは、ストア内の最大200の商品を追跡できます。在庫レベルを低く設定し、これらのレベルに達した商品の最新情報を毎日または毎週メールで受け取ります。これにより、人気のある製品や利益率の高い製品が不足するという苛立たしい状況を解消できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705866/605f573f-3d92-ecbc-ced1-70e9855e40fd.png)


買い物客に優れたカスタマーエクスペリエンスを提供することほど価値のあるものはありません。価格、請求先住所、配送方法、割引コードの追加、またはCleverific、Incの[注文の編集]アプリで利用できるその他の潜在的なカスタムオプションなど、注文の詳細を簡単に編集できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705866/0c4e4c2e-caa0-e15c-a0e2-94dc217280ff.png)


マーチャントとして、バックオフィスプロセスを効率的に処理するために、Shopifyのデフォルトの注文ステータスに追加の注文ステータスが必要になる場合があります。 W3trends Inc.によるカスタム注文ステータスアプリは、そのための優れた手段であり、2021年の最高のShopifyアプリの1つです。その助けを借りて、無制限の注文ステータスを設定したり、一度に複数の注文を更新したり、注文のパブリックノートまたはプライベートノートを設定したりできます、ステータスの変更を記録し、注文ステータスがいつ更新され、誰が通知を受け取ったかを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705866/13c11233-cd33-9f9c-b62d-3f28f6e44b89.png)

詳細[こちら](https://whidegroup.com/blog/top-shopify-apps-part-1/)
Prallels上のWindowsで日本語切り替えをかな・英数に割り振る（改訂）


久しぶりにParallelsでWindowsを利用したら、日本語切り替えのやり方が変わっていたのでメモ。


### IMEの設定を開く

> 以前は「プロパティ」とかをいじったが項目自体がない。

![スクリーンショット_2021-01-14_5_54_15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55188/1d258231-9841-9356-4306-c50ee7558366.png "スクリーンショット_2021-01-14_5_54_15.png")

### キーとタッチのカスタマイズを選択

文字通り選択するだけ。


![スクリーンショット_2021-01-14_5_54_28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55188/3c8012e6-e60c-4d40-122e-2af524f29e38.png "スクリーンショット_2021-01-14_5_54_28.png")


### キーの割当を変更

やることは下記の２つ。

* 各キーに好みの機能を割り当てるを「オン」に
* 無変換キーで「IME オン/オフ」を選択


![スクリーンショット_2021-01-14_5_54_38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55188/dd52c256-b923-f7e4-66ac-bea4448fd6c8.png "スクリーンショット_2021-01-14_5_54_38.png")

以上です。

以前はキーを細かく？いじっていましたが、GUIの操作だけでできるようになりました。
上記操作はたまたまいじってたらうまく動いただけなので、おかしかったらご指摘お願いします。

>とうか、Parallelsに吸収してほしいといつも思う。
[Python MinMaxScaler] 0 ~ 1に正規化

sklearn.preprocessing.MinMaxScalerを使用した正規化


# MinMaxScalerによる正規化とは
以下の式による 0 から 1 の範囲への変換
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64293/dfd58c87-9bb1-4726-e364-ce0da2d42e80.png)

# コード例

緯度と経度などあらかじめ最小・最大値が決まっている場合の使用例

### サンプルデータ

```py
import numpy as np

from sklearn.preprocessing import MinMaxScaler


# 東京都内の緯度経度サンプルデータセット
sample = np.array([[35.6712, 139.7665], [35.6812, 139.7671], [35.6580, 139.7016]])  # shape=(3, 2)

=> array([[ 35.6712, 139.7665],
          [ 35.6812, 139.7671],
          [ 35.658 , 139.7016]])
```

### 最小・最大値の定義
```py
# 最小値と最大値を定義

# [緯度, 経度]
min_li = [-90, -180]
max_li = [90, 180]
min_max_li = np.array([min_li, max_li])  # shape=(2, 2)

# 正規化で使用する最小値と最大値を定義
mmscaler = MinMaxScaler(feature_range=(0, 1), copy=True)
mmscaler.fit(min_max_li.astype('float'))
# mmscaler.fit(sample) とした場合は、サンプルデータの各列に対して最小値と最大値を自動で定義

```

### 正規化

正規化するデータは、最小・最大値を定義する際に使用したデータと同じ列数でなければいけない
今回は緯度と経度の2列

```python
# サンプルデータに対して正規化
scaled_sample = mmscaler.transform(sample)

=> array([[0.69817333, 0.88824028],
          [0.69822889, 0.88824194],
          [0.6981    , 0.88806   ]])

```

### 非正規化（正規化前に戻す）

```py
# サンプルデータを非正規化
mmscaler.inverse_transform(scaled_sample)

=> array([[ 35.6712, 139.7665],
          [ 35.6812, 139.7671],
          [ 35.658 , 139.7016]])
```


# Reference
* https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.MinMaxScaler.html
Unityでジグソーパズル・ノベルを作る【その１】

##はじめに
自分が制作中のゲーム「水神の末裔」の制作工程（主としてUnity部分）をシェアしていこうと思います。
Unityのバージョンは、2019.4.8です。
##ゲーム概要
「水神の末裔」は、ジグソーパズルとノベルゲームをくっつけたようなゲームです。
（SFCの「オリビアのミステリー」が元ネタです）
![20210117_072407.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1018111/7111f3bd-437f-3b60-23da-8cfe8666d4cc.gif)


ストーリーパート、会話パート、ゲームパートに分かれていて、ストーリーパートは地の文のストーリー、会話パートは立ち絵と台詞の会話劇、ゲームパートは絵の動くジグソーパズルという構成です。

詳しくは下記サイトの体験版をご参照ください。

体験版URL:http://nishi835.sub.jp/SuijinSite/index.html

それではまず、ゲームの中心部分である、ジグソーパズル部分から作っていきます。
##画面サイズの決定

その前に、画面サイズを決めましょう。
今回は、フルＨＤのサイズである1920px×1080pxで行きます。

画像の通り、解像度（画面サイズ）を変更します。
![スクリーンショット 2021-01-18 173635.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1018111/e27b1480-0bc2-b099-2ff4-1627979eb43b.png)
![スクリーンショット 2021-01-18 173728.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1018111/d3e2f01a-67ca-b0e9-f3d0-f630a78ebcdc.png)



##パズルフレームの準備
画面サイズが決まったら、早速パズルの置き場であるパズルフレームを準備します。
フレームの縦横比は、ピースの縦横比と同じにします。
今回は、基本的にピースの縦横比を横３：縦２とします。

パズルを直接置く中心部分のサイズを縦810px×横540pxとします。
外枠（ベゼル）があったほうが、パズルフレームらしさが出るので、縦横100pxずつ外枠を足します。
（全体の比率が変わってしまいますが、実際にパズルを置く中心部分の比率が３：２であればＯＫです）
![フレームブログ用_20210117.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1018111/f777794d-cf47-fab5-c47a-a8e7fa5ec8ac.jpeg)
（上画像は縮小版なので、ＤＬされる場合は下記リンクからどうぞ）

<p><a href="http://nishi835.sub.jp/Download/パズルフレーム.jpg">ＤＬ用サンプル（右クリック > 名前を付けてリンク先を保存）</a></p>

UnityのProjectビューで、「Textures」という名前のフォルダを作り、その中に先ほど用意したパズルフレームのファイルをドラッグ&ドロップします。

（「Projectビュー」というのは、一言でいうと「資材置き場」です。[こちらの記事](https://tech.pjin.jp/blog/2020/08/31/unity_project-view/)が詳しいです）

![スクリーンショット 2021-01-18 222158.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1018111/bfa9bf57-858c-cd26-8712-a4703c3f6489.png)
これでUnity上でパズルフレームの画像を使えるようになりました。
このパズルフレームの画像を、Hierarchyビューにドラッグ＆ドロップします。

（「Hierarchyビュー」というのは、シーン（タイトルとか、実際のゲーム部分とかの「場面」のこと）上に存在するオブジェクトの一覧画面です。[こちらの記事](https://tech.pjin.jp/blog/2020/08/31/unity-hierarchyview/)が詳しいです）
![スクリーンショット 2021-01-18 222651.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1018111/56e8a714-0e40-3d11-bf79-9c0b28582f97.png)
それから、Hierarchyビューでパズルフレームを選択した状態で、InspectorビューのPositionのZの値を10に変更します。

（「Inspectorビュー」は、Hierarchy上で選択されているオブジェクトの「コンポーネント（オブジェクトの性質を決める部品のようなもの）」やそのパラメータが表示される領域です）
![スクリーンショット 2021-01-18 223921.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1018111/e240bf0b-dadd-ca79-81be-a68fde057fe1.png)

これで、パズルフレームの準備ができました。

※ちなみに、「自分のUnityの画面とビューの配置が違って分かりづらい！」という方は、[こちらの記事](https://nekopro99.com/unity-editor-view-layout/)を参考に配置を変更してみてください。

##パズル制作の流れ
いよいよパズル部分を作り始めるにあたって、今後の流れを確認しておきましょう。

１．絵を用意する
パズルになるイラストを用意します。当記事では動く絵を使いますが、普通の止め絵でも構いません。サイズはフレームの中心部分と同じ、810px×540pxにします。

２．絵を分割する
この工程が、技術的な肝になります。
「絵を分割する」とありますが、イメージ的には、バラバラのピースに一枚絵の部分部分をそれぞれ描くことで一つの絵に見せる、という感じです。
詳しくは後述します。

３．ピースを動かせるようにする
指カーソルなどでピースを掴んで、ドラッグで動かせるようにします。

４．ピースをボードにスナップさせる
ピースを完全に自分できれいに並べることは困難なので、ある程度の位置に置いたらスナップしてきれいに並ぶような仕組みを作ります。

５．クリア判定を作る
ピースが正しい位置に並んでいるかどうか、判定する仕組みを作ります。
一つ正しい位置にはめるごとに、ピースが光るようにし、全部正しくはめたらクリアの表示が出るようにします。

これでパズル部分の骨格は完成です。

##最後に
次回は、動く絵の用意からはじめます。
G Suiteのグループメールを差出人として使っているはずなのに、個人アカウントで送信されている原因と対処法



G Suiteのユーザー作成には月額料金が発生します。

> ユーザー あたり月額 ￥680 JPY

---

企業レベルでの運用のユースケースになりますが、
例えば、営業用のユーザーを作り、パスワードを共有すればアカウントとパスワードを知っている社員はアカウントにログインすることができ、
結果的に対象社員間で営業用のメールの確認（送信・受信）が行えるようになります。

ここでセキュリティーネックとなるのは、パスワードを対象社員に教える、というところです。

---

G Suiteにはグループメールアドレスというものが作成・設定できます。
これは料金が一切発生しないものです。

グループメールには複数のユーザーを割り当てることができます。
そのグループメールに受信があったときに、割り当てている複数のユーザーのメールアドレスアカウントで受信できるようになるものです。

例えば、以下のユーザーがいるとします。

```
a@sample.com
b@sample.com
c@sample.com
```

そのユーザーを以下のようなグループメールに割り当てておきます。

```
info@sample.com
```

外部からinfo@sample.comに何かしら受信したとします。
そうすると、a@sample.com, b@sample.com, c@sample.com ３者のアカウントで、info@sample.comとして受信することができるようになります。

このG Suiteの仕様を利用し、グループメールを活用すると無駄な月額コストが発生しなくて済みます。

---

本題はここから。
受信するだけなら上記の設定だけで良いです。

しかし、受信したグループメールアドレスを差出人として返信する場合は別途設定が必要です。
その設定を行わずに、返信してしまうと、個人のアドレス（a@sample.com, b@sample.com, c@sample.com）として送信してしまいます。

うちは、営業用のグループメールを作って、担当者が名乗りやりとりするような運用にしているのですが入念に検証できておらず、これでハマり、
弊社のグループメールから送信しているはずなのに、なぜかいつも個人のアドレスに返信がくるので、それに気づかず先方にご迷惑をおかけしてしまったことがあります。

```
◇◇様

お世話になっております。
株式会社~~~の~~です。



宜しくお願いいたします。
```

---

以下の設定を行うことで、メールの返信を行う際に、差出人の部分がドロップダウン形式になり、設定しているメールアドレスを選択できるようになります。
https://open.shonan.bunkyo.ac.jp/sysroom/?p=7908

しかし、これはGmailアプリの場合のみ有効です。
ウェブブラウザ上からメール送受信する方なら上記だけ大丈夫ですが、私の場合は、mac純正のメーラー（appleメール）を使いたいので、更に別途設定が必要です。

https://modeeisennui.com/blog/entry-171/#:~:text=%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%82%BF%E3%83%96%E3%81%8B%E3%82%89%E5%B7%A6%E5%81%B4%E3%81%AB,%E3%82%AF%E3%83%AA%E3%83%83%E3%82%AF%E3%81%97%E3%81%A6%E5%AE%8C%E4%BA%86%E3%81%A7%E3%81%99%E3%80%82

ここでポイントとなるのは、mac純正のメーラー（appleメール）で設定できたし、Gmailアプリは使わないからといってGmailアプリ側で行った設定を解除しないことです。
これを解除すると、a@sample.comのアカウント所有者がinfo@sample.comから送信してるのに、相手側はa@sample.comで受信してしまいます。

ここでハマりました。
mac純正のメーラー（appleメール）側で、a@sample.comのアカウントに対してinfo@sample.comのグループメールを使えるようにしてる設定を保持してgmail側にも設定の同期がされていると思っていたのですが、
動作から見るあたり、同期はされておらず、mac純正のメーラー（appleメール）側から送信する際に、gmail側の設定を参照しているようです。

よくよく考えたらセキュリティー的にそうなんですよね。
G Suiteじゃなくて一般利用しているまったく知らない他人（例えば、yamada.taro@gmail.com）が、`mac純正のメーラー（appleメール）側で設定できたらgmail側にも設定の同期がされる`とかおかしいですもんね。
G Suiteを使っていないはずの人が、ましてや組織外のアカウント（yamada.taro@gmail.com）に対してinfo@sample.comのグループメールを使えるようにしてる設定なんてできるわけがありません。

なので、gmail側の設定から行わないといけないんですねー。
設定時にグループメール宛てにtokenもしくはリンクが送られてくるので、token入力もしくはリンク押下することで、グループメールを差出人として利用できるようになるので、そこで承認された人だけが差出人として利用可能であることを担保しているようです。
SOQL で条件に日本語を指定してQuery実行で エラー400発生

Salesforce に対し、REST-APIにてSOQLのQuery SELECTを発行
whereへ日本語を指定すると エラー400が発生
言語はJava

Workbenchでは、正常に動作

日本語を以下でエンコードする事で、正常に動作

wkStr = URLEncoder.encode(wkStr, "UTF-8");
WindowsでIntelliJ IDEAをコマンドラインから起動する

IntelliJ IDEAなどのJetBrains社系のIDEをコマンドラインから起動する方法について調べました。  

## 前提

* IDEはToolbox Appでインストールしています。
* Toolbox Appのバージョン：`Toolbox App 1.19.7784, Windows 10.0`
* Windows 10 Home
* IntelliJ IDEA 2020.3.1 (Ultimate Edition)

Windowsで、としていますが、他OSでも概ね同じ方法のはずです。

## 方法

Toolbox Appでインストールしている場合、Toolbox Appから設定ができます。

### Toolbox Appからバッチファイルを生成する

Toolbox Appの設定画面を開きます。設定画面はToolbox App右上の六角形のマークをクリックすると開きます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273742/9246305e-4be3-a0eb-5286-2617db6937f3.png" width=50%>

設定画面で「Shell Scripts」の項目を開きます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273742/d8586347-f2c0-9ce1-f463-13b313dc3c35.png" width=50%>

「Generate shell scripts」のスイッチをオンにするとスクリプトを生成して配置するパスを指定できるようになるので適当なディレクトリを入力します。  
すると、指定したディレクトリにファイルが作成されます。

![Toolbox4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273742/c86b921f-3bdb-3df2-c77f-7069d94d6922.png)

「Generate shell scripts」とあるのでWindowsでは使えないのでは、と最初思っていましたが、試してみると普通にシェルスクリプトではなくバッチファイルでした……。

このディレクトリにパスを通す、もしくは最初からパスが通っている場所を指定してファイルを生成する事によってコマンドラインから`idea`などのコマンドを使えるようになります。  
画像を見てわかるように`idea`以外にもToolboxからインストールした各種IDE用のコマンドが一気に生成されます。

### コマンドの使い方

コマンドはパスを引数にすると、そのパスを開いて起動します。たとえば、

```powershell
idea .
```

のように`.`を引数にするとカレントディレクトリが開きます。
コマンドは他にも使い方があります。

参考：[コマンドライン引数](https://pleiades.io/help/idea/working-with-the-ide-features-from-command-line.html#arguments)

## Create Command-line Launcherによる生成について

IntelliJ IDEAをコマンドラインから起動する方法を検索すると、IntelliJ IDEAのメニューから「Create Command-line Launcher」を選択して設定する方法も見つかります。  
しかし、Toolbox Appを使ってIntelliJ IDEAをインストールしていると現在この選択肢は選べないようです。  

参考：[Toolbox AppでIDEをアップデートしたらTools | Create Command-line Launcher…が消えてしまいました](https://support.samuraism.com/hc/ja/articles/360021410293-Toolbox-App%E3%81%A7IDE%E3%82%92%E3%82%A2%E3%83%83%E3%83%97%E3%83%87%E3%83%BC%E3%83%88%E3%81%97%E3%81%9F%E3%82%89Tools-Create-Command-line-Launcher-%E3%81%8C%E6%B6%88%E3%81%88%E3%81%A6%E3%81%97%E3%81%BE%E3%81%84%E3%81%BE%E3%81%97%E3%81%9F)

Toolbox Appを使ってインストールしている場合は上述の方法でスクリプトを生成する必要があります。
[Python]ラムダ式の内部変数が保存されなくてハマった


線形動径基底回帰をするときに、基底関数のリストとして、

```python
bases = [lambda x: (torch.exp(-((x[..., 0] - x_mean)/std_x) ** 2 - ((x[..., 1] - dx_mean)/std_dx) ** 2))
         for x_mean in np.linspace(start=-1., stop=1., num=10)
         for dx_mean in np.linspace(start=-1., stop=1., num=10)
         ]
```

と書いたのだがすべて同じ関数のリストになってしまった。

シンプルな例を考える

```
f = [lambda x: print(i) for i in range(4)]
```

とすると、ラムダ文の実行時での変数$i$の値が使用され、
任意のnに対して、

```
f[n](10) = 3
```

となってしまう。

定義の時の変数値を使うためには、

```
f = [lambda x, s=i: print(s) for i in range(4)]
```

このようにデフォルト引数を使用すればよい
git pushするとrejectしてしまった時の対処

# 目的
ローカルリポジトリ、リモートリポジトリで一度削除したファイルA、ファイルBのうち、
やっぱりファイルAだけ復活させて残したい時のgit対処について記載。

基本[こちらの記事](https://qiita.com/Hiroki-IT/items/1671514eb659880e5bef)を教材に、
私の場合は実経験に基づき会話形式で記事を掲載しています。

# リポジトリの状態遷移図
①～⑤は、リポジトリのコミット状態遷移を表す。

ブランチ：master

●　　　 ⑤ファイルBを再削除
| 　\
| 　　●　③ファイルA, ファイルBを削除
|　 　 |
●　　|　④ファイルAの削除を取り消し、復活
　\ 　|
　　  ●　②コミット2
　  　|
　　  ●　①コミット1

# 問題事象と解決策
ここでは主人公Q子と心情とともに、問題事象と解決策を記載。

**１．**Q子「ファイルA、ファイルBとも要らんらしいな。下記コマンドで削除っと」
　　<ローカルリポジトリ>の③をリモートリポジトリに送信
　　`git push`

**２．**そのあと、Q子のもとへi先輩からファイルAを残してほしいと電話が。
　　Q子「えっなんやて、やっぱりファイルAだけ必要やと…！さっき消してもうたやん、i先輩もうちょっとはよ言うてなあ。まあええわ、下記コマンドでさっきのコミットを取り消しっと」
　　<ローカルリポジトリ>の③を取り消し
　　`git reset --hard HEAD~`

**３．**Q子「それからファイルAだけ再保存(※1)して、コミット、pushっと」
　　`git add ファイルA`
　　`git commit -m "ファイルAの削除を取り消し、復活"`
　　`git push`
　　
　　※1: ファイル内容変更なくても、なぜか再保存しないと`git add`できない。
　　　　 ベストプラクティスではないが、、一度ファイル内にカーソルを置き改行等することで再保存、`git add`できるようになる。

　　　　　↓
PC画面さんの反応

```
$git push
To gitlab.com:XXXXX/tutorial.git
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'gitlab.com:XXXXX/tutorial.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.    
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
puts 'The best way to log and share programmers knowledge.'
```
　　Q子「ぐおおお…git pushしたらrejectされてもた・・。なになに、non-fast-forwardやて？」

　　Q子、いったん調査に入る

　　Q子「ふむふむ…[このリンク](https://nullnote.com/web/git/merge_rebase/)によると、上記３．のコミットによって、ブランチが完全に枝分かれした状態になったらしいな。つまり、<ローカルリポジトリ>の②から、関連の無い③の枝と④の枝が生えたってイメージか」

**４．**Q子「そいでそいで…関連の無い③と④のコミットをつなぎあわせるには、[このリンクの方法](https://blog.clock-up.jp/entry/2018/12/01/git-merge-allow-unrelated-histories)に書いてある、下記コマンド試したらいいんか」
　　`git merge --allow-unrelated-histories`
　　　　　↓
PC画面さんの反応

```
$git merge --allow-unrelated-histories
Removing ファイルB
```
**５．**Q子「おおおお、ファイルB削除されたな。この調子でローカルリポジトリからリモートリポジトリにgit add、コミット、pushすれば」
　　`git add ファイルB`
　　`git commit -m "ファイルBを再削除"`
　　`git push`
　　　　　↓
PC画面さんの反応

```
$git push
Enumerating objects: 8, done.
Counting objects: 100% (8/8), done.
Delta compression using up to 8 threads
Total 5 (delta 2), reused 0 (delta 0), pack-reused 0
To gitlab.com:XXXXX/tutorial.git
   caac238..239dc47  master -> master
```
　　Q子「うおおおお、やったーーー！これで再度ファイルAだけ作り直さずに済んだわ、早速i先輩に報告や！」


# めでたしめでたし
今回の問題事象は、偶々Gitの基本操作を学んでいた筆者がGit操作をしていてもしこんなことが起きたらどう対応すればいいんだろ～勉強と実践では違うとはこのことか～という危機感をもとに問題を生み出しました。（やはりGitをもっと習得するためには、基本操作だけでなく、現場で起きた問題・事例をもとに解いていくことも重要だとつくづく実感）

Q子さんの心情とともに問題と解決策をお送りする中で、実際にファイルを削除してしまったけどやっぱり必要だったという事象は仕事上で十分起こりえる事柄だと思いました。記事を書いてみて、Gitを知っていることで普段の仕事のロスタイムを減らせるメリット（今回の場合ならファイルを作り直すロスタイムを生み出さずに済んだこと）があると、さらにひしひしと実感。。。

もっといい方法があるよ、ここ解釈まちがってるよ等ありましたら、コメントくださいm(_ _)m

もっと技術磨き、頑張るぞーーー！
CLIP STUDIO PAINTでカラーセットの設定だけを別デバイスに引き継ぎたい

#やり方

下記ファイルを引き継ぎ元からコピーして、引き継ぎ先に上書きするだけでOK。

```
C:\Users\ユーザー名\Documents\CELSYS\CLIPStudioPaintVer1_5_0\ColorSet\default.pcs
```

※引き継ぎの時は念の為にCLIP STUDIO PAINTを終了しておいた方がよいです。

#蛇足

筆圧とかブラシの設定はデバイスごとに特有にしたいけど、カラーセットは共通化しておきたいです。

CLIP STUDIO PAINTの起動 or 終了時に自作のスクリプトを実行できるといいなあって思った。
いちいち手動で『default.pcs』ファイルを移動して同期取るの面倒だから…。
でもそこまで頻度高くないし…。微妙。


#バージョン
Windows10 Pro バージョン20H2 OSビルド19042.685
CLIP STUDIO PAINT PRO （64ビット） 1.10.6 202012211752
【随時更新】Apple Silicon (M1)での開発環境

M1対応してるなら対応版を使いたいのでメモ

とりあえず [Is Apple silicon ready?](https://isapplesiliconready.com/) をチェック

## 前提

- `arch`コマンドが使えること
    - Rosettaが入っていればいいらしいのでKarabiner-Elementsとか入れるタイミングで入るはず
- Homebrewで入るものはできるだけHomebrewで
    - 好みで使わないものもあると思うけど

## 対応済み一覧

|ソフトウェア名|配布チャネル|URL|メモ|
|----|----|----|----|
|Chrome|公式||不具合遭遇※1|
|VSCode|公式|https://code.visualstudio.com/|v1.54で対応|
|Homebrew|公式インストーラ|https://brew.sh/index_ja|公式サイトのワンライナーでのインストール|
|git|Homebrew||`brew install git`|
|iTerm2|Homebrew||`brew install iterm2` 設定は[こちらを参考に](https://qiita.com/moomooya/items/81cde5d442a229586eff)|
|pyenv|Homebrew||`brew install pyenv`|
|Docker Desktop|公式|https://docs.docker.com/docker-for-mac/apple-silicon/|v3.3.1で対応。Tech Previewからはアップデートで対応|
|Node.js|公式|https://nodejs.org/ja/|v16からビルド済みバイナリが用意された|
|||||



### ※1 Chromeで画像やFaviconが表示されないなどの不具合

対策として[設定]>[ハードウェアアクセラレーションが使用可能な場合は使用する]をオフにする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31037/70ab6cbf-61d4-5699-b181-07c3bb54868f.png)


随時追記

## まだ動作しないっぽいもの

|ソフトウェア名|参考URL|メモ|
|----|----|----|
|minikube|[minikube on Apple Silicon / M1 CPU (darwin-arm64)](https://github.com/kubernetes/minikube/issues/9224)|hyperkitが未対応|
|VirtualBox|[VirtualBox in ARM M1 OSX Host](https://forums.virtualbox.org/viewtopic.php?f=8&t=98742)|対応しない|
||||


## CPU依存のないもの

シェルで構築されていたりとか

|ソフトウェア名|配布チャネル|URL|メモ|
|----|----|----|----|
|pyenv-virtualenv|Homebrew||`brew install pyenv-virtualenv`|
|nodenv|Homebrew||`brew install nodenv`|
|||||
リファクタリングの可能性を示唆する不吉な匂い一覧

 - 重複したコード
   - コードがあちこちでダブっている
 - 長すぎるメソッド
   - メソッドが長すぎる
 - 巨大なクラス
   - クラスが持っているフィールドやメソッドが多すぎる
 - 多すぎる引数
   - メソッドへ渡す引数が多すぎる
 - 変更の発散
   - 仕様変更が起きた時の修正箇所があちこちに散らばっている
 - 変更の分散
   - あるクラスを修正すると、他のクラスもあわせて修正しなければならない
 - 属性、操作の横恋慕
   - いつも他のクラスの中身をいじってるクラスがある
 - データの群れ
   - まとめて扱うべき複数のデータが、１つのクラスにまとまっていない
 - 基本データ型への執着
   - クラスを作らず、intのような基本データ型ばかり使っている
 - スイッチ文
   - switch文やif文を使って振る舞いを分けている
 - パラレル継承
   - サブクラスを作るとクラス階層の別のところにもサブクラスを作らなければならない
 - 怠け者クラス
   - クラスが大した仕事をしていない
 - 疑わしき一般化
   - いつかこういう拡張もするだろうと期待して、一般化しすぎる
 - 一時的属性
   - 一時的にしか使わないフィールドがある
 - メッセージの連鎖
   - メソッドの呼び出しの連鎖がある
 - 仲介人
   - 移譲ばかりしていて、自分では仕事をしていないクラスがある
 - 不適切な関係
   - その必要がないのに双方向リンクを張っていたり、IS－A関係がないのに継承を使っていたりする
 - クラスのインタフェース不一致
   - クラスのインタフェース（API）が不適切である
 - 未熟なクラスライブラリ
   - 既存のクラスライブラリが使いにくい
 - データクラス
   - フィールドとgetterメソッドとsetterメソッドしか持っていないクラスがある
 - 相続拒否
   - 継承しているメソッドなのに、それを呼ぶと問題が起きる
 - コメント
   - コードの不備を補なうために、詳しいコメントがある
変数初期化のアセンブリ一例

#変数初期化のアセンブリ一例

C言語における変数初期化のアセンブリの一例です（自分メモ）。
諸々の設定によりアセンブリは変わります。

・x86-64 gcc 10.2
・確認環境：[Compiler Explorer](https://gcc.godbolt.org/)


32ビット以下は簡単。

```:C言語
// 32bit以下
int     i = 100;
char    c = 'a';
bool    b = true;
long    l_1 = 100;
char    str_1[] = "aaa";
```

```:アセンブラ
mov     DWORD PTR [rbp-4], 100
mov     BYTE PTR [rbp-5], 61h
mov     BYTE PTR [rbp-6], 1
mov     QWORD PTR [rbp-16], 100
mov     DWORD PTR [rbp-20], 616161h
```

32ビットを超えるとレジスタを使い始める。
※movabs、movsdは、ざっくりmovと同じと考えてよい。
※doubleの詳細は[Wikipedia参照](https://en.wikipedia.org/wiki/Double-precision_floating-point_format/)

```:C言語
// 32bit～64bit
long    l_2 = 9223372036854775807;
char    str_2[] = "aaaaaaa";
double  d = 3.14;
```

```:アセンブラ
movabs  rax, 9223372036854775807
mov     QWORD PTR [rbp-8], rax
movabs  rax, 61616161616161h
mov     QWORD PTR [rbp-24], rax
movsd   xmm0, QWORD PTR .LC0[rip]
movsd   QWORD PTR [rbp-16], xmm0

.LC0:
        .long   1374389535
        .long   1074339512
```

一見、32ビット超えても以下でいいんじゃないかと思うが、

```:アセンブラ
mov     QWORD PTR [rbp-8], 9223372036854775807
```

以下を見ると納得。

```:C言語
// 64bit～
char    str_3[] = "aaaabbbbccccddddeeeeffffgggghhhh";
```

```:アセンブラ
movabs  rax, 6262626261616161h
movabs  rdx, 6464646463636363h
mov     QWORD PTR [rbp-48], rax
mov     QWORD PTR [rbp-40], rdx
movabs  rax, 6666666665656565h
movabs  rdx, 6868686867676767h
mov     QWORD PTR [rbp-32], rax
mov     QWORD PTR [rbp-24], rdx
mov     BYTE PTR [rbp-16], 0
```

ちなみに、文字数により最後のアセンブリは変わる。

```:アセンブラ
movabs  rax, 6262626261616161h
mov     QWORD PTR [rbp-12], rax
mov     DWORD PTR [rbp-4], 636363h
```
最短経路問題-ベルマンフォード法を学ぶ

# 最短経路問題
最短経路問題とは、ある2頂点が与えられたグラフの頂点を始点・終点とするとき、その頂点同士を結ぶ辺のコスト(距離)の和が最小とする問題です。

## ベルマンフォード法
最短経路問題を解く手法の一つにベルマンフォード法というものがあります。

ベルマンフォード法では、始点から他のすべての頂点への最短経路を求めることができます。
### アルゴリズム概要
始点 s から頂点 i への最短距離を d[i] , 頂点 i から頂点 j へのコストを Cij とすると以下の等式が成り立ちます。(ちなみにEは辺の集合です)
ちなみに、これは負の閉路が存在しないことをまずは前提(というのも負の閉路検出の方法もできるので)とし考えていきます。
なので、負の閉路が存在しなければ、最短経路は同じ頂点を通らないので、繰り返す回数の最大値は(頂点数−1)回になります。

```
d[i] = min{ d[j] + Cij ∣ e = (j,i) ∈ E }
```

式だとわからないと思うので、簡単にアルゴリズムの動きを言語化するならば下記のようになります。

```
1. 全ての辺に対し、その辺を通った頂点のコストが小さければ値を更新する。
2. 1のプロセスを（頂点の数-1）回行います。
```

### 実装してみよう

```sample.js
// 初期化
const graph = [
     [null, 1, 3, null, null, null],
     [null, null, 1, 4, null, null],
     [null, null, null, 1, null, null]
];
let dist = [];

for(var i = 0; i < graph.length; i++){
    dist[i] = Number.POSITIVE_INFINITY;
}
dist[0] = 0;

const shortest_path = () => {
    const n = graph.length;
    for(var i = 1; i <= n; i++){
        failOnUpdate = (i === n);
        let update = false;
        for(var u = 0; u < n; u++){
            for(var ci = 0; ci < n; ci++){
                if(!graph[u][ci]){
                    continue;
                }
                const newLen = dist[u] + graph[u][ci];
                if(newLen < dist[ci]){
                    if(failOnUpdate){
                        throw new Error('負の閉路');
                    }
                    dist[ci] = newLen;
                    update = true;
                }
            }
        }
        if(!update){
            break;
        }
    }
};

// 結果
shortest_path()
console.log("最短距離");
console.log(dist);

```

## 参考文献
[プログラミングコンテストチャレンジブック [第2版]](https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%82%B3%E3%83%B3%E3%83%86%E3%82%B9%E3%83%88%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8%E3%83%96%E3%83%83%E3%82%AF-%E7%AC%AC2%E7%89%88-%EF%BD%9E%E5%95%8F%E9%A1%8C%E8%A7%A3%E6%B1%BA%E3%81%AE%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E6%B4%BB%E7%94%A8%E5%8A%9B%E3%81%A8%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF%E3%82%92%E9%8D%9B%E3%81%88%E3%82%8B%EF%BD%9E-%E7%A7%8B%E8%91%89%E6%8B%93%E5%93%89/dp/4839941068)
GSLB(広域負荷分散)とは

## 勉強前イメージ

広域負荷分散・・・多分普通のLBとは違うんだろうなぁ....
広域だからDCを超えての負荷分散的な？

## 調査

### GSLB(広域負荷分散)とは

GSLBはGlobal Server Load Balancingの略で、DNSを利用して複数の拠点間でサーバのロードバランシングを行う機能です。


### GSLBの動作

1. クライアントPCからアクセスされたリクエストは外部DNSを通って内部DNSへ送信されます
2. 内部DNSでは A拠点、またはB拠点のGSLBのAレコードを返し、クライアントPCはどちらかの拠点にリクエストを送ります
3. クライアントPCはどちらかの拠点でセッションを開始します

![GSLBUntitled Diagram.drawio - diagrams.net - Google Ch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/90f15882-c703-9559-7210-d9c20afbf97f.png)

### GSLBのメリット

- サーバを物理的に分散して、負荷分散させることが可能

1拠点のみで負荷分散していると、その拠点が災害にあった際にサービスが提供できなくなりますが、
物理的に負荷を分散していると1拠点で通信が出来なくなっても、他の拠点でリクエストを受けることが出来ます
地理的な分散ができるとのことで [ディザスタリカバリ対策](https://qiita.com/miyuki_samitani/items/b541bc89e673d5e4844f) にもなります。

- 拠点までの距離や優先順位に応じてトラフィック転送を実現

クライアントの地理的位置により、最適な拠点にリクエストを送ることが可能


## 勉強後イメージ

DCごと負荷分散できる機器があるなんて知らなかった....
確かにDR対策ではすごいいいかも・・・
Route53では確かにフェイルオーバールーティングとか加重ルーティングとかで実現できそう・・！
bindにもそういう機能あったりするんかな？

## 参考

- [GSLB - Global Server Load Balancing](https://www.infraexpert.com/study/loadbalancer8.html)
- [GSLB(広域負荷分散)とは](https://www.willnet.ad.jp/gslb/)
- [DNS / GSLB（広域負荷分散）/ ドメイン取得・管理](https://pfs.nifcloud.com/service/dns.htm)
JavaScriotのfilterとsortについて

備忘録です。

```js
const satoru = {
  age: 38,
  name: 'tanaka'
};

const ken = {
  age: 34,
  name: 'yamada'
};

const nozomi = {
  age: 30,
  name: 'koyama'
};

const users = [ken, nozomi, satoru];

const ages = users.map(user => {
  const tall = user.age*5; // 年齢を5倍した数を、仮に身長の数値に見立てただけで、意味はありません。
  return tall;
});

const segatakaihito = ages.filter(tall => tall > 172)

console.log(ages.sort().reverse()); //並び替え、背が低い順
console.log(segatakaihito);
```

結果

```console
(3) [190,170,150]
(1) [190]
```
【Addressable Asset System】BuildPath/LoadPathのRemote/Localをスクリプト変更する処理覚え書き

### コード

```.cs
    static void ChangeAssetGroupSetting(bool toRemote)
    {
        // カタログを生成するかどうかのフラグ切り替え
        AddressableAssetSettingsDefaultObject.Settings.BuildRemoteCatalog = toRemote;

        // 設定したAddressable Groupを全て取得
        foreach (var group in AddressableAssetSettingsDefaultObject.Settings.groups)
        {
            if (group.Default || group.ReadOnly)
            {
                // Built in DataとDefaultグループは処理対象から除外
                Debug.Log($"Skip: { group.Name }");
                continue;
            }

            Debug.Log($"Update: { group.Name }");
            var pathSetting = group.GetSchema<BundledAssetGroupSchema>();
            if (pathSetting != null)
            {
                if (toRemote)
                {
                    // サーバーからDLする設定に変更
                    pathSetting.BuildPath.SetVariableByName(AddressableAssetSettingsDefaultObject.Settings, AddressableAssetSettings.kRemoteBuildPath);
                    pathSetting.LoadPath.SetVariableByName(AddressableAssetSettingsDefaultObject.Settings, AddressableAssetSettings.kRemoteLoadPath);
                }
                else
                {
                    // ローカルに組み込む設定に変更
                    pathSetting.BuildPath.SetVariableByName(AddressableAssetSettingsDefaultObject.Settings, AddressableAssetSettings.kLocalBuildPath);
                    pathSetting.LoadPath.SetVariableByName(AddressableAssetSettingsDefaultObject.Settings, AddressableAssetSettings.kLocalLoadPath);
                }
            }
        }
    }
```

### 一言
正直、処理を書くよりも仕様を調べることの方が疲れた。
公式でサンプル乗っけといてほしい。

もし公式マニュアル・リファレンス探してる人がいる場合はこちら（英語）
https://docs.unity.cn/Packages/com.unity.addressables@1.9/manual
PyCallがPyCall::PythonNotFoundで動かないとき

rbenvでインストールしたRubyで、pyenvでインストールしたPythonを、pycallで呼ぼうとしたときPyCall::PythonNotFoundで落ちた。find_libpythonメソッドでlibpythonが見つけられていない様子。

```sh
Traceback (most recent call last):
        5: from hoge.rb:4:in `<main>'
        4: from /Users/fuga/.anyenv/envs/rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/pycall-1.3.1/lib/pycall/import.rb:18:in `pyimport'
        3: from /Users/fuga/.anyenv/envs/rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/pycall-1.3.1/lib/pycall.rb:62:in `import_module'
        2: from /Users/fuga/.anyenv/envs/rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/pycall-1.3.1/lib/pycall/init.rb:16:in `const_missing'
        1: from /Users/fuga/.anyenv/envs/rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/pycall-1.3.1/lib/pycall/init.rb:35:in `init'
/Users/fuga/.anyenv/envs/rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/pycall-1.3.1/lib/pycall/libpython/finder.rb:95:in `find_libpython': PyCall::PythonNotFound (PyCall::PythonNotFound)
```

確認コマンドを実行する。

```sh
$ PYCALL_DEBUG_FIND_LIBPYTHON=1 ruby -rpycall -ePyCall.builtins
...
DEBUG(find_libpython) Fiddle::DLError: dlopen(libpython3.9.a, 9): image not found
DEBUG(find_libpython) Fiddle::DLError: dlopen(libpython3.9, 9): image not found
DEBUG(find_libpython) Fiddle::DLError: dlopen(libpython, 9): image not found
```

static libraryをdlopenしようとしていて失敗している。shared libraryなlibpythonがインストールされるように、pyenvでPythonをインストールしなおす。

```sh
$ CONFIGURE_OPTS="--enable-shared" pyenv install 3.9.1
```

これで無事に動いた。
nginxが起動できなかったお話【ポート競合】

#0. 結論
nginxが起動できない原因は、apacheが動いていたからだった。
下記のコマンドでapacheを終了させることで、解決した。

```
sudo service apache2 stop
```

#1. 実行環境/バージョン
Ubuntu 20.04
nginx/1.18.0 (Ubuntu)

#2. nginxのインストール
下記のコマンドで、nginxのインストールは無事終了

```
sudo apt update
sudo apt install -y nginx
```

#3. nginxの起動

下記のコードで、nginxの起動を試みるが...

```
sudo service nginx start
```
結果は以下の通り。何度やっても同じ。

```
Job for nginx.service failed because the control process exited with error code.
See "systemctl status nginx.service" and "journalctl -xe" for details.
```

大人しく、「systemctl status nginx.service」、「journalctl -xe」を実行しても解決せず。

#3. エラーログをのぞいてみる

とりあえずnginxのエラーログをみようということで、下記を実行

```
sudo cat /var/log/nginx/error.log
```

すると、どうやらポートがすでに使われているらしい。ふーむ。

```
2021/01/13 14:48:51 [emerg] 940#940: bind() to 0.0.0.0:80 failed (98: Address already in use)
2021/01/13 14:48:51 [emerg] 940#940: bind() to [::]:80 failed (98: Address already in use)
2021/01/13 14:48:51 [emerg] 940#940: bind() to 0.0.0.0:80 failed (98: Address already in use)
2021/01/13 14:48:51 [emerg] 940#940: bind() to [::]:80 failed (98: Address already in use)
2021/01/13 14:48:51 [emerg] 940#940: bind() to 0.0.0.0:80 failed (98: Address already in use)
2021/01/13 14:48:51 [emerg] 940#940: bind() to [::]:80 failed (98: Address already in use)
2021/01/13 14:48:51 [emerg] 940#940: bind() to 0.0.0.0:80 failed (98: Address already in use)
2021/01/13 14:48:51 [emerg] 940#940: bind() to [::]:80 failed (98: Address already in use)
2021/01/13 14:48:51 [emerg] 940#940: bind() to 0.0.0.0:80 failed (98: Address already in use)
2021/01/13 14:48:51 [emerg] 940#940: bind() to [::]:80 failed (98: Address already in use)
2021/01/13 14:48:51 [emerg] 940#940: still could not bind()
```

#４. 実行中のプロセスをのぞいてみる

じゃあ誰が使ってるんだよということで、誰が80番のポートを使用しているかを下記のコマンドで確認

```
sudo lsof -i:80
```

ん...？なんでapachが動いてるん？？動かした記憶ないんだけど。。。

```
COMMAND   PID     USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
apache2  9335     root    4u  IPv6  39599      0t0  TCP *:http (LISTEN)
apache2 58125 www-data    4u  IPv6  39599      0t0  TCP *:http (LISTEN)
apache2 58126 www-data    4u  IPv6  39599      0t0  TCP *:http (LISTEN)
apache2 58128 www-data    4u  IPv6  39599      0t0  TCP *:http (LISTEN)
apache2 58129 www-data    4u  IPv6  39599      0t0  TCP *:http (LISTEN)
apache2 58130 www-data    4u  IPv6  39599      0t0  TCP *:http (LISTEN)
apache2 58555 www-data    4u  IPv6  39599      0t0  TCP *:http (LISTEN)
apache2 59778 www-data    4u  IPv6  39599      0t0  TCP *:http (LISTEN)
```

#5. 実行中のプロセスを終了

apacheによって80番ポートが占領されていたことが原因っぽいので、下記のコマンドで終了してみる

```
sudo service apache2 stop
```
何も返ってこないので、無事終了したっぽい。
もう一回使用状況を確認すると

```
sudo lsof -i:80
```
何も表示されず！！これはきたのでは。


#6. nginxの起動リベンジ

さて、これでどうだ

```
sudo service nginx start
```

はい、何も返ってこず、無事起動成功~
リーダブルコード読んで意識していきたいことをまとめる part2

[前回](https://qiita.com/gal1996/items/30e9f03a508d4316dcb0) の続きから行こうと思いますー

# 4章 美しさ
4章は完全にコードの見た目に関する内容です

## メソッドを使ったコードの整列化
4章は割と自分は普段意識していたりフォーマットかけると解決するものが多かったですが、これは今までになかった視点なので今後も意識していきたいです。
コードの1行が長くなりすぎるせいで、同じ処理をしているけど煩雑なコードの見た目になる時があると思うのですがそこを関数に切り出して見た目を整えるという方法が出ていました。この観点で関数を切り出すことはなかったので今後やれる時があったらやってみようと思います。

## 一貫性のある並び
フィールドの多い構造体があって、その生成の時にフィールド全部宣言しているかわからんくなって定義まで飛んだことってみなさんないですかね？
僕は割とあるのですが（エディタは補完してくれるけど全部宣言したかは教えてくれないので)、フィールド名の順序に規則を持たせるといいなーと思いました。
個人的にはアルファベット順が普遍的でいいなーと思うのですが、DBのkeyなどは一番上に置きたい気持ちがあるし、人に関するものなら `Name` とかは上の方に置きたい気持ちがあるのでいい感じに取り入れたいです。

# 5章 コメントすべきことを知る
どんなことをコメントすべきかについて書いてある。この章にあることは割と自分でも意識できてたし、チームのコード規約にもあったりするものが多かったのでそんなになかった。

## 定数にコメントをつける
定数にコメントつけた記憶があまりなかったので意識してみたい。pathとかの定数は別にいらないけど、閾値とかの定数を用意する場合その値の背景を書いてみるのが良さそう。

## 自分の頭に浮かんだことをとりあえずコメントする
これはコードを読みやすくするという観点ではないけれど、自分がコード書いててこのパターンまずいな、けど実装どうやってやろうとか思った時にとりあえずコメントしておいて後々その注意点を忘れないようにするとかって使い方ができそう。仮に対応しなくなったとしたらそれは残しておくべき。

# 6章 コメントは正確で簡潔に
コメントの内容についての章です

## 複数のものを指す可能性がある指示語は使わない
これは今まで普通に使っちゃってた気がする。言われてみると自分は指示語の内容がわかっているけどめっちゃ齟齬が起きそうなポイントである。今後はコメントで複数の理解ができる指示後は使わないようにする。

## コメントに入出力の実例を使う
これもやったことがなかった。言葉で表現すると冗長でわかりにくくなるものは、エッジケースの例を使って説明すると読む側も安心して挙動がわかりそう。実践する。

今日はこの辺にしとこうと思います。
解析学の勉強をはかどるために使ったツール

#なぜこんな記事を書くことになったのか#

微積ってこんなにめんどくさかったかな。基本的なこともできずに微分積分など高校生の頃まじめにやってきましたが、大学生になってから途端にできなくなってびっくり。

そんな結果単位を落として再履修に至りますが、中間期末とテストではかなりのいい成績が取れたと思っているので、これで落ちたら笑えない。

ってことで前置き長くなりましたが、そんな僕でもとても便利なツールをフルに使えば単位取得につながるかも。そんな人を救いたいと思いこの記事を書きました。
あ、ちなみに解析学は全然知りません。計算で単位が取れたといっても過言ではないので、計算の意味は説明はできませんのであしからず。


#Mathematica#

https://www.wolfram.com/index.ja.html
このサイトには本当にお世話になりました。微分積分はもちろん機械学習なども扱っているので、試験勉強でわからない関数などあったら、実際にコードを打つと計算過程が出てくるので、検算などにもよく使いました。
学生なので、無料で使えるのは強すぎる。実際に打ったコードですが

```mathematica

(*条件付き極値の値を求める*)

f = x^2 + 2*x*y + y^2
g = x^2 + y^2 - 1
L = f - \[Lambda]*g
(*一階微分の値を出す*)

Lx = D[L, x]
Ly = D[L, y]
L\[Lambda] = -D[L, \[Lambda]]
gx = D[g, x]
gy = D[g, y]
(*二階微分の値を求める*)
Lxx = D[L, {x, 2}]
Lyy = D[L, {y, 2}]
Lxy = D[L, x, y]
Lyx = D[L, y, x]


```

この後、x,y,λの値を求めて、3*3のヘッセ行列を求めて極値判定をするのですが、なぜかうまく表示されないので、続きは画像を貼り付けます。
![条件付極値の画像.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680378/53fa69af-f882-064c-b4cd-0581e7863c54.png)


箇条書きでアルゴリズムとは無縁のコードですが、この結果を求めると、

![条件付極値の結果.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680378/434352a6-77f4-ee59-309a-8d722239dce4.png)

x,y,λのそれぞれ四つの停留点を全て求めることができましたが、3*3の行列式には、全部いちいち代入するのがめんどくさかったけれど計算過程も、答えもすぐ出てくれるのは強い。

#WolframeAlpha#
https://www.wolframalpha.com/
Mathematicaの中に入っているのかな?
WolframeAlphaさんもとてもとても。お金を入れないと計算過程は出力はしませんが、答えとグラフも全て載せてくれるありがたい。
数学のほかにも社会と文化、日常生活ほかにも世界地図の欄もありますのでわからないことがあったらここを使うのも一つの手ではないのでしょうか。


#Derivative Calculator　　Integral Calculator#

https://www.integral-calculator.com/
https://www.derivative-calculator.net/
このサイトにも本当にお世話になりました。

これ作った人マジで神だなって思います。latex出力もしてくれますし、計算過程もすべて表示してくれます。
レポートを書くには心強いと思います。
字句解析と構文解析をフルに使ってやってるんだろうなって思いますが、どうやってやってるんだろう。
例えば１＋１＝２といった計算をどうやって分けて字句解析を行って出力しているのか不思議...
とりあえずそれっぽいこと言ってみましたが、大学生のお気持ちを理解して下さる神に圧倒的感謝。

#感想#
Mathematicaって知っている人多そうですが一応紹介しました。グラフのイメージがとてもとても分かりやすく試験勉強にはかどりました。ラグランジュの未定乗数のイメージもなんとなくつかめたような気がします。単位よ来い！！！
コマンドの出力値を取得（xargs で受け取った中で）

こんにちは。
コマンドの出力値を（```$(command)```）、```xargs``` で受け取った中で取得しました。コメントをいただき、正しく動くように修正しました。今回例では ```basename``` コマンドの出力値を確認しています。


```console
$ find . -name "*.txt" | xargs -I% sh -c 'echo "$(basename "%" .txt)"'
a
b
$ ls .
a.txt  b.txt
```

### while read ループ利用 ###

```while read``` ループ利用でも試しました。

```console
$ find . -name "*.txt" | while read f; do echo "$(basename "$f" .txt)"; done
a
b
```
[VBA,VB6]GoToとラベルの使いどころ

[本記事は、自分サイトのこの記事と同一内容です。](https://hagiayato.github.io/my-site/jekyll/update/2021/01/14/GoToAndLabel.html)
# はじめに
皆さんはプログラムでGoToとラベルを使っていますか?
~~GoToトラベルではありません~~
…GoToは下記理由であまり使われません。

 - 読みにくい・処理を理解しにくいコードになる
 - if,for,while,try-catchで代替できる

でも言語によっては、GoToを使わないといけない場面が出てきます。
その一つが、VBAおよびVB6のようなVB.net以前のVBです。
# Case1：例外
VBAおよびVB6,VB5には、try-catch構文がありません。
代わりに、```On Error文```があるのでこれをGoToと併せて使いましょう。

```vb
On Error GoTo Catch ' Try{ に相当

' 例外検知をしたい処理
GoTo Finally

Catch: ' }catch(Exception e){ に相当

' 例外処理

Finally: ' }Finally{ に相当
On Error Resume Next ' Finallyの中では例外を無視(そもそも出さないようにコードを書くこと)
' メモリ開放など例外発生に関係なく最後にやる処理
```
ちなみに最初から```On Error Resume Next```により例外を無視することができます。
この場合、例外および例外による意図しない動作の分析がしにくくなるので要注意。

# Case2：ループのContinue
forやwhileループについて、途中で処理とループを打ち切るbreak相当の処理はあります。
```Exit For/Do```を使うだけ。
問題は途中で処理を打ち切り次のループに移るcontinueがないということです。
ここに関してはGoToとラベルを使いましょう。

```vb
Dim i As Integer

For i = 初期値 To 終了値 Step 増分
    ' ループ内処理1
    ' Continue判定 条件を満たす場合はループ内処理2をしない
    If Continue条件 Then GoTo Continue
    ' Break判定 条件を満たす場合はここで処理打ち切り
    If Break条件 Then Exit For
    ' ループ内処理2
Continue:
Next
```

# おわりに
GoToとラベルはVBA、VB6ではまだまだ使う機会が多いですし、
これらの開発をしなくても、VB6を.netに置き換えるためにコードを読むことがあり得ます。
最小限、かつ分かりやすく使っていきましょう。
Railsで内容を更新しても反映されない？

### ★内容を更新したのに反映されない。。。
springが悪さをしているかも？

springはrails sをした時に
同時に立ち上がり読み込むもので古い情報を読み込んでいる可能性がある


### ❶rails sをして別タブでspring stop
再度springをして挙動を確認すると悪さをなくせるかも?

```ruby
$ spring stop

Spring is not running
```

### ❶プロセスを見てみる
ここで下記以外のプロセスがあるようならKILL

```ruby
ps aux | grep spring
```
![１２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/958284/b930ca98-df88-8fd9-d0a7-1030e1e402dd.png)

$ ps aux | grep spring で、KILLを実行後、KILLできているか確認

```ruby
$ kill -9 ◯◯◯◯

$ ps aux | grep spring
```
Svelte+Electron開発環境構築

# コード（できたもの）

[yoshida-san / svelt-and-electron-dev-env](https://github.com/yoshida-san/svelt-and-electron-dev-env)

# ベースプロジェクト

[yoshida-san / sapper-ext](https://github.com/yoshida-san/sapper-ext)

# Electron対応

## パッケージ追加

```sh
~$ npm i -D electron
~$ npm i electron-serve
```

## エントリポイント追加

`package.json`

Electronのエントリポイントはmain.jsが慣例だった気がする。

```js
"main": "main.js"
```

`main.js`

```js
const { app, BrowserWindow } = require('electron')

function createWindow() {
  const win = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
      nodeIntegration: true
    }
  })

  win.loadFile('__sapper__/export/index.html')
}

app.whenReady().then(createWindow)

app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') {
    app.quit()
  }
})

app.on('activate', () => {
  if (BrowserWindow.getAllWindows().length === 0) {
    createWindow()
  }
})
```

## 動かす

```sh
~$ npx electron .
```

npm scriptのstartを変えておく。

```js
"start": "electron ."
```

# テスト関連

## 単体とコンポーネント

```sh
~$ npm run test:unit
~$ npm run test:components
```

当然ながら問題なく動く。

## E2E

CypressのElectron対応はalpha releaseを最後に音沙汰ないっぽいので[Spectron](https://www.electronjs.org/spectron)を使いましょう。Spectronの使い方はまた後日。

とりあえず不要なものを削除しておきます。

```sh
~$ npm r cypress
~$ rm -rf ./test/e2e
~$ rm cypress.json
```

# ビルド（パッケージング）

## Build用Package追加と設定

```sh
~$ npm i -D electron-builder
```

`package.json`

```js
"build": {
  "appId": "com.electron.sapper-ext",
  "productName": "SapperExt",
  "directories": {
    "output": "dist"
  },
  "files": [
    "__sapper__/export/**/*",
    "main.js"
  ]
}
```

distディレクトリにビルド結果が出力されます。

## Windows向けビルドコマンド

```sh
~$ npx electron-builder --win --x64 --dir
```

exe, DLL等が展開された状態で出力されます。

```sh
~$ npx electron-builder --win --x64
```

Windows用インストーラが出力されます。

## Mac向け

```sh
~$ npx electron-builder --mac --x64 --dir
```

Mac用アプリケーション(.app)が出力されます。

```sh
~$ npx electron-builder --mac --x64
```

Mac用インストーラが出力されます。

# おわり

アイコン設定とか細かい設定は公式ドキュメントを参照ください。
以前触った記憶でやったので今はこうするのが主流とかあれば教えてもらえると嬉しいです。