OmniAICreator/Qiita-1.07M huggingface dataset:
docker Operation not permitted & The path is not shared from the host and is not known to Docker.

### 背景

 Redmine on Docker にプラグイン導入を簡単に, https://qiita.com/hadacchi/items/ca10939ca016147e225a を参考に Redmine Containerを建てようとすると下記事象に遭遇した。両者に遭遇すると原因が良く分からなくなるので、事象ごとの対策を記載しておく。
 
 環境: Ubuntu22.04 + Docker Desktop  

### 事象と対策

#### 事象 1. Operation not permittedとなる。
``` shell
root@xxxxxx:/mnt/c/Users/xxxxx/docker/redmine# docker-compose up  //WSL2のconsoleだがUbuntu22でも同様のErrorとなる。
[+] Running 3/3
 ⠿ Network redmine_default      Created                                                                            0.1s
 ⠿ Container redmine-pdb-1      Created                                                                            0.1s
 ⠿ Container redmine-redmine-1  Created                                                                            0.2s
Attaching to redmine-pdb-1, redmine-redmine-1
redmine-pdb-1      | chmod: /var/lib/postgresql/data: Operation not permitted
redmine-pdb-1      | The files belonging to this database system will be owned by user "postgres".
```
原因: ホストOSで使っているユーザとコンテナ内で使っているユーザのUIDとGIDが不一致になるため [1]  
対策:
* 先にホスト側でディレクトリを作成しない。
* docker-compose upで、先にコンテナ内のUID/GIDを持つディレクトリをホスト側に作成し、更にchmod 777 * で権限を持たせる。

備考: WSL2 環境だとUID/GIDを自動生成してくれないので注意。Ubuntu22はディレクトリが無い場合に自動生成してくれる。

[1] Dockerのvolumeでpermission deniedが発生した場合の解決法, https://tech-blog.rakus.co.jp/entry/20200826/docker



### 事象 2. hostからcontainerへpathが共有されていない
``` shell
test@test-virtual-machine:~/Downloads/redmine$ docker-compose up
Removing redmine_pdb_1
Recreating 94ba35a425ab_redmine_pdb_1 ... error

ERROR: for 94ba35a425ab_redmine_pdb_1  Cannot start service pdb: Mounts denied: 
The path /opt/server/postgres is not shared from the host and is not known to Docker.
You can configure shared paths from Docker -> Preferences... -> Resources -> File Sharing.
See https://docs.docker.com/ for more info.
```
対策: Docker DesktopのSetting > Resources > File sharing にてpathを共有する[2]

[2]  Docker compose up -d のエラー対処法 Error response from daemon Mounts denied The path backend is not shared from the host and is not known to Docker, https://poppotennis.com/posts/docker-error-host-is-not-known


### その他

* ホストまたはコンテナ側のUID/GIDを変更する方法もあると思うが良く分かっていない。
* Ubuntuで作成したContainerをWSL2上で動かす時にもハマるので注意。
* WSL2の場合はrootで動画させた方が良いかもしれない,https://futureys.tokyo/how-permission-should-be-set-for-developing-inside-a-container-using-wsl-2/
aws lambda に docker imageを cdkでデプロイしたメモ

## 概要
dockerイメージであげたことがなかったのでやってみた。
AIも使ってみたけど、結構いい感じにアドバイスしてくれる。

## AIくんに聞いてみる
ちょうどNotionAIを導入したところだったので聞いてみた。
下記コードを書いてれた。賢い。Python書いたことほとんどないので助かる。
公式ベースを使う形。

```ts:cdk.ts
import * as cdk from 'aws-cdk-lib';
import * as lambda from 'aws-cdk-lib/aws-lambda';
import { DockerImageFunction } from 'aws-cdk-lib/aws-lambda-docker';

const app = new cdk.App();
const stack = new cdk.Stack(app, 'LambdaDockerStack');

const dockerImage = lambda.DockerImageCode.fromImageAsset('./', {
  cmd: ['app.handler'], // Pythonファイルのエントリーポイントを指定
});

new DockerImageFunction(stack, 'LambdaFunction', {
  code: dockerImage,
  memorySize: 512,
  timeout: cdk.Duration.seconds(30),
});
```

```docker:Dockerfile
FROM public.ecr.aws/lambda/python:3.8
COPY app.py ${LAMBDA_TASK_ROOT}
CMD [ "app.handler" ]
```

```app.py
import sys
def handler(event, context):
    return 'Hello from AWS Lambda using Python' + sys.version + '!'
```

## デプロイ

デプロイすると、Lambdaが作成される。
テスト実行で、 `Hello`が返ることを確認できた。

なお、デプロイでイメージはECRにアップロードされる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/3fc9bd20-7312-13b5-25b8-f06735f1d953.png)

## 代替ベースイメージからの作成
公式イメージ以外からの作成も試してみる。
[ソース](https://github.com/hibohiboo/aws-cdk-v2/commit/c53a21de7597de340ad33bf6ed0b598eda55a36c)
フォルダは[デフォルト](https://github.com/hibohiboo/aws-cdk-v2/commit/c53a21de7597de340ad33bf6ed0b598eda55a36c)と同じ`/var/task`を使ってみた。

```docker:Dockerfile
FROM python:3

WORKDIR /var/task
COPY app.py /var/task

# lambda実行用
RUN pip install awslambdaric

ENTRYPOINT [ "/usr/local/bin/python", "-m", "awslambdaric" ]

CMD [ "app.handler" ]
```






## 参考

[公式](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/python-image.html)
[代替ベースイメージからのイメージの作成](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images-create.html#images-create-from-alt)
[マルチステージビルドの利用](https://matsuand.github.io/docs.docker.jp.onthefly/develop/develop-images/multistage-build/)
システム開発におけるアーキテクトについて考える

# アーキテクトとは

システム開発において、要件と照らし合わせ今の置かれている状況（要員、コスト、納期など）をもとに適切な設計をを選択し開発の標準・基本を作り上げる担い手


1点集中の深い知識より、幅広い知識を持ち変化に柔軟であり全員を引っ張っていく必要もあるためリーダシップがある人が適しているといわれている。


# いいアーキテクトになるポイント

- 常に最新の技術を追いかける技術的な欲求が高い
- 優れたアーキテクチャパターンのメリット・デメリットをいくつも理解している人
- 最善 ≠ ベストではないことを理解している。
    - アーキテクチャは常に進化しておりその時に最善であってもいずれすたれてくる。
　　最善を求めるとコストや労力に跳ね上がってくるが見合った成果が得られるのは一瞬。 
    - ベストなものは最低ではなく変更が容易で進化していくことができるアーキテクチャ
- リーダシップをとりチームに取り組むべきビジョンを見せること


# 向かない人
- 確証バイアスに陥りやすい人
- 設計指針を遵守できない人（常日頃よりルールを守らない人）
    - ルールが悪いとしてルールを変えることに力を入れずに、ルールを準拠しない方向に傾く人
    - 遺脱した状態で放置するといずれ負債となって延々とシステム開発・運用に闇を持ちづづけることになる




# NGパターン
時代はマイクロサービスでしょ！
⇒モノリシックにもいいものはあり、ケースバイケース

アジャイルじゃない？
⇒アジャイルは開発中のプログラマを幸せにする可能性は高いが、ビジネスにおいては幸せにならない可能性が高い。
　アジャイルで開発するべきではないフェーズ・要件で無理やりアジャイル開発を行い納期・コストが２倍になったとかはよくある話。
　納期が延びてビジネスが失敗すると会社にもプログラマも幸せではない。

とりあえずサーバレス構成で構築するとコスト安くなっていい！
⇒やりすぎると、各構成やサービスの構成がカオスになり、人の運用費用が増加して大変。。。



# まとめ

アーキテクチャがシステム構成を決めるのではなく、ビジネス要件・システムの課題がアーキテクチャを決めるもの。
どうやってが優先されるのではなく、なぜから解決策（適したアーキテクチャ）を見つけるべき。



短いのでもうちょっと追記＆きれいします。。。
【Zsh】コマンド履歴から補完する方法


## はじめに

zsh-autosuggestionsを使用すると以下のようにコマンド履歴に基づいて補完できます。  

![スクリーンショット 2022-12-09 19.57.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/f804649c-c59a-20a6-635b-47c75d1b080f.png)


zsh-autosuggestionsの導入方法について記載します。  

## 導入方法

以下のコマンドを実行してzsh-autosuggestionsをクローンします。  
パスは任意です。  

```terminal
git clone https://github.com/zsh-users/zsh-autosuggestions ~/.zsh/zsh-autosuggestions
```

`~/.zshrc`に以下を追記します。  

```.zshrc
source ~/.zsh/zsh-autosuggestions/zsh-autosuggestions.zsh
```

記述後に`.zshrc`を再読み込みします。  

```terminal
source ~/.zshrc
```

するとコマンド履歴に基づいて補完できるようになります。  

![スクリーンショット 2022-12-09 19.57.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/f804649c-c59a-20a6-635b-47c75d1b080f.png)

候補が表示された状態で「→」を押下すると候補が自動で入力されます。

### Oh My Zshを使用する場合

#### Oh My Zshをインストール
まずOh My Zshをインストールします。  

以下のいずれかのコマンドを実行します。  

- curl

```terminal
sh -c "$(curl -fsSL <https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh>)"
```

- wget

```terminal
sh -c "$(wget -O- <https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh>)"
```

- fetch

```terminal
sh -c "$(fetch -o - <https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh>)" 
```

上記のコマンドを実行すると既存の`.zshrc`は`.zshrc.pre-oh-my-zsh`に変更されます。  

#### zsh-autosuggestionsをクローン

zsh-autosuggestionsを次のコマンドでクローンします。  

```terminal
git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions
```

`ZSH_CUSTOM`のパスか設定されていなければ`~/.oh-my-zsh/custom`以下にクローンされます。  

#### `.zshrc`に設定を記述

zsh-autosuggestionsを使用可能にするため`.zshrc`を編集します。  

```.zshrc
...

plugins=( 
    # other plugins...
    zsh-autosuggestions
)

...
```

記述後に`.zshrc`を再読み込みします。  

```terminal
source ~/.zshrc
```
IoTシステムの全体像⑥〜データ活用〜

# はじめに
毎週1本様々な技術に関する記事を投稿しています。
もし興味のある方は下のリンクから他の記事も見ていただければ幸いです。
 [@7_inai_](https://qiixta.com/7_inai_)

# IoTシステムの全体像
IoTシステムでは次のような順でデータが流れていきます。
`①データ収集 -> ②データ通信 -> ③データ可視化 -> ④データ蓄積 -> ⑤データ分析 -> ⑥データ活用`
6つの記事に渡ってそれぞれのセグメントについてまとめていきますが、この記事では「⑥データ活用」について記述します。

# データの活用について
これまで5つの記事にわたってIoTシステムで取得したデータの流れについて解説してきました。最後となるこの記事では、__収集したデータを実際にどのように活かすのか？__ に焦点を当てて、IoTを活かした事例について紹介していきます。

# スマートホーム
スマートホームとは、最新のテクノロジーを駆使して快適な生活を実現する住宅のことです。例えば、スマホの位置情報を用いて、帰宅前に自動でエアコンの電源を入れることや、家から遠く離れた場所から家の鍵を掛けたかを確認することができます。
また、総合電機メーカーのPanasonicにはHomeXというスマートホームを実現する基盤システムがあります。一般的な家電のほぼ全てを自社開発している総合電機メーカーならではのシステムで、家電同士を連携させたり、一つのリモコンで様々な製品を操作することができます。

# カンバン方式を効率UP
トヨタ発祥の生産方式として、カンバン方式と呼ばれる「必要な時に必要なだけ作る」作業方式があります。しかし、昔より生産効率が複雑になったことで、従来のカンバン方式ではデータの収集が困難となりました。そこで使用されるのがIoTです。機械にセンサーを取り付けることで、不良品の検出や原因分析を行い、データ収集効率化を実現します。

# 睡眠管理
指にはめるだけで、毎日の睡眠や体調を管理できる指輪型のIoT機器を紹介します。睡眠中の心拍数・睡眠段階・睡眠時間・睡眠スコアなどを記録し、自身の健康管理に役立てることができます。

# 終わりに
IoTシステムで取得したデータの活用について、家電・製造業・医療という3つの分野に分けて紹介しました。今回は3分野のみについて書きましたが、IoTはどの分野でもどんな製品であっても切り離すことができないシステムとなってきています。また、IoTによる変革はまさに製品のレベルを一段階上げるような変革です。今後もIoTを活かした多くの製品が開発されるでしょう。


最後までお付き合いくださりありがとうございました。
Pythonコース2周目の世界線1

2周目の1日目：一通りProgateのPythonコースが1周終わったので今日から2周目やっていくぞ！！


◎復習兼メモ◎

リスト.append(値)　　←[]じゃなくて()だゾ！！！

for文・・・「for 変数名 リスト:」

辞書・・・変数名 = {キー:値,キー:値,キー:値}  ←[]じゃなくて{}※ややこしいけど覚えるんや…。

辞書の繰り返し処理・・・「for 変数名 in 辞書:」※for文けっこう間違えてるから要復習

while文・・・「while 条件式:」例えば「while x <= 100」みたいな感じ。条件式がFalseになるまで繰り返す。無限ループに注意！！特にインデントに気をつける。
※forとwhileは「=」いらん



------------------------------------------------

2周目Pythonコースの1と2が終了。思ったよりスムーズに解けた。ナイスってかライス🌟
こうなってくるとコロンつけてなかったりインデント間違ってたりのケアレスミスがけっこう出てきたから気をつけること。
1周目と比べて答えを見ないでできるようになったのも大きいと思う。今回答え一回も見なかった。えらい！！！
会社で試しに業務が効率化できるように色々作ってみてるけど時間が溶けるくらい楽しい。特にちゃんと動いたときの達成感といったらもうね。
悩む時間さえも楽しくなってきたZE🌟
Intellij にて ビルドするボタンがグレーアウトした時の対処法 (Maven)

# 環境
IntelliJ Community Edition 2022.3.2
Windows 11

# 目次 

- pom.xml が適切な位置に配置されているかを確認
 - .idea と "project name".iml の削除 （削除ののち自動生成）
 - build の Run 設定

# pom.xml の位置
プロジェクトのルートディレクトリが正位置
(pom.xml が複数個ある場合はケースバイケース)

#  `.idea`ディレクトリ と `"projectName".iml`の削除
`.idea`はバージョン管理やデバッグ設定を記録したファイルを格納するディレクトリのこと
> [IntelliJ What is the .idea folder?](https://rider-support.jetbrains.com/hc/en-us/articles/207097529-What-is-the-idea-folder-)
> [VCS (Wikipedia バージョン管理システム)](https://ja.wikipedia.org/wiki/%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E7%AE%A1%E7%90%86%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0)

拡張子`.iml`のファイルは、プロジェクトで使用しているライブラリが存在するパスや依存関係などを保持している
> [.iml (OpenTheFile)](https://www.openthefile.net/extension/iml)

これらの再生成、即ちビルドに必要な情報の更新を行う
(何らかの理由により正しい情報が取得できていないことがあるため?)

# Run の設定
通常、ビルドするボタンを押すと `mvn clean package` というコマンドが走る
clean と package という2つのライフサイクル(Lifecycle)を実行している

 - clean : `target`ディレクトリを綺麗にする

- package : `target`ディレクトリにアーティファクトを吐き出す

※IntelliJはデフォルトでアーティファクトを`target`に吐き出すようになっている

> [Maven Artifact](https://maven.apache.org/repositories/artifacts.html)
> [Apache Maven Phase](https://maven.apache.org/guides/getting-started/maven-in-five-minutes.html#maven-phases)

これが何らかの理由により設定されていない状態になるとボタンがグレーアウトするので、これを設定する

### 手順
 1. Run ボタンの左にある`Current File`と表示されているボックスをクリックし、`Edit Configurations...`を選択
 1. `Add new` か、左下の`Edit configuration templates...`から `Maven` を選択
 1. Name はよしなに設定して、`Run` に `clean package` を入力して `Apply(または適用)` -> `OK`

ライブラリをインストールするための `install` や、アーティファクトを生成する `package` を実行する際にはセットで `clean` も実行しなくてはいけない
これは、以前にビルドされたアーティファクトなどを削除しビルド中に予期しない問題が発生することを抑えるためである



# Mavenについて少し
 Maven にはLifecycle, Phase, Goal という概念があり
 - Lifecycle : 大まかに体系分けされた処理の塊 (clean, default, site など)
 - Phase : goal に辿り着くために行う一つひとつの処理
 - Goal : Lifecycle に含まれる phase に紐づけられたりして実行される処理

のことを指す
そして goal で生成された成果物のことをアーティファクト(Artifact)と呼ぶ

また、goal は 特定の phase に紐づけられた処理として以外にも、goal 単体でも呼び出されることがある

llifecycle, phase, goal を徒競走になぞらえると
徒競走そのものは lifecycle であり、走ってゴール (徒競走の終着地点) へ向かうその行為が phase に、ゴールして着順に並べられるイベントが goal といったところだろうか。

ただ goal を単体でも呼び出すことが出来るため、着順に並べられるイベントを単体でも呼び出せてしまうことにもなる。(なんだそれ)

# 終わりに
　恥ずかしい話ではありますが今までビルドについてあまり意識したことがなかったので、エラーが出て初めて maven の知識のなさに気づきました。詳しい人に聞いたり、自分で調べ、こうしてまとめることで少しは詳しくなれたかなと思います。
chrome developer tools（ディベロッパーツール）

# 概要
Google chromeに組み込まれた機能の1つ。
Webサイトが表示される速度や、エラーの有無など様々なことを調べることができます。
また、参考にしたいWebサイトがどのように作成されているか確認したり、
Webサイトを作成時に起こるエラーの原因を明らかにすることにも有効です。
# 利用方法
1. 起動
    右クリックより『検証』（= developer tools）を選択。
    もしくはショートカットキーを使用します。Windows: Ctrl+Shift+I / Mac: Cmd+Opt+I
![スクリーンショット 2023-03-06 23.18.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3193952/6851b480-721d-53ad-719c-4601b42825d7.png)
1. 表示形式の切り替え
    表示する位置はdeveloper toolsの右上にある「・」が縦に3つ並んだアイコンをクリックすることで変更できます。
![スクリーンショット 2023-03-06 23.12.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3193952/2168fd46-394f-4f8b-2bc0-75654e3dc401.png)
![スクリーンショット 2023-03-06 23.20.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3193952/42957062-2652-ce9c-6d7e-4aa809dda26d.png)
# 覚えておくべき主要機能
- Elements
    - そのページのHTMLが全て表示される。
- Styles
    - CSSが表示されます。表示されるのは、Elementsで選択されている要素に対してのCSS。
- Console
    - JavaScriptというプログラミング言語の実行結果の確認で使用することが多い。
- Network
    - そのページの読み込み速度、HTTPリクエストとメソッド、ステータスコードなどを確認できる。
![スクリーンショット 2023-03-06 23.26.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3193952/4a024d28-a75c-deb1-d088-9b3a34acc633.png)
"IoT"と"M2M"の違い

# はじめに
毎週1本様々な技術に関する記事を投稿しています。
もし興味のある方は下のリンクから他の記事も見ていただければ幸いです。
 [@7_inai_](https://qiixta.com/7_inai_)

IoTとM2Mの違いについて、私自身明確な違いがわからなかったので記事にしました。
M2MはIoTの技術の一部なのですが、この記事ではその違いを明確にしていきます。


# 定義による違い
### ■IoTの特徴
IoTの定義：`Internet of Thingsの略で、家電、スマホ、機械など様々なモノをインターネットに接続することで、データのやり取りを行う技術`のこと。
① __サーバーを通して通信__ を行うため、M2Mよりは遅い
②基本的にセンサー、ゲートウェイ、サーバーの3つで構成
③ __無線通信__ が多く使用される
④ __インターネットに接続__ することが前提


### ■M2Mの特徴
M2Mの定義：`Machine to Machineの略で、機械同士が通信を行うことで、機器の制御やデータ交換等を自動で行う技術`のこと。
① __機器同士__ でやり取りを行うため、正確かつ高速
②センサーと動作のフィードバックを行うアクチュエーターの2つで構成
③ __携帯電話網__ による通信が多く使用される
④インターネットに必ず接続する必要はない


# 事例による違い
### IoTの事例
・機械から収集したデータを分析し、稼働状況を求める。
・様々な部門が所有するデータを一元的に集めることで、素早い意思決定に役立てる。

### M2Mの事例
・無数のセンサーが明るさを検知して、自動で調光を行う
・センサーが人を検知して、自動停止する自動車

# 終わりに
IoTとM2Mの違いについて、定義と事例の2つの観点からまとめました。IoTとM2Mの最大の違いは、__機器をインターネットに接続しているかどうか__ です。また、IoTはどの分野でも使用されていますが、M2Mは機器同士の接続により成り立っているシステムであるため、産業分野で使用されることが比較的多いです。IoTはインターネットに接続するため、セキュリティ面での不安がありますが、M2Mではネットワークに接続しないため、セキュリティ的にも問題ありません。どちらかのシステムを導入する際は、こういった点も考慮する必要があります。


最後までお付き合いくださりありがとうございました。
Python演習問題＿0【じゃんけん①】

# じゃんけん
## じゃんけんを記述してみよう

じゃんけんは2人以上の参加者によって行う。 
参加者は向き合い（あるいは円になり）片腕を体の前に出す。 参加者全員で呼吸を合わせ、「じゃん、けん、ぽん」の三拍子のかけ声を発し、「ぽん」の発声と同時に「手」を出す。 この「手」の組み合わせによって勝者と敗者を決定する。

## 手順
1. 「じゃんけん」とコール
1. 出し手を入力（選択させる）
1. 相手の手を出力（ランダムで）
1. 勝敗を表示
1. 勝敗の合計を表示
1. もう一度続けるかを選択

※ 5. 以降は、場合によって変更可能


【　回答例：ChatGPT活用　】
```
import random
hands = ["グー", "チョキ", "パー"]

def decide_winner(player1, player2):
    if player1 == player2:
        return "引き分け"
    elif (player1 == "グー" and player2 == "チョキ") or \
         (player1 == "チョキ" and player2 == "パー") or \
         (player1 == "パー" and player2 == "グー"):
        return "プレイヤー1の勝ち"
    else:
        return "プレイヤー2の勝ち"

def play_janken(players):
    print("じゃん、けん、ぽん！")
    results = [random.choice(hands) for _ in players]
    for i, result in enumerate(results):
        print(f"プレイヤー{i+1}は{result}を出しました")
    return results

# メインの関数
def main():
    num_players = int(input("参加者の人数を入力してください: "))
    players = list(range(num_players))
    
    # じゃんけんをプレイ
    results = play_janken(players)
    
    # 勝者の決定 (2人プレイヤーのケース)
    if num_players == 2:
        winner = decide_winner(results[0], results[1])
        print(winner)
    else:
        # 複数プレイヤーのケースでは勝者の決定が複雑になるため、ここでは引き分けとします
        print("複数のプレイヤーがいる場合の勝者の決定はまだ実装されていません")

if __name__ == "__main__":
    main()
```

関数を使わない場合
```
import random

# じゃんけんの手
hands = ["グー", "チョキ", "パー"]

# 参加者の人数を取得
num_players = int(input("参加者の人数を入力してください: "))

print("じゃん、けん、ぽん！")

# 各プレイヤーの手をランダムに決定
results = []
for i in range(num_players):
    hand = random.choice(hands)
    results.append(hand)
    print(f"プレイヤー{i+1}は{hand}を出しました")

# 勝者の決定 (2人プレイヤーのケース)
if num_players == 2:
    player1 = results[0]
    player2 = results[1]

    if player1 == player2:
        print("引き分け")
    elif (player1 == "グー" and player2 == "チョキ") or \
         (player1 == "チョキ" and player2 == "パー") or \
         (player1 == "パー" and player2 == "グー"):
        print("プレイヤー1の勝ち")
    else:
        print("プレイヤー2の勝ち")
else:
    # 複数プレイヤーのケースでは勝者の決定が複雑になるため、ここでは引き分けとします
    print("複数のプレイヤーがいる場合の勝者の決定はまだ実装されていません")

```
いにしえのアプリ、iOS15〜対応時のUITableViewの仕様変更で詰んだ

未だSwiftなんで言葉もなかった時代にobjective-cで作られた、10年以上保守しているiOSアプリケーションでiOS15の対応に迫られた際、日本語での記事が見つからなかったので投稿。

## この記事対象の人
- 未だにobjective-cで頑張ってる
- とりあえずサクッと対応させたい

## UITableViewCellのCellが、意図しないCellで返ってくる問題
UITableViewCellを押すと、そのCell上にポップアップのようなUIを表示させ、Cellの値を更新できるUIがあった。しかし、iOS15〜から、ポップアップUIからCellの値を続けて更新する際に、表示させているポップアップの位置が他のCellの位置にずれる問題が発生していた。（伝わるかな…）

どうやら、iOS１５から、isPrefetchingEnabledがデフォルトでTrueになったとのこと。

これがTrueになってると、cellForRowAtIndexPathのデリゲートメソッドが、Cellが表示される前に呼ばれて、いにしえのコードのままだと正しいCellを取得できなくなってしまったっぽい。

サクッと対応させたいので、こいつをOFFにしちゃおう。

AppDelegate.m の、didFinishLaunchingWithOptions 内に書きましょ。

## UITableViewCellの挙動をiOS１４以前に戻す
```
[[UITableView appearance] setPrefetchingEnabled:false];
```

## その他iOS15対応(objective-c)

### UITableViewにHeader設定した際の、Cellの変な隙間対応
``` objectivec:AppDelegate.m
[UITableView appearance].sectionHeaderTopPadding = 0.0;
```

### NavigationBarの背景色対応
``` objectivec:AppDelegate.m
UINavigationBarAppearance *navBarAppearance = [[UINavigationBarAppearance alloc] init];
[navBarAppearance configureWithOpaqueBackground];
navBarAppearance.backgroundColor = [UIColor whiteColor];
navBarAppearance.titleTextAttributes = @{NSForegroundColorAttributeName : UIColor.blackColor};
[UINavigationBar appearance].standardAppearance = navBarAppearance;
[UINavigationBar appearance].scrollEdgeAppearance = navBarAppearance;
```

以上。
Python演習問題＿0【じゃんけん②】

# じゃんけん #
## じゃんけんを記述してみよう ##

じゃんけんは2人以上の参加者によって行う。 
参加者は向き合い（あるいは円になり）片腕を体の前に出す。 参加者全員で呼吸を合わせ、「じゃん、けん、ぽん」の三拍子のかけ声を発し、「ぽん」の発声と同時に「手」を出す。 この「手」の組み合わせによって勝者と敗者を決定する。

## 手順 ##
①勝敗のクラスを定義
②出し方のクラスを定義
③「じゃんけん」とコール
④出し手を入力（選択させる）
⑤相手の手を出力（ランダムで）
⑥勝敗を表示
⑦勝敗の合計を表示
⑧3勝したらゲーム終了
⑨勝敗を表示

※⑦以降は、場合によって変更可能


```

import random

# じゃんけんの手を定義
hands = ["グー", "チョキ", "パー"]

# スコアを管理する変数を初期化
player_wins = 0
computer_wins = 0
draws = 0
# プレイヤーまたはコンピュータが3勝するまでゲームを繰り返す
while player_wins < 3 and computer_wins < 3:
    print("じゃん、けん、ぽん！")
    
    # プレイヤーの手を入力
    player_hand = input("あなたの手を選択してください（グー、チョキ、パー）: ")
    while player_hand not in hands:
        player_hand = input("正しい手を選択してください（グー、チョキ、パー）: ")
    
    # コンピュータの手をランダムに選択
    computer_hand = random.choice(hands)
    print(f"コンピュータは{computer_hand}を出しました")

    # 勝敗を決定
    if player_hand == computer_hand:
        result = "引き分け"
        draws += 1
    elif (player_hand == "グー" and computer_hand == "チョキ") or \
         (player_hand == "チョキ" and computer_hand == "パー") or \
         (player_hand == "パー" and computer_hand == "グー"):
        result = "勝ち"
        player_wins += 1
    else:
        result = "負け"
        computer_wins += 1
    
    # 結果を表示
    print(f"結果: {result}")
    print(f"プレイヤーの勝ち: {player_wins}, コンピュータの勝ち: {computer_wins}, 引き分け: {draws}")

# ゲーム終了メッセージ
print("ゲーム終了")
print(f"最終結果 - プレイヤーの勝ち: {player_wins}, コンピュータの勝ち: {computer_wins}, 引き分け: {draws}")
(Rails)クラス継承のメリット、デメリット

# class継承とは何か？

継承はあるクラスの機能を引き継いで、新しいクラスを作ることです。

例としてタクシーとバスを作成するとして考えてみます。
それぞれのクラスでは「残りの燃料」や「走行距離」といった属性（プロパティ）を持ち、
「走る」や「ガソリンを入れる」などの操作は（メソッド）は共通しています。

具体的に話すと新しく車クラスを作成し、その中に共通する属性や操作を書きます。
そしてタクシーとバスのクラスは車クラスの機能を引き継いで作成されます。

継承元のクラスを「スーパークラス」と言い、継承先のクラスを「サブクラス」と言います。

# 継承のメリット

継承が用意されていない場合、新しくブレーキの機能を追加したいとなったとき、
乗り物に関する個別のクラスに属性や操作を追加しなければならない！

こうするとコードが長くなってしまい乗り物のクラス全体に機能を追加したり、
修正したりするときに一つ一つを修正しなければならず大変になる。
そこで車のような基盤となるクラスを用意することで新たな乗り物を最小限の手間で作成することができる！


#　継承のデメリット

RubyやJavaでは継承できるクラスは（スーパークラス）は一つまでになっている！
複数のクラスを継承して新しいクラスを作成することはできない。

親クラスの処理内容を変更するとき、継承クラスと使われているメソッドを全て把握しなければ継承先で意図しない処理なってしまうことがあるというデメリットもあります。
Template Method Pattern

<h2>Template Method Pattern</h2>
Design Patternの一種です。 frameworkで多く使用される設計パターンです。
abstractクラスである上位クラスでfinalやabstract methodを使用して実装全体の流れを定義し、具体的な各メソッド実装は下位クラスに委任します。<br>
下位クラスが異なる実装をしたからといっても、template methodで定義されたシナリオどおりに実行されます。

```java:Car.java
public abstract class Car {
    // 下位クラスに強制します。
    public abstract void drive();
    public abstract void stop();

    public void startCar() {
        System.out.println("start car");
    }

    public void turnOff() {
        System.out.println("turn off car");
    }

    public void washCar() {  }

    // template method！
    final public void run() {
        startCar();
        drive();
        stop();
        turnOff();
        washCar();
    }
}
```
```java:AIcar.java
public class AIcar extends Car{
    @Override
    public void drive() {
        System.out.println("AI car drive");
    }

    @Override
    public void stop() {
        System.out.println("AI car stop");
    }

    @Override
    public void washCar() {
        System.out.println("AI car wash");
    }
}
```

```java:ManualCar.java
public class ManualCar extends Car{
    @Override
    public void drive() {
        System.out.println("Manual Car drive");
    }

    @Override
    public void stop() {
        System.out.println("Manual Car drive");
    }
}
```
Car abstractクラスのrun()はtemplate methodになります。
run()はいつも定義されている通りに実行されます。
下位クラスに実装を強制たいmethodはabstract methodとして定義しています。
public void washCar()は中身がないしabstractではありませんが、template methodの中に定義されています。
この場合は、これを必要とする下位クラスだけがoverrideして使ってもらえるように具現しています。

フレームワークの場合にも、フレームワークを導入して開発する時に、フレームワークの流れ(シナリオ)はすでに決まっていて、私が制御できるものではありません。
間間に私が具現したい方向にmethodを実装します。この時テンプレート・メソッドが活用されます。（template method 以外にもあります。）
PowerAutomateでSOAPサービスを呼び出す

# 目的
PowerAutomateでSOAPの呼び出しを実現したい。

デスクトップフローではSOAPを呼び出すアクションが存在します。

https://learn.microsoft.com/ja-jp/power-automate/desktop-flows/actions-reference/web#invokesoapserviceaction

一方クラウドフローではSOAPを呼び出すアクションが存在しません。
RESTを呼び出すアクションとしてHTTPアクションが用意されています。
今回はHTTPアクションを使い、SOAPサービスを呼んでみたいと思います。


# 実装フロー全体像
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416793/c6d03508-722e-a4b0-d1fa-f21ae8f4ee20.png)
全体像はこんな形となっています。
それではアクションを1つ1つ見ていきます。

# フロー詳細
**1. 手動でフローをトリガーします**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416793/b5bb84ff-125c-fe68-da90-5cf720abded4.png)
これはとくに解説不要ですね。テスト動作するときはみなさん使われるかと思います。

**2. 変数を初期化する - inputを設定**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416793/ffc2fcb6-23f3-3605-bf6b-48a2b546d68d.png)
ここも本筋ではありませんが、後続のSOAP呼び出しを行うときのinputとして変数化しています。

**3. HTTP - SOAPサービスの呼び出し**
今回テストにあたり以下の公開SOAPを利用させていただきました。
https://documenter.getpostman.com/view/8854915/Szf26WHn#ce8589ab-0fc5-493c-9792-93e5d427e608
※入力した数値を文字に変更してくれるようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416793/85fc434c-e731-1f18-e3b7-ed294ce0c1f5.png)
SOAPの仕様に従ってHTTPアクションを設定していきます。
なお、本文（Body）には前項で設定したinputを挟み込んでいます。


**4. 作成 - レスポンスをJSON形式に変換**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416793/33acbd40-52f7-805f-eccb-a379b12d312d.png)
前項のHTTPアクションでレスポンスが返ってくるのですが、
どうやらXMLのふりしたテキストのようです。
これをPowerAutomateで利用しやすいように整形します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416793/21abad58-02e3-54a6-86ab-acc52db5605c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416793/2ebf08c7-07ae-e368-937b-afa2833dbc4e.png)
式は上記のような形となっています。
body('HTTP_-_SOAPサービスの呼び出し')が前項のレスポンスです。
まず、そのレスポンスをxml()でxml形式に変換します。
さらに、json()でjson形式に変換します。

**5. JSON の解析 - JSON形式をPowerAutomateで使いやすく**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416793/341a8b19-4773-201e-64d1-75aa3307f0da.png)
ここまでくればSOAPならではのことはありません。
JSONの解析アクションでPowerAutomateで使いやすいようにします。
スキーマは「サンプルから生成」を使うと楽です。
サンプルから生成の際は、前項のアクションの結果をコピペするのが楽です。

**6. 変数を初期化する - outputを設定**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416793/a75b6ef7-c8bf-870c-d774-77ae98a94641.png)
最後に結果を変数に確認します。

# 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416793/9c208a72-6182-ec84-0566-274877222c06.png)
上記は想定通り、
input「928」に対し、output「nine hundred and twenty eight」を
取得することができました。

# 最後に
RESTのサンプルはたくさんありますが、
SOAPで呼び出す例が探した限り見当たらなかったので記事にしてみました。
ご指摘やコメントありましたらいただけると幸いです。
NotionからConfluenceに移行してみた

### 本記事について
NotionからConfluenceへドキュメントを移行した際のBefore/Afterについて書きます。

### 誰のための記事？
「Confluenceの使い方がよくわからない方」
「Notionの容量制限で悩んでいる方」
「社内情報共有の事例を知りたい方」

### NotionからConfluenceに移行してみた
社内（デザインの職能のみ）で気になるニュースや最近読んだ書籍など情報共有のためNotionにまとめていました。フォーマットも整えて運用を始めて1ヶ月。デザイン関係者の情報共有ということもあり、画像が多めにアップされていました。おかげで、あっという間にNotionの容量制限100%に達してしまいました。Notionは確かに使いやすいし、テンプレートや使い方の記事が多いです。しかし、社内ではドキュメントはConfluenceを導入しています。せっかくなのでConfluenceを使ってみようと思い、"Notionのように使えるんじゃないか？"という軽い気持ちでConfluenceに移行することを決意しました。Confluenceはこれまで議事録や他の方が作成したドキュメントを閲覧する程度でした。社内では"Confluenceちょっと使いにくい"、”Confluenceよくわからない”などの声が上がっていました。天邪鬼な私は、"ならば使い倒してみようじゃないか"という気持ちで移行に挑みました。

#### Confluenceとは？
Confluence は、知識を集めて共同作業するためのリモートでも使いやすいチームのワークスペースです。
[参考：ATLASSIAN公式サイト](https://www.atlassian.com/ja/software/confluence)
ConfluenceはJavaで作成され、主にビジネスで使用される企業向けウィキである。アトラシアンが開発・販売を行っている。Confluenceは、クライアントソフトウェアとしてもホスティングサービスとしても販売されている。非営利団体やオープンソースプロジェクトであれば無償ライセンスプログラムを利用できる。
[参考：フリー百科事典『ウィキペディア（Wikipedia）』](https://ja.wikipedia.org/wiki/Confluence)


### 最初に試したこと
Confluenceのテンプレートを一通り見てみました。
確認したら129ものテンプレートがありました。
※テンプレートは上部のメニューバーの「テンプレート」から確認できます。
これだけテンプレートがあるので、Notionっぽく作れるかもしれない！？移行してないのに確信がありました(笑)
<div><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1695131/ae2fd4c7-67ea-11a7-e895-d0f0171ded66.png" width=50%></div>

### Before(Notion)
Topページは自分の名前をタイトルにして（グレー部分）おすすめの書籍やよく見るサイト、気になった記事を配下のページに作成していました。
<div><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1695131/4bb2c96f-a4e6-373b-c530-456cf27f5e23.png" width=50%></div>
ちなみには以下のページはこんな感じです。
<div><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1695131/7048c186-dfe5-76b4-865b-60b1add94f28.png" width=49%>&nbsp;&nbsp;&nbsp;<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1695131/f701e0c0-ad86-02af-1f8a-4e9e84b3137e.png" width=49%></div>

### After(Confluence)
TOPページ
<div><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1695131/d837f3d3-039d-7cd4-b29b-a4fee8d6ab94.png" width=50%></div>
配下のページ
<div><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1695131/2817dad0-d77b-8ab7-e290-79ef21b9daca.png
" width=49%>&nbsp;&nbsp;&nbsp;<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1695131/074401b4-18be-43fc-2f7c-066dbbd670d3.png" width=49%></div>
好きなコト、モノのページを追加してデザイナーさんたちが写真をあげやすいようにしました。
ちなみに私は神戸空港のブロッコリーが大好きです。
<div><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1695131/1ece1c15-178b-f14d-a669-df2c6c662c6f.png" width=50%></div>

### まとめ
NotionでできることはConfluenceでもほぼ網羅することができました。
Confluenceよくわからないと社内では言われていましたが、単に使い方を知ろうとしていないところもあるような気がします。
他にも良い使い方がありそうなので、使いながら試していこうと思います。

以上。
複数の文字列を辞書順に並び替える方法

# 注意
Atcoderの[B - Qualification Contest](https://atcoder.jp/contests/abc288/tasks/abc288_b)のネタバレあり
# ACしたコード
```C
//写経#38610740
#include<stdio.h>
#include<string.h>

int main(void) {
	int N,K;
	char str[100][11];
	char tmp[100];

	scanf("%d%d", &N,&K);

	for (int i = 0; i < N; i++)
	{
		scanf("%s", str[i]);

	}

	for (int i = 1; i < N; i++) {
		for (int j = 1; j < K; j++) {
			if (strcmp(str[j - 1], str[j]) > 0) {
				strcpy(tmp, str[j - 1]);
				strcpy(str[j - 1], str[j]);
				strcpy(str[j], tmp);
			}
		}
	}
	for (int i = 0; i < K; i++)
	{
		printf("%s\n", str[i]);
	}
	return 0;
}
```

# 参考にした記事まとめ
[文字列の配列を用意し、標準入力から読み込んだ文字列を表示するプログラム](https://zhi-ma.hatenablog.com/entry/2013/10/11/092538)
[文字列を辞書順に並べる](https://webkaru.net/clang/sort-strings/)
エイリアスを使って AWS CLI の Profile 切り替えを楽にしてみた

## はじめに
AWS CLI を使って AWS リソースを操作する場合、複数の AWS アカウントやリージョンに対応するために、IAM ユーザーの認証情報を設定する必要があります。そのため、毎回認証情報を指定するのは手間がかかりますが、本記事では、プロファイルを使用して AWS CLI をより便利に使うための設定方法を紹介します。

## 複数のプロファイルを設定する
~/.aws/config ファイルに複数のプロファイルを設定することで、複数の IAM ユーザーの認証情報を管理できます。
また、リージョンや出力形式など、各プロファイルごとに異なる設定をすることも可能です。
例えば、複数の AWS アカウントや、IAMユーザーの権限を切り替えて作業しなければならない場合などに有効です。

```sh
[profile profile1]
region=ap-northeast-1
output=json
[profile profile2]
region=us-west-2
output=json
```

## 認証情報を設定する
~/.aws/credentials ファイルに、各プロファイルに対応する IAM ユーザーの認証情報を設定します。
```sh
[profile1]
aws_access_key_id=YOUR_ACCESS_KEY_ID_1
aws_secret_access_key=YOUR_SECRET_ACCESS_KEY_1
[profile2]
aws_access_key_id=YOUR_ACCESS_KEY_ID_2
aws_secret_access_key=YOUR_SECRET_ACCESS_KEY_2
```

## プロファイルを切り替える 
上記の設定が完了した段階では、`aws s3 ls` コマンドなどを使用する場合、`--profile profile1`のように毎回プロファイルを指定する必要があり、面倒です。そこで、AWS_PROFILE 環境変数を使用して、現在使用するプロファイルを切り替えることができます。

```sh
# AWS_PROFILE 環境変数を使ってプロファイルを切り替える
$ export AWS_PROFILE=profile1
```

更に、以下のようにエイリアスを設定することで、`switchaws {プロファイル名}` コマンドを実行することでプロファイルを切り替えることができます。

```sh
# エイリアスを使用してプロファイルを切り替える
$ alias switchaws='f(){ export AWS_PROFILE=$1; }; f'
$ switchaws profile2
```
以上の方法を使うことで、毎回認証情報を指定する手間を省くことができます。
AWS CLI を頻繁に使用する方は、ぜひ試してみてください

## ちなみに
一番ラクなのはこの方法な気がします
[AWS CLIのプロファイルを簡単切り替え | DevelopersIO](https://dev.classmethod.jp/articles/aws-cli-switch-profile/)
書籍「Web技術の基本」を読んで学んだこと

# ステートフルとステートレス
　クライアントの状態を保持して次の処理に反映させるような方式をステートフル、状態を保持せずに次の処理に反映させない方式をステートレス。
　多数のクライアント情報を1台のサーバ内に保持するとサーバに負担がかかり処理が遅くなるので、サーバ上にクライアント情報を保持しない「ステートレス」な設計がWebの原則としてある。
　
# リクエストとレスポンス
　ブラウザからサーバに向けて処理してほしい内容を送信することをリクエスト。サーバー側でそのリクエスト内容を処理した結果を返すことをレスポンス。

# プロトコル
　ネットワークに接続された機器同志が通信するための共通的なルールや手順のこと。機器同士の通信でルールが異なると、ブラウザや端末によって通信できなかったりして困るので、統一することで機器同士のデータのやりとりが可能になっている。
　また、そのような通信サービスに使用する様々なプロトコルの集合体を「TCP/IP」とも言う。

# Cookie
&emsp;状態を保持しないステートレスなWebにて状態を保持して管理するステートフルな機能を使用したいときに使うデータがCookie。
　Webは基本原則として「ステートレス」でなくてならず、Web自体には状態を保持して管理する仕組みがない。だが、近年ECサイトのカート情報などクライアント情報を保持する「ステートフル」性も求められきたことから使用されるようになった。
 リクエスト送信時にサーバーでクライアント情報をCookieに格納してレスポンスとしてCookie
を返してブラウザ上に保存。次リクエストするときにブラウザのCookieをクライアント情報とともにサーバーに送ることでサーバはクライアント情報を識別できるようになる。
　ブラウザ上にずっとCookieを保持したままだとCookieの中身の情報を盗まれるなどセキュリティ的によろしくないのでCookieの使用期限を設定できる。

# ポート番号
　インターネットに接続するとき、どのコンピュータのどのサービスに接続するのか指定する必要がある。「どのコンピュータか」を表すものをIPアドレス、「どのサービスか」を表すのをポート番号と呼ぶ。

# 参考文献
- [この一冊で全部わかる Web技術の基本](https://www.amazon.co.jp/%E3%82%A4%E3%83%A9%E3%82%B9%E3%83%88%E5%9B%B3%E8%A7%A3%E5%BC%8F-%E3%81%93%E3%81%AE%E4%B8%80%E5%86%8A%E3%81%A7%E5%85%A8%E9%83%A8%E3%82%8F%E3%81%8B%E3%82%8BWeb%E6%8A%80%E8%A1%93%E3%81%AE%E5%9F%BA%E6%9C%AC-%E5%B0%8F%E6%9E%97-%E6%81%AD%E5%B9%B3/dp/4797388811 "Qiita Home")
【全ブラウザ対応】CSSコンテナクエリって何？

## 概要

2023/2/14から全ブラウザで対応になったコンテナクエリについて、
興味を持ってもらうための記事です。

## コンテナクエリとは

> Container queries are an alternative to media queries, which apply styles to elements based on viewport size or other device characteristics.
> コンテナー クエリは、ビューポートサイズやその他のデバイス特性に基づいて要素にスタイルを適用するメディア クエリに代わるものです。

引用： [CSS Container Queries - CSS: Cascading Style Sheets | MDN](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Container_Queries)より

メディアクエリでは、「**画面幅**」を基準にスタイルの分岐をしていましたが
コンテナクエリでは、基準を「**親要素のサイズ**」に設定することができます。

![概要.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250206/6cd905bb-c1c3-40f0-8a5b-d8426f4d4fb4.png)

ブレイクポイントをこちらで決められるので、
レスポンシブのスタイリングがより柔軟になりますね:relaxed:

### 使い方

使い方は簡単です。

1. 基準にしたい要素に、`container-type:`でプロパティを追加する
2. `@container`を`@media`と同じように使うだけ

使えるプロパティや詳細は、MDNなどでご確認ください。
[TechFeed Experts Night#14 〜 絶対役立つ！最先端のCSS総ざらい](https://techfeed.io/events/techfeed-experts-night-14) での鹿野さんの資料が大変わかりやすかったです。


### 対応状況

2023/2/14時点でfirefoxでも対応されました。
バージョンの確認をしながら、使える際はどんどん使っていきましょう。

![スクリーンショット 2023-03-05 11.15.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250206/3370c79b-fc74-618c-b3fc-6175e2122794.png)

引用： https://caniuse.com/mdn-css_at-rules_container


## どんなところで使えそう？

例えば、メディアサイトによくありそうな、記事リストの実装に役立ちそうです。

* サイドバー
* 記事の中
* サイト下部

など、さまざまな場所に配置したい・場合によってレイアウトを変えたいものに有効なのではないでしょうか。

![記事リスト.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250206/b552697a-72a3-cde9-068d-8644ce6be3cd.png)

### demo

実際に、記事リストコンポーネントをコンテナクエリで実装してみました。
親要素のサイズによってレイアウトも変わってくれるので、ありがたいですね！

https://codesandbox.io/embed/kontenakueridemo-ji-shi-risutonoshi-zhuang-q6tqrq?autoresize=1&fontsize=14&hidenavigation=1&theme=dark


## まとめ

今までだと、別々のコンポーネントとして実装する必要があったものも、
コンテナクエリを使うことで、1つのコンポーネントとして管理することができるようになりそうです。

使いまわせるコンポーネントをどんどん作っていきましょう！
主な計算~Ruby~

#### 数値と足し算・引き算

- プログラミングの世界では文字列と数値は別物である。""を使う事で、認識される。

足し算→+
引き算→-

```Ruby
puts 5+2
puts "5+2"
```
出力結果
```
7
5+2
```

#### 掛け算・割り算・余りの計算

- 掛け算は「*」(アスタリスク)
- 割り算は「/」(スラッシュ)
- 「%」を用いると、割り算の余りを計算できる。

```ruby
puts 3*5
puts 6/2
puts 9%2
```
出力結果

```
15
3
1
```
【decodeJWT(無料)】JWT decode API【JSON Web Tokens decoder】

# Usage( 文法 )
```bash
toekn=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
curl https://jwt.deno.dev/$token
```

# Example( 実行例 )

## ウラル🏔( URL )
[https://jwt.deno.dev/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c](https://jwt.deno.dev/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c)
## カール🐸( curl )
```bash
curl https://jwt.deno.dev/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
```

## ジャバスクリプト🧉( JavaScript )

```javascript
await fetch('https://jwt.deno.dev/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c').then(r=>r.json())
```

## ぴぃえぃちぴぃ🐘( PHP )

```php
var_dump(json_decode(file_get_contents('https://jwt.deno.dev/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c')));
```

## ぴぃてぉん🐍( Python )

```python
import requests
requests.get('https://jwt.deno.dev/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c').json()
```

## うびぃ💎( Ruby )

```ruby
require 'net/http'
require 'json'
require 'uri'

JSON.parse(Net::HTTP.get(URI.parse('https://jwt.deno.dev/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c')))
```

## Output( 出力 )

```json
[
  {
    "alg": "HS256",
    "typ": "JWT"
  },
  {
    "sub": "1234567890",
    "name": "John Doe",
    "iat": 1516239022
  },
  {
    "0": 73,
    "1": 249,
    "2": 74,
    "3": 199,
    "4": 4,
    "5": 73,
    "6": 72,
    "7": 199,
    "8": 138,
    "9": 40,
    "10": 93,
    "11": 144,
    "12": 79,
    "13": 135,
    "14": 240,
    "15": 164,
    "16": 199,
    "17": 137,
    "18": 127,
    "19": 126,
    "20": 143,
    "21": 58,
    "22": 78,
    "23": 178,
    "24": 37,
    "25": 95,
    "26": 218,
    "27": 117,
    "28": 11,
    "29": 44,
    "30": 195,
    "31": 151
  }
]
```

# Source code( ソースコード🍝 )

https://dash.deno.com/playground/jwt

```typescript
import { serve } from "https://deno.land/std@0.177.0/http/server.ts";
import { decode } from "https://deno.land/x/djwt@v2.8/mod.ts";

const options = {
    headers: {
        'Access-Control-Allow-Origin': '*',
        'Content-Type': 'application/json'
    }
}

serve((req: Request) => new Response(JSON.stringify(decode(req.url.slice(21)), null, 2), options))
```

ライブラリインストール面倒くさいときに、ご賞味ください

# 参考

https://jwt.io
【Python】TwitchAPIを使用して任意ゲームの視聴者数が多い上位5人のデータをCSV出力する

1.初めに
---
こんにちは。YoutubeやTwitchで配信しておりますアニメ、漫画、ゲーム、Vtuber大好きオタクのVtuber
久遠楽 (https://twitter.com/kuonraku0210) です。
今回は前回作成した視聴者上位のデータを取得するスクリプトを更新して取得したデータをCSV出力してデータを分析できるようにしたいと思います。

前回
[Twitch APIをPythonで利用する（備忘録）](https://qiita.com/kuonraku0210/items/aaf4e69d3851a0dab471)

2.実装
---
実際にコードを作成します。
基本的には前回のコードを一部修正という形です。


***コード***
```python:dataCsv.pt
#ツイッチAPIを使用して取得したデータをCSV出力する
from twitchAPI.twitch import Twitch
from twitchAPI.helper import first
import asyncio
import csv

async def twitch_example():
    count = 0
    csvInf = []
    twitch = await Twitch('app_id', 'app_secret')
    async for tag in twitch.get_streams(game_id='516575',first=100):
        #配信者名、視聴者数を出力
        csvInf.append([tag.user_name,tag.viewer_count])
        count += 1
        if count > 5:
          #CSVファイルにデータを作成
          f = open('data.csv', 'w', newline='')
          writer = csv.writer(f)
          writer.writerows(csvInf)
          f.close()
          print('CSV出力を行いました。')
          break
    await twitch.close()

# run this example
asyncio.run(twitch_example())
```
***結果***
```dataCsv.pt
CSV出力を行いました。
```
作業用フォルダにdata.csvが出来たので確認してみます。
```data.csv
A,14000
B,13000
C,12000
D,11000
E,10000
```
正しく出力されました。

3.応用
---
毎回実行するのは大変なので一定時間ごとに自動で実行するように改造したいと思います。
今回は10分間ごとに1時間実行するようにします
```python
from twitchAPI.twitch import Twitch
from twitchAPI.helper import first
import asyncio
import csv
import datetime
import time

async def twitch_example():
    count = 0
    csvInf = [['視聴者数']]
    twitch = await Twitch('app_id', 'app_secret')
    setTime = 6
    for num in range(setTime):
        # 時刻設定用
        t_delta = datetime.timedelta(hours=9)
        JST = datetime.timezone(t_delta, 'JST')
        now = datetime.datetime.now(JST)
        d = now.strftime('%Y%m%d%H%M%S')
        async for tag in twitch.get_streams(game_id='516575',first=100):
            csvInf.append([tag.viewer_count])
            count += 1
            if count > 5:
                # CSVファイルにデータを作成
                f = open(d + '.csv', 'w', newline='')
                writer = csv.writer(f)
                writer.writerows(csvInf)
                f.close()
                count = 0
                csvInf = [['視聴者数']]
                print('CSVファイルを出力しました。')
                break
        if num == setTime - 1:
            break
        time.sleep(600)
    await twitch.close()


# run this example
asyncio.run(twitch_example())
```

***結果***
```AutorunCsv.pt
CSVファイルを出力しました
CSVファイルを出力しました
CSVファイルを出力しました
CSVファイルを出力しました
CSVファイルを出力しました
CSVファイルを出力しました
```
作業用フォルダに6つファイルが出来たと思います。
「出力時刻.csv」のうちどれか一つを確認してみます。
```:20YYMMDDhhmmss.csv
視聴者数
A,14000
B,13000
C,12000
D,11000
E,10000
```

実際に2023/03/05 21:45～22:35分までの
上位100人の視聴者数データを取得してみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3226293/e4ac9d33-6dc9-a7ee-6f11-d66f2aca304b.png)
22時に同接が増えていますね。有名な配信者さんが配信をつけたのでしょうか？
今回は視聴者数のみを取得していますのでそこまでのデータはわかりませんが今後データを増やしていけばいろいろと分析ができるようになると思います。

4.最後に
---
自動でデータを取得できるようになったので次はCSV出力し、取得したデータを自動でまとめて出力するようにしたいと思います。
また次回の記事を楽しみにしてください

【宣伝】
APEXやヴァロラントなどのFPSをメインに毎日20時頃から配信をしているのでよければチャンネル登録していただければ嬉しいです。
Ruby on Rails アプリ作成 序盤に出たエラー

# はじめに
新しくアプリケーションを立ち上げて
```ruby
rails db:create
```
を実行したときにでたエラーを解決したため、忘れないうちに記録したいと思い投稿します。

# どんなエラーが出たのか
```ruby:実行していたこと①
rails _6.0.0_ new xxx -d mysql
```

```ruby:実行していたこと②
rails db:create
```

そうすると、以下のようなエラーが出ました。
```:ターミナル
/Users/admin/.rbenv/versions/2.6.5/lib/ruby/2.6.0/net/protocol.rb:66: warning: already initialized constant Net::ProtocRetryError
/Users/admin/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/net-protocol-0.2.1/lib/net/protocol.rb:68: warning: previous definition of ProtocRetryError was here
/Users/admin/.rbenv/versions/2.6.5/lib/ruby/2.6.0/net/protocol.rb:206: warning: already initialized constant Net::BufferedIO::BUFSIZE
/Users/admin/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/net-protocol-0.2.1/lib/net/protocol.rb:214: warning: previous definition of BUFSIZE was here
/Users/admin/.rbenv/versions/2.6.5/lib/ruby/2.6.0/net/protocol.rb:503: warning: already initialized constant Net::NetPrivate::Socket
/Users/admin/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/net-protocol-0.2.1/lib/net/protocol.rb:541: warning: previous definition of Socket was here
Created database 'xxx_development'
Created database 'xxx_test'
```

自分にとってこのエラーは初めて見た文章でした。

- already initialized constant Net::ProtocRetryError
→すでに初期化されている定数 Net::ProtocRetryError

- warning: previous definition of ProtocRetryError was her
→ 警告: ProtocRetryError の以前の定義は彼女のものでした

- warning: already initialized constant Net::BufferedIO::BUFSIZE
→　警告: BUFSIZE の以前の定義はここにありました

- lready initialized constant Net::NetPrivate::Socket
→既に初期化された定数 Net::NetPrivate::Socket

- warning: previous definition of Socket was here
→警告: Socket の以前の定義はここにありました

Google翻訳で訳してもらいましたが、あまりピンと来ない、、。
そこで、同じようなエラーを解決した記事を見つけたので、そちらを参考に解決までの手順を書いて行きます。


# 実行したこと
Gemfileに以下を追記しました。
```ruby:Gemfil
gem 'net-http'
```
その後、サーバーを再起動（rails s）すると、これまで出てきていたエラーが表示されなくなり、無事に解決しました。


# 参考文献

https://wakunkyo.com/net-protoc-retry-error/

https://zenn.dev/tarou_yuruyuru/articles/163f5b734409f7

ありがとうございました。
【Swift】アプリのレビューアラートを出す方法

# はじめに
個人開発でアプリのレビューアラートを出す実装をしたので、忘れないようにメモ的に残しておきます。

# この記事でわかること
- 画像のアラートを表示方法
![IMG_C0ABD90E4DDC-1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2644705/3d46d4b2-011e-1bb7-6e34-3c7f81ab8480.jpeg)

# アラートを出すコード
コードはものすごく簡単です。
まずはアラートを表示させる処理を書くファイルに`import StoreKit`をしましょう。
そして、アラートを出したいタイミングで以下のコードを書けば終わりです。

```Swift
     if let scene = UIApplication.shared.connectedScenes.first(where: { $0.activationState == .foregroundActive }) as? UIWindowScene {
         SKStoreReviewController.requestReview(in: scene)
     }
```

# おまけ
今回個人開発では、特定のアクションを規定回数行なったときにアラートを表示するようにしました。
アラートの表示を管理するために以下のようなクラスを作ったので参考になるかは分かりませんが共有しておきます。

```Swift
import Foundation

final class ExecuteCounterForReviewAlert {

    private let executeCountKey = "executeCount"
    private var executeCount: Int {
        didSet {
            UserDefaults.standard.set(executeCount, forKey: executeCountKey)
        }
    }

    func incrementExecuteCount() {
        executeCount += 1
    }

    func isShowReviewAlert() -> Bool {
        return executeCount == 5 || executeCount == 10
    }

    init() {
        executeCount = UserDefaults.standard.integer(forKey: executeCountKey)
    }
}

```

# 1度レビューしたことがあってもアラートが出るのか？
今回レビューアラートは特定のアクションを5回、10回行なったときに表示するようにしました。
開発中にはアラートは表示できても、評価は送信できません。
そこで疑問に思ったのが以下２点です。

- 5回目のアクションを行った際にアラートを表示し、レビューを送信したら10回目もアラートが出てしまうのか？
- ストアから以前レビューしていてもアラートが出てしまうのか？

結論から言うと、`たぶん出ない`と思われます。


appleのドキュメントにはそれらしき記述は見られませんでした。


https://developer.apple.com/documentation/storekit/skstorereviewcontroller/3566727-requestreview



appleのドキュメントからは見つけられなかったので`ChatGPT`さんに聞いてみたら、`出ない`と教えてくれました。
![スクリーンショット 2023-03-06 21.32.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2644705/128328b9-2759-b1f9-0d62-2bf9bc9dc002.png)

# おわりに
最後はChatGPT頼りになってしまいました。また本当のことがわかったら追記するかもです。
もしご存じの方がいたら教えてください🙇
個人開発アプリがいい感じに売れるように頑張りたい。
Pythonの勉強がてらDjango,PokeAPIでポケモンを並べる

# きっかけ
- 最近Excelで設計書を書く時、繰り返しを感じる（自動化したい）<br>
- chatGPTが話題
等々の理由からPythonを学ぶ

でも文法の勉強は退屈、、<br>
→ならフレームワークも含めてポートフォリオを作った方が面白いし覚えられる<br>
という経緯

# ネタ探し
特にネタが思いつかない時はAPIを使わん手は無いですね。イイ感じのAPIを探していたらポケモンのAPI(非公式)が有ったので早速使います。

# フレームワーク探し
ネタは決まったので、フレームワークを探します。サクッと調べ、Flaskと迷いましたが、結局名前を聞いた事が有るDjangoにしました。

# 捌いて行く
具材が揃ったので調理して行きます。

とりあえずDjango Hello Worldまで進める

→ MTVという概念を学ぶ。今回はビジネスロジックを構築しない為、モデルは使わない。
ビュー内でロジックを完結し、テンプレートに出力します。
→ PokeAPIからのレスポンスを確認
→ デザインはBootstrapで整える程度に作ります
→ ロジックに関しては1匹のポケモンで表示が上手く行くことを確認した後に、n匹で表示出来る様に作ります。
n=リクエスト数であり、数が増えるとデータ量も増えるので今回は20(大体一ページ分)で固定します。
ポケモンずかんは現在1008番まで登録されているので、データ制限に引っ掛からなければ1008まで表示可能です。


# 完成！

`
python manage.py runserver
` 
でローカルホスト実行

`
http://127.0.0.1:8000/hello　
`
でビューからテンプレートの表示まで行います

n=1の時
![スクリーンショット 2023-03-06 21.03.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/400525/78905f79-06fe-6e15-4711-6ae64f07a1a3.png)

n=20
![スクリーンショット 2023-03-06 0.49.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/400525/e853641c-9f65-d75b-0d46-d8fa890c2353.png)

ヘッダーを少し凝ってみました。後、一応タイプに応じて背景色を付けました。<br>

出来上がったリポジトリ

https://github.com/rikutokd/PokeAPIHandson.git


# 感想
イイ感じに出来ました。

MTVフレームワークの概念及びPython基本文法を学びました、お終い。
Intel NUCのBIOSをアップデートする

# やりたいこと

- Intel NUCのBIOSが古いためアップデートする

# ハードウェア

- 私が保有しているIntel NUCの型番はNUC8iBEH
- 第8世代のIntel NUCなのでわりかし古め(現在は第13世代が販売されている模様)
- 仕様: https://www.intel.co.jp/content/www/jp/ja/products/sku/126150/intel-nuc-kit-nuc8i3beh/specifications.html
- とはいえ他の世代のIntel NUCでもアップデートの手順は大きくは変わらないと思われる

# アップデートの手順

### USBメモリのフォーマット

- ※ macOS Venturaの場合
- 名前は任意の名称を設定、フォーマットは`MS-DOS (FAT32)`を選択し、消去を実行
    - `exFAT`でフォーマットするとIntel NUCにファイルが上手く認識されなかったため注意

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78249/80d285c9-ddcd-bc35-546f-eb5e1aadb424.png)

### BIOSのダウンロード

- BIOSのアップデートに使用するファイルをダウンロードする
- ダウンロード先はIntel NUCの型番によって異なる
- 今回の場合は[このリンク](https://www.intel.co.jp/content/www/jp/ja/products/sku/126150/intel-nuc-kit-nuc8i3beh/downloads.html)から「BIOS アップデート」を探し、「詳細を見る」を選択する

![スクリーンショット 2023-03-06 18.54.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78249/530c644c-c7bb-95c9-8992-f38d806fa303.png)

- すると[このリンク](https://www.intel.co.jp/content/www/jp/ja/download/743906/bios-update-becfl357.html)に飛ぶので「ご利用可能なダウンロード」から拡張子が`.bio`のファイルをダウンロードする
    - ちなみに今回は「F7 Update」と呼ばれる方式でアップデートするため、上記のファイルをダウンロードするが、他の方式の場合は別のファイルをダウンロードすることになる
    - 詳しくは「[BIOS Update Instructions for Intel NUC with Intel Visual BIOS](https://www.intel.com/content/dam/support/us/en/documents/mini-pcs/Visual-BIOS-Update-NUC.pdf)」を参照

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78249/ba4dd5f5-f4fd-3b73-bbae-b6a2c05d9a93.png)

- フォーマットしたUSBメモリにダウンロードしたBIOSをコピーする

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78249/d72ef3dd-fb77-9759-1c45-d9f0c04b7ee0.png)

### BIOSのアップデート

- ダウンロードしたBIOSをコピーしたUSBメモリをIntel NUCに接続して起動
- 起動直後にF7キーを押下し、「BIOS Flash Update」を開く

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78249/1e7a9fbc-3133-b2b6-2b6c-3585bb1dc087.jpeg)

- USBメモリに書き込んだBIOSを選択

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78249/c5409abe-ca84-08cc-ab04-b061a91d9c91.jpeg)

- Enterキーを押下

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78249/f656bbab-1698-ff53-83cf-c707feb3d9fb.jpeg)

- 数分間、更新が走り、その後再起動する

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78249/3685e583-7c5f-e625-8308-7ce48cd9b242.jpeg)

### アップデートされたことを確認

- 再起動後にF2キーを押下し、Setup画面を開き、BIOSが想定したバージョンにアップデートされていることを確認する

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78249/ffafbbdd-1749-0fde-71fa-d5061501eb9f.jpeg)
Sam quick reference cardにレシピ実例を足してみた

http://sam.cat-v.org/cheatsheet/

この記事では便宜上、samのコマントじゃない文字`@`で行コメントを付与してる。

# 

# テキスト中の"fred"と"jim"を入れ替える
```text レシピ
,x/[A-Za-z]+/{
    g/fred/v/...../c/jim/
    g/jim/v/..../c/fred/
}
```

## 意味を付けてみた
```text 意味付き
@ テキスト全体について
,
 @ 次にマッチする各部分文字列に対し、{}内の内容を順に行う。
 x/[A-Za-z]+/{
    @ fredを含み、かつ5文字の文字列を含まないのであれば、
    g/fred/ v/...../
                     @ jimに置換する。
                     c/jim/
    @ jimを含み、かつ4文字の文字列を含まないのであれば、fredに置換する。
    g/jim/ v/..../ c/fred/
}
```

## 例
```terminal
$ rlwrap sam -d
 -. 
a
fred jim jim fred freddy jimmy effreda mijimij
.
,=
1; #0,#47
,p
fred jim jim fred freddy jimmy effreda mijimij
,x/[A-Za-z]+/{
g/fred/v/...../c/jim/
g/jim/v/..../c/fred/
}
,
jim fred fred jim freddy jimmy effreda mijimij
```

# 雑記事。
【Linux】デフォルトのパーミッションの変更(umask)

# デフォルトのパーミッションの変更について
ファイルやディレクトリを作成した際のデフォルトのパーミッション変更をしたい場合は、umaskの値を変更する必要があります。
現在設定されているumaskの値は確認したい時には、`umaskコマンド`で確認する事が出来ます。
コマンドを実行すると、0002が現在のumaskの値である事が分かりました。(-Sオプションを使用する事で、属性をシンボルで確認出来ます。)

```shell-session
[test_01@localhost ~]$ umask
0002
[test_01@localhost ~]$ umask -S
u=rwx,g=rwx,o=rx
```

ディレクトリの基本パーミッションは`777(rwxrwxrwx)`で、ファイルは`666(rw-rw-rw-)`となっております。
上記基本パーミッションからumaskの値を引いた値が、デフォルトのパーミッションになります。
現在の設定では、`ディレクトリは777-002=775`となります。`ファイルは666-002=664`となります。

実際にファイル/ディレクトリを作成して、想定通りのパーミッションである事を確認しました。

```shell-session:
[test_01@localhost ~]$ touch test
[test_01@localhost ~]$ mkdir test_dir
[test_01@localhost ~]$ ll
合計 0
-rw-rw-r-- 1 test_01 test_01 0  3月  6 19:18 test
drwxrwxr-x 2 test_01 test_01 6  3月  6 19:18 test_dir
```

umaskの値の変更は、`umask 変更したい値`とする事で変更出来ます。
変更後に、デフォルトのパーミッションが変更された事を確認してみます。
`umask　0000`を実行後にファイル/ディレクトリを作成すると、`ファイルは666`で`ディレクトリが777`のパーミッションとなっている事を確認出来ました。

```shell-session
[test_01@localhost ~]$ umask 0000
[test_01@localhost ~]$ touch test
[test_01@localhost ~]$ mkdir dir
[test_01@localhost ~]$ ll
合計 0
drwxrwxrwx 2 test_01 test_01 6  3月  6 19:29 dir
-rw-rw-rw- 1 test_01 test_01 0  3月  6 19:26 test
```

ログアウトすると、umaskの値は設定ファイルで指定された値が再度設定されます。
設定ファイルの値を変更する事で、恒久的にumaskの値を変更する事が出来ます。

# 設定ファイル内でumaskを設定する
`/etc/profile`ファイルを編集して、デフォルトのパーミッションを設定する事が出来ます。
ユーザー毎に指定したい場合は、ホームディレクトリ配下の`.bash_profile`を編集して下さい。

`/etc/profile`ファイル内に、下記のような記載がございます。
`$UIDが200以上 AND ユーザー名とグループが同一`の場合は、umask 002が実行されるようです。
それ以外が、022のようです。変更したい値を`umaskコマンド`に指定すればよいでしょう。

※`/etc/login.defs`ファイルの`UID_MIN`の値が200以上の場合に、一般ユーザーを作成している場合はuidが200以上となっているはずです。(当方の環境では、デフォルトで1000が設定されていました。)

```shell-session:/etc/profile
if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
    umask 002
else
    umask 022
fi
```

個別のユーザーだけ対応したいという場合は、`.bash_profile`に`umask 変更したい値`を記載しましょう。

```shell-session:umask 0077を追記
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/.local/bin:$HOME/bin
umask 0077

export PATH
```