OmniAICreator/Qiita-1.07M huggingface dataset:
Pandas：インデックス無しでCSVファイルを出力する方法

皆様こんにちは。
今回はPython学習の一環として、Pandasのデータフレームを用いてCSVファイルを操作してみます。
また、インデックス無しでCSVファイルを出力する方法をご紹介します。

::: note
Pandasとは？
Pythonのライブラリの一つ。データ解析機能を提供する。
:::

# 普通に出力してみる
では実際に出力してみます。
今回は環境として、「Google Colaboratory」を使用します。
Google Colaboratory(以下Colab)の使い方については[こちら](https://blog.kikagaku.co.jp/google-colab-howto#Google_Colab-3 "【Colab 入門】Google Colaboratory とは？使い方・メリットを徹底解説！")をご覧ください。
まず、下記のようなCSVファイルを用意します。
今回は仮としてクラス名簿を想定したファイルとします。

クラス名簿.csv
![クラス名簿CSV.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2150221/a9edc36f-5665-7101-a8bb-45ef780851b1.png)

では、この名簿の中から男子生徒のみを抽出し、CSVファイルとして出力してみます。
``` Python
# Pandasをインポート
import pandas as pd

# 性別が男のみを抽出し csvに出力

df = pd.read_csv('/content/drive/MyDrive/Python学習/CSV/クラス名簿.csv')

maleOnly = df.loc[df.性別 == '男']

filePath = '/content/drive/MyDrive/Python学習/'

maleOnly.to_csv(filePath + '男子のみ.csv')
```
きちんと男子生徒のみ抽出できているか、データファイルの中身をColab上で確認してみます。
![CSV出力結果(Colab上).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2150221/8f9c7df2-2815-61e1-c8cd-1e54767d824b.png)

::: note
Colabではデータフレームを格納した変数を実行するだけで、Colab上で簡単にデータフレームの中身を確認することができます。
今回の例で言えば、適当なコードセルに変数名の「maleOnly」を記述し実行するだけでOKです。
:::

問題なく抽出できているようなので、次は出力されたCSVファイルを確認してみます。
![男子のみcsv(インデックス有).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2150221/3606503d-6444-0804-9fb0-5987eaf7ffb1.png)
男子生徒のみに絞れてはいるのですが、せっかく出席番号を割り振っているのにA列にインデックスが挿入されてしまっており、少々邪魔に感じます。
次はインデックス無しで出力してみましょう。

# インデックス無しで出力してみる
インデックス無しにする方法は実はとても簡単です。
関数`.csv()`の()内で`index`を`False`に指定するだけでOKです。
コードを下記のように修正します。
``` Python
# 性別が男性のみを抽出し csvに出力(インデックス無し)

df = pd.read_csv('/content/drive/MyDrive/Python学習/CSV/クラス名簿.csv')

maleOnly = df.loc[df.性別 == '男']

filePath = '/content/drive/MyDrive/Python学習/'

maleOnly.to_csv(filePath + '男子のみインデックス無し.csv', index = False)
```
データフレームの中身を確認してみます。
![CSV出力結果(Colab上).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2150221/693fcd42-7c92-14ab-b442-b5cf88fcb49b.png)
Colab上では特に変化はありませんね。
続いてCSVファイルを確認してみます。
![男子のみcsv(インデックス無).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2150221/6cf49e86-2f0b-5980-0ed0-4f56605ba2f4.png)
きちんとインデックス無しで出力できていることが確認できました。

# まとめ
いかがだったでしょうか？
私ははじめ、CSVファイルからインデックスを削除する方法に辿り着くためにかなり四苦八苦してしまい、ググる力を磨いていかなければと痛感しました……。
自分の実現したい操作が、調べてみたら実はめちゃくちゃ簡単だったというのはプログラミング学習あるあるだと思います。
少しでも皆様の参考になれば幸いです。

# 参考
* [【初心者向け】データ分析で必須のPandasを入門しよう！](https://aiacademy.jp/media/?p=152 "【初心者向け】データ分析で必須のPandasを入門しよう！")
* [Pandas インデックスなしで CSV に変換](https://www.delftstack.com/ja/howto/python-pandas/pandas-to-csv-without-index/#google_vignette "Pandas インデックスなしで CSV に変換")
* [【Colab 入門】Google Colaboratory とは？使い方・メリットを徹底解説！](https://blog.kikagaku.co.jp/google-colab-howto#Google_Colab-3 "【Colab 入門】Google Colaboratory とは？使い方・メリットを徹底解説！")
ChocolateyGUI で export した .config ファイルでインストールができない

ChocolateyGUI でアプリ一覧を export しておけば、他のPCのインストールとか障害復旧時に自動でアプリがインストールできて、楽になるぞーと思っていたらうまく動かなかったのでメモ。

エラーはこんな感じ。 XML の構文エラー。

```
PS C:\temp> choco install -y 'choco-list-desktop.config'
Chocolatey v2.2.2
Installing from config file:
choco-list-desktop.config
By installing, you accept licenses for the packages.
Error deserializing response of type chocolatey.infrastructure.app.configuration.PackagesConfigFileSettings:
 XML 宣言の構文が無効です。 行 1、位置 7。
This is try 1/3. Retrying after 400 milliseconds.
 Error converted to warning:
 XML 宣言の構文が無効です。 行 1、位置 7。
Error deserializing response of type chocolatey.infrastructure.app.configuration.PackagesConfigFileSettings:
 XML 宣言の構文が無効です。 行 1、位置 7。
This is try 2/3. Retrying after 600 milliseconds.
 Error converted to warning:
 XML 宣言の構文が無効です。 行 1、位置 7。
Error deserializing response of type chocolatey.infrastructure.app.configuration.PackagesConfigFileSettings:
 XML 宣言の構文が無効です。 行 1、位置 7。
Maximum tries of 3 reached. Throwing error.

Chocolatey installed 0/0 packages.
 See the log for details (C:\ProgramData\chocolatey\logs\chocolatey.log).
XML 宣言の構文が無効です。 行 1、位置 7。
```

.config ファイルはこんな感じです。

``` choco-list-desktop.config
<?xml encoding="utf-8"?>
<packages>
  <package id="7zip" />
  <package id="adobereader" />
  <package id="brave" />
  <package id="chocolatey" />
...
```

先頭行の xml 宣言を次のように書き換えれば OK。

```
<?xml version="1.0" encoding="utf-8"?>
```


### おまけ

`*.install` とか、cランタイムとか.netとか、依存でインストールされるものを削除したり、
バージョンを問わない（ピン止めしてない）アプリは `version="..."` を消して .config ファイル作っておくと、update かけなくて済むので良いです。

最近だと `cinst` とか短縮形のコマンド入らないのだけど、入れないようになったのか？

```
cinst choco-list.config -y
```

って打つんだよ。という解説サイトばっかりヒットするけど

```
choco install coco-list.config -y
```

で大丈夫。
Sporockets::FileNotFoundのエラー解決方法

# Sporockets::FileNotFoundのエラー解決方法

Ruby on railsでアプリを作成中にエラーが出てきたので
原因と対処法を書いていきます。

## なぜエラーが出たのか？
gemを導入してターミナルで
`bundle install`
を実行した後に
localhost:3000/
でブラウザを開こうとしたらエラーが出ました。

## 対処法

ターミナルで
Ctrl+CでRailsサーバーを切り、再度`rails s`を実行する。

gemをインストールした後は
サーバーの再起動を徹底します！
WindowsにTensorflow2をpoetryでインストールで少しはまる




[Tensorflow-io-gcs-filesystem with Windows - General Discussion - TensorFlow Forum](https://discuss.tensorflow.org/t/tensorflow-io-gcs-filesystem-with-windows/18849/6)

上記にある通り、2023/11月現在、依存性のあるtensorflow-io-gcs-filesystemが、0.31.0しかwindowsに適応していない。

```jsx
> poetry add tensorflow
Using version ^2.15.0 for tensorflow

Updating dependencies
Resolving dependencies... (1.2s)

Package operations: 3 installs, 0 updates, 0 removals

  • Installing keras (2.15.0)
  • Installing tensorflow-io-gcs-filesystem (0.34.0): Failed

  RuntimeError

  Unable to find installation candidates for tensorflow-io-gcs-filesystem (0.34.0)

  at C:\py39\lib\site-packages\poetry\installation\chooser.py:73 in choose_for
       69│
       70│             links.append(link)
       71│
       72│         if not links:
    →  73│             raise RuntimeError(f"Unable to find installation candidates for {package}")
       74│
       75│         # Get the best link
       76│         chosen = max(links, key=lambda link: self._sort_key(package, link))
       77│

Cannot install tensorflow-io-gcs-filesystem.
```

そのため、先にtensorflow-io-gcs-filesystemだけ、インストールして、そのあとにtensorflowをインストールした。

```jsx
> poetry add tensorflow-io-gcs-filesystem==0.31.0

Updating dependencies
Resolving dependencies... (0.5s)

Package operations: 1 install, 0 updates, 0 removals

  • Installing tensorflow-io-gcs-filesystem (0.31.0)

Writing lock file
> poetry add tensorflow
Using version ^2.15.0 for tensorflow

Updating dependencies
Resolving dependencies... (1.4s)

Package operations: 1 install, 5 updates, 0 removals

  • Updating google-auth-oauthlib (1.0.0 -> 1.1.0)
  • Downgrading protobuf (4.25.1 -> 4.23.4)
  • Updating keras (2.14.0 -> 2.15.0)
  • Updating tensorboard (2.14.1 -> 2.15.1)
  • Updating tensorflow-estimator (2.14.0 -> 2.15.0)
  • Installing tensorflow (2.15.0)

Writing lock file

```
Flutterとは


# 目次
- [目次](#目次)
- [Flutterとは](#flutterとは)
- [使われる言語](#使われる言語)
- [Flutterでできること](#flutterでできること)
  - [Flutterが使われているアプリ](#flutterが使われているアプリ)
- [Flutterのメリットとデメリット](#flutterのメリットとデメリット)
- [Flutterのデメリット](#flutterのデメリット)
- [感想](#感想)
- [参考](#参考)

文章苦手なのでほぼ箇条書きでFlutterについておさらい

# Flutterとは
> Flutter transforms the app development process. Build, test, and deploy beautiful mobile, web, desktop, and embedded apps from a single codebase.
> [公式 ドキュメント](https://flutter.dev/)

公式に書いてあったことをざっくり翻訳すると、一つのコードでアプリにもウェブにも使える！ということ

# 使われる言語
Googleによって開発されたDartという言語。JavaScriptを意識した設計になっているので、馴染みがある人には使いやすい。

# Flutterでできること
[サンプル(公式ドキュメント)](https://flutter.github.io/samples/#?type=sample)にいくつか例がある。
Todoアプリや地図アプリ、ECアプリなどがある。
地図に関してはGoogleが[プラグイン](https://pub.dev/packages/google_maps_flutter)を用意していて、[公式のチュートリアル形式でまとめられた教育コンテンツ](https://codelabs.developers.google.com/codelabs/google-maps-in-flutter?hl=ja#0)まで存在する。手厚い。
## Flutterが使われているアプリ
- ahamo 
- Green 
- じゃらん 

# Flutterのメリットとデメリット
- iOSとAndoroidで同じコードを利用できるため効率がいい
- Googleが推奨しているマテリアルデザインが採用されている
- 公式サイトにドキュメントが多い
# Flutterのデメリット
- カメラや通知機能など、OSに依存する部分はソースを分ける必要あり
- 新しいフレームワークなので情報もライブラリも多くはない

# 感想
以前から興味があったので[アドベントカレンダー](https://qiita.com/advent-calendar/2023/gi-ra-ffe)で勉強しながらものにしていきたい…！

# 参考
[公式](https://flutter.dev/)
[Flutter基礎入門 by Flutter大学](https://zenn.dev/kboy/books/ca6a9c93fd23f3)
[Flutter Guide JP](https://flutter.ctrnost.com/)
[flutter-study.dev](https://www.flutter-study.dev/)
画像生成のスピードを5-10倍速くするモデル:LCM

本月初、中国の清華大学がLCM（Latent Consistency Models）という新しい画像生成モデルを発表しました。
Huggingfaceで話題になり、わずか一週間で数十万回ダウンロードされてます。
特徴としは従来の画像生成モデル（Stable Diffusionなど）より処理速度が非常に速くて、リアルタイムで画像を生成することができます。


一般的な画像生成モデル（拡散モデル）は、トレーニングデータにノイズを加えた後、その処理を逆転する方法で画像を生成します。この逆転の作業は、多段階のsamplingプロセスで行われるため、計算量が多く、生成速度も遅いです（step数で言うと、たとえばStable Diffusionならデフォルトで50ステップです）。LCMは低ノイズの目標に対して効率的に検出する計算方法を追加されてますので、step数が非常に少なくてもうまく画像を生成できます。LCMを追加したモデル（LCM-LoRA）は、わずか4ステップで画像を生成することができます。



先週私も試してみました。同じプロンプト（寝てる犬）に対して、stable diffusionは13秒かかりましたが、LCMではたった1秒でできました。処理時間は確かに10倍くらい速くなりましたね。（しかも画像のクオリティもあまり落ちてないです。）


![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/be3c111d-5ff5-5567-3e9a-a5524a5a0f09.png)

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/ed7c2519-c260-54f4-61bb-2faa08eb64b7.png)

LCMについて

https://arxiv.org/abs/2309.08244

https://arxiv.org/abs/2311.05556
Azure OpenAI Service で DALL-E 3 を使った画像生成を手軽に試す（※ 現状は特定のリージョンでのみ利用可能）【機械学習】

> 後付けで、[機械学習 Advent Calendar 2023](https://qiita.com/advent-calendar/2023/machine-learning) の 13日目に登録してみました

この記事は、以下の公式ページに記載されている「DALL-E 3 パブリック プレビュー」を手軽に試してみよう、という記事です。

●Azure OpenAI Service の新機能 - Azure AI services | Microsoft Learn
https://learn.microsoft.com/ja-jp/azure/ai-services/openai/whats-new#dall-e-3-public-preview
![公式の記事](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/eb7bc465-7d3c-0abd-d9ec-a3779c85b218.png)

ざっくりな流れを書くと、現時点で「DALL-E 3」のモデルをデプロイできるリージョンでモデルを用意し、画像生成を Azure OpenAI Service上のプレイグラウンドで試します。

ちなみに、自分が試した時の様子は、こんな感じです。
https://twitter.com/youtoy/status/1726948888593272857
![プレイグラウンド上で試す](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/7038277f-af27-afd5-1723-27c14e803da9.png)

## Azure での DALL-E 3 を使った画像生成について
### モデルをデプロイ可能なリージョン
本記事の執筆時点では、DALL-E 3 のモデルをデプロイ可能なリージョンは限定されています。具体的には、冒頭にも掲載した公式記事内に書いてある「SwedenCentral」のみです。
![リージョンの制限について](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/273ad076-2888-80e0-9c4f-bc7898d2555b.png)

### モデルをデプロイする
まずは、モデルをデプロイします。

### リソースの作成とモデルのデプロイ
「SwedenCentral」を指定してリソースを作成します（※ リソースの作成手順は省略）。リソースを作成した後に、Azure OpenAI Studio で「デプロイ」 ＞ 「新しいデプロイの作成」と進めます。

「SwedenCentral」のリソースを選んでいれば、以下のように「dall-e-3」を選択することができます。これをデプロイすれば OK です。
![モデルのデプロイ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/960bbb91-90cc-4e5b-8127-26cf3ea80281.png)

### 画像生成を試す
デプロイしたモデルを選択し、デプロイが成功していることを確認してみてください。そして、メニューにある「プレイグラウンドで開く」を選択します。
![プレイグラウンドの画面へ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/8faa8e07-f51b-ff71-9c8b-dfe451e1c275.png)

プレイグラウンドを開いたら、「デプロイ」の部分が「DALL-E 3」のモデルになっているのを確認した上で、プロンプトを入力して画像を生成するだけです。
![プレイグラウンド](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/ae0af281-97de-1a1f-497e-1370e80352dc.png)

## おわりに
今回、Azure OpenAI Service で DALL-E 3 を使った画像生成を、プレイグラウンド上で手軽に試しました。今後は、API経由での画像生成なども試していければと思います。

### 【余談】 GPT-4 Turbo を　Azure で使う話
[11/17日付けの公式の記事](https://techcommunity.microsoft.com/t5/ai-azure-ai-services-blog/azure-openai-service-launches-gpt-4-turbo-and-gpt-3-5-turbo-1106/ba-p/3985962)で発表されていた、Azure版の GPT-4 Turbo も、今回の記事で書いた DALL-E 3 と同様に、記事執筆時点ではリージョンの制限があります。

その GPT-4 Turbo に関する話を以下の記事に書いていますので、もしよろしければご覧ください。
 
●Azure OpenAI Service で GPT-4 Turbo（gpt-4-1106-preview）のモデルをデプロイする（※ 現状は特定のリージョンのみ） #Azure - Qiita
　https://qiita.com/youtoy/items/659d4764799e30f65772
ニュートンの重力場方程式のローレンツ変換後の式の導出ではまった話

秋葉原ロボット部の読書会では、「一般相対性理論を一歩一歩　数式理解」を教科書に使って、相対性理論の勉強をしています。

その中で、ローレンツ変換の前後でニュートンの重力方程式$Δφ(x)=4πGρ(x)$が共変性であるか否かを判定しています。
しかし、ローレンツ変換後のニュートン重力方程式が表記されていなかったので、教科書の記述を参考に導出を試みました。
そうしたら導出に時間がかかったので、その作業記録を残しておきます。

第４章第３節「ローレンツ変換とダランベルシアン」では、$x$軸方向のローレンツ変換がダランベルシアンを同じ形に保つことを確認しています。

ローレンツ変換は以下の式に従います。
$ct' = γ(ct - βx)$
$x' = γ(-β(ct) + x)$
$y' = y$
$z' = z$
ここで、
$γ=\frac{1}{\sqrt{1-\frac{V^2}{c^2}} }$
$β=\frac{V}{c}$
とします。これらの変換式より、
$\frac{\partial}{\partial x}=\frac{\partial t'}{\partial x}\frac{\partial}{\partial t'}+\frac{\partial x'}{\partial x}\frac{\partial}{\partial x'}=-γ\frac{β}{c}\frac{\partial}{\partial t'}+γ\frac{\partial}{\partial x'}$
を導出します。
さらに、他の変換も用いて
$\frac{\partial^2}{\partial x^2}=(-γ\frac{β}{c}\frac{\partial}{\partial t'}+γ\frac{\partial}{\partial x'})^2$
等を使ってダランベシアンが$x$軸方向のローレンツ変換で共変であると確認します。

その後、重力方程式
$Δφ(x)=4πGρ(x)$
では、$Δ≠Δ'$
を先の導出から類推させます。

ここまではいいのですが、先の導出
$\frac{\partial^2}{\partial x^2}=(-γ\frac{β}{c}\frac{\partial}{\partial t'}+γ\frac{\partial}{\partial x'})^2$
を使って、ローレンツ変換後のラプラシアンを導出しようとすると、シンプルな表現になりません。
$\frac{\partial^2}{\partial t^2}$や$\frac{\partial}{\partial t}\frac{\partial}{\partial x}$の項が残ります。

以下の様に導出すると、ローレンツ変換後のラプラシアンがシンプルな表現になります。
$ct' = γ(ct - βx)$
$x' = γ(-β(ct) + x)$
$y' = y$
$z' = z$
から、
$\frac{\partial}{\partial x}=\frac{\partial x'}{\partial x}\frac{\partial}{\partial x'}+\frac{\partial y'}{\partial x}\frac{\partial}{\partial y'}+\frac{\partial z'}{\partial x}\frac{\partial}{\partial z'}=γ\frac{\partial}{\partial x'}+0\frac{\partial}{\partial y'}+0\frac{\partial}{\partial z'}=γ\frac{\partial}{\partial x'}$
$\frac{\partial}{\partial y}=\frac{\partial y'}{\partial y}\frac{\partial}{\partial y'}=\frac{\partial}{\partial y'}$
$\frac{\partial}{\partial z}=\frac{\partial z'}{\partial z}\frac{\partial}{\partial z'}=\frac{\partial}{\partial z'}$
と連鎖律を使って表されますから、
変換後のラプラシアンは、
$\frac{\partial^2}{\partial x^2}+\frac{\partial^2}{\partial y^2}+\frac{\partial^2}{\partial z^2}=γ^2\frac{\partial^2}{\partial x'^2}+\frac{\partial^2}{\partial y'^2}+\frac{\partial^2}{\partial z'^2}=\frac{1}{{1-\frac{V^2}{c^2}} }\frac{\partial^2}{\partial x'^2}+\frac{\partial^2}{\partial y'^2}+\frac{\partial^2}{\partial z'^2}$
となり、
$(x', y',  z')$座標系のラプラシアン$Δ'$
$Δ'=\frac{\partial^2}{\partial x'^2}+\frac{\partial^2}{\partial y'^2}+\frac{\partial^2}{\partial z'^2}$
とは同じ形になりません。

座標変換した後のラプラシアンを使ってニュートンの重力場方程式を表すと、
$(\frac{1}{{1-\frac{V^2}{c^2}} }\frac{\partial^2}{\partial x'^2}+\frac{\partial^2}{\partial y'^2}+\frac{\partial^2}{\partial z'^2})φ(x')=4πGρ(x')$
となります。
共変ではないことがわかります。

ラプラシアン$Δ$は勾配を計算したものの発散
$Δf(x)=$div grad$f(x)$
なので、座標変換後の重力場の勾配と変換前のものとを比べると、$x$軸方向の勾配のみが変換前の勾配より大きくなっていると想像できます。

ローレンツ変換後も共変となる重力場方程式の勉強会での導出は、1、2年後に達成できそうです。
CSSで横並びにする方法3選と付随プロパティ

# CSSで横並びにする方法3選と付随プロパティ

Webページのレイアウトを整える上で、要素を横並びに配置することは非常に重要です。CSSを使用すると、さまざまな方法で要素を横並びにすることが可能です。この記事では、CSSで横並びにする3つの主要な方法と、それぞれの方法に付随するプロパティについて解説します。

## ① floatを使用する方法

### leftとright

#### 使い方

```css
.element {
    float: left; /* またはright */
}
```

`float`プロパティは、要素を左または右に浮かせる（フロートさせる）ことで、横並びを実現します。`float: left;`を使用すると、要素は左側に、`float: right;`を使用すると右側に配置されます。

### clear

#### 使い方

```css
.clear-element {
    clear: both; /* left, right, bothのいずれかを指定 */
}
```

`clear`プロパティは、`float`された要素の影響を取り除きます。`clear: both;`を指定すると、その要素はフロートされた要素の下に配置されます。

## ② display: flexを使用する方法

### centerとspace-betweenとspace-around

#### 使い方

```css
.flex-container {
    display: flex;
    justify-content: center; /* またはspace-between, space-around */
}
```

`display: flex;`は、フレキシブルボックスレイアウトを作成します。`justify-content`プロパティを使用すると、横並びの要素間のスペースを調整できます。`center`は要素を中央に、`space-between`は要素間に等間隔のスペースを、`space-around`は要素の周囲に等間隔のスペースを配置します。

### wrap

#### 使い方

```css
.flex-container {
    display: flex;
    flex-wrap: wrap;
}
```

`flex-wrap: wrap;`を使用すると、要素がコンテナの幅を超えた場合に次の行に折り返します。

## ③ display: inline-blockを使用する方法

### blockとinline-blockとinlineの違い

#### 使い方

```css
.block-element {
    display: block;
}

.inline-block-element {
    display: inline-block;
}

.inline-element {
    display: inline;
}
```

`display: block;`は要素をブロックレベルで表示し、`display: inline;`はインラインレベルで表示します。`display: inline-block;`はこの二つの中間で、ブロック要素のように幅と高さを設定できつつ、インライン要素のように横並びになります。

## まとめ

CSSで要素を横並びにする方法は多岐にわたりますが、主に`float`、`display: flex`、`display: inline-block`の3つの方法が一般的です。これらの方法を理解し、適切に使い分けることで、望むレイアウトを実現することができます。`float`は単純なレイアウトに適しており、`display: flex`はより複雑なレイアウトやレスポンシブデザインに向いています。`display: inline-block`は中間的な特性を持ち、簡単に横並びを実現できます。これらの知識を活用して、魅力的なWebページをデザインしましょう。
AccessのVBEでソースコードの大文字小文字が勝手に変わる件

# 大文字小文字が勝手に変わる例

例えば下記のようなコード。
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3637353836302f39613839613534372d653763312d633666382d306564622d3637363764656462386439312e706e.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/6c87ff2b-149a-d1dd-8abd-33fc922b97db.png)

ここに『sql』という名前の変数を追加すると…
```CurrentDb.QueryDefs("d").SQL```
が
```CurrentDb.QueryDefs("d").sql```
に勝手に変わってしまいます…。
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3637353836302f31396364373535332d643130622d396635632d613934342d3338383433636564353438382e706e.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/c7db055a-4c19-5e53-11a4-2f97175fc26b.png)

大文字の ```SQL``` に入力し直しても…
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3637353836302f33613833303939632d323639302d376365302d616335322d6262323961623438333331622e706e.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/fe7fc15a-dc65-0ae1-cc2c-26d1474a5a87.png)

変数と同じ ```sql``` になってしまいます。
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3637353836302f31396364373535332d643130622d396635632d613934342d3338383433636564353438382e706e.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/c7db055a-4c19-5e53-11a4-2f97175fc26b.png)

VBAは大文字小文字を区別しないので、動作に支障は無いです。
ですがソースコードの差分チェックをすると、変更箇所としてリストアップされてしまいます…。
場合によっては、あっちゃこっちゃで差分が上がって、「問題無い差分？」「間違っていじってしまった？」の確認が大変になってしまいます。

# 防ぎようがない

『大文字小文字が勝手に変わらない方法』を調べたのですが、見つからなかったです…。
諦めました…。

# 対処法

大文字小文字が勝手に変わってしまった変数名や関数名を一括で戻す方法です。

まず、どこにも使われないダミー変数を用意します。

そして…

* 『SQLに変わってしまった名前を全部sqlに戻したい』という時はこのダミー変数の名前を『sql』に。
* 『sqlに変わってしまった名前を全部SQLに戻したい』という時はこのダミー変数の名前を『SQL』に。

![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3637353836302f36326265366233302d323538382d333932382d653234362d6335323663303831356138352e706e.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/c4ec0849-10a3-b0af-619d-7df3ad9a8050.png)

変数名や関数名が戻ったらダミー変数のコードは削除。

といった感じです…。


# 参考サイトさん

https://emotion92.blog.fc2.com/blog-entry-682.html

https://vbabeginner.net/classname-objectname-corrupted/

# バージョン

Microsoft Windows [Version 10.0.19045.3693]
Microsoft® Access® for Microsoft 365 MSO (バージョン 2310 ビルド 16.0.16924.20054) 32 ビット
【CSS】SVGを擬似要素で使う

```test.css
div::before {
    content: "";
	background-image: url("xxx.svg");
    background-size: 50px;
    filter: invert(45%) sepia(85%) saturate(2448%) hue-rotate(163deg) brightness(97%) contrast(103%);
}
```
* background-image: url() でSVGファイルを指定
* background-size: で大きさを指定
* filter: で色を指定
https://codepen.io/sosuke/pen/Pjoqqp でカラーコードをfilterで使う値に変換できる
Application Migration Service（MGN）でレガシーOSをAWS移行

# はじめに
 久しぶりの記事投稿となりました。
 今回はApplication Migration Service（MGN）について調べたことをまとめます。
 Windows Server 2008をAWSへ移行しようと思い、さまざまなことを調べた備忘録です。

 ## MGNの概要
* MGNはAWSへのリホストに特化したサーバ移行サービスです。
* リホストに活用できるサービスとして、VM Import/ExportやServer Migration Service などがありますが、AWSからはMGNの利用が推奨されています。

## MGNの特徴
■ 柔軟性
* MGNは、物理サーバや仮想サーバ、クラウドサーバに対応
* Linux及びWindowsをサポート

■ 信頼性
* 無停止の継続レプリケーション
* AWSへのレプリケーションは暗号化して転送
* VPNやDirect Connectなどのプライベート接続に対応可能

■ 高度な自動化
* マネジメントコンソールで簡単な操作が可能
* 移行の計画に合わせたApplication または Wave という単位でまとめて操作可能

## Agentのインストール
MGNは、Agent版、Agentless版がそれぞれあります。
移行元環境によって使い分けが必要で、それぞれの違いは以下の通りとなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3115411/b3651c4f-79d7-1741-4790-bb93cdaad64f.png)

今回はWindows Server 2008をAWSへ移行しようと思うのですが、Replication Agerntにはインストール要件があります。

■ Replication Agentのインストール要件（Windows）
* Program Files（x86）ディレクトリを含むディスク上に少なくとも2GBの空きがある
* RAMに少なくとも300MBの空きがある
※Microsoft Windows Server 2008 以前の場合、固有のバージョンのインストーラを使用する必要あり(AwsReplicationWindowsLegacyInstaller.exe)

## MGNによる移行手順
MGNによる移行は以下の手順で実行されます。
1. 移行準備
ソースマシン（移行元サーバ）へReplication Agentをインストール
2. 移行実施
レプリケーションサーバが自動で作成され、ソースマシンからAWSへのレプリケーション
3. 移行テストの実行
テストインスタンスを作成し、サーバの起動確認
4. カットオーバー実行
AWS上にサーバを起動し、移行完了


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3115411/25e7683e-cbf8-c196-0866-9bde6c7eb070.png)


### レプリケーションの対応範囲
MGNではレプリケーション対象のディスクについて、物理的な種類に制約はないため、Cドライブ・Dドライブともにレプリケーション可能です。

■ レプリケーションの対応範囲
* ディスクの物理的な種類には特段の制限はなく、仮想OS上でフォルダやファイルとして認識できれば問題ない。
* Cドライブ、Dドライブともに移行可能
* 初期設定では、すべてのディスクが複製される設定だが、ディスクの選択も可能

## MGNの料金
MGNは多くの場合、無料で利用可能です。
■ 基本料金
* アクティブなソースサーバのレプリケーション中に課金が発生する。
ソースサーバにAWS Replication Agentがインストールされた時点で課金が開始される。
* 無料期間：サーバ1台ごとに2160時間（連続して利用した場合は90日間）は無料で利用可能

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3115411/5d5af2be-38d1-63f4-952f-4f4e38f8e430.png)

■ その他料金
* MGNによって作成されるレプリケーションサーバやEBSなどのAWSサービスには別途料金が発生する。
* OSライセンス
Windowsの場合はAWSが提供するライセンス（License-include）とBYOL（Bring-Your-Own-License）を利用可能

今回の場合、Windows Server 2008はAWSでサポートされていないため、ライセンスはBYOLすることになります。

※BYOL自体は無料ですが、AWSの仕様上、BYOLをする場合、Dedicated Host（専有ホスト）形式で、物理サーバを専有してEC2インスタンスを利用する必要があります。
↑
コストにはねるところなのでご注意ください。



# 終わりに
以下を参考に作成しました。
次は実践編でお会いしましょう。

【参考】

https://pages.awscloud.com/rs/112-TZM-766/images/AWS-Black-Belt_2023_AWS_MGN_0430_v1.pdf 

https://pages.awscloud.com/rs/112-TZM-766/images/AWS-05_RehostMigration_KMD34.pdf
【随時更新予定】3大ML系OSSにコントリビューションする時の備忘録メモ

# 概要
社内転職で10月から部署異動しました。今まで業務でOSSにコミットを出す機会は全く無かったのですが、異動先ではML系のOSSに関わることになり、早速Kerasでバグにぶち当たりました。今後ML系のOSSにコミットする機会が増えるだろうと思われます。ところが、TensorFlowやPyTorchなど大手ベンダーが開発してるOSSではCLA(Contributor License Agreement)を提出する必要が有ります。よってTensorFlow(+ Keras)、PyTorch、scikit-learnからなる3大ML系OSSへのコントリビューション時に必要となるCLAやContributionガイドについて本記事ではまとめようと思います。

# TensorFlow(+ Keras)
TensorFlowとKerasは本来は別々のOSSとして存在していました。しかし、TensorFlow 1.4.0(2017年公開)からtf.kerasとしてKerasの機能を取り込みました。この時、TensorFlow=tf.keras=Kerasという図式が完成したと言えます。ところがここに来て、スタンドアローンKerasがKeras 3として復活しました。よって違いが分かりにくい状況になっています。そういう事情が有ってか、TensorFlow、Keras共にコントリビューションにはGoogle CLAへの同意が必要です。

## Contribution Guide
https://github.com/tensorflow/tensorflow/blob/master/CONTRIBUTING.md

## Google CLA
https://opensource.google/documentation/reference/cla

## KerasのContribution Guide
以下は画像処理系の機能が実装されたKeras CVのContribution Guideのリンクです。(Keras Team配下のリポジトリは基本的に同様の規定です)

https://github.com/keras-team/keras-cv/blob/master/.github/CONTRIBUTING.md

Keras本体(Keras 3)についてはContribution Guideが格納されていませんが、どうやら他のリポジトリと共通の様です。

https://github.com/keras-team/keras/issues/18788

### 2023/12/26追記: KerasのContoribution Guideが追加

Contribution Guideが追加されました。

https://github.com/keras-team/keras/blob/master/CONTRIBUTING.md

# PyTorch
PyTorchはそもそもMeta(旧Facebook)によって開発されました。しかし、現在はLinux Foundationに移管されているため、Linux FoundationのCLAへの同意が必要です。筆者はPyTorchにPRを出したことがないため、今後CLAの内容を熟読した上で、問題がなければ同意したいと思っています。

## Contribution Guide
https://github.com/pytorch/pytorch/blob/main/CONTRIBUTING.md

## Linux Foundation CLA
https://github.com/pytorch/pytorch/issues/85559

# scikit-learn
TensorFlow、PyTorchが大手ベンダーによって開発されたOSSであるためか、Contributionを行う前の諸々の儀式を消化することを求められますが、scikit-learnには2023/11現在CLAなどは存在しません。また丁寧なContribution Guideも公開されており、初めてContributionしようと考えている人向けの**good first issue**ラベルの付いたテスターの募集などがIssue上に出ていたりします。

## Contribution Guide
https://scikit-learn.org/dev/developers/contributing.html
[Intune]グループポリシー設定をクラウドに移行する

こんにちは:grinning:

オンプレミスのActiveDirectoryで今まで管理してきたグループポリシー
クラウド化が進んできてIntuneへの移行も考えている企業も増えてきていると思います。

Intune管理センターにはGPOを移行できるかを分析できるツールがあるのを知ってますか？
分析した後はなんとIntune上でポリシー作成もしてくれます。

分析からポリシー移行までの流れをご紹介します！

## はじめに

準備するもの:point_up:

:one:グループポリシーが記載されている xml ファイル
オンプレミスAD上に存在するグループポリシーをxml形式で保存します。

:two:セキュリティグループ
作成したポリシーをすぐ割り当てして使用する場合はセキュリティグループを作成します。

## Intune管理センターを使用してGPOの分析

１．[Intune管理センター](https://intune.microsoft.com/)にアクセスします。

![1Intune管理センタ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584466/f59aea49-2b6c-b0b5-308b-2305670ad2fc.png)

２．[デバイス>グループポリシー分析>インポート]と画面を進めます。
![2インポート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584466/9928cb9a-0609-bac7-67a4-1b0657f5cc8b.png)

３．フォルダのアイコンをクリックして、XMLファイルを選択し、[次へ]をクリックします。
![3xml指定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584466/387ab4f3-e04a-8ca0-8364-b517374cea1b.png)

４．スコープタグ画面では[次へ]をクリックします。
![4スコープタグ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584466/2517b6e6-4704-a7b0-e70c-70c0f92de363.png)

５．確認および作成画面では内容を確認して[作成]をクリックします。
![5確認画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584466/c989b01a-a030-47d2-8a68-c53ed547de50.png)

６．インポートが完了すると一覧にGPOが表示されます。[MDMサポート]の100%と表示されている箇所をクリックします。
![6インポート後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584466/89c0f1f7-8fb0-73bb-9c27-82f8b4f333bc.png)

７．インポートされたGPOの設定が表示され、MDMでサポートされているかが表示されます。この内容をIntuneに移管する場合は[Migrate]をクリックします。
![7内容確認.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584466/3b1290d8-2847-07e5-c57f-daaebd5407c1.png)

８．移行する設定画面で先ほどの設定項目が一覧表示されているので、[このページのすべてを選択する]をクリックして、[次へ]をクリックします。
![8作成画面①.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584466/20f96582-20eb-a98d-e0b0-f71d7afadd35.png)



９．構成画面で内容を確認し[次へ]をクリックします。
![9作成画面②.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584466/3cee39d8-02bf-fd16-f5b6-299edc4de454.png)



１０．プロファイル情報画面で[名前]にIntuneのポリシー名を入力し、[次へ]をクリックします。
![10作成画面③.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584466/1fd817a1-4c79-979f-1cd5-a1b854bd4114.png)


１１．スコープタグ画面では[次へ]をクリックします。
![11作成画面④.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584466/72670d57-ebc5-5566-97e5-db263f12419a.png)


１２．割り当て画面では[組み込まれたグループ]にこのポリシーを割り当てたいセキュリティグループを指定し、[次へ]をクリックします。
![12作成画面５.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584466/2817cc1b-adad-6f61-40c4-a3801453afc7.png)

１３．レビューおよびデプロイ画面では内容を確認して、[展開]をクリックします。
![13作成画面⑥.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584466/1b3f9245-5f3b-fc4a-bf6d-926c1272a367.png)

１４．作成完了後は[デバイス>Windows>構成プロファイル]の画面へと進めると作成したポリシーが表示されます。
![14作成完了.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584466/6093e72e-b8b6-e3dd-1830-bb7c5707a97d.png)

以上で、グループポリシーのクラウド移行は完了です！

## 最後に
分析ツールがあることで移行がスムーズに行えるようになったと感じます。
一つ一つ設定をいれていくよりも確実で簡単なので、ぜひ試してください！
Startup CTO of the year 2023 〜“知と熱”を解き放つ〜 に行ってきました！

皆さん、こんにちは。
KDDI CCoE（*1）の柴田です。

2023/11/22、我らが みのるん @minorun365 が、
**Startup CTO of the year 2023 〜“知と熱”を解き放つ〜**の
トークセッション「**エンジニア文化から学ぶ、企業・個人の可能性を広げる「アウトプット戦略」**」に
登壇されるということで、行ってきました！

https://np2023.startup-coy.com/

このトークセッションで学んだことをレポートとしてアウトプットします！（*2）

※1：CCoE = Cloud Center of Excellence の略称。
自社内のクラウド利用推進をさまざまな形で支援・牽引する専任組織を指す。

※2：トークセッションでしたのでテキストOnlyとなります。ご了承ください。

## 登壇者
+ モデレーター
・澤 円さん
　圓窓 代表取締役

* パネリスト
・御田 稔さん（みのるん @minorun365 ）
　KDDIアジャイル開発センター テックエバンジェリスト
・柴田 健介さん
　Qiita 代表取締役社長
・池澤 あやかさん（いけあやさん）
　タレント、ソフトウェアエンジニア

# トークセッション

+ **アウトプットはOSS精神**

* 先人たちの活躍を受け継ぐ気持ちでアウトプットする

+ アウトプットはエンジニアのキャリアにつながる
登壇依頼が来る、スカウトが来る、など

* いいね！ボタンなど、フィードバックが書いた人のモチベーションにつながる
 エンジニアの承認欲求を満たすことにも寄与する

### アウトプットとインプット、どっちが大事？
+ 澤さんはアウトプット優先と考えている
　・いけあやさんも同様
　　　フリーランスでやっていたので、アウトプットが宣伝材料になる
　　　情報をまとめておくことにも意味がある
　　　　開発の途中経過を書いておくと、最終的にまとめて記事化する際も楽になる

* エンジニアの人は、つまづいた際にその内容をメモっておくと便利（柴田さん）
・それが貯まってきて、パブリックに公開したらよいかも？と思ったら記事にする
　　自分で書いた記事を自分自身で見直す機会もある（笑）

+ 会社に勤務している人でも、アウトプットファーストが大事（みのるん）
・**時間があるときにと思ってもどうせ勉強しない**から、期限だけ決めて自分で追い込んでいく

* **XXしてから思考**は、**いい未来が先に行ってしまう**からもったいない（澤さん）
・お金が貯まってから結婚、痩せてからジムへ行く、など

+ 実力がなくてもアウトプットしてOK（柴田さん）
・アウトプットしていかないと成長しない（みのるん）
・初学者の人にも役立つ内容だってある（柴田さん）
　
・**マウント取ってる人の方がカッコ悪い！！**（澤さん）
　マサカリを飛ばしてくる人はいるのでプレッシャーは多少あるが、
　もう少し気軽にアウトプットして行ってもいい（柴田さん）
・マサカリよりも有益なアドバイスをもらうことの方が多い（いけあやさん）
　マサカリは意外と少ない（澤さん）
　
・いけあやさんはマサカリきっかけで世に出た（笑）
　
・みのるんにもマサカリが飛んでくることも
　正しいことを言っているコメントにはお礼を言って取り込む

### アウトプットに関わるいいムーブメントって何かありました？
+ Organization単位でアウトプット奨励文化ができてきている（柴田さん）
+ **マサカリ投げる人が減って、優しい人が増えてきている**（柴田さん）

### アウトプットの方向性の変化
+ 外向けではなく、内向きに発信することにシフトしつつある（いけあやさん）
・中で起こったことを抽象化して、外に発信していくのもいいこと（澤さん）

### 組織人としての顔と、個人としての顔分けてる？
+ 会社のOrganizationsを使うものの、所属だけで、個人として使えるようにしている（みのるん）

* 踏み間違えないように企業名を隠している（いけあやさん）

### アウトプットを会社はどう捉えているか？
+ KDDIアジャイル開発センター（KAG）では応援してくれている（みのるん）
・最低限の良識があることを前提に、個人であればマーケ通さずに自由に発信できるようにしている
・会社として発信する場合は、オウンドメディアを活用する
　  
・仕組み作りが大変では？（いけあやさん）
　KAGの前身部署がKDDIにあった頃から、アウトプットを大事にしてくれているメンバーがいた（みのるん）
　　QiitaのOrganizationsがあった
　　**ボトムアップの方が成功しやすい**と思う
　　**マネジメント層の理解は大事**

### 炎上怖い・・・
+ 燃料がないとそもそも燃えないから、燃えたらある意味で胸を張っていい（澤さん）

* 燃えないコツがある（澤さん）
・**大きな主語、曖昧なロジック、雑に投げると燃える**
　　例）女性は考え方が抽象的だから、経営層にしない方がいい
・逆に、それを避ければそうそう燃えない

### 情報発信したきっかけは？
+ 仲間がいる、楽しい（みのるん）
* コミュニティへ貢献したい、リアクションもらえて楽しい（柴田さん）
　　　　
### 無風って悲しいけど、どうしたらいい？
+ いきなり大作を描かずに、小分けにして、ハードルを下げていく（みのるん）
・ホームラン狙いの大振りは、空振ったときにショック大きい（澤さん）

### アウトプットしたことによる利益は？
+ KAGの知名度が爆上がりした、社員数が増えた（みのるん）
+ **利益に即つながるわけではないので、理解を！**（澤さん）

-----

アウトプットを大切にする4人から、たくさんの前向きなインサイトを得られる素晴らしいセッションでした！！

私は怠惰な人間なので、アウトプットすることをすぐにサボってしまいがちですが、
**気軽にやる、楽しみながらやる、成長すると思ってやる**といったメッセージを胸に、
少しずつでも頑張っていこうと思います。

このレポートもその一環ですので、フィードバックいただけたら泣いて喜びます！！
皆さんも楽しんでアウトプットしていきましょう！！！
Android11以上で別パッケージにbindServiceしても接続できない場合の改善策

### 概要

Android11から(api30+)自身のアプリ以外のパッケージとプロセス間通信するとき、AndroidManifestの追記をしないと通信できない。

### 解決した問題の症状

##### 前提
- Android11以上の端末またはエミュレータ
- プロセス間通信を行う2つのアプリ共に自作（Kotlin）

##### 症状

呼び出し元から別アプリのサービスを指定してbindServiceしても返り値がずっとfalseになる（繋がらない）。
時系列順で症状に至るまでの経緯を列挙する。

- targetSdkのバージョンがすべて28のまま二つのアプリを作成
- 接続先のアプリにバインドされるServiceを記載し、ビルドしてインストール
- 接続元から対象ServiceをbindSereviceするコードを書いて、こちらもビルドしてインストール
~~~ kotlin: 
val intent = Intent("testPackage.server.targetService").setPackage("testPackage.server")
val res = context.bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE)
~~~
- bindServiceからtrueがくる

ここまでは期待動作だが
- 呼び出し元のtargetSdkバージョンを30以上に指定する
- 改めてbindServiceする部分のコードを変えずに実行
- bindServiceの返り値がずっとfalseで接続できず（ある特定パターンではつながるが非実用的）
- ※ なお、bindServiceからはエラーメッセージが来ない

（実装の詳細説明）[バインドされたサービスの概要 | Android デベロッパー](https://developer.android.com/guide/components/bound-services?hl=ja#Binding)

### 原因
[Android でのパッケージの公開設定のフィルタリング](https://developer.android.com/training/package-visibility?hl=ja)
プライバシー強化のため、Android11からアプリが他に入っているアプリを全部覗けなくなくなったから。

### 改善策
bindServiceを叩く方のアプリにあるAndroidManifest.xmlに、"queries" タグを設け、対象となるアプリケーションのパッケージ名をタグ内に記載する。
~~~ xml: AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="testPackage.client">
    <queries>
        <package android:name="testPackage.server"/>
    </queries>
	...
</manifest>
~~~
ビルドし実行すると、bindServiceからtrueが来るようになり、接続が成功する。
ServiceConnectionのonServiceConnected関数も呼び出される。

### 参考元Webページ
https://asvid.github.io/2021-09-03-android-service-binding-on-api30

> Rant over Android (訳：Androidへの憤り)

同じく。

(プライバシー強化はメリットのあるものだと思うが...)
sheetの中でキーボードにフォーカスさせたい時の注意点

# やりたかったこと
ボタンを押すと下から入力フォーム的なのを出す
出すと同時にテキストフィールドにフォーカスし、キーボードを出す

# 遭遇した現象
`FocusState`を`onAppear`内で`true`にしたのにフォーカスされない

# 原因
ミニマムなViewを作っていろいろ検証した結果、いくつかわかったので共有

### フォーカスされないコード

```swift
struct ContentView: View {
    @FocusState private var isFocused: Bool
    @State private var showSheet = false
    @State private var text = ""
    
    var body: some View {
        Button {
            showSheet = true
        } label: {
            Text("Show sheet")
        }
        .sheet(isPresented: $showSheet) {
            TextField("type something", text: $text)
                .focused($isFocused)
                .onAppear {
                    isFocused = true
                }
        }
    }
}
```

### フォーカスされるコード
- `sheet`の外側に何かしらViewが必要
- `FocusState`に`true`を代入する処理を0.6秒以上遅延させる必要がある（たぶん`sheet`が出てくるアニメーションが終わってからじゃないといけない）
- Previewでは機能しない。シミュレーターで動作確認する必要がある

```swift
struct ContentView: View {
    @FocusState private var isFocused: Bool
    @State private var showSheet = false
    @State private var text = ""
    
    var body: some View {
        VStack { // sheetの外側に何かしらViewが必要
            Button {
                showSheet = true
            } label: {
                Text("Show sheet")
            }
            .sheet(isPresented: $showSheet) {
                TextField("type something", text: $text)
                    .focused($isFocused)
                    .onAppear {
                        // trueの代入を0.6秒以上遅延させる必要がある
                        DispatchQueue.main.asyncAfter(deadline: .now() + 0.6) {
                            isFocused = true
                        }
                    }
            }
        }
    }
}
```
【Unity初歩】~オブジェクトの配置~

# はじめに
前回Unityのインストールまで終了したので、エディタを使ってオブジェクトを置いてみます。
今回は主に2Dで作成しています。
今後も基本的には2Dで作成する予定です。

前回の記事

https://qiita.com/usomaru/items/7e5e2aad995bc51ac0af

# エディタの操作

色で囲ったものごとに名前と役割があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201826/d8002dab-efe6-cb19-b427-108cafa0ddf5.png)

- シーンビュー(緑枠)
    - ゲームを作るためのメイン画面。
- ゲームビュー(緑枠。タブで「Game」を選ぶと現れる)
    - ゲームを実行したときの見え方や、処理スピード・負荷のかかり方を解析するところ。
- ヒエラルキーウィンドウ(オレンジ枠)
    - シーンビューで配置したオブジェクトの名前が表示される。オブジェクト同士の階層構造の表示・編集ができる。
- プロジェクトウィンドウ(青枠)
    - ゲームで使う素材を管理するところ。
- コンソールウィンドウ(青枠。タブで「Console」を選ぶと現れる)
    - 一般的な開発と同様。エラーが表示されたり、コンソールログが出せたりするところ。
- インスペクターウィンドウ(黄色枠)
    - 画像では何も表示されておらず申し訳ないですが、配置したオブジェクトの座標とか色とかもろもろの設定ができるところ。この後にある画像では表示されています。
- 操作ツール(赤枠)
    - シーンビューに配置したオブジェクトの位置を変えたりサイズを変えたり回転させたり調整ができるところ。
- 実行ツール(紫枠)
    - ゲームを実際に実行したり、止めたりする際に使用。デバックのようなイメージを勝手にしている。

# オブジェクトを置いてみる

手始めにただの丸いオブジェクトを置いてみます。
左側のプラスボタンをクリックして、「2D Object」を選択することでオブジェクトを追加できるようです。
![キャプチャ2-1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201826/9a05b30b-242b-3d14-b537-d07e0b3cdecc.png)

Circleを選択すると、画面に丸いオブジェクトが現れました。
前述エディタの操作で見た通り、追加されたオブジェクトの名前はヒエラルキーウィンドウ(左側)に表示されます。
![キャプチャ2-2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201826/97678fa0-3bdd-4240-e36b-c372b169abfb.png)

# 自作したイラストをオブジェクトとしておいてみる

以前javascriptを使ってスーパーマ〇オのようなゲームを作成したことがあり、その時に自作したイラストを使ってみることにしました。

ドラックアンドドロップでAssetsフォルダへイラストを移動。
するとAssetsフォルダに追加されます。
![キャプチャ2-3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201826/4367083f-43d9-0172-3daf-fcc70f883f33.png)

Assetsフォルダに追加されたイラストをさらにドラックアンドドロップでSceneに持っていくと、自作イラストを配置することができました。
![キャプチャ2-4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201826/63678d0c-37ff-ef71-afd6-fcd244f23e0c.png)

# 背景画像をおいてみる

基本操作はイラストを配置したときと同じです。
Assetsフォルダへ背景画像を移動し、さらにドラックアンドドロップでSceneに持っていきます。
![キャプチャ2-5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201826/32b70adf-f2fb-e75d-603f-f04d1a24f48b.png)

インスペクターウィンドウ(右)のScaleパラメータをx＝4.5、y＝2、z＝1に合わせると、白い枠いっぱいに背景を表示させることができます。
ですが、このままだと先ほど追加した自作🦀イラストが消えてしまいます。
Unityの2Dゲームではオブジェクトはレイヤ番号を持っているためです。
![キャプチャ2-6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201826/ad2a9ffd-4758-e780-5b20-53d1a3f17e93.png)

レイヤ番号が大きいほど画面の手前に表示されます。そのため、🦀のレイヤ番号をあげます。
(初期値は0です。)
Order in Layerを1にすることで、🦀が表示されました。
![キャプチャ2-7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201826/4c3ce086-15f3-5ac7-93bf-1295c6803f15.png)

※背景画像は絶対に最背面にあるべきなので、背景のOrder in Layerを-1にするという手もあります。

# おわりに
オブジェクトの配置までできました。
次回はソースコードをかいて、今回追加したオブジェクトを動かしてみたいと思います。
OpsRamp Logsのログ取り込み方法について

本記事では、OpsRamp Logsのログ取り込み設定方法について説明します。

# 概要
OpsRamp Logsでは、OpsRamp社が提供しているアプリケーションログの定義があり、その定義に従いOpsRamp Agentの設定ファイルまたサードパーティシステムに設定することでログを取り込むことができます。
定義されているアプリケーションがOpsRamp Agentで検出された場合、検出されたアプリケーションのログ定義を自動でOpsRamp Agentの設定ファイルに反映され、取り込むことができます。
また、アプリケーションの検出およびログの定義を独自に設定することも可能です。

# 設定方法
ログ取り込みの設定は、Infrastructure > Logs 画面左上のハンバーガーマークのLog Configurationからアクセスします。
![log-configuration.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/993588d2-b51c-0658-59ba-6ec17569b10f.png)

INGESTIONのページでは、OpsRamp社が提供しているアプリケーションのログ定義を参照することができます。
![log-ingestions.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/65732ffa-e7df-3306-d48c-42ebb6e2a9b5.png)

各アプリケーションを開くとOpsRamp Agentまたはサードパーティシステムでの設定方法を参照することができます。
![log-ingestions-cassandra.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/3b35292a-c1de-c69e-f63d-f7f31d98bd16.png)

::: note warn
- 自動検出されたアプリケーションが、提供されているものであれば自動でログ設定が適用されます。
- OpsRamp Agentの場合、\<OpsRamp Agentインストールディレクトリ\>\/config\/log\.d\/log-config\.yamlに定義する必要があります。
:::

## 設定サンプル (随時更新予定)
- [aws](https://qiita.com/vistanet-kh/items/4c9a476990c1c862b28c)
- [rsyslog / syslog-ng](https://qiita.com/vistanet-kh/items/c820621684fe2de52774)

# Appendix (随時更新予定)
- [ログ定義のカスタマイズ](https://qiita.com/vistanet-kh/items/a6ba912394404127009a)
- [アプリケーション検出定義のカスタマイズ](https://qiita.com/vistanet-kh/items/408c44e428bc667ac819)

---------------------------------------
[<img width = 250 height = 200 src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/111de30a-4d33-aa33-5c7d-83d9015093e6.png">](https://www.vistanet.jp/knowledge-base/)
OpsRamp Logs - rsyslog / syslog-ngのサンプル設定

本記事では、OpsRamp Logsのrsyslog / syslog-ngのサンプル設定について説明します。

# 概要
OpsRamp Logsでは、ネットワーク機器またはサーバからrsyslog / syslog-ngを使用し、OpsRamp Agentに転送されたsyslogを取り込むことができます。

# 設定方法
Infrastructure > Logs 画面左上のハンバーガーマークのLog Configuration > RSyslog または、Syslog-Ngをご参照ください。
OpsRamp Agentの\<OpsRamp Agentインストールディレクトリ\>/conf/log.d/log-config.yaml.sampleを\<OpsRamp Agentインストールディレクトリ\>/conf/log.d/log-config.yamlにコピー・編集し、OpsRamp Agentを再起動します。
``` vim:/opt/opsramp/agent/conf/log.d/log-config.yaml
global:
    ignore_older: 2h
    compression: gzip
    tls_config:
        insecure: false
        insecure_skip_verify: true
    timeout: 5s
    retry_settings:
        initial_interval: 5s
        randomization_factor: 0.5
        multiplier: 1.5
        max_interval: 30s
        max_elapsed_time: 5m0s
    queue_settings:
        num_consumers: 10
        queue_size: 1000
inputs:
    syslog_server:
        type: syslog
        source: syslog_server
        address: "0.0.0.0:514"
        mode: tcp
        protocol: rfc3164
```

ネットワーク機器またはサーバでOpsRamp Agentのサーバに対してsyslog転送を設定します。


---------------------------------------
[<img width = 250 height = 200 src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/111de30a-4d33-aa33-5c7d-83d9015093e6.png">](https://www.vistanet.jp/knowledge-base/)
Mac Montrey 以降を利用されてる方の対策　localhost:5000は注意が必要

## はじめに
「localhost:5000」がリクエストエラー対策の備忘録です💁
初心者です😅
間違えてる部分多々あると思います。
もし見つけた場合、ツッコミいただけると助かります🙇

## 結論
:::note info
🦁結論🦁
* macOS Monterey以降の場合Mac のポート 5000 で Air Play のサーバーが起動している。
* テストでポート 5000を利用する場合は別のポート（8000）を利用する。
:::


## 内容
「localhost:5000」を利用しようとしたら下記のエラーが出た。

```
Access to fetch at 'http://localhost:5000/${PATH}' from origin 'http://localhost:3000' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.
```

調べてみたらmacOS Monterey以降（Ventura、Sonoma）
を利用してるとだとlocalhost:5000は「Airplay」 のサーバーが起動しているとのこと。
なのでFlask など開発サーバーでポート 5000 を使おうとすると競合するので、Air Play を無効化するかポート 5000 以外を使うと良い。

ポート8000（http://localhost:8000/send-email）

```EmailSend.py
from flask import Flask, request, jsonify
from flask_cors import CORS

app = Flask(__name__)  # Flaskを使うための宣言（初期化）
CORS(app)

# ~~~~~~~~~~~~~~~~~~~~

if __name__ == '__main__':
    app.run(debug=True, port=8000)

```

:::note warn
注意点⚠️
* サーバーにデプロイした際のHTTPリクエストするURLに置き換える。
* テストする際にはReactを稼働させるターミナルとサーバーを起動してるターミナルを分けて稼働してる状態が必要。
* CORS(app)は異なるオリジン（ドメイン、プロトコル、ポート）からのリクエストを許可する。（セキュリティは弱い）
:::


## 参考にしたサイト📗
[Mac Monterey 以降で Flask など ポート 5000 を使う場合は注意](https://zenn.dev/kangetsu_121/articles/93479cd2999898)
Terraformのコードをテストしたい

# Terraformのコードの品質担保するためにできること
awsでTerraformを書いているときに、品質を担保するにはどうしたら良いのか検討してみた。

## Terraformのコードをフォーマットする。
`terraform fmt`

Terraformのfmtコマンドで、コードをフォーマットすることにより、Terraformのコードが綺麗になる。
インデントとか、適当に書いてしまった場合でも、しっかりと整形してくれるので私のようなエンジニアには助かる。


## terraform validateコマンドを実行する。
`terraform validate`

このコマンドでは構文が正しいことを確認してくれる。参照関係で不十分な箇所を解析してくれる。

## tflint
tflintは、静的解析ツールである。パラメータの値とかを実際のパラメータの取りうる値で書いているのか、などの解析をして、問題があればエラーを返してくれる。
tflintのコマンドをインストールする必要があるが、とても良いツールだと思う。インストールについては、いろいろな人がやっていると思うので、割愛。

## terraform test

最近のterraformのアップデートで追加されたコマンド、実際にplanしたりapplyしてコマンドがきちんと動くのか確認してくれるので、とても助かる。
テストコードを書かないといけないので、作業は増えるが、実際にapplyしてインスタンスやネットワークでエラーがないか、確認してくれるので、良い。

# terraform plan
terraform planは terraform apply する前に、どのようにインスタンスが構成されるかを確認することができるコマンドである。terraform testが通っていれば、問題ない気がする。

# 他にテストコマンドがあれば・・・・
他に、品質を担保するコマンドなどがあれば教えていただけないでしょうか。
相関サブクエリを自分なりに理解してみた

# はじめに
SQLの勉強をしていて、相関サブクエリが理解しにくかったので
本記事で言語化し、思考整理します。

▼ 参考にしたサイト

https://it-biz.online/it-skills/correlated-subqueries/

# サブクエリの復習
相関サブクエリの話をするうえで、サブクエリを簡単にまとめる。

1. クエリの中に記述するクエリ
2. SELECT句、FROM句、WHERE句に加えて、HAVINGやORDER BYなど様々な場所で使える
3. 記述場所によって、記述マナーが異なるので要注意
3. テーブル定義でサブクエリで定義する場合、AS句で別名の定義が必要
4. スカラ・サブクエリ(表内の実データの抽出など)は値が単一でなければならない

https://it-biz.online/it-skills/subquery/

https://it-biz.online/it-skills/scalar-subquery/

https://it-biz.online/it-skills/correlated-subqueries/

# 相関サブクエリについて自分なりに理解してみた

PointListテーブルからJapaneseのMAX値を出力する例

|class|name|Japanese|
|-|-|-|
|A|yamada|100|
|A|sato|90|
|A|iida|50|
|B|uchida|99|
|B|kisida|29|
|C|tanaka|95|
|C|kitayama|50|

```SQL:相関サブクエリの具体例
SELECT * FROM PointList AS T1
WHERE Japanese = (SELECT MAX(Japanese)
                  FROM PointList AS T2
                  WHERE T1.Class = T2.Class);
```

思考回路としては

*だからカラムは全出力
テーブルはPointList(T1)を参照
Japanese=サブクエリの条件を満たす・・・・・・。

ん～～～、`T1.Class = T2.Class`がわからん。

おそらく時間おいてみてみると同じことを思うと思う。

相関サブクエリを理解するうえで
<font color="red">どういう処理順で動いているかがすごく大切！</font>

下記で分解して検討

```SQL:①まず、サブクエリの内容関係なく、外のクエリが動く
SELECT * FROM PointList AS T1
WHERE Japanese = (サブクエリの中身);
```
```SQL:②次にサブクエリが動く
~通常クエリ~
                  (SELECT MAX(Japanese)
                  FROM PointList AS T2
                  WHERE T1.Class = T2.Class);
```

これで1行ごとに処理が進んでいく。

```:処理イメージ
クエリ実行(①)⇒サブクエリ実行(②)⇒1行取得
の繰り返しが高速で行われて結果出力がされる。
```

ここで出てくるのがムズイポイント
`WHERE T1.Class = T2.Class`
<font color="red">これは外クエリと同じ時間軸でサブクエリの参照する場所推移するイメージ。
外クエリで参照した「テーブル.Class」をサブクエリでも参照するよってこと。</font>

クエリで「A class」を参照しているときはサブクエリでも「A class」を参照する。
クエリで「B class」を参照しているときはサブクエリでも「B class」を参照する。
クエリで「C class」を参照しているときはサブクエリでも「C class」を参照する。

つまり？それぞれの「Class」ごとで計算しますよ！！！！
⇒本例だとA~C classまでなので「A」「B」「C」それぞれで結果を求めるよ！！


▼結果はこうなる
|class|name|Japanese|
|-|-|-|
|A|yamada|100|
|B|uchida|99|
|C|tanaka|95|

# 結果
指定されたカラムごとでの結果出力ができますよっていう手法でした。
正直もうこれは形式的に覚えていいのではないかと思っている。

説明してても難しい。
習うより慣れろ、出くわしたときに再び戦えるようにここに残しておく。
Remix: Visualizing TypeScript Dependencies

依存関係について。

Rust / Go で依存関係を調べていた。

その中で、TypeScript の依存関係を可視化する方法について考えた。

[dependency-cruiser](https://github.com/sverweij/dependency-cruiser) というものがあるらしい。

https://github.com/sverweij/dependency-cruiser

これで、TypeScript の依存関係を可視化できる。

CI に組み込んでおけば、認知負荷を下げることができるかもしれない。

実際に作成した Project はこれ。

https://github.com/danny-yamamoto/my-portfolio-remix-v2

## Installation
```bash
npm i -D dependency-cruiser
npx depcruise --init
```

## Initialize
定義を作成する。

```bash
node ➜ /workspaces/my-portfolio-remix-v2 (main) $ npx depcruise --init
✔ It looks like this is an ESM package. Is that correct? … yes
✔ Where do your source files live? … app
✔ Do your test files live in a separate folder? … no
✔ Looks like you're using a 'tsconfig.json'. Use that? … yes
✔ Full path to your 'tsconfig.json › tsconfig.json
✔ Also regard TypeScript dependencies that exist only before compilation? … no

  ✔ Successfully created '.dependency-cruiser.cjs'

npm notice 
npm notice New major version of npm available! 9.8.1 -> 10.2.4
npm notice Changelog: https://github.com/npm/cli/releases/tag/v10.2.4
npm notice Run npm install -g npm@10.2.4 to update!
npm notice 
node ➜ /workspaces/my-portfolio-remix-v2 (main)
```

```bash
node ➜ /workspaces/my-portfolio-remix-v2 (main) $ npx depcruise --include-only "^app"  --config .dependency-cruiser.cjs .

  warn no-orphans: app/routes/portfolio._index.tsx
  warn no-orphans: app/routes/_index.tsx
  warn no-orphans: app/root.tsx
  warn no-orphans: app/entry.server.tsx
  warn no-orphans: app/entry.client.tsx

✘ 5 dependency violations (0 errors, 5 warnings). 15 modules, 5 dependencies cruised.

node ➜ /workspaces/my-portfolio-remix-v2 (main) $
```

## Visualization
```bash
node ➜ /workspaces/my-portfolio-remix-v2 (main) $ npx depcruise --config -x "^(build|functions|node_modules|public)" .dependency-cruiser.cjs . --output-type mermaid > depcruise.md
```

markdown で表示させるため、コードブロックで `mermaid` を指定する。
```diff
+```mermaid
flowchart LR

0[".dependency-cruiser.cjs"]
1[".eslintrc.cjs"]
subgraph 2["app"]
subgraph 3["components"]
4["Footer.tsx"]
end
5["entry.client.tsx"]
6["entry.server.tsx"]
7["root.tsx"]
subgraph 8["routes"]
9["_index.tsx"]
A["portfolio._index.tsx"]
B["portfolio.articles.tsx"]
E["portfolio.certificates.tsx"]
G["portfolio.experience.tsx"]
I["portfolio.tsx"]
end
subgraph C["utils"]
D["articles.server.tsx"]
F["certificates.server.tsx"]
H["experience.server.tsx"]
end
J["index.css"]
K["types.ts"]
end
L["remix.config.js"]
M["remix.env.d.ts"]
N["server.ts"]
B-->D
E-->F
G-->H
I-->J
I-->4
+ ```
```

## Open Preview
完成。
![image-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569971/90828900-755d-98e1-bd3f-c642d9b317de.png)

https://github.com/danny-yamamoto/my-portfolio-remix-v2/blob/main/depcruise.md
ハッカソン入賞できなかったのが悔しいので次勝つためのメモ

ハッカソン入賞できなくて、めっちゃ悔しいのでその日のうちにメモ

## モチベーション
こんばんは。

今日ハッカソンがあり入賞出来なくてめっちゃ悔しいので、この気持ちを忘れないようにメモとして残しておきます。

# 開発テーマ
日常の課題を解決するプロダクト

# 自分が作ったもの
## 概要
位置情報を元にすれ違った人、その周辺にいた人のおすすめのお酒と出会えるアプリ

## 技術
- react native
- expo
- typescript
- geo location api
- figma
- supabase

## 振り返り
- 入賞作品見てると、AI系や機械学習系、データ元にした推薦などだった。やはり時代の流れを見た時に、既存のサービスの拡張みたいなところや市場にない(?)サービスでも評価されにくい気がした。
- デザイン作成したが実装間に合わない
- supabaseとreact nativeの繋ぎこみが出来なかった
- 黒背景に赤文字のスライド見にくい。
- フルスクラッチで作成するの時間短いとキツイし、かけになっちゃうので微妙。せめてテンプレート使うなどする。、
- botもしくは最低限の機械学習デモでもプロトタイプ勝負ではかなりいい
- 質問の多さは評価に比例しそう

## 感じたこと
AI活用した作品、機械学習用いた作品はある程度前提。その前提を踏まえどれだけニーズを汲み取り、世に出ていないプロダクトにできるかが重要だと感じました。

普段から考えていきます。

ps. 帰りの新幹線を前日の便予約してしまい、謎の出費になりました(泣)

とりあえず悔しいので、帰り道で振り返りしました。次はいつになるかわからんが頑張ろう
3DPrinter/CNC 防音・防臭対策 メモ

# キーワード

```
3Dプリンター防音
CNC防音
```

# 「3Dプリンターを入れる防音箱（防音ケース）をDIYで自作する」

- 3Dプリントの音がかなり低減できたとのこと
https://necobit.com/2018/04/3d-printer-soundproof-box.html

# 「CNCフライス用　防音ボックス」

あまり低減できなかったとのこと
https://www.mkbtm.jp/?p=355

# 「CNCフライス　防音Box」

かなり静かになったとのこと

https://ameblo.jp/waynomu/entry-12752710813.html
Du lịch Cologne khám phá thành phố bên sông Rhine thơ mộng

Du lịch Cologne, hay Koln trong tiếng Đức, là một trải nghiệm tuyệt vời với vẻ đẹp thơ mộng nằm bên bờ sông Rhine. Đây là thành phố lớn thứ tư của Đức và cũng là một trong những đô thị cổ nhất trong nước này.

Với một lịch sử kéo dài hơn 2.000 năm, Cologne là điểm đến đậm chất lịch sử, nổi tiếng với nhiều nhà thờ đặc biệt và các bảo tàng hấp dẫn. Việc khám phá du lịch Cologne chắc chắn sẽ mang đến nhiều trải nghiệm thu hút cho du khách.

Thành phố này đậm chất cổ kính với những di tích lịch sử, trong đó có nhà thờ Cologne (Kölner Dom) - một trong những công trình kiến trúc lịch sử nổi tiếng và đáng ngưỡng mộ. Bên cạnh đó, bảo tàng Châu Âu - EL-DE Haus và bảo tàng Wallraf-Richartz cũng là những điểm dừng chân không thể bỏ qua.

Koln cũng nổi tiếng với lễ hội Karneval, một trong những lễ hội lớn và sôi động nhất của Đức. Lễ hội này thu hút rất đông người tham gia từ khắp nơi, với những hoạt động văn hóa, âm nhạc và lễ kỷ niệm diễn ra rộn ràng.

Việc tìm hiểu về du lịch Cologne không chỉ mang lại những trải nghiệm về văn hóa, lịch sử mà còn đem đến cơ hội tuyệt vời để khám phá những nét đẹp độc đáo của thành phố này.
https://chauautour.wordpress.com/2023/11/07/du-lich-cologne-kham-pha-thanh-pho-ben-song-rhine-tho-mong/
[Swift]enumで変数が定義できる？

# 目次
[1.enumで変数が使える？](#1-enumで変数が使える？)
[2.実例](#2-実例)
[3.おわりに](#3-おわりに)

# 1. enumで変数が使える？
Swiftにおいて何かと便利に使用できるenumですが、実は変数(プロパティ)が定義できるってご存知ですか？
ちなみにenumは個人的にはデータ管理に非常に役立っていると感じます。

# 2. 実例
~~~swift: enumプロパティ
enum Month: Int {
    case january = 1
    case february = 2
    case march = 3
}

extension Month {
    var japanese: String {
        switch self {
        case .january:
            return "睦月"
        case .february:
            return "如月"
        case .march:
            return "卯月"
        }
    }
}

print("\(Month.january.rawValue)月")
print("日本語名：\(Month.january.japanese)")
// 出力結果
// 1月
// 日本語名：睦月
~~~

# 3. おわりに
いかがでしたか？enumを理解すると、変に文字列を使用しなくてよかったり、共同作業者のエンジニアとのすり合わせがうまくいったりと何かと便利です。
enumをしっかりと理解して効率の良い開発ができるようになりましょう♪