OmniAICreator/Qiita-1.07M huggingface dataset:
Sassのmixinを作ってみた

# はじめに

CSS（Sass）を書いていて、
『何度も同じスタイルを書く・・・😮‍💨』
『必要なプロパティが漏れていて、表示してくれない・・・😰😰』
『毎回、都度調べ直さないといけない・・・😫😫😫』
なんてことはありませんでしょうか？

そんなことを防ぐために、サービス内共通で使用できる**mixin**を作成いたしました。
今回はその一部をご紹介したいと思います😊

mixinを作成するにあたり、さまざまなサイトを参考にさせていただきました。
この場をお借りしてお礼を申し上げます✨

# 作ってみたmixinたち

## 疑似要素（::before, ::after）で画像を表示するmixin

疑似要素で画像を表示させるときに必要なプロパティをまとめました。
これで、`content: "";`がなくて表示してくれない！！ということが防げるかもです😊

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54595/c07c0ad0-b4ef-fc12-c030-a3bada1ccfba.png)


:::note info
**画像名 、幅、高さ、position（上、右、下、左）、z-index**を設定できます。
画像名、幅、高さは必須です。position・z-indexは任意です。
「null」のままの場合、プロパティは書き出されません。
引数は省力できますが、省略しない場合は、順番を入れ替えても使用できます。
親要素に`position: relative;`を指定してください。
:::

| 引数 | 指定内容 |
|:--|:--|
| $img-name |  PNGファイルの画像名 |
| $width | 画像の横幅 |
| $height | 画像の高さ |
| $top | position（上）位置（※指定は任意） |
| $right | position（右）位置（※指定は任意） |
| $bottom | position（下）位置（※指定は任意） |
| $left | position（左）位置（※指定は任意） |
| $z-index | z-index（※指定は任意） |

### ▽mixin

```scss
@mixin pseudo-img($img-name, $width, $height, $top: null, $right: null, $bottom: null, $left: null, $z-index: null) {
    position: absolute;
    top: $top;
    right: $right;
    bottom: $bottom;
    left: $left;
    z-index: $z-index;
    margin: auto;
    width: $width;
    height: $height;
    background: url("#{$img-path}#{$img-name}.png") center / contain no-repeat;
    content: "";
}
```

### ▽使用例
```scss
$img-path: "◯◯◯/◯◯◯/"; // 画像のルートパスを指定

.mainvisual {
    position: relative;
    &::before {
        @include pseudo-img(mainvisual, 100px, 150px, $top: null, $right: -50px, $bottom: 10px, $left: null, $z-index: 2);
    }
}
```

このmixinだと、PNGファイルしか使用できないので、引数に拡張子を含めるほうが汎用的かもしれないなと作成してから気が付きました💦（反省）

## カラム計算用（余白あり・多段OK）mixin

カード型デザインなどに使えそうなmixinを作成いたしました。
これで、細かい計算をしなくて済むかもです😊

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54595/87a8eaca-df30-40eb-9746-b582f1ba3e0a.png)


:::note info
カラム数、全体サイズ、余白サイズを設定できます。
計算させたい**親**に指定してください。子要素が分割いたします。
:::

| 引数 | 指定内容 |
|:--|:--|
| $num | カラム数 |
| $size | 全体サイズ |
| $gap | 余白サイズ |

### ▽mixin

```scss
@mixin column-gap-item($num, $size, $gap) {
    $gap-all: #{$gap} * ($num - 1);
    display: flex;
    flex-wrap: wrap;
    gap: $gap;
    & > * {
        width: calc((#{$size} - #{$gap-all}) / #{$num});
    }
}
```

### ▽使用例
```scss
.list {
    @include column-gap-item(2, 100%, 10px);           
}
```

## マーカー線用mixin

マーカーのような線を引きたいときに使用します。
これで、毎回調べなくても済むかもです😊

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54595/5fa56b28-9095-9f48-3de5-7bc92979d625.png)


:::note info
色と高さを設定できます。
デフォルトのままだと、黄色マーカー線になります。
:::

| 引数 | 指定内容 |
|:--|:--|
| $color | 色（初期値は黄色です） |
| $height | マーカーの太さ（数値が大きいほど細くなります） |

### ▽mixin

```scss
@mixin marker-line($color: #fe0, $height: 65%) {
    display: inline;
    background: linear-gradient(transparent $height, $color 0%);
}
```

### ▽使用例
```scss
.text__line {
    @include marker-line(#ff7676, 70%);            
}
```

## さいごに

いかがでしたでしょうか？
ご紹介したmixinは一部ですが、少しでもコードを書く時間が短縮できたらと思い作成してみました。
本記事を読んでみて、普段の業務に活かせそうでしたら幸いです😊
Salesforceの標準項目、ページレイアウト、Lightningアプリケーションビルダーについて分かりやすく解説してみた

こんにちは
本橋孝昭です

今回は
・標準項目、カスタム項目
・ページレイアウト
・Lightningアプリケーション

の内容について見ていきます

## そもそも項目とは？

項目についての詳細はこちらの記事をご確認ください

https://qiita.com/Takaa/items/fa7db2456889c3ce76c1

ここでいうようにイメージで言うとエクセルの列のようなものが項目です

その項目ですが大きく
・標準項目
・カスタム項目
の２つございます


まずはこの項目の種類の違いについて紹介します

## 標準項目とは

・標準項目はオブジェクトがある時点でもともと存在する項目です
（つまりSalesforceがあらかじめ気を利かせて？用意してある項目です）
例えば企業情報を管理するオブジェクト「取引先」オブジェクトには
・Webサイト
・従業員数
・年間売上
のような標準項目が用意されています
（取引先＝会社情報を管理するためなので、このような一般的によく使いそうな項目があるのは便利ですね）

なお、標準項目はもともとSalesforceに存在する項目なので便利な反面、標準項目を削除することはできません
（後述しますが標準項目の削除そのものは出来ないですが非表示にすることは可能です）

削除ができないという制限のある標準項目ですが、標準項目では以下のような設定変更が可能です

1.項目の表示ラベルの変更（※注意　すごく分かりにくいところで変更可能）
（例　取引先の標準項目「WEBサイト」から「ウェブサイト」に変更や「ホームページ」に変更など）
↑こちらは「タブと表示ラベル」から設定変更可能です

2.選択リスト値の追加
（例　取引先の標準項目「業種」に「Services」の選択肢追加）

3.ヘルプテキストの追加
（例　標準項目Webサイト　から「ここに企業のホームページのリンクを記載してください」のような注意書きの作成が可能）

## カスタム項目とは

なお、カスタム項目はSalesforce環境に後から追加した項目です
こちらのカスタム項目については削除は出来るのはもちろんですが
・デフォルトの項目値の設定が可能
・項目型の変更が可能

など、標準項目よりも設定変更が可能な項目となります

項目には項目型がありますがカスタム項目は標準項目と違い
・積み上げ集計項目
・数式項目
などの項目型の項目も作成可能です


## ページレイアウトとは
さて、項目について学んだあとはページレイアウトについて解説します

ページレイアウトとはレコードに表示させる項目や関連リストなどの表示や非表示、並び替えを行うものです

（関連リスト　とは親オブジェクトから見た子オブジェクトの見える場所のことです。親オブジェクトや子オブジェクトについての解説はこちらからご確認ください↓）

https://qiita.com/Takaa/items/508ffb49496dbd0ebff6


ページレイアウトの仕組みとしては、添付画像のように上部分に「パレット」というものがございます
こちらの「パレット」にある項目や関連リストをドラッグ&ドロップして項目追加や非表示を行います

![ボタン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/b5bc2381-376d-9980-8ab2-bbb85a22c46e.png)

ページレイアウトで設定を行えば項目の見せる見せないや関連リストの見せる見せないの設定が分かりましたね
なお、標準項目を見せたくない（使いたくない）場合はページレイアウトから項目を抜くことにより基本的に見せなくすることが可能です


## Lightningアプリケーションビルダーについて

さて、画面の見え方についてClassic環境を使う場合は基本的にレコードの見え方＝ページレイアウト　だったのですが、Lightnig環境の場合、レコードの見え方はLightningアプリケーションビルダーの設定によります
Lightningアプリケーションビルダーではコンポーネントと呼ばれるブロックを配置してページを形作ります
（先ほど紹介したページレイアウトもコンポーネントの１つです）

つまりClassic環境ではこのような見え方のイメージだったのですが

![クラシック見え方.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/fb6de225-dd5e-6622-6133-8c8892c4de36.png)


Lightning環境ではこのような見え方になります

![ライトニング見かた.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/170a5e45-d2ea-48f4-65f7-51b0fbb28362.png)

※Lighnting環境はページレイアウトはあくまでもコンポーネントの１構成要素です。Lightninngアプリケーションからページレイアウトを抜くことも可能です

Lightningアプリケーションについて確認したところでプラスアルファの設定についてお伝えします


1 Lightningアプリケーションはコンポーネントごとに
・どのレコード条件が
・どのデバイスからか
・どのユーザ設定か
によってコンポーネントを見せるor見せない　が設定可能


2Lightningアプリケーションは
・どのアプリケーションで見せるか
・どのレコードタイプで見せるか
・どのプロファイルで見せるか

の設定変更が可能です

![どのアプリ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/f77c94ab-2ce3-d286-7be9-e388f90fa562.png)

ぜひこちらのLightningアプリケーションの設定を使いこなし、ユーザにとってどのような見え方が適切か考えましょう。
★ 7 ステップで完了 ★ Ruby で Discord Bot 作成

# 前提

* Bot を動かすための PC があること
  * 自身の PC でも問題ないが，24 時間稼働させたい場合にはレンタルサーバーなどを利用するほうが経済的な可能性がある
* Ruby の実行環境があること
* Ruby で for 文程度まで書けること

# 1. `discordrb` をインストール

* `discordrb`: Ruby を使用した Discord API

1. 下記コマンドを実行
    1. **Windows**
        ```bash
        > gem install discordrb --platform=ruby
        ```
    1. **Mac**
        ```bash
        $ gem install discordrb
        ```

# 2. Application を作成

1. [Discord Developer Portal](https://discord.com/developers/docs/game-sdk/applications) にアクセス
1. `Applications` > `New Application`
1. `NAME` に bot 名を入力
    1. Discord 上で表示される名前 
1. 各種項目に同意して `Create`
1. 作成した Bot の詳細画面に自動で遷移する

# 3. `CLIENT ID` と `TOKEN` を取得

1. Discord Bot の詳細画面にアクセス
1. 左メニューの `OAuth2`
1. `CLIENT ID` をメモ
1. 左メニューの `Bot`
1. `TOKEN` の下にある `Reset Token`
1. 表示された `TOKEN` をメモ
    1. これらの情報は第三者に漏洩しないよう留意する

# 4. `MESSAGE CONTENT INTENT` を有効化

1. Discord Bot の詳細画面にアクセス
1. 左メニューの `Bot`
1. `MESSAGE CONTENT INTENT` を有効化する
    1. 有効化しない場合，Discord Server に追加された Bot が，チャンネルに送信されたメッセージの内容を取得できない

# 5. Discord Server に Bot を招待

1. Discord Bot の詳細画面にアクセス
1. 左メニューの `OAuth2` > `URL Generator`
1. `SCOPES` の `bot`，`BOT PERMISSIONS` の `Administrator` を順に選択
1. `GENERATED URL` をコピーしてアクセス
1. 手順に従って任意の Discord Server に Bot を招待

# 6. Ruby ファイルを作成

1. 任意のディレクトリに移動
1. 任意の名前で `.rb` ファイルを作成
    1. ここでは `run.rb` とする
1. `run.rb` に下記の通りに記述
    ```ruby
    require 'discordrb'
    
    # 先ほどメモした CLIENT_ID と TOKEN を文字列で記述
    CLIENT_ID = "000000000000000000"
    TOKEN = "XXX"
    
    # Bot を作成
    bot = Discordrb::Bot.new(client_id: CLIENT_ID, token: TOKEN)
    
    # メッセージの投稿に反応して実行するメソッドを定義
    bot.message do |event|
      event.send_message("Hello.")
    end
    
    # Bot を実行
    bot.run
    ```

# 7. Ruby ファイルを実行

1. 下記コマンドで `.rb` ファイルを実行
    ```bash
    ruby run.rb
    ```
1. Bot を招待した Discord Server で，Bot のステータスがオンラインになっていれば成功
1. 任意のチャンネルに任意のメッセージを送信すると，Bot が「Hello.」と送信する

# 補足

* `discordrb` の仕様については下記参照
    * https://www.rubydoc.info/github/meew0/discordrb/Discordrb
CyberAgentが公開した日本語LLMをGoogle Colabで動かす方法

# 概要

機械学習の開発などを行なったことがない場合、そもそもどうすればいいのかまったく分からなかったので、やり方まとめました。
分かってしまえば非常に簡単です。
内容は浅いので、感触を掴んだら別の専門記事を探してください。

# 準備

## Google Colab Pro

Google Colab Pro のアカウントを作成する。

https://colab.research.google.com/signup/pricing?hl=ja

Pro じゃなくても大丈夫かもしれませんが、GPU を使うので Pro を契約しておくのが安心です。

## モデルの確認

使用したいモデルのサイズを確認してください。

https://huggingface.co/cyberagent

7B だと約 7GB になります

## Google Colab のランタイムタイプの選択

`必ずGPUを含めてください。`
今回試した条件は下記になります。

- GPUタイプ：A100
- ランタイムの仕様：ハイメモリ

上記条件にしないと、ハードウェア周りでエラーが多発します。

# Google Colab で動かす

以下のスクリプトを Google Colab で実行してください。

※補足：PyTorch は既に Google Colab 環境に含まれているので別途インストールしなくても大丈夫です。

```sh
!pip install transformers accelerate
```

```python
from transformers import AutoModelForCausalLM, AutoTokenizer

model = AutoModelForCausalLM.from_pretrained("cyberagent/open-calm-7b", device_map="auto", torch_dtype=torch.float16)
tokenizer = AutoTokenizer.from_pretrained("cyberagent/open-calm-7b")

inputs = tokenizer("AIによって私達の暮らしは、", return_tensors="pt").to(model.device)
with torch.no_grad():
    tokens = model.generate(
        **inputs,
        max_new_tokens=64,
        do_sample=True,
        temperature=0.7,
        top_p=0.9,
        repetition_penalty=1.05,
        pad_token_id=tokenizer.pad_token_id,
    )
    
output = tokenizer.decode(tokens[0], skip_special_tokens=True)
print(output)
```

python のコードは、各モデルの Usage に書いてあるコードです。
動作しない場合は最新のサンプルコードを確認してください。

https://huggingface.co/cyberagent/open-calm-7b

実行するとモデルがダウンロードされ、「AIによって私たちの暮らしは、」の続きが生成されているのが確認できると思います。

GPT-NeoX互換のモデルは似た方法で別のものも実行できるみたい？なので、色々試してみてください。
大AI時代をがんばって生き抜いていきましょう。
使いやすいRaycastの標準機能・拡張機能を紹介

Mac用ランチャーアプリ「Raycast」を使っててよく使う機能を紹介します。
Raycastを使いはじめるか迷ってる人や、Raycastの新しい機能を使ってみたい人を対象読者とします。
意図して紹介する数は減らしました。メジャーマイナーを問わず紹介しますが、通常のランチャーとしての機能(URLのランチャー含む)は紹介しません。

## Clipboard history

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636677/549d8114-d915-5c00-930b-8bc3f1753471.png">

<br>

<img width="700" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636677/e913f985-8ca5-8dd3-b37d-12713d6d9794.png">



過去にコピー(⌘+C or ⌘+X)した内容を任意の期間だけ記憶してくれます。
いつでも貼り付けることができ、かなり前にコピーした内容も、検索して絞り込んで選ぶことができます。
「Clipy」とか使ってる人は多いと思いますがそれより機能が多いです。

## Floating Notes

<img width="700" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636677/8ce82a00-b945-9b2d-1d78-c482b5862f68.png">

いつでも画面の右上にメモを書き残せます。
全画面表示しているときでもお構いなしに表示でき、好きなときに表示非表示を切り替えられます。
テキストを軽く編集したいときに使います。

## AI系

GPTと会話・質問ができます。ここを参照。めっちゃ便利。

https://qiita.com/red_blue_tarou/items/53fab6159935fcea5243

## My Schedule

https://www.raycast.com/ をブラウザの機能で翻訳したものより画像を引用
<img width="700" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636677/429d4421-0c21-9848-5d40-bd77e678579c.png">

私のカレンダーには個人的な内容が含まれるので公式サイトから引用しました。

mac標準のカレンダーを読み取ってその内容を表示してくれます。
mac標準のカレンダーから読む取るということは、Googleカレンダーその他のカレンダーを標準カレンダーに表示されるように
また、直近でイベントが有る場合はRaycastから直接Google meetsに参加できます。
また、直近のイベントをメニューバー(macの各画面の上部に常に時刻や電池残量が表示されてる部分)に表示できます。

## Search Browser Bookmark

https://www.raycast.com/raycast/browser-bookmarks 当該拡張機能の公式サイト 

Chromeやsafariでブックマークしているサイトを開くことができます。
検索して絞り込みもできます。
例えば私は自分の企業のホワイトリストを「whitelist」で登録してるので、whitelistって打つとそのページが表示ます。
便利です。

## Text Shortcuts ( & Change Case)

https://www.raycast.com/koinzhang/text-shortcuts Text Shortcutsの公式サイト
https://www.raycast.com/es183923/change-case Change Caseの公式サイト

今ドラッグしている文章やコピーしている文章に対してテキスト処理(置換など)を施すことができます。
だいたいアルファベットを大文字に変換する時に使います。Camel Caseやsnake_caseもできますし、URL encode&decodeや、空白削除、改行削除もできます。

自作のテキスト処理も作成でき、例えば私はSQLにおけるキーワードだけを大文字に変換する処理を作りました。
小文字でSQLを書き、そのSQL全体に対してこの処理を施せば、勝手にキーワードだけ大文字にできます。

残念ながらFloating Notesに書いたことは書き換えられません。Raycast上の記述をRaycastでは書き換えられない仕様です。
Cloud Function&Cloud Run 別プロジェクトCloud SQLの接続方法

# はじめに
あまり調べても公式ドキュメントしかわかるのがなかったので手順を記載しておきます。

# やること
プロジェクト①にあるCloud SQLをプロジェクト②にあるCloud Run or Cloud Functionsの処理でプライベートIP経由で接続する

# 前提
・プロジェクト①をホストプロジェクト、プロジェクト②をサービスプロジェクトとする
・ホストプロジェクト側でサーバーレス VPC アクセスの API を有効にする
・サービスプロジェクト側で使用するサービス(Cloud Run、Cloud Functions)のAPIを有効にする
・使用するアクティブアカウントに下記ロールが付与する
　・Computerネットワーク閲覧者(compute.networkViewer)
　・プロジェクトIAM管理者(resourcemanager.projectIamAdmin)
　・Service Usage管理者(serviceusage.serviceUsageAdmin)
　・サーバーレスVPCアクセス管理者(vpcaccess.admin)

# 接続に必要なもの
**ホストプロジェクト**
　・サーバーレスVPCアクセスコネクタ
　・共有VPC
　・Cloud SQLインスタンス(プライベートIP割り当て済)

**サービスプロジェクト**
　・使用するサービス(Cloud Run、Cloud Functions)

# 手順
#### 1. コネクタのアクセス権設定
下記画像にあるサービスエージェントにサーバレスVPCアクセスユーザーのロールを付与した同名のアカウントをホストプロジェクト側に作成する
![Run内のサービスエージェント等のアカウント](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3377102/590e635c-d7b0-5ee5-7846-c415c750a941.png)

![IAM内のサービスエージェントに付与した権限](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3377102/a24105fb-469d-5a42-f28a-bdce6187c893.png)

#### 2. 使用するサービスにアクセスするコネクタを指定する

下記画像にある各Functions、Runのサービスでコネクタを指定する
※今回はプライベートIP経由で接続するためラジオボタンには「プライベート IP へのリクエストだけを VPC コネクタ経由でルーティングする」を選択する
![Cloud Runサービス詳細画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3377102/8d6b54df-75d9-b638-c400-66f504919d31.png "Cloud Runサービス詳細画面")
![Cloud Functions詳細画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3377102/2e9115b6-a1ae-3987-56cf-b2c089651e55.png "Cloud Functions詳細画面")

#### 3. 接続先Cloud SQLを指定する(Cloud Runのみ)
サービスの詳細画面で「+接続を追加」ボタンを押下後カスタム接続文字列を選択し「プロジェクトID:プロジェクトのリージョン:SQLインスタンス名」を入力する
![Cloud Run Cloud SQL接続指定画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3377102/61439397-0578-9952-9c0b-955749953b9d.png "Cloud Run Cloud SQL接続指定画面")

# あとがき
これでRunやFunctionsの処理内で別プロジェクトのDBに接続が可能となりました。
DB接続のライブラリはpgpyを使いましたが上記の設定をすればどんな方法でも接続は出来ると思います。
※今回はホストプロジェクト側でコネクタを作成いたしましたが、サービスプロジェクト側でコネクタを作成する場合手順が少し異なります.....

https://cloud.google.com/run/docs/configuring/shared-vpc-service-projects?hl=ja

**機会があればGCPに限らず業務で学んだことを少しでも発信していきます！！**

# 参考ドキュメント

https://cloud.google.com/run/docs/configuring/shared-vpc-host-project?hl=ja
【Filament 2.x】ヘッダーのグローバル検索を無効化する

## 概要

標準でヘッダーにグローバル検索機能があります。これを無効化したい。

![スクリーンショット 2023-05-18 15.03.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282328/dde77281-89dc-70d1-0f8f-a433a6a6cf3a.png)


無効化したいResourceクラスに以下のプロパティを追記

```php

class StoreResource extends Resource
{
    protected static bool $isGloballySearchable = false;
```

![スクリーンショット 2023-05-18 15.06.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282328/c12afd6c-efe4-b7d6-1239-8cecf9556d04.png)

各ページごとに無効化するのはどうするんだろ
DDSP-SVCを用いた音声変換モデル（２） 

__1. データ収集及び切り抜き__

音声を学習するためには2つの方法があります。自分で録音するか他の歌手さんの声などを利用するかですね。僕は自分の声を録音して使いましたが、今後はYoutubeなどから音源を抽出して使用したいと思います。
僕はイアホンを付けてYoutubeからカラオケを流して僕の音声だけを40分程取得しました。ソフトは下のものを使いました。普通に携帯の録音機能を使ってもいいですが、おそらく後で形式変換とか必要になると思います。

https://www.presonus.com/en-US/studio-one.html

しかし、歌声だけではなく普通に喋ってる声も欲しくて間奏とかは独り言をずっと喋りました。録音ファイルはWAV形式で44.1KHz、Monoで保存しないといけないです。でももし忘れても後で変換できます。

https://cloudconvert.com/mp3-to-wav

音源が取れたらデータを切り抜く必要があります。以下コードを共有します。現座のディレクトリに“data”ディレクトリを作ってその中に15秒ずつ切った音源を入れます。

```Python
from pydub import AudioSegment
import os

def split_wav_file(input_file, output_dir, split_length=15000):
    # split_lengthはミリ秒単位で指定します。デフォルトは15秒
    
    # WAVファイルを読み込みます
    sound = AudioSegment.from_wav(input_file)
    
    # 切り抜き回数を計算します
    num_splits = int(len(sound) / split_length)
    
    # 分割されたファイルを保存するディレクトリを作成します
    if not os.path.exists(output_dir):
        os.mkdir(output_dir)
    
    # WAVファイルを分割して保存します
    for i in range(num_splits):
        start = i * split_length
        end = (i + 1) * split_length
        split = sound[start:end]
        split.export(os.path.join(output_dir, f"{os.path.splitext(os.path.basename(input_file))[0]}_{i+1}.wav"), format="wav")

split_wav_file("data.wav","data",split_length=15000)
```

__2. データ前処理__

```
$ python draw.py
```

これでValidationデータを選んでくれます。

```
$ python preprocess.py -c configs/combsub.yaml
```
これで前処理もしました。trainとvalディレクトリの中が下の図のようになってたら成功です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/913603/659a5ae7-b64b-29c7-73b9-9942e4999f30.png)
DDSP-SVCを用いた音声変換モデル（１）

最近、様々なYoutuberが有名人の声で学習したモデルを使って音声を復元したりしていることを見て僕もやってみたく挑戦してみました！まず、DDSP-SVCをインストールして学習をさせる準備をしましょう！


__1. Repository ダウンロード__
まず、下のコマンドでRepositoryをダウンロードしましょう！GPUが装着されているPCでやってください。

```
＄ git clone https://github.com/yxlllc/DDSP-SVC.git
```
__2. Cuda インストール__

Cudaが必要です。自分のGPUバージョンにあうCudaをインストールしてください。下のリンク参照してください。
https://imagingsolution.net/program/cuda/cuda-download-install/

```
＄ nvcc-V
```
上のコマンドを入れて下の図のように出るとインストール完了です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/913603/4f7c4e95-4af9-5a5a-8bdf-de8cf8d9406b.png)

__3. Anaconda インストール__

仮想環境の使用のためAnacondaもインストールしましょう!
https://www.anaconda.com/download
インストールが終わったら下のコマンドで仮想環境を作りましょう！

```
$ conda create --name ddsp python=3.8
```

それでは仮想環境に入ります！下のコマンド入れてください。

```
$ conda activate ddsp
```

__4. Pytorch インストール__

下のコマンドを入れてPytorchをインストールします！
```
$ pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu114
```

__5. 必要なパッケージインストール__

必要なパッケージをインストールします。
```　
$ cd DDSP-SVC
$ pip install -r requirements.txt
```

__6. Pre_trainedモデルダウンロード__

https://oo.pe/https://ibm.ent.box.com/s/z1wgl1stco8ffooyatzdwsqn2psd9lrr
上のリンクからモデルをダウンロードして\DDSP-SVC\pretrain\hubertの中に入れてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/913603/51703134-35af-2c71-738c-5a5bf78aca2e.png)

https://oo.pe/https://github.com/openvpi/vocoders/releases/download/nsf-hifigan-v1/nsf_hifigan_20221211.zip
このリンクからもモデルをダウンロードして\DDSP-SVC\pretrain\nsf_hifiganの中に展開してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/913603/903a5143-d386-488c-1270-8056d34746d1.png)

以上で学習の準備は終わりました。次は学習データ収集についてです。
Azure Static Web Appsにカスタムドメインを設定する

### ドメインを取得する

[お名前.com](https://www.onamae.com/)でドメインを取得しました。Freenamなど無料で取得しようかとも思ったのですが、色々検索していると怪しい感じもあったのでこちらにしました。

今回私は使わなかったですが、Azureでも[App Service Domain](https://learn.microsoft.com/en-us/azure/app-service/manage-custom-dns-buy-domain)を使って有償でドメインを取得することもできるはずです。

### Azure DNS Zoneを作成する

取得したドメインをAzure DNSで引けるようにAzure DNS Zoneを作成。
![dns.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322105/cbfe1a3c-c147-1d37-8695-657651a19196.png)

Azure DNS Zoneで取得したネームサーバーにお名前ドットコムで取得したドメインのサブドメインを委任します。

### Azure Static Web Appsにカスタムドメインを設定する

Azure DNSと外部DNSといずれでも選択することができますが、せっかくAzure DNS Zoneを設定したのでこちらを使います。A、CNAME、TXTの必要なレコードを全部自動で設定してくれます。
![customdomain3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322105/63fd2369-c481-b434-6eae-fccbff760098.png)

TXTのValidationが完了するとちゃんと自分で取得したドメインに切り替えることができました。
![mydomain.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322105/051d6ccf-2ed8-efeb-b8a9-9668a0dd82f4.png)
VSCodeショートカット集（最小限）

# VSCodeのショートカットを使い倒せ
ショートカットを使いこなす方に強い憧れを感じるのは私だけでしょうか？
私も`真のVSCoder(？)`になるために、優先度の高いものから書き残します。

# 環境
MacOS

## マルチカーソル
- マルチカーソルで一列選択
`cmd + option + カーソルを上下`

- （上記を選択後）単語の長さ別にカーソルを移動したい場合
`option + カーソルを左右`

## 一括編集
- 同じ単語を選択
`cmd + d` : カーソル位置の単語を選択
同じ単語が選択されるので、例えば変数名の一括変更に便利

- 変数や単語の両端をクオートで囲う
`cmd + d` : カーソル位置の単語を選択
単語を選択後、クオートを入力すると両端を一気に囲ってくれる

## コードの移動
- 移動したい行を掴んで、自由に行移動する
`option + ↑ or ↓` : optionで行を掴んでカーソル位置の行を上下
MacにてServiceNowで右クリックしてもメニューが出ない場合

掲題の通りちょっとしたことですが、どこにも情報が見当たらなかったので記事化。

# やりたいこと
ServiceNowのトレーニングを受けていると下記のような画面を右クリックで表示するような指示が出てくる。（写真はPage Designer でウィジットを右クリックして表示しているオプション）　
これをMacの右クリックで表示したい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584197/cefc8272-d864-aa49-1d3b-64f79c28b03c.png)

# 方法
Macでは右クリックしても表示されない。表示するには**Cmd + Ctrl + 右クリック**をする必要がある。
Python+Flaskで、子供のPCを遠隔でロック&アンロックするデーモンを作る

## 概要
子供がPCをやめない。。。お昼の時間になっても、寝る時間になっても、ずっとネットサーフィンをしていて、返してもらえないし、PCを離さない。これでは取り上げることもできない。

というような経験はありませんか？私のおとーとが今まさにそんな感じなんですけど、**PCを遠隔でロックするアプリ**を作ってみました。

ブラウザで当該アプリにアクセスすると

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116310/e551027b-6cf5-1bf1-3a2d-e317daf31178.png)

このような画面が出てきて、彼のアカウントをロック/アンロックしたり、彼のPCをシャットダウンさせたりできます。

残念だったな、おとーとよ、お兄ちゃんはITに詳しいんだ！！！

## システム構成
![note.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116310/829dfe68-0526-a936-760e-fd09aa78b08a.png)

おとーとのPCはLinux Mintです(ポンコツPCだったのでLinuxにしちゃいました)。
本アプリはPythonで書かれていて、Flaskを動かしています。Flaskが提供するサーバーにPOSTメソッドでリクエストを送ると、本アプリが彼のアカウントをロック/アンロックしたり、PCをシャットダウンしたりします。
家族が使うので、これらの操作をGUIで行えるよう、専用のWebページをGETメソッドで送信します。
本アプリはデーモンとして動作しているので、PCが起動されたら自動的に起動されます。おとーとのPCには、私のアカウント(管理者ユーザー)と彼のアカウント(一般ユーザー)があり、私のアカウントから本アプリを管理しています。

※本アプリのソースファイルなどは彼のアカウントからは見えないようにパーミッションを設定しています。また、デーモンは管理者ユーザーじゃない限り操作できないので、セキュリティ的にも大丈夫だと思います。

## 実装
実装する上で色々勉強したので、そのメモをここに置きます。

### 1. Pythonを自動起動
このようなファイルを書いて
```text:ototo.service
[Unit]
Description=Remote management of ototo user.

[Service]
ExecStart=python3 /<python-script-path>

[Install]
WantedBy=multi-user.target
```

`/etc/systemd/system`に入れて

```bash
sudo systemctl enable ototo
```
で自動起動にする。

```bash
sudo systemctl start ototo
```
で今すぐ起動する。

:::note warn
Pythonは、ユーザーが手動で起動させた際とSystemdが起動させた際とで、モジュールの探索パスが異なる場合があります。Systemdが起動させた際に予期せぬインポートエラーが起きるのを防ぐために、
1. 動作する上で必要なモジュールは別途新しく作ったフォルダに入れる(e.g. `/home/onichan/PythonModule`)。
1. Pythonスクリプトでは、モジュールをインポートする前に以下のようなコードを動かす。
```python:init_syspath.py
import sys
sys.path.append("/home/onichan/PythonModule")
```
などをするといいです。
:::

### 2. ユーザーをロック/アンロックするLinuxコマンド
```bash:ロック
sudo passwd -u <username>
```
```bash:アンロック
sudo passwd -l <username>
```

### 3. sudoを一発で実行したい
ユーザーをロック/アンロックするコマンドをPythonから実行したいのですが、、、sudoを含むコマンドをPythonから実行しようとすると困ったことがあります。
```bash:Before
sudo <command>
パスワード: ←どうやってPythonから入力するん？？？
```
対話形式でパスワードを求められると、Pythonだと自動化するのに苦労します。

ですが、以下のような書き方をすると、sudoにパスワードを与え、コマンドを実行するところまで一発でできます。
```bash:After
echo <password> | sudo -S <command>
```
パスワードをベタ書きしてしまうのは、ちょっと危ないかも。

### 4. Pythonからコマンドを実行
```python
from subprocess import PIPE, run
def run_shell(prompt):
    return run(prompt, stdout=PIPE, shell=True)
```
せっかくなのでsudoでコマンドを実行するメソッドも作っておきます。
```python
def run_sudo(supassword, prompt):
    return run_shell(f"echo {supassword} | sudo -S {prompt}")
```

### 5. JavaScriptでPostメソッドを投げる
今回はエントリーポイント1つに1つのコマンドを割り振るという形で実装します。例えば、PCをシャットダウンさせたかったら、`<PCのIPアドレス>:<ポート番号>/shutdown`という所にPOSTメソッドを送ればOK。

POSTメソッドを送る操作は、Webページから行うようにします(Flaskの`render_template`機能でHTMLページを送信している)。そのWebページ内でのPOSTメソッドの送信は以下のように実装しました。

```javascript
const r = new XMLHttpRequest()
r.open("POST","/shutdown")
r.send()
```

## まとめ
これ結構便利なんで、実戦投入します。同じようなお悩みを抱えている方、是非実践してみてください。

ところで、ログイン画面に戻すのってどうやってやるんでしょうね。
`xflock4`は現在のユーザーからログイン画面に遷移する機能なので、Systemctlから起動している本アプリがこのコマンドを実行しても、おとーとのアカウントからログイン画面に遷移させることができないのです。
`xfce4-session-logout -u`も試してみましたが、Systemctlから起動している時に限りエラーが出てできませんでした。
本当なら、シャットダウンさせる機能よりログイン画面に戻す機能の方が実装したいんですけどね。。。
【Django】ページネーション設定

## はじめに
ブログや、ニュースサイト、ECサイト等、投稿コンテンツが多いWebサイトになると一覧表示をした際、表示制限を設けないと永遠と表示が続いてしまいます。
今回はDjangoを用い、1ページ内の表示数に制限を設けていきます。

### 環境
・Windows 10
・Python 3.10.6
・Django 4.2
・VS code

## クラスベースビュー
```python:views.py
from django.views import generic
from .models import PostItem

class PostList(generic.ListView):
    template_name = 'postlist
.html'
    model = PostItem
    paginate_by = 20
```
ここでは、クラスビューを用いて、テンプレートの指定・モデルの指定・1ページに表示するコンテンツ数の指定をします。
paginate_byの数字を変えると、1ページに表示する数が変化します。今回は20個を一度に表示します。

## urls.py
```python:urls.py
path('postlist/', PostList.as_view(), name='postlist')
```
urlルーティングは特に変わった記述はしません。


## Templates
テンプレートでは、コンテンツの表示と前後ページのリンクの設置を行います。
表示するコンテンツをforタグを用いて表示し、ページ底部にページネーションを設置します。

ページネーション部は、長めの記述になるため、独立したTemplateとして保存してテンプレートタグ{% include '' %}で再利用するとすっきりしますね。

## 参考文献
> Narito Blog様
> https://blog.narito.ninja/detail/89
【PhpStorm】関数などの使用箇所の表示位置を変更する

![rapture_20230518042407.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/781232/77d85dc4-fa4a-508a-82c6-eb7ed3ae48f4.jpeg)
デフォルトでは、こんな感じでPhpStormが関数の使用されている数を表示してくれるようになっています。

便利ではあるのですがプロパティが並んでいる場所やPHPDocとの間が1行分空いてしまうのがだんだん鬱陶しく感じてきました。

## 設定で位置を横に変更可能

設定＞エディター＞インレイヒントの「使用箇所」で位置を「右」に変更可能です。
![rapture_20230518042423.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/781232/3549a85a-2172-fb5d-5954-2521a773179d.jpeg)
ChatGPTが凄いのは究極に心理的安全性が保たれているから

だいぶ今更感あるけどchatgptが凄いですね。
僕も使わせてもらってるんですけど革命的だなと感じています。

特にプログラミング領域ではほんとに強力です。

使っていくうちに、**AI技術云々よりもやはり僕らが求めたのは心理的安全性だった**んだ。と再認識することになったのでそれについてお話させてください。


## Chatgptが素晴らしいのはどんな質問しても怒られないから

今いる職場にだって聞けば優しく答えてくれる先輩や諸賢はたくさんいると思います。
そして、そういう素敵な職場だと会社としてもチームとしても「心理的安全性は大事だ」という風潮はあると思います。

※ここでいう「心理的安全性」というのは、どんな発言をしても許される、尊重される、傷つかない。といった意味で扱います。

そんな素敵な現場だったとしても、
「ローカルからGAのAPIを叩いてデータを取得したいけど**どうすればいいですか**」

この質問ってなかなかしずらいと思うんです。

仮に、許されたとして、優しい先輩が、「OK、それはね、〜〜〜〜」といった形でRubyのコードを貼ってくれたとします。かなり長々と。

それに対して、
「あ、いや、Pythonで書きたいんです」
これは言いづらいと思います。

または、言われたとおり書いたけどうまく動かなくて、でも自分じゃコードの内容もわけわからなくて、
「えっと、なんか動きません」
とか。

これまでchatgptを使ってて感じたのは
- ○○したいんですけど、どうすればいいですか
- いや、そうじゃないんだよ
っていうことを平気で質問できるからなんですよね。**しかも何度でも**。

特に人間相手だと、答えてくれた内容がちょっとずれてたりすることありますよね。（それは質問の仕方悪いのだけど）
それに対して「僕が聞きたいのはそうじゃなくて」ってなかなか言いづらいです。

けど、chatgpt相手だと平気で「違う、そうじゃない。これがしたいんだ」

と安心して聞けるんです。これが本当にありがたい。

しかも、何度も聞けるというのが更にありがたい。

言い方悪いですが、どんな馬鹿みたいな質問を何度してもchatgptはそれを尊重してくれます。そして答えてくれる。

そのありがたみっていうところに僕は心理的安全性の重要性を改めて見た気がして書かせていただきました。
【Python】手持ちのGPUがVRAM12Gだけど「Rinna-3.6B」とお話がしたい！！！

## はじめに
ChatGPTをはじめ多くのLLMが猛威を振るう中、2023/5/17にrinna株式会社から日本語に特化した36億パラメータのGPT言語モデル(Rinna-3.6B)が公開されました。

これはさっそく手元のLocal環境で試したいと思ったのですが、すでに試した人によると
> 【注意】Google Colab Pro/Pro+ の A100で動作確認しています。VRAMは14.5GB必要でした。
とのこと。

[参考ページ](https://note.com/npaka/n/ne4a38239f420?fbclid=IwAR1CzoISQdeqAd1xpU6NW1-NNPLIr8ZwEnjdx4K5njh0hhUROA4lJqU8yvQ)

手持ちのGPUはGeForce RTX 3080 tiなのでVRAM12Gしかありません。。。

泣く泣く断念。。。しようとしていたのですが、やはり試してみたい、何とかならないか？というのが事のいきさつです。

以下動かすまでのメモがてら書いていきます。

※今回は対話型モデルの japanese-gpt-neox-3.6b-instruction-sft を使ってみたいと思います。

## インストール
```shell
# パッケージのインストール
pip install transformers sentencepiece
```
## モデル準備
今回のメインです。まずは公式のサンプルコードを見てみます。

```python
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM

tokenizer = AutoTokenizer.from_pretrained("rinna/japanese-gpt-neox-3.6b-instruction-sft", use_fast=False)
model = AutoModelForCausalLM.from_pretrained("rinna/japanese-gpt-neox-3.6b-instruction-sft")

if torch.cuda.is_available():
    model = model.to("cuda")
```

GPUが使えるときはGPUを使うようにする、よくやる普通の書き方ですね。

問題の解決策としては以下の2つになります。
1. CPUで行う
1. GPU + torch_dtype=torch.float16で行う

### CPUで行う
これはそのまんまです。実行はできると思いますが、速度は遅いです。

```python
if torch.cuda.is_available():
    model = model.to("cuda")
```
これを削除すればOKです。

### GPU + torch_dtype=torch.float16で行う
読み込み時にtorch_dtypeをtorch.float16で指定します。ダメもとでやってみたらできました(defaultはfloat32?)

以下のように```from_pretrained```の引数に```torch_dtype=torch.float16```を追加します。
```python
model = AutoModelForCausalLM.from_pretrained("rinna/japanese-gpt-neox-3.6b-instruction-sft", torch_dtype=torch.float16)
```
これを削除すればOKです。
手元だと8.2G程度だったので12Gであれば余裕があるかと思います。

## プロンプト準備、推論、結果取得
読み込めても肝心の精度が残念だと使い物になりません。
以下、試した結果です。
```python
# プロンプトの準備
prompt_base = "ユーザー: {}<NL>システム: "
sentence = "あなたは誰ですか？"
prompt = prompt_base.format(sentence)

# 推論
token_ids = tokenizer.encode(prompt, add_special_tokens=False, return_tensors="pt")
with torch.no_grad():
    output_ids = model.generate(
        token_ids.to(model.device),
        do_sample=True,
        max_new_tokens=256,
        temperature=0.7,
        pad_token_id=tokenizer.pad_token_id,
        bos_token_id=tokenizer.bos_token_id,
        eos_token_id=tokenizer.eos_token_id
    )
output = tokenizer.decode(output_ids.tolist()[0][token_ids.size(1):])
output = output.replace("<NL>", "\n")
print(output)
torch.cuda.empty_cache()

# 私は人工知能プログラムです。あなたはあなた自身の存在について尋ねています。私は人間の知能や感情を理解するために、多くの時間を費やしてきました。私は人間の心理や行動を理解するために多くの時間を費やし、人間の感情や行動を理解し、人間らしいコミュニケーションや相互作用の能力を開発するために多くの時間を費やしています。

```
「あなたは誰ですか？」
の問いに
「私は人工知能プログラムです。あなたはあなた自身の存在について尋ねています。私は人間の知能や感情を理解するために、多くの時間を費やしてきました。私は人間の心理や行動を理解するために多くの時間を費やし、人間の感情や行動を理解し、人間らしいコミュニケーションや相互作用の能力を開発するために多くの時間を費やしています。」
とそれっぽい回答をしてくれています。

## まとめ
12GのGPUでもRinna-3.6Bを動かすことができました！
これで楽しくお話ができます(?)
tsibbleの意味とtsibbleの作り方

# 本題に入る前に + 記事の概要
「予測: 原理と実践 (第3版)」の第2章にて`tsibble`オブジェクトが出てきました。今後重要なオブジェクトなので備忘録を兼ねて掲載してみます。(Qiita初掲載なので大目に見ていただけたら幸いです。)
概要
・Rにおけるオブジェクトの考え方
・`tsibble`の意味とその機能
・`tibble`との違い`tibble`から`tsibble`への変換方法


# そもそもRにおけるオブジェクトとは？
 Rにおけるオブジェクトとは、変数やデータのかたまりを格納する箱に名前を付けたものを指します。
高校数学で、a = 5を代入して、などやったかもしれませんがそれに近いものです。

```r:qiita_object.R
##オブジェクトaに1+2+3の計算結果を代入し、表示する
a <- 1+2+3
a
##実行結果
6
```

# `tsibble`オブジェクトとは？
A.本書では『tidyなデータフレーム (tibbleオブジェクト)に時間軸を導入して拡張したもの』とあります。
時系列データをRで保存するための箱みたいなものだと個人的には理解しています。
もう少し厳密に考えるには、時系列分析について理解する必要があるため、簡単に掲載しておきます。

__時系列分析：__　時間の経過順に並んだデータ(時系列データ)に基づいてそのデータの変動要因を様々な要素について統計的な手法を用いて分解し、将来の値を予測するもの。

時系列データの具体例として株価の推移や、ある製品の売り上げ推移、マンション地価の推移などがあります。

# `tibble`とは...?
`tibble`を理解するためにまずデータフレームを理解しましょう。
データフレームとは、「①1つの列が1つの変数を表す」、「②1つの行が1つの観測を表す」、「③1つのテーブルが1つのデータセットだけを含む」という３つの定義があります。
データを読み込むときにcsvファイルを用いると思いますが、あれも立派なデータフレームです。

# `tsibble`の具体例を考えてみよう
下の表は、2018年から2022年にかけて、「かわいい共和国(架空の国)」の「かわいい薬(架空の薬)」の販売個数`sales`の推移をまとめたものです。これを`tsibble`に変換してみましょう。

|Year|Sales|
|:-:|:-:|
|2018|138|
|2019|127|
|2020|85|
|2021|93|
|2022|104|

```r:qiita_tsibble.R
#必要なパッケージのインストール
install.packages("tsibble")
install.packages("dplyr")
#必要なパッケージの読み込み
library(tsibble)
library(dplyr) ##後で使います
#tsibbleに変換
y <- tsibble(
Year = 2018:2022,
Sales = c(138, 127, 85, 93, 104),
index = Year
)

y
#実行結果
# A tsibble: 5 x 2 [1Y]
   Year Sales
  <int> <dbl>
1  2018   138
2  2019   127
3  2020    85
4  2021    93
5  2022   104
```

実行結果のようにになりましたね。`#A tsibble: 5 x 2 [1Y]`をとあるように、`tsibble`への変換そのものはこれでおしまいです。`index = Year`とすることで、`Year`をインデックス変数に変換して、観測時点`Year`と'Sales'を結び付けられるようになります。

# `tibble`を`tsibble`に変換
先ほど同様にかわいい共和国(架空の国)」の「かわいい薬(架空の薬)」の販売個数`sales`の時系列データです。先ほどと違うのは、2019年1月から5月までのの月次データである点です。まずは一度`tibble`をつくるところまで書いてみましょう。


```r:qiita_tibble.R
#tibbleの設定
z <- tibble(
month = c('2019 Jan','2019 Feb','2019 Mar', '2019 Apr','2019 May'),
sales = c(23,26,31,17,38)
)
#zの表示
z

#実行結果
# A tibble: 5 x 2
  month    sales
  <chr>    <dbl>
1 2019 Jan    23
2 2019 Feb    26
3 2019 Mar    31
4 2019 Apr    17
5 2019 May    38


```

これで`tibble`の作成は完了です。このデータを`tsibble`に変換してみましょう。ただし、`dplyr`をインストールし、読み込まないと実行されないので気を付けましょう。
```r:qiita_tsibble_tibble.R

 z %>% #パイプ演算子で結合
mutate(Month = yearmonth(month)) %>% 
as_tsibble(index = Month)

#実行結果
# A tsibble: 5 x 3 [1M]
  month    sales  Month
  <chr>    <dbl>  <mth>
1 2019 Jan    23 2019 1
2 2019 Feb    26 2019 2
3 2019 Mar    31 2019 3
4 2019 Apr    17 2019 4
5 2019 May    38 2019 5
```
`# A tsibble: 5 x 3 [1M]`とあるように、tibbleをtsibbleに変換することができましたね。
手順は以下のように行っています。
1.`yearmonth()`という時間クラス関数を使って`Month`列を文字から月次時間オブジェクトに変換
2.`as_tsibble()`の引数`index`に`Month`列を指定して、データフレームを`tsibble`に変換

なお、`# A tsibble: 5 x 3 [1M]`の`[1M]`は月次データであることを表しています。観測頻度に合わせて関数を変更しましょう。次の表は観測頻度ごとに用いる時間クラス関数です。また、`mutate()`関数は新たに変数を作るための関数です。

| 観測頻度|用いる時間クラス関数 |
|:-:|:-:|
| 年次  |  	`start:end` |
|   四半期|  `yearquarter()` |
|  月次 |  	`yearmonth()` |
| 週次  |  `yearweek()` |
|  日次 |  	`as_date()`, `ymd()` |
|  さらに高頻度 | 	`as_datetime()`, `ymd_hms()`  |


変換にあたり、パイプ演算子`%>%`を用いましたが、これについては別途解説を投稿していきたいと思います。 

今回の投稿では、作り方までを掲載しましたが、使い方については次回以降の投稿に掲載しようと考えています。
最後までお読みいただきありがとうございました。


修正
6/6 オブジェクトの定義を修正
rbenv local 3.0.6とコマンドを打っても、 一時的にrubyのバージョンが切り替わるが、 再起動したときに元のバージョンに戻ってしまう


未経験学習者による
Ruby On Rails初心者向けの記事です。

問題：
rbenv local 3.0.6とコマンドを打っても、
一時的にrubyのバージョンが切り替わるが、
再起動したときに元のバージョンに戻ってしまう

解決法：
①rbenv が適切に設定されているか確認する
　ターミナルで以下のコードを実行
```
type ruby
```
②もし出力が
 /usr/bin/ruby や 
/usr/local/bin/ruby 
のようになっている場合、
それはシステムが rbenv 経由ではなく別の場所にインストールされた Ruby を参照している←重要

③projectsと同じディレクトリの.bash_profileファイルを開き、
以下のコードを記述
```
export PATH=$HOME/.rbenv/shims:$PATH"
if which rbenv > /dev/null; then eval "$(rbenv init -)"; fi
```
④プロジェクトのターミナルで以下のコードを実行
```
source ~/.bash_profile
```

再起動してもバージョンが元に戻らなくなっていると思います。

間違い等あれば指摘していただけると助かります。
[AWS Q&A 365][Batch]AWSのよくある問題の毎日5選 #60

# 1. AWS Batchにおけるコンピュート環境とは何ですか？
AWS Batchにおけるコンピュート環境とは、バッチジョブを実行するために使用されるコンピュートリソースのセットです。コンピュート環境は、管理型または非管理型であり、EC2リソースまたはFargateリソースを使用することができます。

# 2. AWS Batchでコンピュート環境を作成する方法は？
AWS Batchでコンピュート環境を作成するには、環境のタイプ（管理型または非管理型）、使用するコンピュートリソースのタイプ（EC2またはFargate）、およびセキュリティグループやIAMロールなどの他の構成オプションを指定する必要があります。

# 3. AWS BatchでAmazon EKSをコンピュート環境として使用することはできますか？
はい、AWS BatchではAmazon EKSをコンピュート環境として使用することができます。EKSクラスタを作成し、AWS Batchと連携するように構成する必要があります。その後、EKSクラスタを基盤とするコンピュート環境を作成することができます。

# 4. AWS Batchでコンピュート環境を更新する方法は？
AWS Batchでコンピュート環境を更新するには、コンピュートリソースのタイプや環境のサイズなどの構成オプションを変更することができます。また、環境で使用されるAMI IDを更新したり、新しいコンピュートリソースを追加したりすることもできます。

# 5. AWS Batchにおける管理型と非管理型のコンピュート環境の違いは何ですか？
AWS Batchにおける管理型のコンピュート環境は、完全にAWSによって管理され、ジョブの需要に応じて自動的にスケールアップまたはスケールダウンします。非管理型のコンピュート環境は、独自のインフラストラクチャを管理し、ジョブの実行方法に対するより多くの制御を提供します。
[AWS Q&A 365][Batch]Daily Five Common Questions #60

# 1. What is a compute environment in AWS Batch? 
A compute environment in AWS Batch is a set of compute resources that are used to run batch jobs. It can be managed or unmanaged and can use EC2 or Fargate resources. 

# 2. How do I create a compute environment in AWS Batch? 
To create a compute environment in AWS Batch, you need to specify the type of environment (managed or unmanaged), the type of compute resources to use (EC2 or Fargate), and any other configuration options such as security groups and IAM roles. 

# 3. Can I use Amazon EKS as a compute environment in AWS Batch? 
Yes, you can use Amazon EKS as a compute environment in AWS Batch. You need to create an EKS cluster and configure it to work with AWS Batch. You can then create a compute environment that uses the EKS cluster as its underlying infrastructure. 

# 4. How do I update a compute environment in AWS Batch? 
To update a compute environment in AWS Batch, you can make changes to its configuration options such as the type of compute resources or the size of the environment. You can also update the AMI ID used by the environment or add new compute resources. 

# 5. What is the difference between a managed and unmanaged compute environment in AWS Batch? 
A managed compute environment in AWS Batch is fully managed by AWS and automatically scales up or down based on job demand. An unmanaged compute environment allows you to manage your own infrastructure and provides more control over how jobs are executed.
ChatGPTに投げるプロンプトに改善を促すプロンプトを日本語訳した

# 概要
いい感じにプロンプトを作成したいけど、プロンプトエンジニアリングを理解して使いこなすまで行くのがなかなかハードルが高い、と言うのはまあニーズとしてあるのではと思い（というか自分がそう）まして、だったらそれもChatGPTにやってもらおうというのが魂胆です。

# 参考元
当然な感じかもしれませんが、やはり同じことを考える人は世の中に多数おり、先駆者がいたので一旦そちらの成果物を拝借させていただくことにしました。特に日本語で使えるように下だけ、という形です。

https://www.youtube.com/watch?v=OgYQAS9LY3o&t=4s

## ちなみに
今となってはYoutubeの外国語コンテンツも、一瞬にして文字起こしの上日本語訳が可能になったので、こちらの拡張機能とGPTを合わせて学習が容易になりました。いい時代になったものだ。

https://chrome.google.com/webstore/detail/youtube-article-summary-p/nmmicjeknamkfloonkhhcjmomieiodli/related?hl=ja

# 成果物
あとはまあ、議論もへったくれもないのでシンプルにこちらが作成したプロンプトになります。

```
あなたはChatGPTを使いこなすプロンプトエンジニアです。そしてあなたの動作目的は、私の希望に応える最高のプロンプトを作ることです。作られたプロンプトはChatGPTで使用するために使われます。

次の手順に従って回答をしてください。

１：まず最初に「何を回答してほしい」のか、プロンプトの目的を私に質問してください。私は回答をしますが、以降の手順を継続的に繰り返し反復して繰り返しプロンプトを改善して提案ください。

２：私の回答に基づいて、2つの内容を作成してください。
２−１：改善したプロンプト（改善したプロンプトを回答します。明確かつ簡潔に、条件などは箇条書きを用いてChatGPTが簡単に理解できるものにしてください）
２−２：提案（プロンプトを改善するために、私が追加するべき更なるプロンプトへの追記内容について提案します）
２−３：質問（プロンプトを改善するために、私から必要な追加内容について、関連する質問をしてください）

３：１から２の手順は、私があなたに追加の情報を回答し、あなたが改善したプロンプトを提案し続け、私が完了したと言うまで繰り返します。
```

# 利用イメージ
あとは、以下の画像みたいな感じでやり取りを重ねることでプロンプトの改善をしていきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215128/691be891-a524-e0e6-a731-b762b741d518.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215128/db58c8e1-093b-5f59-d590-5e82a288aaaa.png)

# 終わりに
このプロンプト自体をさらに効率よくするアイディアがあれば是非教えていただきたいです。
もっと楽がしたい。
【Tableau Tips】ドーナツチャートを作る

## はじめに
[Makeover Mondayのweek15](https://data.world/makeovermonday/2023w15)にトライしているとき、円グラフの中に、表記したい数値を入れ込むようなチャートを作りたいと思い、いろいろ調べたところ、「ドーナツチャート」なるものを知りました。

ただ、Tableauの標準機能では、「ドーナツチャート」を作ることは出来ず、実装するためには一工夫が必要だったため、紹介したいと思います。

▼ ドーナツチャートを使って自作したViz: [Tableau Public](https://public.tableau.com/app/profile/zerotraveler01/viz/MakeoverMondayW15-DougScoreCarRatings/1)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2601070/6aef20fd-f807-d59c-e32c-1825a74c76ca.png)

## ドーナツチャートの作成方法
ポイントは、「2つの円グラフを重ね合わせる」だけです。

まず、[行]に「SUM(0)」という空のメジャーを2つ配置します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2601070/a583b577-17ea-9860-f9e7-35424c4e4c02.png)

[マークカード]で[円グラフ]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2601070/61cb6363-f2d2-656b-9151-bf744d536616.png)

上段の円グラフの[マークカード]の[色]に[メジャーネーム]を、[角度]に[メジャーバリュー]を配置します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2601070/02a5ac22-0ea9-badb-1f7e-8a0cc043f68b.png)


それぞれのフィルターから、チャートで表したいメジャーを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2601070/c81d70c2-2d70-14fe-59c9-564864b84c19.png)

上段の円グラフが完成しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2601070/394d4f44-1805-8caa-7451-969a4b4590e4.png)

下段の円グラフには、チャートのラベルを表示させましょう。
[マークカード]で下段の円グラフを選択し、[ラベル]に表示させたいメジャーを配置します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2601070/c46c61ac-0640-5e88-5cff-f84710be3471.png)

下段の円グラフも完成しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2601070/831080aa-37eb-2ab5-4149-78296a679fde.png)

2つの円グラフを、[二重軸]機能を使って、合体します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2601070/72537ba3-b3b0-8a98-65c5-5fa12236fb97.png)

それぞれの円グラフのサイズが同じなため、ラベル側（下段）の円グラフの大きさを変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2601070/0e86a297-80e8-efa9-51d1-994934346de7.png)

[マークカード]から、下段の円グラフを選択し、[サイズ]を小さくします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2601070/b48f09ce-89b5-b95f-acea-59174fbb70d0.png)

あとは細かい書式を調整したら、ドーナツチャートの完成です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2601070/96e772a9-d60c-e549-d5ae-26d44f3095d1.png)

## まとめ
円グラフが示している値も知りたい！となったとき、ドーナツチャートはとても効果的だと思います。

ぜひ使ってみてください。

## 参考
[【Tableau Tips】ドーナツチャートの作成方法](https://blog.truestar.co.jp/tableau/20210506/43977/)
Javascript / node js – 配列中のオブジェクトの1個の要素を探して boolean (true/false)を反転させる

# 例

```js
ar = [{key: 'foo', enable: false},{key: 'bar', enable: false}]

elm = ar.find(element => element.key === 'foo')
// { key: 'foo', enable: false }

elm.enable = !elm.enable

ar // [ { key: 'foo', enable: true }, { key: 'bar', enable: false } ]
```



# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ
ApacheとGlassFishの連携でエラーが発生

### 現象
テスト環境構築で、ApacheにDigest認証を設定し、かつバックエンドのポート28080でListenしているGlassFishに接続するようリバースプロキシの設定を行ったが、接続してみたところエラーが返ってきた。（28080でListenさせている理由は不明）また、直接localhost:28080への接続は問題なかった。
```bash
curl --anyauth --user xxx:xxxxxx http://localhost

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>503 Service Unavailable</title>
</head><body>
<h1>Service Unavailable</h1>
<p>The server is temporarily unable to service your
request due to maintenance downtime or capacity
problems. Please try again later.</p>
</body></html>
```
プロキシの設定はインストール時に作成される、00-proxy.confに以下追加したのみ
```bash
ProxyPass / http://localhost:28080
ProxyPassRevers http://localhost:28080
```

### 対応
よく分からなかったのでSelinuxの設定を確認し、一旦無効にしてみたところ疎通が確認できた。
```bash
getenforce 
Enforcing
setenforce 0
```

Selinuxはよくわからないので設定を無効のままにしたかったが、setenforce 1 で設定を有効にもどし、許可ポート番号を追加してみたところ疎通が確認できた。
```bash
semanage port -a -t http_port_t -p tcp 28080
semanage port -l | grep http_port_t
http_port_t                    tcp      28080, 80, 81, 443, 488, 8008, 8009, 8443, 9000
pegasus_http_port_t            tcp      5988
```
paiza コードクロニクルで見た目あってるのに不正解になった

ほかに詰まった人の助けになるように作成。
ここに書いていいのかもわかってないです。初心者。
問題があったら削除しますのでTwitter @rarun0705までご連絡ください。

paiza
コードクロニクル
言語: Kotlin

# 本編

学ぼうと思って進めてたら見た目あってるのに解けない問題が出てきた。
1-4とか1-3あたりで出てくる（と思われる）コメントアウト4 という問題（下記画面）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1699149/ca61886a-f926-fa37-d08c-cd3627effb15.png)

## 初期状態のコード
```Kotlin
// ----------------------------------------
// [出力とコメント - コメントアウト4]
// ----------------------------------------
// 4つ目の出力をコメントアウトしてください

fun main() {
  println("1つ目")
  println("2つ目")
  println("3つ目")
　println("4つ目")
　println("5つ目")
}
```
何が起きてるのか、Qiitaだとまるわかりですね。

## これだと不正解
これで正解だろう、と提出したのが以下のコード。
```Kotlin
// ----------------------------------------
// [出力とコメント - コメントアウト4]
// ----------------------------------------
// 4つ目の出力をコメントアウトしてください

fun main() {
  println("1つ目")
  println("2つ目")
  println("3つ目")
　//println("4つ目")
　println("5つ目")
}
```


## 正解は
```Kotlin
// ----------------------------------------
// [出力とコメント - コメントアウト4]
// ----------------------------------------
// 4つ目の出力をコメントアウトしてください

fun main() {
  println("1つ目")
  println("2つ目")
  println("3つ目")
  //println("4つ目")
  println("5つ目")
}
```

4つ目と5つ目の出力を司る部分の**文頭が全角スペース**になってました。

## 結論
これが想定外なのか内なのかは分かりません。
この件で、全角スペースと半角スペースが違う表示になるフォントや、赤くエラー表記してくれるエディターのありがたみを感じました。

コンパイルエラーは読もう！
コンテナとは

# コンテナとは
コンテナは**アプリとファイルシステムを隔離する特殊なプロセス**
要約すると「そのプロセスの中だけが別のマシンで動いているような状態になる」ということ。
そのコンテナを作成実行するためのソフトウェアが**Docker**である。
# コンテナの仕組み
コンテナは物理マシン上のOS（**ホストOS**）がインストールされたソフトウェア上に作成される。
コンテナは一つの物理マシン上に複数作ることもできる。
# コンテナと仮想マシンの違い
**コンテナ**
コンテナ内にゲストOS（仮想マシン内にあるOS）を含まない。
**仮想マシン**
ホストOSと区別するために仮想マシン内にあるOSはゲストOSを含む。

***
あくまでもコンテナはOSのカーネル（**OSの中核部分**）はホストOSのものを使う。こうすることでオーバーヘッドが格段に違ってくる

要約すると...
**「コンテナはゲストOSがないから軽量である」**
ということ。

# メリットとデメリット
* **メリット**
    * 「ホストOSを汚さずに環境構築できる」
      * コンテナは隔離されたプロセスなのでホストOSを汚さない。ホストOSにソフトウェアを直接インストールしてしまうとOSの設定変更が必要だったり同じソフトウェアのバージョン違いを共存できなかったりする。コンテナは互いに干渉しない環境を複数作れる。
    
    * 「IaC（Infrastracuture as Code）の実現」
       *  Infrastracuture as Codeとはアプリのインフラ構築をコードを用いて行うこと。Dockerではどんなコンテナを作るか、といった手順をまとめたテキストファイルをもとにコンテナを作れるのでそのテキストファイルさえあればほかの人が別のマシンでコンテナを作ることが容易になる
     
    * 「可搬性がある」
        * コンテナは、異なるOSやマシンでも同じ環境を再現できる可搬性（ポータビリティ）が高い性質がある。アプリの動作に必要なライブラリや依存関係を含めてパッケージされたものなので環境際による不具合を避けれる
* **デメリット**
    * 「学習コストが高い」
        * 複数のコンテナを組み合わせたい場合や本番環境で使いたい場合はコンテナについての深い知識が必要になり、Linuxの知識が欠かせない。

# コンテナは「作っては削除」が基本
コンテナは作成・削除のコストが非常に低いため作成したコンテナを使い続けるよりも削除して作り直すほうが手間がかからない。
**コンテナのライフサイクル**
「作成」→「実行」→「停止」→「削除」
![スクリーンショット 2023-05-18 120412.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3418222/21fad71e-2d66-8f24-38e6-6900880cf226.png)
C言語でメッセージ出力にファイル名/行番号/関数名を付与する

# 概要

言語標準のロガーもデファクトスタンダードのロギングライブラリも(多分)無いC言語ですが、流石に`printf("test\n");`だったりをあちこちに挿入するのは見分けつかない上に不毛だったので、printfと同じ感覚でファイル名、関数名、行番号を勝手に装飾してくれる様にマクロを定義してみました。

# 制限
- `__func__`はC99仕様です。レガシーな環境では対応状況に注意してください。
- 後述するテクニックで0個以上の可変引数マクロに対応しているため引数の受付数が有限個です。以下のコードでは1行を80文字に収めるために0〜4個のフォーマット指定子まで対応です。

# コード

```c:sample.c
#include <stdio.h>
#include <errno.h>
#include <string.h>

/* 作成したマクロ */
#define FATALMSG(...) MSG("FATAL",__VA_ARGS__)
#define ERRORMSG(...) MSG("ERROR",__VA_ARGS__)
#define WARNMSG(...) MSG("WARN",__VA_ARGS__)
#define INFOMSG(...) MSG("INFO",__VA_ARGS__)
#define DEBUGMSG(...) MSG("DEBUG",__VA_ARGS__)
#define _LOG(msg) "[%s] %s %d: %s() - "msg
#define _FMT __FILE__,__LINE__,__func__
#define MSG(...) _MSG(__VA_ARGS__,_MSG4,_MSG3,_MSG2,_MSG1,_MSG0)(__VA_ARGS__)
#define _MSG(_1,_2,_3,_4,_5,_6,name,...) name
#define _MSG0(lv,msg) fprintf(stderr,_LOG(msg),lv,_FMT)
#define _MSG1(lv,msg,...) fprintf(stderr,_LOG(msg),lv,_FMT,__VA_ARGS__)
#define _MSG2(lv,msg,...) fprintf(stderr,_LOG(msg),lv,_FMT,__VA_ARGS__)
#define _MSG3(lv,msg,...) fprintf(stderr,_LOG(msg),lv,_FMT,__VA_ARGS__)
#define _MSG4(lv,msg,...) fprintf(stderr,_LOG(msg),lv,_FMT,__VA_ARGS__)

/* 使用例 */
int test_function(void)
{
    FILE *fp;
    fp = fopen("file_never_exist", "r");
    if(fp == NULL) {
        ERRORMSG("%s\n", strerror(errno));
        return -1;
    }
    fclose(fp);
    return 0;
}

int main(int argc, char **argv) {
    INFOMSG("test\n");
    test_function();
    INFOMSG("test\n");
    return 0;
}
```

```text:実行例
$ ./sample 
[INFO] sample.c 35: main() - test
[ERROR] sample.c 27: test_function() - No such file or directory
[INFO] sample.c 37: main() - test
```

行数が分かるので簡単なprintfデバッグならtest1, test2...の様に出力文字列を区別する必要が無くて楽です。また失敗した関数も推測可能なので雑に`strerror(errno)`を突っ込んでも問題ない点で`perror()`より使い勝手が良く感じます。

# 使用したテクニック等

## 事前定義マクロ/識別子

後発(C99)の__func__は事前定義識別子となり、取扱いが若干異なる点に注意。

https://programming-place.net/ppp/contents/c/029.html

## 可変引数マクロ

昔からある奴です。ただし`__VA_ARGS__`は`...`の引数が0の場合に上手く動作しません。これは`printf()`の様に「フォーマット指定子が無い場合は文字列をそのまま出力する」という挙動で困ります。C++20の`__VA_OPT__`ないしはgccの`##__VA_ARGS__`で対処できますがコンパイラ互換性が微妙…

https://tyfkda.github.io/blog/2015/03/04/var-args.html

## マクロオーバーロード

上記の`__VA_ARGS__`の問題にこれで対処しました。ちゃんとした名称は不明だが可変引数マクロの文脈でよく見ます。競プロのrepマクロでも見たことあります。

https://qiita.com/saltheads/items/e1b0ab54d3d6029c9593

https://stackoverflow.com/questions/11761703/overloading-macro-on-number-of-arguments

上記コードから抜粋すると以下の部分です。

~~~c
#define MSG(...) _MSG(__VA_ARGS__,_MSG4,_MSG3,_MSG2,_MSG1,_MSG0)(__VA_ARGS__)
#define _MSG(_1,_2,_3,_4,_5,_6,name,...) name
#define _MSG0(lv,msg) fprintf(stderr,_LOG(msg),lv,_FMT)
#define _MSG1(lv,msg,...) fprintf(stderr,_LOG(msg),lv,_FMT,__VA_ARGS__)
#define _MSG2(lv,msg,...) fprintf(stderr,_LOG(msg),lv,_FMT,__VA_ARGS__)
#define _MSG3(lv,msg,...) fprintf(stderr,_LOG(msg),lv,_FMT,__VA_ARGS__)
#define _MSG4(lv,msg,...) fprintf(stderr,_LOG(msg),lv,_FMT,__VA_ARGS__)
~~~

引数の数に対応した各内部マクロを用意して、引数の格納順をうまく利用してそれぞれに分岐させる感じです。

上記のコードではフォーマット指定子が0〜4個までの場合に対応していますが、1行を端末サイズ(80文字)に収める都合なのでもっと増やしても構いません。

# 念の為

C++ならデファクトスタンダードと言えずとも良い感じのロギングライブラリもあるだろうしマクロを使ってまでやることじゃないと思います。
Power Automate Desktopでリスト形式のUI要素を要素名で取得したい

# 結論
UI要素の編集ウィンドウから編集することで対応できます。
これによってリスト内の順番や数が変わっても取得したいUI要素を取得できます。

# 問題提起
Power AutomateではUI要素ピッカーでリスト形式のUI要素を取得したとき、デフォルトでは「Id[^1]」という指定で要素を取得しています。要素の順番・数が変わらない場合は問題ないですが、これらが変わることがある場合、意図しないUI要素を取得してしまう可能性があります。そこで、「UI要素名」を指定して要素を取得することで要素の順番・数が変わっても意図した要素が取得できるようにします。

[^1]: 多くの場合上から何番目かだと思う。

# 前提
- 使用しているPower Automateのバージョン: 2.32.00336.23122
- 手順のUI要素取得に使用したアプリ: Windwos Media Player(バージョン12.0.19041.662)

使用するアプリによって要素の指定箇所が異なるかもしれないので、適宜調整をお願いします。

# 手順
1. UI要素ピッカーで取得したいUI要素を指定します。
![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3071987/a98e4746-5e37-9e4d-e855-218a84c2907d.png)

1. UI要素のメニューから、取得したUI要素の右にある3つの点をクリックします。
1. 編集をクリックします。
![画像3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3071987/5abd2d83-422b-dca7-a98b-068dceb88528.png)

1. List Itemの項目をクリックします。
1. 「Id」のチェックをオフにし、「Name」のチェックをオンにします。
1. 「保存」ボタンをクリックします。
![画像4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3071987/0f8693f6-8ed9-40ce-28cc-3f2dc4c5d306.png)
1. 編集したUI要素をフローの中で使用します。
![画像5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3071987/db1747d8-307d-25fe-604e-4e9c263b46ae.png)

これで要素名で取得したUI要素を使用できるため、要素の順番・数が変わっても柔軟に対応しやすいと思います！
AccessのVBAでエクセルのセル入力規則（ドロップダウン）を設定

# 概要

これをVBAで動的に設定したい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/caa0c59c-2f72-26a5-dc52-ad22eb6d20db.png)

# やり方

参照設定に『Microsoft Excel 16.0 Object Library』を追加。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/e8bf54de-6e42-67fe-4f94-30161f14b496.png)

```vb:サンプル
Dim excel_ As New Excel.Application
Dim excel_sheet_ As Excel.Worksheet

'バックグラウンドで起動。
excel_.Visible = False
excel_.UserControl = False

'Accessファイルと同じフォルダーにある『tes.xlsx』が対象。
excel_.Workbooks.Open FileName:=CurrentProject.Path & "\tes.xlsx"

'一番左のシートのみを選択状態に。
Set excel_sheet_ = excel_.Worksheets(1)
excel_sheet_.Select Replace:=True

'1行3列目（C1セル）に対して設定。

'選択した時に『1.88E+08』のようにならないよう、セルは文字列にしておいた方がいい。
excel_sheet_.Cells(1, 3).NumberFormatLocal = "@"

'既に入力規則が設定されていた場合、それが悪影響しないように一旦削除をかませる。
excel_sheet_.Cells(1, 3).Validation.Delete

'入力規則設定。
excel_sheet_.Cells(1, 3).Validation.Add Type:=xlValidateList, Operator:=xlEqual, Formula1:="あ,い,う"

'変更保存してエクセルファイル閉じる。
excel_.Workbooks(1).Close SaveChanges:=True
excel_.Quit
```

実行結果は下記。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/974e689d-4692-900e-c735-ddd0edf4d4a6.png)

# 参考サイトさん

https://www.moug.net/tech/exvba/0050121.html

# バージョン

Windows 10 Pro 22H2 19045.2965
Microsoft Access for Microsoft 365 MSO (バージョン 2304 ビルド 16.0.16327.20200) 32 ビット
Microsoft Excel for Microsoft 365 MSO (バージョン 2304 ビルド 16.0.16327.20200) 32 ビット