OmniAICreator/Qiita-1.07M huggingface dataset:
Nuxt3 + TypeScript環境でESLint導入

## はじめに
Nuxt3+TypeScript環境でESLintを導入する手順を説明します。
※ Nuxt3とTypeScriptはインストール済みの前提です。

## 実行環境
Node.js：18.4.0
npm：8.13.2
Nuxt：3.0.0-rc.10
TypeScript：4.8.3

## ESLintとは？
JavaScript、TypeScriptの静的解析ツールです。
システム全体のコードの一貫性を維持することを目的とし、ESLintで定義したコーディング規約や、単純な構文エラーをチェックし、指摘したり、修正してくれる仕組みです。

## 手順
### ESLintのインストール
#### ESLint本体のインストール
```
$ npm install --save-dev eslint
```
#### eslint-plugin-vueのインストール
リアルタイムで.vueファイルの構文エラーが検出可能なプラグインです。
```
$ npm install --save-dev eslint-plugin-vue
```
#### TypeScript関連のESLintプラグインのインストール
```
$ npm install --save-dev @typescript-eslint/eslint-plugin @typescript-eslint/parser @nuxtjs/eslint-config-typescript
```

### ESLintの初期化
初期化コマンドを打っていくつかの質問に答えると、回答内容に基づいた`.eslintrc`ファイルが出来上がります。
```
$ npx eslint --init

✔ How would you like to use ESLint? · problems
✔ What type of modules does your project use? · esm
✔ Which framework does your project use? · vue
✔ Does your project use TypeScript? · No / Yes
✔ Where does your code run? · browser, node
✔ What format do you want your config file to be in? · YAML
```
上記の回答で以下内容のファイルが出来上がります。
```
env:
  browser: true
  es2021: true
  node: true
extends:
  - eslint:recommended
  - plugin:vue/vue3-essential
  - plugin:@typescript-eslint/recommended
overrides: []
parser: '@typescript-eslint/parser'
parserOptions:
  ecmaVersion: latest
  sourceType: module
plugins:
  - vue
  - '@typescript-eslint'
rules: {}
```
このファイルにプロジェクト独自の設定を書き加えていくことになります。
### おわりに
ESLintをうまく導入することで、チーム開発時のコードがカオスになることを防ぐことができるため、積極的に採用していくべきだと思います。
【PowerAppsデメリット集(その１）】外部結合や内部結合させようとするとコードが長くなりメンテ、引継ぎが困難になる

例えば以下のような外部結合を行う場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2783140/726d3814-6a4f-c14e-261a-894ac32b5204.png)

SQLなら以下のように１行で済むことであるが、
```
select * from table_base left outer join table_x on table_base.ID = join table_x.ID
```

PowerAppsで同様のことを記述すると以下のようにするしかない。。
```
ClearCollect(table_left_outer_join,
    DropColumns(
        Ungroup(
            AddColumns(
                table_base,
                "table_x.name_x",
                Filter(
                    RenameColumns(
                        table_x,
                        "ID",
                        "X_ID"
                    ),
                    ID = X_ID
                )
            ),
            "table_x.name_x"
        ),
        "X_ID"
    )
)
```

さらに、上記のような処理は更新、新規追加、削除などを行うたびに、上記を実行させる必要があり、同じ処理を何回もコーディングしたくないので、コンポーネントでコレクションのカスタムプロパティで共通利用させようとしたが、それができない
こちら→https://qiita.com/tanakaminoru55555/items/704152f5141ff294ed19

外部結合や内部結合させようとする場合は、ローコード開発にならないので、エンドユーザが開発する場合は、この部分を切り出して開発を専門家に依頼するなどの対策が必要

参考文献：https://m365powerapps.kagoyacloud.com/ ←　よくまとまってます
M1 Macでwaifu-diffusion

# 概要
M1 Macで[waifu-diffusion](https://github.com/harubaru/waifu-diffusion/ "waifu-diffusion")を動かした。

https://github.com/harubaru/waifu-diffusion/

https://huggingface.co/docs/accelerate/usage_guides/mps

~~※2022.10.30時点：下記の手順がうまく動作しなくなってしまったので調査中。~~

# 環境
- MacBook Pro (M1): macOS 13.3.1 Build 22E772610a
- Python: 下記サイトから[Miniforge3-MacOSX-arm64.sh](https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-MacOSX-arm64.sh "Miniforge3-MacOSX-arm64")をダウンロードしてインストール

https://github.com/conda-forge/miniforge

# 準備
conda環境を作って、必要なパッケージをインストールする。
```shell-session
$ conda create --name waifudiffusion python=3.10 -y
$ conda activate waifudiffusion
$ conda install pytorch-nightly::pytorch torchvision torchaudio -c pytorch-nightly -y  # MPS acceleration is available on MacOS 12.3+
$ conda install transformers ftfy -y
$ conda install diffusers -y
$ conda install accelerate -y
```

PyTorchのインストールは、[Start Locally](https://pytorch.org/get-started/locally/)のページで、

https://pytorch.org/get-started/locally/

|Item|Value|
|:--|:-:|
|PyTorch Build|Preview(Nightly)|
|Your OS|Mac|
|Package|Conda|
|Language|Python|
|Compute Platform|Default|

を選んで、Run this Commandのところに示されたコマンドを実行する。

# 実行
パッケージをインポートする。
```python:
>>> import torch
>>> import diffusers
>>> torch.__version__  #　バージョン確認
'2.1.0.dev20230504'
>>> diffusers.__version__  # バージョン確認
'0.16.1'
>>> torch.backends.mps.is_available()  # MPSデバイス確認
True
```
StableDiffusionパイプラインを作る。デバイスにmpsを設定する。
```python:
>>> pipe = diffusers.StableDiffusionPipeline.from_pretrained(
...     'hakurei/waifu-diffusion',
...     torch_dtype=torch.float32
...     ).to('mps')  # MPS(Metal Performance Shaders)
```
テキストから画像を生成する。
```python:
>>> prompt = "masterpiece, 1girl, aqua eyes, baseball cap, blonde hair, closed mouth, earrings, green background, hat, hoop earrings, jewelry, looking at viewer, shirt, short hair, simple background, solo, upper body, yellow shirt"
>>> image = pipe(prompt, guidance_scale=6).images[0]  # 画像を生成
>>> image.save("output.png")  #画像を保存
```
以下の画像が生成された。
![girlaquaeysbaseballcap.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591123/46403e35-c6a5-9e21-86b1-616a6110ff06.png)


# 補足
`accelerate`がインストールされていないと、`StableDiffusionPipeline.from_pretrained()`を実行したときに下記のエラーが発生する。
> Cannot initialize model with low cpu memory usage because `accelerate` was not found in the environment. Defaulting to `low_cpu_mem_usage=False`. It is strongly recommended to install `accelerate` for faster and less memory-intense model loading.


# 参考情報
- Accelerated PyTorch training on Mac

https://developer.apple.com/metal/pytorch/

- PyTorch 1.13 release, including beta versions of functorch and improved support for Apple’s new M1 chips.

https://pytorch.org/blog/PyTorch-1.13-release/

- Introducing Accelerated PyTorch Training on Mac

https://pytorch.org/blog/introducing-accelerated-pytorch-training-on-mac/
フレームワークやプログラミング言語を年収や求人数からスコア化してみる




## サイトはこちら

https://flamevalue.short-tips.info/

## 注意事項:鵜呑みにしない

本サイトは現在でも改修、改良が進んでいる状態です。従って評価基準はこれからも絶えず変更されます。

また、根拠のもととなるCareerJetは完全な求人サイトとは言い難いです。

何が言いたいかというと評価基準も元となるデータもバラバラですが、

どうか寛容な目で見守ってやってください。

# フレームワークランキング

## 第一位：Ruby on Rails

https://flamevalue.short-tips.info/Ruby%20on%20Rails


### 状態


- 平均下限年収 : 616万円

- 平均上限年収 : 777万円

- 総求人数 : 7023件

- リモート率 : 65%

- フォロワー(Qiita) : 12.62人

年収からリモート率までトップ。
採用数のみ、フレームワーク故(目的が絞られているが故)にプログラミング言語よりは低いスコアになっているが、フレームワーク界隈ではトップ。

というかrubyがまだまだ強い。（正直Typescriptの方が勢いがあるように見えるが...)


### Ruby on Rails自体の特徴は以下の通り

1. DRY(Don't Repeat Yourself) Ruby on Railsでは同じコードを繰り返し書くことを避け、保守管理しやすい状態に保ちバグを減らすことができます。
記述するコードが短くなることにより効率よく開発することができます。 

2. CoC(Convention Over Configuration) Ruby on Rails自体で規約を用意しているため、規約に則ったコードを書くことにより記述量を少なくすることができ、早い開発が可能になります。 

3. フレームワーク内のメールに従って、ソースコードなどを記述することによって、フレームワークの機能を最大限に用いることができます。 

4.　国内外問わず多くの企業が導入しているため、書籍やWeb上の情報もたくさんあり、情報収集や学習が容易です。 

5.　Ruby自体が日本語のドキュメントが豊富です。

@teruteru さんの記事より引用


## 第二位:Laravel

https://flamevalue.short-tips.info/Laravel

### Laravel

- 平均下限年収 : 616万円

- 平均上限年収 : 777万円

- 総求人数 : 7023件

- リモート率 : 65%

- フォロワー(Qiita) : 12.62

求人数だけで言えばRuby on Railsを超えている。


### Laravel自体の特徴は以下の通り


みそらさんより

メリット 

>　頻繁に行われるバージョンアップ（新機能追加されやすい） 人気度の高さ故のコミュニティ 比較的簡単に習得可能 開発スピードもはやい

デメリット 

>　複数人での開発をするには注意が必要 CakePHPと比べると処理速度が遅め(気にしなくてOK)

Laravelの柔軟性の高さ故の問題。 人によっては同じ処理でも全然コーディングの仕方が変わることもあるため、大きめなプロジェクトの場合やコーディングに携わる人が複数人に渡る場合は、コーディング規約やルールを先に決めておくのがおきましょう。


コードが読みやすく、書きやすい
学習コストの低さ
強力なルーティングフィルター
柔軟なオートローダー
簡単なページネーション
ビューをサポートするコンポーサー



## 第三位:Typescript

https://flamevalue.short-tips.info/TypeScript


### Typescriptのスコア

- 平均下限年収 : 575万円

- 平均上限年収 : 755万円

- 総求人数 : 9595件

- リモート率 : 33%

- フォロワー(Qiita) : 14.0

プログラミング言語の現状トップ

とにかく勢いがすごい(ここ1~2年ぐらい？で勢いが増してきた気がする）

求人数が多い割に、平均年収も高い状態をキープできているのが大きい


### Typescriptの特徴

TypeScriptの特徴

JavaScriptより短く読みやすいコードを書ける
JavaScriptとの互換性がある
型を宣言するためのエラーを未然に防ぐことができる
学習コストがかかる
日本語の情報が少ない

mai さんより


## まとめ

今学習するなら

プログラミング言語基準で言えばTypescript

webフレームワーク基準ならRuby & Ruby on Rails

もっと手っ取り早くWebアプリケーションを組みたいならLaravel

という基準になるか。

(念の為繰り返すが、このランキングは今後大いにひっくり返る可能性が高いので鵜呑みにしないでほしい。)

また、webフレームワークのみでランキングを作ったが、組み込み系ランキングとかあってもいいかもしれない。
STM32G071とOLED,OLED096UNO-AでABC defgを表示


x NUCLEO-G071RB


目的
ArduinoでOLED,OLED096UNO-AでABC defgを表示


16x16Fontの適当なコメントを外す

NONAMEは、「ななし」の事、なんでもいい
HWは、I2Cハードウェアの事


すること
U8X8_SSD1306_128X64_NONAME_HW_I2C u8x8(/* reset=*/ U8X8_PIN_NONE); 	
のコメントを外す


X何らかの方法でArduinoを起動出来る様にしておく。

1.u8g2ライブラリーをインストール

2.ソースの例から16x16Fontを選択

3.まるまるを選択

4.コンパイル

5.ABC defgが表示される

6.おわり

おまけ
ここまでわかるまでに30分掛った。
mbedの方が環境構築が簡単だつた。
わからないところは、自力で解決してね!!
約32kバイトぐらい使用する


![o_con772.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/c4891683-a75f-fe22-c5a8-0e37ee381bff.jpeg)




![o_con769.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/4aa2768f-0e42-2451-8528-0245b3b21747.jpeg)



![o_con768.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/778d79e3-e6d6-80d8-2000-e84b7f3536e1.jpeg)


![o_con771.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/139d9a90-0171-0775-476e-3a401ce43223.jpeg)


![o_con770.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/2c83c3b3-5636-5935-5911-c2de828198b3.jpeg)
AWS Copilot でデプロイ時にマイグレーションを実行する

AWS Copilot は `copilot task run` コマンドで単発のタスクを実行することができますが、環境変数やVPCなどの設定を毎回指定する必要があり面倒です。そこで `--generate-cmd` オプションを利用してコマンドの雛形を生成してから一部を書き替えてデプロイ時に実行します。

## CodeBuild に組み込む

`buildspec.yml` の `post_build` フェーズにマイグレーション用のコマンドを追加します。

*Laravel の `php artisan app:release` コマンドを実行する例*
```yaml
# {APP_NAME} {SVC_NAME} は書き替えてください
- cmd="$(./copilot-linux task run --generate-cmd {APP_NAME}/${env}/{SVC_NAME} 2>&1 | \
  sed -E \
    -e 's/--entrypoint ""/--entrypoint php/' \
    -e 's/--command ""/--command \"artisan app:release\"/' \
    -e 's/copilot /.\/copilot-linux /' \
  ) --follow --task-group-name app-release-${env}"
- eval "$cmd"
```

`copilot task run` コマンドは `--generate-cmd application/env/service` オプションを指定するとコマンドの雛形が出力されます。
この出力は環境変数やVPCなどの設定が含まれていますが `entrypoint` `command` オプションだけは空欄になっているので `sed` などで置換しましょう。出力先がなぜか標準エラー出力なので `2>&1` で標準出力に結合してからパイプで処理します。

CodeBuild で実行するときは `copilot` コマンドが `copilot-linux` コマンドになっているのでそれも合わせて `sed` で置換します。

変数 `$cmd` に入れてから `eval` で実行すると空白のエスケープ処理などを気にしなくて良いので簡単です。
エンジニア騎士とクエリの魔女 SQL問題 獣の足跡(paizaランクA相当)

エンジニア騎士とクエリの魔女 SQL問題 獣の足跡(paizaランクA相当)を解いてみました。

https://paiza.jp/code_and_sql/challenges/cas_s_a_2001



>獣の足跡 （paizaランク：A相当）

>モンスターの属性にはそれぞれ弱点となる属性がある。 「Graffiacane」の弱点となる属性をもった強力なボスモンスターを召喚し、「Graffiacane」を討伐せよ。


>Hellテーブルから、モンスターの「Graffiacane」(Hellテーブルのnameが「 Graffiacane 」のレコード) の弱点となる属性名を持ち、階級が「Boss」であるレコードをすべて出力してください。 属性名はHellテーブルのelement_idを外部キーとしてElementテーブルを外部参照してください。 弱点はElementCompatibilityテーブルに格納されており、弱点に対応する属性名はelement_id、weakness_element_idを外部キーとしてElementテーブルを外部参照することで取得できます。 階級はHellテーブルのgrade_idを外部キーとしてGradeテーブルを外部参照してください。 なお、レコードを出力する際に表示するカラムは、Hellテーブルのid, Hellテーブルのname, Elementテーブルのname, Gradeテーブルのnameとし、Elementテーブルのnameには「element」、Gradeテーブルのnameには「grade」と名付けてください。

# 解答例1(SQL)
()のサブクエリから実行されます。Graffiacaneの属性idを取り出すところで、属性名で取り出そうとすると、弱点の属性名を取り出すときに、ややこしくなります。属性idで取り出せば、スッキリします。
```sql
-- Let's チャレンジ！！
/*召喚*/
SELECT Hell.id, Hell.name, 
       Element.name AS "element", Grade.name AS "grade"
FROM Hell
JOIN Element
ON Hell.element_id = Element.id
JOIN Grade
ON Hell.grade_id = Grade.id
WHERE Grade.name = "Boss" 
  AND Element.name = ( --弱点の属性名を受け取る
    /*弱点の属性名*/
    SELECT Element.name --弱点の属性名を渡す
    FROM ElementCompatibility
    JOIN Element
    ON ElementCompatibility.weakness_element_id = 
       Element.id -- 弱点の属性idを属性名と結びつける
    WHERE element_id = ( -- 属性idで受け取る
      /*Graffiacaneの属性id*/
      SELECT element_id -- ここは属性idで渡す
      FROM Hell
      WHERE name = "Graffiacane"
    ) 
);
```

# 解答例2(SQL)
サブクエリは全てidの受け渡しにすると、より短縮します。
```sql
-- Let's チャレンジ！！
/*召喚*/
SELECT Hell.id, Hell.name, 
  Element.name AS "element", Grade.name AS "grade"
FROM Hell
JOIN Element
ON Hell.element_id = Element.id
JOIN Grade
ON Hell.grade_id = Grade.id
WHERE Grade.name = "Boss" 
  AND Element.id = ( -- 弱点の属性idを受け取る
    /*弱点の属性id*/
    SELECT weakness_element_id -- 弱点の属性idを渡す
    FROM ElementCompatibility
    WHERE element_id = ( -- 属性idを受け取る
      /*Graffiacaneの属性id*/
      SELECT element_id  -- 属性idを渡す
      FROM Hell
      WHERE name = "Graffiacane"
    ) 
);
```

# 解答例3(SQL)
"Graffiacane"の弱点属性のidを取り出すところは、HellテーブルとElementCompatibilityテーブルをJOINすると、さらに短縮できます。
```sql
-- Let's チャレンジ！！
/*召喚*/
SELECT Hell.id, Hell.name, Element.name AS "element", Grade.name AS "grade"
FROM Hell
JOIN Element
ON Hell.element_id = Element.id
JOIN Grade
ON Hell.grade_id = Grade.id
WHERE Grade.name = "Boss" 
  AND Element.id = ( -- 弱点の属性idを受け取る
    /* HellテーブルとElementCompatibilityテーブルをJOINして 
    一発で"Graffiacane"の弱点属性のidを取り出す */
    SELECT weakness_element_id -- 弱点の属性idを渡す
    FROM Hell
    JOIN ElementCompatibility
    ON Hell.element_id = ElementCompatibility.element_id
    WHERE name = "Graffiacane"
  ) 
);
```
variantsによるテンプレートの切り替え

### variantsとは
条件によってテンプレートを切り替える機構としてvariantsという機能があります。
接続してきた端末によってPCとは別のテンプレートを表示したいという場合にこの機能が使えるようになります。

実際の流れになります。
controller内でrequest.variantに:tabletや：mobileなどの値を入力することで
viewテンプレートとして展開されるファイルを例えば、
<font color="red">**index.html.erb → index.html+mobile.erb**</font>
このように"+"とrequest.variantの値のテンプレートが表示されるようになります。

具体的な動きを見ていきます。
① まずApplicationController内のbefore_actionでUserAgentを参照してrequest.variantの値を設定
```ruby:app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  before_action :detect_mobile_variant

  private

  def detect_mobile_variant
    request.variant = :mobile if request.user_agent =~ /iPhone/
  end
end

```

## 余談

### UserAgentとは
UserAgentとはHTTOリクエストヘッダーに含まれるWEBノ使用環境に関する情報のことです。
ブラウザの種類、ブラウザのバージョン、端末のOSの種類などの情報が含まれています。

### RailsにおけるUserAgentの取得方法
以下のようにUserAgentを取得することができる
```
requset.user_agent
```

### UserAgent以外にも取得可能requestオブジェクト
```
request.url                 # リクエストで使われるURL全体
request.remote_ip           # クライアントのIPアドレス
request.query_string        # URLのクエリ文字
```

② mobile用のテンプレートの用意
今回はapp/views/books/show.html.erbをコピーし、
app/views/books/show.html+mobile.erbを作成する

```ruby:app/views/books/show.html+mobile.erb
<h1>本の詳細情報(モバイルの見た目)</h1>
```

このようにすることでユーザーがmobileからアクセスしてきた際にmobile用のテンプレートが表示されます。
Vue3の学習コストが低いかも？！初学者はReactにこだわらなくてもいいんじゃないの？

<h1>React怖い</h1>
無知ながら求職条件によくみるので、
友人にReactをお勧めしておきながら、Reactの学習から逃げてました。<br>
だって、その友人がものすごく賢いのに、苦戦してるんだもの。<br>
そのため、フロントから逃げ気味になり僕はバックエンドをやるんだと・・・
<h3>導入</h3>
しかし、node.jsはまあなんとなくできるようになり（基礎だけね）とりいそぎfirebaseを学習しようとしたら、
どうしてもフロントが必要なんだよなあ。<br><br>
svelteをいじってみましたが情報の少なさで怯んでしましました。
そのため、プログラミングからも逃げ、Youtubeを見ていたところ、Vue3がsvelteライクだぞ！という情報をみつけました。
<br><br>
楽そうなものは目ざとく取り入れる習性があるため、即Udemy講座を購入。
<br><br>
読める！読める！書ける！動かせる！簡単に書ける！<br>
ともう興奮しっぱなしになり、本記事を書いています。

<h3>使ってみて</h3>
正直Reactとの比較はできない・・・だってやってないんだもん
ただ、以前ヴァニラJSで作ったチャットアプリがここまで縮小してかけるのには驚きました。
DOMで死にそうになっていたあの時を懐かしく（１月前）思いながら、<strong>DOMいらなくない？</strong><br>
とびびっております。

<h2>作ったもの</h2>
簡単なチャットアプリ（削除機能付き）を作成してみました。
CSSからはまだ逃げているので、書いていません。

````index.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Vuetest</title>
    <link rel="stylesheet" href="css/main.css">
</head>
<body>
    <div id="app">
        <h2>Chat app by Vue3</h2>
        <form v-on:submit.prevent>
            <input type="text" v-model="newItem">
            <button v-on:click="addItem">Add</button>
        </form>
        <ul>
            <li v-for="(todo,index) in todos">
                <input type="checkbox" v-model="todo.flag">
                <span>{{todo.item}}</span>
                <button v-on:click="deleteItem(index)">
                    Delete</button>
            </li>
        </ul>
        <pre>{{$data}}</pre>
 
    </div>
    <script src="https://unpkg.com/vue@3.1.5"></script>
    <script src="js/main.js"></script>
</body>
</html>
````
v-hoge:hugaとhtmlに直接色々かいちゃってるわけだが、読みやすいし、感覚で書けるのが楽しい！
````app.js
const app=Vue.createApp({
    data: ()=> ({
        newItem:'',
        todos:[]
    }),
    methods:{
        addItem: function(event){
            //alert('clickされました')
            if(this.newItem==='')return
            let todo = {
                item: this.newItem,
                flag: false
            }
            this.todos.push(todo)
            this.newItem=''
        },
        deleteItem: function(index){
            this.todos.splice(index, 1)
        }
    }
})
app.mount('#app')
````
<strong>JS！え？こんだけ？</strong>

<h2>最後に</h2>
おそらくVue3がいいのだと思いますが、2との違いは判りません！
Vue3はまだ売っているテキストなども少ないですが、それでもさくっとかけてしまいますので、
Reactに泣いてるそこの方？いかがでしょうか？
英語のTechリソースを探している人が使うべきサービス

2019年に始まったんですが、サービスイン以来ずっと使っています。
最近、ここの中の人からユーザーインタビューみたいなのをされて、トランスレーションとかする予定あるの聞いたら、今のところ具体的な計画はないそうですが、検討事項には入っているみたいな話でした。

使い方は簡単で、GitHubのアカウントでサインインして、自分の興味あるタグをリストに入れておけば、毎日新しいFeedが入っています。

自分の場合は特に気になったサイト等があった場合に、FeedをRSSリーダー[inoreader](https://www.inoreader.com/)に登録しています。


そのほかに、３つ用意されているFeedがあります。
![Screenshot 2022-09-18 at 1.24.13 AM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24723/a6ab83d5-894f-223f-ffa6-650466d952fc.png)


- `Popular`
これはおそらく、サイトとExtension経由でアクセスが多かったものをピックしているようです。


- `Most upvoted`
上のイメージの中にある記事のCard UIの下に上向きの矢印が見えると思うのですが、これがupvoteになります。
所謂、ソーシャルメディアで使われている`Like`と同様の機能です。これが、多いものが順に表示されます。
どれくらいの期間が対象になっているのかはコード確認してないので、正確なことは言えばせんが、大体１週間ほどでトップの記事は入れ替わっている印象です。


- `Best discussions`
最後のこれはCard UIの中央に位置するコメントがたくさんついたものが表示されます。
Most upvotedと比較すると結構古い記事とかも表示されます。


https://daily.dev/


Chrome(Brave) Extensionもあります。

https://chrome.google.com/webstore/detail/dailydev-the-homepage-dev/jlmpjdjjbgclbocgajdjefcidcncaied



GitHub

https://github.com/dailydotdev
Brainf*ckを使ってAtCoderの問題を解いてみた

前から気になっていたBrainf*ckを覚えた記念として、AtCoderの問題を1問解いてみました。
題材は最近灰埋めで解いて、かつ入力がシンプルなこちらの問題。

https://atcoder.jp/contests/abc130/tasks/abc130_a

# そもそもBrainf*ckって？

命令が8つしかないプログラミング言語です。

|命令|説明|
|---|---|
|>|ポインタをインクリメントする。|
|<|ポインタをデクリメントする。|
|+|ポインタが指す値をインクリメントする。|
|-|ポインタが指す値をデクリメントする。|
|.|ポインタが指す値を出力に書き出す。|
|,|入力から1バイト読み込んで、ポインタが指す先に代入する。|
|[|ポインタが指す値が0なら、対応する ] の直後にジャンプする。|
|]|ポインタが指す値が0でないなら、対応する[にジャンプする。|

3分でプログラミング言語をひとつ習得しました。やったー！！！

# Hello Worldは面倒なのでABC

ABCと出力するプログラムをBrainf*ckで記述してみます。

```brainfuck
++++++++++++++++++++
++++++++++++++++++++
++++++++++++++++++++
+++++
.+.+.>
++++++++++.
```

説明します。

- Aはアスキーコードで65なので`+`を65回書いて0番地を65にする
- `.`で`A`を出力
- `+`で0番地を66にする
- `.`で`B`を出力
- 同様に`C`を出力
- `>`で1番地に移動
- `+`を10回書いて1番地を10にする
- `.`で改行を出力

ただ、コードが長いですので、リファクタリングの余地がありそうです。

# Brainf*ckのコードをリファクタ

例えば、以下のように書けそうです。

```brainfuck
+++++++++++[>++++++>+<<-]>-.+.+.>-.
```

説明します。

- 0番地を11にする
- 0番地が0になるまで以下を繰り返す
  - 1番地の値を6回インクリメント
  - 2番地の値を1回インクリメント
  - 0番地の値を1回デクリメント
- このとき、0番地は0、1番地は66、2番地は11となります。
- `>`で1番地に移動
- `-`で1デクリメントして65にして、`A`を出力
- 同様に`B`と`C`を出力
- `>`で2番地に移動
- `-`で1デクリメントして10にして、改行を出力

# 本題、AtCoderの問題を解く

問題自体は非常にシンプルです。
2つの1桁の数字$X$と$A$が与えられて、$X$が$A$未満のとき$0$、そうじゃないとき$10$を出力します。

https://atcoder.jp/contests/abc130/tasks/abc130_a

初心者にはめちゃくちゃ大変でしたがなんとかそれなりの短さにおさまりました。
if文がないのがめちゃくちゃ難しいです。解説つきのコードが以下になります。

```brainfuck
>>,+>,,                2番地にx足す1 ３番地にaを読み込み
<<<,[->+++++<]>->>     0番地に改行を読み込んでそれを使って1を1番地に生成
[
    <　                  2番地に移動
    [>]>[[-]+<+>>>]<<< もし2番地が先に0になったら2番地と3番地を1にする
    ->-　                ２番地と3番地から1デクリメント
]<                     2番地に移動
[[-]<.>]               もし2番地が0でないなら1番地に格納している1を出力
<-.                    0を出力
```

`->-`で$X$と$A$をデクリメントしていくのですが、
`[>]`で$X$が先に0になったときは行き先が2番地、そうじゃないときは4番地となるのが鍵です。
その後、2番地と3番地の値を1にすることでループを抜け、
2番地が0かどうかの判定をできるというロジックです。

ちょっとこれだけだと飛躍があるので、最後にもう少し詳細な説明をします。

ワンライナーにすると以下になります。特殊な訓練を受けてないと読めなそうですね。。。

```brainfuck
>>,+>,,<<<,[->+++++<]>->>[<[>]>[[-]+<+>>>]<<<->-]<[[-]<.>]<-.
```

https://atcoder.jp/contests/abc130/submissions/34960521

# 補足: もう少し細かい解説

ちょっと難しかったのでもう少し詳しく解説します。

例として、`7 5`が出力されたと仮定して説明します。

`>>,+>,,`  2番地に7+1 ３番地に5を読み込み
[0][0][56]**[53]**
`<<<,[->+++++<]>->>`     0番地に改行を読み込んでそれを使って1を1番地に生成
[0][49][56]**[53]**

```brainfuck
[
    <　                  2番地に移動
    [>]>[[-]+<+>>>]<<< もし2番地が先に0になったら2番地と3番地を1にする
    ->-　                ２番地と3番地から1デクリメント
]
```

以下のように遷移します。
[0][49][55]**[52]**[0][0]
[0][49][54]**[51]**[0][0]
・・・
[0][49][3]**[0]**[0][0]

`<`
[0][49]**[3]**[0][0][0]
`[[-]<.>]`
[0][49]**[0]**[0][0][0] 1を出力
`<-.`
[0]**[48]**[0][0][0][0] 0を出力

----

`3 5`のような入力が与えられた場合

```brainfuck
[
    <　                  2番地に移動
    [>]>[[-]+<+>>>]<<< もし2番地が先に0になったら2番地と3番地を1にする
    ->-　                ２番地と3番地から1デクリメント
]
```
以下のように遷移します。
[0][49][52]**[55]**[0][0]
[0][49][51]**[54]**[0][0]
・・・
[0][49][0]**[3]**[0][0]

この後、

`<`
[0][49]**[0]**[3][0][0]
`[>]>`
[0][49][0]**[3]**[0][0]
ここで、2番地が0なのがポイントで、`[>]`が移動しないのがポイントです。
`[[-]+<+>>>]<<<`
[0][49]**[1]**[1][0][0]
`->-`
[0][49][0]**[0]**[0][0]
これでループを抜けます。

`<[[-]<.>]`
[0][49]**[0]**[0][0][0]
今回は2番地が0なので`[[-]<.>]`の処理は行われません。
`<-.`
[0]**[48]**[0][0][0][0]
0を出力。
ユーザー設定「Is Single Sign-On Enabled」


https://simple-force.com/

ユーザー名とパスワードによるログインを無効にする 1 つの方法は、ユーザー設定の「Is Single Sign-On Enabled」です。この設定は、「委任認証」の一部として提供されます。

ユーザー機能のドキュメントは最小限です。Salesforce は、ほんの一握りの記事でのみ言及しています。この機能は、入力したユーザー名とパスワードを「委任された認証 Web サービス」にルーティングすることを目的としており、他のログイン メカニズムを無効にすることを意図していないようです。

>ユーザーのプロファイルにシングル サインオンが有効なユーザー権限がある場合、Salesforce はユーザー名とパスワードを検証しません。代わりに、Web サービス呼び出しがユーザーの組織に対して行われ、ユーザー名とパスワードを検証するよう求められます。

[デスクトップとモバイルのシングル サインオン](https://developer.salesforce.com/index.php?title=Single_Sign-On_for_Desktop_and_Mobile_Applications_using_SAML_and_OAuth&oldid=38889)

この設定は、委任された認証サービスのアドレスを入力せずに、プロファイルおよび権限セット レベルで有効にすることができます。これにより、ユーザーがユーザー名とパスワードでログインできないという副作用が生じます。ユーザー名とパスワードでログインしようとすると、次のエラー メッセージが表示されます。

>シングル サインオンしか使用できないため、ログインできません。サポートが必要な場合は、Salesforce 管理者にお問い合わせください

ユーザー名とパスワードを入力した後のエラー メッセージ

この動作は、Ashish Agarawalおよび StackExchange の他の複数の人物によって文書化されています。ただし、この機能は公式に文書化されておらず、いつでも削除できます。個人的にはこのルートはお勧めしません。

https://www.asagarwal.com/how-to-disable-direct-login-to-salesforce/

https://salesforce.stackexchange.com/questions/35171/enabling-saml-sso-where-is-the-use-single-sign-on-permission
AWS実務未経験からSAAに3週間で合格するまで

## はじめに
2022年5月、AWS認定ソリューションアーキテクト―アソシエイト（SAA-C02）に3週間で合格することができました。
その時の学習方法を記録として残します。

:::note warn
2022年8月30日からは新試験（SAA-C03）となっています。
:::

## 事前知識
・2021年10月にAWS認定クラウドプラクティショナー合格済
・AWS実務経験なし

## 結果
767点という結果でした。
720点以上が合格なので余裕というわけではありませんでした。

## 使用した教材
・参考書
　[AWS認定資格試験テキスト AWS認定ソリューションアーキテクト - アソシエイト 改訂第2版](https://www.amazon.co.jp/AWS%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E8%A9%A6%E9%A8%93%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88-AWS%E8%AA%8D%E5%AE%9A%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%88-%E3%82%A2%E3%82%BD%E3%82%B7%E3%82%A8%E3%82%A4%E3%83%88-%E6%94%B9%E8%A8%82%E7%AC%AC2%E7%89%88-NRI%E3%83%8D%E3%83%83%E3%83%88%E3%82%B3%E3%83%A0%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BE/dp/4815607389/ref=pd_lpo_1?pd_rd_i=4815607389&psc=1)
・Udemy
　[これだけでOK！ AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座](https://www.udemy.com/course/aws-associate/)
・Black Belt
　[AWS サービス別資料](https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-service-cut/)
・問題集
　[AWS WEB問題集で学習しよう](https://techstock.jp/)
・AWS公式模擬試験
　[AWS Skill Builder](https://explore.skillbuilder.aws/learn)

## 大まかなスケジュール
1週目：参考書の読み込み
2週目：Udemyの受講、Black Beltの読み込み
3週目：問題集、AWS公式模擬試験の実施

### 1週目：参考書の読み込み
まずは全体像を把握するため、参考書の読み込みから実施しました。
毎日1章以上読み進め、毎章ごとに出てくる練習問題で間違ったところをメモしておきました。
そして参考書を1周したところで、間違っていた練習問題にもう一度挑戦し、理解の浅い項目については対象の章を読み直すという進め方をしました。

### 2週目：Udemyの受講、Black Beltの読み込み
Udemyはボリュームが多く、全てを1週間で実施するのは厳しいと判断し、以下のように対応しました。
　・動画の再生速度を1.25倍以上に設定
　・特定のハンズオンのみ実施
　・模擬試験は実施しない
そして、動画内で理解できなかった部分については、Black Beltで補完するようにしました。
Udemyの模擬試験を実施していたら、もう少し余裕を持って合格できたのではないかと後悔しています。
この週の終わりくらいに試験を申し込みましたが、テストセンターで受ける場合は直前では空いていなかったりします。

### 3週目：問題集、AWS公式模擬試験の実施
「AWS WEB問題集」の#80～最新（当時は#160）まで実施し、間違ったところの問題の番号をメモして進めていきました。
ここで1点失敗したことがあります。問題の出る順番がデフォルトだとランダムで表示されるため、もう一度実施する際にはメモした問題の番号とは異なっているということに、中盤くらいまで進んでから気が付きました。
結果、間違った問題のみ復習しようと思っていましたが、ほぼほぼやり直したため問題集をまるまる2周した感じになりました。
仕上げとして、模擬試験モードを2回実施したところ、2回とも9割は取ることができていました。
実際の試験の問題数と時間を再現してくれるので、絶対に一度は実施した方がいいです。

試験前日にAWS公式模擬試験を実施しましたが、結果は7割とギリギリでした。
公式なだけに一番試験に近いものだった気がします。もう少し早く実施すべきだったかなと後悔しています。


## 試験当日
テストセンターに到着すると、偶然受付に会社の先輩がいて、試験の席も隣という変な緊張感のなか試験を受けました。
点数からもわかる通り、思ってた以上に難しかったですが、最後まであきらめずに見直しすることで何とか合格することができました。
問題集をただ暗記するのではなく、AWSのサービスをちゃんと理解していないと厳しいと感じました。

## 最後に
2週目の終わりに試験に申し込んでいたため、ダラダラ進めることなく良い緊張感を持って取り組めたことが良かったと感じています。
SAAが取得できたからといって、AWSのサービスを使いこなせるわけではないため、引き続き業務や個人の活動のなかで理解を深めていこうと思います。
この記事が少しでもお役に立てれば幸いです。
Samba の使い方

Ubuntu 22.04 での Samba の使い方です。

ソフトのインストール

```bash
sudo apt install samba
sudo apt install smbclient
```

バージョンの確認

```text
$ samba -V
Version 4.15.9-Ubuntu

$ smbclient -V
Version 4.15.9-Ubuntu
```

Samba でアクセスするフォルダーの作成

```bash
mkdir /var/tmp/json
mkdir /var/tmp/plain_text
```

設定ファイルの修正

```text:/etc/samba/smb.conf
（省略）
#
[json]
   comment = json
   path = /var/tmp/json
   browseable = yes
   read only = no
   guest ok = yes
#
[plain_text]
   comment = Plain Text
   path = /var/tmp/plain_text
   browseable = yes
   read only = no
   guest ok = yes
#
```

サーバーの再起動

```bash
sudo systemctl restart smbd
sudo systemctl restart nmbd
```

クライアントで共有名を調べる

```text
$ smbclient -L localhost -U uchida%password

	Sharename       Type      Comment
	---------       ----      -------
	print$          Disk      Printer Drivers
	json            Disk      json
	plain_text      Disk      Plain Text
	IPC$            IPC       IPC Service (iwata server (Samba, Ubuntu))
SMB1 disabled -- no workgroup available
```

共有名 json にアクセス

```text
$ smbclient //localhost/json  -U uchida%password
Try "help" to get a list of possible commands.
smb: \> ls
  .                                   D        0  Wed Aug  3 14:35:02 2022
  ..                                  D        0  Sun Sep 18 13:39:04 2022
  code_cities.json                    N     3095  Sat Apr  4 12:19:20 2020
  tochigi.json                        N      405  Sun Aug  7 19:53:58 2022
  cities.json                         N      944  Wed Aug  3 14:41:21 2022

		102687672 blocks of size 1024. 34773172 blocks available
smb: \> exit
```

共有名 plain_text にアクセス

```text
$ smbclient //localhost/plain_text  -U uchida%password
Try "help" to get a list of possible commands.
smb: \> ls
  .                                   D        0  Fri Apr 24 11:00:46 2020
  ..                                  D        0  Sun Sep 18 13:39:04 2022
  cities.txt                          N      267  Wed Jan 26 09:44:06 2022

		102687672 blocks of size 1024. 34773056 blocks available
smb: \> exit
```

設定ファイルを、

```text
[json]
   comment = json
   path = /var/tmp/json
   browseable = yes
   read only = no
   guest ok = no
```

とすると、

```
$ smbclient //localhost/json -U uchida%password
tree connect failed: NT_STATUS_ACCESS_DENIED
```

となります。

解決するには、

```text
$ sudo smbpasswd -a uchida
New SMB password:
Retype new SMB password:
Added user uchida.
```

Samba のパスワードファイルに登録されているユーザーの確認

```text
$ sudo pdbedit -L
uchida:1200:uchida
```
CLIP STUDIO PAINTのショートカットキーで「これってどこで設定するんだっけ？」ってなりやすいやつ

# すべてのパレットの表示非表示切り替え

パレット群を下記のように出したり…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/f8ae8a56-360b-4f26-581b-d292a9f3c94a.png)

逆に下記のように引っ込めたり（畳んだり） をする動作のショートカット。
**初期値でタブに割り当てられてるやつ**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/938759e4-6e24-5533-a99e-2b43861d1647.png)

どうもキーボードの場合、タブ以外に割り当てできないらしい。
（ショートカットキーの設定を見てみたが、それらしい項目は見当たらず）

でもTABMATE（左手デバイス）だと、ウィンドウ⇒すべてのパレットを表示する で割り当て可。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/bcbcd886-de1f-0580-55a2-9cd27063d316.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/5df8752f-959e-c47b-a0a9-e122a4de0c3b.png)

# バージョン

Windows 10 Home 21H1 OSビルド 19043.2006
CLIP STUDIO PAINT PRO （64ビット） 1.12.3 202206201552
vim-sonictemplate の使い方

# この記事は？
vim-sonictemplate の使い方の備忘録。

# 本文
## インストール方法
自分の場合は `dein.toml` で管理しているので以下のように記述しています。

```dein.toml
[[plugins]]
repo = 'mattn/vim-sonictemplate'
```

## 使い方
### テンプレートの挿入
`:Template {snippet_name}` でスニペットを挿入できます。ファイルを新しく開いたとき　(ファイルが空の時) は `base-` から始まるテンプレートから選択可能です。

すでにファイルに何か書き込まれているときには `snip-` から始まるスニペットを挿入可能です。インデントの中でスニペットを使いたいときにはインサートモードを維持したまま `<c-y>t {snippet_name}`　と入力するとインデントの中で中でスニペット挿入ができます。

### テンプレートの追加
#### テンプレートファイルの名称と置き場所
テンプレートは `base-` をつけて作成するとファイル新規作成時のテンプレートに、`snip-` をつけて作成すると作成済みファイルに挿入するスニペットになります。ファイルを置く場所は `vim-sonictemplate/template/{language}` 以下におけば　OK です。`{language}` 部分は例えば `go` とか `python` とかです。なお、自分で適当に作ったフォルダの中に置いて、vim-sonictemplate にそこを参照させることもできます (後述)。

#### テンプレート作成時のオプション
##### 代入系
- `{{_name_}}`: ファイル名を自動挿入します
- `{{_input_:variable_name:default}}`: 挿入位置の値をインタラクティブに入力できます。`variable_name:` という入力フォームが出るのでそこに値を入れます。そのままエンターキーを叩くと `default` に設定した値が挿入されます
- `{{_expr_:hoge}}`: `hoge` 部分に vimscript を挿入できます。vimscript の戻り値が入力されます
- `{{_if_:expr;foo;bar}}`: vimscript で三項演算子を規定します。`expr` の評価が `true` なら `foo`、`false` なら `bar` が挿入されます

##### その他
- `{{_cursor_}}`: スニペットを打ち込んだ後にカーソルが置かれる場所を指定できます
- `{{_inline_}}`: スニペットをワンライナーで挿入します
- `{{_filter_:hoge}}`: 通常アルファベット順にサジェストされるスニペットにおいて `hoge` が含まれるスニペットを上位にサジェストする

## custom settings
### テンプレートを置くディレクトリを指定したい場合
`sonictemplate_vim_template_dir` 変数を変更します。なお、ドキュメントを読む感じこの引数はリストでも渡すことができるので、複数のディレクトリに分散してテンプレートを置くこともできそうです。

```dein.toml
[[plugins]]
repo = 'mattn/vim-sonictemplate'
hook_add = '''
  let g:sonictemplate_vim_template_dir = '/root/.config/nvim/templates'
'''
```

# 参考
- [mattn/vim-sonictemplate](https://github.com/mattn/vim-sonictemplate)
- [インデントの中でのスニペットの挿入](https://github.com/mattn/vim-sonictemplate/issues/3)
【備忘録】URPのプロジェクトをWebglでビルドしたらPostEffectが動かなかった

Unity1WeekでURPのプロジェクトをWebglでビルドしたときにPostEffectがうまく機能しなかったので備忘録として投稿してみます。Qiitaは初めましてなのでご容赦を。

## ことの発端
Unity1Week用のゲームが遅れつつも完成したので余裕の顔でウーロン茶を飲んでいた時のこと。
残すはビルドして動作確認するだけだったのでとりあえずビルドしてみると...

なんだか画面の様子がおかしい。
動作自体は問題ないけれどBloomやAmbientOcclusion、つまりPostEffectがうまく動作していない。
なんてこった。

## 原因を探る
私の場合はEditorで問題なく動いているため、URPの設定ではなくWebglの設定がおかしいと判断。
念のため自前のURPAseetも見直してみましたが特におかしな場所はなし。
Editorで動かない場合はまた別の対処が必要ですね。

## 解決

ProjectSetting->Qualityを見てみます。
Webglにビルドする時のQualityLevelはMedium。
High用のURPAseetをいじくりまわしても当然Webglには反映してくれないです。(私はここで数時間無駄にしました)
![スクリーンショット (168).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2849528/bf550896-c8e9-4e63-ae02-4561d9a6b76f.png)

Rendering->RenderPipelineAseetにはデフォルトのURPAseetが入っているのでこいつを少しいじって直そうと思います。
High用のURPAseetは自作していましたがMedium用は作っていなかったのでここは少々手抜きです。
制作の時間に余裕があるなら自作お勧めします。

デフォルトで用意されている**UniversalRP-MediumQuality**を開いてお好みに設定します。
特にいじる必要もないと思いますが、私は深度バッファを使ったシェーダーを書いていたのでDepthTextureにチェックを入れました。

続いてこれまたデフォルトで用意されている**ForwardRenderer**を開いて設定します。
私の場合はAmbientOcclusionを追加してPost-processingにチェックを入れておきました。

これでWebglにビルドしてもPostEffectが正常に動作します。

## おわりに
やったことをそのまま書いただけなのでおそらくもっといい方法はあると思います。
それでは皆様よきUnityライフを！
psycopg3の「AttributeError: partially initialized module 'psycopg' has no attribute 'connect' (most likely due to a circular import)」でハマった


# 発生事象
以下のスクリプトを実行しようとしたところエラー発生

```python:select.py
import psycopg;

con = psycopg.connect(
    host = 'mydomain.jp',
    port = 5432,
    dbname='sample',
    user='admin',
    password='sample');
```

```bash
$ python3 select.py 
Traceback (most recent call last):
  File "select.py", line 1, in <module>
    import psycopg;
  File "/usr/local/lib/python3.8/site-packages/psycopg/__init__.py", line 9, in <module>
    from . import pq  # noqa: F401 import early to stabilize side effects
  File "/usr/local/lib/python3.8/site-packages/psycopg/pq/__init__.py", line 16, in <module>
    from . import abc
  File "/usr/local/lib/python3.8/site-packages/psycopg/pq/abc.py", line 11, in <module>
    from .._compat import Protocol, TypeAlias
  File "/usr/local/lib/python3.8/site-packages/psycopg/_compat.py", line 8, in <module>
    import asyncio
  File "/usr/local/lib/python3.8/asyncio/__init__.py", line 8, in <module>
    from .base_events import *
  File "/usr/local/lib/python3.8/asyncio/base_events.py", line 23, in <module>
    import socket
  File "/usr/local/lib/python3.8/socket.py", line 52, in <module>
    import os, sys, io, selectors
  File "/usr/local/lib/python3.8/selectors.py", line 12, in <module>
    import select
  File "/workspaces/scrapy_fd/select.py", line 5, in <module>
    con = psycopg.connect(
AttributeError: partially initialized module 'psycopg' has no attribute 'connect' (most likely due to a circular import)
```

# 原因
モジュール、必須ライブラリなどもっともらしいことを疑ったが、結果は「ファイル名」であった。

https://network-beginner.xyz/python_most-likely-due-to-a-circular-import_error

# 対処
コードの修正は不要で、ファイル名を変更するだけで正常に動作した。

select.py→sample.py
macでVSCodeのterminalからコマンド実行した際に`sed: illegal option -- r`なるものが出力されて困る


`sed: illegal option -- r`なるものが出力されて困る

MacでVSCodeのターミナルを開くと、以下のようなものがコマンド実行の都度表示される
デバッグ時にログが混ざってとても見づらい

```
$ pwd
sed: illegal option -- r
usage: sed script [-Ealn] [-i extension] [file ...]
       sed [-Ealn] [-i extension] [-e script] ... [-f script_file] ... [file ...]
/Users/seigo/Desktop/python/
```

よくみたら以下でissueが上がっており、`v1.71.1`では解決している様子

> [[MacOs][Bug][Terminal] sed: illegal option -- r before executing commands](https://github.com/microsoft/vscode/issues/159864)
> @mostafa-yasen a fix should come in v1.71.1 within the week
> Tyriar commented 12 days ago

自分のバージョンを確認すると`v1.71.0`であり該当していた

beforeのバージョン
![スクリーンショット 2022-09-18 13.49.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344880/f21def80-dbd5-7e3f-18b9-745fbe96025c.png)


現時点の最新バージョン（`v1.71.2`）に更新（Code-->更新）すると解決した。

afterのバージョン
![スクリーンショット 2022-09-18 13.52.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344880/0f4e2b2d-8598-acdd-1340-929a00d25e48.png)


# 参考

[[MacOs][Bug][Terminal] sed: illegal option -- r before executing commands](https://github.com/microsoft/vscode/issues/159864)
Bootstrap

# Bootstrapとは
twitter社が開発したWebフレームワーク。
BootstrapはHTML／CSS／JavaScriptから構成される。
Webページでよく使われる、フォーム、ボタン、メニューなどの部品がテンプレートとして使用できる。

# メリット

- 効率性
高速な開発が可能。
HTMLのクラス名を指定するだけでデザインを指定できる。

- モバイルファースト
レスポンシブデザインに対応。

- デザイン性
テンプレートを使用することで、最低限の調整をするだけでデザイン性の確保されたものが実装できる。

# グリットシステム
サイトの横幅を均等に分ける考え方。
bootstrapでは12本のグリッドが存在する。

# Bootstrap参考サイト
このページである程度のことはできる。はず。

わかりやすいサンプルコード、表示例。
[【初心者必見】Bootstrapのサンプルコードの使い方を解説](https://www.sejuku.net/blog/124167)

よく使うクラス一覧。
[Bootstrapのよく使うクラスまとめておいた！！！！](https://qiita.com/nakanishi03/items/c80a16b9b9796c25f890)
Splunk: ダッシュボードのパネルや列を非表示にする方法


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

### 0. 概要

 Splunk のサーチ結果を Splunk 外のツールで呼び出す場合などに、ダッシュボードに表示されないパネルや列を配置したい場合がまれにあります。
そのようなことを行う方法を今回は紹介します。

### 1. パネルを非表示にする

以下のダッシュボードにおいて、上のパネルを非表示にすることを考えます。

![スクリーンショット 2021-12-19 15.25.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/34172ffd-0fc9-7e5f-7643-b3769848eefc.png "パネル非表示1")

この場合、ダッシュボードの XML ソースを開き、`<row>`の後ろの`<panel>`を`<panel depends="$null$">`に書き換えます。

```Splunk:XML
  <row>
    <panel depends="$null$">
      <title>このパネルは表示したくない</title>
```

![WS000210.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/743c4aaf-f63b-d0e5-d187-a558ffe23bc6.jpeg "パネル非表示2")

これで、上のパネルが表示されなくなりました。

![WS000212.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/d862dc08-4ec0-934f-7872-20eb62bd8a62.jpeg "パネル非表示3")

編集画面では、表示されないパネルは点線で囲って示されます。

![WS000211.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/aa372de8-8f82-ac6c-5e17-2587eea0c441.jpeg "パネル非表示4")

### 2. 列を非表示にする

以下のダッシュボードにおいて、列「 _time 」を非表示にすることを考えます。

この場合、ダッシュボードの XML ソースを開き、`</search>`の後ろに`<fields>["NUM","STR"]</fields>`と書き加えます。
`["NUM","STR"]`の部分は、表示する列に合わせて適宜書き換えてください。

```
        </search>
        <fields>["NUM","STR"]</fields>
        <option name="drilldown">none</option>
```

![WS000214.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/944e6483-ce41-3620-e9a3-3c6bd255cad2.jpeg "列非表示2")

これで、「 NUM 」「 STR 」以外の列が表示されなくなりました。

![WS000215.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/cf4ff7fe-1290-29a9-b381-7cf93d48cea6.jpeg "列非表示3")

列は表示されなくなりましたが、無くなったわけではないです。
該当のサーチを別画面で起動するとわかります。
root権限を使わないpythonのdocker環境を作る

# はじめに
rootを使わないようにしたpythonのdocker環境の作成方法。
それ以外にも、何かとwarningが頻発するため、出ないようになっている（ハズ）。
Dev Container の開発方法も簡潔に追記しています。

## 修正履歴
2025/05/21 新しいバージョンのdockerやpythonでの記述
2025/06/02 VsCode ＋ Dev Container の注意書きを追記＆微調整

## 環境
- windows11 pro 
- wsl2(22.04.3 LTS (Jammy Jellyfish))
- Dockerのバージョン
    - Docker version 27.5.1, build 9f9e405
    - docker-compose version v2.32.4
※Docker Desktop ではありません

## フォルダ構成
```
[projectfolder]
 ├─ compose.yml
 ├─ Dockerfile
 └─ requirements.txt
```

## 各ファイル

```Dockerfile:Dockerfile
# pythonは 3.13 最新
FROM python:3.13

# パッケージ更新(必要があれば他パッケージ等をインストール)
RUN apt-get update

# 設定情報(UID,GIDについてはidコマンドでdockerの実行ユーザーと合わせた方がよい)
ARG USERNAME=pyuser
ARG GROUPNAME=pyuser
ARG UID=1000
ARG GID=1000
ARG WORKDIR=/app

# importが指定ディレクトリからになるためラク
ENV PYTHONPATH $WORKDIR

# ユーザー追加
RUN groupadd -g $GID $GROUPNAME && \
    useradd -m -s /bin/bash -u $UID -g $GID $USERNAME

# フォルダ作成＆管理者設定
RUN mkdir -p $WORKDIR
RUN chown -R $UID:$GID $WORKDIR

# ユーザーのbinaryディレクトリをパスに追加
ENV PATH /home/$USERNAME/.local/bin:$PATH

# ユーザー切り替え
USER $USERNAME

# 作業ディレクトリ設定
WORKDIR $WORKDIR

# パッケージ更新
RUN python -m pip install --upgrade --user pip
RUN python -m pip install --upgrade --user setuptools

# パッケージインストール
COPY requirements.txt $WORKDIR
RUN python -m pip install --user -r requirements.txt

# パッケージインストール（単一でやりたい場合は）
# RUN python -m pip install --user numpy
# RUN python -m pip install --user requests
```

```yaml:compose.yml
services:
  app:
    build:
      context: .
    volumes:
        - ./:/usr/src/app
    restart: always
    environment:
        - TZ=Asia/Tokyo
    tty: true
```

## 調整ポイント
- /usr/src/app はよきところに（ymlとDockerfileは合わせた方がよい）
- UID,GID はホストにあわせて(wslのUbuntuにおデフォルト一般ユーザーは1000のはず)
- vimとかそういうaptのインストール設定はお好みで
- `.env`使って`compose.yml`からパラメータで渡した方が管理はしやすいはず
    - `.env`に定義したものは、 `${PARAM_NAME}` でcompose側に指定できる

## 起動
```
docker compose up -d
```

# VSCode + Dev Container での開発方法
- `Dev Containers` のエクステンションをインストール
- `Ctrl + Shift + P` を押して、  `Dev Containers: Attach to Running Container...` を選ぶ
    - 起動しているコンテナ名を選ぶ
- コンテナにはいったら、まず`Ctrl + K` → `O` でワークフォルダに移動する
- エクステンションはホスト側とは別管理なので、追加でインストールしたり、設定したりする（コンテナを再作成するたびに必要なので、ここは少し面倒）
- import で pylance の警告が出ているときは
    - `Ctrl + Shift + P` を押して、`Python: Select Interpreter` を選ぶ
    - Dockerfileで記述している`FROM`で指定しているpythonを選ぶ

※`Ctrl + Shift + P` で機能を選ぶときは補助で候補の文字を入力したほうが良い
※Macは `Ctrl + Shift + P` ではなく `Cmd + Shift + P`

# 実行ユーザー(UID&GID)
UIDとUIDはcomposeを実行する前にidコマンドで確認（デフォルトのルートレスユーザーは1000が多いはず）
```shell
$ id
uid=1000(naozo) gid=1000(naozo) ...,999(docker)
# この場合は 1000:1000 にする
```
DockerのPythonイメージは、コンテナ内に一般ユーザーを作成してプログラムを実行するのが無難です。特にホストPCのユーザーと権限を合わせておくと、ファイルの扱いで問題が起きにくくなります。

# 最後に
Pythonは、OS環境の違いで動作が不安定になることがありますので、Dockerを使って開発環境と本番環境を統一することをお勧めします。
部分テンプレートにとlayoutについて

テンプレートを作っていくうちに「ここは複数の箇所で使い回しできるなあ」と思う場面があります。
ここではそのような場面に遭遇した時の説明をしたいと思います。

### renderメソッド
viewテンプレート内では
**renderメソッド**を使用することができます。
このrenderメソッドを使用することで、部分テンプレート(パーシャルともいう)の読み込みを行うことができます。

以下簡単な例になります。

```ruby:app/views/_form.html.erb
# 使い回したい検索フォームコード

```

```ruby:app/views/index.html.erb
<p>一覧画面</p>
<%= render 'form', task: @task %>
```

フォームを定義したファイルをindexのテンプレートから呼び出しています。

**render 'form'**
のように記述すると、ファイル名が「_ 」で始まるテンプレートファイルから探索します。
<font color="red">**formと記述しているが、実際に探索するテンプレートファイル名は'_form'となります。**</font>

### layoutテンプレート
layoutテンプレートとは特定の構造をコンポーネントとして共通化する以外に、headタグやよくあるヘッダーやフッターの共通であるのが一般的になります。
そういった「外側」のレイアウトをテンプレートとして扱う仕組みもあります。

以下簡単な例になります。

```ruby:app/views/show.html.erb
# テンプレートしたいコード
```

```ruby:app/views/layouts/application.html.erb
<body>
  <%= yield %>
</body>
```

**このようにすることでyieldの部分にテンプレート化したいコンテンツが展開されるようになりました。**
【Linux】アクセス権と所有者&グループの変更方法

## 初めに
よく忘れるのでアクセス権と所有者&グループの変更方法をまとめました。
よかったら見てください。
## アクセス権と所有者について
ファイルやディレクトリを作成すると、作成したユーザーがその所有者となります。
また権限は、ユーザーが属しているグループが所有グループとなります。
アクセス権や所有者は、`ls -l`コマンドで確認することができます。


```bash
// アクセス権と所有者の確認
$ ls -l testfile

// 結果
-rw-r--r-- 1 testuser testgroup 21 Jan 16 17:30 testfile

// 結果項目の説明
ファイル権限 所有権　所有者 ハードリンク数 グループ 更新日時 ファイル名
```

## 解説
それでは権限と所有者について説明します。
アクセス権は、「読み取り権」「書き込み権」「実行権」の3種類があり、
それぞれ数字とアルファベットで表すことができます。

| アクセス権 | 数字 | アルファベット |
| --- | :---: | :---: |
| 読み込み権 | 4 | r |
| 書き込み権 | 2 | w |
| 実行権 | 1 | x |
<br>

上記ファイルの結果である`-rw-r--r--`について解説します。
まず1文字目はファイル種別を表します。
| 種別 | 意味 |
| :---: | :---: |
| - | ファイル |
| d | ディレクトリ |
| \| | シンボリック |

<br>
次に2文字目から10文字目がアクセス権を表します。

アクセス権の設定内容は下記になります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521366/b766597e-3745-1fb4-83d3-5190113fa3bb.png" width="600">
また、アクセス権は数字でも表すことができ、その場合は下記になります。
数字に関して、各種権限に設定された数値を足し合わせた値が設定値になります。
(この表記をアクセス権変更時に使用します)
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521366/d3680125-b87f-669c-8405-bfafed9824f0.png" width="600">


所有者とグループについて説明します。
`testuser testgroup`の部分ですが、`所有者 所有グループ`になります。

よってファイルの情報`-rw-r--r-- testuser testgroup`をまとめると以下のようになります。
・種別：ファイル
・所有者：testuser
・所有グループ：testgroup
・所有者権限：「読み込み可能」「書き込み可能」
・グループ権限：「読み込み可能」
・その他ユーザー権限：「読み込み可能」

## アクセス権の変更
書式は下記になります。
アクセス権を変更できるのは、ファイル所有者とrootユーザーのみになります。
`-Rオプション`を付けると、指定したディレクトリ以下のすべてのファイルのアクセス権を
一度に変更できる。
```bash
chmod [-R] アクセス権 ファイル名またはディレクトリ名
```
使用例は下記になります。
```bash
//　アクセス権変更
chmod -R 742 testfile

// 結果
-rwxr---w- 1 testuser testgroup 21 Sep 18:10 testfile
```
## 所有者と所有グループの変更
所有者と所有グループの変更は、下記コマンドで行えます。
```bash
// 所有者の変更
chown [-R] 所有者 ファイル名またはディレクトリ名

// 所有グループの変更
chgrp [-R] 所有グループ ファイル名またはディレクトリ名
```
使用例は、下記になります。
所有者を「gestuser」に、所有グループを「gestgroup」に変更します。
```bash
// 所有者の変更
chown -R gestuser testfile

// 結果
-rwxr---w- 1 gestuser testgroup 21 Sep 18:15 testfile

// 所有者グループの変更
chgrp -R gesgroup testfile

// 結果
-rwxr---w- 1 gestuser gestgroup 21 Sep 18:17 testfile
```
<br>

また、所有者と所有グループを同時に変更する場合は、下記コマンドが使えます。
```bash
chown [-R] 所有者:所有グループ ファイル名またはディレクトリ名
```

## 最後に
アクセス権と所有者の設定方法についてまとめました。
もし間違っている箇所等ある場合、ご指摘いただければ嬉しいです。

## 参考
https://www.shoeisha.co.jp/book/detail/9784798146379
https://eng-entrance.com/linux_command_ls#-l
https://qiita.com/shisama/items/5f4c4fa768642aad9e06
https://lanchesters.site/linux-ls-new/
【TypeScript】型定義ファイルのないライブラリのインポートエラーについて【React】

<h2>１）はじめに</h2>
JavaScriptで作成していたポートフォリオをTypeScriptへ置換してた際に発生したエラー。

package.jsonに使用するライブラリを記載(今回の場合はreact-anchor-link-smooth-scroll)
しているにも関わらず、赤線でエラーの表示。
![スクリーンショット 2022-09-18 10.12.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1076062/7df997ca-556e-2753-f098-1a459a1f5b40.png)

<h2>2）Why??</h2>
調べてみると、JavaScriptには型定義は存在しないので問題ないが、TypeScriptには型定義が存在するので
型定義ファイルがないJavaScriptライブラリを使用するとこのようなエラーが発生するみたい。

つまり型を定義すると解決するエラー。
上記のエラー文を読んでみると解決方法が二通りあって、
1)```npm i --save-dev @types/{モジュール名}```を実行する。
2)```declare module '{モジュール名}'; を含む新しい宣言 (.d.ts)```ファイルを追加する。
このどちらかで解決できるとのこと。

<h2>3）npm i --save-dev @types/{モジュール名}を実行</h2>
とりあえずこっちをやってみるとまた別のエラーに遭遇。

![スクリーンショット 2022-09-18 10.32.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1076062/ba86795d-d9d0-6bd0-5f1c-c42497ee6659.png)
react-anchor-link-smooth-scrollはTypeScript用の型定義ファイルが用意されていないので、エラーになってるのかな？？と推論。
今回はもう一つのやり方があるのでそちらをやってみる。

<h2>２）declare module '{モジュール名}'; を含む新しい宣言 (.d.ts)ファイルを追加する</h2>
下記階層にTypesディレクトリを作成。(ディレクトリ構成はアプリの構成によって変わりますので皆さんの環境で試して見てください)

```bash
$ mkdir front/app/types
```

その中に```Types.d.ts```ファイルを作成する。（```d.tsファイル```は型定義ファイルのことを指します。）

```Types.d.ts
// 型定義
declare module 'react-anchor-link-smooth-scroll' {
  interface Props {
    href: string;
    offset?: function | number;
    onClick?: (e: Event) => void;
    [key: string]: any;
  }

  export default class AnchorLink extends React.Component<Props> {}
}
```

これで無事に赤線エラーは消えました！

![スクリーンショット 2022-09-18 10.58.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1076062/d4e4a6d2-bc9c-0b50-e8d2-5cd2f22a1093.png)

<h2>参考にした記事</h2>

https://zenn.dev/ymmt1089/articles/20220429_interface

https://qiita.com/kazama1209/items/868c09393007cc9b234f
Next.js 参考資料一覧

## サンプルコード
https://github.com/vercel/commerce/tree/main/site

https://zenn.dev/catnose99/scraps/ea09df5ca3761a

## API関連
https://off.tokyo/blog/serversideprops-api/

## サーバー関連
https://www.boel.co.jp/tips/vol63/

## ファイル管理
https://qiita.com/hinako_n/items/6a5083ae32f6b4831cdf

## ユーザ認証
https://github.com/jchiatt/nextjs-basic-auth

https://zenn.dev/tatsuyasusukida/articles/981a61bca873da

## DB

https://zenn.dev/waddy/books/graphql-nestjs-nextjs-bootcamp/viewer/nestjs_prisma_local

https://zenn.dev/damono999/articles/bd203095b7b883


## bootstrap

https://zenn.dev/thao_0108/articles/273e7630e988991dd759
kaminari

# kaminariとは
ページネーションの実装を簡略化するためのgem。

# ページネーションとは
長くなってしまったWebページを分割するもの。
ページ数の書かれたリンク。

![スクリーンショット 2022-09-18 11.19.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1566824/e1bff68e-640f-b018-ef22-aab863fef02d.png)

# 実装手順

__gemをインストールし、gコマンドでconfig/initializersディレクトリに生成。__
```ruby:
# gemfile
    gem 'kaminari'

# ターミナル
    bundle install
    rails g kaminari:config
```

__1ページあたりに表示するレコード数(表示される項目の数)を指定する。__
(下記コードではレコード数100)
```ruby:config/initializers/kaminari_config.rb
# レコード数を10に指定
Kaminari.configure do |config|
  config.default_per_page = 10
end
```
__indexアクション内で一覧取得、pageスコープを使用__

```ruby:hoge.controller.rb
  def index
    @hoges = Hoge.all.includes(:user).order(created_at: :desc).page(params[:page])
  end
```
一覧表示でページネーションを表示させるために、paginateヘルパーを使用する__

```ruby:views/index.html.erb
  <%= paginate @hoges %>
```


# 代表的なメソッド
- __paginate__
paginateヘルパーを使うと複数のページネーションリンクを表示できる

- __page__
ページ数を指定するメソッド。
kaminariを導入したことにより、リクエストの際paramsの中にキーであるpageが追加されている。その値がビューで指定したページ番号となり、pageの引数は(params[:page])となる。

- __per__
1ページあたりに表示する件数を指定できる。
perメソッドに引数として渡した数値が、1ページに表示するレコード件数となる。




<br>

参考サイト
[【Rails】kaminariの使い方をざっくりまとめてみた](https://zenn.dev/yukihaga/articles/3d49208638e397)
【背伸び初心者授業②】explode()の小技！explode()したものに変数を振り当てる

## 「ロミオとジュリエット」から読み解くexplode()
ロミオとジュリエットを例に、phpの関数であるexplode()を解説していきます。
```php
$couple = "ロミオとジュリエット";
```
有名なカップルですね。それではこの２人を`引き剥がし`ましょう。
```php
$couple = 'ロミオとジュリエット';

$people = explode('と', $couple);
var_dump($people);

// 出力内容
array(2) {
  [0]=>
  string(9) "ロミオ"
  [1]=>
  string(18) "ジュリエット"
}
```
使い方はなんとなく理解いただけたでしょうか？
これでいろんなカップルを分けることが出来ますね！

## 本題 : explode()したものに変数を振り当てる。
ロミオとジュリエットを男女で分けたいな...そんなあなたに朗報です。
ロミオを`$man`へ、ジュリエットを`$woman`に入れる方法があります。


```php
$couple = 'ロミオとジュリエット';

[$man, $woman] = explode('と', $couple);
echo $man . 'は山へ柴刈りに' . $woman . 'は川へ洗濯に行きました。' ;

// 出力内容
ロミオは山へ柴刈りにジュリエットは川へ洗濯に行きました。
```
簡単に山と川で役割分担できましたね！
どんどん色んなカップルに仕事を振り分けていきましょう！


```php
$couples = [
    'ロミオとジュリエット',
    '彦星と織姫',
    '林家ぺーと林家パー子',
];

foreach ($couples as $couple) {
    [$man, $woman] = explode('と', $couple);
    echo $man . 'は山へ柴刈りに' . $woman . 'は川へ洗濯に行きました。' ;
    echo "\n"; // ←改行
}
// 出力内容
ロミオは山へ柴刈りにジュリエットは川へ洗濯に行きました。
彦星は山へ柴刈りに織姫は川へ洗濯に行きました。
林家ぺーは山へ柴刈りに林家パー子は川へ洗濯に行きました。
```
みんな働き者ですね！
これでなんとなくexplode()の小技である変数の振り当てが理解できたかと思われます。

## あとがき
昔は使い方を知っていたはずなのに、使わなくなった途端
おぼろげになったり、忘れてしまったりしてしまうものです。
このexplode()の小技も忘れてしまうかもしれませんが（私も忘れていました。）
「ロミオとジュリエット」を見るたびフラッシュバックしていただけますと幸いです。
【Homebrew】コマンド一覧

## `update`

Homebrew 自体を更新します。

```zsh
brew update
```

特定のコマンドを実行した際に`HOMEBREW_AUTO_UPDATE_SECS`の間隔で自動実行されます。
デフォルトは300秒です。
`brew update`が実行されてから300秒経過すると`brew install`, `brew upgrade`, `brew tap`などの前に自動実行されます。

```zsh:ターミナル
$ brew upgrade
Running `brew update --auto-update`...
==> Auto-updated Homebrew!
Updated 1 tap (homebrew/cask).
```

自動実行を無効にする場合には`HOMEBREW_NO_AUTO_UPDATE`を設定します。

## `install`

formula をインストールします。

```zsh
brew install formula名
```

MacOSのアプリケーションをインストールする際には以下のように実行します。

```zsh
brew install --cask cask名
```

## `upgrade`

インストールされている formula を更新します。

以下のように実行するとインストールされているすべての formula が更新されます。

```zsh
brew upgrade
```

特定のformulaを更新する場合は以下のように formula 名を指定します。

```zsh
brew upgrade formula名
```

## `outdated`

更新可能な formula の一覧を表示します。

```zsh
brew outdated
```

## `list`

Homebrewでインストールした formula の一覧を表示します。

```zsh
brew list
```

## `info`

formula に関する情報を表示します。

```zsh
brew info formula名
```

## `deps`

formula の依存関係を表示します。

以下のように実行するとインストールされている全 formula の依存関係をツリー表示します。

```zsh
brew deps --tree --installed
```

また以下のように実行すると特定の formula の依存関係をツリー表示します。

```zsh
brew deps --tree formula名
```

## `uninstall`

formula をアンインストールします。

```zsh
brew uninstall formula名
```

## `autoremove`

他の formula の依存関係としてのみインストールされ不要となった formula をアンインストールします。

```zsh
brew autoremove
```

`HOMEBREW_AUTOREMOVE`を設定すると`brew cleanup`, `brew uninstall` を実行した際に`brew autoremove`が自動実行されます。
また`HOMEBREW_CLEANUP_MAX_AGE_DAYS`間隔の`brew cleanup`定期実行時にも自動実行されます。
ただし`HOMEBREW_NO_INSTALL_CLEANUP` が設定されている場合には`brew cleanup`が定期実行されないため自動実行されません。

## `cleanup`

formula や cask のキャッシュを削除します。
またインストールされている formula の古いバージョンを削除します。
デフォルトでは120日以上前のダウンロードをすべて削除します。
この日数は`HOMEBREW_CLEANUP_MAX_AGE_DAYS`で変更できます。

以下のように実行するとすべての formula や cask に対して`cleanup`します。

```zsh
brew cleanup
```

`brew install`, `brew upgrade`, `brew reinstall` を実行すると自動実行されます。
自動実行の間隔は`HOMEBREW_CLEANUP_PERIODIC_FULL_DAYS`で設定できます。
デフォルトは30日です。
自動実行を無効にする場合には`HOMEBREW_NO_INSTALL_CLEANUP`を設定します。
特定の formula のみ無効にする場合には`HOMEBREW_NO_CLEANUP_FORMULAE`を設定します。

## `doctor`

システムに問題がないかチェックします。

```zsh
brew doctor
```