OmniAICreator/Qiita-1.07M huggingface dataset:
neosでlogix その44

# 概要

neosでlogixやってみる。
Apply Character Forceノード使ってみた。

# 写真


![2021-12-29 22.35.43.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/63ac0685-cbc0-1ae4-a6f9-a138e706a5bf.jpeg)

# Apply Character Force

```
Inputs
 	Impulse	Apply
 	Float3	Force
 	CharacterController	Character
 	Bool	IgnoreMass
Outputs
 	Impulse	OnDone
```

# 手順

- devtooltipを装着。
- 新規->3d->box
- インスペクターを開き、コンポーネントを追加
- Physics>CharacterController
- logixtooltipを装着。
- インターフェースを取り出す。
- ノードブラウザを表示。
- Actions>Write Refをスポーン。
- Users>Host Userをスポーン。
- Physics>Apply Character Forceをスポーン。
- つなぐ


以上。
Ubuntu 20.04.3 LTSにChromeとChromeリモートデスクトップをインストールする

#はじめに
UbuntuでChromeとChromeリモートデスクトップをインストールする際に参考にしたサイトのメモ。

#Chromeのインストール
UbuntuにChromeをインストールする
https://qiita.com/pyon_kiti_jp/items/e6032eb6061a4774aece

#Chromeリモートデスクトップのインストール
https://blog.ezic.info/34601.html

他のPCからUbuntuにリモートアクセスするにはUbuntu側はログアウトが必要。　
(マウスやキーボードなどは接続したままでもOK)
スピーカー特性の測定方法・・・１−２）マイク録音

pyaudioモジュールを用いた
音声ファイルの取り込み方法は以下のHPを参考としました。

https://algorithm.joho.info/programming/python/pyaudio-record/


以下にコードを引用しています。

```python
# -*- coding: utf-8 -*
import pyaudio
import wave 

def main():
    rec_time = 5            # 録音時間[s]
    file_path = "output.wav" #音声を保存するファイル名
    fmt = pyaudio.paInt16  # 音声のフォーマット
    ch = 1              # チャンネル1(モノラル)
    sampling_rate = 44100 # サンプリング周波数
    chunk = 2**11       # チャンク（データ点数）
    audio = pyaudio.PyAudio()
    index = 1 # 録音デバイスのインデックス番号（デフォルト1）

    stream = audio.open(format=fmt, channels=ch, rate=sampling_rate, input=True,
                        input_device_index = index,
                        frames_per_buffer=chunk)
    print("recording start.https://algorithm.joho.info/programming/python/pyaudio-record/https://algorithm.joho.info/programming/python/pyaudio-record/.")
    
    # 録音処理
    frames = []
    for i in range(0, int(sampling_rate / chunk * rec_time)):
        data = stream.read(chunk)
        frames.append(data)

    print("recording  end...")

    # 録音終了処理
    stream.stop_stream()
    stream.close()
    audio.terminate()

    # 録音データをファイルに保存
    wav = wave.open(file_path, 'wb')
    wav.setnchannels(ch)
    wav.setsampwidth(audio.get_sample_size(fmt))
    wav.setframerate(sampling_rate)
    wav.writeframes(b''.join(frames))
    wav.close()

if __name__ == '__main__':
    main()
```
クロージャーについて

# はじめに
クロージャーの概念や実装をまとめます。

# 定義
クロージャー:外的スコープの変数を関数が参照を保持する仕組みのこと

# 具体例
```javascript:main.js
const incrementCountFactory = () => {
  let count = 0;

  const incrementCount = () => {
    count++;
    console.log(`${count}回目です`)
  }

  return incrementCount;
}

const incrementCount = incrementCountFactory();
incrementCount(); // 1回目です
incrementCount(); // 2回目です
incrementCount(); // 3回目です

```
incrementCountFactory:countという変数とincrementCount関数を定義。戻り値はincrementCount関数を返す
incrementCount:外的スコープの変数countを使用してcountに1を追加する関数


# おわりに
メモリやガベージコレクションのことも追記していきたい。

# 参考
https://www.udemy.com/course/javascript-essence/
mathmaticaのHereシンボルの修正

mathmatica 12.3において、HereシンボルはIPv4アドレスによって求められているようで、正しい位置を示さない時がある。
PC自身の位置情報に変更することで、この不整合を修正する。

#1. 手法
1.JavascriptのGeolocation.getCurrentPosition()を使用し、PCの位置情報を入手。
2.Hereの更新
#2.位置情報入手
ローカルに作成したhtmlファイルをブラウザで開き位置情報を表示
[こちら](https://qiita.com/tonnkatubooy/items/5d1cb223fdb34b3c62c3)を参考にmathmatica用の出力に変更したもの

```html:get_pcLocation.html
<!DOCTYPE html>
<html lang="ja"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
  <title>Mathmatica Here update</title>
</head>
<body>
  <div id="position-display">現在位置を取得します</div>
  <script>
    // GPS センサの値が変化したら何らか実行する geolocation.watchPosition メソッド
    navigator.geolocation.watchPosition((position) => {
      let position_y = position.coords.latitude;      // 緯度を取得
      let position_x = position.coords.longitude;     // 経度を取得
      let accuracy = position.coords.accuracy;        // 緯度・経度の精度を取得
      displayData(position_y, position_x, accuracy);  // displayData 関数を実行
    }, (error) => {                                   // エラー処理（今回は特に何もしない）
    }, {
      enableHighAccuracy: true                        // 高精度で測定するオプション
    });

    // コマンドとデータをposition-displayに表示する displayData 関数
    const displayData = (position_y, position_x, accuracy) => {
      var txt = document.getElementById("position-display");      
      txt.innerHTML =
          "(* 以下をMathmaticaに コピー & ペーストしてください （この行を含めてもMathmaticaのコメントで無害です。）*)" + "<br>"+
          "Unprotect[Here]"  + "<br>"+
          "Here=GeoPosition[{" + position_y + "," + position_x + "}]" + "<br>"+
          "Protect[Here]"    +"<br>" +
          "(* 精度は: " + accuracy+"m です<br>" +
            "確認するときは<BR>" +
            "GeoGraphics[GeoMarker[Here]]<BR> *)<br>";
    }
  </script>
</body>
</html>
```
#3.Hereの修正
Hereは組み込みシンボルで、書き込み保護されている。
まず保護を解除し、位置情報を更新する
```
Attributes[Here]
Unprotect[Here]
Attributes[Here]
Here=GeoPosition[緯度,経度]
Protect[Here]
Attributes[Here]
```
#4.参照
[【アプリ開発 2】【Node.js JavaScript MongoDB】 JavaScriptを用いて端末の現在地を取得する。【2021年1月】](https://qiita.com/sho_U/items/0e86a7cb522b1d96ed7c
)
Ruby-FFIのManagedStructは、ObjectSpace#define_finalizerを利用して、GCにオブジェクトが回収される際に、予め登録されたメモリを解放する関数をFFIで呼ぶ

Ruby-FFIでは、C言語の構造体と、Rubyのクラスを関連付けることができる。Rubyのクラスのインスタンスオブジェクトが作成されると、C言語の構造体用のメモリが確保される。しかし、RubyのインスタンスがGCによって回収される時に、C言語の構造体のメモリが解放されるとは限らない。

そこでRuby-FFIでは、RubyのオブジェクトがGCに回収された時に、C言語側でメモリを自動的に解放してくれるクラス`ManagedStruct`というものが用意されている。ManagedStructはC拡張でゴリゴリと難しいことをしているのかと思いきや、意外にもシンプルにRubyで実装されている。

その内容を見てみると、`ObjectSpace#define_finalizer` というものを利用している。これはオブジェクトがGCに回収される時に呼び出されるメソッドのようだ。finalizerが呼ばれた時に、Cのメモリ解放用の関数が発火するようにしておけばいい。

この記事は以上です。
【Ruby のまずいコード】素数判定

# お題

引数として与えられた正の整数が素数かどうか判定するメソッドを書いてください。
[prime](https://docs.ruby-lang.org/ja/master/library/prime.html) ライブラリーは用いず，2 以上の整数で順に割り切れるかを調べるごくごく素朴な実装としてください。

# コード

```rb
def prime?(n)
  2.upto(Math.sqrt(n)) do |k|
    return false if n % k == 0
  end
  true
end
```

2, 3, 4, 5, 6, ... で割った剰余を求め，割り切れたら `false` を返しています。
どれでも割り切れなかったとき `true` を返しています。
4 以上の偶数は試す必要がありませんが，お題ではそういった工夫もせず素朴に実装することを求めているのでそうしています[^sbk]。

[^sbk]: この記事で伝えたい以外のことをできるだけシンプルにしたかったわけ。

ただし，効率に関わる大きな工夫が一つあります。
除数として `n` までの整数を試すのではなく `n` の平方根までの整数を試すようにしているのです。
というのは，$n$ がもし $\sqrt n$ を超える整数で割り切れるならその商は $\sqrt n$ 未満であるはずだからです。$\sqrt n$ までの整数で割り切れないならそれより大きな整数で割り切れるはずがありません。

# 問題点

危ういのは，繰り返しの上限を `Math.sqrt(n)` としていることです。
理論上は `n` の平方根でいいのですが，問題は `Math.sqrt` が誤差を含むということです。
一般に浮動小数点演算は誤差を含み得ます。

`Math.sqrt(n)` が `n` の真の（つまり数学上の）平方根以上であればいいのですが，真の平方根未満の場合もあります。その場合，テストすべき除数を一つ省いてしまうことになります。

例えば，数学的には $\sqrt{10^{46}} = 10^{23}$ のはずですが，

```rb
p Math.sqrt(10**46) < 10**23 # => true
```

で分かるとおり，`Math.sqrt` で求めた $\sqrt{10^{46}}$ の値は真の値より小さくなります[^gs]。
これでは誤判定が起こり得ますね。

[^gs]: 浮動小数点演算の結果は環境によって変わりうるので，全ての環境でこうなるとは限りませんが，一例は示せました。もう少し小さい数だと，手元の環境では `Math.sqrt(9904578032905937 ** 2)` が `9904578032905937` よりも小さくなりました。

ただ，実際に誤判定が起こるのはかなり大きな `n` の場合です。
おそらくこのコードでまともな時間内に判定できる限界を遥かに超えているでしょう。
それでもこれはまずいコードと言うべきです。正しく動作するかどうかがコードを見ても直ちには分からないからです。

# 改善

もし「数学的に厳密な平方根を超えない最大の整数」を簡単に得ることができれば解決ですね。
Ruby にはそのためのメソッド [Integer.sqrt](https://docs.ruby-lang.org/ja/master/method/Integer/s/sqrt.html) があります：

```rb
(7..10).each{ |n| p [n, Integer.sqrt(n)] }
# => [7, 2]
#    [8, 2]
#    [9, 3]
#    [10, 3]
```

これを使えば

```rb
def prime?(n)
  2.upto(Integer.sqrt(n)) do |k|
    return false if n % k == 0
  end
  true
end
```

と書けます。

まあ，多くの Ruby ユーザーは（このような素数判定の練習問題を除けば）`Integer.sqrt` を使う機会は無いでしょう。私も実際の仕事で使ったことはありません。


この記事で伝えたかったことは，「繰り返しの上限に浮動小数点演算の結果を用いる際にはよく気をつけよう」ということです。もう少し一般化すると，「浮動小数点数の大小関係の判定には気をつけよう」となりますね[^kw]。

[^kw]: それが目的ならもっとシンプルな例題があるわけですが，素数判定の話を採用したのは，この記事のようなコードが多数投稿されているのを見たからです。
Elastic Beanstalk環境の複数インスタンス上Dockerコンテナ内に同時にコマンド実行する方法

ローカルからElastic Beanstalk環境で立ち上がっている複数インスタンス上Dockerコンテナ内に、同時にコマンド実行するコマンド

▼超参考
[Elastic Beanstalk 特定環境の全インスタンス上でコマンドを実行する方法 - Qiita](https://qiita.com/megane42/items/57457f20960975f3e31d)

## 複数インスタンス上Dockerコンテナ内に同時にコマンド実行するパイプライン
CLIで以下パイプラインを実行

```bash
aws elasticbeanstalk describe-instances-health --environment-name my-env | jq -r ".InstanceHealthList[].InstanceId" | xargs -L1 -P2 -t -I {} eb ssh my-env --instance {} --command "sudo docker ps -a | grep 'entrypoint.sh' | awk '{print \$NF}' | xargs -t -I {} sudo docker exec {} bundle exec rails routes"
```

`my-env`というEB環境に立ち上がっている2台のインスタンス内Railsアプリケーション（Docker）にrailsコマンドが実行できます。
※もっとスマートに書ける方法をご存知の方がいましたらアドバイスいただけると嬉しいです！！

## 必要なもの
- AWS CLI
- EB CLI
- jq

## (簡単な)解説

### 1. インスタンス情報取得
- `aws elasticbeanstalk describe-instances-health --environment-name my-env`
    - EB環境`my-env`のインスタンス情報を取得
- `jq -r ".InstanceHealthList[].InstanceId"`
    - 取得したインスタンス情報をjqに渡してインスタンスIDのみを抽出

### 2. インスタンスSSH接続
- `xargs -L1 -P2 -t -I {}`
    - 渡ってきたインスタンスIDを使用して以下eb sshコマンド作成
    - インスタンスが2台のため2プロセスを使って並列処理、それぞれ渡す引数は1つずつ
- `eb ssh my-env --instance {} --command ""`
    - インスタンスIDを指定してeb ssh
    - インスタンス内で実行するコマンドを引数に記載(中身は後述)

### 3. docker情報取得(インスタンス内)
- `sudo docker ps -a`
    - インスタンス内のDockerコンテナ情報を表示
- `grep 'entrypoint.sh' | awk '{print \$NF}'`
    - Dockerコンテナ情報から対象のコンテナをgrepし、awkでNAMESを抽出

### 4. dockerコンテナ内コマンド実行
- `xargs -t -I {} sudo docker exec {} bundle exec rails routes"`
    - 渡ってきたDockerコンテナ名を使用してdocker execコマンドを作成
    - docker execコマンドにコンテナ内で実行したいコマンドを記載する(bundle exec ~)

## 参考
https://qiita.com/megane42/items/57457f20960975f3e31d

https://zenn.dev/sickleaf/articles/99884a12b0489cf21d45
わからないことがわからない病の治し方

## 自分のスペック
2021年4月に、実務未経験からエンジニアとして入社しました。今はReact×TypeScriptでフロントの開発を行っています。
エンジニア1年目のつまらない悩みだと思って読み進めてください。

## ぶち当たった壁
研修期間を経て実務に入れたわけなのですが、最初は不安だらけでした。
ただ、同じチームの先輩エンジニアがとても優しい方で、「5分詰まったら質問して良いから！」というくらい、質問に対してはウェルカムな環境でした。(さすがに5分で質問するようなことはしませんでしたが…)

いざ、実装に入っていくわけですが、まあ案の定わからないことだらけなわけです。自宅でのキャッチアップなんて何の意味もなかったんじゃないかというくらい、全く手が動きません。

とりあえずググろうと思っても…、

**「あれ、どんなワードでググれば良いんだ…？」**

となりました。ググるワードがわからず、15分から30分くらい「どうググるか」で悩んだこともあります。

もういい、質問しよう！と思っても、

**「あれ、何を質問すれば良いのだろう…？」**

となり、質問の仕方を考えるだけで30分から1時間くらい費やしたこともあります。

つまり、**「何がわからないのかがわからない」**状態に陥っているわけです。
結局、時間が経つ一方で何も進まない状態が続いたので、実務に入りたての頃は自分だけスケジュール遅延を起こすという、精神的にめちゃくちゃ辛い状況となっていました。

## 意識したこと
さすがにこのままだとチームから外されると思ったので、どうしようか悩む日々でした。そこで、「とりあえず書き出してみるか」と思い、開発PCがMacだったのでMacのメモ帳に箇条書きで書き出してみました。

そうすると…

**「あれ、わからないことが見えてきたぞ」**

となったのです。嘘のようで本当の話です。

具体的に書き出したこととしては、

* 何を実現したいのか
* 何がわかれば先に進めそうか
* 何が思い通りにいっていないのか
* 実装の方針

などです。

書き出して文字に起こすことで、頭の中が整理されて次にやるべきことが見えてくるのかなと感じました。
「バグの原因がわからない」とか、「バグの原因はわかったけど、解決策がわからない」など、自分が詰まっているところが可視化されたので、質問もやりやすくなりました。

## これからの取り組み
私は言葉で簡潔に伝えることが苦手なので、言語化はできてもうまく伝えられないことがたまにあります。より良い質問をするためにも、「何を実現したいのか」、「何がうまくいっていないのか」などを簡潔に伝えられるようにしていきたいです。

最後までお読みいただき、ありがとうございました！
CotEditorで編集したシェルスクリプトが動かなくなる問題の応急対策

## 背景

[Rebuild.fm](https://rebuild.fm)の[第292回](https://rebuild.fm/292/)で、[SwiftBar](https://github.com/swiftbar)というツールが紹介されていました。

macOSのメニューバーのカスタマイズツールで、シェルスクリプトの標準出力をメニューバーに出してくれます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184128/7dc34edf-09e6-60ed-9158-e9ac63fbaea8.png" width=80%>

これは便利そうだとおもい、サンプルスクリプトをいじりはじめたら、思い通りに動かなくてハマりました。

けっきょく、エディタのCotEditorが原因（そもそもはmacOS Montereyのバグ）だということが判明しました。

### 環境

ここで書いていることは、下記のバージョンで実施しました。

- Xcode Version 13.2.1 (13C100)
- VS Code バージョン: 1.63.2
- CotEditor バージョン4.0.9 (473)
- macOS Monterey 12.1
- MacBook Pro (13-inch, 2020, Four Thunderbolt 3 Ports)

## 再現手順

1. `SwiftBar.app`をダウンロードして起動、プラグインフォルダを指定
1. `SwiftBar.app`のプラグインを取得
1. 取得したプラグインのシェルスクリプトを、`CotEditor.app`で編集（たとえば改行入力→削除→保存）すると、メニューバーから表示が消える
1. プラグインフォルダを`terminal`で開き、`$ ./xxxxx.sh`と実行すると、下記のエラーメッセージが出る

```bash
$ -bash: ./xxxxx.sh: /bin/bash: bad interpreter: Operation not permitted
```

なお、実行権限は付与済（`$ chmod +x xxxxx.sh`）。

## 原因

CotEditorのGitHubリポジトリでイシューが上がっています。

[quarantine extended attribute gets set on every save using macOS Monterey #1216](https://github.com/coteditor/CotEditor/issues/1216)

サンドボックス化されたアプリでファイル（シェルスクリプト）を編集すると、quarantine attribute（隔離属性）のフラグが立ってしまい、これはMontereyのバグであるっぽいとのことです。

## 対策

### 1. 隔離属性を変える

```bash
$ xattr -d com.apple.quarantine ~/xxxx/xxxxx.sh
```

として、シェルスクリプトの隔離を外します。ただし、いちどでも`CotEditor.app`で編集すると、また隔離されてしまうので、けっこうめんどうくさいです。

### 2. 他のエディタで編集する

`Xcode.app`はOKなので（編集しても隔離されない）、シェルスクリプトをいちど開いて、保存すれば、隔離から外され、シェルスクリプトが動くようになります。

`Text Edit.app`はNG。

`VS Code`はOKだとおもったのですけれども、何かのタイミングでダメ（実行不可）になって、条件判定ができていません。

## おわりに

原因判明に意外と時間がかかったので、記録しておきます。

> わたしの検索能力がいまいちなのか、シェルスクリプトを`CotEditor`で編集する人があまりいないのか、そもそもmacOSでシェルスクリプトを編集して使う人がそんなにいないのか、わかりませんけれども。

シェルスクリプトをいじるのに毎回`Xcode`も重くていやなので、早くバグが修正されることを祈っています。
Anacondaのインストール〜Jupyter Notebookの動作確認まで(Windows 10)

# 概要
- Anacondaのインストール方法および、Jupyter Notebookの動作確認までを記載します。 

# 環境
- OS: Windows10

# 注意事項
- Windowsで使用しているユーザーのフォルダ名が、日本語になっていると、Jupyter Notebookの動作がうまく行かない場合があります。
（具体的には、"C:\Users"内の使用しているユーザーのフォルダ名が英数字ではなく、日本語になっていると上手く動きません。）
もし日本語になっていた場合は、以下URLのローカルアカウントの作成の手順を確認しつつ、英語のユーザー名で別のユーザーを作成し、Anacondaを使用する際は作成したユーザーでWindowsにログインして使用してください。
  
https://support.microsoft.com/ja-jp/windows/windows-%E3%81%A7%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E3%81%AE%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC-%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%81%BE%E3%81%9F%E3%81%AF%E7%AE%A1%E7%90%86%E8%80%85%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B-20de74e0-ac7f-3502-a866-32915af2a34d#WindowsVersion=Windows_10

# インストール方法
1. 以下URLにアクセスする。    
 Anaconda HP
 https://www.anaconda.com/products/individual  

2. ページ内のダウンロードボタンを押下する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2447513/d181c897-f0dc-308a-0554-8cce57389868.png)

3. ユーザー登録のようなポップアップが出るが、右上の×を押下し、ポップアップを消す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2447513/ff318ff1-e082-2a6a-ec30-d92a0894eac0.png)

4. インストーラーを名前を付けて保存する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2447513/88027520-bf4d-9f3c-6a05-430ba483e4f3.png)

5. インストーラーをダブルクリックし、インストールを始める。

6. Nextを押下する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2447513/f53d7243-dc8a-d954-206a-5bb6b72cad3f.png)

7. I Agreeを押下する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2447513/2ea80b7c-fe53-a43b-fc5a-36654606a047.png)

8. Just Meを押下する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2447513/cd939def-a8a8-bbf4-8b81-f397931296f4.png)

9. Nextを押下する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2447513/dfa95724-8f8b-41b2-e996-1dbbcf49a172.png)

10. 必ず"Add Anaconda3 to my PATH～"部分にチェックを付け、Installを押下する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2447513/1c1646cb-a66e-d115-6fc3-8d57d118fe96.png)

# 動作確認
1. Windowsの検索バーで、"コマンドプロンプト"と検索し、コマンドプロンプトというアプリを起動する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2447513/9246e99f-5ca3-7b0d-fb0f-67800bfaa29a.png)

2. コマンドプロンプトの画面で、"jupyter notebook"と入力し、Enterを押下する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2447513/256ee675-8377-170b-2322-298dc5728830.png)

3. Google Chromeの画面で、以下のような画面が起動すれば、成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2447513/1abe6680-dcbd-3911-9db6-6196a6eeca2a.png)

※Jupyter Notebook使用中は、コマンドプロンプトを使用していますので、コマンドプロンプトのウィンドウは閉じないでください。
vimを使う人はbackupcopyだけはyesに設定しておいたほうがいい

## vimのbackupcopy には３つの動作がある
backupcopyには以下の3つのオプションがあります。

- yes: 編集したファイルのinodeが変わらない
- no: 編集したファイルのinodeが変わる
- auto: 上記のうち適切だと思われる方を使う

そして問題なのがUbuntuでデフォルトで入るvimは初期設定でautoになっているということ。
`:set backupcopy`で確認。

この結果なにが起きるかというと条件やタイミングによっては編集するたびにinodeが変わったり変わらなかったりします。つらい・・・。
某77TBの調査をしているときに気がついて泣きそうになってました。

## おわりに
ちなみに今回の記事に全然関係ないですが、自分はシェルスクリプトの実行時にすべてメモリに展開されて実行中にスクリプトを変更しても問題ないとずっと思っていました。

世界には同じ用にメモリに全部展開されると思っている人がいるようで、、、（[参考URL](https://askubuntu.com/questions/484111/can-i-modify-a-bash-script-sh-file-while-it-is-running)）

たぶん正しい知識はこちら（[参考UR)](https://unix.stackexchange.com/questions/121013/how-does-linux-deal-with-shell-scripts)）
rootless docketを使っていて気がついた通常のdockerとの差異

## はじめに
通常使用には困らないですが、自分が気がついた差異について書いていきます。

## ｇVisor(runsc)が入れられない
もっと良い資料があるかもしれないですが、[ここ](https://www.slideshare.net/AkihiroSuda/rootless)の4ページ目に記載してある通りrootless dockerはruncをroot lessで動かす仕組みです。一方gVisorはruncをrunscに置き換えて実行する仕組みです。なので対応してないです。

自分が知っている中で関係あるのはGolangのPlaygroundとなります。他にもGKEなどでも使用されていますが、ローカルの開発環境に入れるわけではないのであまり関係ないです。

## おわりに
本当は2つ書くつもりで書き始めたんですが、片方自分の勘違いだったことが判明したので超絶短い記事になってしまいました。。。
Teamsのチャネルの最適な命名方法。勝手に並び替えられる？

#チャネル使ってる？
ほとんどの方がチャネルを使用していると思われますが、
それは一般チャネルのみです。

それ以外にも無制限にチャネルを作成することができますが、
チャネルの名前には問題があります。

#SNS担当の皆さん、チャネルの作り方を見落としていませんか？

例えば、社内全体チームの中に
このようなチャネルの順番で表示したいと考えます。

* 重要連絡
* 社長室
* 社内回覧
* 一般
* 経理申告
* 出張申告
* 情シス
* 社内交流場
* 喫煙所

#答えは、この順番でチャネルを並び替えられません

そして、以下のような順番でチャネルを作ります

* 重要連絡
* 社長室
* 社内回覧
* 経理申告
* 出張申告
* 情シス
* 社内交流場
* 喫煙所

無理です。

#勝手に以下の順番に並び替えられます

* 一般
* 喫煙所
* 経理申告
* 社長室
* 社内回覧
* 社内交流場
* 重要連絡
* 出張申告
* 情シス

#困りますね。。。なんで？

012 ...、ABC、、、あいうえお順に並び替えられているためです。

なお、一般チャネルに限り名前の特権があり、常に最上位にあります。

#並び替えたからってチャネルを消さないでください。
全く同じ名前のチャネルが作成不能になりますので、「このチャネルを編集」で対応します。

#対応策

以下の名前にすると、きちんと並びます。

*  一般
* 【重要】重要連絡
* 【専用】社長室
* 【全員】社内回覧
* 【報告】経理申告
* 【報告】出張申告
* 【報告】情シス
* 社内交流場
* 専用喫煙所

記号のが更に上位となります。

#簡単な対応策

以下の名前にすると、きちんと並びます。

* 一般
* A.重要連絡
* B.社長室
* C.社内回覧
* D.経理申告
* E.出張申告
* F.情シス
* G.社内交流場
* H.専用喫煙所
Auth0のユニバーサルログイン画面でソーシャルログインだけ有効にする方法

# Auth0のユニバーサルログイン画面からサインアップ機能を消します
  - アカウント開設済みの前提から解説していきます。
  - この画面がユニバーサルログイン機能で使われている基本のログイン画面です。
  - 赤枠の「メールアドレスとパスワード」等のサインアップを消していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501225/7dbf123e-5251-e64f-ce23-1ce1cb3fd22e.png)

# 開設済みのアカウントにログインします
  - Default Appがすでにあるのでサンプルにします
  - サイドバーのApplications → Applications を開いてください
  - 画面に`Default App`が表示されているので、クリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501225/ff8ea72e-32fe-ea53-1df0-3bea4af2d1bf.png)

## Connectionsタブを開きます
  - 画面を開いて、`Connections`タブが見えます。クリックしたあとの画面です。
  - `Database`の項目と`Social`の項目の２つが見えますが、現在は両方ともONの状態です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501225/2565f530-43c5-b55d-d5b5-c31ef57294b6.png)

## OFFにします
  - ※保存ボタンなどはありません
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501225/e5bf35ec-5868-135f-acc7-49fd46640c3c.png)

## ソーシャルログインだけになります
  - ユニバーサルログイン画面をもう一度見ると、「メールアドレスとパスワード」等のサインアップが消えました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501225/ee5b9115-81f9-a87a-4ab6-2ef5e838501b.png)

以上
Unity2021.2.7f1でShaderGraphのCustomFunctionがUndeclared Identifierする場合のメモ

#はじめに
タイトルのバージョンだと，Unity公式のドキュメントや有志のブログ記事どおりに進めても一行エラーを起こす箇所があるのでその説明．

#該当箇所
Unity公式のドキュメントなどのテンプレートはこれ

```
#define MYFUNCTION_INCLUDED
#ifdef MYFUNCTION_INCLUDED
{
}
#endif
```

が，https://forum.unity.com/threads/custom-function-undeclared-identifier-help.1157867/
このフォーラムによると2020の時点で，`#ifdef`がバグで使えないらしく`#if defined()`を使う必要がある．
ということで治すとこうなる．

```
#define MYFUNCTION_INCLUDED
#if defined(MYFUNCTION_INCLUDED)
{
}
#endif
```

追記：ifdefの箇所を修正したことでエラーが消えた後，元に戻したらなんか普通に動いてた　わけわかめ
AWS Lambdaで、パスパラメータから値を取得する

# パスパラメータから値を取得する
Lambda関数に、以下のコードを追加します。

```
let name = event.pathParameters.name;
console.info(`name: ${name}`);
```

# WebStormを使って、ローカル環境で実行する
「Edit Configurations...」をクリックします。
![スクリーンショット 2021-12-30 7.25.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14202/a83bb106-c6f6-0a66-99fc-7cb46b18d46a.png)

「API Gateway AWS Proxy」をクリックします。
![スクリーンショット 2021-12-30 7.26.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14202/7b58b840-1637-9df0-5643-6cc65c93801c.png)

「pathParamters」に、nameを追加します。
![スクリーンショット 2021-12-30 7.22.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14202/4b2b9cc1-5504-6620-2d87-5802acb2030a.png)

Lambda関数を実行します。
パスパラメーターから取得した値が出力されました。
![スクリーンショット 2021-12-30 7.29.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14202/e369af4a-062c-1ab6-2d90-741c8f667400.png)
#スクリーンショット #スナップショット が撮られない場合の対処

保存先の空き容量を確認する。
空きメモリ容量を確認する。
(PC環境次第だと思うが、自分の場合は2.5GB近い空きが必要。
実行するボタンを押しても無反応&ファイルも作成されないという症状になる。)
Eloquant updateを利用してカラム情報を更新する

# 概要

- Eloquantのupdateを用いてカラム情報を更新する方法をメモ的にまとめる

# 謝辞

- こちらの知見は一緒にプロジェクトに参画してくださっているエンジニアさんから教えていただいた内容です。
- 改めてこの場を借りてお礼申し上げます！教えていただきありがとうございます！

# 情報

- 今回のコードは下記のリポジトリにアップしている。
    - [https://github.com/miriwo0104/laravel8_easy_crud/tree/update](https://github.com/miriwo0104/laravel8_easy_crud/tree/update)

# 方法

1. 当該のモデルクラスで`$fillable`を登録する。（updateで編集可能なカラム名を$fillableに記載して登録する。）

    ```app/Models/Content.php
    /**
     * 複数代入可能な属性
     *
     * @var array
     */
    protected $fillable = [
        'カラム名',
    ];
    ```

1. 当該のモデルクラスを用いてDBを更新する処理が記載されている箇所に下記のような記載を行う。（筆者の場合リポジトリクラスにDBアクセス処理が記載されている。）

    ```app/Repositories/ContentRepository.php
    <?php
    
    namespace App\Repositories;
    
    use App\Models\Content;
    use Illuminate\Database\Eloquent\Model;
    
    class ContentRepository implements ContentRepositoryInterface
    {
        public function __construct(Content $content)
        {
            $this->content = $content;   
        }
    
        /**
         * idを用いて情報を取得
         *
         * @param integer $id
         * @return Content
         */
        public function getById(int $id)
        {
            return $this->content->find($id);
        }

        /**
         * 投稿内容の保存
         *
         * @param array $requestBody
         * @return Model
         */
        public function update($requestBody)
        {
            $content = $this->getById($requestBody['id']);
            return $content->update($requestBody);
        }
    ```

1. ちなみに上記の`update()`に渡される$requestBodyには下記のような値が格納されている。

    ```
    array:2 [▼
      "id" => "12"
      "content" => "投稿編集内容"
    ]
    ```

# 参考文献

- [https://readouble.com/laravel/8.x/ja/eloquent.html#mass-assignment](https://readouble.com/laravel/8.x/ja/eloquent.html#mass-assignment)
【あるある】「やべ、コミットから抜けてるファイルがあった」の解決法

# 目的
gitでコミットして、そのまま作業を進めようと思った時に、「あ、この修正・追加もさっきのコミットに入れておけばよかったーー！！」ということがよく起きる。この時にすぐにその修正を最新のコミットに入れたいと考えた。

# 結論
記事にしていいのかと言うくらいすごい簡単だった。

① 追加したいファイルをステージングし、
② ```git commit --amend --no-edit```で前回のコミットにステージングされているファイルを適用させる。

# 詳細
### 追加したいファイルをステージング
前回のコミットに追加したいファイルをステージングする

```
$ git add test.py
```
### 前回のコミットにステージングされているファイルを適用

```terminal
$ git commit --amend --no-edit
```

# 参考
[[Git] 追加の変更を最新のコミットに追加する](https://dev.classmethod.jp/articles/git-commit-amend-no-edit/)
Laravelで直接SQL文を実行する

Laravelで直接SQLを実行するにはその種類によってメソッドが変わります。参照系の場合には `DB::select()` を利用します。

```php
$sql = "select i.* from input_tmps i
where i.id is not null;";
$rows = DB::select($sql);

$retArray = [];
/** 結果取得 **/
foreach($rows as $row) {
  $retArray[$row->id][] = $row->value;
}
```


LOCK文等の場合には `DB::unprepared()` を使います。

```php
DB::unprepared( 'LOCK TABLES ' .
  DB::getTablePrefix() . 'input_tmps1 WRITE,' .
  DB::getTablePrefix() . 'input_tmps2 WRITE,' .
  DB::getTablePrefix() . 'input_tmps3 WRITE, ' .
  DB::getTablePrefix() . 'input_tmps4 WRITE'
);
```
力って何？速さを変化させるためのもの

#導入
よく「～力」ってCMやサイトの広告で見ると思います。力って何でしょう。

#結論
物理の世界では力とは**速さを変化させるもの**と決められています。17世紀にアイザック・ニュートンが法則を見つけた運動方程式というもので初めて決められました。

https://ja.wikipedia.org/wiki/%E3%83%8B%E3%83%A5%E3%83%BC%E3%83%88%E3%83%B3%E3%81%AE%E9%81%8B%E5%8B%95%E6%96%B9%E7%A8%8B%E5%BC%8F

#現象の説明
力が生まれると、運動しているの速さが変わります。座っている人が足に力を入れると、立ち上がることができます。逆に座っている人が足に力を入れないと立ち上がることができないです。立ち上がる動きの後、力が余っているとジャンプしてしまいます。車が止まるときも力が発生しています。タイヤに対して止まるように力をかけると、車は止まります。

#予告
力の説明はここまでです。公園で投げたボールが壁にぶつからないのになぜ止まるのかなどには別の記事で説明します。
Kotlinで地図アプリ（ゴミ拾いアプリ）作成。（7日目）

Kotlinで制作している、GoogleMapを使った、自作のゴミ拾いアプリ。制作7日目。

#これまでの経過
1日目：Android Studio + Kotlin で開発環境作成。GoogleMapAPIアクセスキー取得。エミュで動作。
2日目：地図にマーカー表示・カスタム方法。マップ表示形式の変更。
3日目：現在地を取得し、地図上に表示。クリックイベント。
4日目：移動する際にマップがスクロールしなかった問題を修正。
5日目：volleyを使いGETリクエスト送信と、サーバー側で受信＋記録。
6日目：VolleyでBASIC認証。ボタンに画像。サーバ側でBASIC認証。

#今日やった事
・位置情報を送信前に、確認ダイアログ作成
・Kotlinの学習
・その他


#誤送信防止用に、確認ダイアログ作成

ミスタップで、空登録してしまうのを防ぐため、ダイアログで確認処理。

```kotlin:MapsActivity.kt
    private fun aDialog(mMap: GoogleMap, latLng: LatLng, title: String, dTime:String, gicon: Int, dustType:Int) {
        val latitude  = (Math.round(latLng.latitude  * 1000.0) / 1000.0).toString()
        val longitude = (Math.round(latLng.longitude * 1000.0) / 1000.0).toString()
        AlertDialog.Builder(this)
            .setIcon(gicon)//ゴミアイコン
            .setTitle("現在地を登録しますか？")
            .setMessage("種別：$title\n日時：$dTime\n経度：$latitude\n緯度：$longitude")
            .setPositiveButton("登録") { dialog, which ->
                // TODO:Yesが押された時の挙動
                makeMarker(mMap,gLatLng,title,dTime.toString(),gicon)// マーカー登録
                requestString("$dTime,$dustType,"+latLng.latitude+",$longitude")// HTTPS (GET) BASIC_AUTH
            }
            .setNegativeButton("キャンセル") { dialog, which ->
                // TODO:Noが押された時の挙動
            }
            .show()
    }
```

![イメージ7371.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/503948/295dc260-5386-c34e-67b5-e341ff4b5cca.jpeg)




参考にさせていただいた記事:

https://qiita.com/hokutonikukyu/items/ebbc0318c07035e04bf7


#Kotlinの学習用

その他、今日は、学習メイン。

##「高階関数」と「関数リテラル」


##Kotlinの三項演算子

https://qiita.com/oxsoft/items/23bf151fcb87d822cb84


## 連想配列

https://itneko.com/kotlin-map/

## 四捨五入、切り上げ、切り捨て

https://postgresweb.com/post-4009


##Google Map (円の描画,線の描画,２点間に距離を計算(SphericalUtil))


https://qiita.com/unpi/items/07592c2643d655ec51a2


#その他

#GoogleMapのタイムライン

https://ramenhuhu.com/googlemap_timeline

#今後の課題

クライアント側の最低限の機能は出来たので、あとは、サーバ側の処理。

・MySQLでデータ保存
・WEBサーバ上にGoogle Mapを表示し、集計した位置座標を表示
・必要の応じてBootstrapなどWEBフレームワークを使いGoogle Mapを表示
・R言語 or Pythonで機械学習
モンティ・ホール問題の答えは、ある意味 1/2 でも正しいんじゃないか

[モンティ・ホール問題](https://ja.wikipedia.org/wiki/%E3%83%A2%E3%83%B3%E3%83%86%E3%82%A3%E3%83%BB%E3%83%9B%E3%83%BC%E3%83%AB%E5%95%8F%E9%A1%8C)

もちろん、扉を選び直したほうが正解となる確率が $2/3$ になることに異論は無い。その上で、ある意味答えを $1/2$ とする説を思いついた。

# まずは 2/3 となるケースでシミュレート

Python でシミュレーションをする。まずは $2/3$ となるケース。

```python
import random


def _choose_door(first_chosen_door, rest_door):
    return rest_door


def main(trials=1000000, door_num=2):
    # 結果を格納する。
    result = {True: 0, False: 0}

    # trials の回数だけ試行。
    for i in range(trials):

        # ドアを 3つ 準備する。
        doors = list(range(door_num + 1))

        # 正解ドアを準備。
        correct_door = random.randint(0, len(doors) - 1)

        # Challenger が door を一つ選択する。
        random.shuffle(doors)
        first_chosen_door = doors[0]

        # 司会者がハズレの door の一つを選択肢から取り除く。
        removed_door = [d for d in doors if d not in [first_chosen_door, correct_door]][0]

        # 残ったドア。
        rest_door = [d for d in doors if d not in [first_chosen_door, removed_door]][0]

        # Challenger が door をもう一度選ぶ。
        final_chosen_door = _choose_door(first_chosen_door, rest_door)

        # Judge.
        result[final_chosen_door == correct_door] += 1

    # Show results.
    total_count = sum(result.values())
    print(f'total count: {total_count}')
    print(f'True count: {result[True]}, False count: {result[False]}')
    print(f'True ratio: {result[True] / total_count}, False ratio: {result[False] / total_count}')


main()

```

実行結果は以下。期待通り。

```bash
total count: 1000000
True count: 666922, False count: 333078
True ratio: 0.666922, False ratio: 0.333078
```

# 1/2 説

上は、「挑戦者は必ずドアを選び直す」という戦略をとっている。すなわち、挑戦者がドアを選び直す確率は $1$ である。

ここで「挑戦者は確率 $1/2$ の確率でドアを選び直す」という戦略で考える。コードを書き換えるならば `_choose_door` を以下のようにする。

```python
def _choose_door(first_chosen_door, rest_door):
    return [first_chosen_door, rest_door][random.randint(0, 1)]
```

これで実行し直すと、正解の確率が $1/2$ となる。

```
total count: 1000000
True count: 499292, False count: 500708
True ratio: 0.499292, False ratio: 0.500708
```

# これをどう捉えればよいか

「挑戦者が2回目で正解のドアを選択する確率」は、「挑戦者が2回目で選び直さない確率」と「選び直さないときに正解のドアである確率」の掛け算の結果と、「挑戦者が2回目で選び直す確率」と「選び直したときの正解のドアである確率」の掛け算の結果を足し合わせたものになる。すなわち以下のようになる。

$$\frac{1}{2} \cdot \frac23 + \frac12 \cdot \frac13 = \frac12.$$

これは次のように考えられないか:

「ドアを選び直すことに意味なんてないよ(=どちらを選んでも正解の確率は 1/2 だよ)」という、モンティ・ホール問題を知らない素朴な挑戦者が、その信念に従って確率 1/2 でドアを選び直す・留まるのどちらかの選択をする限り、結果的に正解のドアを選ぶ確率は 1/2 となる。

なんとも寓話的で、面白いんじゃないか。どうなんだ。
【備忘録】Python Pandasでindex以外の列を指定してbetween_timeを実行する

#between_timeのパラメーターにはindex列以外が指定できない…
between_time（start_time、 end_time、 include_start = True、 include_end = True、 axis = None）

パラメーター
start_timedatetime.timeまたはstr
時間フィルター制限としての初期時間。

end_timedatetime.timeまたはstr
時間フィルター制限としての終了時間。

include_start bool、デフォルトはTrue
開始時刻を結果に含める必要があるかどうか。

include_end bool、デフォルトはTrue
終了時刻を結果に含める必要があるかどうか。

axis {0または 'index'、1または 'columns'}、デフォルトは0
インデックスまたは列の値の範囲時間を決定します。

#ここから、index以外の行を指定する場合によくみられるコードはこちら。
```python
df.set_index(keys='my_datetime_field').between_time('8:00','21:00').reset_index()
```
#よりスマートに記述するには…
```python
index = pd.DatetimeIndex(df['date'])
df.iloc[index.indexer_between_time('8:00','21:00')]
```
#index.indexer_between_timeがめっちゃ便利！
DatetimeIndex。indexer_between_time（start_time、 end_time、 include_start = True、 include_end = True）[ソース]¶
特定の時刻（たとえば、9：00-9：30AM）の間の値のインデックス位置を返します。

パラメーター
start_time、end_time datetime.time、str
オブジェクト（datetime.time）または適切な形式の文字列（ "％H：％M"、 "％H％M"、 "％I：％M％p"、 "％I％M％p"のいずれかとして経過した時間、「％H：％M：％S」、「％H％M％S」、「％I：％M：％S％p」、「％I％M％S％p」）。

include_start bool、デフォルトはTrue
include_end bool、デフォルトはTrue
戻り値
np.ndarray [np.intp]
【 rails db:migrate実行時のエラー 】

##カラムを新しく追加し、rails db:migrateを実行したが、エラー発生
deviseを導入し、ユーザー管理機能を実装していました。
`login_id`カラムを追加しようと思い、マイグレーションファイルにカラムを追記し、
`rails db:migrate`を実行したところ、
`Mysql2::Error: Table 'users' already exists`と表示される。
（usersテーブルは既に存在していますよ〜）

##なぜ？
原因はよく分からないまま、エラーをもとに検索。
##結果
`rails db:dorp`で一度データベースを削除し、
`rails db:create`で再生成。

その後`rails db:migrate`を実行すると、エラーも無く、
`login_id`カラムも追加されていました。

##反省
configディレクトリ内のdatabase.ymlファイルに記してある、
`utf-8mb4`を`utf-8`に変更していなかった事が原因と考えられます。
この二つではデータの保存形式が異なるそうです。
Homebrewを使用してVSCodeをインストールする

## Goal

M1チップ搭載のMacBook AirにHomebrewを使用してMicrosoft Visual Studio Code (VSCode)をインストールする手順を示します。

## References

なし。

## Pre-Requisites

この文書の手順は、次の環境で実施し、動作を確認しました。

* MacBook Air (M1, 2020)
* macOS Monterey 12.0.1
* zsh 5.8
* Xcode 13.2.1
	* Command Line Tools for Xcode 13.2.0.0.1 (Dec 3, 2021)
* Homebrew 3.3.9

## How To

ターミナルを開きます。

VSCodeをインストールするため、次のコマンドを実行します。

```bash
% brew install --cask visual-studio-code
```

VSCodeのバージョンを確認するため、次のコマンドを実行します。

```bash
% code -v
1.63.2
899d46d82c4c95423fb7e10e68eba52050e30ba3
arm64
```
30秒でREST APIのモックサーバを準備する

# 背景
バックエンドの開発時に別のAPIサーバへ問い合わせするパターンがあるじゃないですか。
個人開発なら「[httpbin.org](https://httpbin.org/)」とか使えばいいのですが、業務だと外部サーバーに投げるわけにいきません。
というわけで30秒でサクッと作れるREST APIサーバである「[json-server](https://www.npmjs.com/package/json-server)」の紹介です。

# 1. インストール
※レギュレーションとしてパッケージのインストール時間は除外します！

    $ npm i json-server

# 2. データを準備(15秒)
パスと応答データを記載したjsonファイルを準備する。

```json:dummy.json
{
  "top_gear": [
    {
      "id": 0,
      "name": "Jeremy Charles Robert Clarkson",
      "keyword ": "英国紳士(笑)"
    },
    {
      "id": 1,
      "name": "Richard Mark Hammond",
      "keyword ": "事故"
    },
    {
      "id": 2,
      "name": "James Daniel May",
      "keyword ": "老犬"
    }
  ]
}
```

# 3. サーバ起動(5秒)

    $ json-server --watch dummy.json

以下のログが出れば起動完了です。


      \{^_^}/ hi!

      Loading dummy.json
      Done

      Resources
      http://localhost:3000/top_gear

      Home
      http://localhost:3000

      Type s + enter at any time to create a snapshot of the database
      Watching...

`http://localhost:3000/top_gear`にアクセスするとJsonが返ってきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587410/017b94bd-3b1c-5ce9-0401-8c34b166e739.png)
Homebrewを使用してNode.jsをインストールする

## Goal

M1チップ搭載のMacBook AirにHomebrewを使用してNode.jsをインストールする手順を示します。

特定バージョンのNode.jsへ切り替えて使用できるようにするため、nodenvをインストールし、Node.jsをnodenvで管理します。

## References

* ["nodenv"](https://github.com/nodenv/nodenv). Will McKenzie. Retrieved December 29, 2021.

## Pre-Requisites

この文書の手順は、次の環境で実施し、動作を確認しました。

* MacBook Air (M1, 2020)
* macOS Monterey 12.0.1
* zsh 5.8
* Xcode 13.2.1
	* Command Line Tools for Xcode 13.2.0.0.1 (Dec 3, 2021)
* Homebrew 3.3.9

## How To

### nodenvをインストールする

ターミナルを開きます。

nodenvをインストールするため、次のコマンドを実行します。

```bash
% brew install nodenv
```

nodenvにパスを通すため、次のコマンドを実行します。

```bash
% echo 'eval "$(nodenv init -)"' >> ~/.zshrc
```

ターミナルを再起動します。

nodenvへパスが通り実行できることを確認するため、次のコマンドを実行します。

```bash
% nodenv --version
nodenv 1.4.0
```

### 特定バージョンのNode.jsをインストールする

ターミナルを開きます。

特定バージョンのNode.jsをインストールするため、次のコマンドを実行します。

```bash
% nodenv install 16.13.1
```

インストールしたバージョンを現在のNode.jsへ設定するため、次のコマンドを実行します。

```bash
% nodenv global 16.13.1
```

Node.jsの現在のバージョンを確認するため、次のコマンドを実行します。

```bash
% nodenv versions      
* 16.13.1 (set by /Users/juno/.nodenv/version)
% node --version
v16.13.1
```
docker起動時にメモリ、CPUのリソース利用を制限する

[メモリ、CPU、GPU に対する実行時オプション](https://matsuand.github.io/docs.docker.jp.onthefly/config/containers/resource_constraints/)の記載を参考にしています。

以下のようにdockerを利用する際、

```
docker run -p 6080:80 --shm-size=512m seigott/tetris_docker:latest
```


`1GB memory, 1GB swap, 1CPU`に制約する場合は、`-memory="1g" --memory-swap="1g" --cpus="1"`を指定すればよさそう

```
docker run -p 6080:80 --memory="1g" --memory-swap="1g" --cpus="1"  --shm-size=512m seigott/tetris_docker:latest
```

動作確認がそこまでできているわけではないが、、

#参考
[メモリ、CPU、GPU に対する実行時オプション](https://matsuand.github.io/docs.docker.jp.onthefly/config/containers/resource_constraints/)
Homebrewを使用してPythonをインストールする

## Goal

M1チップ搭載のMacBook AirにHomebrewを使用してPythonをインストールする手順を示します。

特定バージョンのPythonへ切り替えて使用できるようにするため、pyenvをインストールし、Pythonをpyenvで管理します。

## References

* ["pyenv"](https://github.com/pyenv/pyenv). pyenv. Retrieved December 29, 2021.

## Pre-Requisites

この文書の手順は、次の環境で実施し、動作を確認しました。

* MacBook Air (M1, 2020)
* macOS Monterey 12.0.1
* zsh 5.8
* Xcode 13.2.1
	* Command Line Tools for Xcode 13.2.0.0.1 (Dec 3, 2021)
* Homebrew 3.3.9

## How To

### pyenvをインストールする

ターミナルを開きます。

pyenvをインストールするため、次のコマンドを実行します。

```bash
% brew install pyenv
```

pyenvにパスを通すため、次のコマンドを実行します。

```bash
% echo 'eval "$(pyenv init --path)"' >> ~/.zprofile
% echo 'eval "$(pyenv init -)"' >> ~/.zshrc
```

ターミナルを再起動します。

pyenvへパスが通り実行できることを確認するため、次のコマンドを実行します。

```bash
% pyenv --version
pyenv 2.2.3
```

### 特定バージョンのPythonをインストールする

ターミナルを開きます。

特定バージョンのPythonをインストールするため、次のコマンドを実行します。

```bash
% pyenv install 3.9.9
```

インストールしたバージョンを現在のPythonへ設定するため、次のコマンドを実行します。

```bash
% pyenv global 3.9.9
```

Pythonの現在のバージョンを確認するため、次のコマンドを実行します。

```bash
% pyenv versions
  system
* 3.9.9 (set by /Users/juno/.pyenv/version)
% python --version
Python 3.9.9
```
PowerShellでワイルドカードパターンを含む文字列をエスケープ処理する

本記事では`PowerShell`でワイルドカードパターンを含む文字列をエスケープする処理方法について説明します。

前半部分はどのような問題があるかを説明しているため、文字列をエスケープ処理方法としては、`WildcardPatternクラスのEscapeメソッドを利用してエスケープする`の項からが本題となります。

## そもそもワイルドカードパターンを含む文字列でエスケープ処理が必要な場合

`PowerShell`でスクリプトを書いているたとたまにファイル名にワイルドカードパターンを含んでいてファイルを処理しようとして想定しない処理となってしまう事があります。

ありがちなのは`[]`を含むファイル名を操作しようとする場合があります。

例としては、`[foobar]helloworld.txt`というファイルが存在したとして、このファイルを操作しようとして。

`Get-Item [foobar]helloworld.txt` と実行しても何も取得できません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/3ffd0724-efbc-fe6c-4602-fe6b2d49479b.png)

これはファイル名に`[]`がつかわれておりワイルドカードパターンを含む文字列となってしまっているためです。

このためファイル操作しようとしていますが、ワイルドカードで解釈されて想定通り動作しません。

対応としては`[]`をエスケープ処理してあげる必要があります。

下記はバッククオートでエスケープした場合の画像。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/62ecd0f0-afb1-792f-cfd8-96318ef1fd49.png)

上記の例では、`Get-Item`でしたが、`Copy-Item`だったり`Remove-Item`でも同様です。

上記コマンドレットはオプション指定をされていない場合は、`Path`オプションに引き渡されますが、この`Path`がワイルドカードパターンが含まれていた場合、このような動作になってしまっています。

## LiteralPathオプションを利用して回避することもできる

このような場合どうするかといえば、文字列をエスケープ処理してあげる以外にも、標準のコマンドレットでは`LiteralPath`というオプションがだいたい用意されているのでこちらを使えば問題はありません。

```pwsh:LiteralPathオプションを使う
Get-Item -LiteralPath [foobar]helloworld.txt
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/320dd64f-38b6-70b2-699b-474c59db725d.png)

ワイルドカードが含まれてい、それを考慮できておらず失敗するケースは`PowerShell`あるあるかと思います。

## WildcardPatternクラスのEscapeメソッドを利用してエスケープする

標準以外のコマンドレットだったり、自作のコマンドレットで`LiteralPath`がなくて困る場合はあるので、`PowerShell`でワイルドカードパターンが含まれている文字列のエスケープ方法について。

[WildcardPattern Class](https://docs.microsoft.com/en-us/dotnet/api/system.management.automation.wildcardpattern?view=powershellsdk-7.0.0)

上記`WildcardPattern`クラスの`Escape`メソッドを利用すると、特殊な文字をエスケープした文字に変換してくれます。

```pwsh:WildcardPatternクラスのEscapeメソッドでエスケープ
[System.Management.Automation.WildcardPattern]::Escape(".\[foobar]helloworld.txt")
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/6022d5a1-55c3-d323-805a-5b65b457b34d.png)

画像の用に、バッククオートで特殊文字をエスケープしてくれます。これを利用することによって特殊文字を含んでいてもPathオプションで処理できるようになります。

下記はエスケープしない文字列とエスケープした文字列をパイプで`Get-Item`コマンドレットに渡したパターン。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/848c29cb-1ede-07c1-ec12-330cd30fe63c.png)

## 総評

ファイルコピーしたり、ログ削除したりといった処理を書いているときに、このような処理を知らないと想定外の動作をしてしまう場合があります。

これは`PowerShell`あるあるな気がしますが、`LiteralPath`だったりエスケープ方法を理解しておくことで問題ないスクリプトを作成しましょう。
Homebrewをインストールする

## Goal

M1チップ搭載のMacBook AirにHomebrewをインストールする手順を示します。

## References

* ["Homebrew Documentation - Installation"](https://docs.brew.sh/Installation). Max Howell. Retrieved December 29, 2021.

## Pre-Requisites

この文書の手順は、次の環境で実施し、動作を確認しました。

* MacBook Air (M1, 2020)
* macOS Monterey 12.0.1
* zsh 5.8
* Xcode 13.2.1
	* Command Line Tools for Xcode 13.2.0.0.1 (Dec 3, 2021)

## How To

ターミナルを開きます。

Homebrewをインストールするため、次のコマンドを実行します。

```bash
% /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```

Homebrewにパスを通すため、次のコマンドを実行します。

```bash
% echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> /Users/juno/.zprofile
```

ターミナルを再起動します。

Homebrewへパスが通り実行できることを確認するため、次のコマンドを実行します。

```bash
% brew --version
Homebrew 3.3.9
Homebrew/homebrew-core (git revision 48bcf133e2e; last commit 2021-12-28)
```
dockerコンテナ内などでqtを使用したアプリ使用時にエラーが出る。qt.qpa.xcb: could not connect to display 


dockerコンテナ内などでqtを使用したアプリ使用時に以下のようなエラーが出る。

```bash
$ python test.py
qt.qpa.xcb: could not connect to display 
qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found.
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.

Available platform plugins are: eglfs, linuxfb, minimal, minimalegl, offscreen, vnc, wayland-egl, wayland, wayland-xcomposite-egl, wayland-xcomposite-glx, webgl, xcb.

Aborted
```

以下のように仮想的なDISPLAYを用意する事で解決

```bash
sudo apt install -y xvfb
export DISPLAY=:1
nohup Xvfb -ac ${DISPLAY} -screen 0 1280x780x24 &
```

# 参考

https://blog.amedama.jp/entry/2016/01/03/115602
【React】モーダルの作成方法【入門】

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

##React 入門

###Reactとは
Facebook社（現 Meta Platforms）が開発したUIパーツを構築するためのJavaScriptライブラリです。

###モーダルの作成
以下のように記述することでモーダルを作成することができます。

```App.js
import React from 'react';
import Lesson from './Lesson';

class Main extends React.Component {
  render() {
    const lessonList = [
      {
        name: '~~~~',
        image: '#',
        introduction: '~~~~~~~~~~',
      },
      {
        name: '~~~~',
        image: '#',
        introduction: '~~~~~~~~~~',
      },
      {
        name: '~~~~',
        image: '#',
        introduction: '~~~~~~~~~~',
      },
      {
        name: '~~~~',
        image: '#',
        introduction: '~~~~~~~~~~',
      },
    ];

    return (
      <div className='main-wrapper'>
        <div className='main'>
          <div className='copy-container'>
            <h1>ああああああ。</h1>
            <h2>ああああああ。</h2>
          </div>
          <div className='lesson-container'>
            <h3>ああああああ。</h3>
            {lessonList.map((lessonItem) => {
              return (
                <Lesson
                  name={lessonItem.name}
                  image={lessonItem.image}
                  introduction={lessonItem.introduction}
                />
              );
            })}
          </div>
        </div>
      </div>
    );
  }
}

export default Main;

```

```Lesson.js
import React from 'react';

class Lesson extends React.Component {
  constructor(props) {
    super(props);
    this.state = {isModalOpen: false};
  }

  handleClickLesson() {
    this.setState({isModalOpen: true});
  }
  
  handleClickClose() {
    this.setState({isModalOpen: false});
  }

  render() {
    let modal;
    if (this.state.isModalOpen) {
      modal = (
        <div className='modal'>
          <div className='modal-inner'>
            <div className='modal-header'></div>
            <div className='modal-introduction'>
              <h2>{this.props.name}</h2>
              <p>{this.props.introduction}</p>
            </div>
            <button
              className='modal-close-btn'
              onClick={() => {this.handleClickClose()}}
            >
              とじる
            </button>
          </div>
        </div>
      );
    }

    return (
      <div className='lesson-card'>
        <div
          className='lesson-item'
          onClick={() => {this.handleClickLesson()}}
        >
          <p>{this.props.name}</p>
          <img src={this.props.image} />
        </div>
        {modal}
      </div>
    );
  }
}

export default Lesson;
```
docker: Error response from daemon: Failed to inspect container エラーの解決策

以下のような感じでdockerを使用しようとするとエラー

```bash
$ docker run -p 6080:80 --shm-size=512m seigott/tetris_docker:latest
docker: Error response from daemon: Failed to inspect container 889f7a5e430eae61378641c551f37d6d212ab3058a8e1dbb05ce5ea40e207ba6: Error response from daemon: readlink /var/lib/docker/overlay2/l: invalid argument.
```

image取得時に何かおかしな点があったような気がするので、imageを削除する。

```bash
$ docker images              # imageを検索
$ docker rmi -f ${imageID}   # imageIDを指定して、imageをremove
```

もう一度実行すると問題は起こらなかった

```bash
$ docker run -p 6080:80 --shm-size=512m seigott/tetris_docker:latest
```

#参考
['failed to inspect container error' while trying to ssh into containers using ignite](https://github.com/weaveworks/footloose/issues/228)
シェル学習　grep1

####grepによる検索の練習

```
①
$ seq 100 | grep "0" | xargs
10 20 30 40 50 60 70 80 90 100

②
$ seq 100 | grep "^8" | xargs
8 80 81 82 83 84 85 86 87 88 89

③
$ seq 100 | grep "8$" | xargs
8 18 28 38 48 58 68 78 88 98

④
$ seq 100 | grep "8." | xargs
80 81 82 83 84 85 86 87 88 89

⑤
$ seq 100 | grep "^10*$" | xargs
1 10 100

⑥
$ seq 100 | grep "[02468]$" | xargs
2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 52 54 56 58 60 62 64 66 68 70 72 74 76 78 80 82 84 86 88 90 92 94 96 98 100

⑦
$ seq 100 | grep -E "^(.)\1$" | xargs
11 22 33 44 55 66 77 88 99

```

①seq 100 | grep "0" | xargs
引数が指定した0が1文字でもある行は全て出力する。

②seq 100 | grep "^8" | xargs

→「^」行の先頭が8である

③seq 100 | grep "8$" | xargs

→「$」行の末尾が8である

④seq 100 | grep "8." | xargs

→「.」は何か1文字を表す

⑤seq 100 | grep "^10*$" | xargs

→^1先頭が1
→0*$0が0個以上続くかつ末尾が0

⑥seq 100 | grep "[02468]$" | xargs

→02468のどれか1文字が末尾


⑦seq 100 | grep -E "^(.)\1$" | xargs

→^(.)番号が付き\1などで利用可能になる
→\1$末尾に先頭と同じ文字を利用する
Maxima-Jupyterをインストール

数式処理システムMaxima、便利ですよね。

しかしローカルでずっと作業環境をあれこれやるのは面倒になってきました。[maxima on line](http://maxima.cesga.es/)はちょっと使いづらいし。

そこでJupyterLab(or notebook)でMaximaを使う環境を用意しました。Jupyterなら文字とか図も一緒に入れられるので、説明も楽ですし。

それで、参考リンクの手順より若干簡略化されたので、その備忘録です。


## 対象環境

* Ubuntu 20.04 LTS
* x86-64
* python3は用意してあることとする（私はpyenv-virtualenvを入れてます）

## 注意

最初にやらかしたんですが、**aptで入ってくるmaximaでは動きません**（GCL=GNU Common Lispは非対応とのこと）。

```
$ apt remove maxima
```

で消しておきましょう。

## sbclのインストール

参考リンクだと自力ビルドをしろって書いてありますが、aptにあります

```
$ sudo apt install sbcl
```

## quicklispのインストール

公式から落とす方法ではうまくいかなかったですが、aptにあるやつで動きました

```
$ sudo apt install cl-quicklisp
$ sbcl --load /usr/share/common-lisp/source/quicklisp/quicklisp.lisp
* (quicklisp-quickstart:install)
* (ql:system-apropos "vecto")
* (ql:quickload "vecto")
* (ql:add-to-init-file)
```

## maximaのビルド＆インストール

SBCL版を作るために自力ビルドしましょう。x.xx.xは適当に最新バージョンを入れると良いと思います（今回は5.45.1にしました）

```
$ sudo apt install texinfo
$ wget https://sourceforge.net/projects/maxima/files/Maxima-source/x.xx.x-source/maxima-x.xx.x.tar.gz
$ tar xf maxima-x.xx.x.tar.gz
$ cd maxima-x.xx.x
$ mkdir build
$ cd build
$ ../configure --enable-sbcl
$ make
$ sudo porg -lp maxima make install # porg使ってない人は単にsudo make installで良い
```

maximaを起動して、`using Lisp SBCL`って出たら大丈夫です。


## Maxima-Jupyterのインストール

```
$ git clone https://github.com/robert-dodier/maxima-jupyter.git
$ cd maxima-jupyter
$ maxima
(%i1) load("load-maxima-jupyter.lisp");
```

## Jupyterのインストール

書くまでもなく世の中にいっぱいありますが

```
$ pip install jupyter
```

なお、リモートから接続するためには別途設定が必要です（[例](https://qiita.com/syo_cream/items/05553b41277523a131fd)）ので、必要な方は忘れずに。

## Jupyter lab起動

```
$ jupyter lab
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9926/d53fba74-bf1a-844f-8b49-239976d4e135.png)

Maximaが出たら完了です。グラフもちゃんと出ます（Binderだと出ないんですよね）。

めでたし、めでたし。

## 参考リンク
* https://github.com/robert-dodier/maxima-jupyter
* https://home.hirosaki-u.ac.jp/heroic-2020/1253/
* https://home.hirosaki-u.ac.jp/jupyter/maxima/
* https://maxima.hatenablog.jp/entry/2020/05/25/001814
* https://www.quicklisp.org/beta/
JavaScriptのif構文とは（初学者向け）

##目次
|　No　|     目次     |
|:--|--------------|
|　1　|はじめに          |
|　2　|if文（条件分岐）って？           |
|　3　|if , else , else if|
|　4　|if文の例|
|　5　|比較演算子|
|　6　|終わり　　　　　　　　　　　|


##はじめに

JavaScriptにこの記事では触れていきます。
比較演算子の種類と実例も記しています。

##if文（条件分岐）って？ 

JavaScriptで条件の分岐処理を記述するにはif文を使います。
if文を使うことにより、

「**もし○○だったらパターンA、○○だったらパターンB、それ以外はパターンC**」

　　　　　　　　　　　　　　↑
このように条件によって処理を分岐することが出来るのがif文です。

条件はif , else , else ifの3種類を使い分けて分岐します。
(else ifはいくつでも使えます。)
下の(例)は1+1の問題に対してユーザが入力をした数字に対し、

・2なら**正解**
・1なら**まさかの掛け算！？**
・1と2以外の数字がユーザから入力された時に**不正解です...**

下の例は上の3パターンの回答をユーザに伝えるためのプログラムをわかりやすくしたものです。


↓（例）


```
(1+1の答えは？)

もし (答え == ユーザが2と入力した時) {
    表示('正解!');
} それとも (答え == ユーザが1と入力した時){
    表示('まさかの掛け算！？');
} それ以外 {
    表示('不正解です...');
}
```

上の(例)をしっかりとJavaScriptの構文にした場合はこのようになります↓

```
const answer = prompt('1+1の答えは？');

if (answer == 2) {
     alert('正解!');
 } else if (answer == 1){
     alert('まさかの掛け算！？');
 } else {
     alert('残念...');
 }
```

それでは細かく説明をしていきます。


まず、**answer**は**prompt('1+1の答えは？');**のことだと考える。
(この記事では定数についての説明は省略します)

answerをif, else if , elseの中にそれぞれ入れ込んで、
ユーザが入力する値と比較をします。
比較が終わると異なる回答をユーザに伝えるという仕組みです。

比較する為には、
**比較演算子**を使います。
こちらが比較演算子の種類一覧です。


| 比較演算子   |説明               |
|----------|--------------------------|
|==, ===   |等しい                      |
|A < B     |AがBより小さい                |
|A <= B    |BがA以下                   |
|A >= B    |AがBより大きい                |
|A > B     |BがA以下                 |
A != B, A !==B　| AとBが等しくない          |


こちらを使い分けて条件分岐を行いましょう。


##おわり

最後までご覧いただきありがとうございました。
それではまた別の記事でお会いしましょう〜👋
Ubuntu LinuxでCapsLockをShift+CapsLockに変更する方法

## 背景: 
最近、Windows10でも日本語入力のIMEオフオンが「全角/半角」キーだけではなく、CapsLockキーでも変更可能になりましたね。実際にCapsLockキーに割り当てたら非常に効率良くなりましたので、プライベートPCのUbuntuでもCapsLockを利用することにしました。
この設定自体は、Kubuntu上の入力メソッドで簡単に変更できました。

なお、実行環境: Ubuntu 20.04.3 LTS, KDE Plasma:5.18.5 ですが、設定自体はディストリビューションなどに依存していないと思います。

## 問題発生:
初めはCapsLockのオフオンが快適でしたが、暫くしていると日本語のオフオンのCapsLockと本来のCapsLockとが競合するようになりました。意図せずに、大文字でロックされるようになり、使いづらさを感じてきました。どうやら、デフォルトではCapsLockを一度押すだけで、本来のCapsLock(大文字ロック)になってしまっています。

Windowsなどでは、そもそも大文字に固定したい場合には、Shift+CapsLockキーを押すことで固定できます。私は、そもそもCapsLockを使うことはありませんので、Shift+CapsLockにしたいと考えました。

デスクトップ環境に付属しているツールによっては、Shift+CapsLockに変更可能という情報はありましたが、私が利用しているKubuntuでは、該当のツールがなかったため、他の方法を模索し始めました。

## 解決したかったこと:
- Shift+CapsLockでCapsLockとし、 CapsLockは日本語入力専用にしたい。(Windowsに合わせたい)
- キーの入れ替えなどはややこしくなるので、避けたい


## 実施したこと

###1. xmodmapコマンドでの確認

```bash:xmodmapコマンド
~/$ xmodmap
xmodmap:  up to 4 keys per modifier, (keycodes in parentheses):

shift       Shift_L (0x32),  Shift_R (0x3e)
lock        Caps_Lock
control     Control_L (0x25),  Control_R (0x69)
mod1        Alt_L (0x40),  Alt_R (0x6c),  Meta_L (0xcd)
mod2        Num_Lock (0x4d)
mod3      
mod4        Super_L (0x85),  Super_R (0x86),  Super_L (0xce),  Hyper_L (0xcf)
mod5        ISO_Level3_Shift (0x5c),  Mode_switch (0xcb)
```

lockというエントリーが気になります。ここにエントリーがあると、一度押しただけでロックされるようです。
特に何も設定しているつもりはないので、どこかにデフォルト値が入っていると思います。

デフォルト値がわかればそこを変えればよいのですが、今回は手っ取り早く、ユーザーの設定で上書きします。

###2. .Xmodmapの作成と追加

そこで、以下のようにファイルを作成し、気になるlockを消す設定を入れます。

```bash:~/.Xmodmap
remove lock = Caps_Lock
```

一旦、これを再読込させ、動作確認をしてみます。
```bash:xmodmapの再読込
~/$ xmodmap ~/.Xmodmap
```

###3. .bashrcへの追記

ただし、このままでは再起動などで消えてしまうため、.bashrcに入れておきます。

```bash:.bashrcの最下行に以下を追加
xmodmap ~/.Xmodmap
```

試しに再起動してみて、動作確認してみたところ、うまく動作することを確認しました。

これでまた、Ubuntu(Kubuntu)が快適になりました。