OmniAICreator/Qiita-1.07M huggingface dataset:
NFSとは？

# NFSとは？
Network File Systemの略。
ネットワーク上のコンピュータが持つストレージを共有するための仕組み。
>NFSの特長は、ネットワークファイルシステムという名前のとおり、ネットワークを介してサーバ上のストレージ領域をローカルストレージと同様にマウントして使える点です。このためNFSであることを意識する必要がなく、ローカルストレージと同様に読み書きすることが可能なため、幅広い用途で使える利点があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2665477/93bbdf7e-fdb3-0625-bea2-3714d2b0a840.png)
画像引用：[知っておきたいNFSの基本と活用法](https://baremetal.jp/blog/2018/04/17/541/#:~:text=NFS%20v3%E3%81%A8v4%E3%81%AE,%E5%8F%AF%E8%83%BD%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82)

具体的に利用したいときは[こちらの記事](https://qiita.com/rikudai/items/f9900e4865ce25a8464e)のようにコマンドを打って実装する。

```
yum -y install nfs-utils
```

# NFS v3とv4で何が違うの？
細かいことはよく分からないが[こちらの記事](https://justmymemo.hatenablog.jp/entry/2019/03/13/082811#%E3%81%9D%E3%82%82%E3%81%9D%E3%82%82v3%E3%81%A8v4%E4%BD%95%E3%81%8C%E9%81%95%E3%81%86%E3%82%93%E3%81%A0%E3%81%A3%E3%81%91)のようなアップデートがあった模様。
ちなみにEFSはNFSv4を満たしている。


# 参考
https://baremetal.jp/blog/2018/04/17/541/#:~:text=NFS%20v3%E3%81%A8v4%E3%81%AE,%E5%8F%AF%E8%83%BD%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82
VimのC-hがBSと同じ挙動になる問題の改善

Vimを使う際、~/.vimrcなり~/.config/nvim/init.vimに設定を書くと思います。
その中で、
```.vimrc
inoremap <C-h> <Left>
inoremap <C-j> <Down>
inoremap <C-k> <Up>
inoremap <C-l> <Right>
```
と書いておくことで、インサードモード中でもCtrlを押しながらhjklで移動できるというのは有名なお話です。しかし、自分の環境でC-hの部分だけBSと同じ挙動になったことがあったので、その対処した際のメモです。

## 対処方法
:verboseしてみると、原因となる場所を教えてくれます。
結論ですが、auto-pairsという括弧の自動補完をしてくれるプラグインに原因がありました。
なので、その箇所を無効化する設定を.vimrcに書いておきます。
```.vimrc
let g:AutoPairsMapCh=0;
```
これで上手く動いてくれると思います。

余談ですが、inomap...を設定する際の行末にスペースが入ってしまっていると、Ctrlを押しながらhjklで移動しようとしてもスペースが入り続けてしまうので気をつけて下さい。
[AntDesign] [Next.js] チェックボックス型のフォームが書きかわらない

Next.js + AntDesignでフォームを実装中に
チェックボックス型のフォームを実装している時にはまった時の備忘録。
チェックボックスを変更してもフォームの`values`が書き変わらなかった。


# 原因
`Form`で`onValuesChange`が指定されている状態で
`Form.Item`に`valuePropName="checked"`を指定していたため、
`form`の`values`の中の`"hoge"`が書きかわらなかった。

# 修正したコード

`Form`に`onValuesChange`を指定するのをやめ、
`Form.Item`内で`onChange`を指定するよう変更した。


Before
```react
const [form] = Form.useForm() 
...
<Form form={form} onFinish={onFinish} onValuesChange={handleChangeFuga}>
  <Form.Item
    name="hoge"
    valuePropName="checked"
    initialValue
  >
    <Checkbox>
        Hoge
    </Checkbox>
  </Form.Item>

  <Form.Item
    name="fuga"
  >
    ...
  </Form.Item>
</Form>
```

After
```react
const [form] = Form.useForm() 
...
 <Form form={form} onFinish={onFinish}>
  <Form.Item
    name="hoge"
    valuePropName="checked"
    initialValue
  >
    <Checkbox>
        Hoge
    </Checkbox>
  </Form.Item>

  <Form.Item
    name="fuga"
    onChange={handleChangeFuga}
  >
    ...
  </Form.Item>
</Form>
```
docker内（AWS）にviをインストールして使えるようにして、デバックする

## やりたいこと
開発環境やSTG環境で立ち上げているアプリに対してログを仕込みたい

Gitにログを仕込んでソースをあげてもいいが、
そうなると、
1. ソースの修正
1. gitへpush
1. 各開発環境がデプロイされるまでに時間がかかる

また、ソースにログが残ったままになって本番環境にデプロイしてしまうリスクもある

## 解決方法
docker(AWS)内に直接vimをインストールして、
デプロイしているソースに直接ログを書き込む

こうすれば、デプロイを待たなくてもいいのでスピードも上げられるし
Gitにログが残ることもない

再デプロイすれば、ログも消える！

## vimのインストール方法
```
apt-get update
apt-get install vim
```

vimさえ入ってしまえば、あとはお好きなソースにログを入れてください。

## 懸念点など
する場合は、自己責任で！

うちは、このやり方で本番環境に影響がないので出来ましたが、
デプロイ手順次第では影響出るとかもあるので。

dev,stg環境で手っ取り早くするにはこれ！
（本番環境でもこの手段は使えますが、かなりリスキーなのでオススメできません！自己責任で！！）
Arch系LinuxでZoomの音声がうまく入らないときの対処方法

Linux上のZoomにて音声が入らない時があったので、その時のメモです。
Manjaroでの解決法のため、他のディストロでうまく行くかどうかは分かりません。
## 対処方法
Zoomの設定ファイルが、~/.config/zoomus.confにあるので、そのファイルの中身をいじります。
```bash
systemd.audio.type=default
```
と書いてあるところがあるので、defautの部分をalsaにします。
これで音声が入るかどうか確かめてみて下さい。
論理演算子（&&と||）と短絡評価

## はじめに
論理演算子で「ムムム！」と思うことがあったので、自分の再確認としてのメモです。
知っている人にとっては、当たり前でしょと思う内容だと思います。

## 短絡評価

論理演算子（&&,||）では最初の結果だけを評価して、残りは評価しないことがある。

```.java
1. true  && true   → true
2. true  && false  → false
3. false && true   → false
4. false && false  → false
```
3と４では、左側がFalseなので、右側の評価は何であれ、Falseとなる。
||も同じことが言える。

```.java
1. true  || true  → true
2. true  || false → true
3. false || true  → true
4. false || false → false
```

1と２では、左側がTrueなので、右側の評価は何であれ、Trueとなる。

このように左側の評価だけで、全体の評価が決まる時、右側の評価を見ないことを短絡評価と言う。

## 演算子が複数種類ある場合の評価
先ほどは、&&だけ、||だけと分けて考えたが、&&と||が両方ある時の評価はどうなるだろうか？

```.java
0. A     && B     || C
1. false && true  || true  → true
2. true  && false || true  → true
3. false && false || true  → true
4. true  && true  || true  → true
5. false && true  || false → false
6. true  && false || false → false
7. true  && true  || false → true
8. false && false || false → false
```

４と７のように、`A && B`がTrueであれば、Cの評価が何であれ、全体の評価はTrueになる。
`A && B`がFalseであれば、Cの評価によって全体の評価が決まる。

冷静に考えれば当然のことだが、私はAの評価だけを見て、全体の評価が決まると勘違いしていた。

```.java
0. A     && B     || C
1. false || true  && true  → true
2. true  || false && true  → true
3. false || false && true  → false
4. true  || true  && true  → true
5. false || true  && false → false
6. true  || false && false → true
7. true  || true  && false → true
8. false || false && false → false
```
先程の例の`&&`と`||`を入れ替えてみた。
結果が異なるのは、３と６である。
ご存じではあると思うが、||より&&の方が評価する優先順位が高い。
Rustで画像処理実践編 図形情報の取得

今回は唐突に「ブロブの最大内接円」が欲しくなったのでコードを書いてみました。
意外とパッケージの画像処理システムに搭載されていないんですよね。

https://emotionexplorer.blog.fc2.com/blog-entry-88.html

を参考にさせて頂きました。画像もお借りします。

# 要件
与えられた二値画像の図形からできるだけ大きな円を切り抜きたいので、その中心位置と半径を得ることが目的です。
![20200123_dw_img2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1977360/14f06425-cdb0-02ab-c774-3bcb9b98f213.png)

# 解法
距離変換 -> 最大値と最大位置を取得

距離変換はブロブ内画素の値を輪郭までの距離に変更します。ブロブの内側に向けて画素値が高くなっていくイメージですね。
ユークリッド距離で変換すれば、最大値が輪郭までの距離、位置が中心を示します。


# 実装
src.pngを読み込み、円を描画してからhighguiで表示します。

```rust:main.rs
use opencv::{
    core::{min_max_loc, VecN, Vector, CV_64F},
    highgui,
    imgcodecs::{imread, imwrite, IMREAD_COLOR},
    imgproc,
    prelude::*,
};

fn run() -> opencv::Result<()> {
    let window = "result";
    highgui::named_window(window, 1)?;

    let frame = imread("src.png", IMREAD_COLOR)?;
    // gyay
    let mut gray = Mat::default();
    imgproc::cvt_color(&frame, &mut gray, imgproc::COLOR_BGR2GRAY, 1)?;
    // 2値化
    let mut bin = Mat::default();
    imgproc::threshold(&gray, &mut bin, 20.0, 255.0, imgproc::THRESH_BINARY)?;

    // 距離変換
    let mut distance = Mat::default();
    imgproc::distance_transform(&bin, &mut distance, imgproc::DIST_L2, imgproc::DIST_MASK_PRECISE, CV_64F)?;

    // 受け取るパラメータの初期化
    let mut mx_val = 0.0;
    let mut mx_loc = opencv::core::Point::new(0, 0);

    let min_val = None;
    let max_val = Some(&mut mx_val);
    let min_loc = None;
    let max_loc = Some(&mut mx_loc);
    
    // 外輪郭からの最大値、最大値位置の取得
    min_max_loc(
        &distance,
        min_val,
        max_val,
        min_loc,
        max_loc,
        &Mat::default(),
    )?;


    // カラーにしてから青で円を描画
    let mut res = Mat::default();
    imgproc::cvt_color(&bin, &mut res, imgproc::COLOR_GRAY2BGR, 3)?;

    imgproc::circle(
        &mut res,
        mx_loc,
        mx_val as i32,
        VecN::new(255.0, 0.0, 0.0, 0.0),
        1,
        0,
        0,
    )?;

    loop {
        highgui::imshow(window, &res)?;
        let key = highgui::wait_key(10)?;
        if key > 0 && key != 255 {
            break;
        }
    }
    Ok(())
}

fn main() {
    run().expect("error");
}
```
適当にマウスでグルグルした画像を読ませたらいい感じでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1977360/161f8174-d646-9554-388a-4210d342826c.png)

C言語における`NULL`を`Option<T>`の`None`バリアントで表現するのがRustらしくていいですね。NULL安全の言語は素晴らしいです。

それにしてもRustAnalyzerは優秀ですね。引数名と型推論の表示が最強すぎる。C並の速度の言語がこんな楽にかけていいんですかね？？？みんなも使おう（宣伝）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1977360/10d411f8-c0c2-0706-270f-cb97bec5df52.png)
ESP32 の BleKeyboard ライブラリを使って Ctrl + V とかする方法

# ESP32 の BleKeyboard ライブラリ
ESP32をArduinoでプログラムするときにBleKeyboardライブラリを使うことで、キーボード入力の動きをさせることができます。
```c++
#include <BleKeyboard.h>
```
https://github.com/T-vK/ESP32-BLE-Keyboard

# キー押下イベントの送信
ライブラリのREADMEに記載されている通り、以下のように書くことで、Bluetooth接続されたPCやタブレット等に対してキーボード入力されたイベントを擬似的に発生させることができます。

## キーコードを送信する：write
```c++
// RETURNキー押下イベントを発生させるとき
bleKeyboard.write(KEY_RETURN);
```

## 文字を入力する：print
```c++
// Hello worldという文字を入力させるとき
bleKeyboard.print("Hello world");
```

## Ctrl+Alt+Deleteの例：press
押したままの状態にしたいとき（同時押しをさせたい時）はpressを使用します。
押した状態を解除する時にはreleaseAllをすれば良いです。
```c++
// Ctrl+Alt+Delete を発生させる　※気をつけて使用すること！
bleKeyboard.press(KEY_LEFT_CTRL);
bleKeyboard.press(KEY_LEFT_ALT);
bleKeyboard.press(KEY_DELETE);
delay(100);
bleKeyboard.releaseAll();
```

# では、Ctrl+V とかは？
これが少しだけハマったのでこちらに投稿することにしました。
こう書けば良いです。Alt＋Aとかでも同様に書けます。
```c++
// Ctrl+V
bleKeyboard.press(KEY_LEFT_CTRL);
bleKeyboard.press('v');
delay(50);
bleKeyboard.releaseAll();
```
bleKeyboard.press('v');　というのがポイントですね。
Ctrl+Alt+Deleteの例と同様、delayを入れないとうまく動作しません。READMEの方は100msでしたが、50msでも動作したのでそう書いています。
Splunk: ジョブ調査の使い方

しばしば必要となるのでメモ。

###### 実施環境： Splunk Free 8.2.2

 Splunk のサーチジョブに関する起動日時や出力件数といった情報は、「ジョブ調査」で確認できます。

手動で実行したサーチジョブの場合は、サーチ画面の「ジョブ」-「ジョブの調査」から開けます。

![スクリーンショット 2021-12-19 20.11.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/c6b033a3-68ab-5d10-b7f8-2f5e8a310629.png "ジョブの調査1")

スケジュールで実行したジョブや手動で実行したものの画面を閉じてしまったジョブについては、ジョブ管理画面で「アクション」-「ジョブ」-「ジョブの調査」から開けます。

![スクリーンショット 2021-12-19 20.26.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/b7f53a9c-370c-9761-ec80-bc30a5ea4090.png "ジョブの調査2")

ジョブ調査は、以下のような画面で表示されます。

![スクリーンショット 2021-12-19 20.13.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/55abf9fa-dec6-42cb-aa16-057a0ef35fca.png "ジョブ調査画面")

出力件数や実行時間といった基本的な情報は、ヘッダ部分を見ればすぐにわかります。

![スクリーンショット 2021-12-19 20.15.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/3ba7442b-dc3c-5469-3ebf-51f215785514.png "ヘッダ")

このヘッダ部分にある「search.log」をクリックすると、以下のようなジョブの実行ログが確認できます。
ジョブがエラーになった場合などはここを確認するとよいです。

![スクリーンショット 2021-12-19 20.16.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/0731d319-fbb1-6405-2e20-0b60f4d5fef8.png "search.log")

「Job Details Dashboard」をクリックすると、ダッシュボード形式でジョブの実行情報が確認できます。
ジョブの全体的な情報をさっと眺めるのに便利です。

![WS000149.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/4ec5d702-5413-e8b3-1771-3c336af913a9.jpeg "Job Details Dashboard")

「実行コスト」には、各処理においてどの程度時間がかかったかが出力されます。
時間がかかるジョブがあった場合、ここを確認してどこで時間がかかっているのかを調べます。

![WS000147.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/4fdeac16-7146-eb4b-42ca-b13016702385.jpeg "実行コスト")

「プロパティ」には、細かいジョブの情報の一覧が出力されます。
細かい箇所まで調べる必要がある場合は、ここを見ることになります。

![WS000148.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/01e20bc5-bafd-d637-7806-5e71bcf891f8.jpeg "プロパティ")
コマンドでショートカットを実行し結果をテキストで受け取る

# やりたいこと

ターミナルからショートカットを実行し、結果をテキストで受け取りたい

```terminal
shortcuts run ショートカット名 --output-type "public.plain-text" | cat
```

`shortcuts run`でショートカット名を指定すればショートカットが実行される。

ショートカットの出力を受け取るためには`--output-type`で Uniform Type Identifier を指定する。テキストの場合は、`public.plain-text`で受け取れた。

- [コマンドラインからショートカットを実行する](https://support.apple.com/ja-jp/guide/shortcuts-mac/apd455c82f02/mac)
- [システム定義のUniform Type Identifier](http://potting.syuriken.jp/potting_conv/understanding_utis_J/chapter4.html)
Spring Bootでカスタムバリデーションメッセージを作成

##  はじめに
message.propertiesでカスタマイズした入力エラーメッセージを作成する方法について説明します。
message.propertiesにいっぺんに書いておくことで入力エラーメッセージを管理しやすくなると思います。
## バリデーションチェックしたいクラス作成
```
import lombok.Getter;
import lombok.Setter;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;

@Getter
@Setter
public class WordAddRequestDto {

    @NotBlank
	@Size(max=10)
    private String wordName;

    @NotBlank
	@Size(max=10)
    private String wordPronunciation;

    @NotBlank
	@Size(max=10)
    private String wordMeaning;

	@Size(max=10)
    private String wordExample;
}
```
プロパティにバリデーションアノテーションを付けます。
`@Size`の場合、`max`属性で最大何文字まで入力できるかが設定できます。
## message.properties作成
```
# for property of error message
wordName=ことば
wordPronunciation=発音
wordMeaning=意味
wordExample=例文

# for validation error message
NotBlank={0}は、必須ですよ。
Size={0}は、{1}文字までですよ。
```
>Size={0}は、{1}文字までですよ。

→{0}, {1}...は順序にプロパティ名、アノテーションに指定した属性が設定されます。
## 確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727545/cb2bd2a0-7845-e584-7814-51c7412f2d84.png)
【Python】自動で指定のURLを開くようにしてみた

## 概要
pythonで指定のURLを自動で開く処理を作ってみました。

## 前提条件
Pythonが既にインストールされていること。

## pyautoguiの導入
コンソールを開いて下記のコマンドを実行してpyautoguiをインストールする。
```
pip install pyautogui
```

## 指定のURLを自動で開く処理の実装
作成したプログラムは下記になります。

```py
import webbrowser
import pyautogui

# ブラウザを閉じる関数
def close_window():
    x = 10
    y = 10
    pyautogui.click(x, y)
    pyautogui.keyDown('ctrl')
    pyautogui.press('2')
    pyautogui.press('w')
    pyautogui.keyUp('ctrl')


# 開くURLのリスト
url = ['https://www.google.com','https://www.youtube.com/']

# ブラウザの表示モード（0:開いているウィンドウで開く、1:新規ウィンドウで開く、2新しいタブで開く）
window_open_mode = 2

# 開くブラウザを指定
browser = webbrowser.get("'C:\Program Files\Google\Chrome\Application\chrome.exe' %s")

for i in url:
    browser.open(i ,window_open_mode, True)
    close_window()
```
■処理内容
- `webbrowser.get()`について
デフォルトで開くブラウザがEdgeであったため、開くブラウザをChromeにするために加えてます。
（デフォルトで開くブラウザがChromeの場合は不要です）

- `close_window()`について
webbrowserにはブラウザを閉じる関数がないため開いたタブを閉じる処理を関数で作成してます。
処理内容としては以下の内容になります。
・開いたブラウザの左上をクリックする
・「Ctrl」ボタンを押したままにする
・「2」ボタンを押して2番目のタブに遷移する
・「w」ボタンを押してタブを閉じる
・「Ctrl」ボタンを離す

## 実行結果
実行した結果、Chromeの2個目のタブにGoogleのホーム画面とyoutubeのホームがそれぞれ開いて閉じられました。

## 次回について
次回は開いたブラウザ画面のスクショを取得する処理を書いてみようと思います。
バリデーションが発火するタイミングについて

RailsのActiveRecordにはDBの正しいデータだけを保存するためにバリデーションを行うための機能がああります。
通常はmodelにてバリデーションを実装するが、発火するタイミング、シチュエーションが曖昧だったので改めて調べてみました。

# バリデーションが発火するタイミング
バリデーションはモデルを作成したから行われるわけではありません。
「**通常はSQLのデータベースへの送信前に行うもの**」です。railsで何かしらのクエリを発行して、SQが生成され、DBへの保存が行われるタイミングでバリデーションが発火します。

# バリデーションが発火するシチュエーション
では、バリデーションはどのクエリを発行したら実行されるのでしょうか。[Rails Guide](https://railsguides.jp/active_record_validations.html)では以下のメソッド実行時にベリデーションが発火すると明記されています。

- create
- create!
- save
- save!
- update
- update!

railsのクエリには他にも様々ありますが「上記のメソッドを仕様したときだけバリデーションが走る！！」と覚えておけばわかりやすいですね。
以下のようにsaveメソッドに引数を与えるとバリデーションをスキップすることができます。
save(validate: false)

## ついでに
バリデーションが行われないメソッドを記載しておきます。
以下のメソッド使用時にはバリデーションは行われないため、注意しましょう。

- decrement!
- decrement_counter
- increment!
- increment_counter
- insert
- insert!
- insert_all
- insert_all!
- toggle!
- touch
- touch_all
- update_all
- update_attribute
- update_column
- update_columns
- update_counters
- upsert
- upsert_all

以上です。
Julia: Yahoo 郵便番号検索API の使い方

参考ページ
[郵便番号検索API](https://developer.yahoo.co.jp/webapi/map/openlocalplatform/v1/zipcodesearch.html)

```jl:get_address.jl
#! /usr/bin/julia
#
#	get_address.jl
#
#						Jul/31/2022
# --------------------------------------------------------------------
import Pkg; Pkg.add("HTTP")
using HTTP
using JSON
using DotEnv
# --------------------------------------------------------------------
println(stderr,"*** 開始 ***")
#
code_zip = ARGS[1]
println(code_zip)
#
DotEnv.config()
appid = ENV["APPID"]
#
url_base="https://map.yahooapis.jp/search/zip/V1/zipCodeSearch"
url = string(url_base , "?query=" , code_zip , "&output=json")
#
headers = Dict()
headers["Content-Type"] = "application/json"
headers["USER-AGENT"] = "Yahoo AppID: " * appid
#
rr = HTTP.request("GET", url,headers)
println(stderr,rr.status)

str_json=String(rr.body)
dict_aa = JSON.parse(str_json)
println(dict_aa["Feature"][1]["Property"]["Address"])
#
println(stderr,"*** 終了 ***")
# --------------------------------------------------------------------
```

```text:.env
APPID = 'dj0zaiZpPW9NN3F****'
```

実行例

```text
$ ./get_address.jl 131-8634
    Updating registry at `~/.julia/registries/General.toml`
   Resolving package versions...
  No Changes to `~/.julia/environments/v1.7/Project.toml`
  No Changes to `~/.julia/environments/v1.7/Manifest.toml`
*** 開始 ***
131-8634
200
東京都墨田区押上１－１－２東京スカイツリーイーストタワー１１Ｆ
*** 終了 ***
```

次のバージョンで確認しました。

```text
$ julia --version
julia version 1.7.3
```
Gauth AuthenticatorでAWSのMFA設定

## はじめに
Gauth AuthenticatorでAWSのMFA設定を実施した時のメモです。
Windows10、ブラウザはChromeを想定。

## 手順
#### GAuth AuthenticatorをChromeにインストール
ChromeウェブストアでGAuth Authenticatorを検索し、インストール。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259842/df0d9bdc-f490-f265-baef-7d58bfea4aa0.png)

#### AWSのAdministratorアカウントで対象IAMユーザを選択

「MFAデバイスの割り当て」の「管理」を選択
![{5DB2ECAB-E045-4E79-BEA6-90E21F38D16E}.tmp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259842/91531845-cace-7981-e26e-25f167049bfc.png)

#### 仮想MFAデバイスの設定
「仮想MFAデバイス」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259842/176b02de-c11e-c699-74ce-c74c81cb809f.png)

「仮想MFAデバイスの設定」で「シークレットキーの表示」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259842/afab5147-872d-54ec-a0c4-a32dfef036de.png)

シークレットキーが表示されたらコピーする
![{5DB2ECAB-E045-4E79-BEA6-90E21F38D16E}.tmp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259842/7daa669d-2db2-1b70-7394-4f18c56d65d0.png)

#### Gauth Authenticatorにシークレットキーを登録

アドオンのGauth Authenticatorを選択
![{5DB2ECAB-E045-4E79-BEA6-90E21F38D16E}.tmp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259842/5df989e4-7c8b-149a-69ff-03a297200bf8.png)

編集ボタンを押すと「Add」が表示されるので選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259842/cba4cec1-047e-addf-9ddf-41a128a0b8e3.png)

IAMユーザ名とシークレットキーを入力して「Add」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259842/db4330b6-1698-fbb6-80cc-13608973d3b0.png)

登録したIAMユーザ名のワンタイムパスワード(6桁)が表示されるようになる
![{5DB2ECAB-E045-4E79-BEA6-90E21F38D16E}.tmp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259842/92b68b5a-0724-7de9-b532-ff59f29527b3.png)

#### ワンタイムパスワードをAWSのMFA設定画面に入力
AWSのMFA設定画面に戻る。
ワンタイムパスワード(MFAコード)は30秒で変わるので、最新の2回を入力する。
![{5DB2ECAB-E045-4E79-BEA6-90E21F38D16E}.tmp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259842/be434779-38a3-61e2-ef39-8daa6cb3003e.png)

下の画面が表示されたら入力は完了。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259842/1af728d6-e569-1a5e-e8c2-a5dc2d712702.png)

#### 実際にログインしてみる
IAMユーザとパスワードを入力してサインインボタンを押すとMFA認証画面に移る。

![{5DB2ECAB-E045-4E79-BEA6-90E21F38D16E}.tmp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259842/5d4b2369-059b-d4a2-6a54-a9890dc14399.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259842/38b43959-1874-6052-f0a4-082c3ba4122e.png)

アドオンのGauth Authenticatorを選択し、表示されたワンタイムパスワードをコピーして入力するとログインできる。
![{5DB2ECAB-E045-4E79-BEA6-90E21F38D16E}.tmp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259842/5df989e4-7c8b-149a-69ff-03a297200bf8.png)

![{5DB2ECAB-E045-4E79-BEA6-90E21F38D16E}.tmp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259842/5641e099-b3ca-ecee-3c15-f640e386f180.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259842/d88579a4-d074-289b-e9b3-31c57261747c.png)

#### 注意
以前認証に使って開きっぱなしのGauth Authenticatorタブだと、認証に失敗するので、ログインのたびにGauth Authenticatorを新しく開いてワンタイムパスワードを取得する。
2つのpc間でのtopic通信

# pc-pc間

2のpc間でのトピック通信方法
各pcの.bashrcに以下を追加

- マスター側のpc

```
master=192.168.100.16
client=192.168.100.33

export ROS_MASTER_URI=http://$master:11311
export ROS_HOSTNAME=$master
export ROS_IP=$master
```

- クライアント側pc

```
master=192.168.100.16
client=192.168.100.33

export ROS_MASTER_URI=http://$master:11311
export ROS_HOSTNAME=$client
export ROS_IP=$client
```

# dockerとhost pc間

dockerとの通信をするとき

- hostpc

```
master=172.17.0.1
client=172.17.0.2

export ROS_MASTER_URI=http://$master:11311
export ROS_HOSTNAME=$master
export ROS_IP=$master
```

- docker

```
master=172.17.0.1
client=172.17.0.2

export ROS_MASTER_URI=http://$master:11311
export ROS_HOSTNAME=$client
export ROS_IP=$client
```

# 通信の確認

- publisher

```
rostopic pub /chatter std_msgs/String "data: 'hello world!'" -r 10
```

- listener

```
rostopic echo /chatter
```

# エラーと対策

## docker => pcにtopicが届かない

### ros_entrypoint.shの実行忘れ

- docker側で ros_entrypoint.sh の実行(忘れやすい!)

```
bash ros_entrypoint.sh
```

- ros masterの設定

```
master=172.17.0.1
client=172.17.0.2

export ROS_MASTER_URI=http://$master:11311
export ROS_HOSTNAME=$client
export ROS_IP=$client

```

### ROS_IP,ROS_HOSTNAMEの間違え

```
ifconfig
```
で自分のIPを確認、ros環境変数変に設定したIPと同じか確認


次のように```--net host```オプションをつけるとdockerのipアドレスが```172.17.0.1```とpcと同じになってべんり
```
docker run -it --rm --net host ros:kinetic
```
【Unity】RaycastPaddingの当たり判定をGizmoで表示するEditor拡張

# はじめに

unity 2020からUIの当たり判定を変更できるRaycastPaddingが追加されました。

https://docs.unity3d.com/Packages/com.unity.ugui@1.0/api/UnityEngine.UI.Graphic.html#UnityEngine_UI_Graphic_raycastPadding

非常に便利だと思うのですが視覚的にどのように変更されたのか分からなかったのでGizmoで表示してみました。

# 概要

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175167/fb892137-1d29-25e5-1694-d63797a440b7.png)

当たり判定とGizmoが正しいかのために赤のImageを追加して、実際にタッチがどのようになっているか確認してみます。

## Editorで確認

ある程度はあっているみたいなのですが1ピクセルの正確に表示されているかは微妙なところです、一応あっていると思います。

![Unity_tN62f18efZ.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175167/ab08efa3-c94f-0d2f-5f0c-aade4ba10709.gif)


# コード

<details><summary>コード全文.cs</summary><div>

```.cs
using UnityEngine;
using UnityEngine.UI;
using UnityEditor;

public static class RaycastPaddingDrawer
{
    [DrawGizmo(GizmoType.Selected, typeof(Image))]
    private static void DrawPadding(Image image, GizmoType gizmoType)
    {
        var rectTransform = image.rectTransform;
        var rect = rectTransform.rect;

        var max = rect.max;
        max.x -= image.raycastPadding.z;
        max.y -= image.raycastPadding.w;
        var min = rect.min;
        min.x += image.raycastPadding.x;
        min.y += image.raycastPadding.y;

        var p0 = rectTransform.TransformPoint(max);
        var p2 = rectTransform.TransformPoint(min);
        var p1 = new Vector3(p2.x, p0.y, p0.z);
        var p3 = new Vector3(p0.x, p2.y, p0.z);

        Gizmos.color = Color.green;
        Gizmos.DrawLine(p0, p1);
        Gizmos.DrawLine(p1, p2);
        Gizmos.DrawLine(p2, p3);
        Gizmos.DrawLine(p3, p0);
    }
}
```
</div></details>

# おわりに

便利な機能ですが視覚化して確認できなければ正直使いにくく拡張用のImageを追加するほうが確実な感じがしました、Unityが公式に対応してほしいですね…
Logto：サインイン、認証、およびユーザーIDを数分以内に構築するためのオープンソースプロジェクト

TL; DR
ウェブサイト -> https://logto.io
リポジトリ -> https://github.com/logto-io/logto

> Sorry if the grammar sounds weird since I used Google Translate for this article. You can check out the original English post [here](https://dev.to/gaosun/logto-open-source-project-to-build-sign-in-auth-and-user-identity-within-minutes-5bgi).

私は自分自身に問いかけました–なぜサインインを再度コーディングする必要があるのですか？ この未解決の質問を念頭に置いて、私は約1年前に数人の開発者の友人とLogtoの構築を開始しました。

より良いサインインソリューションが私たち自身のビジネス上の問題をどのように解決できるかを調査しているときに、サインインの内訳が多くの人々が認識しているよりもはるかに困難であることがわかりました。 私たちが日常的にやり取りしているコミュニティは、まともなオープンソースソリューションがないことがどれほど苦痛であるかについて多くのことを話し合っています。 これは私たちが最善の努力を尽くすことができるものです。

自助のアドバイスはしばしば人々に大きな夢を見るように促します。 だから私たちのアイデアも大きくなりました😁。 カスタマイズ可能なサインインUIだけでなく、IDソリューションも構築したいと考えています。

---

![Poster 1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2759906/a6403349-d3e9-d43d-9002-6414bb6f0847.jpeg)

同様の問題を解決している多くのプロジェクトについて聞いたことがあります。 彼らは偉大だ。 そして、これが私たちが際立っている方法です。 Logtoのいくつかのハイライト：

🧑‍💻 フロントエンドからバックエンドへのIDソリューション。

- エンドユーザー向けの快適なサインインエクスペリエンスとOIDCベースのIDサービス。
- アプリをLogtoとすばやく統合できるマルチプラットフォームSDK。

![Poster 3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2759906/55b7010a-2b98-7af6-6879-e71d26a6e74a.jpeg)

🎨 以前にコーディングする必要があった多くのものに対する、すぐに使用できるテクノロジーとUIサポート。

- ユーザーインターフェイスをカスタマイズし、行った変更をライブプレビューするための一元化された場所。
- 複数のプラットフォーム（GitHub、Google、Facebookなど）のソーシャルサインイン。
- 動的パスコードサインイン（SMSまたは電子メール経由）。

![Poster 4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2759906/8f8f4e3e-4a20-67cc-d168-adcfc848bf8d.jpeg)


💻 完全にオープンソースですが、使用するためにIDの知識は必要ありません。

- 非常に簡単なセットアップ（GitPod経由で1分未満、冗談ではありません）、ステップバイステップのチュートリアルとまともなドキュメント。
- 数回クリックするだけで、ユーザー、ID、およびその他の必要なものを管理するためのフル機能のWeb管理コンソール。

![Poster 5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2759906/2fe0ade8-d6c2-12b8-e7a1-a8514fef29c5.jpeg)

---

Logtoのパブリックベータ版をリリースしました。 いつものように、Logtoについてのあなたの考えを聞いて非常に感謝しています。 皆様のご参加を心よりお待ちしております。 乾杯！

（ところで、Logtoサービスは完全なNode.js + TypeScriptで書かれています）

ウェブサイト -> https://logto.io
リポジトリ -> https://github.com/logto-io/logto
Go言語で Collectionを用意してみる

## 概要
Go言語で他言語にあるコレクションを実現してみる企画。この際、Go言語の適正は一旦度外視する。  

> 試行錯誤しつつ頭を整理するための実装を晒しているものなので、正解を知りたい人は別記事を見た方が良い。

## 実装
まずは、共通処理としてのコレクションを実装してみる。シンプルで利用頻度の高そうな関数はこんな感じだろう。
- contains 
- filter
- map1
- foldLeft
- foldRight
- reverse
- headTail

なお、`Add`相当の `append(slice, elm)`, `Get`相当の `slice[i]`は既存実装のまま利用するのが最良と考えたのでこららの関数は用意していない。 

> 用意した関数の最後に挙げた `headTail`は 先頭要素の`head`と 次要素移行の tailを同時に返す関数として用意した。Go言語は複数の戻り値をサポートしているので、こういうことができる。片方しか不要なのであれば `head, _, _ := c.HeadTail()` という形で不要な方を捨てれば良い。そうは言っても tail用の配列コピーはするので処理効率は推して知るべしである。まぁ気にしない。

```golang
package collection

import "github.com/google/go-cmp/cmp"

func contains[T any](l []T, t ...T) bool {
	for _, tv := range t {
		var found bool
		for _, lv := range l {
			if cmp.Equal(tv, lv) {
				found = true
				break
			}
		}
		if !found {
			return false
		}
	}
	return true
}

func filter[T any](l []T, f func(t T) bool) []T {
	var result List[T]
	for _, v := range l {
		if !f(v) {
			continue
		}
		result = append(result, v)
	}
	return result
}

func map1[T, O any](l []T, f func(t T) O) []O {
	var result = make(List[O], len(l))
	for i, v := range l {
		result[i] = f(v)
	}
	return result
}

func foldLeft[T any](l []T, zero T, f func(t1, t2 T) T) T {
	var tmp = zero
	for _, v := range l {
		tmp = f(tmp, v)
	}
	return tmp
}

func foldRight[T any](l []T, zero T, f func(t1, t2 T) T) T {
	return foldLeft(reverse(l), zero, f)
}

func reverse[T any](l []T) []T {
	var tmp = l
	for i := 0; i < len(l)/2; i++ {
		tmp[i], tmp[len(tmp)-1-i] = tmp[len(tmp)-1-i], tmp[i]
	}
	return tmp
}

func headTail[T any](l []T) (*T, []T, bool) {
	if len(l) == 0 {
		return nil, List[T]{}, false
	}
	return &l[0], l[1:], true
}

```

次に、`List`型を用意し、これらの関数をメソッドとして割り当てていく。`List`は追加属性を必要としないので、任意のスライス `[]T`を型とする。
> Embedを用いればもう少しスッキリするが、メソッドではなく関数としての実装を確保しておきたかったので、敢えて利用していない。

```golang
package collection

type List[T any] []T

func (l *List[T]) Contains(t T) bool {
	return contains[T](*l, t)
}

func (l *List[T]) ContainsAll(t ...T) bool {
	return contains[T](*l, t...)
}

func (l *List[T]) Filter(f func(t T) bool) List[T] {
	return filter[T](*l, f)
}

func (l *List[T]) Map(f func(t T) T) List[T] {
	return map1[T, T](*l, f)
}

func (l *List[T]) FoldLeft(zero T, f func(t1, t2 T) T) T {
	return foldLeft[T](*l, zero, f)
}

func (l *List[T]) FoldRight(zero T, f func(t1, t2 T) T) T {
	return foldRight[T](*l, zero, f)
}

func (l *List[T]) Reverse() List[T] {
	var tmp List[T] = reverse(*l)
	return tmp
}

func (l *List[T]) HeadTail() (*T, List[T], bool) {
	return headTail(*l)
}

```

実際に利用する場合はこんな感じ。
```golang
func TestContains(t *testing.T) {
	var l List[int] = []int{1, 2, 3}

	assert.True(t, l.Contains(2))
	assert.False(t, l.Contains(4))
}

```

## まとめ

Generics を利用すれば、Go言語と言えどコレクションっぽい実装を実現することができる。あまり Go言語らしい実装ではないので、Goらしさを表に出したければ今回の様にメソッドとして利用するのではなく、共通関数として利用するなり、従来どおりにベタな実装に落とせば良いと思う。

業務に活かせるかは別として仕組みとしてはそれなりの実現が可能なのが分かった。ただ実装していて厳しい点もあった。
- structに型パラメータを指定すると、そのメソッドは追加の型パラメータを指定できないという制約
- 自然と関数を利用することになるので、アロー関数式が無いことによる表現の冗長さ

勘違いしている部分や個人的な意見等あればツッコミお願いします。
応用情報勉強法_学習計画

# はじめに
応用情報を取得したいと思っているけれど、
モチベーションが続かなかったり学習計画を達成できなかったりしてうまく勉強できないので
学んだ内容を記事として記録に残そうと思います。
「自分はこうやって勉強する！」ということを宣言することで学習方法に対して
ブレをなくすとともに、フィードバックを受けやすい環境に学習方法を公開することで、
合格までの効率を上げたい、というのが投稿の目的です。

## 投稿者のレベル
* ド文系
* IPAの試験はIパスのみ（2017年取得）
* アルゴリズムや数学がものすごく苦手

# 使用テキスト
* 過去問道場
* 徹底攻略　応用情報教科書
* 午後問題の重点対策 2022
https://book.impress.co.jp/books/1121101057

https://www.amazon.co.jp/s?k=%E5%BF%9C%E7%94%A8%E6%83%85%E5%A0%B1%E6%8A%80%E8%A1%93%E8%80%85%E5%8D%88%E5%BE%8C%E5%95%8F%E9%A1%8C%E3%81%AE%E9%87%8D%E7%82%B9%E5%AF%BE%E7%AD%96&i=stripbooks&adgrpid=53636609736&gclid=CjwKCAjwrZOXBhACEiwA0EoRD9esQwKsn3koTzh2N6IMCMFEin2nqicrFf5k-m4hSeEkqVkuraidORoCEc8QAvD_BwE&hvadid=553833688722&hvdev=c&hvlocphy=1009304&hvnetw=g&hvqmt=e&hvrand=15332121650125976984&hvtargid=kwd-335184896621&hydadcr=4078_13159898&jp-ad-ap=0&tag=googhydr-22&ref=pd_sl_7gg1xxcu5c_e

# 学習方法
## 午前
* 過去問道場を解く。
* 間違えたところを解説を読んで、自分なりに理解した内容を記事として投稿する。
* 点数が9割を超えたら次の回に進む。10回分9割は確保したい。

## 午後
* 午後問題の重点対策問題を解く。
* 間違えたところを解説を読んで、自分なりに理解した内容を記事として投稿する。

# 学習記録
都度記事を作成し、以下にリンクとして残す。

### 7/31学習分
https://qiita.com/tansuke2021/items/cc9cf0f40a62154fd285

# おわりに
なんとか合格したい…！
「もっとこうしたほうがいい！」などご指摘大歓迎です！
よろしくお願いいたします。
Linux　ネットワークについて（自分用メモ



ネットワークについて
通信上の取り決め、通信規約のことをプロトコルという。最も有名なプロトコルはTCP/IP。

●TCP（Transmission Control Protocol）
ネットワーク通信において信頼性を確保するためのプロトコル。TCP/IPではパケットというデータを細切れ分割した通信が届いたかどうかを確認し、届いてなければ再送するなど、さまざまな方法で信頼性向上を図っている。

●IP（Internet Protocol）
ネットワーク上のIPアドレスを規定し、パケットが伝送されるネットワーク経由の制御を担当する。

※TCP/IPではコンピュータやネットワーク機器にIPアドレスを割り当てる
※IPにはIPアドレスが３２ビットのIPv4とIPアドレスが１２８ビットのIPv6がある。

●UDP（User Datagram Protocol)
TCPがパケットの到達を確認しながら通信するのに対して、UDPはその様な確認は行わない。そのため、通信の信頼性は劣るが、スピーディな伝送が期待されている。

●ICMP(Internet Control Message Protocol)
通信で発生したエラーを伝えるメッセージや、通信の制御に関するメッセージなどを伝送するプロトコル。

・IPアドレスはネットワーク部とホスト部から成り立っている。３２ビットのIPアドレスのうち、どこまでがネットワーク部でどこからがホスト部なのかという境界線は、サブネットマスクを使って求めることができる。

・ネットワーク部が同じのIPアドレスは１つのネットワークに属している。このネットワークの範囲をネットワークセグメントという。同じネットワークに属しているコンピュータ同士は、直接通信を行うことが可能。

●プライベートアドレスとグローバルアドレス
インターネット上で使われるIPアドレスは重複しない様にICANNという非営利団体が管理しており、ISPなどを通じてユーザーに割り当てられる。これをグローバルアドレスという。グローバルアドレスは勝手に使ってはいけない。
プライベートアドレスは、企業内LAN内で自由に利用できるIPアドレスの範囲が決められている。

・IPアドレスはTCP/IPネットワーク上のコンピュータ（ホスト）識別に使われるが、送信元や送信先アプリケーションを識別するためにポート番号が使われる。
ネットワークサービスで使われる代表的なポート番号は標準化されていて、これをウェルノウンポートといい、０番から１０２３番までが予約されている。

●/etc/hostnameファイル
ホスト名を設定する。ホスト名はLinuxにマシンにつける名前。

●ホスト名の確認
hostname

●/etc/hostsファイル
IPアドレスとホスト名（コンピュータ名）との対応を記述する。ここで設定すると、IPアドレスを指定する代わりにホスト名をコマンドの引数や設定ファイルの値として指定できる様になる。

●/etc/resolv.confファイル
ホストが利用するDNSサーバーを指定する。DNSサーバーとは、ホスト名とIPアドレスの相互変換を処理するサーバー。

●ネットワークインターフェイスの情報を確認
ip address show [ネットワークインターフェイス名]

●ネットワークインターフェイスの情報を確認（古いシステムの場合）
ifconfig [ネットワークインターフェイス名]

●ポートの確認
ss [オプション]

●ポートの確認（古いシステムの場合）
netstat [オプション]

オプション
-a 全てのソケット（接続）情報を表示
-l サーバが開いているポート表ｚ
-t　TCPポートのみ表示

●ルーティングテーブルを表示
route

※ip route show　でもルーティングテーブルを表示できる

●hostコマンド
DNSサーバに問い合わせを行い、指定したホスト名に対応するIPアドレスを確認できる。
host ホスト名　または　IPアドレス

●sshコマンド
ネットワークを経由した他のホストとの通信を安全に行うプロトコル。sshコマンドを使うとSSHプロトコルを使ってリモートホストに接続し、暗号化された安全な通信ができる。
ssh [ユーザ名@]接続先ホスト名　または　IPアドレス

●pingコマンド
指定したホストに向けてICmPパケットを送信する。もしホストが動作していれば反応が返ってくるため、そのホストが動作しているか・ネットワークにつながっていることが確認できる。
ping 接続先ホスト名　または　IPアドレス

※Ctrl+Cキーを押すまでICMPパケットは送信され続ける。

●ログ
Linuxには、ログを集約して管理するsyslogという仕組みがある。CentOSでは、rsyslogというシステムプログラムによってログが集約され、ログファイルに保存される。
ログファイルは/var/logディレクトリ以下に保存される。多くはlessコマンドで閲覧できたり、grepコマンドで特定のキーワードを検索できる。

●dmesg
システム起動時のメッセージが確認できる。
Node.js: Yahoo 郵便番号検索API の使い方

参考ページ
[郵便番号検索API](https://developer.yahoo.co.jp/webapi/map/openlocalplatform/v1/zipcodesearch.html)

```js:get_address.js
#! /usr/bin/node
// ---------------------------------------------------------------
//	get_address.js
//
//					Jul/31/2022
//
// ---------------------------------------------------------------
'use strict'
import * as https from "https"
import * as dotenv from "dotenv"

console.error ("*** 開始 ***")
dotenv.config()
const APPID = `${process.env.APPID}`

const code_zip = process.argv[2]
console.log(code_zip)


const url_base = 'https://map.yahooapis.jp/search/zip/V1/zipCodeSearch'
const url = url_base + "?query=" + code_zip + "&output=json"

const headers = {
		"Content-Type": "application/json",
		"User-Agent": "Yahoo AppID: " + APPID
	}

const options = {"headers": headers}

const req = https.get(url, options, res => {
	console.log(`statusCode: ${res.statusCode}`)

	res.on('data', dd => {
//	process.stdout.write(dd)
	const dict_aa = JSON.parse (dd)
	console.log(dict_aa['Feature'][0]['Property']['Address'])
	console.error ("*** 終了 ***")
	})
})

req.on('error', error => {
	console.error(error)
})

req.end()

// ---------------------------------------------------------------
```

```json:package.json
{
  "type": "module"
}
```

```text:.env
APPID = 'dj0zaiZpPW9NN3F****'
```

実行例

```text
./get_address.js 131-8634
```
googleドライブ内のコメントつきファイルをコメントごとコピペする

Googleドライブ内の、コメントつきファイルをコメントも含めてコピー＆ペーストしたい。

１つは議事録として保管、もうひとつはレビュー指摘反映したいときにコメントをコピーできないと困るからだ。

昔のgoogleの仕様では、コピー作成のときに「コメントつき」のチェックボックスがあったようだが、いまの仕様ではその機能が見当たらないので。

対応策としては、対象ファイルをダウンロード＋アップロードしなおすことで、コメント含めてコピペしたことになる。

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2759593/5c26380e-5037-e03a-f2ed-44d460d4e445.png)


ダウンロードしたら、貼り付けたい場所にて、アップロードしなおすだけでOK。

![無題2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2759593/fadb61ea-67b1-a9cb-7a7d-214de440b63d.png)


効率のいいやり方ではないので、もっといい案がわかったら、更新したい。
sqlite3 command memo

# sqlite3 memo

よく使うコマンド for sqlite3.

## 1. BASIC
```shell
> sqlite3 DATABESE.db
```

```sql
CREATE TABLE table1(col1 STRING, col2 INTEGER) -- create table

SELECT * from table1; -- get contents

SELECT col1 FROM table1 WHERE col2 = 3; -- with conditions

PRAGMA table_info('table1'); -- table info.
.tables -- show all tables

DROP TABLE 'table1'; -- delete table

.exit -- stop sqlite3 command-line
```
【忘備録】escキーのイベント

## 概要
JavaScriptでescキーが押下された時にイベントが発火するように作っていきます。

## 作り方
#### コード
```
document.addEventListener('keydown', function(e) {
  if(e.key === 'Escape'){
    "ここにescキーを押した時の処理を書く"
  }
})
```
この記述で作れるはずです。

## 解説
```
document.addEventListener
```
→ そのサイト全てでescキーを押下した際に、記述した処理が実行される

```
'keydown'
```
→ キーが押下された際すぐにイベントが発行する
その他のキーイベント👇
- keyup: キーが離された時に発行する
- keypress: 【❗️非推奨❗️機能削除の可能性あり】文字値を生成するキー（アルファベットキー、数字キー、区切り記号キー）が押下された時に発行する

```
if(e.key === 'Escape')
```
→ 押下したキーがescキーだった時

###### 検証：　if(e.key === 'Escape')この記述でescキーを指定できるのか！？
```
document.addEventListener('keydown', function (e) {
　　console.log(e.key);
}
```
- 👆をscript.js（等テキトーなJSファイル）に記述し、テキトーなHTMLファイルをブラウザで開きます。
- デベロッパーツールを開き、ブラウザ上でescキーを押してみてください。
- コンソールにEscapeという文字列が出てくるはずです。
（他のキーでも同様です）

###### 結果
if(e.key === 'Escape')　という記述でescキーを指定できる

## まとめ
初投稿でした！もっとわかりやすい記事を書けるように頑張ります！
Vueでcase文

仕事で使った、Vueのcase文の復習をしてみました。

```
<template>
  <div>
    <button v-for="btn in btns"
      :key="btn.id"
      @click="btnClicked(btn)">
      {{btn.text}}
    </button>
    <p>{{message}}</p>
  </div>
</template>
<script>
export default{
  data(){
    return{
      btns:[
        {
          cmd:'methodA',
          text:'btnA'
        },
        {
          cmd:'methodB',
          text:'btnB'
        }
      ],
        message:"not clicked"
    }
  },
  methods:{
    btnClicked(command){
      switch(command.cmd){
        case 'methodA':
          this.methodA()
          break
        case 'methodB':
          this.methodB()
          break
        default:
          this.methodOthers()
      }
    },
    methodA(){
      this.message = "This is A"
    },
    methodB(){
      this.message = "This is B"
      alert("Bだよ!")
    },
    methodOthers(){
      this.message = "othersClicked"
    }
  }
}
</script>
```
実行結果はこちらです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2725725/009cd70c-e898-078f-847b-437182b1179a.png)
ボタンをクリック後はこうなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2725725/30627349-c033-b240-3678-1cd86140ce36.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2725725/43eb333e-e518-3b58-0a91-15eb0d8e16cb.png)
SSSD/realmd

# はじめに
CentOSをWindowsServerのActiveDirectoryで管理したい場合に、CentOS側で必要な主要パッケージや設定をまとめます。

# 主要パッケージ

- SSSD
System Security Services Daemonの略。ローカルクライアントと指定したバックエンドのプロバイダー(ADなど）間を仲介する機能を持つ。主な設定ファイルは「/etc/sssd/sssd.conf」。「realm join」コマンドでドメイン参加ができ、その際にWindowsドメインの環境に応じて作成される。
```設定例：sssd.conf
[sssd]
domains = ドメイン名
config_file_version = 2
services = nss, pam

[domain/ドメイン名]
ad_domain = ドメイン名
krb5_realm = ドメイン名
realmd_tags = manages-system joined-with-samba
cache_credentials = True
id_provider = ad
krb5_store_password_if_offline = True
default_shell = /bin/bash
ldap_id_mapping = True
#use_fully_qualified_names = True
#fallback_homedir = /home/%u@%d
fallback_homedir = /home/%u
access_provider = ad
```
- realmd
sssdとKerberos認証の設定、及びマシンアカウントの追加を自動的に行うことが可能なユーティリティ。「realm join」コマンドでドメイン参加ができ、その際に「krb5.conf」ファイル(kerberos認証を利用するための設定ファイル)がWindowsドメインの環境に応じて変更される。

```設定例：krb5.conf
# Configuration snippets may be placed in this directory as well
includedir /etc/krb5.conf.d/

includedir /var/lib/sss/pubconf/krb5.include.d/
[logging]
default = FILE:/var/log/krb5libs.log
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmind.log

[libdefaults]
dns_lookup_realm = false
ticket_lifetime = 24h
renew_lifetime = 7d
forwardable = true
rdns = false
# default_realm = EXAMPLE.COM
default_ccache_name = KEYRING:persistent:%{uid}

default_realm = ドメイン名
[realms]
# EXAMPLE.COM = {
# kdc = kerberos.example.com
# admin_server = kerberos.example.com
# }

ドメイン名 = {
}

[domain_realm]
# .example.com = EXAMPLE.COM
# example.com = EXAMPLE.COM
ドメイン名(小文字) = ドメイン名(大文字)
.ドメイン名(小文字) = ドメイン名(大文字)
```
各ドメインのカスタム設定は、/etc/realmd.conf ファイルで定義。
```設定例：realmd.conf
[ad.example.com]
computer-ou = ou=Linux Computers,DC=domain,DC=example,DC=com
user-principal = host/linux-client@AD.EXAMPLE.COM
automatic-id-mapping = no
```

Linuxサーバーが利用する認証の設定（pamファイルやnsswitch.conf)にて認証にsssdを利用するよう変更が必要。

以上、最後まで読んで頂きありがとうございました！
二分探索動画のコード

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

https://atcoder.jp/contests/abc231/tasks/abc231_c

```python:
# 入力の受け取り
N,Q=map(int,input().split())
A=list(map(int,input().split()))
 
# Aをソート
A.sort()
 
# Q回
for i in range(Q):
    # 入力の受け取り
    x=int(input())
 
    # xがAの中で最小の要素以下である場合
    if x<=A[0]:
        # N人
        print(N)

    # xがAの中で最大の要素より大きい場合
    elif A[N-1]<x:
        # 0人
        print(0)

    # 二分探索
    else:
        # 左
        l=0
        # 右
        r=N-1
    
        # 1<右-左の間
        while 1<r-l:
            # 中央
            c=(l+r)//2
    
            # A[c]<xならば(条件を満たさない場合)
            if A[c]<x:
                # 左=中央と更新
                l=c
            # そうでなければ(x≤A[c] 条件を満たす場合)
            else:
                # 右=中央と更新
                r=c

        # 答え：(N-r)人
        print(N-r)
```

ライブラリあり

```python:
# 入力の受け取り
N,Q=map(int,input().split())
A=list(map(int,input().split()))
 
# Aをソート
A.sort()

# ライブラリをインポート
import bisect

# Q回
for i in range(Q):
    # 入力の受け取り
    x=int(input())
 
    # xがAの中で最小の要素以下である場合
    if x<=A[0]:
        # N人
        print(N)

    # xがAの中で最大の要素より大きい場合
    elif A[N-1]<x:
        print(0)

    # 二分探索
    else:
        
        r=bisect.bisect_left(A, x)
        
        # 答え：(N-r)人
        print(N-r)
```
flutterでfile_pickerを使うときにキャッシュを消す方法

## 概要

共有ストレージからファイルをアップロードする際に、[file_picker](https://pub.dev/packages/file_picker) という便利なライブラリがありますが、ファイル名は変えずに変更を加えたファイルを再度アップロードしようとしても反映されずに悩んだので解決方法を紹介します。

## 原因

よくよくドキュメントを見てみるとAndroidの場合、必ずキャッシュされる仕様になっていました。

https://pub.dev/packages/file_picker/changelog#200

> On Android all picked files are scoped cached which should result in most of files being available. Caching process is only made once, so once done, the picked instance should be the same;


なので更新後のファイルが読み込まれなかった原因は、選択したファイルではなくキャッシュ済みのファイルが呼び出されていたことでした。


## 解決策

`clearTemporaryFiles`というメソッドが用意されているので、それを呼び出すだけです。

### 例

```dart
FilePicker.platform.clearTemporaryFiles();
final filePickerResult = await FilePicker.platform.pickFiles();
```

## おまけ

引数でキャッシュを残すか否か選択できるような仕様だとわかりやすかった。。。


## 参考文献

https://pub.dev/packages/file_picker
Python日記#1

# python(Tkinter)プログラム

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2759758/c56ad768-3fcb-a1ed-88d7-fe0e8f50db37.png)

上記のようなプログラムを作成しました。
下記にコードを共有します。

```Python

    from msilib.schema import Class
    from tkinter import *
    import tkinter
    import os
    from tkinter import filedialog
    import pathlib

    # 画面作成
    root = tkinter.Tk()
    root.geometry('600x500') # 横x縦
    root.title('テキストファイル出力')
    
    def folder_click():
        dir = 'C:\\'
        fld = filedialog.askdirectory(initialdir = dir)
        txt_1.delete(0, tkinter.END) # 削除の処理 
        txt_1.insert(0,fld)
    def create_text():
        file_name = txt_2.get()
        path = txt_1.get() +'/'+ file_name +'.txt' # 選択したフォルダのパスを受け取る。
        f = open(path, 'w')
        f.write(txt_3.get())
        f.close()
    def folder_get():
        path = txt_1.get()
        folder_path = 'folder.txt' 
        f = open(folder_path, mode='w')
        GetFolderFileNames(path, 0, f)
        
    def GetFolderFileNames(path, kaiso, f):
        files = pathlib.Path(path).glob('*')#その階層のフォルダやファイルを取得
        for file in files: # ループしてフォルダ内にファイルをテキストに記載する。
            output = '\t' * kaiso + file.name + '\n'
            f.write(output)
        # プログラム5｜フォルダの場合、その下の階層のフォルダやファイルをGetFolderFileNames(プログラム6)を呼び出す
        if file.is_file() == False:
            GetFolderFileNames(file, kaiso+1, f)
    # ラベル
    lbl_1 = tkinter.Label(text='フォルダ選択')
    lbl_1.place(x=100, y=80) 
    
    lbl_2 = tkinter.Label(text='ファイル名入力')
    lbl_2.place(x=100, y=110)
    
    lbl_3 = tkinter.Label(text='テキスト入力')
    lbl_3.place(x=100, y=140)
    
    # テキストボックス
    txt_1 = tkinter.Entry(width=30)
    txt_1.place(x=180, y=80)
    
    txt_2 = tkinter.Entry(width=30)
    txt_2.place(x=180, y=110)
    
    txt_3 = tkinter.Entry(width=30)
    txt_3.place(x=180, y=140,height=100)
    
    # ボタン
    btn = tkinter.Button(root, text='フォルダ選択', command=folder_click)
    btn.place(x=210, y=250)
    
    # ボタン
    btn = tkinter.Button(root, text='テキストファイル作成', command=create_text)
    btn.place(x=210, y=290)
    
    # ボタン
    btn = tkinter.Button(root, text='フォルダ一覧取得', command=folder_get)
    btn.place(x=210, y=330)
    
    root.mainloop() # アプリを起動
```
以上になります。
【Ruby on Rails】deviseの導入から実装するまで


## 目標
deviseを導入し実行できるまで

## 開発環境
ruby '3.1.2'
rails '7.0.3'

## 実装
devise導入から、実装までの一連の流れ

### deviseをインストール
```Gemfile.
gem 'devise'
```
```ターミナル.
% bundle install
```

% rails g devise:install
rails g deviseコマンドは、deviseによるユーザー機能の対象を指定することで、モデルとマイグレーションの生成やルーティングの設定などをまとめて処理します。

実行すると、モデルが生成され、routes.rbにはdeviseに関連するパスが追加されます。

### Userモデルを作成
```ターミナル.
% rails g devise user
```
### マイグレーションファイルを編集
```
class DeviseCreateUsers < ActiveRecord::Migration[6.0]
 def change
   create_table :users do |t|
     ## Database authenticatable
     t.string :email,              null: false, default: ""
     t.string :encrypted_password, null: false, default: ""
     t.string :name,               null: false

     # 省略

end
```
nameカラムを追加

```ターミナル.
% rails db:migrate
```
### viewsを追加
```ターミナル.
% rails g devise:views
```
deviseに用意されたビューファイルをコピーし、app/viewsの配下に配置してくれるコマンドです。
HTMLを修正できるため、カスタマイズ可能になります。

### viewsを編集
```app/views/devise/sessions/new.html.erb
<div class="contents row">
  <div class="container">
    <h2>Log in</h2>
    <%= form_with model: @user, url: user_session_path, id: 'new_user', class: 'new_user', local: true do |f| %>

      <div class="field">
        <%= f.label :name %><br />
        <%= f.text_field :name%>
      </div>
      <div class="field">
        <%= f.label :email %><br />
        <%= f.email_field :email, autofocus: true %>
      </div>

      <div class="field">
        <%= f.label :password %><br />
        <%= f.password_field :password, autocomplete: "off" %>
      </div>

      <% if devise_mapping.rememberable? %>
        <div class="field">
          <%= f.label :remember_me %><br />
          <%= f.check_box :remember_me %>
        </div>
      <% end -%>

      <div class="actions">
        <%= f.submit "Log in" %>
      </div>
    <% end %>
  </div>
</div>
```
nameカラムの記入欄を追加

### モデルにバリデーションを記入
```app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  before_action :authenticate_user!
  before_action :configure_permitted_parameters, if: :devise_controller?

  private
  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:name])
  end
end
```
application_controllerにbefore_actionを使用しているため、全てのアクションが実行される前に、実行されます。

before_action :authenticate_user!により、ログインしていないユーザーをログインページの画面に促すことができます。

configure_permitted_parametersで、configure_permitted_parametersメソッドを呼び出しています。

```詳細.
devise_parameter_sanitizer.permit(:deviseの処理名, keys: [:許可するキー])
```
コピペ用『TypeScriptとReact/Next.jsでつくる 実践Webアプリケーション開発』の環境構築用コマンド

モダンなフロントエンド開発を学びたくて『TypeScriptとReact/Next.jsでつくる 実践Webアプリケーション開発』を購入して学習しているが、環境構築用のコマンドの手打ちが辛かったので、誰かのために残しておきます。

サンプルアプリのソースコードや正誤表は下記サポートページから参照できます。
https://gihyo.jp/book/2022/978-4-297-12916-3/support

やったところまで記述して、適宜追記していきます。


5.2.1
```zsh
npx create-next-app@latest --ts 
cd nextjs-gihyo-book
npm run dev
```


5.2.2
```zsh
npm install styled-components
npm install --save-dev @types/styled-components
```




5.2.3
```zsh
npm install --save-dev prettier eslint typescript-eslint @typescript-eslint/eslint-plugin @typescript-eslint/parser eslint-config-prettier eslint-plugin-prettier eslint-plugin-react eslint-plugin-react-hooks eslint-plugin-import

npm run lint
npm run format
```


5.2.4
```zsh
npx sb init
npm install --save-dev @storybook/addon-postcss tsconfig-paths-webpack-plugin @babel/plugin-proposal-class-properties @babel/plugin-proposal-private-methods @babel/plugin-proposal-private-property-in-object tsconfig-paths-webpack-plugin @mdx-js/react
npm run storybook
```


5.2.5
```zsh
npm install react-hook-form
```



5.2.6
```zsh
npm install swr
```



5.2.7
```zsh
npm install react-content-loader
npm install --save-dev @types/react-content-loader
```



5.2.8
```zsh
npm install @mui/material @mui/icons-material @emotion/react @emotion/styled
```

5.2.9

```zsh
 npm install --save-dev @testing-library/jest-dom @testing-library/react jest jest-environment-jsdom
```
【Rails】Simple Calendar gem を使ってカレンダー機能作成

カレンダー機能を実装した時の忘却防止メモ

<a href="https://github.com/excid3/simple_calendar">公式リファレンス</a>を参考にgemを追加

### Gem install

```Gemfile.
gem "simple_calendar", "~> 2.0"
```

`bundle install`を実行


### css 適応
```app/assets/stylesheets/application.css
*= require simple_calendar
```

### View表示

```index.html.erb
<%= month_calendar  do |date| %>
  <%= date.day %>
<% end %>

```

![スクリーンショット 2022-07-31 12.02.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1799261/93345d85-fc2b-ef42-c08d-04283d882d82.png)
二次方程式の解を求めるプログラム

# 二次方程式の解を求めるプログラム
```python:二次式練習5.py
import tkinter as tk

def dispLabel():
    a = int(EditBox1.get())
    b = int(EditBox2.get())
    c = int(EditBox3.get())
    D = b**2-4*a*c

    if a==0:
        
        lbl4.configure(text="x="+str(-c/b))

    else:    
        if D<0:
            lbl4.configure(text="解無し")
        else:
            answer1=(-b-(b**2-4*a*c))/2*a
            answer2=(-b+b**2-4*a*c)/2*a
            str_answer1=str(answer1)
            str_answer2=str(answer2)
            lbl4.configure(text="x="+str_answer1+","+str_answer2)

root=tk.Tk()
root.geometry("200x300")

EditBox1= tk.Entry(width=2)
EditBox1.place(x = 20, y = 20)
EditBox2= tk.Entry(width=2)
EditBox2.place(x = 60, y = 20)
EditBox3= tk.Entry(width=2)
EditBox3.place(x = 100, y = 20)

btn=tk.Button(text="計算する",command=dispLabel)
btn.place(x = 60, y = 60)
lbl1=tk.Label(text="x²+").place(x = 40, y = 20)
lbl2=tk.Label(text="x+").place(x = 80, y = 20)
lbl3=tk.Label(text="=0").place(x = 120, y = 20)
lbl4=tk.Label(text=" ")
lbl4.place(x = 20, y = 100)

tk.mainloop()
```
## 作り方
a*x^2+b*x+c型の二次式のa,b,cを打ち込めるようにし、x=解と表示できるようにします。
また虚数解になる場合には解無しと表示させるプログラムを作ります。

1行目の`import tkinter as tk`はtkinterをインポートし、操作できる画面を作ります。

2から5行目の`def dispLabel():`
`a = int(EditBox1.get())`
`b = int(EditBox2.get())`
`c = int(EditBox3.get())`でa,b,c,を入力できるボックスを作ります。

6行目の`D = b**2-4*a*c`ではDを判別式する場合のDの値です。
Dが0未満の時は`xは解無し`と表示したいため、
D!=0と書くより前の段階で計算しておく必要があります。

又、aが0の時は二次関数ではなくただ一次式を計算すればいいのでif文で先に解を計算させます。

10行目ではaが0でなかった場合、つまり二次式だった時に先ほどのDが0未満であるか否かを判別します。

12から17行目ではDが0以上であるときの計算式を作っています。

18,19行目ではウィンドウの大きさ、20から25行目ではa,b,cのボックスの位置を指定しています。


## 感想
・aが0だった場合、Dが0未満の場合、それ以外の場合の計算とラベルの反映をどのように場合分けするか。
・a,b,cに入力した数字はそのままだと文字型になってしまうので、どの段階で数字型に変換させたらいいか。
の2点が難しかったです。