OmniAICreator/Qiita-1.07M huggingface dataset:
【夏休み企画】#IT用語一問一答【毎朝投稿22日目】Linux distribution

# この記事を読むと、、
- 「関連用語」を使って「Linux distribution」を説明できるようになる
- 「Linux distribution」がもっと好きになる(多分)

# 関連用語
GNU / GCC / Bash / X11 / Debian / Ubuntu / CentOS / Fedora

[**復習用**] 記事の内容を見る前に上記の言葉で「Linux distribution」を説明してみよう！

# 企画説明
- クラウドって何？って人に聞かれて説明してるけど俺もよく知らないや、、
- ドキュメント読んでみてるけど半分くらい何言ってるか分かんない、、
- 今日の夕飯はナスの炒めものにしよっかな〜、あれ、NASってなんだっけ？

みたいなことが結構あったので、知ったかしていたIT用語を毎日一個ずつちゃんと学んでいこうっていう企画です！

昨日の記事はこちら↓

https://qiita.com/acta/items/27a8df87f3b8abfce171

# Linux distributionとは
Linux distribution = distro = Linux kernelなどのコンポーネントからなるOS群

- ハードウェアに直接アクセスできるkernelと、それ以外のuserlandで構成される

- distroに含まれるコンポーネントは例えば以下のものがある
    - Linux Kernel
        - これがないとLinux distributionって呼べない
    - **GNU**ソフトウェア
        - "GNU's Not Unix!" = Unix系の設計だがUnixのコードを含まないフリーソフトウェア群
        - グヌーと発音する
        - LinuxはGNU/Linuxと呼ばれることもある
        - ex. Coreutils = GNU Core Utilities
            - cat, ls, rmといった基本ツールの実装
        - ex. **GCC** = GNU Compiler Collection
            - C/C++, Objective-C, Fortran, Ada, D, Goなどのコンパイラ群
        - ex. glibc = GNU C Library
            - 標準Cライブラリ実装
            - C++もサポートしてる
        - ex. binutils = GNU Binutils
            - GCCの補助的なクロスアセンブラとして使われたりする
        - ex. **Bash**
            - Bourne Shell(Unixシェルの一つ)のフリーソフトウェア版
        - ex. GNOME
            - X Window System上で動作するデスクトップ環境
            - グノームと発音する
    - window system
        - ex. X = **X11** = X Window System
            - GUI環境のための基本フレームワークを提供するwindow system

- 有名なdistro
    - **Debian**系
        - ex. Debian GNU/Linux
            - deb形式のパッケージをapt = Advanced Package Tool, dpkgで管理
            - GNUプロジェクトの精神を重んじて、フリーソフトウェアで構成されている
        - ex. **Ubuntu**
        - ex. Raspberry Pi OS
    - Red Hat系
        - パッケージはrpm = Red Hat Package Managerで管理
        - RHEL = Red Hat Enterprise Linux
            - 企業向けの有料版
            - Red Hat社による開発
            - レルと発音する
        - **CentOS**
            - RHEL互換のフリーのdistro
        - **Fedora**
            - 無料版
            - コミュニティによる開発
    - Gentoo Linux
        - Chrome OS, Chromium OSに派生

# 参考資料
- https://en.wikipedia.org/wiki/Linux_distribution
- https://en.wikipedia.org/wiki/GNU
- https://en.wikipedia.org/wiki/X_Window_System
- https://en.wikipedia.org/wiki/GNU_Core_Utilities
- https://en.wikipedia.org/wiki/Bash_(Unix_shell)
- https://en.wikipedia.org/wiki/GNU_Compiler_Collection
- https://en.wikipedia.org/wiki/Debian
- https://en.wikipedia.org/wiki/Ubuntu_(operating_system)
- https://en.wikipedia.org/wiki/Red_Hat_Enterprise_Linux
- https://en.wikipedia.org/wiki/CentOS
- https://en.wikipedia.org/wiki/Fedora_Linux
- https://ja.wikipedia.org/wiki/Gentoo_Linux
Surveyを内部ユーザ向けに使う設定


community を有効化する必要があるかないかが争点ですが、よく分からん。
調べても出てこない。

[Survey are send through classic email template](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000JyvYu)


こっちは違う方法を議論していて余計に分かりません。
[Salesforce Internal User Feedback Survey?](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000A8CjySAF)
LinuxにTeraTermでSSH接続時 「接続が拒否されました」と表示 ( Linux, CentOS7, VirtualBox )

# 1. TeraTermでSSH接続時 「接続が拒否されました」と表示 
(denied connecting to Linux CentOS7 with TeraTerm)
## 1. やったこと
- 1.仮想環境の設定でホストからの接続を確立(Virtual Boxを使っているので、そのUI上の名称で記述しています)
    - 仮想環境の電源を切り > VMの設定 > ネットワーク > アダプター2 > ネットワークアダプターを有効化に✓ > ホストオンリーアダプターを選択 > OK ([参考記事](https://bitwave.showcase-tv.com/%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%ABpc%E3%81%A8virtual-box%E3%81%AE%E4%BB%AE%E6%83%B3%E3%83%9E%E3%82%B7%E3%83%B3%E3%81%A8%E3%81%AE%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E6%8E%A5/))
(ホストオンリー=ホストPCとVMなどの仮想環境との接続のみ確立される)

    - その後、Windows側でping コマンドでホストからの接続可否を確認
    - しかしTeraTermで接続を試行すると、「接続が拒否されました」が表示されてしまう (※本来はこれで接続できます。それでもできなかったのは下の5.のミスをしたからです。)

- 2.仮想環境に設定した接続アダプタのip変更が必要？
    - ipの競合がある可能性を顧みて[こちら](https://i-think-it.net/centos7-ip-setting/)を参考にipの変更を試みた
    - 変更しようとしたが,「nmcli」コマンドを実行すると、loがそもそも接続済みでなかった。。。(下5.にある通り、そもそも接続先はloではなかった。。。)

- 3.sshデーモンが起動しているか確認した
    - 「systemctl status sshd.service」コマンドで確認した([参考記事](https://qiita.com/sango/items/816136188387221f05b3))
    - 「server listenning on 0.0.0.0 por...」が表示されていたが、TeraTerm5で接続してみると「接続が拒否されました」と表示された

- 4.最終的に、Linuxの端末にて「ifconfing」コマンドで得たIPの中で別のIPに接続先を変更してみたら(Windows側で応答があるIPが2つほどあった)、接続ができた(rootで接続・ログインしたいときは/etc/ssh/sshd_configのrootpermit...をyesにする必要あり。([説明記事](https://www.kerokuma.net/centos_to_teraterm-ssh/)) su権限を与えているアカウントなら必要ないですが。)

- 5.よくよく確認すると、1.でアダプターを増やす前にLinuxにて【「ifconfig」コマンド > IP一覧 】
その後、アダプターを増やして【「ifconfig」コマンド > IP一覧 】
をした際に、どの名称のIPが増えたのか分かっていなかった。
なので目的のアダプタ(IP)に「アクセスしていなかった」だけだった。4.で変更したアクセス先こそが「増やしたアダプターへのIP」だった。。。

以上で、接続できるはずが、なぜかできずにハマっていたと思ったら、そもそもアクセスするIPが間違っていたという事象の記録になります。
Linux systemd主な起動オプションとGRUB設定ファイルについて

●systemdの起動処理
Red Hat Enterprise Linux 7.0以降では、SysVinitの代わりにデフォルトでsystemdが用いられ、initの代わりにsystemdというプロセスが起動。起動処理時に起動されるサービスはデーモンとしてバックグラウンドで動作。

●Linuxカーネルの主な起動時オプション

・init=<PATH> initの代わりに指定コマンドを実行
・root=<DEVICE> ルートパーティションを設定
・systemd.unit=<TARGET> 指定したターゲットで起動
・single シングルユーザモードで起動
・quiet 起動中のカーネルからの情報出力を抑制する

Linuxカーネルの起動オプションは事前にブートローダの設定ファイルに記述しておく他に、ブートローダの実行時にその場で指定することもできる。

●systemdでは、Unitという単位で各種処理される。Unitは設定ファイルであり、Unitの設定に従ってsystemd自体が処理を実行。

各ユニットやターゲット（必要なユニットのまとまり）の定義ファイルを新規作成や変更した場合、以下のコマンドでsystemdに設定を再読み込みさせる必要がある。

systemctl daemon-reload


●systemd-delta
同じファイル名のユニット、ターゲットの定義ファイルが複数あり、ディレクトリの優先度に基づいてデフォルトの定義ファイルを上書きしている場合等、どのファイルがどのように影響を受けているか確認するコマンド


●GRUB2の設定ファイル
標準では「/boot/grub/grub.cfg」（CentOS7では「/boot/grub2/grub.cfg」）。一般的なBIOSを使ったシステムは、これに該当。
GRUB2では「grub.cfg」ファイルを直接編集することはない。設定内容は「/etc/default/grub」ファイルおよび「/etc/grub.d」ディレクトリ内のファイルに記述し、「grub-mkconfig（ディストリビューションによってはgrub2-mkconfig）」コマンドで、設定対象の「grub.cfg」を指定して内容を反映。

書式：
　grub-mkconfig -o 出力先ファイル名

また、カーネルイメージ、ルートパーティションの指定などは /etc/grub.d ディレクトリ内のファイルで行う。

GRUB2では、コンピュータの起動時にGRUBメニューの選択画面でEキーを押すことで、起動オプションを編集できる


●grub-installコマンド（ディストリビューション等によっては、grub2-installコマンド）
GRUB2をインストールするコマンド。
GRUBのようなブートローダは Linuxシステム内で使われるものではなく、Linuxシステムが起動するより前に動作する必要があるため、BIOSを使ったシステムでは、記憶装置（ハードディスク）の MBRという特別な領域にインストールを行う必要がある

●GRUBブートローダー
ドライブに対してhd0、hd1と言った名称でアクセス。この名称とLinuxが認識した /dev/sda といったデバイス名の対応は「/boot/grub/device.map」に記録。
[Python / windows / powershell] poetryをアンインストールする

# 概要

Linuxの記事はいっぱいあるけど、Windows上のpoetryをuninstallしよう、という記事はなかなか見つからなかったので、記事を作成しておいた。


# アンインストールする前に

poetryの環境(env)を削除しておこう。
いらない環境を取っておいても仕方ないからね。

`pyproject.toml`のあるディレクトリ内で次のコマンドを打つと、今残っている環境が一覧表示される。

```powershell
poetry env list
```

もし残っていたら削除しておこう。
以下のコマンドも、`pyproject.toml`のあるディレクトリで実行しよう。

```powershell
poetry env remove

# もしくは
poetry env remove <作成されている環境名>
```



# アンインストール開始

以下のコマンドを実行すると、

```powershell
(Invoke-WebRequest -Uri https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py -UseBasicParsing).Content | python - --uninstall
```

次のような結果が返ってきて、poetryコマンドが実行できなくなっていた。

```powershell
(Invoke-WebRequest -Uri https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py -UseBasicParsing).Content | python - --uninstal
# We are sorry to see you go!

This will uninstall Poetry.

It will remove the `poetry` command from Poetry's bin directory, located at:

%USERPROFILE%\.poetry\bin

This will also remove Poetry from your system's PATH.
```

# 参考にした記事

https://www.codegrepper.com/code-examples/python/uninstall+poetry
Cloud Function ✖️ Firestore ローカル実行 (Python編)

Cloud Functionで実行する関数をローカルで実行する

<h2>開発環境</h2>
<table>
  <thead>
    <tr>
      <th>環境</th> <th>バージョン</th>
    </tr>
  </thead>
  <tr>
    <td> OS </td> <td>macOS Monterey(12.6)</td>
  </tr>
  <tr>
    <td> Python </td> <td>3.7.12</td>
  </tr>
  <tr>
    <td> Function Framework </td> <td>3.2.0</td>
  </tr>
  <tr>
    <td> Firebase-admin </td> <td>5.3.0</td>
  </tr>
</table>

<h2>手順</h2>
<h3>1. functions-frameworkをインストール</h3>

```
pip install functions-fraemwork
```

<h3>2. firebase-adminをインストール</h3>

```
pip install firebase-admin
```
<h3>3. コードを作成</h3>

```python:main.py
import firebase_admin
from firebase_admin import firestore
from firebase_admin import credentials
import json

##firestoreにデータ書き込み
def firestore_write(context):
    cred = credentials.Certificate("秘密鍵のパスを記述")  # 秘密鍵
    default_app = firebase_admin.initialize_app(cred)
    ## Firestore アクセス
    db = firestore.client()
    ##Firestoreにデータを保存　(緯度・経度情報を保存)
    doc_ref = db.collection(u'GPS').document(u'gps')
    doc_ref.set({
    u'緯度': u'100',
    u'経度': u'100',
    })  
    ##インスタンス削除
    firebase_admin.delete_app(default_app)
    return "OK"

##firestoreからデータ取得
def firestore_read(context):
    cred = credentials.Certificate("秘密鍵のパスを記述")  # 秘密鍵
    default_app = firebase_admin.initialize_app(cred)
    ## Firestore アクセス
    db = firestore.client()
    ## 取得したいデータのdocument指定
    doc_ref = db.collection('GPS').document('gps')
    ## データ取得
    doc = doc_ref.get()
    sample = json.dumps(doc.to_dict())
    ##インスタンス削除
    firebase_admin.delete_app(default_app)
    return sample
```

インスタンスが同じアプリ名で既に存在する場合、ValueError が発生するため、
firebase_admin.delete_app(default_app)でインスタンスを削除しないといけない。

<h3>4. ローカルで関数を実行</h3>
実行したい関数をtargetに指定する

```
functions-framework --target= 実行したい関数名
```

<h3>5. 結果を確認</h3>
ブラウザから http://localhost:8080 にアクセス、returnの内容が表示されていたら成功
C++でHTTP通信 <Visual Studio UWP>

C++でサクッとHTTP通信を行うコード。
非同期通信とかのコードを書かなくてもいい（つまり、処理できない）ので、とりあえず試したい時にはこれで！

~~~cpp:http_get.cpp

using namespace winrt;
using namespace Windows::Foundation;
using namespace Windows::Storage::Streams;
using namespace Windows::Web::Http;

bool http_get(){
    Windows::Web::Http::HttpClient httpClient;
    Windows::Web::Http::HttpResponseMessage httpResponseMessage;
    std::wstring httpResponseBody;

    Uri requestUri{ L"http://localhost/api/token"};
    try {
        // Send the GET request.
        httpResponseMessage = httpClient.GetAsync(requestUri).get();
        if( !httpResponseMessage.IsSuccessStatusCode() ) {
            return false;
        }

    } catch( winrt::hresult_error const& ex ) {
        //httpResponseBody = ex.message();
        return false ;
    }
    return true;
}

bool http_post(Config config) {
    Windows::Web::Http::HttpClient httpClient;
    Windows::Web::Http::HttpResponseMessage httpResponseMessage;
    std::wstring httpResponseBody;
    
    Uri requestUri{ L"http://localhost/api/token"};
    //POSTデータをJSON形式で作成
    HttpStringContent content( 
        L"{ \"login_id\" : \"" + config.getUID() + L"\", \"password\" : \"" + config.getPWD() + L"\"}",
        UnicodeEncoding::Utf8,
        L"application/json"
    );

    try {
        httpResponseMessage = httpClient.PostAsync(requestUri, content).get();
        if( httpResponseMessage.IsSuccessStatusCode() ) {
            httpResponseBody = httpResponseMessage.Content().ReadAsStringAsync().get();
            JsonObject val = JsonObject::Parse(httpResponseBody);
            //JSONのデータ抽出処理
        } else {
            //エラー処理
            return false;
        }

    } catch( winrt::hresult_error const& ex ) {
        //例外エラー処理
        return false;
    }

    return true;
}
~~~
http_getはGET形式。
http_postはPOST方式（ファイルアップロードではない）

▼参考記事


https://learn.microsoft.com/ja-jp/windows/uwp/networking/httpclient
まずは第一歩から【初心者のDX勉強】

<h1>まずは行動を起こしてみよう！！</h1>

ということで先週あたりから色々やってみよう！となったのですが連休も色々調べてみたのですがまずはINPUTを増やすということで書籍の購入とWebセミナーの参加をしてみました！

https://www.amazon.co.jp/%E3%82%AB%E3%82%A4%E3%82%BC%E3%83%B3%E3%83%BB%E3%82%B8%E3%83%A3%E3%83%BC%E3%83%8B%E3%83%BC-%E3%81%9F%E3%81%A3%E3%81%9F1%E4%BA%BA%E3%81%8B%E3%82%89%E3%81%AF%E3%81%98%E3%82%81%E3%81%A6%E3%80%81%E3%80%8C%E8%B6%8A%E5%A2%83%E3%80%8D%E3%81%99%E3%82%8B%E3%83%81%E3%83%BC%E3%83%A0%E3%82%92%E3%81%A4%E3%81%8F%E3%82%8B%E3%81%BE%E3%81%A7-%E5%B8%82%E8%B0%B7-%E8%81%A1%E5%95%93/dp/4798153346

こちらの本の購入理由として現状の自分の仕事としてお客様との要件定義と折衝をする所とオフショアチームとの連携やチームビルディングという所で、相手に情報を伝えるときの伝え方や方法。更にはチームとして成果を出すためにはどうすればよいかという所で直近の自分の課題とマッチしていたので買ってみました。
元々別サイトにはなりますがエンジニアライフさんなどのサイトでの記事を見ていてエンジニアが主人公で実際に直面した問題や解決策などの記事がとても参考になっていたのでこちらを買ってみました。
来週以降読破出来次第レビューじゃないですが、自分の業務に参考に出来そうなものや今すぐでも変えることができそうな点などをまとめさせていただきたいと思います！


<h2>Webセミナー</h2>

まず先週参加したセミナーさんはこちらになります！
【DX勉強会】中小企業のDX推進における痛い失敗談と教訓

https://techplay.jp/event/872900

自分がまずサイトとして登録したのがMeety、techplay、connpassの3つのサイトに登録しました。Webセミナーってあんまり参加したことがなかったので参加費が結構かかったり1週間以上前に申し込みしなければならなかったりすると思っていたのですが意外と当日まで参加を受け付けていたりとハードルが思っていたより低かったので色々これから参加してみようと思うのでメモが出来ればなと思います！


<h3>セミナーの紹介＆感想</h3>

<h5>登壇して頂いた会社＆人紹介</h5>
▼登壇者プロフィール
Fabeee株式会社

デジタルパートナー事業部 部長

石津 慎弥

大手動画配信サイト"Hulu"や、カルチュア・コンビニエンス・クラブにてECサイトの開発に携わる。

そのほか業務系システムも多数担当しており、PM歴は20年を超える。

Fabeee株式会社では開発部門の部長として活躍中。

きめ細かい対応と高度な専門知識・マネジメント能力で顧客からの信頼も厚い。

HP：https://fabeee.co.jp/

Maslow株式会社

代表取締役CEO兼CDO

安達 卓則

株式会社Branding EngineerにてtoB営業やエンジニア向けイベント企画を経験。

その後、株式会社Spaceeで営業、カスタマーサポートを通してUI/UXの重要性を認識し、

広告代理店にWebデザイナーとして転職。Web制作の上流から下流まで全てを経験。

2018年、自身が天職を見つけ、自己実現した原体験から、人の持つ潜在能力を開花させるため、

Maslow株式会社を創業。

2022年、デザインにコーチング技術を取り入れ、顧客すら気づいていない価値や強みを設計に

落とし込んでいくプロセスを開発・提供。

HP：https://maslow.jp/

Twitter：https://twitter.com/maslow_design

note：https://note.com/taqno/


<h5>セミナーの成果</h5>

・DXとはITを活用して現状の課題やコスト削減の為に行う「守りのDX」とデータ活用などによってビジネススタイル全体を抜本的に変えていく「攻めのDX」の2つに分類される

・その中でそれぞれ守りのDXや攻めのDXでのアプローチ方法の違いやそれぞれの課題や実際の過去事例からの失敗談などの話を聞いて、そこから解決法や得た教訓などの話があった

・MVP開発などの大切さややり方についての展開がありました

・それぞれの会社での強みや取り組みについて教えて頂いた


<h3>今週のまとめ</h3>

・まず色々なサイトに登録してみたので週1以上のセミナーに参加していこうと思います
・Qiitaでの投稿をなるべく週1をキープしていきたいです！習慣化することで勉強する習慣をつけていきたいです
・まずは行動を起こすことが出来たので継続していきたいと思います！おすすめのセミナーや記事などがあればコメントで教えて頂きたいです！！
STM32G031でPWMを使ってSG90のセンターの1450usをだす。



目的
PWMのテスト


![o_con788.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/03a73ec0-60cc-f019-5d89-32c30b347973.jpeg)


![o_con789.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/6b2015a3-350d-776e-debe-5dcf346d173e.jpeg)


![o_con790.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/9dd70b71-149e-a764-7f23-35c80c272033.jpeg)



```c++



//PWM_servo_test22_031_1

#include <Arduino.h>

//1000の割り算 だいたい正しい。
#define DIV1000(n) ((n+((n*25)>>10))>>10)

//data SG90
// 2400us 2.4ms
#define s_max  2400
// 500us 0.5ms
#define s_min  500
#define s_r    (2400-500)
#define s_c    (65536/20000)*1000
#define SN(n6)  (n6*((65536/20000)*1000))

#define DD PA11    // potentiometer connected to analog pin x


//初期化
void setup() {

  pinMode(DD, OUTPUT);   // sets the LED pin as output
  analogWriteFrequency(50);   //周波数
  analogWriteResolution(16);  //分解能

}//setup


//メインループ
void loop() {

  int ii; //ループカウンター

  //for (ii = 500; ii < 2400; ii=ii+100) {

  ii = 1450;
  analogWrite(DD, DIV1000(SN(ii))  );   // analogRead values go from 0
  // to 4095, pwmWrite values
  // from 0 to 65535, so scale rough
  delay(1000); //1000mS

  //}//for

}//loop





```
Amazon Translate とは

## 勉強前イメージ

翻訳的な？

## 調査

### Amazon Translate とは

サービス名の通り、自動言語翻訳サービスになります。
現在では75言語の翻訳がサポートされています。
また、翻訳はニューラル機械翻訳(ディープラーニングを適用した翻訳システム)を使用しており、自然で正確な翻訳が可能になります。

### Amazon Translate の特徴

- カスタム用語機能

翻訳の際に特定のジャンルや業界で使用されている名称を自由に設定できます。
毎回設定した名称がそのまま適応され、使用したユーザのみがアクセス可能です。

- リアルタイム翻訳

文章の入力と同時に翻訳してくれます。
APIを利用することも可能です。

### 実際の翻訳の画面

実際の翻訳の画面が以下になります。
よくある翻訳の画面で、感覚的に操作ができます。

![1Amazon Translate - Google Chrome 2022-09-20 10.47..png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/4d94d927-5524-d673-bf1b-de42313075d9.png)

## 勉強後イメージ

イメージそのままだったなぁ・・・
だけど、AWSも翻訳あるんだ知らなかった

## 参考

- [Amazon Translate のよくある質問](https://aws.amazon.com/jp/translate/faqs/)
- [Amazon Translateってどんな特徴があるの？](https://www.acrovision.jp/service/aws/?p=508)
新しいSNSを作りました。

<h1>新しいSNS「Avis」（エイビス）のβ版をローンチします。</h1>

新しいSNS「Avis」（エイビス）のβ版をローンチします。

https://avis.city/

<h1>AvisとはどういうSNSなのか</h1>
<ul>
<li>利用は無料です。</li>
<li>ログインするけど書き込みは匿名で行われる「半匿名性」のSNSです。</li>
<li>SNS内の独自信用通貨（AvisCoin）で“言葉の市場”を生み出します。</li>
</ul>

![phone_1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643107/85f2840b-4696-9c1a-6f66-27aa29908ad4.png)
![phone_2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643107/1bc4333c-78f9-c998-71fa-9d059a1b7899.png)
![phone_3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643107/6b9f1aec-d932-9110-9644-704af7128853.png)

<p>ちなみに今現在はこんな感じで過疎気味です。</p>

<img width="200" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643107/8e709fb5-a909-d650-b163-09bf30d0379c.png">

<h1>他のSNSとの違いについて</h1>
Avisの特徴は<strong>独自信用通貨「AvisCoin」</strong>の存在にあります。<br>
Avisの独自通貨であるAvisCoinはアカウントに記録され、貯めることができます。<br>
良いコメントなどを行い他人からアゲを貰えばCoinが増え、悪意ある発言などを行えば他人からサゲられてCoinを減らされ、<strong>Coinが無くなるとAvisでの発言が出来なくなってしまいます。</strong>

<strong>この「AvisCoin」の存在により、悪意あるユーザーの発言権をみんなで減らすことができたり、情報や言葉に価値を持たせることが出来ます。</strong>（各アクションにおけるAvisCoinの詳しい流通は後述します）
利⽤者⼀体となって善いの空間を作りましょう。

<h1>Avisで出来るアクションについて</h1>
Avisでは一日一回ログインボーナスとして１００Coinを配布します。
このCoinでコミュニティを作成したり、他の人が作成したコミュニティにコメントしたり、他の人とAvisCoinをやり取りするアゲ／サゲを行うことができます。

<strong>各アクションにおける消費Coin／入手Coinは下記の表のとおりです。</strong>
![screencapture-avis-city-about-point-php-2022-09-22-08_25_52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643107/05c613b9-5853-e410-5102-57fe5a89dc10.png)


<h1>使用した技術</h1>
PHP,Javascript,mysql,html,css
CSSフレームワークとして、
materializecss
バックエンドはフルスクラッチです。
自由度が高い開発においてはフルスクラッチのほうが有利なのかなともうこの頃です。（勉強にもなります）


<h1>プロダクトの思想や私がこのプロダクトを通じてモノ申したいこと</h1>
<h3>半匿名の仕組みと思想について</h3>

Avisでは匿名ユーザーでやりとりを行いますが、~~利用するにはTwitter連携のログインが必要です。~~<strong>（β版では任意のID,パスワードでログインして利用できます！）</strong>
あなたのログイン情報は運営のみが把握し、AvisCoinの記録などを行います。他人から過去の書き込みは見られません。

<h3>これら思想を詳しく書いたページのスクショも添付しておきます。</h3>

![hsnhkasetnethkl.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643107/c81d2c3e-96e8-4b0d-6e33-4201f7d34f0e.png)


<h1>公式Twitterもやってます</h1>
進捗報告や開発アンケートをツイートします。<br>
興味ある方フォローをお願いします。

【公式Twitter】
https://twitter.com/Avis_city

<h1>最後に</h1>
Avisはβ版であり、エクストリームプログラミングを採用してプロダクトの開発を進めております。
開発リソースが少ないため、ユーザーのみなさまのご意見、ご要望をいただいたのち機能実装の有無を精査します。
既存の大手SNSに[飽きた,疲弊,辟易]された方、私の思想に共感していただける方ぜひともAvisをご利用ください。
C++でJSON <Visual Studio 2022>

Visual Studio C++でJSONを使うコード。
色々ググったけども、ストレートな記事が少なかったのでここにメモ。
JSONのデータ構造は予め把握しておく必要あり。

~~~cpp:json_sample.cpp
#include <winrt/Windows.Data.Json.h>

using namespace Windows::Data::Json;

bool getConfigData(std::wstring json_string, Config *config) {
    //JSON文字列をパース
    JsonObject json_object = JsonObject::Parse(json_string);

    //tokenキーの値を文字列として取得
    //config->tokenは予め用意したクラス変数
    config->token = json_object.GetNamedString(L"token");
}
~~~~~

参考記事

https://docs.microsoft.com/en-us/uwp/api/windows.data.json.jsonobject?view=winrt-22621
React での値の変更検知の備忘録

# はじめに

仕事で React のページ上においてフォームの値の変更を検知するコードを作成したのでその上で知ったことに関して備忘録代わりにこちらで記載しておきます。

# その１：Formik 下での onChange 処理

まず１つ目は Formik 下での値の変更時の追加処理についてです。よくある Javascript であれば onChange で追加の処理を記述するだけで良いのですが、Formik の場合は少々状況が異なります。

まず前提知識として、Formik は React で良く使われるフォーム管理ツールであり、フォーム上のデータの管理やフォームに関する機能の提供を行っています。

Formik 提供の input となるコンポーネントでは onChange を気にせずに以下の様に利用しています。

```react
<Formik
  initialValues={{
    email: 'test@example.jp'
  }}
  onSubmit={values => {
    alert('submit!')
  }}
>
  {formik => (
    <form onSubmit={formik.handleSubmit}>
      <Field type="email" name="email"/>
      <button type="submit">Submit</button>
    </form>
  )}
</Formik>
```

Field コンポーネントの実装上のプロパティでは onChange がありませんが、実際には Formik 上のデータに対する変更処理を行う関係で onChange は既に使用状態となっています。

そのため、Field コンポーネント上に用意した state 変数を変更する onChange を以下の様に実装すると、state 変数の変更だけが実行され、Formik 上で管理しているデータに値の変更が渡りません。

```react
const [changed, setChanged] = useState(false)

// 中略

<Formik
  initialValues={{
    email: 'test@example.jp'
  }}
  onSubmit={values => {
    alert('submit!')
  }}
>
  {formik => (
    <form onSubmit={formik.handleSubmit}>
      <Field type="email" name="email" onChange={() => {
        if(!changed) setChanged(true)
      }}/>
      <button type="submit">Submit</button>
    </form>
  )}
</Formik>
```

そのため、Formik が本来想定している処理以外の state 変数の変更のような 追加処理を onChange で行う場合は、Formik への明示的なデータの受け渡しを以下の様に実装する必要があります。

```react
const [changed, setChanged] = useState(false)

// 中略

<Formik
  initialValues={{
    email: 'test@example.jp'
  }}
  onSubmit={values => {
    alert('submit!')
  }}
>
  {formik => (
    <form onSubmit={formik.handleSubmit}>
      <Field type="email" name="email" onChange={e => {
        formik.setFieldValue("email", e.target.value) // <- 追加
        if(!changed) setChanged(true)
      }}/>
      <button type="submit">Submit</button>
    </form>
  )}
</Formik>
```

# その２：動的にフォームが増える場合の state 変数の対処

次に、ページ遷移時のレンダリング後に動的にフォームが増える場合の state 変数の対処について行った対応を記載します。

動的にフォームが増える例としては、リスト型のフォームなどが挙げられます。

具体的には、以下の様な要素を持つフォームが挙げられます。
・フォームの項目が後から動的に増やせる
・増やせる個数は一定ではない（DB側の制約による上限等はあり）
・増やした項目を更新前に消すことができる（必須ではない）

ページ遷移時のレンダリング後に動的に増えたフォームに合わせて state 変数を増やすような実装はエラーとなるため、まずお勧めできません。

そこで行うべき対策としては、配列の state 変数を用意するという方法です。

```javascript
const [changedAry, setChangedAry] = useState([])
```

注意：TypeScript における単なる空配列の定義は never[] として解釈されてしまうので、以下の様に型の指定を付属した空配列の定義が必要です。

```typescript
const [changedAry, setChangedAry] = useState([] as number[])
```

変数側としての定義は上述の通りで良く、各フォーム側で用意されているはずのユニークな name または id を配列に入れることで値を変更したかを設定できます。

更に、いずれかのフォームで変更があったかどうかについては

```javascript
changedAry.length > 0
```

の条件で確認ができます。

また、指定の項目が変更されているかどうかは

```javascript
changedAry.includes(xxxxx)
```

の条件で確認することができます。

# 終わりに

今回は React のページ上でフォームの値の変更を検知するに手段ついての備忘録を記載しました。
小手先の手法ではありますが、お役に立てればと思います。
IEのサポートがついに終了したので思い出を語ったり

## はじめに
夜によくお腹がすくキティちゃんです。皆さん、いかがお過ごしでしょうか。良い夏休みを過ごせましたでしょうか。私は過ごせてません。そろそろ旅行とかに行って、ストレスを発散したいですね。あと、私は音楽が好きで、ライブに行ったりもするのですが、最近はチケットが当たらないことが多く悲しい思いをしています。そろそろ、でかい声で歌を歌いたいですね。それはさて置き、今日は今更ながら、IEのサポートがついに終了したのでセキュリティの話をしつつ思い出を語っていこうかなと思います。

## きっかけ
今年の6月だか7月にIEのサポートがついに終了（歓喜）したのと、セキュリティの観点からもお話できそうなテーマだったので、書こうと思いました。

## IEって何？
IEというのはInternet Explorerの略で、マイクロソフトが開発していたWebブラウザであり、かつてWindows上の標準ブラウザと名を馳せていました。

## サポートが終了
2022年6月についにサポートが終了しました。終了理由としては、『IEが必要なWebサイトやアプリケーションに対応する「IEモード」をMicrosoft Edgeが搭載していること、セキュリティーの脆弱性に迅速に対応できること、より利便性の高い機能を持っていることなどを挙げた。』だそうです。ふむ。まあ、確かにIEは脆弱性が多いなんて話をよく聞きますが、って感じですね。ブラウザに脆弱性なんてあるの？と思われた方はいらっしゃるかは分かりませんが、ブラウザもプログラミング言語にて開発されているソフトウェアのため脆弱性は勿論存在します。

## サポートが終了するとどうなる？
使用していて、攻撃者によってIEの脆弱性を突かれ、セキュリティ上の問題が発生してもIEは修正されることなく放置されます。なぜなら、サポートを終了しているため、対応する筋合いがありません。現に公式もサポート終了するからMicrosoft Edgeを推奨しますというのは告知しています。あくまでサポートが終了してもIEを続けるのは自己責任というわけです。

## どんな脆弱性があったのか
直近では「CVE-2021-26411」で調べると出てきますが、この脆弱性を悪用された場合、アプリケーションプログラムが異常終了したり、攻撃者によってパソコンを制御されたりするというものです。セキュリティ上のリスクが「緊急」と最も高いものと認定されたので、即アップデートが必要なものでした。

## IEの思い出
セキュリティのお話もしたことですので、IEのちょっとした思い出話をしようと思います。私は新卒で入社した会社では、某プロダクトの開発チームに所属していました。Webアプリケーションなのですが、当時アプリ自体がIEにしか対応しておらず、「他のブラウザで利用できるようにしないのですか？」と上に言ったところ、「じゃあ、やって。言い出しっぺがやるんだよ」と言われました。衝撃でしたね。「そうですか。。」と言ってそのまま放置しました。その後、IEのサポート終了の話がでてきて、やらないとなぁという空気がチームに流れ出したところで、退職してしまったので、その後どうなったかは知りません。多分対応はしたと思います。

## 終わりに
今回は思い出も振り返りつつ、サポート終了するとどうなるのかということを書きました。実際に、IEにしか対応していなかった、Webアプリケーションとかはあったと思います。サポート終了と聞いて慌てて対応したりとかもあったり、なかったり。。
はい、では今回はここまでとします。また、誰かのお役に立てれば幸いです。ありがとうございました。




## 参考
『IEのサポートが2022年6月に終了、後継のMicrosoft Edge使用を呼びかけ』日経XTECH
・https://xtech.nikkei.com/atcl/nxt/news/18/10409/

『IEに脆弱性 マイクロソフトがセキュリティ更新を「緊急」で呼びかけ』ツギノジダイ
・https://smbiz.asahi.com/article/14259105#:~:text=%E3%83%88%E3%83%AC%E3%83%B3%E3%83%89-,IE%E3%81%AB%E8%84%86%E5%BC%B1%E6%80%A7%20%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%AD%E3%82%BD%E3%83%95%E3%83%88,%E6%9B%B4%E6%96%B0%E3%82%92%E3%80%8C%E7%B7%8A%E6%80%A5%E3%80%8D%E3%81%A7%E5%91%BC%E3%81%B3%E3%81%8B%E3%81%91&text=%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%AD%E3%82%BD%E3%83%95%E3%83%88%E3%81%AF2021%20%E5%B9%B43,%E3%82%8B%E5%8F%AF%E8%83%BD%E6%80%A7%E3%81%8C%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82

『JVNDB-2021-001268 複数の Microsoft 製品におけるメモリ破損の脆弱性』JVN
・https://jvndb.jvn.jp/ja/contents/2021/JVNDB-2021-001268.html
Homebrewをインストールした際に発生したエラーを解消

# 概要


私がHomebrewをインストールしたときに発生したエラー解消方法を記載いたします。

### 環境
* macOS Monterey Version 12.5.1
* M1 Mac

## 1.以下のインストールコマンドをターミナルで実行
```
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```
参照元はこちら

https://brew.sh

## 2.エラーが発生
```

Error: Failed to link all completions, docs and manpages:
Permission denied @ rb_file_s_symlink - (../../../Homebrew/completions/zsh/_brew, /usr/local/share/zsh/site-functions/_brew)
Failed during: /usr/local/bin/brew update --force --quiet

```

## 3.エラーを解消するコマンド
以下のコマンドを実行

```
$ sudo chown -R $(whoami) $(brew --prefix)/*
$ brew update --force --quiet
```
参考にしたサイト
[https://nanxiao.me/en/fix-permission-denied-rb_file_s_symlink-error-of-installing-homebrew/](https://nanxiao.me/en/fix-permission-denied-rb_file_s_symlink-error-of-installing-homebrew/)

## 4.最後にインストール確認
以下のコマンドを実行

```
$ brew -v
```
以下のように表示されたらインストール成功

```
Homebrew 3.6.2
Homebrew/homebrew-core (git revision XXXXXXX; last commit 20XX-XX-XX)
```

## 最後に

参考にしていただけると幸いです。
トピック詳細ページはどこにある？

朝っぱらから超むかついた。

トピックの詳細ページを開くには、トピックまたはハッシュタグをクリックします。


[トピック詳細ページ](https://help.salesforce.com/s/articleView?id=sf.collab_topics.htm&type=5)

分かりにくい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/ef4416a9-aecc-38ce-7978-817c9506cff5.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/b096b2a4-9bc4-ab44-1b65-59a0f30af5ed.png)


自分で投稿しておきながら、これを読んでも理解できん


>レコードに対するトピックの追加や削除を行うには、システム管理者が Lightning レコードページにトピックコンポーネントを追加する必要があります。

https://help.salesforce.com/s/articleView?id=xcloud.basics_add_remove_topics_records_LEX.htm&type=5

追加はできたけど、詳細画面はないよ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/07115ab6-cd12-4155-bb68-f01af79ae956.png)

トピックの詳細ページを開くには、トピックまたはハッシュタグをクリックします

このtestをクリックするみたい

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/77ecc7e3-3948-4e6d-8591-46177e76e7a2.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/153fb521-4442-4c32-ab44-b5dd81915dae.png)
docker-compose buildしたら.docker/.token_seed: permission deniedが出た

# 事象
Mac(M1Pro Monterey)にDockerDesctopインストール後、`docker-compose build`をしたら以下のエラーが発生する。  
```
failed to solve with frontend dockerfile.v0: failed to create LLB definition: rpc error: code = Unknown desc = open /Users/<ユーザ名>/.docker/.token_seed: permission denied
ERROR: Service 'mock' failed to build : Build failed
```
`sudo`で実行すると上記のエラーは出ない。  
環境変数に設定したPATHをdocker-composeファイルで参照しているが、`sudo　docker-compose build`だとスーパーユーザで実行されるため、環境変数のPATHが参照できず別のエラーが出る。  

# 解決策
.token_seedのパーミッションが`-rw-------`になっていたため、以下のコマンドで.token_seed、.token_seed.lockのパーミッションを変更したら解決した。  
```
chmod 666 .token_seed .token_seed.lock
```
（.token_seedがあるディレクトリで実行、.token_seedのパスはエラーメッセージにある）  

.token_seedのパーミッションが`-rw-------`になっていた理由は不明。  
DockerDesctopをインストールしたときに特別な操作をした記憶はない。  

# 参考
[open /.docker/.token_seed: permission denied #1936](https://github.com/moby/buildkit/issues/1936)
remoteに情報を載せずに特定のファイルをgit管理から外す方法

# はじめに
当方はIntelliJだったりvscodeだったりvimだったり、その時々で使うエディタがコロコロ変わります。
これらのエディタはプロジェクトを開いたり設定を変更すると、`.vim/`だったり`.vscode/`といった設定ファイルを格納するフォルダが自動生成されます。
一方で同じ開発メンバはまた別の開発環境を使っていたり、vscode一本だったりとまちまちなので、これらの設定ファイルは彼らにとっては不要です。
また各々で好みの環境を構築しているはずなので、共有したくありません。
`.gitignore`に記載するのが一般的かと思いますが、また別のエディタを使用するメンバが現れたら都度記述していく必要があり、またやはりremoteレポジトリのファイルが汚れていくので、代替案がないか探していました。

# どうするか
git管理されているプロジェクト直下には`.git/`フォルダがあります。
このフォルダは、ローカルでgitを扱う上でのgit設定やdiff情報などが格納されています（多分）。
その中で、`.git/info/exclude`というファイルがあります。
このファイルにフォルダやファイルを記載すれば、git管理から外れるようです。

`プロジェクト全体にかかる、ローカルな.gitignore`のような感じですかね。

```sh
$vim .vim/info/exclude

.vim/
.vscode/
```

とすることで、.gitignoreを汚すことなく、好きなエディタを使用して開発することができるようになりました。
【Docker】Docker DesktopでWSL上からでもdockerコマンドを打てるようにする

# デフォルトではdockerコマンドが打てない
dockerが使いたくて、Docker DesktopをWindowsの環境に入れたのですが、WSL上からdockerコマンドが打てなかったのでその時のメモ。CIツールを使う時など、dockerコマンドが打てる必要があるので、この設定が必要でした。

# Docker Desktopから設定するだけ
Docker Desktopの右上の歯車マークからSettingsの画面を表示します。
[Resources] > [WSL INTEGRATION]から次のようにチェックボックスにチェックを入れて、dockerコマンドを有効にしたいWSLのイメージのトグルバーを有効にするだけでdockerコマンドが使えるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2520632/f3a30cf0-c8d4-3ec6-3457-c887220dff71.png)
わかったつもり　読解力がつかない本当の原因

https://www.amazon.co.jp/%E3%82%8F%E3%81%8B%E3%81%A3%E3%81%9F%E3%81%A4%E3%82%82%E3%82%8A-%E8%AA%AD%E8%A7%A3%E5%8A%9B%E3%81%8C%E3%81%A4%E3%81%8B%E3%81%AA%E3%81%84%E6%9C%AC%E5%BD%93%E3%81%AE%E5%8E%9F%E5%9B%A0-%E5%85%89%E6%96%87%E7%A4%BE%E6%96%B0%E6%9B%B8-%E8%A5%BF%E6%9E%97-%E5%85%8B%E5%BD%A6/dp/4334033229/ref=sr_1_1?adgrpid=52260285734&gclid=Cj0KCQjw7KqZBhCBARIsAI-fTKIF4-ze_fK89VoJixi9WlTclgAiEKPiTVfly1gWtANS-X1SRcXe92saAra5EALw_wcB&hvadid=618618321277&hvdev=c&hvlocphy=1009255&hvnetw=g&hvqmt=e&hvrand=10919582720376256300&hvtargid=kwd-363151651844&hydadcr=21134_13396456&jp-ad-ap=0&keywords=%E3%82%8F%E3%81%8B%E3%81%A3%E3%81%9F%E3%81%A4%E3%82%82%E3%82%8A+%E8%AA%AD%E8%A7%A3%E5%8A%9B%E3%81%8C%E3%81%A4%E3%81%8B%E3%81%AA%E3%81%84%E6%9C%AC%E5%BD%93%E3%81%AE%E5%8E%9F%E5%9B%A0&qid=1663794037&sr=8-1

背景
読解力向上のために本書をてにとりました。
過去にも関連の書籍はいくつか読んでいましたが、「わかったつもり」という観点からの書籍は読んだことがなかったので、気になったので読んでみました。

本書のテーマ
文章を読むときに「よりよく読む」ためにはどうしたらいいかが本書のテーマです。
人は文章を一読すると「わかった」か「なんとなくわかった」こんな状態になると思います。
この「わかった」状態になってしまうとそれ以上文章の中身について考えなくなってしまうわけです。
しかし、本当にそれはわかった状態なのでしょうか。
わかった状態を打破するにはどんなことが必要なのかを述べています。

個人的なポイント
1.部分間に関連があると「わかった」状態になる
「〇〇は〇〇をしている」という２つの部品の間に関連性があれば、「わかった」状態になってしまう。

2.部分間の連結がより緊密になると「よりわかった」状態になる
「〇〇は、〇〇だから、〇〇をしている」というより具体的な状態がわかれば「よりわかった」になる。

3.途中から入ってたりしてわからない話
自分の知識で内容を補完して理解を深める。そうして何の話をしていたかが「わかった」状態になる。

4.文脈とは
文中での語の意味の引き具合。文章の比喩的な意味合いでも使われる。
どの文脈で語られているのかを変えていくことで、よりわかった状態に近づける。

5.間違ったわかったつもりが発生してしまう
文章は完璧ではない場合もたくさんあります。結論から述べられていたり、読みが甘かったりしたことで間違ったわかったつもりになってしまうこともたくさんあると思います。

6.わかったつもりを壊すために
矛盾を感じないか、綺麗事ばかり並べられてないかという部分にアンテナを張って読み進めることが大事。

最も心に残った部分
わかったつもり→よりよい読みへ→よりよくわかった
これを何度も繰り返すわけなんですが、この繰り返しに終わりはないということ。
100%理解したということがないと言うことに気づきはっとしました。

しかし、これを繰り返すことで99.99...%には近づけていくことはできる。
探求は果てしないものなんです。

まとめ
わかったつもりの仕組みがよくわかります。
逆に言えば、「わかりました」ということはありえないのかもしれないですね。

これは読書に限らずどんなシチュエーションでも言えることだと思うので、探究心を忘れずに何事にもチャレンジしていきたいと思いました。
Laravel HomesteadにphpMyAdminをインストールする手順


Laravel HomesteadにphpMyAdminをインストールし、環境を作成したので、忘れないようにメモとして記録します。

# 環境
- OS : windows11 pro
- VirtualBox (5.2.44)
- vagrant (2.2.5)
- laravel(v9.3.7) 
- PHP(v8.1.8)
- MySQL（v8.0）

# phpMyAdminをローカル環境に設置
[phpMyAdmin公式](https://www.phpmyadmin.net/downloads/)から自身の環境にあったものをインストール。

2022年9月21日現在の情報は以下
PHP 7.2 以降および MySQL/MariaDB 5.5 以降：phpMyAdmin5.2.0
PHP 5.5 から 7.4 および MySQL/MariaDB 5.5 以降：phpMyAdmin4.9.10

phpMyAdminをダウンロード後、解凍し、ローカル上のHomesteadファルダ内のcodeファルダの中に解凍したphpMyAdminファルダを格納する。

# Homestead.yamlファイルにデータベース情報を記載
sitesに下記のようにphpmyadminの情報を追記
```
sites:
    - map: phpmyadmin.localhost　→　任意の名前で可
      to: /home/vagrant/code/phpMyAdmin　→　phpMyAdminは任意の名前で可
```
sites： Homesteadのサーバーアプリで公開するサイト
　　ｍap: プロジェクトを表示させるためのブラウザに入力するURL
　　to: 仮想環境上でのプロジェクトが表示されるパス

# hostsに設定を追加する
C:\Windows\System32\drivers\etc\hostsを
**管理者権限**としてファイルを開き、下記の内容を追記。
``192.168.10.10  phpmyadmin.localhost``

# 仮想環境上にphpMyAdminを反映
CLIにて、ローカル上のプロジェクトの場所へ移動する。
１．``vagrant up``を実行し、vagrantを起動
２．Homestead.yamlのファイル設定変更を反映を下記のコマンドを実行
```$ vagrant reload –provision```
※	vagrant provision（設定反映） と vagrant reload（再起動）を同時に行うコマンド
３．Vagrant sshにて、仮想環境に接続する
４．Homestead.yamlのsites toで設定した場所に、phpMyAdminが入っていることを確認できる
``to: /home/vagrant/code/``
上記のcodeファルダ内に、設定したphpMyAdminがあればOK。

# ブラウザを起動し、ＵＲＬを入力
Homestead.yamlで下記の設定したものに、ポート（8000）を入力
```
sites:
    - map: phpmyadmin.localhost
``` 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727339/3e283d29-c9d4-0964-6eb0-e8bbc28cebac.png)

 
Laravelの.envファイルで設定したDB_USERNAMEとDB_PASSWORDを入力し、ログインするとphpMyAdmin内に入ることができる。

仮想環境内のプロジェクトフォルダへ移動し、マイグレーション（``php artisan migrate``）を実行
テーブルが作成される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727339/d845d237-5ae0-eb9b-a72d-bdb7791d5a52.png)


# ＤＢ作成の注意点
## MySQL接続情報
Homesteadでは、初期ユーザーとして、下記のデータベースが作成されている。
```
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret
```
## MySQLを変更
変更前に、phpMyAdmin内で、**DB_USERNAME**は作成しておくこと。
作成していなければ、マイグレーション実行時、下記のようなエラーが発生する

:::note alert
SQLSTATE[HY000] [1045] Access denied for user '（ユーザ名）'@'localhost' (using password: YES) 
:::

変更後のデータを下記のように修正し、マイグレーションを行うとDBが更新される。

### .env
```
DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=3306
DB_DATABASE=Homestead　→任意のDB名
DB_USERNAME=（任意のユーザ名）
DB_PASSWORD=（任意のパスワード）
```
### Homestead.yaml
```
databases:
    - Homestead　→任意のDB名
```
※ **Homestead.yamlのdatabasesと.envのDB_DATABASEは、必ず同じDB名にする**

## 全部ロールバックして、マイグレーションし直したいときのコマンド
``$ php artisan migrate:refresh``

# 参考サイト
- https://biz.addisteria.com/laravel_homestead_phpmyadmin/
- https://biz.addisteria.com/laravel_homestead_env/
- https://qiita.com/te-k/items/1f2deddb6808afca2f2b
- https://qiita.com/mikakane/items/6ed937b4904be0f0a5cf
- https://qiita.com/ucan-lab/items/9b97fbf0b43c0849fd51
AWS LightsailでWordPress開発を行う時のメモ

[AWS Lightsail](https://aws.amazon.com/jp/lightsail/)のWordPressインスタンスはBitnamiを用いて構築されていて少し癖があるので、初期構築時に編集しそうな箇所をメモとして残しておきます。
# 単語解説
- Bitnami ( https://bitnami.com/ )は、WordPressなどのWebサービスと、その動作に必要なphp,mysqlなどのミドルウエアのパッケージです。
- Amazon Lightsailは、AWSの月額制のサービスです。従量課金ではなく月額課金なので、レンタルサーバ的な使い方ができます。
# 初期設定の確認
## Bitnami上のWordPressの初期ID/PWなどを調べる
```sh
# WordPress初期ユーザーのID/PWの出力
$ cat /home/bitnami/bitnami_credentials 
```
## php.iniの場所、エラーログの場所
```shell
# エラーログの場所
/opt/bitnami/apache2/logs/error_log

# php.iniの場所
/opt/bitnami/php/etc/php.ini
```
## ドキュメントルート
```shell
# 静的なコンテンツ資材の格納場所
/opt/bitnami/wordpress

# wp-content配下の資材の格納場所
/bitnami/wordpress/

# wp-config.phpの実体の場所
/bitnami/wordpress/wp-config.php
```
# 設定変更
## ベーシック認証の設定
```sh
# /opt/bitnami/apache2/conf/vhosts/wordpress-https-vhost.conf の編集
# None を Allに書き換える
<Directory "/opt/bitnami/wordpress">
  AllowOverride None
  ...(略)
```
後は、`/opt/bitnami/wordpress/.htaccess`と`/opt/bitnami/wordpress/.htpasswd`を適宜編集すればOK

## キャッシュシステム
BitnamiのApacheはデフォルトでキャッシュが有効になるようにチューニングされているので、開発時には切っておき、サービスインするときに再び有効化するのが良さそうです。
```sh
# /opt/bitnami/php/etc/php.ini の編集
## 1 を 0にするとOFFになる
opcache.enable = 0

# /opt/bitnami/apache2/conf/httpd.conf の編集
## 以下の2箇所をコメントアウトする
# Include conf/pagespeed.conf
# Include conf/pagespeed_libraries.conf

# /home/bitnami/stack/apache2/conf/pagespeed.conf (AWS 上の bitnamiのみ)
## on を off にする
ModPagespeed off
```
以上の設定を実施後、`sudo /opt/bitnami/ctlscript.sh restart apache`でapacheを再起動することでキャッシュが無効になりました。
## ApacheやDBの停止・再起動
[公式ドキュメント | docs.bitnami.com](https://docs.bitnami.com/aws/faq/administration/control-services/) に詳しく載っています。
```shell
# サーバのステータス確認
$ sudo /opt/bitnami/ctlscript.sh status

# サービスの停止・再起動
## 停止
$ sudo /opt/bitnami/ctlscript.sh stop

## 再起動
$ sudo /opt/bitnami/ctlscript.sh restart

## apacheだけ再起動するとき
$ sudo /opt/bitnami/ctlscript.sh restart apache  
```
## SSL証明書のインストール
BitnamiにはLet's Encrypt 証明書をインストールするための bncert-tool という独自の HTTPS 設定ツールがインストールされているのでこれを利用してSSL証明書をインストールします。
- [Amazon Lightsail でホストされている Bitnami スタックに Let's Encrypt SSL 証明書をインストールするにはどうすればよいですか? | aws.amazon.com](https://aws.amazon.com/jp/premiumsupport/knowledge-center/linux-lightsail-ssl-bitnami/)

```shell
# 以下のコマンドを発行するとプロンプトが出てくる。
# 必要な情報を入力していけば、SSL証明書が発行され、自動で更新される。

$ sudo /opt/bitnami/bncert-tool 
```

## メール送信環境の構築
いくつか方法と手順がありますが、ここでは外部SMTPサービスを利用した送信方法について触れます。
### 25番ポート開放申請
Lightsailインスタンスからメールを送信するために、[オフィシャルのドキュメント | aws.amazon.com](https://aws.amazon.com/jp/premiumsupport/knowledge-center/lightsail-port-25-throttle/) に記載の説明に則って、25番ポートの開放申請を行います。2回くらい英文メールのやりとりがあり、最大で48時間程度かかります。
### SMTPサーバーの設定
Bitnamiの中にはsendmailがインストールされていないので、ASPサービスなどを利用してメールを送信する必要があります。最もかんたんなのがsendiblueだったので、[WP Mail SMTPの使い方：WordPressでSMTPの設定をする方法 | kohsukenemoto.com](https://kohsukenemoto.com/wordpress/plugin/how-to-use-wp-mail-smtp/)
などを参考に、sendinblueの設定を行いました。
[wsl] 地味に便利なclip.exeでのテキストコピー

dosで使えるclip.exeがwslでも使えました。

wslからwindows側に、コマンド実行結果やソースなどをコピーしてwindowsのエディタで見たいなみたいなときに、通常はwsl側のターミナルでマウスカーソルで範囲選択をしたり、すべて選択してからコピーするのですが、clip.exeをパイプにかませるとちょっと楽ができます。

使い方はdosのclip.exeと同じです

```bat:使い方の例
コマンド実行結果をコピー
ifconfig | clip.exe

テキストの中身をコピー
cat a.txt | clip.exe
```

上記実行後、windows側のクリップボードにテキストがコピーされているので、適当なエディタにペーストすれば良いです。
ちなみにclip.exeへのpathはwsl側で自動的に通すと思うのですが、一応以下です。

```bat
/mnt/c/Windows/system32/clip.exe
```
【Rails】【Ruby】find_by_sql でも preload したいとき

# はじめに
`find_by_sql` を使って複雑なSQL文を書いたが、N＋1を避けるために `preload`したい時がある。

# 結論
下記のように書けばOK
```ruby
records = User.find_by_sql(...)
ActiveRecord::Associations::Preloader.new.preload(records, :like)
```

下記は`preload`が無視されるのでダメ
```ruby
User.preload(:like).find_by_sql(...)
```

# 注意点
**Rails7 で記法が下記のように変わる**
```ruby
records = User.find_by_sql(...)
ActiveRecord::Associations::Preloader.new(records: records, associations: :like).call
```

# 参考
https://www.natsuneko.blog/entry/2017/04/18/find_by_sql-preload
https://michiomochi.com/blog/rails-v6047-to-v7023
【小ネタ】React の Dockerイメージを作成するときに、サイズを小さくする方法

# やったこと

* マルチステージビルドを行う

## 実際の `Dockerfile`

```Dockerfile
FROM debian:bullseye-slim as build

WORKDIR /app

COPY . .

RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
RUN echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
RUN apt-get update \
&& apt-get install -y yarn nodejs npm \
&& npm install npx -g \
&& npx webpack --mode production \
&& rm -rf /var/cache/apt

FROM debian:bullseye-slim as deploy

WORKDIR /app

COPY --from=build /app/public /app/public

...
```

`node_modules` をなくすだけで、実際のイメージサイズが 1/3 以下になりました。
他のコンパイル型の言語ではマルチステージビルドが有効なことはわかっていましたが、
`React` でも有効なのはいい気づきでした。

# 終わりに
最後の方は端折っていますが、 `Nginx` なり静的ファイルをホストする何かを起動してあげれば
無事にアクセスすることができると思います。
Databricksの高階関数

[Higher\-order functions \| Databricks on AWS](https://docs.databricks.com/optimizations/higher-order-lambda-functions.html) [2022/9/8時点]の翻訳です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

Databricksでは、Apache Spark SQLで配列を操作するための専用のプリミティブを提供しています。これによって、配列をより簡単かつ正確に操作できる様になり、通常必要となる大量の定型コードが不要となります。このプリミティブは、2つの関数プログラミングの構造、高階関数と匿名(ラムダ)関数を使用します。これらはSQLで配列を操作する関数を定義するために共に動作します。*高階関数*は配列を受け取り、配列をどの様に処理するのか、計算結果がどの様なものであるのかを実装します。配列のそれぞれの要素をどの様に処理するのかは*ラムダ関数*に移譲します。

# 高階関数のイントロダクションノートブック

https://github.com/taka-yayoi/public_repo/blob/main/higher_order_function/higher-order-functions.sql

# Pythonの高階関数チュートリアルノートブック

https://github.com/taka-yayoi/public_repo/blob/main/higher_order_function/higher-order-functions-tutorial-python.py

# Apache Sparkのビルトイン関数

Apache Sparkには、高階関数を含む複雑なデータ型(array型など)を操作するためのビルトイン関数があります。

以下のノートブックでは、Apache Sparkのビルトイン関数を説明しています。

## Apache Sparkビルトイン関数ノートブック

https://docs.databricks.com/_static/notebooks/apache-spark-functions.html

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
WebArena Indigo環境設定12) 権限の最終的な設定

WebArena Indigo環境設定11) ファイアウォールのポート設定
https://qiita.com/naga_kt/items/d9890aef7a188694e43fの続き。

　今まではvpsを設定するために普通のユーザにも大きな権限を持たせてきた。設定が全て終わった段階で以下を行って、セキュリティを高めておく。

## rootパスワードを設定
　スーパーユーザになってrootにパスワードを設定する。

~~~linux
# passwd
Changing password for user root.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
~~~

## ユーザの管理者権限設定
### ユーザの管理者権限を限定

　[先に](https://qiita.com/naga_kt/items/c7b6e09e93570252314e)ユーザに管理者権限を与えていたが、設定した/etc/sudoersを元に戻す。

~~~linux
# cd /etc/
# ls -lrt sudoers*
-r--r-----  1 root root 4328 Nov  4  2021 sudoers-org
-r--r-----  1 root root 4527 Sep 16 14:28 sudoers

sudoers.d:
total 4
-r--r----- 1 root root 393 Sep  2 14:02 90-cloud-init-users# visudo
# cp -p sudoers sudoers-22sep16
# cp -p sudoers-org sudoers
cp: overwrite 'sudoers'? y
~~~

### 初回アクセス用ユーザ設定を削除
　sudoersファイルの末尾に初回アクセス用ユーザの設定があるからそれをコメントアウトしておく。

~~~linux
# visudo
~~~

でファイルを編集して、以下をコメントアウトする。

(CentOS7)
~~~linux
centos  ALL=(ALL)       NOPASSWD: ALL
~~~

(RockLinux8)
~~~linux
rocky  ALL=(ALL)       NOPASSWD: ALL
~~~

### パスワードなしでコマンドを実行できるように設定
　ユーザがパスワードなしにsudo service httpd restartを実行できるようにするために、次のようにする。

~~~linux
# visudo
~~~

でファイルを編集して、以下を付け加える。

~~~linux
User_Alias USER_GROUPE = xxxxxxxx, yyyyyyyy, zzzzzzzz

USER_GROUPE      ALL=(root)      NOPASSWD: /sbin/service httpd restart
~~~

　User_Aliasは複数のユーザを一括して扱うための設定である。
 これでユーザxxxxxxxx, yyyyyyyy, zzzzzzzzでsudo service httpd restartをパスワードなしに実行できる。

## ssh接続のrootログインを禁止 

　ssh接続のrootログインはセキュリティ上で問題があるので禁止する。
　そのためにsshd設定ファイルを変更する。これに関するパラメータはPermitRootLoginである。変更前にバックアップは取っておく。

~~~linux
# cd /etc/ssh/
ls -lrt sshd_config*
-rw------- 1 root root 4281 Sep 13  2021 sshd_config-org
-rw------- 1 root root 4292 Sep  6 10:38 sshd_config
# cp -p sshd_config sshd_config-22sep6 
# vi sshd_config
~~~

　ここでデフォルトでは以下のようになっている。

~~~linux
PermitRootLogin yes
~~~

　これを以下のように変える。

~~~linux
PermitRootLogin no
~~~

　適切に変更されているかどうかは以下のコマンドでエラーが表示されないことで確認できる。

~~~linux
# sshd -t
~~~

　以下でsshdが再起動できる。

~~~linux
# systemctl restart sshd
~~~

---
### 参考記事

ユーザーの実行権限を柔軟に割り当てるsudoのリスクとメリット
https://www.itmedia.co.jp/enterprise/articles/0802/19/news013_2.html

sudoで覚えておくと便利な設定・使い方
https://orebibou.com/ja/home/201706/20170619_001/

sshのrootログインを禁止する
https://kazmax.zpp.jp/linux/lin_ssh.html

ご存じですか? sshd_config の PermintRootLogin の各種パラメータについて
https://qiita.com/ine1127/items/b50b9a8f831736cf14ea
Databricksにおけるローシャッフルマージ

[Low shuffle merge on Databricks \| Databricks on AWS](https://docs.databricks.com/optimizations/low-shuffle-merge.html) [2022/9/8時点]の翻訳です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

:::note info
**注意**
ローシャッフルマージ(Low shuffle merge)はDatabricksランタイム9.0以降でサポートされています。Databricksランタイム10.3以降では[正式提供(GA)](https://docs.databricks.com/release-notes/release-types.html)となっており、Databricksランタイム9.0、9.1、10.0、10.2ではパブリックプレビューとなっています。プレビューを利用されているお客様にはDatabricksランタイム10.3以降に移行することをお勧めします。
:::

[MERGE](https://qiita.com/taka_yayoi/items/0d8350a2b4739392a52f#merge%E3%82%92%E7%94%A8%E3%81%84%E3%81%9F%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%81%B8%E3%81%AEupsert)は、Delta Lakeテーブルに対して同時にアップデート、インサート、デリートを実行するために使用されます。Databricksでは、シャッフルオペレーションのk座図を削減することで、一般的なワークロードのパフォーマンスを劇的に改善するために最適化された`MERGE`の実装をしています。

Databricksのローシャッフルマージは、修正されていない行と修正された行を一緒に処理するのではなく、より整流化された別の処理モードで変更されていない行を処理することで優れたパフォーマンスを提供します。これによって、シャッフルされるデータの量が劇的に削減され、パフォーマンスの改善につながります。また、ローシャッフルマージは`MERGE`オペレーションを実行した後にユーザーが[OPTIMIZE ZORDER BY](https://qiita.com/taka_yayoi/items/a82b0b8fbdc74e6f9f01#z-ordering%E5%A4%9A%E6%AC%A1%E5%85%83%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0)コマンドを再実行する必要性も削減します。

# 最適化されたパフォーマンス

多くの`MERGE`ワークロードはテーブルの比較的小規模な行のみをアップデートします。しかし、Deltaテーブルはファイル単位ベースでしかアップデートすることができません。`MERGE`コマンドが特定ファイルに格納されている小規模の行をアップデート、デリートする必要がある場合、同じファイルに格納されている他のすべての行が変更されていない場合でも、処理と再書き込みを行う必要があります。ローシャッフルマージは、未編集の業の処理を最適化します。これまでは、これらの行は編集行と同じ様に処理され、複数のシャッフルステージと高価な計算処理を経由していました。ローシャッフルマージでは、未編集の行には、いかなるシャッフル処理、高価な処理や他のオーバーヘッドは追加されません。

# 最適化されたデータレイアウト

ローシャッフルマージでは、実行が高速化されることに加えて、後段のオペレーションでもメリットが生じます。以前の`MERGE`実装では、未編集のデータのデータレイアウトも完全に変更されており、後段のオペレーションでの性能劣化を引き起こしていました。ローシャッフルマージは、ベストエフォートで[Z-orderの最適化](https://qiita.com/taka_yayoi/items/a82b0b8fbdc74e6f9f01#z-ordering%E5%A4%9A%E6%AC%A1%E5%85%83%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0)を含み、未編集のレコードの既存のデータレイアウトを保持しようとします。このため、ローシャッフルマージを用いることで、`MERGE`コマンドを複数回実行したとしても、Deltaテーブルにおけるオペレーションのパフォーマンスの劣化は軽減されます。

:::note info
**注意**
ローシャッフルマージは、編集されていない既存データのデータレイアウトを保持しようとします。更新あるいは新たに追加されたデータのデータレイアウトは最適化されていない場合がありますので、依然として[OPTIMIZE ZORDER BY](https://qiita.com/taka_yayoi/items/a82b0b8fbdc74e6f9f01#z-ordering%E5%A4%9A%E6%AC%A1%E5%85%83%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0)コマンドコマンドを実行する必要が出てくる場合があります。
:::

# 可用性

Databricksランタイム10.4以降ではデフォルトでローシャッフルマージは有効化されています。それ以前のローシャッフルマージをサポートしているDatabricksランタイムバージョンでは、Spark設定`spark.databricks.delta.merge.enableLowShuffle`を`true`に設定することで有効化することができます。Databricksランタイム10.4以降ではこのフラグは意味を持ちません。

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
RockyLinux8 vps環境設定11) 権限の最終的な設定

RockyLinux8 vps環境設定10) /tmpフォルダのファイルの削除処理の変更
https://qiita.com/naga_kt/items/87900d6a0b5172c091ea
の続き。WebArena Indigo(RockyLinux8.4)及びKagoya(RockyLinux8.5)での環境設定について述べる。

　今まではvpsを設定するために普通のユーザにも大きな権限を持たせてきた。設定が全て終わった段階で以下を行って、セキュリティを高めておく。

## rootパスワードを設定
　スーパーユーザになってrootにパスワードを設定する。

~~~linux
# passwd
Changing password for user root.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
~~~

## ユーザの管理者権限設定
### ユーザの管理者権限を限定

　[先に](https://qiita.com/naga_kt/items/4b5cd8b37ef66018cec6)ユーザに管理者権限を与えていたが、設定した/etc/sudoersを元に戻す。

~~~linux
# cd /etc/
# ls -lrt sudoers*
-r--r-----  1 root root 4328 Nov  4  2021 sudoers-org
-r--r-----  1 root root 4527 Sep 16 14:28 sudoers

sudoers.d:
total 4
-r--r----- 1 root root 393 Sep  2 14:02 90-cloud-init-users# visudo
# cp -p sudoers sudoers-22sep16
# cp -p sudoers-org sudoers
cp: overwrite 'sudoers'? y
~~~

### 初回アクセス用ユーザ設定を削除【WebArena Indigoの場合】
　WebArena Indigoの場合は、sudoersファイルの末尾に初回アクセス用ユーザrockyの設定があるからそれをコメントアウトしておく。

~~~linux
# visudo
~~~

でファイルを編集して、以下をコメントアウトする。

~~~linux
rocky  ALL=(ALL)       NOPASSWD: ALL
~~~

### パスワードなしでコマンドを実行できるように設定
　ユーザがパスワードなしにsudo service httpd restartを実行できるようにするために、次のようにする。

~~~linux
# visudo
~~~

でファイルを編集して、以下を付け加える。

~~~linux
User_Alias USER_GROUPE = xxxxxxxx, yyyyyyyy, zzzzzzzz

USER_GROUPE      ALL=(root)      NOPASSWD: /sbin/service httpd restart
~~~

　User_Aliasは複数のユーザを一括して扱うための設定である。
 これでユーザxxxxxxxx, yyyyyyyy, zzzzzzzzでsudo service httpd restartをパスワードなしに実行できる。

## ssh接続のrootログインを禁止 

　ssh接続のrootログインはセキュリティ上で問題があるので禁止する。
　そのためにsshd設定ファイルを変更する。これに関するパラメータはPermitRootLoginである。変更前にバックアップは取っておく。

~~~linux
# cd /etc/ssh/
ls -lrt sshd_config*
-rw------- 1 root root 4281 Sep 13  2021 sshd_config-org
-rw------- 1 root root 4292 Sep  6 10:38 sshd_config
# cp -p sshd_config sshd_config-22sep6 
# vi sshd_config
~~~

　ここでデフォルトでは以下のようになっている。

【WebArena Indigoの場合】
~~~linux
PermitRootLogin yes
~~~

【Kagoyaの場合】
~~~linux
PermitRootLogin without-password
~~~

　Kagoyaのデフォルトのwithout-passwordはrootログインはパスワード認証を拒否するが公開鍵認証では可能にするということだ。
　これを以下のように変える。

~~~linux
PermitRootLogin no
~~~

　適切に変更されているかどうかは以下のコマンドでエラーが表示されないことで確認できる。

~~~linux
# sshd -t
~~~

　以下でsshdが再起動できる。

~~~linux
# systemctl restart sshd
~~~


---

RockyLinux8 vps環境設定12) 時間の同期設定の変更
https://qiita.com/naga_kt/items/f050f279bdbcc3ce2360
に続く。

---

### 参考記事

ユーザーの実行権限を柔軟に割り当てるsudoのリスクとメリット
https://www.itmedia.co.jp/enterprise/articles/0802/19/news013_2.html

sudoで覚えておくと便利な設定・使い方
https://orebibou.com/ja/home/201706/20170619_001/

sshのrootログインを禁止する
https://kazmax.zpp.jp/linux/lin_ssh.html

ご存じですか? sshd_config の PermintRootLogin の各種パラメータについて
https://qiita.com/ine1127/items/b50b9a8f831736cf14ea
「ザッソウ 結果を出すチームの習慣 ホウレンソウに代わる雑談+相談」で1on1上手になりたい

## Not ホウレンソウ but ザッソウ

> ホウレンソウは社会人にとっての基礎スキルといえます。
> ただ、ホウレンソウだけでは、チームのコミュニケーションが機能しなくなってきています。
> 近年、チーム間で(とくに、上司と部下の間で)個人的な話がしにくくなっています。
> 働き方改革によって残業が減り、飲みニケーションや喫煙所での会話も少なくなりました。
> ハラスメントに注意しすぎて仕事以外の話もしにくく、つねに成果を求められているため、短期的な仕事の話が中心になっています。

> チームを活性化させる「ザッソウ」
> 具体的にいうと、それはチームにおけるコミュニケーションのあり方を「ホウレンソウ」のステージから「ザッソウ(雑談・相談)」に上げる、ということです。

という [ザッソウ 結果を出すチームの習慣 ホウレンソウに代わる「雑談+相談」: 倉貫 義人](https://www.amazon.co.jp/dp/4820731823/) の読書感想文です

![](https://images-na.ssl-images-amazon.com/images/I/51VwYAoTsGL._SX344_BO1,204,203,200_.jpg)


## 感想

- ホウレンソウよりザッソウというのは疑いなく同感
- だが「雑談タイム」とか設けてもそこでできる雑談は真に求めてる雑談じゃないことがある
    - むしろ良い雑談ネタって体を動かしてたり違うことやってたりで突然思いつくアイデアネタだとおもう
    - それをどうすると上司やチームで伝え合いやすいのだろう、という悩み
- 壁で仕切られていない小さなスペース… 立ち話ができる空間的なゆとり
    - 背中合わせがチームになれる座席配置は大事
    - コロナ前を思い出す
- 飲み会だけに頼らないというのも同意
- 朝会をザッソウの場にしてしまう
    - 最初は張りきれるとは思うが、体調悪い日とかのあと、継続し、持ち直さないといけない
- 会社持ちで料理が出てくる取り組み
    - ふつうに良いな〜
    - おいしいね、って会話は人間共通の良い雑談ですね
- 読書会
    - 感想を言い合えるのがいいですね
- やはり、いかにして共通の話題づくりをするかがキモなのだろう

## 挙げられているツール

- 仮想オフィス
    - Remotty https://ja.remotty.net
- ストレングスファインダー
    - https://strengths-labo.com/strengthsfinder/
- アンガーマネジメントゲーム
    - https://gamemarket.jp/game/89718

## その他

- 「肯定ファースト」と同時に「Noと言えること」が書いてある
- [Social Change!](https://kuranuki.sonicgarden.jp/) 
- [ザッソウ 結果を出すチームの習慣 ホウレンソウに代わる「雑談+相談」 - ITmedia ビジネスオンライン](https://www.itmedia.co.jp/business/series/15183/)
- [弊社の執行役員に、#times_役員 なSlack分報を開設させるまでにやったこと全部書く - Qiita](https://qiita.com/e99h2121/items/a7e69ebacef8d1fbb6bc) 
- [これだけ話しておけばよき、1on1が苦手な人のための1on1テンプレート - Qiita](https://qiita.com/e99h2121/items/aeb93f0bd911ad604a02) も参考になるとうれしい


以上です～