OmniAICreator/Qiita-1.07M huggingface dataset:
rex0220 ちょっと便利なプラグイン テーブルの先頭に行追加

[ちょっと便利なプラグイン](https://qiita.com/rex0220/items/45883f15ccd34a68b8af)で、テーブルの先頭に行追加する機能をご紹介します。
kintone の少し使いにくいところをちょっとだけ便利にするプラグインです。

# 概要

[ちょっと便利なプラグイン](https://qiita.com/rex0220/items/45883f15ccd34a68b8af)で、テーブルの先頭に行追加することができます。
※テーブル内に、ルックアップ項目と添付ファイル項目が無いこと

テーブルのタイトル行に、行追加ボタンが表示されます。

![2024-05-16_21h08_52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/f2bf1b11-ec56-19ca-3cb8-fc0cd607877e.png)

# 操作例

![2024-05-16_21h18_22.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/6e54202b-cd04-375a-0b0a-b0a55ecf670d.gif)

# ちょっと便利なプラグイン設定

「F33 追加・編集画面でテーブル先頭行追加　※ファイル項目がないテーブル」をチェックします。
※フィルタに"テーブル"を入力すると、絞り込めます。

![2024-05-16_21h21_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/59f202e0-99a8-65c1-0fd9-48233cbcd466.png)
【SwiftUI】その View のデフォルト背景色は何ですか?


<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">なんで背景色が違うんや!<br>【SwiftUI】Default background Color in built-in View Component<br>👉 <a href="https://t.co/oZqHxRGiCZ">https://t.co/oZqHxRGiCZ</a><a href="https://twitter.com/hashtag/SwiftUI?src=hash&amp;ref_src=twsrc%5Etfw">#SwiftUI</a> <a href="https://twitter.com/hashtag/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0?src=hash&amp;ref_src=twsrc%5Etfw">#プログラミング</a></p>&mdash; chanzmao (@maochanz) <a href="https://twitter.com/maochanz/status/1791054652529864878?ref_src=twsrc%5Etfw">May 16, 2024</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">【Swift】Color の RGB + Opacity の数値を求める <a href="https://t.co/6ORSpuuUbn">https://t.co/6ORSpuuUbn</a> <a href="https://twitter.com/hashtag/Swift?src=hash&amp;ref_src=twsrc%5Etfw">#Swift</a> <a href="https://twitter.com/hashtag/Swiftui?src=hash&amp;ref_src=twsrc%5Etfw">#Swiftui</a></p>&mdash; chanzmao (@maochanz) <a href="https://twitter.com/maochanz/status/1791695038008999980?ref_src=twsrc%5Etfw">May 18, 2024</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

Text や VStack や List など、

特に指定しない場合の背景色の正体は何なのか。

# 👩🏼‍💻 候補

color schema が Light / Dark に対応できる既存の背景色。

```swift
//                           opacity 100%          light               dark
Color(.systemBackground)                  // 1.000 1.000 1.000 | 0.000 0.000 0.000
Color(.secondarySystemBackground)         // 0.949 0.949 0.969 | 0.110 0.110 0.118
Color(.tertiarySystemBackground)          // 1.000 1.000 1.000 | 0.173 0.173 0.180
Color(.systemGroupedBackground)           // 0.949 0.949 0.969 | 0.000 0.000 0.000
Color(.secondarySystemGroupedBackground)  // 1.000 1.000 1.000 | 0.110 0.110 0.118
Color(.tertiarySystemGroupedBackground)   // 0.949 0.949 0.969 | 0.173 0.173 0.180
```

Xcode のサジェスチョンで見る限り、

「background」を含む

規定の色はこれくらい。

SwiftUI から、UIColor を指定したこれら**だけ**のうちの

どれかになるのでしょうか。

全部の View コンポーネントを試すのもアレですよね。

どんなルールがあるのですかね。

# 👩🏼‍💻 参考

<a href="https://zenn.dev/maochanz/articles/33890930ddff7a" target="_blank" rel="noopener">👉 【Swift】2024年5月版 四捨五入と小数点と0埋め&nbsp;<img src="https://b.hatena.ne.jp/entry/image/https://zenn.dev/maochanz/articles/33890930ddff7a" alt="hatena-bookmark" /></a>
<a href="https://android.benigumo.com/20240516/background-color-2/" target="_blank" rel="noopener">👉 【SwiftUI】Default background Color in built-in View Component&nbsp;<img src="https://b.hatena.ne.jp/entry/image/https://android.benigumo.com/20240516/background-color-2/" alt="hatena-bookmark" /></a>
<a href="https://android.benigumo.com/20240518/color-rgbo/" target="_blank" rel="noopener">👉 【Swift】Color の RGB + Opacity の数値を求める&nbsp;<img src="https://b.hatena.ne.jp/entry/image/https://android.benigumo.com/20240518/color-rgbo/" alt="hatena-bookmark" /></a>
StdClassの利用例

# StdClassの利用例
$user->idのような、
オブジェクト型で扱いたい場合に使える
```php
$osaka_count = 1;
$tokyo_count = 2;
$kyoto_count = 3;

$ret = new StdClass();// クラスなのでnewする必要あり

$ret->osaka_count = $osaka_count;
$ret->tokyo_count = $tokyo_count;
$ret->kyoto_count = $kyoto_count;
```
### 結果
```php
$ret->osaka_count = 1;
$ret->tokyo_count = 2;
$ret->kyoto_count = 3;
```
【Go】エラーの場合は返り値として空の構造体を返す？nilを返す？

## はじめに

以下のようなコードで、`err != nil`のとき、

ある関数では`models.Article{}`と空の構造体を返しているのに対し、

```go
func PostArticleService(article models.Article) (models.Article, error) {
    // 略
	newArticle, err := repositories.InsertArticle(db, article)
	if err != nil {
		return models.Article{}, err
	}

	return newArticle, err
}
```

別の関数では（**空のスライス`[]models.Article{}`ではなく**）`nil`を返しています。

```go
func GetArticleListService(page int) ([]models.Article, error) {
    // 略
    
	articleList, err := repositories.SelectArticleList(db, page)
	if err != nil {
		return nil, err
	}
	return articleList, err
}
```

この相違点がなぜ生まれるのか気になり、調べました。

## 空の構造体を返す場合

まず、1つ目の関数ではなぜnilではなく空の構造体を返しているのかを考えます

nilについては以下のように説明されています。

> nil（ニル）はGoで事前に定義された識別子で、ポインタ、インターフェイス、マップ、スライス、チャネル、関数型などのゼロ値を表します。

https://programing-school.work/golang-about-nil/

つまり、**nilは参照型のゼロ値を表すのに使うもの**であり、**値型である構造体のゼロ値は表せない**ようです。

したがって、構造体のゼロ値を表すには、`models.Article{}`のように表記するしかありません。

```go
func PostArticleService(article models.Article) (models.Article, error) {
    // 略
	newArticle, err := repositories.InsertArticle(db, article)
	if err != nil {
		return models.Article{}, err
	}

	return newArticle, err
}
```

## nilを返す場合

上記の通り**nilは参照型のゼロ値を表すのに使うもの**なので、返り値の型がスライスならnilを返します。

```go
func GetArticleListService(page int) ([]models.Article, error) {
    // 略
    
	articleList, err := repositories.SelectArticleList(db, page)
	if err != nil {
		return nil, err
	}
	return articleList, err
}
```

ちなみに、空のスライス`[]models.Article{}`を返してもエラーにはなりませんが、そうするとエラーではなく**データが存在しないことを表す**ので、**エラーの有無がわかりにくくなってしまい**、推奨されないようです。

## おわりに

ふと気になって調べたのですが、Goの理解が深まりました。
注目のブラウザ ”Arc” とは

あなたは普段どのブラウザを利用していますか？
Edge や Chrome、Safariなどを利用している方が多いのではないでしょうか。
この記事では世界中で注目を集めているブラウザ **Arc** について紹介します！
[ここからダウンドードできます！](https://arc.net)

# Arc とは
Arcはまだリリースされたばかりのブラウザなので、日本ではユーザーも少なく、聞いたことがないという方も多いかもしれませんが、現在最も注目を集めているブラウザと言っても過言ではありません。
Arcは The Browser Company という New Yorkに拠点をおくベンチャー企業によって開発されており、XやMeta、Linkedinという会社から出資を受けています。

Product Hunt の Golden Kitty Awards 2023 [Product of the year](https://www.producthunt.com/golden-kitty-awards/hall-of-fame?year=2023#product-of-the-year)では**GPT-4**に続く**2位**にランクインされており、続く3位がNotion、4位がGeminiと続いていることからも、その注目度の高さがわかるかと思います。

Chromiumを元に開発されているため、Chromeの拡張機能やブックマーク等をそのまま引き継ぐことも可能で、乗り換えのハードルは非常に低いです！

現在はMac版の方が優先的に開発が進んでいるようですが、Windows版でも順次対応が進んでいるようなので、利用し始めても損することはありません！

# インストール
まずは[こちら](https://arc.net)のサイトから自分のOSに合った方を選んでインストールしてください。

https://arc.net

## 初期設定
インストールが完了すると、初期設定画面が表示されます。基本的には表示に従って情報を入力すれば、初期設定は完了します！
### アカウントの作成
初期設定では最初にアカウントの作成が表示されます。
ここには
1. 名前
1. eメールアドレス
1. パスワード
1. パスワードの確認
:::note warn
後に説明しますが、スペースというものが出てきて、Googleアカウントはスペースごとに使い分けることが可能です！
ここではあくまでArc用のアカウントを作成するため、利用しやすいメールアドレスを選択しましょう！
:::

### ブラウザの引き継ぎ
アカウントの作成が完了すると、次にブラウザの引き継ぎの選択画面が表示されます。
ここでChromeやEdgeなどを選択することで、ブックマークや拡張を引き継ぐことができます！
ただしsafariを選択した場合にはブックマーク等の引き継ぎ確認が表示されなかったため、現段階ではChromiumベースのブラウザのみ対応しているようです。(確認不足でしたら申し訳ございません。)

### デフォルトのブラウザ設定
最後にArcをデフォルトとして利用するかの設定です。
デフォルトとして設定しておくと、リンクなどをクリックした際にArcで開かれます。
使い分けたい方などはお好みで設定すると良いでしょう！
これはパソコン本体の設定からいつでも変更可能です！

# 基本的な使い方
これ以降の章に関しては後日順次追記していきます！！
kawaiiロゴの作り方(1)

# kawaiiロゴの作り方(1)

## 1.イントロダクション
本記事のターゲット層：<br />
　(1) GIMPを触ったことがある人<br />
　(2) 趣味でロゴを作ってみたい暇人<br />
　(3) デザインがち勢ではない人<br />
　(4) not さわらつき<br />

使ったもの：
- GIMP
- いくつかの参考サイト<br />
(1) [配色パターン見本40選](https://saruwakakun.com/design/gallery/palette#google_vignette)<br />
(2) [Color Base](https://colorbase.app/ja)<br />
(3) [Color Hunt](https://colorhunt.co/)

GW中にkawaiiロゴがIT業界を侵食していることをご存じでしょうか？

React、Github Japan、Next.js、Augularと多くのサイト、SNSで[さわらつき](https://twitter.com/sawaratsuki1004)さんが作ったkawaiiロゴを採用しています！！React Confでもロゴの話が出たとか！！

面白そうなので自分でもkawaiiロゴ作成に挑戦してみました！！

本記事では、挑戦した結果学んだことをもとにkawaiiロゴの作り方について解説いたします。

## 2.ロゴ作成の準備
ロゴ作成にあたり、まずはいくつか検討するべきことがあります。<br />
(1)  ロゴにする文字列<br />
(2) 使う要素<br />
(3) メインとなる色<br />

### (1) ロゴにする文字列
どのような文字列を使ってロゴを作るか決めましょう。あまり長すぎてもロゴにしづらいですし、SNSなどで使うときに文字の視認性が悪くなるため、おすすめいたしません。

思いつかなければ、自分のあだ名やゲーム等で使っているハンドルネームを使うのが良いでしょう。自分の好きな言葉をロゴうにするのもいいと思います。

### (2) 使う要素
ロゴを作りにあたり、こだわりたい要素があれば決めておきましょう。楽譜のような背景画像なのか、ハートなどのアイコンなのか、ロゴにする言葉と合うものがいいでしょう。

### (3) メインとなる色
ロゴに使う色には、組み合わせが合わない色はあります。実際にロゴを作ると色にすごく迷いが生じるため、最初からメインとなる色を決めておくことをおすすめいたします。

どのような色がいいかについては、[配色パターン見本40選](https://saruwakakun.com/design/gallery/palette#google_vignette)や[Color Hunt](https://colorhunt.co/)を参考にするといいです。

次回は、実際にロゴ作りについて解説いたします。<br />
（あ～、「Blazorでテスト自動化をやってみよう!!」も続きかかないといけないのに脱線してしまった(笑)）
生成AIと広告について (怖さ)

# 生成AIと広告

「GPT-4o」が発表されました。これまでのモデルを凌駕する性能を持ち、驚くべき進化を遂げました、とのことで、驚嘆です。

「GPT-4o」についての解説: 

https://www.youtube.com/watch?v=yvMGYQEc3v4

一方で、ChatGPTなどの生成AIが出力する際に「**広告を混ぜよう**」という発想はすぐに思い付きそうなことですが、生成文に自然に広告が混ざっていたら、見分けがつくのか怖いなと思いました。

これだけ正確に文脈を把握して適切な回答となるように、自然に言語が生成できるので、**すごいマッチした広告を自然に刷り込ませて生成**…できないはずがありません。

生成AIとのチャットの中で、回答の中にたくみに広告を刷り込ませる…。
生成AIの回答自体が広告になり得る、気付かないぐらい自然に誘導できる…。
想像すると、怖さを感じました。

今現在は、まだ黎明期で、生成AIの利用者がそれほど多くないので、広告を出しても一部の限られた人しかターゲットに出来ず、あまり強い働きかけは無いのかと思いますが、
やがて、**ごく普通の一般の多くの人が生成AIを使うようになった時**に、**生成AIの広告**は、また、**一大ビジネス**になりそうで…、生成AIに広告が付いたら嫌だなあ…と。

YouTubeがそうであったように。

更に一歩進んで、普段の生活の中に生成AIが溶け込むように入ってくるようになったら、溶け込むようにマッチした広告を出すことが出来て…、これは本格的な洗脳になりそうで、恐ろしさを感じます。チャット家電が普段の会話も聞いていて、生成AIで解析して、生成AIで溶け込むようにマッチした広告を出して来たら、すごい未来になりそうです。

そう考えると、生成AIは、**色々な企業・団体が別々に、多くの種類の生成AIを提供**していて、不適と感じたら、**すぐに他の生成AIに乗り換えが出来る**ような状態になっているのが好ましいだろうと思いました。
YouTubeやTwitterのように、ほとんど一強のようになってしまうと、**一強になってから途中で方針を変え**られて、**酷く不利益を被る**けれども、使い続けざるを得ない…ことに成り兼ねません。

# 参考: OpenAI: Introducing GPT-4o and more tools to ChatGPT free users

https://openai.com/index/gpt-4o-and-more-tools-to-chatgpt-free/

抜粋: 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/4b816874-ff4f-554e-84e7-bdc78361390d.png)

:::note info
翻訳: 

GPT-4oの展開は、まずChatGPT PlusおよびTeamユーザーから開始され、Enterpriseユーザーへの提供も間もなく予定されています。また、本日より使用制限付きで**ChatGPT Freeへの展開も開始**しています。Plusユーザーは無料ユーザーの最大5倍のメッセージ制限があり、TeamおよびEnterpriseユーザーはさらに高い制限が適用されます。

より高度な知能とツールを無料で提供

**私たちの使命は、より多くの人々に高度なAIツールを提供すること**です。毎週、1億人以上の人々がChatGPTを利用しています。今後数週間にわたり、**ChatGPT Freeユーザーにもより高度な知能と先進的なツールを順次提供開始していく予定**です。
:::

# 追記 ChatGPT無料版でもデフォルトでGPT-4o

:::note info
ChatGPT無料版でも、デフォルトで、GPT-4oが使用されるようになっていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/5bbc27e7-e88c-c0c8-aa86-ef17f15342cd.png)
:::
ガベージコレクションについて

# ガーベジコレクション（Gabage Collection）
なんでガーベジなん，ガベージじゃないん:unamused:

名前からして　Gabage：ゴミ　Collaction：集める

ゴミ集めてするん？
### 「ガーベジコレクション」ってなんなん
一言で言うとこんな感じ

:::note info
どこからも参照されなくなった領域（ガーベジ）を解放して，再利用可能にする
:::

どこからも参照されなくなった領域（ガーベジ）ってなんや

「動的メモリの割り当て」で以下のような処理が行われている．

1\.プログラムの実行中に領域を動的に確保するために「ヒープ」と言われる領域が使われる

2\.ヒープに何度も領域の確保を繰り返していると，利用されない領域が出てくる

::: note warn
メモリリーク
・主記憶の利用できる部分が減少する！
:::

3\.それを解消するのが

::: note 
ガベージコレクション
:::

#### 何とかゴミを回収して，領域を確保してくれるいいやつってことや
世界は誰かの仕事でできている

知らんけど

オワリ

============================================================


###
JavaSilver合格→次のステップ

2024/5/13
JavaSilver11の試験が終わりました。

結果は68%。

余裕ではないものの、無事に一発合格。

学習期間は約2ヶ月（あくまで期間）

正直、気分が乗らない、頭に入らない、PCに向かったけど全然違うことをする等の自分の集中力に腹が立つときもあった。

実務経験は約半年。

まったく何もわからない時に比べたら成長したと思う。

学習に使用した教材は黒本と紫本を用意。

先に黒本を購入したので、黒本をメインに学習しました。
紫本は半周くらいやって、解説を軽く読む程度で、それ以降触りませんでした。

あとはYouTubeで「黒本著者のやさしくない！？Java」を一通り観て、理解が浅い箇所は何回か観て理解を深めました。
（メンバーになると、知識がより深まるのかもしれないが、わたしは傍観者でいました。）

模擬試験3周目の末章終了後、模擬試験前にあえて数日あけました。
試験2日前に最後の模擬を行い、結果75％となんとも言えないけっかだったので、間違った箇所を軽く復習して終えました。
（脳がパンクしかけていました。）


試験日は前祝しているかのような雨、、

受付で身分証明書2点で本人確認し、パパっと済ませて2、3分前に試験を開始しました。

試験時間３時間はあっという間でした。
悩んだ問題は後回しにしていましたが、80問目が終わった段階で残り時間が30〜40分あったので、時間いっぱいまで使いました。

あの「テストを終了する」ボタンを押すときの緊張感ねw
なかなか押せなかったw
周りには一発で仕留めるって言ったからプレッシャーが急に来たw

ちなみに、テスト開始直後、問題のレビューを閲覧しようとしたとき、「次」のとなりに「テスト終了」のボタンがあって、即押ししそうになってめちゃくちゃ焦ったのは内緒の話。。

すぐ結果がわかるの有り難い。

次に取り掛かる為に結果待ちは時間がモッタイナイ。

次はOracle DBAに挑戦しよう。
まずは黒本から。
Flask runが実行できない(アプリが起動しない)

## 本日のお悩み

flaskアプリを作成し`flask run`を実行しても起動しない
以下のエラーが発生
```shell
> flask run
Error: Could not locate a Flask application. You did not provide the "FLASK_APP" environment variable, and a "wsgi.py" or "app.py" module was not found in the current directory.
# エラーが発生しました。Flask アプリケーションが見つかりませんでした。環境変数 "FLASK_APP "が指定されておらず、カレントディレクトリに "wsgi.py "または "app.py "モジュールが見つかりませんでした。
```

実行するアプリを認識できていないため起動できない模様

## 本日の処方箋

FLASK_APPという環境変数にアプリケーション名を設定する
（ただしapp.pyかwsgi.pyならFLASK_APPが設定されていなくても実行される。）

### 環境変数を再設定

```shell
> export FLASK_APP=sample.py
```

### もう一度実行

```shell
> flask run

* Serving Flask app 'sample.py' (lazy loading)
* Environment: production
  WARNING: This is a development server. Do not use it in a production deployment.
  Use a production WSGI server instead.
* Debug mode: off
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
```

無事起動しました。http://127.0.0.1:5000/へアクセスして動作確認

## そもそも`flask run`しなくても起動する方法
`flask　run` しなくても起動はできます。

```sh
 > python sample.py
 
 * Serving Flask app "sample" (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: on
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 269-498-948
```
【Linux】cron.dailyに登録したタスクが毎日2回実行されてしまう

## はじめに

`/etc/cron.daily/`以下に設定した自動タスクがなぜか毎日2回実行されてしまうので、原因を調査しました。
初歩的なミスでした。。

## 原因

`/etc/cron.d/dailyjobs`を編集する前に、オリジナルをバックアップしておこうとして、同ディレクトリに配置していたのが原因でした。

```bash
$ ls -la /etc/cron.d
-rw-r--r--. 1 root root 128 Nov  1  2022 0hourly
-rw-r--r--  1 root root 506 May  2 10:01 dailyjobs
-rw-r--r--  1 root root 506 May  2 10:01 dailyjobs.bak
```

`/etc/cron.d/dailyjobs`でも`/etc/cron.d/dailyjobs.bak`でも`/etc/cron.daily`を呼んでいるため、必然的に2回実行されます[^1]。

```bash:/etc/cron.d/dailyjobs
# Run the daily, weekly, and monthly jobs if cronie-anacron is not installed
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# run-parts
30 1 * * * root [ ! -f /etc/cron.hourly/0anacron ] && bash /home/wsigma21/script/dummy.sh
02 4 * * * root [ ! -f /etc/cron.hourly/0anacron ] && run-parts /etc/cron.daily
22 4 * * 0 root [ ! -f /etc/cron.hourly/0anacron ] && run-parts /etc/cron.weekly
42 4 1 * * root [ ! -f /etc/cron.hourly/0anacron ] && run-parts /etc/cron.monthly
```

```bash:/etc/cron.d/dailyjobs.bak
# Run the daily, weekly, and monthly jobs if cronie-anacron is not installed
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# run-parts
02 4 * * * root [ ! -f /etc/cron.hourly/0anacron ] && run-parts /etc/cron.daily
22 4 * * 0 root [ ! -f /etc/cron.hourly/0anacron ] && run-parts /etc/cron.weekly
42 4 1 * * root [ ! -f /etc/cron.hourly/0anacron ] && run-parts /etc/cron.monthly
```


`dailyjobs`という名前にしなければ実行されないと思っていたのですが、、名前に関係なく、`/etc/cron.d/`以下の設定ファイルは全て毎日実行されます。

## 対策

バックアップファイルを`/etc/cron.d/`以外に配置します。

## おわりに

最初は`/etc/cron.daily/`に配置したタスクの設定の誤りだと思い、時間をかけて色々調べたのですが、結局はcronに関する理解不足が原因でした。

## 参考

cronの何たるかは以下が勉強になりました。

https://www.sbcr.jp/product/4797397642/

https://www.express.nec.co.jp/linux/distributions/knowledge/system/crond.html

https://qiita.com/hitorigotsu/items/d4825be78efded714df7

[^1]:`/etc/cron.weekly/`と`/etc/cron.monthly/`以下のタスクも2回実行されることになります。ただし、今回は両方とも空でした。
imgタグのサイズ指定によるレイアウトシフト防止とレスポンシブデザイン

Webページを作成する際、画像はユーザーエクスペリエンスに大きな影響を与えます。

特に、画像が読み込まれる際にページのレイアウトが急に変わる「レイアウトシフト」はユーザーにとってストレスフルな体験となります。これを防ぐためには、画像のサイズを事前に指定して表示領域を確保することが重要です。

本記事では、特にレスポンシブデザインにおける対応方法について詳しく解説します。

# 基本的な話

まず、HTMLの `<img>` タグに `width` と `height` 属性を指定することで、ブラウザが画像の表示領域を事前に確保する方法について説明します。

## 例

```html
<img src="example.jpg" width="600" height="400" alt="Example Image">
```

上記のコードでは、幅600ピクセル、高さ400ピクセルの領域が画像の読み込み前に確保されます。
これにより、画像が読み込まれる際にレイアウトシフトが発生しにくくなります。

# レスポンシブデザインでの対応

レスポンシブデザインでは、異なるデバイスや画面サイズに合わせて画像を適切に表示する必要があります。
ここで重要なのは、画像のサイズを動的に変更しつつもレイアウトシフトを防ぐことです。

## レスポンシブな画像の実装方法

1. **HTMLでのサイズ指定**: 画像の元のサイズを指定します。
2. **CSSでのレスポンシブ対応**: `max-width` と `height` を使用して、画像が親要素の幅に合わせて調整されるようにします。

## 実際のコード例

以下のコードは、画像をレスポンシブに表示しながら、レイアウトシフトを防ぐための具体例です。

```html
<!-- HTML部分 -->
<img src="example.jpg" width="600" height="400" alt="Example Image">

<!-- CSS部分 -->
<style>
  img {
    max-width: 100%; /* 親要素の幅に合わせて縮小 */
    height: auto;   /* アスペクト比を維持 */
  }
</style>
```

## コード例の解説

- **HTMLの `width` と `height` 属性**:
  - 画像の元のサイズ（600x400ピクセル）を指定します。これにより、ブラウザは画像の読み込み前にその領域を確保し、レイアウトシフトを防ぎます。
  
- **CSSの `max-width` と `height` プロパティ**:
  - `max-width: 100%` は、画像の幅が親要素の幅を超えないように制限します。
  - `height: auto` は、画像のアスペクト比を維持しながら高さを自動調整します。

このアプローチにより、画像が親要素の幅に合わせて適切に縮小または拡大され、異なるデバイスでも正しい表示が可能になります。

# まとめ

画像のサイズを事前に指定することで、レイアウトシフトを防ぐことができます。

特にレスポンシブデザインにおいては、HTMLでのサイズ指定とCSSでのレスポンシブ対応を組み合わせることで、ユーザーに快適な閲覧体験を提供できます。

以下は、本記事のポイントです。

- **HTMLの `width` と `height` 属性**: 画像の表示領域を事前に確保し、レイアウトシフトを防止。
- **CSSの `max-width` と `height` プロパティ**: 親要素の幅に合わせて画像を適切に調整し、異なるデバイスに対応。

この方法を適用することで、Webページのパフォーマンスとユーザーエクスペリエンスを向上させることができます。
illegal time format : macOS error

MacBook-Air:~ ogawakiyoshi$  kill 3097
-bash: kill: (3097) - No such process
MacBook-Air:~ ogawakiyoshi$  kill -9 3097
-bash: kill: (3097) - No such process
MacBook-Air:~ ogawakiyoshi$  kill 3097
-bash: kill: (3097) - No such process
MacBook-Air:~ ogawakiyoshi$ ps -ax | grep mi
  543 ??         0:02.80 /System/Library/Frameworks/CoreMediaIO.framework/Versions/A/Resources/com.apple.cmio.registerassistantservice
  750 ??         0:00.05 /System/Library/PrivateFrameworks/SystemAdministration.framework/XPCServices/writeconfig.xpc/Contents/MacOS/writeconfig
  802 ??         0:13.25 /System/Library/CoreServices/SubmitDiagInfo server-init
  940 ??         1:11.54 /System/Library/PrivateFrameworks/FamilyCircle.framework/Versions/A/Resources/familycircled
  960 ??         0:13.44 /System/Library/PrivateFrameworks/StreamingZip.framework/Versions/A/XPCServices/com.apple.StreamingUnzipService.privileged.xpc/Contents/MacOS/com.apple.StreamingUnzipService.privileged
 1376 ??         0:55.56 /System/Library/PrivateFrameworks/StreamingExtractor.framework/Versions/A/XPCServices/STExtractionService.privileged.xpc/Contents/MacOS/STExtractionService.privileged
 1493 ??         0:00.24 /System/Applications/Reminders.app/Contents/PlugIns/RemindersWidgetExtension.appex/Contents/MacOS/RemindersWidgetExtension
 1503 ??         0:00.07 /System/Applications/Reminders.app/Contents/PlugIns/RemindersIntentsExtension.appex/Contents/MacOS/RemindersIntentsExtension -AppleLanguages ("ja-JP", "en-JP")
 1951 ??         0:20.38 /System/Library/PrivateFrameworks/AskPermission.framework/Versions/A/Resources/askpermissiond
 6730 ??         0:03.40 /System/Library/PrivateFrameworks/DifferentialPrivacy.framework/XPCServices/DPSubmissionService.xpc/Contents/MacOS/DPSubmissionService
 8592 ??         0:00.16 /usr/libexec/microstackshot
10393 ??         0:09.91 /System/Applications/Utilities/Terminal.app/Contents/MacOS/Terminal
33097 ??        17:26.02 /Applications/mi.app/Contents/MacOS/mi
53721 ??         0:00.01 /usr/libexec/misagent
10516 ttys000    0:00.00 grep mi
MacBook-Air:~ ogawakiyoshi$ 
  [復元日時2024/05/16 20:30:24]
Last login: Thu May 16 20:30:22 on console
date: illegal time format
usage: date [-jnRu] [-I[date|hours|minutes|seconds]] [-f input_fmt]
            [-r filename|seconds] [-v[+|-]val[y|m|w|d|H|M|S]]
            [[[[mm]dd]HH]MM[[cc]yy][.SS] | new_date] [+output_fmt]
-bash: Saving: command not found

The default interactive shell is now zsh.
To update your account to use zsh, please run `chsh -s /bin/zsh`.
For more details, please visit https://support.apple.com/kb/HT208050.
Raspberry Piのセキュリティ強化：ufw、Fail2Ban、不要なサービスの停止

Raspberry Piをインターネットに接続して使用する際、セキュリティを強化することが重要です。本記事では、ufw（Uncomplicated Firewall）とFail2Banを使用したセキュリティ設定、および不要なサービスの無効化方法を紹介します。

記事を書くのが面倒だったのでGPT先生に編集してもらっています。

# 前提条件

- Raspberry Piがインターネットに接続されている
- 基本的なLinuxコマンドの知識がある

# 1. ufwの設定

### ufwのインストールと有効化
まず、ufwをインストールし、有効化します。

```
sudo apt-get update
sudo apt-get install ufw
sudo ufw enable
```

### SSHアクセスの制限
次に、SSHアクセスを自宅ネットワークからのみ許可する設定を行います。現在のSSHアクセスルールを削除し、自宅ネットワークのサブネット（例：192.168.1.0/24）からのみアクセスを許可します。

```
sudo ufw delete allow 22/tcp
sudo ufw allow from 192.168.1.0/24 to any port 22
```

### 設定の確認
設定が正しく適用されているか確認します。

```
sudo ufw status
```

# 2. Fail2Banの設定
### Fail2Banのインストール
次に、Fail2Banをインストールします。

```
sudo apt-get install fail2ban
```

### Fail2Banの設定
設定ファイルを編集し、sshdジェイルを有効にします。

```
sudo nano /etc/fail2ban/jail.local
```
以下の内容を追加または修正します。

```
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/syslog
backend = systemd
maxretry = 3
```
Fail2Banの再起動とステータス確認
設定を保存し、Fail2Banサービスを再起動します。


```
sudo systemctl restart fail2ban
sudo fail2ban-client status
```

# 3. 不要なサービスの無効化
不要なサービスを無効化することで、システムのセキュリティとパフォーマンスを向上させます。

### 実行中のサービスの確認
まず、現在実行中のサービスをリストします。

```
sudo systemctl list-units --type=service --state=running
```

### 不要なサービスの無効化
以下は、一般的に不要とされるサービスの無効化例です。

### avahi-daemon,cups,bluetooth の無効化
```
sudo systemctl disable avahi-daemon
sudo systemctl stop avahi-daemon
sudo systemctl disable cups
sudo systemctl stop cups
sudo systemctl disable bluetooth
sudo systemctl stop bluetooth
```
### サービスの状態確認
無効化したサービスが停止していることを確認します。

```
sudo systemctl status avahi-daemon
sudo systemctl status cups
sudo systemctl status bluetooth
```

# まとめ
以上の手順で、Raspberry Piのセキュリティを強化することができます。ufwによるファイアウォール設定、Fail2Banによる不正アクセスの防止、そして不要なサービスの無効化を行うことで、システムの安全性を高めることができます。これらの設定を定期的に見直し、最新の状態に保つことが重要です。
PyTorch 1.5.0のコードがそのまま2.2.0においても動作可能でした

# はじめに

下記の記事で、2020年5月頃、PyTorchをいちから使い始めてみた際の、機械学習のテストコード(PyTorch 1.5.0 CPUのみ)が、

https://qiita.com/dl_from_scratch/items/7e533cbc138038d26214

2024年5月現在、最新バージョンのPyTorch 2.2.0においても、同じコードで一切修正することなく動作しましたので、記載しておきます。

PyTorch 1.5.0 → PyTorch 2.2.0へメジャーバージョンが変わっていましたが、完全に後位互換性があるそうで、1.5.0のコードがそのまま2.2.0においても動作可能でした。

# まとめ

機械学習という進化が速い分野のフレームワーク・ライブラリで、4年後でも、後位互換性が保たれて安定しており、とても良い印象を受けました。

PyTorchをベースに使用しておけば、安心感があります。
CodeBuildでCodeCommitにタグをプッシュしてみた

# はじめに
ソースビルドした段階でCodeCommitにタグを発行したかったのでいろいろいじってみた。
シンプルにそれだけやってみた、短め備忘録



## 前提条件
CodeBuildの構築は終わっている。
CodeBuildのほとんどのステージ処理の記載も終わっている。

## やったこと
1.post_buildステージにGitタグ作成用のシェルを用意して、呼び出しした

```yaml
  post_build:
    on-failure: ABORT
    commands:
      - export RELEASE_DATETIME=$(date +"%Y%m%d%H%M%S")
      - ./script/git_create_tag.sh 
```
2.スクリプトの中身を書いた
 
```bash
dir = "Gitを取ってきた、適当な場所に"
cd $dir
# もっといいものがあるはずだが、emailとかとかは必要
git config user.email "codebuild@example.com"
git config user.name "codebuild"
# Cloneはできていたのでいけるかとも思ったが、下記追加しないとうまくいかなかった
git config credential.helper '!aws codecommit credential-helper $@'
git config credential.UseHttpPath true

# タグ名を作成、yamlでいじった環境変数使えるかテストしてみた
TAG_NAME="tag-test-${RELEASE_DATETIME}"
# タグを作ってプッシュ
git tag $TAG_NAME
git push origin $TAG_NAME
```

### 最後に
ロールは普通Pullオンリーだと思うので、Push権限も追加した。
CodeBuildからのPushはtagのみとかにするのであれば多少考える必要あり
CodeBuild内でCommitすることとかほぼないと思いますけども・・・

少なくともForce Pushさせなければ、変な事故が起きても何とかなりそう


https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/auth-and-access-control-permissions-reference.html
ネットワーク上のファイルをローカルにコピーする

タイトル通りです。

ネットワーク上のどこかにあるファイルをローカルにコピーしたかったのです(´・ω・`)
ローカルなら直接編集しても怒られないので。
あと、ローカルのファイル開いてるのをわかりやすくするためにファイル名の頭に「★」を付けています。

```bat
REM 指定パス配下にある指定のファイルをローカルにコピーします。
 
REM ★使用方法
REM originalPath        :コピー対象のファイルがあるパスを指定します。
REM targetFileName      :コピー対象のファイル名を指定します。
REM destinationFilePath :コピーする先のパスを指定します。
REM fileNamePrefix      :コピーする際にファイル名に付与する接頭辞を指定します。
 
REM ★オプション
REM DEL
REM    /Q:     削除前に確認メッセージを表示しない
REM XCOPY
REM    /Y:     上書きとなる場合でも確認メッセージを表示しない
REM    /C:     エラーが発生しても無視して続行する
 
SET originalPath=\\hoge\fuga\piyo
SET targetFileName=ファイル名の最後がころころ変わっちゃうエクセル_*.xlsx
SET destinationFilePath=.\
SET fileNamePrefix=★
SET targetfilePath=%originalPath%\%targetFileName%
 
DEL /Q %destinationFilePath%\%fileNamePrefix%%targetFileName% 
XCOPY %targetfilePath% %destinationFilePath% /Y /C
RENAME %targetFileName% %fileNamePrefix%%targetFileName%
```

ワイルドカードにしているところの文字が欠損してしまうのですが、  
まあ今回は自分用なのでいいかなと。

コメントに書いているオプションの説明は以下のサイトから持ってきました。
[コマンドプロンプト del - [ファイルを削除する]](https://www.k-tanaka.net/cmd/del.php)
[xcopy - Windowsコマンド虎の巻](https://windows.command-ref.com/cmd-xcopy.html)

今回MicrosoftEdgeのCopilotに聞きながら書きました。
上に記載したサイトもCopilotくんに教わったサイトです。

業務で書いてるコードは守秘義務的なあれでAIに任せられないところがあるのですが、
こういう使い捨てみたいなスクリプトはAIに任せるのが楽でいいのかも。
連関(association)

## 連関(association)
・　カテゴリ変数間の相関関係
・　分割表(contingency table)を用いて計算する
・分割表内の数字を観測度数(observed frequency)という

観測度数は実際のデータで得られた値であり、例えば、あるアンケート調査で100人に
「データサイエンティストを目指す人は統計学を学習しているか」を調査したところ、以下のような分割表になったとしましょう。
![分割表.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780659/b42559c2-12bc-a65e-62d7-c8a641b1e9f6.png)

「データサイエンティストを目指している」かつ「統計学を勉強している」が25人
「データサイエンティストを目指していない」かつ「統計学を勉強していない」が55人
になったとするとこれは何かしらの相関関係があるといえそうですよね。このとき、連関があるといったりします。

## 期待度数(expected frequencies)
・　連関がないと想定した場合の度数

![分割表(期待度数).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780659/fe5a5118-089c-2f9d-1551-20fa6a4715cc.png)

期待度数では、「データサイエンティストを目指している・目指していない」30対70の比率と「統計学を勉強している・勉強していない」40対60の比率から逆算して連関がない場合を想定します。

では、この観測度数、期待度数の分割表から**連関の強さ**をどう考えるかみていきましょう。

連関の強さは、観測度数が期待度数からどれくらい離れているかを考えます。
もし、観測度数が期待度数と近かったら、連関は小さいなとイメージできるかもしれません。

観測度数が期待度数からどれくらい離れているかを計算した値が次回紹介する**カイ二乗**になります。
ArduinoUnoR4WiFi: フォトカプラの使い方

こちらと同じことを行いました。
[フォトカプラ(TLP785)の使い方 [Arduino]](https://www.petitmonte.com/robot/howto_tlp785.html)

使ったフォトカプラは、TLP421です。
ボーレードは、19200 にしました。


![photocoupler_may16.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/ff11158d-f83a-fca0-f86a-0ee466885c0b.jpeg)

![connection_diagram.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/2421bed0-bb33-a380-4033-38209bb474fc.png)

2: カソード　と、　3: エミッタを GND に接続します。

## プログラム

>PD8 を発光側
>PD7 を受光側
>とします。

```text:photocoupler/photocoupler.ino
bool vol_flg = false;
 
void setup() {
  Serial.begin(19200); 
  pinMode(7,INPUT);
  pinMode(8,OUTPUT);
}
 
void loop() {
  
  if(vol_flg){
    digitalWrite(8,HIGH);
  }else{
    digitalWrite(8,LOW);
  }
  delay(100);
 
  // digitalRead関数では3V以上がHIGHとなる
  // ※analogRead関数でも可。その場合は614.4以上がHIGHです。
  if(digitalRead(7) == HIGH){
    Serial.println("受光していません。");     
  }else{
    Serial.println("発光素子から光を受光しました。");     
  }
 
  vol_flg =  (!vol_flg);
 
  delay(2000);
}

```

## 実行結果

![arduino_may1601.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/4339569b-b07b-39d1-d015-aebef5a1a017.png)
ccna取得に向けてCiscoPacketTracerで構築練習　~ルータ設定~

## はじめに
CCNAを受験するにあたって、実際にコマンドを打って構築をすることが大切らしい。
Cisco Packet Tracerを使用して構築の練習とその流れ、結果を示して、気づいたことなどをまとめていこうと思う。

## 1. 基本的な使い方
### 機器の設置
+ 画面下部の機器アイコンから選ぶ。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2998315/f40562ce-f7c6-3358-b72d-ef5b635f848b.png)

+ とりあえずルータ(1841)とPC(Laptop)を１台ずつ設置し、ケーブルをつなぐ。
![Cisco Packet Tracer 2024_05_16 0_16_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2998315/93c74bad-f395-fa8d-e6cb-bcf7f762e077.png)

+ ルータのアイコンをクリックし、CLIタブを選んでコマンドを入力していく。
![Router0 2024_05_15 23_58_24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2998315/89202a58-74b3-983b-5ec6-c5fa78c8648c.png)

### コマンドを打ち込む
設定内容は以下のようにする。
+ ルータ名 : Cisco1841
+ enableパスワード : enable01
+ コンソールパスワード : console01
+ ユーザを3つ作成
    ユーザ名 : パスワード : 特権レベル
    user1 : pass1 : 0
    user2 : pass2 : 1
    user3 : pass3 : 15
+ ssh telnet で接続(接続数最大5台)するときに、上のユーザでログインできるようにする。
+ ドメイン名はcisco.jp
+ パスワードの暗号化はしない
+ ipアドレスはfa/01に192.168.1.1/24

## 結果
コマンドを入力した部分のスクショを取り忘れたので、configだけ載せる。
```terminal:Cisco1841
Cisco1841#show run
Building configuration...

Current configuration : 792 bytes
!
version 12.4
no service timestamps log datetime msec
no service timestamps debug datetime msec
no service password-encryption
!
hostname Cisco1841 //ホスト名
!
!
!
enable password enable01 //enableパスワード
!
!
!
!
!
!
ip cef
no ipv6 cef
!
!
! //ユーザ3つ
username user1 privilege 0 password 0 pass1
username user2 password 0 pass2
username user3 privilege 15 password 0 pass3
!
!
!
!
!
!
!
!
ip ssh version 1
ip domain-name cisco.jp //ドメイン名
!
!
spanning-tree mode pvst
!
!
!
!
!
!
interface FastEthernet0/0
 no ip address
 duplex auto
 speed auto
 shutdown
!
interface FastEthernet0/1
 ip address 192.168.1.1 255.255.255.0 //IPアドレス設定
 duplex auto
 speed auto
!
interface Vlan1
 no ip address
 shutdown
!
ip classless
!
ip flow-export version 9
!
!
!
!
!
!
!
!
line con 0
 password console01
 login //パスワードログイン
!
line aux 0
!
line vty 0 4
 login local //ユーザログイン
!
!
!
end
```
## PCから接続してみる
PCのアイコンをダブルクリックし、デスクトップタブを選択。
`IP Configuretion`からIPアドレスを設定して、console接続は`Terminal`から、telnet sshは`Telnat/SSH Client`から接続する。
### Console接続
![Laptop0 2024_05_16 0_50_40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2998315/401a2b81-5972-1371-2066-969332af7dbf.png)

### SSH
+ User1
![sshUser1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2998315/a9da5ea5-4872-b4a6-b3b2-9bb5a3007f71.png)
![sshUser1-prompt.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2998315/553f2f81-5635-47d4-99ff-f6d0037db791.png)

+ user2
![sshUser2-prompt.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2998315/031bbebd-be13-25ab-6609-1c2ad473abcb.png)

+ user3
![sshUser3-prompt.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2998315/86132afc-36a2-6f0b-c636-ca3b8c9f6816.png)

## 気になったとこと,覚えておきたいこと
+ ssh version2を設定するにはRSAキーの長さが一定(768byte)以上のものを生成しないといけないらしい。
```terminal:Cisco1841
Cisco1841(config)#ip ssh version 2
Please create RSA keys (of at least 768 bits size) to enable SSH v2.
```

## 参考サイト

https://owlcamp.jp/cisco-packet-tracer-01/
【Unity】PolySpatial1.2.3 アップデートしたらXcodeビルドが通らなくなる問題の対応策【VisionPro】


# TL;DR
- B(I) ARM64 branch out of range... という不具合によってビルドが通らない場合は Unityの　Project Settings の Apple visionOS の `IL2CPP Large Exe Workaround` をOnにしよう
 

![スクリーンショット 2024-05-16 17.51.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65257/e468d89a-cf9d-c529-6d31-80d530d45d77.png)

![スクリーンショット 2024-05-16 17.52.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65257/791bb816-6413-949f-c21c-827415132285.png)


# PolySpatial 1.2.3

色々バグ修正が入りましたが、目玉としては以下の2つです

- 異世界とのPortal を現実に表示するARのサンプル
- PolySpatial1.2.3 = PolySpatial2.0-pre で2.0の方はUnity6-preview 対応！
    - XRHand 1.3.X 対応
    - Unity でカスタムハンドジェスチャーを作成可能に


# PolySpatial のアップデート
公式のフォーラムでも　`そのままアップデートは非推奨で、手間ですが一旦元バージョンのパッケージを削除して入れ直してください`  と言われるほど、そのままアプデすると色々うまく動かないらしいです。

## 1.2.3〜
v1.x系のノリでサンプルをビルドすると `Unityビルド` は問題ないのですが、Xcode上でビルドするとビルドエラーが発生します。
こちらはUnity6-previewでも同様のエラーが発生します。

![スクリーンショット 2024-05-16 17.51.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65257/e468d89a-cf9d-c529-6d31-80d530d45d77.png)

上記スクショのエラーが出た場合はPolySpatial1.2.3から追加されたProjectSettings の `IL2CPP Large Exe Workaround` にチェックを入れることでこの問題が解消されるらしいです。

https://discussions.unity.com/t/official-support-for-visionos-release-notes-1-2-and-2-0-pre/356685/21

![スクリーンショット 2024-05-16 17.52.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65257/791bb816-6413-949f-c21c-827415132285.png)


また、1.2.3のサンプルビルド時にXcodeビルドは通るけれど、実際に実機でアプリ起動するといつまでたっても最初のSceneが表示されないという現象もありましたが、上記の通り `IL2CPP Large Exe Workaround` のチェックを入れることで事象が回避できました。

が、正直なんで回避できるのか？はわかりませんでした。


# 結論

公式のDiscussionフォーラムは定期的にチェックしたりUnity中の人にメンションしつつ聞くと思わぬ有益情報が出てくるので、PolySpatial周りは積極的に情報キャッチしにいきましょう
【Ruby on Rails】Rails理念に沿ったビューの共通化

共通させるビューのファイル名には、アンダースコア[ _ ]から記述化させるのがルールです。
```:ファイル名：例
_common.html.rb
```

# ■方法
1. 共通するコードを[ _ ]ファイルに記述
2. コピー元のコードを削除 
3. 共通化させたいファイルに以下のコード記述
```ruby:共通させるビューのファイル
render partial: 'アンダースコアを取り除いたファイル名'
```
※アンダースコアは書かないルール
AutoDockVinaとMGLToolsインストールの忘備録

#  環境
Ubuntu 22.04
Autodock Vina 1.1.2
MGLTools 1.5.7

#  ダウンロード方法
###  AutoDockVinaのインストール
[AutoDockVinaのHP](https://vina.scripps.edu/)からダウンロードしてきたtar.gzファイルautodock_vina_1_1_2_linux_x86.tgzを解凍した。その後、binパスを通した。

```
sudo tar -zxvf autodock_vina_1_1_2_linux_x86.tgz
export PATH=$PATH:/Your/PATH/TO/autodock_vina_1_1_2_linux_x86/bin
source ~/.bashrc
```
コマンドシェルを再起動すると通したPATHがリセットされるので、.bashrcに先程の
```
export PATH=$PATH:/Your/PATH/TO/autodock_vina_1_1_2_linux_x86/bin
```

を追記しておくと良い。

これでPATHが通ったので、vinaとコマンドラインで打てばvinaが使える。
以下はvina -hとコマンド入力したときの画面。
```
> vina -h

Correct usage:

Input:
  --receptor arg             rigid part of the receptor (PDBQT)
  --flex arg                 flexible side chains, if any (PDBQT)
  --ligand arg               ligand (PDBQT)

Search space (required):
  --center_x arg             X coordinate of the center
  --center_y arg             Y coordinate of the center
  --center_z arg             Z coordinate of the center
  --size_x arg               size in the X dimension (Angstroms)
  --size_y arg               size in the Y dimension (Angstroms)
  --size_z arg               size in the Z dimension (Angstroms)

Output (optional):
  --out arg                  output models (PDBQT), the default is chosen based
                             on the ligand file name
  --log arg                  optionally, write log file

Misc (optional):
  --cpu arg                  the number of CPUs to use (the default is to try 
                             to detect the number of CPUs or, failing that, use
                             1)
  --seed arg                 explicit random seed
  --exhaustiveness arg (=8)  exhaustiveness of the global search (roughly 
                             proportional to time): 1+
  --num_modes arg (=9)       maximum number of binding modes to generate
  --energy_range arg (=3)    maximum energy difference between the best binding
                             mode and the worst one displayed (kcal/mol)

Configuration file (optional):
  --config arg               the above options can be put here

Information (optional):
  --help                     display usage summary
  --help_advanced            display usage summary with advanced options
  --version                  display program version
```

###  Mgltoolsのインストール
[MGLToolsのHP](https://ccsb.scripps.edu/mgltools/)からmgltools_Linux-x86_64_1.5.7_Installをインストールした。今回はGUIベースでのインストールを行った。
ダウンロード後、以下のコマンドで実行権限を付与し、実行することでGUIのインストーラーを立ち上げた。

```
chmod +x /YOUR/PATH/TO/mgltools_Linux-x86_64_1.5.7_Install
/YOUR/PATH/TO/mgltools_Linux-x86_64_1.5.7_Install
```

あとは指示に従ってインストールを行うだけ。
インストール後、AutoDockVinaと同様にパスを通す。
```
sudo tar -zxvf autodock_vina_1_1_2_linux_x86.tgz
export PATH=$PATH:/Your/PATH/TO/MGLTools-1.5.7/bin
source ~/.bashrc
```

こちらも同様に.bashrcに追記しておくと良い。

パスを通したらadtとコマンドラインで入力するとGUIのAutoDockToolsが立ち上がる。

詳細なAutoDockの使い方などは他のブログ[1](https://computational-chemistry.com/top/blog/2017/04/26/autodock-vina/), [2](https://hira-labo.com/archives/1231)などを参照してください。
bitnamiののWordPress MultiSiteインスタンスにバーチャルホストの設定を追加する

BitnamiのWordPress MultiSiteインスタンスを利用しています。

諸般事情でPHPをこのサーバーで公開する事になり、その設定についてメモを残します。

httpsはCloudflareで対応するので、今回はバーチャルホストの設定だけです。

なお、完全に自分のメモ書きに近いものを公開してます。
レアケース過ぎて一般的にはニーズがないかと思います。

数カ月後に似たような作業をする自分に向けての最小限の資料と思ってください。

## できるようになること

bitnamiインスタンスに用意されているWordPressでサイトを公開する以外に、ドメインを割り当てて静的ファイルなんかをWebに公開できるようになります。

## やること

1. `bitnami-apps-vhosts.conf`の追記
1. apacheの再起動

## `bitnami-apps-vhosts.conf`の追記
元は下記の内容です。
（以前に一回追加しているので、今回はさらに追加する設定です）

```/opt/bitnami/apache2/conf/bitnami/bitnami-apps-vhosts.conf
# Bitnami applications installed in a Virtual Host
<VirtualHost *:80>
    ServerName sub.example.com
    DocumentRoot "/home/bitnami/www/sub.example.com"
    <Directory "/home/bitnami/www/sub.example.com">
    Options +MultiViews +FollowSymLinks
    AllowOverride All
    Require all granted
    </Directory>
</VirtualHost>
```

上記のような記述で `http://sub.example.com` にアクセスがあると`/home/bitnami/www/sub.example.com`のファイルを吐き出します。

なお、設定しているディレクトリーの`/home/bitnami/www/`はlightsailインスタンスにログインしたホームディレクトリ下に`www/`を追加したもので、`~/www/`と同意です。

作業しやすいようにここにしているだけで、他の場所でも構いません。

#### サブドメインの追加

```/opt/bitnami/apache2/conf/bitnami/bitnami-apps-vhosts.conf
# Bitnami applications installed in a Virtual Host
<VirtualHost *:80>
    ServerName sub.example.com
    DocumentRoot "/home/bitnami/www/sub.example.com"
    <Directory "/home/bitnami/www/sub.example.com">
    Options +MultiViews +FollowSymLinks
    AllowOverride All
    Require all granted
    </Directory>
</VirtualHost>

<VirtualHost *:80>
    ServerName other-sub.example.com
     DocumentRoot "/home/bitnami/www/other-sub.example.com"
    <Directory "/home/bitnami/www/other-sub.example.com">
    Options +MultiViews +FollowSymLinks
    AllowOverride All
    Require all granted
    </Directory>
</VirtualHost>
```

以上にて、apacheの再起動をかければ完了です。


### apacheの再起動

再起動は
```bash
$ sudo /opt/bitnami/ctlscript.sh restart apache
```
にて。

具体的には下記のような流れで作業して、念には念を入れてhttpdを見てたりします。

```bash
$ ps aux | grep httpd
$ sudo /opt/bitnami/ctlscript.sh restart apache
Unmonitored apache
Syntax OK
/opt/bitnami/apache2/scripts/ctl.sh : httpd stopped
Syntax OK
/opt/bitnami/apache2/scripts/ctl.sh : httpd started at port 80
Monitored apache
$ ps aux | grep httpd
```

エラーが出なければ完了です。


## 追記
ドメインの設定はLightsailのコントロールパネル上にもありますが、インスタンス上の作業とネームサーバーの設定だけも完了し見えるようになります。
Istioのデフォルト設定を確認する

istioのデフォルト設定はドキュメントでは記載なかったりしますが、そういう時は実機のistio-proxyで確認しましょう。

以下のようにして全ての設定をダンプできます。
```
kubectl exec -it <pod name> -n <namespace> -- curl -s http://localhost:15000/config_dump
```

そのままだと大量なので、grepやjqで絞ると良いと思います。
Godotでフォーカスを失わないようにする仕組み

## 前提
本情報は`Godot_v4.2.2-stable_win64`のものです。

## Godotのフォーカスシステム
Godotのフォーカスシステム、便利ですよね。
コントローラー用のゲームだと全てフォーカスベースで操作できるようにしないといけないので、ほとんどデフォルトで動作してくれるのはありがたいです。
https://docs.godotengine.org/ja/4.x/tutorials/ui/gui_navigation.html

## 困っていること
ただ１つ困ったことがあって、Godotって完全にフォーカスを失ったときに復帰する仕組みがないんですよね。
つまり、どのコンポーネントにもフォーカスが当たってない状態になると、コントローラーでは完全に操作できない状況になります。
どんな時にそうなるかというと…
- ポーズ画面を開いて、閉じるとき。ポーズ画面のフォーカスが失われて、フォーカスがない状態になる。
- アイテムショップ画面とかで、アイテムを購入後フォーカスしていたアイテムが削除されたとき。フォーカスしていたアイテムが消えるので、フォーカスがない状態になる。

それぞれのアクション（ポーズ画面を閉じた後、ショップで買い物をした後）に既定のコンポーネントへフォーカスが当たるようなコードを書いてもいいのですが、めんどくさい。

今回の記事はフォーカスが失われた場合に自動で復旧するための仕組みです。

## 方針
1. `Viewport.gui_focus_changed`シグナルでフォーカスの変更を監視し、フォーカスが当たるたび配列にNodeを記録
1. 毎フレーム`Viewport.gui_get_focus_owner()`でフォーカスが当たっているかを監視し、フォーカスが失われていれば1.の配列から取り出してフォーカスを当ててあげる

これだけです。
もっといい方法があれば教えてください。
`gui_focus_changed`でフォーカスが無くなった時もシグナルが飛んでくると嬉しいのですが、「なにかにフォーカスが当たった時」しかシグナルが発生しないみたいなので、2.で常時監視しています。

## コード
以下のコードを`FocusManager.md`とか適当な名前を付けて、`プロジェクト設定` > `自動読み込み`に追加します。

```FocusManager.md
extends Node

var focused_node_history = [];

func _ready():
	get_viewport().gui_focus_changed.connect(_on_gui_focus_changed)

func _process(delta):
	_next_focus(); # フォーカスを探索

func _on_gui_focus_changed(node):
	focused_node_history.push_back(node); # フォーカスの履歴に登録

func _next_focus():
	while true:
		var focused_node = get_viewport().gui_get_focus_owner()
		
		if (focused_node != null): break; # フォーカスされているので離脱
		if (focused_node_history.size() == 0): break; # 履歴からフォーカス出来るものが無いので離脱（画面はフォーカスを失う）
		
		var node = focused_node_history.pop_back(); # 前回フォーカスされていたものを取得

		if (node == null): continue; # 既に削除済みなどの理由で取得できなければ次を試す
		if (!node.is_visible_in_tree()): continue; # 画面に表示されていなくても次を一度試す
		
		node.grab_focus();

```
初回のフォーカスは以下のように自分でフォーカスを当てる必要があります。（どこにフォーカスを当てるべきか分からないので）
```
func _ready():
	$StartButton.grab_focus()
 ```
仮想環境をvenvで構築

# 本日のお悩み
pythonで仮想環境を構築したいがどうすればいい？

# 本日の処方箋
### venvによる仮想環境の構築
今回は定番のvenvによる構築からパッケージのインストール方法まで記載する。
以下、ターミナルで全て実行

１. **仮想環境の作成**
  
仮想環境を作成するためのディレクトリを作成し移動する
```sh
mkdir sample
cd sample
```

仮想環境の作成
最後のvenvは仮想環境名のためenvでも良い

  ```sh
  python3 -m venv venv
  ```
２. **仮想環境の起動**
作成した仮想環境を立ち上げる
(venv)と表示が変われば起動できている

```sh
source venv/bin/activate
```

３.　パッケージのインストール
作成した仮想環境に指定のパッケージをインストールする

```sh
# 例
(venv) % pip3 install python
# バージョンを指定した記載方法
(venv) % pip3 install python==3.8 
```

４. パッケージの確認
きちんとインストールされているか確認する

```sh
(venv) % pip3 list

Package    Version
---------- -------
pip        21.2.4
python     3.8
setuptools 47.1.0
urllib3    1.26.6
```

５. 仮想環境の停止
仮想環境を停止する

```sh
(venv) % deactivate
```

## おまけ
最後に使えるネタを記載します。

### パッケージの保存

```sh
# インストール済みパッケージのリストをrequirements.txtというファイルに出力
(venv) % pip freeze > requirements.txt
# ファイルの内容を表示するコマンド(以下はネットから拾ったサンプル)
(venv) % cat requirements.txt
selenium==3.141.0
urllib3==1.26.6
```

作成したパッケージのリストを保存することが可能
保存する際のファイル名は任意で設定可能だが、一般的には`requirements.txt`にすることが望ましい。
パッケージはバージョンも指定されるので、同一環境を他人と共有するときに便利

<hr>

### 上記で保存したrequirements.txtファイルに記載されているすべてのパッケージをインストールする

```sh
(venv) % pip install -r requirements.txt
```

この方法を使えば、他の開発者やチームメンバーがプロジェクトを再現するのが簡単になります。また、仮想環境を使用している場合でも、requirements.txtファイルに依存関係を記述しておけば、新しい仮想環境を作成し、そこに必要なパッケージを一括でインストールすることができます。
他人や他のPCに構築した環境を共有することが簡単にできるので便利かと思います。
firebasecrashlytics settings request failed

## firebasecrashlytics settings request failed

私の解決策：動作検証している端末やエミュレータの通信状態をONにする。
※検証している端末の通信状態がOFFになっていることが原因でした。他の記事をご覧になっても初期化失敗する方は確認してみてください。
Javaで「基本のデータ型」の動作を確認してみた

# 概要

Javaで「基本のデータ型」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/start/var/index4.html

# 実装

以下のファイルを作成しました。
```JSample4_1.java
class JSample4_1{
  public static void main(String[] args){
    int n = 100;
    long l = 12345678910L;
    double d = 3.14;
    float f = 3.14F;
    char c = '花';
    boolean b = true;

    System.out.println("n=" + n);
    System.out.println("l=" + l);
    System.out.println("d=" + d);
    System.out.println("f=" + f);
    System.out.println("c=" + c);
    System.out.println("b=" + b);
  }
}
```

以下のコマンドを実行しました。
```
$ javac JSample4_1.java 
$ java JSample4_1 
n=100
l=12345678910
d=3.14
f=3.14
c=花
b=true
```

# まとめ

何かの役に立てばと。
【Ruby on Rails】destroyアクションに実装させるturbo_methodとturbo_confirm

### ■ 使用される場面
destroyアクションを使いデータを削除する場面。

### ■ 参考コード
``` Ruby 
<%= link_to("削除", "/users/index",
data: {turbo_method: 'delete', turbo_confirm: '本当に削除してよろしいですか?'}) %>
```


### ■ 重要度
★★★

### ■ 効果
**`turbo_method: 'delete'`**
Turbolinksを使用してHTTP DELETEリクエストを送信するための指示。
通常のHTMLリンクでは送ることは出来ないが,TurbolinksはJavaScriptを介してこの機能を実現できる。

**`turbo_confirm: '本当に削除してよろしいですか?'`**
削除リンクをクリックした際、ユーザーが確認できるためのメッセージ。
誤操作防止。


### ■ その他
この機能は、通常はJavaScriptで実装されますが、Railsでは`link_to`ヘルパーを使用することで、JavaScriptで書くことなく実装できます。
つまりRailsを使用することでJavaScriptを書く手間が省けます。
この機能はTurbolinksが有効になっている場合にのみ機能します。

### ■ 実装画像
![screenshot_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711935/07b47fc1-52b9-2171-03ed-ba74f90245df.png)
Bot Framework（Node.js）でstate管理をAzure Blobに設定する

# 目的

Bot Framework（Node.js）でstate管理する方法を記載します。（公式ドキュメントがメモリ管理の開発環境が前提になった記事ばかりで本番環境のstate管理の仕方が分からなかった・・）

> [基本的なボットを作成する \- Bot Service \| Microsoft Learn](https://learn.microsoft.com/ja-jp/azure/bot-service/bot-service-quickstart-create-bot?view=azure-bot-service-4.0&tabs=javascript%2Cvs)

動作確認をしたのは上記の `yo` コマンド（と `yo-teams` コマンドなど）で作成したBot Framework V4環境です。

# すること

## ライブラリのインストール

> $ npm install botbuilder-azure-blobs

`botbuilder-azure-blobs` をインストールします。

## ソース改修

stateをメモリ管理する開発環境で使用する [`botbuilder` の `MemoryStorage`](https://learn.microsoft.com/ja-jp/javascript/api/botbuilder-core/memorystorage?view=botbuilder-ts-latest) に利用可能なメソッドが3つ（ `read` , `write` , `delete` ）提供されていますが、[`botbuilder-azure-blobs` の `BlobsStorage`](https://learn.microsoft.com/en-us/javascript/api/botbuilder-azure-blobs/blobsstorage?view=botbuilder-ts-latest#botbuilder-azure-blobs-blobsstorage-constructor) でも同じ名称のメソッド3つが利用できるようになっていることが分かります。

なので、ソースコードの `MemoryStorage()` をストレージを利用する `BlobsStorage` に置き換えてあげれば良さそうです。
`BotDeclaration` デコレータの部分に `storage` を使ってあげるだけで `state` 管理がメモリではなくストレージ上で行われるようになりました。

```typescript: XXXbot.ts
let storage = new BlobsStorage(
    process.env.STORAGE_CONNECTION_STRING as string, // 接続文字列
    'state管理したいコンテナ名'
)

/**
 * Implementation for XXX Bot
 */
  @BotDeclaration(
      '/api/messages',
      storage, // ここをMemoryStorage()から置き換えた
      // eslint-disable-next-line no-undef
      process.env.MICROSOFT_APP_ID,
      // eslint-disable-next-line no-undef
      process.env.MICROSOFT_APP_PASSWORD)

export class XXXBot extends DialogBot {
    constructor(conversationState: ConversationState, userState: UserState) {
        super(conversationState, userState, new MainDialog());

        this.onMembersAdded(async (context, next) => {
            const membersAdded = context.activity.membersAdded;
            if (membersAdded && membersAdded.length > 0) {
                for (let cnt = 0; cnt < membersAdded.length; cnt++) {
                    if (membersAdded[cnt].id !== context.activity.recipient.id) {
                        await this.sendWelcomeCard( context );
                    }
                }
            }
            await next();
        });
    }

    public async sendWelcomeCard( context: TurnContext ): Promise<void> {
        const welcomeCard = CardFactory.adaptiveCard(adaptiveCards.WelcomeCard);
        await context.sendActivity({ attachments: [welcomeCard] });
    }

}
```
mysql/mariadbのrootパスワード再設定

/etc/my.conf
```
[mysqld]
skip-grant-tables
```
mariadbの再起動
```
systemctl restart mariadb;
mysql
```
mysqlに接続してPasswordのハッシュを上書き
```
use user;
update user set Password = PASSWORD('password') where User = 'root';
flush privileges;
quit;
```
/etc/my.confの追加記述をコメントアウトしてmariadbを再起動
```
systemctl restart mariadb;
mysql -u root -p
```

identified by はユーザ作成時だけらしい・・・
```
ALTER USER 'root'@'localhost' identified BY 'hoge';
```
Figmaで小さいSVGファイルが作成されるようにするコツ

# はじめに
「冷やし中華、始めました！:ramen:」
普段はiOSエンジニアですが、```Figma```で画面デザイン始めました！
作成したアイコンをSVGでエクスポートしたときにファイルサイズを小さくするコツを発見したのでメモします。

# サンプルアイコン

| サンプル1    | サンプル2 |
|:---:|:---:|
| <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95033/4e9055d6-3054-cf55-9607-8acfc145aba8.png" width="256"> | <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95033/da3401c8-6028-aaf6-6eb6-9812b16b8701.png" width="256"> |


サンプル1とサンプル2ですが、見た目は同じですよね？

## 構成

でも図形の構成が違うんです。

| サンプル1    | サンプル2 |
|:---:|:---:|
| <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95033/b81a800e-b812-614c-b3d7-1723f5a05efe.png" width="256"> | <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95033/a13ac4a7-5a4e-4e96-7321-671c333f6e60.png" width="256">  |
| 四隅に1/4円を使っている。 | 四隅に円を使っている。<br> (マスクされているだけ) |

## SVGでエクスポートしてみた

### ファイルサイズ 
| サンプル1.svg    | サンプル2.svg |
|:---|:---|
| 1,226バイト | 495バイト<br> (約60%小さい) | 

### コード

```XML:サンプル1.svg (抜粋)
<path d="M19 0C19 2.49512 18.5086 4.9658 17.5537 7.27099C16.5989 9.57617 15.1993 11.6707 13.435 13.435C11.6707 15.1993 9.57617 16.5989 7.27098 17.5537C4.9658 18.5086 2.49511 19 -8.30516e-07 19L0 0H19Z" fill="#7FDA85"/>
<path d="M82 19C79.5049 19 77.0342 18.5085 74.729 17.5537C72.4238 16.5989 70.3293 15.1993 68.565 13.435C66.8006 11.6707 65.4011 9.57616 64.4463 7.27097C63.4914 4.96578 63 2.49509 63 -2.43108e-05L82 0L82 19Z" fill="#7FDA85"/>
<path d="M2.26573e-07 63C2.49512 63 4.9658 63.4914 7.27099 64.4463C9.57617 65.4011 11.6707 66.8007 13.435 68.565C15.1993 70.3293 16.5989 72.4238 17.5537 74.729C18.5086 77.0342 19 79.5049 19 82L0 82L2.26573e-07 63Z" fill="#7FDA85"/>
<path d="M63 82C63 79.5049 63.4915 77.0342 64.4463 74.729C65.4011 72.4238 66.8007 70.3293 68.565 68.565C70.3293 66.8006 72.4238 65.4011 74.729 64.4463C77.0342 63.4914 79.5049 63 82 63L82 82L63 82Z" fill="#7FDA85"/>
```

```XML:サンプル2.svg (抜粋)
<circle cx="41" cy="41" r="19" fill="#7FDA85"/>
<circle cx="82" r="19" fill="#7FDA85"/>
<circle cy="82" r="19" fill="#7FDA85"/>
<circle cx="81" cy="82" r="19" fill="#7FDA85"/>
```

サンプル1は`path`でゴリゴリっと描画しているのに対して、サンプル2は丸描いてるだけなのでシンプルでイイですね！
ベンチマークは取ってないですけど、サンプル2の方が描画パフォーマンスも良さそうですね。

「シンプルな図形を組み合わせると、作成されるファイルもシンプルになる」という知見を得ました！:sunglasses:


# おわりに
エンジニアらしく、生成されるコードやパフォーマンスにも気を遣ってデザインしていきます！:muscle:
ModalBottomSheetで発生したニアミス

# はじめに
今回はModal BottomSheetを実装していて発生したニアミスを紹介していきます
### 本文
***表示切替***
ModalBottomSheetを実装するときに`rememberModalBottomSheetState`を使うと思うのですが、`show()`や`hide()`で切り替えようとするとボトムシートを置いている親のViewに対するタップが効かなくなります。
これはbackgroundを設定したりModalBottomSheetの中を見てみるとわかるのですが、`BoxWithConstraints`で`constraints.maxHeight`が設定されているため親の高さいっぱいまで見えないBottomSheetが伸びてるせいでタップが全て吸われている状態です。
そのためif文での切り替えが最適となります。
***padding***
ナビゲーションバー分の余白を開けようとして`navigationBarsPadding`のみを設定すると少しだけ余白が足りません。
これは`dragHandle`分の余白が考慮されていないため発生しています。
BottomSheetの中身を見てみるとハンドル自体の高さが`4dp`あり、Verticalのパディングに`22dp`設定されていることがわかります。
そのため合計で48dpの余白を追加することでハンドル分を考慮することができます
### 最後に
今回は自分が実装していて本当に！？ってなったちょっとしたTipsを紹介しました
切り替えに関しては関数として存在している上に普通のViewではif文での表示切り替えに抵抗があるので気づくのに時間がかかりました
どなたかのお役に立てれば幸いです