OmniAICreator/Qiita-1.07M huggingface dataset:
arm版 win11で 23h2にアップデートする方法

### あらまし
#### Arm版Windows11 (Mac)で、アップグレード (22H2->23H2)

* Windows Updateをかけても、アップグレードが降りてこない時に…
* 強制アップグレードは、Windows 11 インストール アシスタントがArm版に未対応なためできなかった
* 一時的なグループポリシーの変更で、Windows Updateでアップグレードができるようにした
 （アップグレード後、設定を元には戻しますが、自己責任で）  

##### 追記 (2025.5)  
私の環境では23H2->24H2には適用できなかった（Windows Updateでファイルが降りてこない）ので、arm版 Windowsのisoを入手してアップデートしました (末尾に追加）。安全面を考えると、まずは下記を試すことをお勧めします。

### 環境
Windows 11 Pro 22H2 (Arm版)
MacOS 14.4.1 (Sonoma) の Parallels Desktop 19

### 手順
グループポリシーを一時的に変更し、参照バージョンを明示的に指定してからWindows Updateをかけると、Arm版でも自動的にアップグレードが行われる。

#### １. グループポリシーエディターを起動
検索メニューに下記を入力
~~~
gpedit.msc
~~~  

#### ２. 関係するグループポリシーを選択
順にクリックするだけ
~~~:ローカル グループ ポリシー
コンピューターの構成
 - 管理用テンプレート
 　- Windowsコンポーネント
 　  - Windows Update
 　    - Windows Updateから提供される更新プログラムの管理
 　      - ターゲット機能更新プログラムのバージョンを選択する
~~~

#### ３. アップグレードしたいバージョンを指定
編集メニューが開くので、下記３箇所を選択・入力
（下記は22H2->23H2の例）
~~~:ターゲット機能更新プログラムのバージョンを選択する（上側）
　[ ] 未構成
　[x] 有効   (こちらを選択）
　[ ] 無効
~~~
~~~:オプション（左下）
どのWindows製品のバージョンから機能更新を受け取りますか？
Windows 11  <- 入力
機能更新プログラムのターゲットバージョン
23H2        <- 入力
~~~
(注意) Windowsと11の間には半角スペースが必要 (詳細はコメント参照)

#### ４．Windows Updateにて「更新プログラムのチェック」
　-> 23H2が出てくるので、インストール、再起動

#### ５. アップグレード後のバージョン確認
検索メニューで下記コマンドを入力
~~~
winver
~~~
バージョン23H2と表示されていれば成功

#### ６. 念のため、もう一度「更新プログラムのチェック」をかける

#### ７. グループポリシーの設定を戻す (gpedit.msc)
さし当たっては必要ないが、後々のため
~~~:ターゲット機能更新プログラムのバージョンを選択する
　[x] 未構成　（「有効」から変更）
　[ ] 有効
  [ ] 無効
~~~

### 参考にしたサイト
22H2へのアップグレードを対象としていますが、23H2への手順も同じ

Https://www.stephenwagner.com/2022/11/09/how-to-force-windows-11-22h2-feature-update

### 別法：ISOを使ってのアップデート (2025.5追記)  
グループポリシーを設定しても、Windows Updateで更新ファイルが降りてこない場合、下記方法で、Windows11**arm版**のISOファイル(OSディスクイメージ)を入手・作成して、アップデートすることも可能です。  
なお、USBなどのメディアは使用しません。
###### 更新ファイルが降りてこないのは、システムの一部が未対応だったからかもしれません。下記は最終手段とお考え下さい。なお、再インストールと同様の手順を踏みますが、ユーザーファイルや各種設定は基本的には保持されます。
#### 1. いずれかの方法でISOファイルを入手・作成  
ファイルは(Mac側ではなく)Windows側に置く
#### a) マイクロソフトのサイトからダウンロード  
（私は試していません）

https://www.microsoft.com/ja-jp/software-download/windows11arm64
#### b) UUP dumpを用いて、最新版のISOを作成  
  (下記を参考にしました）  

https://qiita.com/hann-solo/items/d9f1d277943e2470818d

#### 2. Windows 11内でISOファイルをマウント  
- エクスプローラなどで、ファイルを右クリック、「マウント」を選択  
#### 3. ISOフォルダ内の「setup.exe」をクリック・起動  
- 以前の設定を保持したい場合は、途中で出てくる「個人用ファイルとアプリを引き継ぐ」オプションを選択  
- それ以外は、画面の指示に従えば、何回か再起動した後、アップデートが完了
【Atcoder初心者向け】入力コードの書き方


私自身、友人の紹介でAtcoderを始めたとき、まず入力の仕方がわからず困っていました。同じことで悩んでいる方も多いと思い、本記事では入力別に、pythonの入力コードを紹介します。

## Atcoderとは
Atcoderとは国内の競技プログラミングサイトです。誰でも無料で簡単に参加でき、問題の正答数や解答時間に応じて、レートが設けられています。

https://atcoder.jp/?lang=ja

## パターン別入力方法
入力は大きく分けて**複数入力**、**配列入力**、**行列型入力**の３パターンがあります。

### 複数入力
<img width="300px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3753744/ddfa8c13-1b28-96a1-c64c-ec8fc68e8fcc.png">

``` python
w,b=map(int,input().split())
```

複数入力には**map関数**を用い、split()は要素間に空白をあけて入力することを意味します。
数字の場合はint、文字の場合はstrを用います。

### 配列入力
<img width="300px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3753744/4338a18b-ca4c-01b5-a39c-0d92dfe321fa.png">

``` python
n=int(input())
a=list(map(int,input().split()))
```

listは配列として入力するときに用いる関数です。

### 行列型入力
<img width="300px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3753744/b78d3577-64bf-1f14-8e3d-646aba7100f8.png">


``` python
n=int(input())
a =[list(input()) for i in range(n)]
b =[list(input()) for i in range(n)]
```

各要素間にスペースが空いている場合は，input().split()になります．

## まとめ
Atcodetでは上記の３つの入力パターンを使えば、ほとんどすべての問題の入力に対応できます。ぜひ活用してください！
Ubuntu Serverにデスクトップ環境GNOMEの追加

以下の手順で、GUIなしのUbuntuサーバーにデスクトップ環境を追加できます：

1. システムをアップデートします：
```
root@dlp:~# apt update && apt upgrade -y
```

2. GNOMEデスクトップ環境をインストールします：
```
root@dlp:~# apt -y install ubuntu-desktop task-gnome-desktop

(# apt install --no-install-recommends gnome-core)

root@dlp:~# reboot
```

3. 再起動後、ログイン画面が表示されます。お好みのユーザーでログインし、初期設定画面が表示されます。指示に従って設定してください。

4. 初期設定が完了すると、Ubuntu 22.04のデフォルトデスクトップ環境であるGNOMEデスクトップが起動します。

-------
GNOMEは代表的なデスクトップ環境の一つです。現在は「GNOME 3」が使われています。もう一つのインストール方法です。（コマンドの先頭にsudoを省略）
```
apt install tasksel
tasksel install ubuntu-desktop
reboot
apt install gdm3
systemctl enable gdm3
systemctl start gdm3
apt install gnome-system-monitor
```
-------


**追記: 起動時の待ち時間をなくす**

1. ターミナルを開きます。
2. 以下のコマンドを入力して実行します：
```
~# systemctl disable systemd-networkd-wait-online.service
~# systemctl mask systemd-networkd-wait-online.service
```

これにより、OSの起動時に「A start job is running for wait for network to be configured.」という表示が出て数分待たされる問題を回避できます。


Firefoxの文字化け問題が起きた場合、以下の手順で解決できます。

1. **問題**: Firefoxで文字化けが発生。
2. **解決策**: snapを使用してFirefoxを再インストール。
3. **手順**:
   - Firefoxを削除: `sudo snap remove firefox`
   - Firefoxをインストール: `sudo snap install firefox`
rpicamコマンドを使ったシェルスクリプトを書いた

## 経緯
Pythonで使用できるRaspberryPiのカメラ用のライブラリpicamera2がなかなか言うことを聞いてくれないのでデフォルトで用意されているrpicamコマンドを使用したシェルスクリプトを書きました。
## 概要
仕様は至って簡単です。引数にシャッタースピード（秒）を与えて実行すれば、そのシャッタースピードで撮影ができます。引数を与えなければAUTOで撮影をします。コード内の# CONFIG部分で出力先を調整してください。
実行例
```$ bash camss.sh 30``` →シャッタースピード30秒で撮影する
## コード
```bash:camss.sh
#!/bin/bash

# CONFIG
DataDir="出力先のフルパス"

# INIT
SSpeed=${1}

# MAIN
if [ -z $SSpeed ]; then
	cd $DataDir
	rpicam-still -e png -n 1 --datetime
elif [ -n $SSpeed ]; then
	cd $DataDir
	SSpeed=$((SSpeed*1000000))
	rpicam-still -e png -n 1 --shutter $SSpeed --datetime
fi
exit 0
```
他のオプションで撮影したい場合は```$ rpicam-still --help```コマンドや公式ドキュメントなどが参考になると思います。そちらを参考にコード内のオプションを色々変更して楽しんでみてください！私の場合は星空撮影がしたかったのでシャッタースピードの制御だけで要件を満たせましたが😃
チャンキングする理由をわかりやすく（LLM)

LLMのチャットボットアプリを作っているが、チャンキングについてネットで調べてもあまり意味がわからなかったので、自分なりにわかりやすくまとめてみました。


# 長文を処理する際に LLM がテキストを分割する理由
- 処理能力の限界
- コンテキストの保存


## 処理能力の限界
LLM には、一度に処理できるテキスト量に制限があります。この制限は、モデルのアーキテクチャや利用可能なコンピューティングリソースなどの要因に基づいています。テキストを小さなチャンクに分割することで、LLM は情報をより効率的に処理することができます。
### 例）
処理能力の限界: LLM を人間の作業メモリに例えると分かりやすいでしょう。一度に大量の情報を与えられたら、人はすべてを記憶するのが難しくなります。同様に、LLM に大量のテキストを一度に与えると、処理能力を超えてしまう可能性があります。テキストをチャンクに分割することで、LLM は一度に処理できる情報量を減らし、処理効率を向上させることができます。


## コンテキストの保存
LLM が一度に全体のテキストを処理できたとしても、文書全体のコンテキストを維持するのが難しい可能性があります。テキストを特定のアイデアやセクションに焦点を当てたチャンクに分割することで、LLM はテキストの異なる部分間の関係をよりよく理解することができます。
### 例）
LLM は言語を理解するのが得意ですが、複雑なアイデアや長い論理の連鎖を追うにには能力が足りていません。テキストを特定のトピックや議論に焦点を当てたチャンクに分割することで、LLM は全体の情報の流れを追跡しやすくなります。これは、本の各章を要約してから、全体の話の内容を理解しようとするようなものです。

## まとめ
長文をチャンクに分割することで、LLM は処理能力の限界を克服し、質問応答、要約、またはさまざまなクリエイティブなテキスト形式の生成などのタスクでより良い結果を達成することができます。




初めての記事でかなりAIを使って書きましたが、コメント等もらえると嬉しいです。
【Tailwind CSS】viewportを意識したデザイン実装

## viewportとは？
ビューポート（viewport）は、Webページを閲覧する際に**ユーザーが実際に見ることができる画面の領域**を指します。つまり、Webサイトが表示されるブラウザのウィンドウ部分や、スマートフォンやタブレットなどのデバイスのスクリーンの表示範囲を意味します。

# tailwindでのviewportを意識したデザイン実装
Tailwind CSSで、ビューポートを意識したデザインを実装するには、sm（small）、md（medium）、lg（large）、xl（extra large）、2xl（2 extra large）といったプレフィックスをクラス名に追加することで、特定のビューポートサイズでのスタイル変更を指示できます。

```html:例
<div class="text-base md:text-lg lg:text-xl">
  このテキストはビューポートサイズに応じてサイズが変わります。
</div>
```
この例では、基本のテキストサイズはtext-baseですが、ビューポートがmdサイズになるとtext-lgに、lgサイズになるとtext-xlに変更されます。

またTailwind CSSでは、デフォルトの**ブレークポイントをカスタマイズすることも可能**です。**tailwind.config.js**ファイルを編集することで、プロジェクトの要件に合わせたブレークポイントを設定できます。

```javascript:設定例
module.exports = {
  theme: {
    extend: {
      screens: {
        'tablet': '640px',
        'laptop': '1024px',
        'desktop': '1280px',
      }
    }
  }
}
```

この設定により、tablet、laptop、desktopという新しいブレークポイントが追加され、それぞれのビューポートサイズに応じたスタイル適用が可能になります。
AtCoderの過去問200問解いて得たこと

はじめまして！CREとしてエンジニアをやってますkazuです🦌

AtCoderの問題を2023年12月から解き始めて、2024年4月で200 問に達成したので、そこで気づいたことをいくつか共有しようと思います！

![スクリーンショット 2024-04-28 8.30.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2597943/fcd22a12-8a74-86ea-9525-87d14571fd63.png)


やり始めた経緯などについては、前回の記事があるので、気になる方はご覧ください✨

[AtCoderの過去問100問解いて得たこと - Qiita](https://qiita.com/KazukiITWeb1/items/07ac25930d859ed15e91)

# 100問との違い

- 問題にもよるが1~2処理は、パッと思いつくようになった
- 人のコードを参照するようになった
- 「この問題のときは、この関数が使えそう」など脳内サジェストできるようになった
- 「この問題はすぐに解ける」「これは少し時間がかかる」など自分の中の基準ができた

## 問題にもよるが1~2処理は、パッと思いつくようになった

これは、大きな進歩と言えそうです。今までは、解く事が一つのゴールだったのですが、その先を見据えられるようになりました。多分、強強エンジニアなんかは、これがいくつもパターンがあって、そこから最適なものを選ぶことでパフォーマンスを出しているんだろうなと思います。

僕はまだ、問題に対して最適解を出せるほど、解法の数が多くないので、まずは引き出しを増やすことを意識しなくちゃなと思います。

マイクロソフトの牛尾さんが、言ってましたが、脳の負担を減らす方法として以下を提唱していたので、まずはレベル1を増やすことを継続して行っていきたいなと思います。

😩レベル4:自分では無理

😟レベル3:スパイクソリューションがあればなんとかなる

🙂レベル2:ググれば解決できる

😄レベル1:何もググらず即実装ができる

## 人のコードを参照するようになった

100問までは、問題を解くことに必死で、とりあえず問題をクリアすればいいと思って望んでいたのですが、だんだん溶けるようになってくると「不細工なコードより、かっこいいコードを書きたい」と思うようになりました。そのため、自分が提出したコードを他の人のコードと見比べて、「これはかっこいいな」とか「これは見づらいな」とか色々観察するようになりました。

そこで新しい記述を得ると、次回以降の処理で試したりできるので、自然と自分のレパートリーが増えることを実感しました。

## 「この問題のときは、この関数が使えそう」など脳内サジェストできるようになった

数を一定こなす事によるメリットかもしれませんが、問題の傾向から、「この関数とこの関数は使えそう」とかいくつかの関数を引き合いに出して、別々の処理パターンを考えることもできるようになりました。

自然にできる感覚は、常に脳内引き出しにその関数が閉まってあって、開けたらすぐ出てくる感覚に近いです。

それらが、すでに机の上に並んでいる状態で、そこからどれを使おうと考える感じとも言っていいかもです。

## 「この問題はすぐに解ける」「これは少し時間がかかる」など自分の中の基準ができた

定量的に数をこなしたので、自分の中でこの問題に対する時間がどのくらいかかるのか？などなんとなくでも把握できるようになりました。恐らく、これは実務的にも工数の見積りなんかで使えるんじゃないかなと思います。

# 200問解いて得たこと

- 定量をこなすことに順応してきた
- 忍耐力がつく

## 定量をこなすことに抵抗感がなくなり、順応してきた

最初は、問題を解くことも億劫であった自分ですが、今となっては朝30分を使って、2問解く事が習慣になっています。慣れって怖いですね。

ただ、定量をこなすだけだったら、続かないと思うのですが、自分の成長が目に見えるため、それが面白くてどんどんはまってやってしまう感じです。

今では、1つの目標として、1000問解くことを目標にしています。こうやって、一つ一つ自分の基準を上げていけば、新しい事を始めた時に、それが参考になったりするので、一定の量をこなすことは何をするにしても、大事にしています。

## 忍耐力がつく

数に対する抵抗感がなくなり行動おこしてると、自然と忍耐力が身についてきます。人間ですから、途中で面倒くさくもなります。それでも、やらない1日で後悔したくないので、どんなにめんどくさい日でも1問は解くようにしています。これを繰り返してると、自然と忍耐力が身につくという（笑）

ゴルフの時もそうでしたが、成長曲線って、右肩上がりに直線ではなく、なだらかなカーブを描いて成長していくので、焦らず、目の前の1問に取り組むのみです。

この精神をゴルフで、先に学んでいたからこそ、続けられているのもあるかもしれません。

# まとめ

ここまできたら、1000問までは報告できるように頑張りたいなと思います。とりあえず、A問題は解けるようになったので、次はB問題に挑戦していこうかなと思います。

B問題を普通に解けるようになったら、1ランクアップしそうな気がします。
Next.jsでrun dev した時にHTTPSで立ち上げたい

# はじめに

こんにちは、エンジニアのkeitaMaxです。

Next.jsでrun dev した時にHTTPSで立ち上げたいと思い、備忘録として残します。

# 結論
>Webhook や認証などの特定の使用例では、 で安全な環境を構築するために HTTPS の使用が必要になる場合がありますlocalhost。 Next.js は次のようにして自己署名証明書を生成できますnext dev。
(翻訳引用：https://nextjs.org/docs/pages/api-reference/next-cli#https-for-local-development)

`package.json`のscriptのdevを以下にするとHTTPSで立ち上げることができるらしいです。

```
"dev": "next dev --experimental-https",
```

# おわりに
証明書などを作成しなくても、とても簡単にSSL化できるんだなと思いました。

この記事での質問や、間違っている、もっといい方法があるといったご意見などありましたらご指摘していただけると幸いです。

最後まで読んでいただきありがとうございました！

# 参考

https://nextjs.org/docs/pages/api-reference/next-cli#https-for-local-development
cURLを使ったAPI認証：-u オプションと -H オプションの違い

curlコマンドで、Basic認証を指定する際にuオプションを使用した方が楽なのでメモ

# 前提
Basic認証が設定されたAPIにユーザーのクレデンシャルを渡す場合、ユーザー名とパスワードをコロン(:)で結合し、その文字列をbase64にエンコードした値をリクエストヘッダーのAuthorization に含める必要がある。

# -uオプション
-u オプションを使用する場合は、ユーザー名とパスワードを直接指定するため、base64エンコードする必要がない。

curlコマンドは、指定されたユーザー名とパスワードを内部でbase64エンコードしてから、サーバーに送信してくれる。

```bash
curl -u "user:password" https://example.com/protected_resource

```

# -Hオプション
-Hオプションは、HTTPヘッダーを直接指定するために使用されるので、このオプションを使用する場合はAuthorization にbase64エンコードした認証情報を指定する必要がある。

```bash
curl -H "Authorization: Basic QWxhbmQ6cGFzc3dvcmQ=" https://example.com/protected_resource
```

# 結論
-uオプションの方が楽
【Tailwind CSS】fixedプロパティの使いどころ

アプリのメイン画面を作る時、まずサイドバーの部分とメインコンテンツの部分に分けたいですよね（こんな感じに↓）

![localhost_3000_learn (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1850625/c219c3d6-20e9-ef4d-bc7b-2dcbbb42adf3.png)

ただ以下のような実装だとサイドバーとメインコンテンツが横に表示されず、解消方法が分からなかったのでメモとして残しておきます。


**サイドバー**
```tsx:sidebar.tsx
export const SideBar = () => {
  return (
    <div className="bg-blue-500 h-full w-[256px]">
      SideBar
    </div>
  )
}
```

**メインコンテンツ**
```tsx:page.tsx
const LearnPage = () => {
  return (
    <div>
      Learn Page
    </div>
  )
}

export default LearnPage
```

**メインページのレイアウト**
```tsx:layout.tsx
import { SideBar } from "@/components/sidebar"

type Props = {
  children: React.ReactNode
}

const MainLayout = ({
  children,
}: Props) => {
  return (
    <>
      <SideBar/>
      <main className="pl-[256px] h-full">
        <div className="bg-red-500 h-full">
          {children}
        </div>
      </main>
    </>
  )
}

export default MainLayout
```

このような実装の場合、以下のような表示になってしまいます。
![localhost_3000_learn.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1850625/1511da41-49fb-5070-cf3c-c2278949c564.png)

皆さん、どこを直せばよいか分かりますか？

正解は「sidebar.tsxのclassNameにfixedを追記する」です。

**修正語のsidebar.tsx**
```tsx:sidebar.tsx
export const SideBar = () => {
  return (
    <div className="bg-blue-500 h-full w-[256px] fixed">
      SideBar
    </div>
  )
}
```

以下の動画（1:14:28付近）で解説しています。

https://www.youtube.com/watch?v=dP75Khfy4s4&t=4442s

以上です。
JavaScriptのNumber型はいくつの階乗まで扱えるか調べてみた

前提：JavaScript の数値型のNumber は 倍精度64ビット浮動小数点形式 (IEEE 754) になっており、`2**1024 - 1` まで表示可能です。JavaScript における安全な整数の最大値は `2**53 -1` です

```js
[...Array(1000).keys()]
    .map(term => ++term)
    .reduce((acc, current, index) => {
        if (acc * current > Number.MAX_SAFE_INTEGER) {
            console.log(`項数：${index}\n十進法：${BigInt(acc).toString()}\n二進法：${BigInt(acc).toString(2)}`);
            throw new Error(`loop:${index}`);
        }
        return current *= acc;
    }, 1);
// 項数：18
// 十進法：6402373705728000
```

結論としては 18 の階乗まで扱えました。

## BigInt で Number の限界を超える

```js
[...Array(1000).keys()]
    .map(term => BigInt(++term))
    .reduce((acc, current, index) => {
        if (acc * current === Infinity) {
            console.log(`項数：${index}\n十進法：${acc.toString()}\n二進法：${acc.toString(2)}`);
            throw new Error(`loop:${index}`);
        }
        return current *= acc;
    }, BigInt(1));
```

Number.MAX_VALUE よりもっと大きい数字を JavaScript で扱うには BigInt を使いましょう。

## Link

- [Array.prototype.reduce() - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce)
- [BigInt - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/BigInt)
- [Number - MDN Web Docs 用語集: ウェブ関連用語の定義 | MDN](https://developer.mozilla.org/ja/docs/Glossary/Number)
- [Number.MAX_SAFE_INTEGER - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER)
- [Number.MAX_VALUE - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_VALUE)
Grid Layoutを使った簡単なweb配置

私が最近，Webサイトを作成する際に多用しているgridの使い方について紹介する．

## gridって何?
CSSのGrid Layoutは，2次元レイアウトを簡単に作成することができる機能です．列と行を定義し格子状の箱を作ることによって，どの箱にどの要素を配置するのかを簡易的に行うことができます．

**コンテナ**
グリッドとして分割する親要素のことをコンテナを言い，コンテナでどのような分割の仕方をするのかを記述します．

**アイテム**
グリッド内の配置される個々の要素であり，通常、HTML要素がアイテムとなります．

以下のようなレイアウトが簡単にできます．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759397/91477108-3a2f-5f65-7e7a-a61a6d3360bd.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759397/c6ca779a-4a16-759b-b4e1-228c5f25ff2f.png)


## gridの使い方

### 親要素（コンテナ）での定義

1. **displayプロパティの定義:** Gridを有効にするために、親要素に`display: grid;`を適用します。

2. **列の定義:** `grid-template-columns`で行の区切り方を定義します。

3. **行の定義:** 必要に応じて、`grid-template-rows`で列の区切り方を定義します。

4. **アイテムの配置方法の指定:** 必要であれば、`align-items`や`justify-items`を使用して、アイテムの配置方法を制御します。

:::note
`grid-template-columns`や`grid-template-rows`の定義の方法はさまざまで、ピクセル単位、`1fr`、`auto`、`repeat()`などがあります。
:::

### 子要素（アイテム）での定義

1. **行の配置位置:** `grid-column`でアイテムをコンテナのどの列に配置するか指定します

2. **列の配置位置:** `grid-row`でアイテムをコンテナのどの行に配置するか指定します

3. **コンテナから見たアイテムの配置位置指定:** 必要であれば、`align-self`や`justify-self`を使用して、コンテナから見たアイテムの配置方法を制御します

:::note
`grid-column`や`grid-row`の定義の方法もさまざまで、例えば単に`1`と指定すると行（列）の一つ目の場所に配置されます。また、`1/5`と指定すると行（列）で1から5までのグリッドの範囲を指定することになります
:::

## gridを使った例
```index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel="stylesheet" href="./Untitled-2.css">
</head>
<body>
    <header>
        <p>ヘッダータグ</p>
    </header>
    <main>
        <p>メイン</p>
    </main>
    <footer>
        <p>フッター</p>
    </footer>
</body>
</html>
```
```index.css
body{
    height: calc(100vh - 16px);
    width: calc(100vw - 16px);
    display: grid;
    grid-template-columns: repeat(10, 1fr);
    grid-template-rows: repeat(10, 1fr);
}
header{
    display: grid;
    height: 100%;
    width: 100%;
    grid-column: 1/11;
    grid-row: 1/2;
    background-color: rgb(240, 186, 186);
}
main{
    display: grid;
    height: 100%;
    width: 100%;
    grid-column: 2/10;
    grid-row: 2/10;
    background-color: greenyellow;
}
footer{
    display: grid;
    height: 100%;
    width: 100%;
    grid-column: 1/11;
    grid-row: 10/11;
    background-color: rgb(148, 148, 213);
}
p{
    font-size: large;
    font-weight: bold;
    align-self: center;
    justify-self: center;
}
```

これらの手順に従うことで、簡単かつ効果的にCSS Gridを使用して複雑なレイアウトを構築することができます。
ボックス使わないobject detection

# フレーム内に検出されているものの割合を100%表示

:::note info
HW/SW spec
### HW
1. Laptop RTX 4050 6GB / 12th Gen Intel® Core™ i5-12450H × 12
1. 32GB memory

### SW 
- Ubuntu 20.04LTS
- python 3.8 / CUDA
- Pytorch 1.13+CUDA
:::

# 子供の学習用に
- imagenet_class_index.json でラベル付
- 個別の信頼度%ではなく画面内の合算（100% total)

# sample Image サンプルイメージ
- サンデープログラム・・・
- ファミレスで朝勉していますが、メニューの方は野球選手と認識されている率が高い模様

![detect_sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2155177/d2a7885d-e0d8-5223-aea7-58735ca9b13b.png)

:::note info
Explanation 
- Pytorch + imagenet_class_index.json + Resnet50
- simple object detection study for my kids
:::

## script

https://github.com/mi-kaneyon/man-yard/tree/main/recognize

# オチはないです・・・
- 働いている会社では教材的な位置づけで作ってみました
- 使いみちとしては学習、ラベルファイル等の自作で活用してみるとか
- でも、Imagenet自体ラベルが十分な量を備えていますね
7セグの3分タイマーで遊ぶ。(STM32C011J4M7)


x 過去ログを見よ!!

目的
7セグで遊ぶ


![o_coq072.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/02a469f2-b0d1-b088-7b53-ff3ca4f019a4.jpeg)



```c++



//AE_7SEG_BOARD_3MIN_TIMER_C011_1


//*          *****  *****
//*         *       *    *
//*         ******  *    *
//*         *       *    *
//*         *       *    *
//********   *****  *****


//インクルド
#include <Arduino.h>


//定義
#define DW   digitalWrite

#define swdio   PA12
#define swdclk  PA8
#define en      PB7

int seg[32] = {
  0x3f , //15 O  o　combined use "0"
  0x06 , //9 I    　combined use "1"
  0x5b , //26 Z　combined use "2"
  0x4f , //27 [  --> "3"
  0x66 , //28 \  --> "4"
  0x6d , //19 S　combined use "5"
  0x7c , //2 B     　combined use "6"
  0x27 , //29 ]  --> "7"
  0x7f , //26 ^  --> "8"
  0x67 , //17 Q　combined use "9"
  0x77 , //1 A  o
  0x7c , //2 B     　combined use "6"
  0x39 , //3 C
  0x5e , //4 D
  0x79 , //5 E  o
  0x71   //6 F
};


void seg1(int v)
{
  for (int jj = 0; jj < 8; jj++) {
    if ( (v & 0x80) == 0 ) {
      DW(swdio, 0); //ビットが0
    } else {
      DW(swdio, 1); //ビットが1
    }//endif
    v = v << 1;
    DW(swdclk, 1);
    DW(swdclk, 0);
  }//for
  DW(en, 1);
  DW(en, 0);
}//seg1


void ns_num(int ch) {

  ch = seg[ch & 0x0f];
  seg1(ch);

}//ns_num



//初期化
void setup() {

  //7セグの初期化
  pinMode(swdclk, OUTPUT);
  pinMode(swdio, OUTPUT);
  pinMode(en, OUTPUT);
  DW(en, 0);
  DW(swdclk, 0);

} //setup


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

  //タイマーの設定値
  int stop1 = 3;

  //タイマーのループ
  for (int i = 0; i < stop1; i++) {

    //数字の表示
    ns_num(i);

    //1分待つ
    for (int j = 0; j < 60; j++) {
      delay(1000); //1秒待つ
    }

  } //for i

  //タイマーの設定値を表示
  ns_num(stop1);

  //無限ループ
  while (1) {}

} //loop



```
Buttonで文字が入力されていない時に無効にする(chakra UI)

## 初めに
元医療職 → WEB制作者がReact開発で詰まった箇所を日々発信しています！
現在はJISOUというコミュニティに所属してReact開発を学習中。
今回Udemyの講座で、Chakra UIが提供している`<Button>`動作が正常に実装できなかったので、共有します。

## ゴールとなるButton動作
今回実装したかったボタンはトップページにログイン画面を設置して、ログインする際にクリックするボタンです。
詳細は以下です。
- Json Placeholderからユーザー情報を取得
- inputに値を入力して、その値とJson Placeholderから取得したユーザー情報が一致すればログインできる
- inputに何も入力していなけれボタンをクリックできない仕様

## 間違っていたコード
```typescript
< Button disabled={disabled} onClick={onClick} >{children}</ Button>
```

### コードの説明
今回わかりやすくするためにCSSは省略しています。
このボタンは**親コンポーネントから、propsとしてdisabled（全て波括弧内を指しています）を受け取っています**。
他にもonClickやchildrenを受け取っていますが、今回は触れません。

親コンポーネントからpropsとしてdisabled（trueもしくはfalse）を受け取って、**false（inputに何も入力されていない）であればボタンがクリックできない**仕様です。
しかしこの記述では何も入力されていない状態でも、ボタンがクリックできてしまいます。
console.log(disabled)でdisabledがtrueとfalseの場合も確認しましたが、どちらの場合でもクリックできてしまう感じでした。
どうやら**disabledというプロパティが使えない**ようです...

## 解決策
以下のコードに書き換えると正常に動作します。
```typescript
<Button isDisabled={disabled} onClick={onClick} >{children}</Button>
```
変わった箇所は`disabled`を`isDisabled`に変えたことです。
以下の記事を参考にしたところ、`disabled`という記述は**バージョンが古い時の記述**らしく、現在Chakra UIが提供しているプロパティは`isDisabled`だそうです。

https://qiita.com/FumioNonaka/items/3f3be1fa53727d113562

## 終わりに
React関連はバージョンアップがめっちゃ多いなと実感しています。
いくら動画講座も、バージョンアップによりサポートされていない記述をしている講座もあります。
ですが動画の通りにすんなりと進んでも、頭に入ってこないこともあるので、たまにはバージョンアップ問題で詰まるのもありだなとポジティブに考えています笑
実際に**今回詰まったことで、エラーの箇所を探すなどして全体のコードの流れを掴むことができました**。
js/ts環境で発生するError: Service firestore is not availableの解決策

こんにちは。[virapture株式会社](https://virapture.com)でCEOしながら[ラグナロク株式会社](https://ragna-rock.com)でもCKOとして働いている[@mogmet](https://twitter.com/mogmet)です。

まったく最近忙しすぎてOutputできてなかったのですが、たまにはアウトプットを頑張ろうと久々に手をとりました。

今回はトラブルシューティング系のものになります。

## エラー概要

adminで使われるnode.jsやクライアントで使われるjsの環境にて、firestoreのインスタンスを取ろうとすると下記のようなエラーが出ることがあります。

> Error: Service firestore is not available

firebase自体のinstanceも生成できてるのになんで・・・と毎回苦しんでました

## 原因

モノレポなどでやっていると発生しがちなのですが、共通パッケージとかで使っているfirebaseのバージョンが一致していないために発生するものになります。
参照してるパッケージが違うとこのようなエラーになるようなので、adminとclientがごっちゃになってる場合も要注意です。

## 解決策
２つあります

### その１： versionが合っているか
firebaseのバージョンを合わせてインストールし直してください！

### その2: typeを使う

importする時に実体をインポートするだけでこのケースに陥る事があるので、typeを使ってimportするようにしてみましょう。
こんな感じです。
```ts
import type { DocumentSnapshot as ClientDocumentSnapshot } from 'firebase/firestore'
import type { firestore as serverFirestore } from 'firebase-admin'
```

## まとめ

`service xxx is not available` といわれたらパッケージのバージョンを疑うようにしましょう！

最後に、スノボの楽しく滑るコツを掴める [cotsume](https://cotsume.page.link/blog) というアプリを作ってます！よかったらDLしてみてね！

https://cotsume.page.link/blog

また、[ワンナイト人狼オンライン](https://online.1nite-jinro.com/link/blog)というゲームを作ってます！よかったら遊んでね！

https://online.1nite-jinro.com/link/blog

他にも[Camecon](https://camecon.me/)や[Offcha](https://offcha.com/)、問い合わせ対応が簡単にできる[CSmart](https://csmart.jp/lp)、フリーランスのコミュニティの[NextFreelance](https://next-freelance.net/)といったサービスも作ってるのでよかったら使ってね！

https://camecon.me/

https://offcha.com/

https://csmart.jp/lp

https://next-freelance.net/

また、チームビルディングや技術顧問、Firebaseの設計やアドバイスといったお話も受け付けてますので御用の方は弊社までお問い合わせください。

https://virapture.com/
https://menta.work/user/20565

ラグナロクでもエンジニアやデザイナーのメンバーを募集しています！！楽しくぶち上げたい人はぜひお話ししましょう！！

https://ragna-rock.com
【完全無料】TOEIC、TOEFL、ILETSの価格が超高く見える？EFSETなら無料で今話題の英語4技能測れて履歴書に書けます。履歴書への書き方も紹介！

TOEICが高い！地味に出費があります。英語４技能を一度に測定できる無料テストがあるんです。英語資格に5000円以上を支払う時代は終わりました。しかもスピーキングやライティングも測れてしまいます。これは革命的ですね。

https://www.efset.org/4-skill/


スピーキング、ライティング、リスニング、リーディング、 英語の4技能を総合的に診断できる無料テストで実力をチェックしませんか？ EF SET なら、全ての結果が英語力証明書として提示されます。

あなたの英語力を詳しく分析

EF SET終了後、あなたの英語力を詳しく示した公式英語力証明書を即座に発行。他のEFテストと同様、完全無料です。

テストを始める

なぜこの英語テスト？

無料の証明書をゲット テスト終了後、スピーキング、ライティング、リスニング、リーディングの全技能を証明する EF SET 英語力証明書が即座に発行されます。

英語レベルを把握 最先端のAI技術によるテストデザインで、CEFR（ヨーロッパ言語共通参照枠）の A1 から C2 レベルまで正確にあなたの英語力を測定します。

試験対策に最適  TOEFL、IELTS など各種英語試験の準備にも。 EF SET はCEFR に準拠しているため、他の英語試験のスコア予測にも役立ちます。

より短くしたい場合、５０分の


https://www.efset.org/ef-set-50/

もあります。証明書付きです。
１５分のテストもあります

https://www.efset.org/quick-check/


もあります。ただし証明書は付きません。

EF SET（EF SET Certificate）は、履歴書に記載可能な英語力証明書です。 履歴書に記載する際は、資格・免許欄に「取得年月」「正式名称」「取得点数／合格した級」を記載します。 EF SETの正式名称は「EF SET Certificate」なので、資格欄には「EF SET Certificate」と記載します。
更に詳しい履歴書への書き方を書きます。
まず公式の書き方です。
EF SET English Certificate 51/100 (B2 Proficient)

これだと2技能（リーディング・リスニング）を測るテストと4技能（リーディング・リスニング・ライティング・スピーキング）を測るテストの見分けがつきません。

その場合

EF SET English Certificate 51/100 (B2 Proficient)(R&L)
EF SET English Certificate 41/100 (B1 Proficient)(R&L&W&S)

TOEICの書き方と比較して書きました。ご参考にしていただければ幸いです。

と書くとすっきり違いを書けるのではないでしょうか。

いますぐ無料の英語力判定を始めましょう！
VSCodeの新機能 タブの表示名をカスタムする。Next.js Routing Files 専用

Next.js の App router は同じファイル名が多くなるので、この機能は助かると思います。

# 参考

NextjsでVSCodeのタブのカスタムラベルを設定してみた #VSCode - Qiita

https://qiita.com/k_bobchin/items/c5031f5dfdc018c022ee

Visual Studio Code March 2024

https://code.visualstudio.com/updates/v1_88#_extensions-update-improvements

👆を参考に
VSCodeのsettings.jsonに追記します。

<details><summary>VSCodeのバージョン</summary>

```text
バージョン: 1.88.1 (user setup)
日付: 2024-04-10T17:41:02.734Z
Node.js: 18.18.2
OS: Windows_NT x64 10.0.19045

```

</details>

## 例
`src/app/layout.tsx` の場合

| 変数名 | 説明 | 例 |
|---|---|---|
| `${filename}` | ファイル名 | `layout` |
| `${extname}` | 拡張子名 | `.tsx` |
| `${dirname}` | 一つ上のフォルダ名 | `app` (=`${dirname(0)}`) |
| `${dirname(N)}` | N+1個上のフォルダ名 | `src` `${dirname(1)}` (N=1の場合)  |

* `${dirname(N)}` は、N+1個上のフォルダ名を返す変数です。Nを指定することで、さらに上の階層のフォルダ名を取得できます。 `${dirname(0)}`～
* 例はあくまで一例です。実際のファイル名やフォルダ名に合わせて変数を置き換えてください。

## 設定

```settings.json
  //////////////////////////////////////////////////////////
  // 実験的機能
  //////////////////////////////////////////////////////////
  // VSCodeの新機能 タブの表示名をカスタムする。
  // Next.js Routing Files 専用
  "workbench.editor.customLabels.enabled": true,
  "workbench.editor.customLabels.patterns": {
    "**/layout.{js,jsx,tsx}": "${dirname}のレイアウト",
    "**/page.{js,jsx,tsx}": "${dirname}のページ",
    "**/loading.{js,jsx,tsx}": "${dirname}の${filename}.${extname}",
    "**/not-found.{js,jsx,tsx}": "${dirname}の${filename}.${extname}",
    "**/error.{js,jsx,tsx}": "${dirname}の${filename}.${extname}",
    "**/global-error.{js,jsx,tsx}": "${dirname}の${filename}.${extname}",
    "**/template.{js,jsx,tsx}": "${dirname}の${filename}.${extname}",
    "**/default.{js,jsx,tsx}": "${dirname}の${filename}.${extname}",
    "**/route.{js,ts}": "${dirname} ${filename}.${extname} API",
    "**/callback/route.{js,ts}": "${dirname(1)} ${dirname} ${filename}.${extname}",
  },

```

※layoutとpageだけはよく使うので特別扱い。

Next.js App router を使っている人は、VSCodeの `settings.json` に貼り付けるだけで大丈夫です。
Android studioにて、プロジェクト立ち上げ後にビルドされない


:::note info
Java : 22.0.1
Gradle : 8-8-rc-1
Android studio :  iguana 2024.2.1 Patch1
:::



Android studioでプロジェクトを立ち上げたら、以下のエラーが出てきた場合

```
Unable to load class 'org.slf4j.LoggerFactory'
org.slf4j.LoggerFactory

Gradle's dependency cache may be corrupt (this sometimes occurs after a network connection timeout.)

Re-download dependencies and sync project (requires network)
The state of a Gradle build process (daemon) may be corrupt. Stopping all Gradle daemons may solve this problem.

Stop Gradle build processes (requires restart)
Your project may be using a third-party plugin which is not compatible with the other plugins in the project or the version of Gradle requested by the project.

In the case of corrupt Gradle processes, you can also try closing the IDE and then killing all Java processes.


```
対処法として
1.「File」から「Project Structure」

2.「Gradle version」を最新のものへ
　※以下画像は2024/4/28時点のものです。
 　バージョンはインストール済みのjavaと合うようにしてください
   （例えば、Java 22.0.1ならGradle 8-8-rc-1）
   
3.同期が終わるまで待機

![スクリーンショット (1438).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523419/d4858fec-a62e-bc26-4f32-394fab2554d5.png)
Javaで「コメントを記述する」の動作を確認してみた

# 概要

Javaで「コメントを記述する」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/start/const/index6.html

# 実装

以下のファイルを作成しました。
```JSample6_1.java
/**
 * JSample6_1
 *
 * 2021.02.11
 */
class JSample6_1{
  public static void main(String[] args){
    int sum = 0;

    // 10回繰り返す
    for (int i = 1; i <= 10; i++){
      sum = sum + i;  // 数値を順に加算する
    }

    /*
     集計した結果を画面に出力する
     */
    System.out.println(sum);
  }
}
```

以下のコマンドを実行しました。
```
$ javac JSample6_1.java 
$ java JSample6_1 
55
```

# まとめ

何かの役に立てばと。
イベントを解除する方法

登録したイベントを解除する方法のメモ

```html
<p>
    <button id="eventButton">イベントボタン</button>
</p>
```
一度押したら解除する場合、`addEventListener`の第3引数でonceをtrueにします。
```js
const event = document.querySelector('#eventButton')
event.addEventListener('click', logOutput, { 'once': true })

function logOutput() {
  console.count("^_^")
}
```

何か条件を指定し、解除する場合は`removeEventListener`に登録(add)した関数を指定します。下記のコードは4回絵文字が出力されるとボタンイベントが停止します。
```js
const event = document.querySelector('#eventButton')
event.addEventListener('click', logOutput)
let i = 0;

function logOutput() {
  i++
  if (i === 4) {
    event.removeEventListener('click', logOutput)
  }
  console.count("^_^")
}
```
[こちらのサイト](https://gray-code.com/javascript/setup-a-one-time-eventlistener/)のように同じボタンを2回押させたく無いときに使用します。

#### 参考

https://developer.mozilla.org/ja/docs/Web/API/EventTarget/addEventListener

https://gray-code.com/javascript/setup-a-one-time-eventlistener/
Unityにて「CocoaPods installation failure」が出た時にやったこと

## はじめに
MacOSの更新後、UnityでiOSビルドをしようとしたら、次のようなエラーが発生。
```
iOS framework addition failed due to a CocoaPods installation failure.
This will will likely result in an non-functional Xcode project.
```
Unityのビルド自体はうまくいくが、Xcodeプロジェクト（厳密にはxcworkspace）が正常に生成されないというもの。
このとき、やったことを記録しておく。

## 環境
OS: macOS Ventura 13.6.6
CPU: M1
Unity: 2020.3.41f1

## 結論
**① CocoaPodsのアップデート**
↓
**② Unityにて再ビルド**
↓
**③ 出力されたフォルダにPodfileが生成されていることを確認**
↓
**④ フォルダ内で`pod update`を実行**

これで一応xcworkspaceが生成され、対処できた。
CocoaPodsのアプデはしなくても良いかもしれない。

## 以下　やったこと

### ①Gemのアンインストール
現在インストールされているCocoapodsがgem経由のものかhomebrew経由のものかを確認
```
gem which cocoapods
```
/Library/Ruby/Gems… のパスが帰ってきたので、gem経由のものが入っているっぽい。
ちなみにbrew listもやってみたが、cocoapodsは入ってなかった。

こちらの記事を参考に、gemで入っているCocoapods関連ファイルを綺麗さっぱり削除する。

https://qiita.com/noprops/items/f997a438fabb64c15f10

### ②brew経由でインストール
brew経由でCocoaPodsをインストールしてみた。
うまく入ったぽいのでUnityでビルドを回してみると…
```
Error running CocoaPods. Please ensure you have at least version 1.0.0.  You can install CocoaPods with the Ruby gem package manager:
 > sudo gem install -n /usr/local/bin cocoapods
 > pod setup
```

うーん、Gem経由で入れた方がよさげ

### ③Gem経由で再インストール
`brew uninstall cocoapods`でbrew版を削除。
`sudo gem install cocoapods`で再インストール。
最新版のcocoapodsが入る。

### ④もう一度Unityビルドを回してみる
```
iOS framework addition failed due to a CocoaPods installation failure. 
This will will likely result in an non-functional Xcode project.
```
最初とおんなじエラー！

### ⑤出力ディレクトリ内でpod install

https://kan-kikuchi.hatenablog.com/entry/CocoaPods_installation_failure

こちらの記事に書かれている通り、Unityが出力したXcodeプロジェクトが格納されているディレクトリの中で`pod install`を実行すれば、xcworkspaceが生成されて、無事にXcodeでもビルドを回すことができた。

## おわりに
Unityビルド時に自動で生成してくれない点は未解決なので、引き続き調べたい。
Deviseにおける複数モデルでのログインを避ける方法

## はじめに
Railsの認証システムであるDeviseは、非常に強力で柔軟性がありますが、複数のユーザーモデルを管理する際には注意が必要です。特に、異なるユーザーモデル間での同時ログインを避けたい場合、デフォルトの設定では対応できないことがあります。この記事では、Deviseを使用して、複数のモデルで同時ログインが発生しないようにする方法を説明します。

## 課題の説明
Deviseを使って複数のモデル（例えば、Company、Staff、AdminUser）を認証管理している場合、一つのブラウザセッションで複数のモデルに同時にログインされると予期せぬ問題やセキュリティリスクが生じる可能性があります。特に、管理者としてログインしている状態で他のユーザーを作成し、そのユーザーが自動的にログインされる場合、問題が複雑化します。

## 解決策の実装
### Deviseの設定変更
まず、Deviseの設定を変更して、複数のログインを一度に管理しないようにします。

```ruby
# config/initializers/devise.rb
Devise.setup do |config|
  config.allow_unauthenticated_access_to = [:new, :create]
  config.sign_out_all_scopes = true
end
```

この設定により、新たにログインするユーザーモデルが既存のログインセッションを上書きし、同時に複数のモデルにログインすることを防げます。

### モデルごとのログイン管理
特定のモデルで新たなユーザーを作成する際に、自動的なログインをスキップすることも重要です。以下のように`StaffsController`の`create`アクションをカスタマイズします。

```ruby
# app/controllers/staffs_controller.rb
    @staff = Staff.new(staff_params)
    authorize! :create, @staff  # CanCanCanを使って手動で認可チェック
    super do |staff|
      if staff.persisted?
        # CompanyまたはAdminUserが既にログインしている場合は、Staffの自動ログインをスキップする
        unless company_signed_in? || admin_user_signed_in?
          sign_in(staff) unless staff_signed_in?
        end
        staff.assign_attributes(staff_params)
        if staff.persisted?
          unless company_signed_in?
            sign_in(staff)  # Companyがログインしていない場合のみStaffをログインさせる
          end
        else
          render :index
        end
      end
    end
  end
```

このコントローラーのカスタマイズにより、既にログインしているユーザー（CompanyやAdminUser）がいる場合、新たに作成されたStaffは自動的にログインされません。

## まとめ
Deviseを使用する際に複数のモデル間での同時ログインを管理することは、セキュリティの観点から非常に重要です。上記の設定とコード例を参考に、アプリケーションのセキュリティを強化し、意図しないログインを防ぐことができます。
42. Trapping Rain Water の解き方メモ

https://leetcode.com/problems/trapping-rain-water/description

「標高図が与えられる。雨がふったときにたまる水の合計を求めなさい」という問題です。まず、各X座標について考えてみます。

- ① Xの左側にあって、Xより高い地点のうち、もっとも高い地点
- ② Xの右側にあって、Xより高い地点のうち、もっとも高い地点

Xには①と②のうち、低いほうまで水がたまることがわかります。

Example 1: height = [0,1,0,2,1,0,1,3,2,1,2,1] を例に考えてみます。

![画像 2024-04-12 17.16.42.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105859/0f8a595c-1197-4ffb-2a93-78f3f9a9825a.jpeg)

- 例1: X=5のとき、①を満たすのはX=3・高さ2。②を満たすのはX=7・高さ3。よって、X=5の地点には高さ2まで水がたまる
- 例2: X=8のとき、①を満たすのはX=7・高さ3。②を満たす地点は存在しない。よって、X=8の地点には水がたまらない
- 例3: X=9のとき、①を満たすのはX=7・高さ3。②を満たすのはX=10・高さ2。よって、X9の地点には高さ2まで水がたまる

---

「Xの左側にあって、もっとも高い地点」「Xの右側にあって、もっとも高い地点」をどのように求めるかですが、これはBTreeSetを利用することで計算量を抑えることができます。BTreeSetで「もっとも高い地点」を求める計算量、BTreeSetにデータを追加削除する計算量がそれぞれO(logN)。これが各X座標ごとに発生するので、全体の計算量はO(NlogN)になります。

```rust
use std::collections::BTreeSet;

impl Solution {
    pub fn trap(height: Vec<i32>) -> i32 {
        let mut left: BTreeSet<(&i32, usize)> = BTreeSet::new();
        let mut right: BTreeSet<(&i32, usize)> = BTreeSet::new();
        for (x, h) in height.iter().enumerate() {
            right.insert((h, x));
        }

        let mut ret = 0;
        for (x, h) in height.iter().enumerate() {
            if let (Some((l_max, l_x)), Some((r_max, r_x))) = (left.iter().next_back(), right.iter().next_back()) {
                if h < *l_max && h < *r_max {
                    ret += *l_max.min(r_max) - h
                }
            }

            left.insert((h, x));
            right.remove(&(h, x));
        }

        ret
    }
}
```
ハッカソン/短期開発(3週間程)のアンチパターン

## 概要
新卒のエンジニアの研修で、3週間程度で新規の成果物をつくる試みがあった際に、主にバックエンドやインフラで踏み抜いた地雷とこうすればよかったというのを書いていこうと思います。

## 状況
- インフラに慣れている人（本職レベルで）がいない
- バックエンドのスキルがバラバラ（railsだったりlaravelだったり）
- バックエンドメンバーは3人
- 採用した主な技術はgo, echo, gorm(ORM), sql-migrate

## 地雷その1: 開発期間が短く、インフラにリソースを割くのに厳格なクリーンアーキテクチャで作ろうとする

 これは、自分たちのチームがアジャイル開発をしており、1日1スプリントで機能を実装するという、割と短期決戦型の方針を採っていたのに、基盤作成に時間がかかりなおかつapiを生やすまでにhandler, usecase, service, repository, entity, etc...と実装する箇所が多いし、ファーストコミットまでが遠いアーキテクチャを採用したのが敗因。

 さらに、バックエンドのメンバーでクリーンアーキテクチャに触れたことはあるが0から実装する程理解のあるメンバーがおらず、だいぶ苦戦することとなった。

 結果として2週目半ばくらいまで各APIが生えず、クリーンアーキテクチャを無視して機能を実装して動作することを優先することとなった。

 #### こうすると良かった
  当初クリーンアーキテクチャを採用するか否かのときに、時間がかかることが予想されてはいたのでデメリットを上げてチームメンバーに説明してはいたものの、実装のデッドラインや転換するときの方針を明確に決めていなかった。
 方針を決めておけばズルズル行くこともなかったように思える。

## 地雷その2: 全体を見通せるメンバーがアーキテクチャの基盤を作り切るところまでを終えなかった

バックエンド~インフラの構成やアーキテクチャをある程度見通せるメンバーが、コンテナを立ち上げたり、ヘルスチェックのための疎通確認のコードは書いてから、各バックエンドのメンバーにタスクを振り分けてはいたものの、そこから各apiを作るまでが少しタスクの粒度として大きかった気がする。

その結果、各メンバーが今の実装で何が必要で、どの技術を使うのかの認識ずれていたり、PRの粒度があまりに大きくレビューが大変だったりした。

#### こうすると良かった
 大体こんな感じの構成になるとわかっているメンバーが、最低限イメージをメンバーに共有したり、欲をいうとDIやらmodelやらhandlerやらを生成しておいて、タスクの粒度が軽くなってから各メンバーに振り分けられるようにすればよかった。
 そうすることで各メンバー間での認識の相違や、ビジョンがズレることが少なく、動き出しやすかったように思える。
 

## 地雷その3: 各チームメンバーが一人でタスクを抱え込む事態が多発した

バックログで誰が今何のタスクをやっているか、このタスクの優先順位はどうかなど、一定程度透明性があったので、そこまでメンバー間のコミュニケーションについてチームでは気にしていなかったが、切ったタスクの粒度が間違っていたり、環境構築等のみんなで見れば数分で解決することをずっと抱え込んでしまっているメンバーもいた気がする。

#### こうすると良かった
おそらく、バックログやスプリント等の仕組みである程度透明性が担保されていたので、積極的に相談しやすい雰囲気づくりをしなかったのが問題。
メンバー同士でslack等のチャットで定期的に詰まったり困っていることはないか確認したり、あとは各メンバーがもう少し積極的にここがわからないというのを言えばよかった。
そういったことができる心理的な安全性を作り出すために、メンバーそれぞれが最初に自分は何ができて何は自信がない分野だ、というスキルの認識を合わせておけば、「こんなこと聞いても大丈夫かな」とかって尻込みしないように思う。

## 地雷その4: タスクの依存性を考えて進めなかった

この機能ができないとこの実装ができないとか、このapiができないとインフラに乗せても疎通確認が取れないとか、開発においてのタスクの優先順位、依存性を考慮して進めることができていなかった。

#### こうすると良かった
必須機能の確認をして、タスクに洗い出したあと、メンバー全員で優先順位とやる順番、最優先事項などを確認しておくと、優先順位が低いタスクをやり続けてしまうことがなかったように思える。


## 最後に
今まで自分が開発者としてチームにジョインするときは、あくまでエンジニアとしてしか関わらなかったが、今回はエンジニアだけでなく、PMやテックリード的な役割を経験することとなりました。

デメリットとしては実装やアーキテクチャを考えることに集中できず、役割過多になってしまったこともありました。一方で、普段PMの人はこんな進め方をしていたなとか、テックリード的な人はこんなことを普段考えているんだなということがわかりました。

具体的には、期日から逆算して機能実装のトレードオフの意思決定を行ったり、現状のチームのスキルや方向性、プロダクトの方針からアーキテクチャを決定したり、場合によっては、実装が詰まっていたら自分が実装に入って実装を完成させきる、といったことを学べました。
最初のプログラミングと必須理論はしっかり学ぼう

# 前置き
もう4月も終わりに差し掛かり、情報系の学生は必修のプログラミングを学び始めて、新卒でプログラミング未経験のエンジニアとして入社された方はこれからプログラミングを学ぶのではないかと思います。
そこで今回は自分が学んできたプログラミングについてどうやって学んで今に至るかをアウトプットしてみようと思います。(本当は毎日投稿のネタに困っている)

# 自己紹介
ニックネームＨＮ：ムラサキ
出身の専門分野　：情報工学(工学修士)、データ分析(機械学習・因果推論)で修論を書いた
初めて触った言語：十進BASIC
初めて触った時期：高校1年
触った事ある言語：十進BASIC、VB、VBA、C、C++、Java、アセンブリ、JavaScript、PHP、C#、R、Python3(ちゃんと勉強しているのはPythonだけ)
保有資格
- ITパスポート(2011年(高2))
- Python3エンジニア認定データ分析(2020年)
- ビジネス統計スペシャリスト エクセル分析スペシャリスト(2022年)
- 統計検定2級(2022年)

初めて作ったプログラム：二次方程式の解答
プログラミングの実力　：Paizaで現在Aランク(まぐれで取れた)
現　在　の　仕　事　　：個人事業主でデータ分析や研究の技術的支援や教材販売

# 結論から言えば
## プログラミング言語一つ一冊勉強しよう
私の記事を見ている人は分かる通り全て記事はPythonで書いていますが、自己紹介で分かる通り実際には他の言語も触ったことがあり特にC言語は前職で褒められたレベルです。
その上で申し上げますと一つの言語をきちんと学べば案外他の言語にもすぐ対応できます。
私が初めてやった言語は十進BASICやVB他Cなどをどれも中途半端に勉強しましたが後に学んだ特にC++は確かに難しい言語ではありますが、C++は自力でできる限り実装する上で非常に多くの機能が備わっているため、まずC言語やC++を覚える事をお勧めしますがもちろん他の言語でも大丈夫です。
肝心なのは自分の開発したいあるいはこれから開発する分野にしっかりすぐ対応できるように学ぶには最初の言語で大体の物を作れる必要があると自分は考えます。
何か一つ一冊やりきると他の言語にもすぐ対応でき、それで今ではC++からPythonユーザになっています。
### 勉強方法
本に書いてあるプログラムを一通りVisualStudioに写経して実行して演習問題を自力で解くという当たり前な事。

## コモディティ化を避けるために
注意してほしいことはプログラミング言語だけでなく、データ構造とアルゴリズム・集合と命題論理・オブジェクト指向・離散数学・統計学・線形代数・コンピュータサイエンス・データベース(自分はRDBで十分だと思っている)なども含めて学ばないといけない事です。
何故そう考えるかというと、まっさらな状態で学ぶプログラミングは恐らく四則演算・変数・配列・条件分岐・繰り返し・関数・構造体くらいなもので、それで確かに多くの物は作れますが、必ずどこかで限界が来ますし、昨今ありますプログラミングスクールや専門学校でも先述したプログラミング言語一つを一冊やるくらい普通にやると思います。そうなったときに自分の価値は明らかに他者と同じになり安売り競争の始まりになります。
そこで前述したデータ構造とアルゴリズムからデータベースまでが非常に役に立つのです。
例えばWebサービスを考えてみましょう。Webサービスはプログラミングのその一冊にある基礎だけでできるでしょうか？恐らくできないと思います。データの蓄積がある以上はデータベースの知識は必須ですし、大量にアクセスが来る場合はデータ構造とアルゴリズムや、不正アクセス対策をするならインジェクション対策は必須です。(特に組み込みなんか数学めっちゃ使います)
なので言語をただやっているだけではサービスを作るときに必ずどこかで不具合が起きて最終的には信頼のないプログラムになってしまいます。

# エピソードトーク
## 今思えばの後悔(高校)
私は最初興味本位でBASICという言語を学び、後に高校2年の時にちゃんとアルゴリズムやデータベース他セキュリティやアドレスなども分からずに部活(パソコン部)の新入生の体験入部で来た人の情報を管理するGUIアプリを作りましたが、今思うとあれは動いていたというだけでどこかの組織で導入できるようなものではないと思いました。
何故ならあのプログラムはパスワードをハッシュ化していないし、データベースも正規化していないし、データベースを扱うときにプレースホルダを使っていない。
ただ何となくオブジェクト指向でGUIを使ったインプット・アウトプットとif文for文ができればそれっぽいものが作れたというものでしかありませんでした。
その他には高校1年の時にHPを作成などしましたが、アドレスの概念も分かっておらず画像を使うときに情報の先生が本番環境に直すとき相当苦労を掛けたんじゃないかと思います。
ちなみにですが、情報の授業でC言語を学びましたがその当時は四則演算や集合論ができれば問題なかったため自分はプログラミングができると勘違いしていました。

## 今同じものを作ったら
当時作った物は、名前を入力してデータベースに蓄積されるといったものでした。しかしパスワードがRDBに平文で載っている事やSQLインジェクション対策などを全くしていなかった事など今思うと頭抱えるものでしたが、もっと早くかつ安全なサービスを作れるのではないかと考えます。また、データベースの正規化を行って必要な機能をもっと作れたでしょう。
また、それに加えてデータベースを基に入部予想の学習アルゴリズムを作る事もできたと思います。

# 終わりに
プログラミングを学ぶのが難しいか簡単かは人それぞれです。ただそのプログラミングを覚えたいならその言語の専門書一冊写経して演習問題を自力でやれば事足りるでしょう。
しかしそれだけではみんな同じことをしています。
だからこそ
- セキュリティ
- データベース
- アルゴリズム
- データ構造
- 離散数学
- web技術
- 統計学
- 線形代数
- コンピュータサイエンス
- オブジェクト指向
- 集合と命題論理

これらを学んで他の技術者と差別化してあなたのキャリアやあなた自身の価値を向上させましょう。(なお私は一部しか覚えていないのであしからず)
AndroidStudioのエミュレータの画面サイズを確認する方法

Androidは画面サイズによってデザインが崩れてしまう事があると思います。


エミュレータの画面サイズを確認する方法です。

Device Managerを開き画像のようにViewDetailsをクリックします。

![スクリーンショット 2024-04-28 2.00.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274615/7f852382-5bb4-c59b-ac79-20c694eeac63.png)


このような表示が現れるので確認することが出来ます。

![スクリーンショット 2024-04-28 2.01.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274615/f2af109a-1c76-36fd-1107-51b3b5c986af.png)
VContainerでDisposeがコールされなくて困った話

## きっかけ
最近はクリーンアーキテクチャやら何やら意識し始めたこともありDIコンテナの導入を積極的に行っている。
基本シーンファイルもあまり弄りたくないという思いもありLifetimeScopeもコードファーストで生成してみようと思った矢先の出来事。
VContainerはIDsposableを継承したクラスは自動的にDisposeメソッドをコールしてくれるはずなのだが、何故か呼ばれない。ということでVContainerの中身を読み漁るなどして解決してみた。

## コード全文
```Test.cs
using UnityEngine;

public class Test : MonoBehaviour
{
    private TestScope mTestScope = null;

    private void Start()
    {
        mTestScope = new TestScope();
    }

    private void OnDestroy()
    {
        mTestScope.Dispose();
    }
}
```

```TestScope.cs
using System;
using UnityEngine;
using VContainer;
using VContainer.Unity;

public class TestScope : IDisposable
{
    private LifetimeScope mLifetimeScope = null;
    public TestScope()
    {
        mLifetimeScope = LifetimeScope.Create(builder =>
        {
            builder.Register<Service>(Lifetime.Singleton);
            builder.RegisterBuildCallback(container =>
            {
                var service = container.Resolve<Service>();
            });
        });
        mLifetimeScope.Build();
    }

    public void Dispose()
    {
        Debug.Log($"LifetimeScope Disposed");
        mLifetimeScope.Dispose();
    }
}

```

``` Service.cs
public class Service : IDisposable
{
    public void Dispose()
    {
        Debug.Log($"Service Disposed");
    }
}
```

## 原因 / 解決方法
TestScope.csの以下の一文が原因

`mLifetimeScope.Build();`

元々LifetimeScopeを生成した時点でAutoRunがTrueとなっているため、2重に呼ばれていたのが原因だったよう。
そうと分かればBuildメソッドをコールしなければ良いだけなので簡単。
`mLifetimeScope.Build();` の一行を消すか、AutoRunをfalseにすればいいだけ。
ただ、コードファーストでLifetimeScopeを生成した場合にはAutoRunをfalseにする前にBuildが走ってしまうきがする。そういったケースを再現する方法はちゃんと調べてないのでちょっと分からない。

要約すると以下のようになる。

1. LifetimeScope.Createでインスタンス生成
1. Registerで登録した型が生成候補リストに登録される
1. AutoRunでLifetimeScopeのBuildが走る
1. Registerで登録した型がコンテナに入り、生成候補のリストが空になる
1. 自身で実行したBuildが再度走る
1. 生成候補リストは空なのでdisposablesも当然呼ばれない！

といった流れ。

以上。

## 余談
```
builder.Register<IClass, Class>(Lifetime.SIngleton);
```
↑の構文でClassをResolveしようとするとエラーになるのがどういう実装でそうなっているのか気になったので調べてみたところ、↓の一文でInterfaceの登録が優先されていることが判明。だからAsSelf()使って実装したクラスもInterfaceとして登録しなきゃいけないという。

```
if (registration.InterfaceTypes is IReadOnlyList<Type> interfaceTypes)
```

https://github.com/hadashiA/VContainer/blob/1.15.3/VContainer/Assets/VContainer/Runtime/Registry.cs#L23
## さいごに
オープンソース最高。
技術登壇して思ったこと

## 初めての技術登壇
先日、[すきやねんAzure!!](https://sukiyanenazure.connpass.com/)というMicrosoftさんのイベントで人生初めての技術登壇をしてきたので思ったことをざっくり書きなぐってみようと思います。

## 結論
コミュニティの場で登壇するのめっちゃ面白かったのでエンジニアならLTでもいいので一回は経験しとけ、です。

## 登壇したきっかけ
前職の絡みもありますが、たまたま某SNSで登壇してみませんかー？とお声がけいただいたのがきっかけです。
個人的に、今まで社内の勉強会や業務でベンダーに対しての教育・講師はやったことがあったのですが、社外コミュニティの場に参加して登壇という経験がなかったので単純に面白そうだなぁと思ってやってみたのがきっかけです。

私が登壇したイベントであれば[登壇者募集中](http://aka.ms/SukiyanenSpeaker)のリンクから登壇者として申し込みできるみたいです。

## 登壇内容
本来であれば現職の内容と絡めた話ができればよかったのですが、残念ながら諸々の事情でお話ができなかったので、Logic Apps と Azure OpenAI Service に関する基礎的な内容をお話するという初心者向けの登壇内容になりました。
自分自身初めての登壇ということもあったのですが、当日にご一緒させていただいたベテランエンジニアの方がライブデモをするとのことで、調子に乗って自分もそれに乗っかる宣言をしてみました。なので初登壇で初ライブデモという初めて尽くしの登壇になりました。

## 資料準備
お話しする内容については自分がずっと触ってきた Logic Apps に関する内容だったので、話す内容についてはそこまで悩みませんでした。
ただ、会社名を出して参加するので、社内の法務手続きや申請など、色々と思っていない点が学べて大変良かったです。会社の名前を背負うって改めて責任があるなといういい気づきでした。


## 登壇当日
当日は機材の投影確認や資料の最終確認等抜かりなく実施して挑みました。
元々人前に出て話をするのが好きなタイプなので、前に出ることに対する緊張はありませんでした。
スライドに関しては淡々と説明できてよかったのですが、ライブデモに突入したところでやはり事故が起きてしまいました。
事前に検証していたものの、一発で構築することができず失敗したことに緊張してワタワタしてしまい、時間が押してしまったことが非常に残念でしたが、失敗したときのために参照記事をいくつか準備していたので、その場で即リカバリできてよかったなと思いました。あと、ライブデモで実際失敗することで、つまづきポイントをリアルに伝えられて良かったなと思いました。（やってるときに完全にトラブルシュートの気持ちになってました。。。）

## 登壇してよかったなぁと思ったこと
・ 自分自身のアウトプットの場になって改めて知識が定着した
事前にスライドを作っていましたが、スライドの内容を話をしている中で ”そういえばこんなのあったな” とか ”これ言ってた方がいいんじゃないか” みたいな思い出し知識(なんていうの？)が多々出てきて、改めて潜在的に自分が感じている機能のメリットや要点を再認識でき、公開情報と合わせて知識を定着させることができたと思います。


・ コミュニティで人とのつながりができた
これめちゃくちゃ良くて、SNSでつながってるけど実際にあったことない人にも知り合えたのが自分の中で登壇して良かったと感じた点です。
あと、名刺交換してお話する中で、実はここで知り合いつながってたんだとか共通点のある人もいて人とのつながりって面白いなぁと思いました。
登壇する中でこんなつながりできると思ってなかったので、完全に思わぬ収穫になりました。


・ ハッシュタグで自分のスライドに対する意見が見られる
自分の登壇内容に対していろんなコメントがついて、ちゃんと内容が伝わっているんだなぁと実感できました。
それ以外にも、ポジティブな意見を見るとやっぱりモチベーションが上がってうれしい気持ちなってよかったです。
自分もLTやセッションに参加したときは登壇に関する内容はどんどんハッシュタグ付けてコメントしていこうと思いました。

## さいごに
こういう技術登壇って最初はものすごくハードルの高いものだと思っていましたが、いざやってみると意外と何とかなるなぁという感じでした。
あとは、こういうコミュニティに入ってみんなで盛り上げていくの超楽しいなと思いました。
伝えたい思いや技術があるのであれば、遠慮なくどんどん登壇していくのが自他共に学びにつながるので、これから機会があればどんどんやってみようかなと思いました。
エラー解決したら記事にしてもらえるとものすごく助かる

## はじめに
ずっと思っていることです。いまこの記事を読んでいるあなたが開発に行き詰まり、ある方法でそのエラーを解決したら、そのことを記事にしてもらえるとものすごく助かります。特に初学者の方、新しくプログラマーになった方。

## なぜか
ググれるから。

## 解説
プログラミングは日進月歩で日々進化しつづけます。みんなエラーに当たるのは当たり前です。最初から開発を進めてうまくいかないことなんてほとんどです。

エラーにハマったときみなさんはどうされていますか？エラーが起こったとき、多くのライブラリなら、エラーコードを出力してくれるでしょう。もし、できるエンジニアの方なら、元のソースコードを読み、原因がなんなのか突き止められるでしょう。

ですが、わたしのようにあまり賢くなく、ノリと勢いでエンジニアをやっている方、そして頼れるものが周りにいない方はググります。例えばReactで、useEffectを使っていたらエラーになったとします。私はそのとき、まずググります。そして、「React useEffect エラー」と検索します。またはエラーコードをそのままベタ貼りします。
そして検索結果を頼りに、解決方法を探します。

そこで非常に重宝されるのが、技術ブログです。自分も幾度となく、その技術ブログを頼りにしてエラーを解決してきました。または使っているライブラリのGitHubで同じエラーに当たった人がいないか、issueを探します。しかし、GitHubは基本やりとりが英語で書かれているので、翻訳ツールを利用して、理解していますが若干時間がかかります。

同じ日本人だからこそ、日本語で書かれているブログ記事というのはほんとうに役に立ちます。どんな些細な解決方法でも、それを記事に起こしていただけると多くのエンジニアを救うことになるかもしれません。世の中できる人が大半だと思わないほうがいいです。

同じエラーを解決した人が先に記事を書いていたって構わないです。同じ解決の記事が多いほど、その方法に関しての信頼性もあがります。

## 記事を書けば技術アピールにもつながる

記事を書けば、あなたがどんな技術に興味をもち、どんなふうに技術に取り組んでいるのかが言語化されます。考えの言語化という行為は非常に素晴らしいアウトプット行為です。思っていたって誰にも伝わらないですから。
就職活動、転職活動をしていれば、その記事があなたのポートフォリオになります。なにも、開発技術を使って何か作ることだけがポートフォリオじゃないと自分は考えています。技術ブログだって立派なポートフォリオです。あなたのことがわかるから。

新人の方だって、記事を書けば、社内からの評価が少しあがるかもしれません。もしかしたら、大きな仕事を任され始めるかもしれません。他の人から頼りにされるかもしれません。

ベテランの方なら、閲覧数やいいね数があなたの承認欲求を満たしてくれるかもしれません。


## 終わりに

とにかく、どんなエラーでも、開発でも、解決できたらぜひ記事にしてみてください。 **当たり前ですが、エラーの解決に参照した記事を丸ごとコピペはNGです。参照元を自分の中で消化しきった上で書きましょう。**

その記事が、他の誰かの助けになるかもしれません。ぜひエラーの解決を記事にしてみてください。エラーコードまで貼ってあると、ググりやすくなるので尚更いいです。
smb.conf覚書

自分用
~~~
sudo apt install samba
~~~
HDDの一時マウント
~~~
mount /dev/sdaX /share
~~~
dev/sda1はlsblkで確認する。
/share はsmb.confに追記するpath=の部分を設定する。

マウントの恒常化
~~~
sudo nano /etc/fstab
~~~
ここに[blkid]で表示させたHDDのUUIDを追記する
~~~~
UUID=XXXX-XXXX /share ntfs defaults,auto,umask=000 0 0
~~~~
smb.conf
~~~
[share]
path = /share
public = yes
browseable = yes
read only = no
guest ok = yes
writable = yes
create mask = 0777
directory mask = 0777
~~~
読み書き権限を制限したいならall allow の777は使うべきではない。↓
create mask = 0777
directory mask = 0777
chmod 777の詳細は以下
https://linuxize.com/post/what-does-chmod-777-mean/

ユーザーを追加するとき
~~~
[username]
path = /share/username
public = no #個人用
browseable = yes
read only = no
guest ok = no
writable = yes
create mask = 0644 #所有者のみ読み書き可
directory mask = 0755　#所有者読み書き可グループ（上の方）は読み取りのみ可。
~~~
adduser(linuxシステムへのユーザー追加)
~~~
sudo adduser (任意のuser)⤵
sudo smbpasswd -a username(さっき追加したuser)
~~~
パスワードを決める（忘れないように）
ここまででsambaサーバーへのアクセスIDとパスワードの設定終わり。linuxへのアクセスにusernameとsmbpasswdでアクセスする。

個別のファイル設定
adduser username1(任意のuser)に/share/username1の権限を付与する。
chown username1:username1 /share/username1 #所有権の付与
chmod 755 /share/username1 #権限の変更

smb.confのここと対応
~~~
[username]
path = /share/username1
create mask = 0644 
directory mask = 0755　
~~~
/shareの権限をadmin(管理者）のみにすることで余計なファイルを作らせない。
~~~
chown admin:admin /share
chmod 755 /share
[share]
path = /share
public = yes
browseable = yes
read only = yes
guest ok = yes
writable = no
create mask = 0755
directory mask = 0755
~~~
セキュリティ的にはgroupに居ないguestに何もさせたくないから
create mask = 0750　とかにするのも良いかも。

samba web uiについて。
RAID1
暗号化（セキュリティ向上）

参考
https://ry0.github.io/blog/2016/06/27/how-to-fix-mount-of-hdd-in-ubuntu/#gsc.tab=0
https://qiita.com/UKIUKI_ENGINEER/items/c7eece56b916d2a4afe9
https://qiita.com/Yoh_Yasushi/items/8e35473bf7adab480d83
https://linuxize.com/post/what-does-chmod-777-mean/
Githubでよく使用されるライセンス

# はじめに
Githubでパブリックリポジトリを作成する際、ライセンスの選択が求められます。ライセンスを使用しないと、著作権侵害やトラブルが発生するリスクがあるので、適切なライセンスを設定する必要があります。よく使用されるライセンスについて、特徴とどういう人におすすめかまとめました。

![Github_License.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603981/a7b607ba-b022-de8a-f2a3-444cef344228.png)

# 紹介するライセンス一覧
* MIT
* Apache license
* BSD license
* GNU General Public License
* Creative Commons license

# MIT
### 特徴
* 最も人気のある寛容なライセンス
* ソフトウェアを自由に改変、再配布、商用利用可能
* 著作権表示とMITライセンスの全文の記載が必要

### おすすめの人
* シンプルなライセンスを望む人
* ソフトウェアを自由に改変、広く配布したい人

# Apache license
### 特徴
* MITと同様に寛容なライセンス
* ソフトウェアを自由に改変、再配布、商用利用可能
* 特許権や寄付、商標に関する条項あり

### おすすめの人
* ソフトウェアを自由に改変、広く配布したい人
* 特許権を持っていたり、寄付を受けたい人

# BSD license
### 特徴
* MIT、Apacheと同様に寛容なライセンス
* ソフトウェアを自由に改変、再配布、商用利用可能
* 特許権や寄付に関する条項を自由に選択可能

### おすすめの人
* ソフトウェアを自由に改変、広く配布したい人
* 特許権や寄付に関する条項を自由に追加したい人

# GNU General Public License
### 特徴
* コピーレフトなライセンス
* ソフトウェアを自由に改変、再配布、商用利用可能
* ソフトウェアの利用者に、4つの自由（実行、解析、配布、改良）を保護

### おすすめの人
* ソフトウェアを自由に改変、広く配布したい人
* ソフトウェアの自由を保護したい人

# Creative Commons license
### 特徴
* 著作物の利用条件が明確
* 著作権者にとって、作品の二次利用による収益化を促進
* 利用者は利用条件を事前に確認でき、作品を利用できる

### おすすめの人
* 作品を二次利用してもらい、収益化したい人
* 著作物の利用条件を明確にしたい人

# まとめ
Githubのリポジトリの主要なライセンスについてまとめました。
イメージとしては、以下の使い方が適しています。
| ライセンス名 | おすすめの人 |
|:-----------|:------------|
| MIT | とりあえずライセンスを使用したい人 |
| Apache license | 企業や大規模プロジェクトで利用したい人 |
| BSD license | 小規模プロジェクトや個人で利用したい人 |
| GNU General Public License | オープンソースコミュニティに貢献したい人 |
| Creative Commons license | クリエイティブなコンテンツを共有したい人 |
  
適切なライセンスを使用して、Githubを利用しましょう。