OmniAICreator/Qiita-1.07M huggingface dataset:
「〇年縛り契約」→「次回契約更新月」を数式で表現する

Salesforceのユーザーから、次の①～③の項目値から「次回契約更新開始月」を
算出したいと依頼がありました。

①「契約起算日」
②「契約更新周期（24ヶ月,36ヶ月等）」「契約更新期間（1, 2ヶ月等）」
③「本日日付」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336848/f2bd19ab-f894-62ba-657d-fe190eca427c.png)

↓

以下の数式を用意して要件を実現しました。
④「契約経過月数」
⑤「契約状況」
⑥「次回契約更新開始月」


#### ④「契約経過月数」
~~~Apex:契約経過月数 ContractPassedMonths__c
/*契約起算日から今日までの経過月 + 1

例） 今日：2024/03/05

1.
契約起算日：2023/12/dd
↓
契約経過月数：4

2.
契約起算日：2024/03/dd
↓
契約経過月数：1
*/

if( isBlank(ContractStartDate_c)
    , 0

    , 12 * (  year(today()) -  year(ContractStartDate_c) )
         + ( month(today()) - month(ContractStartDate_c) )
         + 1
)
~~~

#### ⑤「契約状況」
②, ④の値により、レコードの属性を3パターンに分類する。
~~~Apex:契約状況 ContractStatus__c
/*「契約経過月数」「契約更新周期」「契約更新期間」から、3パターンに分類する。

1.初回更新前：「契約経過月数」が「契約更新周期」未満
※24ヶ月更新の1ヶ月目, 23ヶ月目等

2.更新期間中：『「契約経過月数」を「契約更新周期」で割った余り』が0以上、「契約更新期間」未満
※24ヶ月更新の24, 49ヶ月目等

3.その他の違約金発生期間
※24ヶ月更新の28ヶ月目等
*/

if( ContractPassedMonths__c != 0 // 業務要件に合わせて、適切にガード節を設定する
    , null

, if( ContractPassedMonths__c < ProductPlan__r.UpdateCycle__c
    , "初回更新前"

, if( mod(ContractPassedMonths__c, ProductPlan__r.UpdateCycle__c) >= 0
   && mod(ContractPassedMonths__c, ProductPlan__r.UpdateCycle__c) < ProductPlan__r.UpdateTerm__c
    , "更新期間中"

    , "違約金発生期間"
)))
~~~


#### ⑥「次回契約更新開始月」
⑤「契約状況」ごとの計算式で、「次回契約更新開始月」を計算する

~~~Apex:次回契約更新開始月 NextContractRenewalMonth__c
/*
例）本日日付 2024/03/05, 更新周期 24ヶ月、更新期間3ヶ月とした場合

1.初回更新前のパターン
契約起算日：2023/10/dd etc.
↓
次回契約更新開始月：2025-09

2.更新期間中のパターン
契約起算日：2020/03/dd etc.
↓
次回契約更新開始月：2024-02

3.その他の違約金発生期間
契約起算日：2021/06/dd etc.
↓
次回契約更新開始月：2025-01

*/
if( false // 業務要件に合わせて、適切にガード節を設定する
    , null

// yyyy-MM形式で返す
,left(text(

    case( ContractStatus__c
      , "初回更新前"
        // 「契約起算日」から「更新周期-1」ヶ月経過した月
        , addMonths( ContractStartDate__c, ProductPlan__r.UpdateCycle__c - 1 )

      , "更新期間中"
        // 「契約起算日」に「更新周期」を適切な年数で切り上げて加算した月
        , addMonths( ContractStartDate__c, ProductPlan__r.UpdateCycle__c * (0  + floor(ContactPassedMonths__c / ProductPlan__r.UpdateCycle__c) ) - 1

      , "違約金発生期間"
        // 「契約起算日」に「更新周期」を適切な年数で切り上げて加算した月
        , addMonths( ContractStartDate__c, ProductPlan__r.UpdateCycle__c * (1  + floor(ContactPassedMonths__c / ProductPlan__r.UpdateCycle__c) ) - 1
 
        , ""
    )        
), 7)  // left( text(～～), 7)
)
~~~


①～③より、いきなり⑥を作れ！って言い出されたときに
1回冷静に要件を整理しましょと説得しながら④～⑥に分割して実装しました。

⑥の数式は多分もっとスマートに記述できるし、場合によっては⑤の分類も
不要になるかもと思いますが、一旦これで公開します。

Excelなどに移植するのもそこまで難しくないと思います。
どなたかのお役に立てば幸いです。
GROWI 7.1.1リリースノート

[オープンソースのWikiであるGROWI](https://growi.org/ja/)の最新版、7.1.1がリリースされました。大きな変更点はありませんが、リリースノートとして主な変更点を紹介します。

## 追加機能

- クリスマステーマを追加！

ライトモード

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/0f313399-d252-9f9b-3d81-10f692ee01c5.png)

ダークモード

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/5e5629cd-f3a9-0548-d661-f081a60430df.png)

ぜひ今の時期にお試しください！

## 改善点

- GROWI AIにて出典機能を追加
- GitHub Alertが `:::` での記述に対応
- GROWI AIでサマリーモードを追加

他、幾つかの不具合修正と各種メンテナンスも行われています。詳細は[Release v7.1.1 · weseek/growi](https://github.com/weseek/growi/releases/tag/v7.1.1)を参照してください。

### GitHub Alertの記述法について

以下のようなフォーマットです。

```
:::info[ラベル]
メッセージをここに。  
改行も可能です
:::
```

このように書くと、以下のように表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/c92607e6-61ee-9489-780a-dc90a47afc64.png)

## まとめ

GROWIはオープンソース、かつDocker composeなどで手軽に導入できます。ぜひ社内・研究室・自宅などで利用してみてください。

[OSS開発wikiツールのGROWI | 快適な情報共有を、全ての人へ](https://growi.org/ja/)
toml-0.5.11 までの toml::from_slice toml::to_vec を toml-0.6 以降(0.7, 0.8 含む) へ更新する実装例

```rust
// toml-0.5.11 まで

// serialize
let paylaod = toml::to_vec(&data)?; // data: DataStruct -> vec[u8]

// deserialize
let data: DataStruct = toml::from_slice(payload)?; // vec[u8] -> data: DataStruct
```

```rust
// toml-0.6 以降

// serialize
let payload_str = toml::ser::to_string(&data)?; // data: DataStruct -> String
let payload = payload_str.into_bytes(); // String -> vec[u8]

// deserialize
let paylaod_str = std::str::from_utf8(payload).ok()?; // vec[u8] -> &str
let data: DataStruct = toml::de::from_str(payload_str)?; // &str -> data: DataStruct
```

以上の対応が `serde_json`, `toml`, `rmp_serde` など複数のシリアライザーを関数で共通化して対応している実装や `payload` をバイト列に抽象化して扱う実装において `toml` の `dependencies` をアップデートする際に必要となる。

また、そのようなデシリアライズ関数の実装で `payload` の引数を次のように:
```rust
pub fn my_deserialize<T>(payload: &T)
 where T: Deserialize<'a>
```
定義していた場合は次のように:
```rust
pub fn my_deserialize<T>(payload: &T)
 where T: DeserializeOwned
```
変更する必要も生じる。
virshで接続できなくなったlinux guestのレスキュー

vmゲストのDebianをdist upgradeした際にミスをして試行錯誤しながら復旧したので，その手順についてまとめてみました．
# virshでアップデート後にVMに接続できない
Debianのホスト上のkvmにゲストとしてDebianをインストールし使っていたが，dist-upgradeした際にうっかりgrubの設定をメンテナのバージョンに更新してしまった．その後，`virsh start`するとVMは起動しているようだが，`virsh console`からもネットワークからもアクセスできなくなってしまった．
後からわかったが，メンテナの`/etc/default/grub`により`/boot/grub/grub.cfg`の中で
```
terminal_output gfx
```
と設定されてしまったため，グラフィックを持たないVMがブート途中で止まっていたようだ．
# レスキュー方法
仮想マシンをレスキューする方法を検索すると，`virt-rescue`というコマンドがあることが分かった．このコマンドを使うことで，rescue-cdからブートしたような感じで，ゲストVMのイメージを確認できるよう．
Debianでは`guestfs-tools`に含まれているようなのでインストールする．
```
apt install guestfs-tools
```
## イメージのマウント
Debianでvirshを使ってVMを作成した場合は`/var/lib/libvirt/images`にイメージがある．どこにイメージがあるかは`virsh edit VM名`でも確認できる．
```
cd /var/lib/libvirt/images
virt-rescue -a VM.img -a
```
でVMのイメージをマウントし，レスキューシェルが起動する．
VM.imgのファイルシステムはレスキューシェルでは`/sysroot`にマウントされている．
### grub.cfgの修正
レスキューシェルにはエディターは含まれていないようなので，`/sysroot/bin/tim.tiny`を使ってファイルを修正した．
`/sysroot/bin/vim.tiny /sysroot/etc/default/grub`でGRUB_TERMINALの変更とGRUB_SERIAL_COMMANDを追加
```
GRUB_TERMINAL="console serial"
GRUB_SERIAL_COMMAND="serial --unit=0 --speed=115200 --word=8 --parity=no --stop=1"
```
本来はここで`update-grub`を実行する必用があるが，chrootなどを行う必用があるのとVMのイメージをどこまで書き換えてよいか不安だったので，直接`/sysroot/boot/grub/grub.cfg`を書き換えた．

`/sysroot/bin/vim.tiny /sysroot/boot/grub/grub.cfg`により本来はよくないが，grub.cfgを書き換え．
`terminal_output gfx`の部分を以下に変更
```
serial --unit=0 --speed=115200 --word=8 --parity=no --stop=1
terminal_input console serial
terminal_output console serial
```

レスキューシェルを`exit`で抜けて`virsh start VM`で起動すると無事に起動した．
Androidのエッジツーエッジで広がる領域にマージンを被せて無効化してみる

Android15 + targetSdk 35 で EdgeToEdge レイアウトがデフォルトで有効になりました。
targetSdkを35にあげたいけど、EdgeToEdgeにしてしまうとレイアウトが崩れてしまい有効にできないという人も多いことでしょう。

一時的に回避するために [windowOptOutEdgeToEdgeEnforcement](https://developer.android.com/reference/android/R.attr#windowOptOutEdgeToEdgeEnforcement) というAPIもありますが、こいつはAndroidの公式ドキュメント内で言及されているのを見つけられずいまいち信憑性にかけます。

そこで、WindowInsetsを取得して、EdgeToEdgeで増える分の領域をマージンとして設定してあげることでとりあえず見た目を保証するというアプローチを考えてみました。

コードは以下です。


```kotlin
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.VANILLA_ICE_CREAM) {
        ViewCompat.setOnApplyWindowInsetsListener(rootView) { view, windowInsets ->
            val insets = windowInsets.getInsets(
                WindowInsetsCompat.Type.systemBars() or WindowInsetsCompat.Type.displayCutout(),
            )
            view.updateLayoutParams<ViewGroup.MarginLayoutParams> {
                topMargin = insets.top
                leftMargin = insets.left
                rightMargin = insets.right
                bottomMargin = insets.bottom
            }
            WindowInsetsCompat.CONSUMED
        }
    }
```

これをActivityのRootViewに対して動かしてあげることで広がった領域を無効化することができます。注意点としてはMarginとして広げているので、StatusBar等の背景色を意図して色に設定してあげる必要があります。

Androidの方針としてはEdgeToEdgeに対応したアプリ・レイアウトを実装していくべきなので、一時しのぎしつついい感じの実装にしていけるとよいですね。

## 参考

https://developer.android.com/develop/ui/views/layout/edge-to-edge?hl=ja
Google CloudのAPI GatewayでAPI Keyを使用したAPIを作成する

# はじめに

どうも、@to-fmakです。最近、Google CloudのAPI Gatewayを使ってAPI Key認証を有効にしたAPIを作成する機会がありました。本記事では、その手順を簡単に共有します。
API Key認証は、アクセス制御を簡易的に実現したい場合に有効な方法です。

# OpenAPIファイルの設定

API GatewayでAPI Keyを使用するには、OpenAPIファイルでAPI Key認証を設定する必要があります。以下は設定例です。

## セキュリティ定義の追加

```yaml
securityDefinitions:
  api_key:
    type: 'apiKey'
    name: 'x-api-key'
    in: 'header'
```

## OpenAPIファイル全体の例（一部省略）

```yaml
swagger: '2.0'
info:
  title: 'My Example Config'
  ...
paths:
  /hello:
    get:
      security:
        - api_key: []
    ...

securityDefinitions:
  api_key:
    type: 'apiKey'
    name: 'x-api-key'
    in: 'header'
```

# APIの作成

準備したOpenAPIファイルを使用して、API GatewayでAPIを作成します。詳細な作成手順は割愛します。

:::note warn
認証に API キーを使用する場合は、まずサービスで API キーのサポートを有効にする必要があります。

次のコマンドを入力します。

gcloud services enable MANAGED_SERVICE_NAME

MANAGED_SERVICE_NAME には、API のデプロイ時に作成されたマネージド サービスの名前を指定します。この名前は、コンソールの API ランディング ページにある API の [マネージド サービス] 列で確認できます。また、gcloud api-gateway apis describe コマンドを使用するときに、Managed service プロパティでこの名前を確認できます。
:::

# API Keyの作成

「APIとサービス」コンソールを開き、「認証情報」画面を開きます。「認証情報を作成」をクリックします。

![Screenshot 2024-11-18 at 17.41.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2954734/4b3a9678-6302-27da-9d96-b7a1c6ebd77b.png)

「APIキー」をクリックします。

![Screenshot 2024-11-18 at 17.46.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2954734/5593cb8c-85ce-65dd-d66d-98e9d6cd9ece.png)

APIキーが表示されるので、メモしておきます。

![Screenshot 2024-11-18 at 17.46.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2954734/ab82b230-6dec-92b5-24fe-f653927dee23.png)

作成したAPIを選択し、「APIキーを編集」をクリックします。

![Screenshot 2024-11-18 at 17.46.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2954734/b6713825-d2c9-1b92-b06e-03d784fa6b09.png)

「APIの制限」で「キーを制限」を選択し、対象のAPI（上記OpenAPIファイルの例だとMy Example Config）を選択します。

![Screenshot 2024-11-18 at 17.47.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2954734/7caff571-c4bc-1251-76ca-37e8aebc55b2.png)

![Screenshot 2024-11-18 at 17.48.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2954734/9c1e839f-7200-9cfc-a6f0-3979bcd1a0ed.png)

# 動作確認

以下のようにAPI Keyを使用してリクエストを送信します。

```bash
curl -X POST -H "x-api-key: {API Key}" "https://{ゲートウェイのURL}/hello"
```

# 参考URL

https://cloud.google.com/api-gateway/docs/authenticate-api-keys?hl=ja

## エンジニア募集

Gakken LEAP では教育をアップデートしていきたいエンジニアを絶賛大募集しています！！
ぜひお気軽にカジュアル面談へお越しください！！

https://gakken-leap.co.jp/recruit/
フロントエンドエンジニア多能工への道

# はじめに

こんにちは、Gakken Leap のフロントエンドエンジニアの日下です。

Shikaku Pass 開発チームでは現在チームの生産性向上のため、エンジニア多能工化を目指し活動を行っています。日々の取り組みの中で気づいたことをこの記事で書いていこうと思います。

# 背景

多能工という言葉はあまり一般的ではないと思います。この言葉はトヨタ自動車工業で副社長を務めていた大野耐一氏によって考案されたといわれており、多様な業務が行える人材のことを指します。

多能工で構成されたチームでは、余裕のあるエンジニアが人手の足りない実装工程を支援することで、効率的に開発を進めることができます。

Shikaku Pass 開発チームでは、フロントエンドとバックエンドでチームが分かれています。フロントエンドは Nuxt、バックエンドは Ruby on Rails を使っており、技術が異なるためチーム間でのエンジニアの移動というものはほとんどありませんでした。

全体的な傾向としてフロントエンドの作業が早く終わり、バックエンドの作業がボトルネックになるケースが多々あり、その際にフロントエンドチームに手待ちが発生してしまうという問題がありました。

フロントエンドエンジニアの手が空いたときは、リファクタリングや自動テスト開発等を進めるのですが、それらのタスクはスプリントゴール達成には直接寄与しないものでした。

結果としてマイルストーン通りの開発スケジュールを守ることが難しくなってきたため、チームの生産性向上を目指しこの取り組みが始まりました。

# どのようなことをしたか

多能工化を目指すにあたり、まずはフロントエンドエンジニアがバックエンドも触れるようになろうということで私がバックエンドのチケットを取ることから始めました。

私は過去 Rails の Tutorial や erb テンプレートの開発はやったことがあるものの、業務で毎日触っているわけではなかったので、[Ruby on Rails ガイド](https://railsguides.jp/)や海外のチュートリアルを読み、基本の部分から学び直しました。

その後、お手本のある簡単なチケットから消化することにしました。

細かくバックエンドのメンバーと連絡をとり、進め方や疑問点をすり合わせ認識齟齬が起こらないことを強く意識して取り組みました。

また、一人で進めるのが難しい箇所等はペアプロも取り入れながら実装を行いました。

この取り組みを始めて１ヶ月と少しですが、遅延が発生しそうだった機能開発もスケジュールに収まり、チームとしての生産性は上がったと思います。

# 学び

比較的スムーズに多能工化への一歩を踏み出せたかと思いますが、成功のために意識しておくべき点が 3 つあると感じました。

## システムの関心の違いを理解する

フロントエンドのシステムとバックエンドのシステムでは関心が異なります。

- フロントエンドはデータをいかに表示するか。
- バックエンドはデータをいかに保存するか。

フロントエンドではデザイン、アクセシビリティ、デバイスやブラウザ差異、状態管理といったことが注目される一方で、
バックエンドではバリデーション、セキュリティ、パフォーマンスといった要素が重要視されます。

異なる関心ごとを持ったシステムであるということを踏まえて臨むと、既存コードやレビュー指摘の意味を理解しやすく、セルフレビューの際、考慮漏れにも気づきやすくなります。

システム間を越境する際は上記のように頭を切り替える必要がありますが、このスイッチングコストは思った以上に大きく、最初は疲れると思います。
なので、できれば同一スプリント内で別システムの作業は入れない方が良いと思います。

## MVC や SQL 等の基礎知識を学習する

私は Rails のチュートリアルから始めましたが、MVC モデルや SQL といった前提となる知識は必要かと思います。

フロントエンドエンジニアは基本的に View の部分のみを担当するケースが多いと思います。

私もフロントエンドのキャリアの中でほとんど View 部分のみ担当していましたが、新卒の頃に社内研修で MVC モデルや SQL について勉強したことがあったので Rails のドキュメントがスムーズに読めたかなと思います。

もしもそれらについての知識がない場合は、MVC の概念や SQL の文法等学習していくのがおすすめです。

Rails のチュートリアルのみでもコードを書き始めることはできると思いますが、それらの概念がわかっていないと応用が効かず困ってしまうと思います。

特に Active Record の各種メソッドがどのような SQL を発行するのかといった部分は Rails 理解の肝じゃないかと感じました。

ちなみにフロントエンドだと HTML,CSS, DOM 操作周りの知識が基礎知識にあたると思います。

## コミュニケーションは丁寧に行う

普段触っていない別のシステムを開発するときは誰でも不安を覚えます。

特に最初のうちはわからないことがわからない状態で質問すら思い浮かばないでしょう。
私も進めていく中で始めて疑問が湧くといったことが多々ありました。

なので、細かくコミュニケーションを取り、認識齟齬が起きないように進めるが望ましいです。

まずテストケースを書いて確認してもらうと大きく認識がずれないのでおすすめです。

細かい実装方針についても、自分なりの仮説を立てて質問するとスムーズに進みます。

コミュニケーションが多いと相手の時間を奪ってしまうのではないかと不安になるかと思いますが、
細かく会話をして指摘を取り込むことで、後々レビューが楽になるという副次効果もありました。

認識齟齬を生まずに作業を進めた方が結果としてリードタイムは早くなるのではないかと感じました。

# まとめ

Shikaku Pass 開発チームでは、チームの生産性向上を目指してエンジニアの多能工化に取り組みました。フロントエンドエンジニアがバックエンドの開発もサポートすることで、開発のボトルネックを解消し、スケジュール通りの開発を実現することができました。
この取り組みから得られた重要な学びは以下の 3 点です：

- フロントエンドとバックエンドではシステムの関心事が異なることを理解し、コンテキストの切り替えを意識して開発を進める。
- MVC モデルや SQL などの基礎的な知識の習得が、新しい技術領域に挑戦する際の重要な土台となる。
- 不慣れな領域での開発では、細かなコミュニケーションを取り、認識齟齬を防ぐことが結果的に開発の効率化につながる。

多能工化への取り組みは、個人の技術的な成長だけでなく、チーム全体の生産性向上にも大きく貢献します。今後も継続的な学習とチーム間の協力を通じて、より効率的な開発体制を築いていきたいと考えています。

# エンジニア募集中

Gakken LEAP では教育をアップデートしていきたいエンジニアを絶賛大募集しています！！
ぜひお気軽にカジュアル面談へお越しください！！

https://gakken-leap.co.jp/recruit/
qiita-syncで下書きしたい

[GitHub連携でQiita記事を素敵な執筆環境で！ #Python - Qiita](https://qiita.com/ryokat3/items/d054b95f68810f70b136) で、
qiita-syncという素敵な執筆環境があることを知り、便利に使わせてもらっています。
(使う方は、記事のコメント欄にある「Github Actions の読み書きの許可」も併せてやりましょう)

しかし、自分の執筆フローに一部合わないところがありました。特に、次のことを実現する方法が紹介されていませんでした。

- 執筆中の記事は公開せず、限定公開にもしたくない
- ある程度記事が書けたら公開したい
- 執筆のためのマシンは複数あるので、執筆中の記事もgithubで管理したい

qiita-syncのソースコードを読み、実現方法が分かりましたので、本記事ではそれを紹介します。

# 結論

次の条件にマッチするファイル名は、qiita-syncのsync対象外になる。

- ドットから始まるフォルダ名の配下にある、任意のファイル名

#### 例

- qiita-content/.draft/draft-file.md
- qiita-content/.draft/folder1/draft-file.md

※`qiita-content`はリポジトリフォルダです。(qiita-content/.github フォルダが存在する形)

# 解説

[ryokat3/qiita-sync](https://github.com/ryokat3/qiita-sync/)のソースコード（ https://github.com/ryokat3/qiita-sync/blob/339db7f95a18c3e77a9a59ef4d4f65ee6f5781fe/qiita_sync/qiita_sync.py#L112 ）を見ると、次のように定義されています。

```
DEFAULT_EXCLUDE_GLOB = ['**/README.md', '.*/**/*.md']
```

この変数は、最終的に、sync対象外とするファイルを決定するために使われているので、
これを活用すれば良いこととなります。

# 他の方法1

```
DEFAULT_INCLUDE_GLOB = ['**/*.md']
```

という変数が定義されているので、これにマッチしなければ同期対象外となります。
つまり、拡張子をmd以外にすればよいのです。

#### 例

- draft-file.md.draft

# ほかの方法2

DEFAULT_EXCLUDE_GLOB は、qiita-syncコマンドラインオプション`-e` に対応しているので、
`.github/workflows/qiita_sync.yml`ファイルと`.github/workflows/qiita_sync_check.yml`ファイルを次のように編集すればよいでしょう。

- README.md と qiita-content/draft フォルダ配下のファイルは同期対象外にしたい場合

```yaml: qiita_sync.yml 編集前
      - name: Run qiita-sync
        run: |
          qiita_sync sync .
        env:
          QIITA_ACCESS_TOKEN: ${{ secrets.QIITA_ACCESS_TOKEN }}
```

```yaml: qiita_sync.yml 編集後
      - name: Run qiita-sync
        run: |
          qiita_sync sync -e '**/README.md' 'draft/*' .
        env:
          QIITA_ACCESS_TOKEN: ${{ secrets.QIITA_ACCESS_TOKEN }}
```


```yaml: qiita_sync_check.yml 編集前
      - name: Run qiita-sync check
        run: |
          qiita_sync check . > ./qiita_sync_output.txt
          cat ./qiita_sync_output.txt
          [ ! -s "qiita_sync_output.txt" ] || exit 1
```

```yaml: qiita_sync_check.yml 編集後
      - name: Run qiita-sync check
        run: |
          qiita_sync check -e '**/README.md' 'draft/*' . > ./qiita_sync_output.txt
          cat ./qiita_sync_output.txt
          [ ! -s "qiita_sync_output.txt" ] || exit 1
```
研修者が、教育者に求めるもの【番外編】

単刀直入に言うと、はっきりとして目標を立てて欲しい、ということである。

例えば、◯◯を一から作って欲しい、というかんじである。

この資料で勉強して、というふうなものは投げやりに感じてしまう。というのも、目標がないから、勉強しにくいからである。

共通テストの科目、範囲がわからないけど、とりあえず今渡された生物のテキストこなすか、なんてことはできない。生物は使う人と使わない人がいるから。(この例え話意味不明)

目標を言い渡して欲しい。それがどれだけ難しくても良い。ちゃんとした人材なら、自分で解決できる。道筋をいくつか決めて、努力して努力してたどり着くから。
プログラミング初心者がある程度コードを書けるようになるまで【番外編】

まずは、教科書を用意して、コードを書いた。

その教科書は、全部終わっていない。後半の難しそうなところは飛ばした。

そして、プログラミングバイトを始めた。

最初は訳がわからない。

しかし、文法を一旦無視して、その意味をなんとなくで捉えて、プロのコードを真似したり、少し変えたりしているうちに、段々と書けるようになってきた。

ここで、やっと、文法を明確に意識する。型のキャスト、ポインタ、構造体、列挙体、など。

なんだろうここ、と思った箇所をchatGPTに投げる。

僕の場合は、その内容を自分なりにソースファイルにコメントアウトでまとめる。

これを繰り返せば、コードの意味が分かり、分からないところが出てきても、先輩に頼らずに自分の力で解決することができるようになると思う。

会社によって異なる開発環境についての知識不足は、会社のドキュメントを見るか、chatGPTに聞くか、それでも無理なら、会社の先輩に聞く。

こうして僕は自分で課題を見つけ、自分で解決することがある程度できるようになった。

努力は報われる？報われるまで努力しろ？

どちらかというと、僕は、努力しろ、の一言でしょうか。
【SMSS】テーブルを作り直す際の備忘録【SQL】

自分用に書き記しておきます：

#### この記事が役に立つ（立ちそうな）状況
・テーブルを別DBにそのまま移すけど若干仕様が変わるとき
・テーブルを作ってしまった後にUNIQUE制約等を忘れちゃったとき　←わたしです

### 概要

テーブルを作り直す際、クエリを再作成するとなったとき、作業負荷がその規模に比例して大きくなることが考えられます

そのような際に、以下の手順で一から記述することなくクエリを生成することができます

#### 手順

任意のデータベースにあるテーブルを右クリックし、
テーブルをスクリプト化→新規作成→新しいクエリ エディターウインドウを選択します

![スクリーンショット 2024-11-19 155431.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3839201/179e7eff-9870-946b-ba7a-034498d71380.png)

選択後、表示されたクエリの中にCREATE TABLEの記述があるので、これをコピーすることで、同様のテーブルを再現するクエリを取得することができます

![スクリーンショット 2024-11-19 155554.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3839201/b0ab1b6c-f4fe-1dce-52e8-abbe6fbc9055.png)

あとは取得したクエリにUNIQUEやPRIMARY KEY等のオプションを書き加えて作り直すことができます

:::note warn
テーブルを作り変える等の場合、大事なデータが入っていないか十分に気を付けて扱ってください
:::


~~(横着してADD CONSTRAINTでなんとかしようとすると恐ろしいことになりそう、という発想は多分あっている)~~

ミスを減らすためにも、睡眠時間をもっと取りましょう。。。
iphoneのUTM SEでdebianを使ってみた

前回はArchLinuxを使用してみたが上手く日本語の表示ができませんでした、今回はdebianで日本語入力するまでを挑戦してみます。

前回はこちら
https://qiita.com/aruelu/items/350dd9e5251cb82979e7

# debianの準備
前回同様にdebianもUTMギャラリーから、ビルド済のイメージをダウンロードしてきます。

今回は、いくつかあるdebian11の中からxfceを使用してみます。

ダウンロードしたイメージを実行すると、ログイン画面が表示されます。
かなり時間が掛かるので、気長に待ちましょう。
ユーザー名:debian
パスワード:debian
でログインします。

ログインしてから画面が表示されるまでも、かなり時間が掛かります。
動いているのか不安になりますが、気長に待ちましょう。

# システム更新
お決まりのシステム更新を実行
~~~
sudo apt update
sudo apt upgrade
~~~

# タイムゾーンの設定
日本時間に変更します。
~~~
sudo ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
~~~

# 日本語フォントのインストール
まずは日本語フォントをインストールして、日本語が文字化けしないようにします。
~~~
sudo apt install fonts-noto-cjk
~~~

# localeの変更
メニュー表示を日本語に変更します。
~~~
sudo dpkg-reconfigure locales
~~~
• 表示されるリストから ja_JP.UTF-8 を選択
し、エンターキーを押します。
• ja_JP.UTF-8 をデフォルトのロケールに設定します。

ここで、再起動します。
すると、メニューなどが日本語表示に変更されていると思います。

# 日本語入力の設定
日本語入力は、fcitx5+mozcを使用します。
必要なパッケージのインストール。
~~~
sudo apt install fcitx5 fcitx5-mozc
~~~

入力メソッドの変更
~~~
im-config -n fcitx5
~~~

ここで、再起動します。

ソフトキーボードの^とスペースキーで日本語の入力が可能になりました。

# debian11を使用してみて
日本語の表示、入力までは簡単に行うことができました。
GUI環境はかなり重いです。
Waylandのコンポジター　Wayfire→Labwc

# はじめに
2024年10月28日以降に、RaspberryPi OSを最新にすると下記のような謎のメッセージが出てビックリしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30994/5b5d9057-8900-eb56-f72a-d163a95aa4d2.png)

これは、下記の公式サイトのニュースで出ている通りなのですが、長らくLinuxの世界で使われてきたX11（ディスプレイサーバー、ウィンドウマネージャー）ですが、
次世代のプロトコル`Wayland`が、2011年頃からRaspberryPiにもやってきました。
- `Wayland`は、ディスプレイサーバー、ウィンドウマネージャーをまとめて対応でき、かつセキュリティも向上できちゃうというメリットがあったのです
- 2023年には、RaspberryPiでGUIアプリ（サイネージなど）を作ろうとすると、`X11`にしますか？`Wayland`にしますか？（それとも...）という感じになっていたかと思います
- そこで「時代は`Wayland`やなぁ」と一大決心した人は、[公式のキオスクモード](https://www.raspberrypi.com/tutorials/how-to-use-a-raspberry-pi-in-kiosk-mode/)などを参考にWaylandのコンポジターの1つである`Wayfire`を使って、設定ファイル`Wayfire.ini`を一生懸命いじるわけでした
- 今回（2024年10月後半からは）、「`Wayfire`から別のコンポジタである`Labwc`に乗り換えませんか？」、という案内がきたのが、👆のスクショとなります
-
## 移行するには？
- まずバックアップを取ります。必ず取ります。押したくなる誘惑に負けないでまずはディスクのクローンを取ります
- 「Switch To Labwc」ボタンを押して移行します
たったこれだけのことですが、黒い画面が出て起動しない！などトラブルと対策が、下記のコメント欄に沢山書かれています。
👉教訓：<font color="HotPink">誘惑に負けず、必ずバックアップを取ってから実行</font>するのです！
https://www.raspberrypi.com/news/a-new-release-of-raspberry-pi-os/


https://www.raspberrypi.com/news/a-new-release-of-raspberry-pi-os/

### どうやってアプリを移行するか
`Wayfire`から`Labwc`に移行するには、『Switch To Labwc』ボタンを押すだけです。
では、自前で用意した自動起動スクリプトはどうするかですが、シンプルにファイルを変更するだけでOKです。
簡単ですね！
- `Wayfire`の設定ファイル（移行元）: `~/.config/wayfire.ini`
- `Labwc`の設定ファイル（移行先）: `~/.config/labwc/autostart`

```bash:~/.config/wayfire.ini
[autostart]
panel = wfrespawn wf-panel-pi
background = wfrespawn pcmanfm --desktop --profile LXDE-pi
xdg-autostart = lxsession-xdg-autostart
{処理名} = bash {スクリプトのパス}/xxx.sh
```

```bash:~/.config/labwc/autostart
bash {スクリプトのパス}/xxx.sh &

```
初めて独ステ制御した話

こんにちは、kazuです。
去年の交流ロボコンで有限回転独立ステアリングの制御を極めつつあったのでそれを紹介します。

https://x.com/kzs321/status/1772099339978235918

# ハード
ブラシDCモーターx2で操舵と駆動を動かすいつものやつを作ってもらいました。
当時3年の先輩が元の設計を作成し、当時2年のチームリーダーが改良、加工組み立てをしました。
最終的にはステアが1回転したらロリコンが1回転する、1:1にすることができたので制御的には嬉しい限りです。
また原点取り用に半円をインタラプタで検知できるようにしてありました。
Dぷりで作成し固定が甘かったのとたまにインタラプタに引っかかりインタラプタを5個破壊しました。

# 回路
代々伝わる黒MDなるものを足回りだけで8枚使用しました。
何度か逆接などして死にかけでしたがなんとか動かすことができました。

# 初期の制御
## 原点取り
1. ロリコンをリセットし、現在の位置を0にします
2. 180度分回転させます(ギア比を考慮したロリコンの値を使用)
3. 回している途中でインタラプタの値が変化したらそこでロリコンをリセットし、回転を止めます
4. 180度回りきってもインタラプタが変化しなければ逆回転を始めて、-360度分回転させます
5. 1の場所から-180度の位置まで回転する間にインタラプタが変化したらロリコンをリセットし逆回転を止めます
6. -180度まで回っても反応しなかったら回路エラーなので一時停止し操縦者に信号を送ります

## PID
8つのPIDを動かしたらメモリが足りなかったのでPCでPIDをしてその結果を動かすようにしました。
mROS 2を使ってマイコンと直接ROS 2で通信することで高速通信が実現できたのでPIDで問題は起こりませんでした。
(どちらかというとMD内部の台形制御が時間かかってた)

## 結果
- インタラプタの故障が多かった
- 原点がDプリの精度に依存していたため良くなかった
- PIDはいい感じだが通信切れたらいろいろまずい

https://x.com/kzs321/status/1861569838730354943

# 2度目の正直
## 原点取り
1. ロリコンをリセットします
2. 1秒間回転させます
3. 回転している途中でZ層(1周に一回反応する層)が反応したらロリコンをリセットし、値のオフセットを考慮したPIDを開始します
4. 2秒間逆回転させます
5. 3と同じようにZ層を使い原点を取ります
6. すべての原点が3秒以内に取れなかった場合、一時停止します

## PID
駆動のモーターの回転数の差が大したことなく、操舵の精度が終わっていたため操舵だけマイコンでPIDしました。
時間がなかったので限界感度法を試しました。
各操舵のターゲットは1回転のねじれまで許容するようにして、それを超えたら180度戻す形にしました。

https://github.com/kazu-321/24kb/blob/25cb3123609aa70288051ee6e644392c5699e8e3/main.cpp#L80

## こだわり
coutを魔改造し、以下のような出力にしました

https://x.com/kzs321/status/1845277915954721094

## 結果
- 操舵モーターおそすぎる！！
- デバッグはしやすかった
- 操舵の最適化に成功した

https://x.com/kzs321/status/1861576146292482334

# 僕の考える最強の有限回転独ステ制御
実際に制御してみて以下の実装は必須だと考えました。

- 原点取りはZ層を使う
    - 機構班にはｴﾝｺｰﾀﾞｰ1回転でステア1回転以上に設計してもらう
    - 初回電源投入時はケーブルのねじれを解消しておく
- ねじれ過ぎたら180度回転
    - ケーブルの長さから許容できるねじれを考える
    - 駆動モーターの回転方向を逆にする
- 90度以上回転しようとした場合の最適化
    - 目標値±180度して90度いないに収める
    - 駆動モーターの回転方向を逆にする
- 制御電源を切るときにステアを原点に戻す
2つのESP32を使い，同期処理をする方法について

今回は，2つのESP32を使い，同期処理をする方法について説明します．


## モチベーション
この題材にした理由は2つのESP32を使い，同期処理をすれば１台にかかる負担が減り，プログラムがスムーズにいくのでは？というところからやってみました．



## 1台目のESP32

1台目のESP32は先に処理したいメインのプログラムになります．今回は同期処理させたい部分をtime.sleep(10)という風にしました．

同期タイミングはsync_pin.value(1)でGPIO4の信号をHIGHに設定したら同期します．同期終了タイミングとして，    sync_pin.value(0)でGPIO4の信号をLOWにします．

```output.py
from machine import Pin
import time

# GPIO4を出力用に設定
sync_pin = Pin(4, Pin.OUT)

def main():
    print("プログラム開始")
    
    # 同期信号をHIGHに設定
    sync_pin.value(1)
    print("GPIO4をHIGHに設定")
    
    # 10秒間スリープするというプログラムを同期処理のメインの処理
    time.sleep(10)
    
    # プログラム終了時に同期信号をLOWに設定
    sync_pin.value(0)
    print("GPIO4をLOWに設定")
    print("プログラム終了")

if __name__ == "__main__":
    main()

```

## 2台目のESP32

2台目のESP32は1台目のESP32のある部分のプログラムと同期処理させたいプログラムです．1台目のESP32のtime.sleep(10)と同期して，その時間を計測しています．同期タイミングは1台目のESP32のsync_pin.value(1)の信号を受け取ったら同期を始め，sync_pin.value(0)の信号を受け取ったら同期終了です．


```input.py
from machine import Pin
import time

# GPIO5を入力用に設定（プルダウン抵抗を有効化）
sync_pin = Pin(5, Pin.IN, Pin.PULL_DOWN)

def main():
    print("待機中...")
    
    # 初期化時に強制的にLOW状態を待つ
    print("LOW状態になるまで待機...")
    while sync_pin.value() == 1:
        time.sleep_ms(100)
        print(f"現在のピン状態: {sync_pin.value()}")
    
    print("LOW状態を検出、HIGH待機開始")
    
    # HIGH信号を待つ
    while sync_pin.value() == 0:
        time.sleep_ms(10)
    
    print("同期信号を検出: 測定を開始")
    start_time = time.ticks_ms()
    
    # LOW信号になるまで待つ
    while sync_pin.value() == 1:
        time.sleep_ms(10)
    
    end_time = time.ticks_ms()
    print(f"測定完了: 実行時間 = {time.ticks_diff(end_time, start_time)} ミリ秒")

if __name__ == "__main__":
    main()

```

## 実行手順
始めに2台目のESP32のファイル（input.py）を動かします．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3562110/796dc547-1414-98a3-4982-69b2e602b157.png)



次に1台目のESP32のファイル（output.py）を動かします．


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3562110/9c3e6353-6734-eb58-f5c0-d9b8306b10a9.png)

この時，1台目のESP32は2台目のESP32に信号をGPIO 4から送り，2台目のESP32は以下のようになります．


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3562110/5b759bb0-7091-980e-513f-23b6df709394.png)

そうすると以下の実行結果のようになります．


## 実行結果

1台目のESP32の結果です．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3562110/57510c49-fbea-3c6f-f55c-ad52bce2e2f8.png)


2台目のESP32の結果です．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3562110/cf0f336d-79ee-fb79-e307-0cf538b643e7.png)






# 考察

同期処理の結果は9997ミリで10秒（10000ミリ秒）ではありませんでした．これは1台目のESP32の信号を送受信した時間の差ではないかと考えています．
ACDLを提唱します。その20

# 概要
ACDLとは、アプリは、クラウド、大切なデータは、ローカルです。
アプリ作ったので、plunkerに上げてみた。

# 機能
pngを生成する。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/ec202c89-fb19-752a-2964-255d292c79b9.png)

# 成果物

https://embed.plnkr.co/plunk/2IHXB753k5apRrwE

以上。
ラズパイ5 Ubuntu24にROS2 humbleを入れるガイド

# はじめに
こんにちは、kazuです。
ROS 2 Advent Calendar 2024の1日目は、Ubuntu24でROS2 humbleをsource buildするガイドです。

https://qiita.com/advent-calendar/2024/ros2

※あくまでapt経由でROS 2を入れることができない場合に時間をかけてやる作業です。
aptが使える場合(Ubuntu22とhumble,24とjazzy等)はapt経由で入れることを推奨します。

## 1. とりあえず公式通り進める
rosdepを使い始めるまでは基本的に[公式ページ](https://docs.ros.org/en/humble/Installation/Alternatives/Ubuntu-Development-Setup.html)通りにやっていけば問題ないです
念の為実行するコマンドを載せておきます

locale設定
```bash
locale  # UTF-8か確認します

sudo apt update && sudo apt install locales
sudo locale-gen en_US en_US.UTF-8
sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8
export LANG=en_US.UTF-8

locale  # sudo必要かもしれないです
```

apt関係追加
```bash
# timezoneの設定があるかもです5,78でいけます
sudo apt install software-properties-common
sudo add-apt-repository universe
sudo apt update && sudo apt install curl -y
sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(. /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null
```

必要なパッケージ追加
```bash
sudo apt update && sudo apt install -y \
    python3-flake8-docstrings \
    python3-pip \
    python3-pytest-cov \
    ros-dev-tools \
    python3-flake8-blind-except \
    python3-flake8-builtins \
    python3-flake8-class-newline \
    python3-flake8-comprehensions \
    python3-flake8-deprecated \
    python3-flake8-import-order \
    python3-flake8-quotes \
    python3-pytest-repeat \
    python3-pytest-rerunfailures
```

ROS 2の追加
```
mkdir -p ~/ros2_humble/src
cd ~/ros2_humble
vcs import --input https://raw.githubusercontent.com/ros2/ros2/humble/ros2.repos src
sudo apt upgrade
sudo rosdep init
```

## 2. rosdepに頑張ってもらう
rosdepでは基本的に`ros-humble-◯◯`をaptで入れようとします。
しかしros-humble-*系はUbuntu24.04に対応していないので無理やり書き換える必要があります。

> ほかのプラットフォームでrosdepの依存関係をデバッグしているときや、プラットフォームが実際にとても似ていて、強制される必要があるときや、もちろん自動検索が失敗しているときなどで使えます。

raspberry pi 5では問題ありませんでしたが、他の環境でrosdep installのときに -os=ubuntu:jammyが必要と言われることがあります。原因不明ですがrosdep installの部分で失敗する場合最後に`-os=ubuntu:jammy`を付け足してみてください。

```bash
echo 'export ROS_OS_OVERRIDE=ubuntu:jammy' >> ~/.bashrc
source ~/.bashrc
rosdep update
cd ~/ros2_humble
sudo apt install -y libfastrtps-dev
```
```bash
# 失敗したら最後に -os=ubuntu:jammy を付け足す
rosdep install --from-paths src --ignore-src -r -y --skip-keys "fastcdr rti-connext-dds-6.0.1 urdfdom_headers"
```

## 3. 無限ビルド編
あとはビルドして終わりです。
無限に時間がかかるので時間のあるときにやりましょう。
また時短コマンドを載せておきますが、公式ページ通りでも問題ないです
```bash
cd ~/ros2_humble
colcon build --symlink-install --cmake-args -DBUILD_TESTING=OFF
```

## 4. 動作確認
ビルドが終了したら動作確認をしてみましょう！

```bash
source ~/ros2_humble/install/setup.bash
ros2 run demo_nodes_cpp talker
```

```bash
source ~/ros2_humble/install/setup.bash
ros2 run demo_nodes_py listener
```

# 最後に
nav2の対応が最初はできていなかったり、パッケージがhumble止まりなのにhumble入らない！みたいなケースが結構ありそうなので記事にしてみました。
時間があればaptで入れるros-humble-*を自力で入れる記事も書きたいと思います。
明日は高瀬先生による「極私的ROSCon 2024まとめ」です！

https://qiita.com/advent-calendar/2024/ros2
Ubuntu24.04 dovecotの問題

mysql連携させてるけど、再起動時に接続できない、ログロテート時に接続出来なくなるなどの問題が出ており調べてみたら、再起動時はMySQL起動前に起動しており、MySQLがログロテートした後はdovecotも再起動必要みたいな感じでした。

解決方法は
`# vi /usr/lib/systemd/system/dovecot.service`
```diff
- After=local-fs.target network-online.target
+ After=local-fs.target network-online.target mysql.service
+ Wants=mysql.service
```

`# vi /etc/logrotate.d/mysql-server`
```diff
        postrotate
                test -x /usr/bin/mysqladmin || exit 0
                # If this fails, check debian.conf!
                MYADMIN="/usr/bin/mysqladmin --defaults-file=/etc/mysql/debian.cnf"
                if [ -z "`$MYADMIN ping 2>/dev/null`" ]; then
                  # Really no mysqld or rather a missing debian-sys-maint user?
                  # If this occurs and is not a error please report a bug.
                  #if ps cax | grep -q mysqld; then
                  if killall -q -s0 -umysql mysqld; then
                    exit 1
                  fi
                else
                  $MYADMIN flush-logs
                fi
+                systemctl restart dovecot.service
        endscript
```

合ってるか不明だけど、問題は起こらなくなりました。
Http - Something About Keep-Alive and Time Out

* [HttpClient引起的TCP连接数高的问题分析](https://blog.csdn.net/haicunzaima/article/details/84529735)
* [java socket编程中参数keepalive的含义（客户端和服务端都有这个参数）](https://www.cnblogs.com/qq3511107946/articles/12820268.html)
* [謎之聲對 Connection 說道: 你已經死了！](https://medium.com/starbugs/%E8%AC%8E%E4%B9%8B%E8%81%B2%E5%B0%8D-connection-%E8%AA%AA%E9%81%93-%E4%BD%A0%E5%B7%B2%E7%B6%93%E6%AD%BB%E4%BA%86-b53d27c7ecb7)
* [高并发场景下的httpClient优化使用](https://www.cnblogs.com/study-everyday/p/8508858.html)
* [Apache HttpClient 使用（上）](https://blog.orchidflower.cn/2018/04/23/Apache-HttpClient-Manual/)
* [Apache HttpClient 使用（下）](https://blog.orchidflower.cn/2018/04/23/Apache-HttpClient-Manual-Part2/)
* [httpclient connect timed out](https://blog.csdn.net/weixin_48352162/article/details/117664671)
* [HttpClient连接池的连接淘汰策略分析，以及解决HttpNoResponse异常](https://www.cnblogs.com/wusanga/p/17392445.html)
* [Apache HttpClient Timeout](https://www.baeldung.com/httpclient-timeout)
* [Apache HttpClient TimeOut 設定的方式](https://javainsoft.com/javase/httpclient-timeout/)
* [Ignore DNS Round-Robin for a Reliable Timeout with Spring-ws and 4.5.x Http Client](https://stackoverflow.com/questions/53016710/ignore-dns-round-robin-for-a-reliable-timeout-with-spring-ws-and-4-5-x-http-clie)
* [如何自定义HttpClient的DNS的解析过程](https://juejin.cn/post/7225925643884183608)
Raspberry Pi OS 2024-11-19 / 2024-11-13 Release-note 翻訳

（追記：2025/05/07に、Raspberry Pi OS 2025-05-06 がリリースされています）
https://qiita.com/utaani/items/6f96b1f3da10475100e1
 
 https://downloads.raspberrypi.com/raspios_armhf/release_notes.txt
 
 2024-11-19
  * Bluetooth rfkill ホワイトリストを修正
  * ImagerのNetworkManager WLANのブロック解除を修正
  * Raspberry Piファームウェア a2e586ba98ce68f7d11b1c717ad8329b95dcb3b6
  * Linux kernel 6.6.51 - 5aeecea9f4a45248bcf564dec924965e066a7bfd

 2024-11-13
  * labwc がバージョン 0.7.4 に更新
  * Wayfire のキーバインディングの一部を labwc に移行しました
  * Code the Classics 2 を推奨ソフトウェアに追加しました
  * raspi-config - ブートローダーオプションをいくつか追加
  * バグ修正 - ネットワークプラグインのタイミングの問題によりメニューが表示されないことがあった
  * バグ修正 - マウスとキーボードの値を繰り返し設定するとクラッシュしていた
  * バグ修正 - 非常に遅いマウス速度の設定が可能だった
  * バグ修正 - メインメニューとタスクバーランチャーに一部のアイコンが表示されなかった
  * バグ修正 - なにかの状況で、左クリックの代わりに右クリックのパネルメニューが表示された
  * バグ修正 - ファイルマネージャーのリストビューで複数回ダブルクリックすると、ファイル名の変更ダイアログがエラーで表示されてた
  * バグ修正 - greeter （ログイン画面）の背景グラフィックが復元されました
  * スワップのデフォルトを512MBに増やしました
  * 最新のカーネルの更新に対応するためにinitramfsを設定しました
  * あまり使われておらず、起動が遅くなるので、ifupdown をデフォルトのインストールから削除しました
  * rfkill と NetworkManager はデフォルトですべてのデバイスをブロックします
   -- オンボードアダプタデバイスはホワイトリストに登録されています
   -- WLAN デバイスは規制ドメインの設定後、ブロック解除されます
  * Chromium を 130.0.6723.116 に更新しました
  * Firefox を 132.0 にアップデート
  * ラズベリーパイファームウェア a2e586ba98ce68f7d11b1c717ad8329b95dcb3b6
  * Linuxカーネル6.6.51 - 5aeecea9f4a45248bcf564dec924965e066a7bfd
最新版AndroidStudio起動できない問題(Ladybug Feature Drop | 2024.2.2)

起動しない、Build通らない…諦めるのはまだ早い。
詳しくは有志様が以前に書いており、引用させていただきました。
ありがとうございます。
## 起動しない
最新版をインストール➡クリックしただけなのにエラーが出る

### 旧ユーザーデータが残ってる
##### アンインストールしてもユーザーデータは隠しファイルに残っている。
C:\Users\user\AppData\Roaming\Google
にあるAndroidStudioファルダのこと。
通常は見えない罠。

https://qiita.com/kunisan222/items/38d1207386495f69fcb0

このまま最新版を起動したところで旧プラグインが嚙み合わずエラー。
起動もできないのでAndroidStudio内でバージョンの調整もできない。
日本語版パッチなど起動に必要なものは一旦削除し、
AndroidStudio内でインストールしよう。

https://murui-no-neko-zuki.techblog.jp/archives/18369397.html

## 以前作ったアプリのBuildが通らない
前提として
現在ではjdkよりjbr（JetBrainsランタイム）を使用することが推奨されている。
※jbrはAndroid Studioで提供され、外部からのインストールは不要。

![1212.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3937966/f5fb53e9-2f26-aed1-f160-77677eb13016.png)

Amazon Corretto 11もおすすめ。

https://qiita.com/takumi_links/items/8f7793b0dd7032be7de8

##### ※jdkのバージョンは合わせないとエラーがでるぞ。

![18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3937966/4e253114-aa0b-3150-066d-669462a20744.png)


![181.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3937966/05d60771-1074-8146-8f43-34f3005a60b7.png)
## 旧バージョンのUIがいい
Classic UIプラグインで可能
![2025-01-17 081025.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3937966/df1cdcd2-b1ba-d334-e756-102f932cf5da.png)


## おまけ⓵:build.gradle.ktsの記述
以前と変わっていたのでとりあえず動くメモ書き
tomlで設定されている
```toml:libs.versions.toml
[versions]
com = "1.6.20"
[plugins]
kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "com" }

```
```kotlin:build.gradle(Project)
plugins {
    alias(libs.plugins.android.application) apply false
    alias(libs.plugins.kotlin.android) apply false
    alias(libs.plugins.kotlin.serialization)apply false
}
```
```kotlin:buildgradle(Module)
    alias(libs.plugins.android.application)
    alias(libs.plugins.kotlin.android)
    alias(libs.plugins.kotlin.serialization)
}
android {
    namespace = "com.example.アプリ名"
    compileSdk = 35

    defaultConfig {
        applicationId = "com.example.アプリ名"
        minSdk = 28
        targetSdk = 35
        versionCode = 1
        versionName = "1.0"

        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
    
    //#・・・
//#中略
//レイアウトが簡単になるおススメ
//推奨されているがデフォルトで入っていない
buildFeatures {
        viewBinding =true
        dataBinding =true
    }
}
dependencies {
    //#・・・
```
## おまけ⓶:アクセス権限
2024/1/17 追記

https://qiita.com/A42/items/e9024ddacef6666cfb24
vite-tsconfig-pathsを使ったエイリアス設定方法

`vite-tsconfig-paths`を使用すると、ViteプロジェクトでTypeScriptのパスエイリアスを簡単に設定できます。以下に、その手順と具体的なインポート例を説明します。

## 1. `vite-tsconfig-paths`を使ったエイリアス設定方法

### ステップ1: パッケージのインストール

まず、開発環境に`vite-tsconfig-paths`をインストールします。

```bash
npm install -D vite-tsconfig-paths
```

### ステップ2: `tsconfig.json`の設定

次に、プロジェクトのルートディレクトリにある`tsconfig.json`ファイルに、エイリアスの設定を追加します。

```json
{
  "compilerOptions": {
    "baseUrl": "./",
    "paths": {
      "@/*": ["src/*"]
    }
  }
}
```

この設定により、`@/`を`src/`ディレクトリに対応させることができます。

### ステップ3: `vite.config.ts`の設定

最後に、`vite.config.ts`ファイルで`vite-tsconfig-paths`プラグインを読み込み、Viteのプラグインとして登録します。

```typescript
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
import tsconfigPaths from 'vite-tsconfig-paths';

export default defineConfig({
  plugins: [
    react(),
    tsconfigPaths()
  ]
});
```

これにより、`tsconfig.json`で設定したパスエイリアスがViteのビルドプロセスでも適用されます。

## 2. `src/App.tsx`でのインポート例

上記の設定を行った後、`src/App.tsx`でのインポートは以下のように記述できます。

```typescript
import React from 'react';
import Header from '@/components/Header';
import Footer from '@/components/Footer';
import { fetchData } from '@/utils/api';

const App: React.FC = () => {
  // コンポーネントのロジック
  return (
    <div>
      <Header />
      {/* 他のコンポーネントや要素 */}
      <Footer />
    </div>
  );
};

export default App;
```

ここで、`@/`はプロジェクトの`src/`ディレクトリを指しています。したがって、`@/components/Header`は`src/components/Header`を、`@/utils/api`は`src/utils/api`をそれぞれ参照します。このようにエイリアスを使用することで、深い階層の相対パスを避け、コードの可読性と保守性を向上させることができます。

以上の手順で、`vite-tsconfig-paths`を使用したエイリアス設定と、その具体的なインポート方法を実現できます。
初心者向け！MacでRails環境を最短で構築する方法

## はじめに
こんにちは、エンジニア一年目の新井です！最近Railsを学ぶということで早速トライしてみることにしました。

でも最初につまずいたのが…そう、「環境構築」！もう、なんかややこしい！ そこで今回は、MacでRails環境をゼロから構築するまでの手順をまとめてみました。同じく初心者の人、一緒に一歩ずつ進めていきましょう！

### 1. Homebrewをインストールしよう
まずは、Macで便利なパッケージマネージャーHomebrewをインストールします。これは「いろいろなツールをサクッとインストールできるアプリ」みたいな感じで、これがないと始まらないみたい。

やり方
ターミナルを開いて、以下のコマンドをコピペしてエンター！これでHomebrewのインストールが始まります。
``` bash
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```
しばらく待ったら、以下のコマンドでちゃんと入ったかチェックします。

```bash
brew -v
```
無事にバージョン情報が表示されれば、成功！さっそく次に進みます。

### 2. rbenvでRubyをインストールしよう
次は、RailsのベースになるRubyをインストールします。RailsはRubyで動いてるので必須なんです。で、ここで登場するのがrbenv。これを使うと、Rubyのバージョン管理がめっちゃ楽になるらしい。

やり方
Homebrewでrbenvをインストールします。

```bash
brew install rbenv
```
インストールしたら、次にrbenvをシェルに登録。以下をターミナルに入力して、設定を反映させます。


```bash
echo 'eval "$(rbenv init -)"' >> ~/.zshrc
source ~/.zshrc
```
次は、Rubyのインストール！最新の安定版を指定してインストールします。

```bash
rbenv install 3.0.0  #（最新バージョンを確認して使ってください！）
rbenv global 3.0.0
```
最後にちゃんと入ったか確認！

```bash
ruby -v
```
### 3. Node.jsとYarnもセットアップ
RailsはJavaScriptとも相性がいいので、Node.jsとYarnも入れちゃいます。これもHomebrewでサクッといきましょう。

やり方
Node.jsのインストール

```bash
brew install node
```
Yarnのインストール

```bash
brew install yarn
```
ちゃんと入ったか確認です。

```bash
node -v
yarn -v
```
### 4. Railsをインストールしてアプリを作ってみる
いよいよRails本体のインストールです！そして、そのままRailsアプリを作成してみましょう！

やり方
以下のコマンドでRailsをインストールします。これで準備万端！

```bash
gem install rails
```
Railsが無事にインストールされたか確認します。

```bash
rails -v
```
次に、Railsで新しいアプリケーションを作成してみましょう。以下のコマンドでアプリを作成します（ここではmy_first_appという名前にしてます）。

```bash
rails new my_first_app #アプリ名
cd my_first_app  #ディレクトリ作成
```
できたら、Railsサーバーを起動して確認します！

```bash
rails server 
```

コマンドを入力したらブラウザを開いてhttp://localhost:3000にアクセスし、Railsのウェルカムページが表示されれば大成功です！
(controlキー + c でサーバーの起動を停止できます。）

### 5. PostgreSQLのインストールとデータベース設定
最後に、データベース管理のためにPostgreSQLをインストールします。これでアプリでのデータ保存が可能になります！

やり方
HomebrewでPostgreSQLをインストール

```bash
brew install postgresql
```
インストール後、PostgreSQLサービスを起動！


```bash
brew services start postgresql
```
PostgreSQLに接続して、Railsアプリ用のデータベースを作成します。

```bash
psql postgres
CREATE DATABASE my_first_app_development;
```
config/database.ymlファイルでデータベース名を確認し、設定が合っているかチェック！

最後に以下のコマンドでデータベースをマイグレーションします。

```bash
rails db:migrate
```
おわりに
これでMac上にRailsの開発環境が整いました！初めての環境構築は少しドキドキしましたが、これでなんとかRailsアプリの開発が始められます。もし同じように「環境構築どうしよう…」と悩んでいる初心者の方がいたら、ぜひこの手順を参考にしてもらえると嬉しいです！
Pythonでスクレイピングをしていた時に対象の要素にスクロールして要素を取り直す

# はじめに

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

PythonとSeleniumを使用してスクレイピングをしていたのですが、数秒待ってからかつ、スクロールをしないと要素がクリックできない、という状況があり困ったことがあったので記事にしました。

# 内容

以下のようにElementをとってきて、そのElementのところにスクロールをしてからSleepを１０秒させた後にクリックする処理を作成しました。

```python
 # elementをとる
element = wait.until(EC.presence_of_element_located((By.XPATH, "(//div[contains(@class, 'button')])[3]//a")))
 # スクロールする
driver.execute_script('arguments[0].scrollIntoView({behavior: "smooth", block: "center"});', element)
 # 10秒待つ
sleep(10)
 # クリックする
element.click()
```
しかし、この場合だとelementが古いままでクリックした時に新しい情報が取って来れなかったので以下のようにSleepした後に再度Elementを取得するように修正しました。

```python
 # elementをとる
element = wait.until(EC.presence_of_element_located((By.XPATH, "(//div[contains(@class, 'button')])//a")))
 # スクロールする
driver.execute_script('arguments[0].scrollIntoView({behavior: "smooth", block: "center"});', element)
 # 10秒待つ
sleep(10)
 # 再度elementをとる　← 追加
element = wait.until(EC.presence_of_element_located((By.XPATH, "(//div[contains(@class, 'button')])//a")))
 # クリックする
element.click()
```

これで無事今回の問題を解決することができました。

# おわりに

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

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

# 参考

https://qiita.com/mochi_yu2/items/bfca3be05dfc1cd41853
Laravelをデプロイしたときに出るPermission denied

Laravelで開発したことある人はよく見かける下記のエラー

```Bash:error.log
The stream or file "/hogehoge/storage/logs/laravel.log" could not be opened: failed to open stream: Permission denied
```

起こる度に
あれ？どうやるんだっけ？と検索しており備忘録として残します。

## まずはじめに

よくサイトで`sudo chmod 777`にすれば解決！
と見かけるのですが辞めましょう。
実際にエラーは解決されますが別の問題が発生します。
`777`は全てのユーザーに「読み取り」「書き込み」「実行」の権限を渡すということになります。
不正に侵入できたりファイルの編集や実行されてしまいます。

## じゃどうしたらいいの？

問題ないであろう権限付与が下記になります。

**今回はEC2にデプロイしWebサーバを`apache`を使用した想定で書いています。
各々で`nginx`(もしくは`www-data`)に変更してください。**

```Bash:bash
#該当のディレクトリに移動
$ cd /var/www/[プロジェクト名]

#任意のユーザーをApacheグループに追加
$ sudo usermod -a -G apache ec2-user(任意のユーザー)

#ディレクトリの所有者を任意のユーザー、グループをapacheに変更
$ sudo chown -R ec2-user(任意のユーザー):apache .
```

* usermod
ユーザーの情報を変更するコマンドです。

* -a
既存のグループを維持しながら、ユーザーを新しいグループに追加します。

* -G apache
該当ユーザーを apache グループに追加します。

* ec2-user(任意のユーザー)
対象のユーザー名です。
現在ログインしているユーザーをグループに追加したい場合は
`$USER`もしくは上記のように直接指定してください。

:::note warn
-a を省略すると、ユーザー(今回だとec2-user) の既存グループ情報が上書きされ、apache グループ以外のグループから外れてしまいます。
:::


```Bash:bash
# プロジェクトの権限を設定
$ sudo find . -type f -exec chmod 664 {} \;
$ sudo find . -type d -exec chmod 775 {} \;
```

* find .
現在のディレクトリ「.」以下の全てのファイルやディレクトリを検索します。
* -type f
検索結果をファイルのみに限定します。
* -exec chmod 664 {} \;
見つかったファイルに対して、chmod 664 コマンドを実行します。
{} は、find コマンドで見つかった各ファイル名を指します。
\; は、-exec オプションの終了を意味します。

* 664
所有者とグループは読み取りと書き込みが可能になり、その他のユーザーは読み取りのみが可能となります。

```Bash:bash
# ストレージとキャッシュへの読み取りと書き込みの権限を設定
$ sudo chgrp -R apache storage bootstrap/cache
$ sudo chmod -R 770 storage bootstrap/cache
```

* chgrp
ファイルやディレクトリのグループ所有権を変更するコマンドです。
* -R
再帰的に操作を行い、指定したファイルやディレクトリが対象になります。
* 770
所有者とグループにフルのアクセスを許可しますが、その他のユーザーはアクセスできません。


## コマンドまとめ
```Bash:bash
#該当のディレクトリに移動
$ cd /var/www/[プロジェクト名]

#任意のユーザーをApacheグループに追加
$ sudo usermod -a -G apache ec2-user(任意のユーザー)

#ディレクトリの所有者を任意のユーザー、グループをapacheに変更
$ sudo chown -R ec2-user(任意のユーザー):apache .

# プロジェクトの権限を設定
$ sudo find . -type f -exec chmod 664 {} \;
$ sudo find . -type d -exec chmod 775 {} \;

# ストレージとキャッシュへの読み取りと書き込みの権限を設定
$ sudo chgrp -R apache storage bootstrap/cache
$ sudo chmod -R 770 storage bootstrap/cache
```

## 最後に

権限周りの知見が浅いので
「こうした方がいいよ！」「ここ間違っているよ！」等ありましたら
ご指摘いただけると助かります。

## 追記 2024/11/21

:::note warn
composer install前に上記を行うとPermission deniedが発生します。
後に行ってください。。
:::
Windows 11 Home で Hyper-V を有効にする方法

　ここでは Windows の Hyper-V を有効にする方法を紹介します。解説を始める前にこの記事を作成するときに使用した Windows PC の環境をここに示します。
　ここでは **お使いのコンピューターのプロセッサ情報も確認することができます。**
<img src='https://i.imgur.com/qCpnHYT.jpeg'/>

|||
|:---:|:---:|
|OS|Windows 11 Pro|
|バージョン|23H2|

::: note
Windows Home エディションでも動作することを確認していますが、一部環境では BIOS の CPU 仮想環境の設定をする必要があるかもしれません。
:::

## Hyper-V を有効にする方法
  はじめに**Windows Home に Hyper-V をインストールするバッチファイル** を作成します。バッチファイルとは簡単にいうと Windows システム上で使用できるコマンドを組み合わせたプログラミング言語です。ここではバッチファイルのコーデイングスキルは問われないのでご安心ください。
　VSCode をインストールしていない場合、以下のサイトを参考にして VScode をインストールしてください。


https://qiita.com/GAI-313/items/f3d4722ebeda5ea195d1


 ここでは VSCode をつかってバッチファイルを作成し、バッチプログラムを実行する方法を解説します。
　VSCode を起動して、「ファイル」タブの「新しいファイル」をクリックして、新規ファイルを作成します。

> キーボードショーっとカットキーで ***「Control + ALT + Windows + N」*** で素早く新規ファイル作成することができます。

<img src="https://i.imgur.com/lO5feTL.png" />

　するとこのようにファイル名を入力するバーが表示されるので、ここに **末尾（拡張し）が `.bat` で終わるファイル** を作成してください。ここでは
```
hyper-v-setup.bat
```
という名前にしました。確定したらエンターキーを押してください。
<img src="https://i.imgur.com/mNqxTnU.png" />

ファイルを保存する場所を指定する画面が表示されます。ファイルを保存する場所ですが、フォルダ名が **あなたのユーザー名** の部分に保存してください。下の画像ではモザイクになっている部分がユーザー名になります。保存先を確定したら ***「ファイルを作成」*** をクリックしてファイルを作成してください。
<img src="https://i.imgur.com/5fAIHLz.png" />

すると、VSCode に戻り、このような画面が表示されます。ここが VSCode のファイル編集画面になります。
<img src="https://i.imgur.com/aAj7bl2.png" />

以下のバッチプログラムをコピペしてください。
```bat
pushd "%~dp0"

dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hyper-v.txt

for /f %%i in ('findstr /i . hyper-v.txt 2^>nul') do dism /online /norestart /add-package:"%SystemRoot%\servicing\Packages\%%i"
del hyper-v.txt

Dism /online /enable-feature /featurename:Microsoft-Hyper-V -All /LimitAccess /ALL
```
<img src="https://i.imgur.com/C5Cf6QU.png" />

コードをコピペしたらキーボードショートカットキー ***「Control + S」*** をするか、「ファイル」タブの「保存」をクリックしてバッチプログラムを保存してください。
<img src="https://i.imgur.com/71A2262.png" />

　つぎに、スタートメニューを起動して PowerShell を **管理者権限** で起動してください。
<img src="https://i.imgur.com/wjHTyZh.png" />

起動した PowerShell に以下のコマンドを実行して「ホームディレクトリ」に移動します。
```bat
cd $env:USERPROFILE
```
そして、咲くほど作成したバッチプログラムをここで実行します。実行方法は
```bat
.\ファイル名.bat
```
です。ここでは `hyper-v-setup.bat` という名前にしたので、このように書きます。
```bat
.\hyper-v-setup.bat
```
入力したらエンターキーを押してプログラムを実行してください。すると、このように Hyper-V を有効にするためのプログラムが動作します。時間がかかるのでしばらくお待ちください。
<img src="https://i.imgur.com/io9CcTw.png" />

プログラムが終了すると PowerShell 上で **`今すぐコンピューターを再起動しますか？`** と表示されるので、ここに **"y"** と入力してください。するとコンピューターが再起動します。
<img src="https://i.imgur.com/3DhH36T.png" />

　再起動中一部プログラムの更新が行われるため、何回か再起動を繰り返すことがあります。ログイン画面が表示されるまでしばらくお待ちください。

---

　再起動したらスタートメニューを開いて、***「Hyper-V」*** と入力してください。このとき、**Hyper-V マネージャー** アプリが表示されたらインストール成功です！
 <img src="https://i.imgur.com/Qotoqsh.jpeg" />
リストのビュー内のアイテムのグループ化

**使っているクラウドなどの小ネタ Advent Calendar 2024 9日目**


リストのビューでデフォルトでグループ化を設定したい

以下の設定でグループ化はできるのですが、毎回設定しないといけない。デフォルトとしての設定はどこにあるのだろう？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/f9085538-e4b6-2177-1eef-9bf9eb668f96.png)

# 設定方法

すべてのアイテム　> 現在のビューを編集

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/fa2a589f-7599-7b13-52db-83877978f0bc.png)

下の方にスクロールするとグループ化がある

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/a2b1a914-85e0-3e19-26f5-f540ca8f98cb.png)

ここで設定して保存すればデフォルトとして動作します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/e5dec96e-e308-20e5-808d-4c8b76899bf0.png)
ボーレートジェネレート

8080やZ80で使われていたシリアル通信用のチップの8251はボーレートに合わせたクロックが必要です。

クロックは1倍、16倍、64倍のいずれかです。

たとえば9600の通信の通信の場合、9600,153.6K,614.4kのいずれかになります。16倍がよく使われます。

このクロックは以下の方法で作ります。

* 専用のクロックチップを使う
* CPUクロックを分周する
* 74HC4060に水晶をつけて作る
* PICなどのマイコンで作る

最近はシリアルはUSBのCDCで変換して使うことが多いです。

PIC16F1455はCDCが実装でき、他の機能を付けることも出来ます。これで作ってみます。

CDCのコードはこちらのページのコードを利用させてもらいました。

http://www.yts.rdy.jp/pic/1455/1455.html#usb_uart

PICでクロックを発生させるにはPWMを使うのが良さそうです。PWMについては以下のページが参考になりました。

http://machoto2.g2.xrea.com/page/P16F1455/P16_K13.htm

タイマーや割り込みを使って、ソフトウエアでクロック出力を作る事もできますが、USBの処理に干渉する可能性もあり、ハードで処理するPWMが一般的なのかと思われます。

TRISCのRC3を出力にして初期化に以下を追加します。

```
    T2CON = 0b00000100;
    PR2 = 0x4d;
    PWM2CON = 0b11000000;
    PWM2DCH = 0x20;
```

RC3の出力は以下のようになりました。

![IMG_20241120_082450.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/0653b240-ec77-5227-43ff-133acc0963b4.jpeg)

誤差は1%以下です。

Z80を6MHzで動かすつもりなので、8251にはクロックをそのままは入れられないので、8251のCLKもPICで作ってみます。TRISAのRA4をOUTにして、

```
   CLKRCON = 0xd4;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/7d220742-7c06-2bea-48c5-c0606830f268.png)

を設定すると、CLKRのRA4から3MHzが出力されます。48MHzの16分周です。

PIC16F1455には他にCLKOUTの機能もあり、これを使うと12MHzが出力されます。

すでに同じようにやっている方がいるようです。

組み立ててみて、残念ながらうまく動作しません。気長に調べるつもりです。
Delta Live Tablesのクエリー履歴とクエリープロファイルがサポートされました

こちらのアップデートです。

[**Delta Live Tablesにおけるクエリー履歴とクエリープロファイルがサポート**](https://docs.databricks.com/en/release-notes/product/2024/november.html#query-history-and-query-profile-support-for-delta-live-tables)

> Delta Live Tablesパイプラインのクエリーのパフォーマンスを監視するために改善されたツールを提供するようになりました。[Delta Live Tablesパイプラインのクエリー履歴へのアクセス](https://docs.databricks.com/ja/delta-live-tables/dlt-query-history.html)をご覧ください。

早速試してみます。

:::note info
**プレビュー**
本機能は[パブリックプレビュー](https://docs.databricks.com/release-notes/release-types.html)です。
:::

# 有効化

ワークスペースの**プレビュー**にアクセスし、**Query History & Profile for DLT**がオンになっていることを確認し、有効化されていない場合には有効化します。

![Screenshot 2024-11-20 at 8.57.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/815e0aa6-e933-7a19-6bdf-fee73f1873dc.png)

# ウォークスルー

[サンプルのパイプラインノートブック](https://docs.databricks.com/en/_extras/notebooks/source/dlt-babynames-sql.html)を準備します。

パイプラインを作成します。この際に、チャンネルは**プレビュー**を選択しておく必要があります。

![Screenshot 2024-11-20 at 8.52.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/24c55a3d-19e4-1bf6-e884-b313e15070c2.png)

パイプラインの画面下に**クエリー履歴**があります。パイプラインを実行すると、パイプラインに含まれているクエリーの履歴が表示されるようになっています。

![Screenshot 2024-11-20 at 8.53.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/d010b294-8a86-cfb4-0350-cfc38b57ea42.png)

クエリーのメトリクスやプロファイルにアクセスできるようになっています。

![Screenshot 2024-11-20 at 8.54.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/fab1338c-3835-db05-0522-57e515d1e0bc.png)

![Screenshot 2024-11-20 at 8.54.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/c90d190d-72fb-218d-319c-ca781e4a3f66.png)
![Screenshot 2024-11-20 at 8.55.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/23e1c6b8-b17c-78c7-0366-b99e3ef7e163.png)

データパイプラインのパフォーマンスチューニングに活用できる機能ですので、是非ご活用ください。

なお、サイドメニューの**クエリー履歴**にアクセスし、**クラスター**で**DLT**を選択することでも、DLTのクエリー履歴を表示する事ができます。

![Screenshot 2024-11-20 at 8.55.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/c70c31b4-a094-772f-8ed9-b30314a7e8b1.png)


### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)