OmniAICreator/Qiita-1.07M huggingface dataset:
[Ubuntu Server 22.04] 　自動再起動設定（Crontab, rtcwake）

## <font color="MediumVioletRed">注意事項</font>
**リンク先に記載**

**[[Ubuntu Server 22.04] 個人的初期設定 覚書](https://qiita.com/QiitaYkuyo/items/54cf4dc7acab59074a5e)**

## 概要
#### 「目次」
[1.Tailscale インストール](https://qiita.com/QiitaYkuyo/items/1a1cea46ebbe9463bc1d)
[2.WeTTY インストール](https://qiita.com/QiitaYkuyo/items/db4febd9915fb7708e77)
[3.Ubuntu Desktop(GDM3 ubuntu カスタム) インストール、自動ログイン設定](https://qiita.com/QiitaYkuyo/items/06a22d394c4fb7f15867)
[4.Ubuntu Desktop RDP セットアップ](https://qiita.com/QiitaYkuyo/items/c8e700da451e894e5d53)
[5.PowerTOP TLP インストール](https://qiita.com/QiitaYkuyo/items/89636030b3cfc1bf5fea)
**6.自動再起動設定（Crontab, rtcwake）**
　　**[概要](#概要)**
　　**[コンストラクション](#コンストラクション)**
　　　**ｰ[インストラクション](#インストラクション)**
　　　　 **[1. ユーザーを ROOT に変更](#1-ユーザーを-root-に変更)**
　　　　 **[2. Crontab を編集](#2-crontab-を編集)**
　　　　 **[3. cronの設定内容を表示する](#3-cronの設定内容を表示する)**
　　　**ｰ[備考](#備考)**
　　**[引用元、参照元、参考先](#引用元参照元参考先)**

#### 「説明」
Crontab はコマンドを定期実行するようスケジュールします。
RTCWake は実行時、電源オフ／休止／サスペンドし、指定時刻／指定時間後に自動で復帰させるコマンドです。

## コンストラクション
### インストラクション
　**確実に実行させるために ROOT ユーザーとしてコマンドをスケジュールします。**
##### 1. ユーザーを ROOT に変更
　まず次のどれかで ROOT 権限を得る
```bash:bash
su root
sudo su
sudo su -
sudo -s
sudo -i
sudo crontab -u root -e
```

##### 2. Crontab を編集
```bash:bash
’/var/spool/cron/crontabs に次を追記
’|# Schedule RTCWake
’|#   時刻(分 時) * * * rtcwake -m off -s  再起動までの時間
’|#   　　 mm hh  * * * rtcwake -m off -s  ss
’|00 24 * * * rtcwake -m off -s 25200
’|# ↑24時00分にシャットダウンし、07時00分に起動する

例）
sudo su
# cronの設定ファイルに書き込む
crontab -e
# 次を追記 （\\\\\\\\\\\\\の中身）
\\\\\\\\\\\\\
# Schedule RTCWake
#   時刻(分 時) * * * rtcwake -m off -s  再起動までの時間
#   　　 mm hh  * * * rtcwake -m off -s  ss
00 24 * * * rtcwake -m off -s 25200
\\\\\\\\\\\\\
# 確認
crontab -l
```

##### 3. cronの設定内容を表示する
```sudo crontab -u root -l```
または
```sudo su -c "crontab -l"```

### 備考
　```timedatectl | grep "Time zone"```の実行結果が、
　"<font color="Red">Time zone:</font> Asia/Tokyo (JST, +0900)" でない場合は、タイムゾーンを東京に変更する。
```bash:bash
sudo timedatectl set-timezone Asia/Tokyo
sudo systemctl restart cron.service
```

## 引用元、参照元、参考先
crontabコマンドについてまとめました 【Linuxコマンド集】
　・https://eng-entrance.com/linux-command-crontab
Linux - rtcwake で指定時刻に自動復帰！
　・https://www.mk-mode.com/blog/2018/10/14/linux-auto-comeback-with-rtcwake/
sudo su とかしてる人はだいたいおっさん
　・https://zenn.dev/tmtms/articles/202105-sudo-su
Ubuntu 22.04 LTS Server タイムゾーン 日本時間(JST)への変更手順
　・https://server-network-note.net/2022/05/ubuntu-2204-lts-server-jst-timezone/
AI × 監視カメラサービスを調べてみた

# AI × 監視カメラを調べた動機
一時期話題をさらった無人店舗のAmazonGoしかり、工場だけでなく身の回りの家庭でも防犯・監視カメラ、見守りカメラといったものにAIを搭載したサービスを見かけます。
気になったので監視カメラに似た関連のサービスや開発会社等を調べてみました。

# AIカメラのメリット
常時流れる映像を常に監視・確認することは高い集中力を維持する必要があり、見落とし等が発生するリスクがありました。
AIカメラを導入することで、通常時の監視員を省くことができ、録画した映像を解析して異常と判断された時にだけ責任者に通知を送ることができ、監視作業の負担を軽減することができます。
それ以外にも小売店では今まで難しかった客層や店内レイアウトの分析等も行うことができるようになりました。

|  | AIカメラ | 既存のカメラ |
|---|---|---|
| 顔認識 | 自動 | 監視員が判断 |
| 行動予測 | 自動 | 経験が必要 |
| 集中力 | 問題ない | 途切れる |
| リアルタイム | リアルタイム | 多くは録画で確認 |
| 責任者・現場へのアラート | 自動送信 | 電話・メール等で知らせる |
| 監視員 | 不要 | 必要 |

# AIカメラの分野ごとのサービス・開発会社
## 小売業
ANA 開発：TOUCH TO GO

https://www.anahd.co.jp/ana_news/2022/07/19/20220719.html

ファミリーマート　開発：TOUCH TO GO

https://www.family.co.jp/company/cashlesscv.html

JR東日本　開発：Idein

https://prtimes.jp/main/html/rd/p/000000042.000026271.html

OPTiM

https://www.optim.cloud/ai-store/

## オフィス
三菱地所　開発：AWL

https://www.nikkei.com/article/DGXZQOUC283WT0Y1A021C2000000/


## 交通機関

JR東海　

https://www.nikkei.com/article/DGKKZO76220070Q1A930C2TB2000/

東京国際空港ターミナル(TIAT)　開発：NEC

https://www.travelvoice.jp/20210423-148668

## 製造業
三菱電機

https://newswitch.jp/p/29287

integrAI

https://prtimes.jp/main/html/rd/p/000000007.000084896.html

## 防犯対策
Dahua

https://prtimes.jp/main/html/rd/p/000000021.000085039.html

ALSOK 開発元：Umbo

https://www.alsok.co.jp/company/news/news_details.htm?cat=2&id2=1125

Asilla

https://www.asilla.jp/

## 見守り用

Justy

https://justiceye.jp/justy-toc/

A.I.Viewlife

https://aiview.life/

三菱電機

https://www.mdis.co.jp/service/kizkia-knight/
VSCodeでキーボードから「直前のコマンドを実行」したい


VSCodeの統合ターミナルを使ってる前提です。
「さっきターミナルで実行したコマンドをもう一度実行したい」ってことよくありますよね。
でもいちいちターミナルに移動して、上矢印押して、Enter！ってなんかいちいち面倒じゃないですか？
でもショートカットに登録もできそうにないし・・・

### ショートカット登録できた
と、半ば諦めてたんですが、こちらのリンクのおかげでできました。
https://qiita.com/abcang/items/7cc0e2d9ae552b6f27bc
sendSequenceで制御文字を送るという発想がなかったです。

keybindings.jsonにこんな感じで追加。
``` json
    {
        "key": "ctrl+k ctrl+h",
        "command": "workbench.action.terminal.sendSequence",
        "args": { "text": "\u001b[A\n" }
    },
```
key部分は各自好きに変更してください。

なにをしてるかというとターミナルに上矢印キーを押したときの制御文字`[[A`とEnter`\n`を送りつけてるだけです。
ちなみに制御文字16進表記はWikipediaで確認できます。
https://ja.wikipedia.org/wiki/%E5%88%B6%E5%BE%A1%E6%96%87%E5%AD%97#Field_separators

Windows + WSL2で確認しています。制御文字はターミナル側の処理のはずなので中身のshellには関係なく動くと思います。

### for vscode vimmer
vscode-vimを使ってて、settings.jsonにキーバインドを書いてる方はこっちのがオススメ。

``` json
    {
      "before": ["leader", "h"],
      "commands": [
        "workbench.action.terminal.scrollToBottom",
        {
          "command": "workbench.action.terminal.sendSequence",
          "args": { "text": "\u001b[A\n" }
        }
      ]
    },
```
commandsで複数のコマンドをまとめることができるので、最初にターミナルを一番下までスクロールさせてから実行させてます。
うっかりターミナルを上の方にスクロールしっぱなしで放置してても、ちゃんと実行結果が見れます。
before部分はお好きなように。


これでまた一つ快適になりました。
VSCode最高！
デイトラ「Web制作コース」　受講内容をアウトプット 14日目


学んだことをアウトプットしています。完全に自己満足ですので悪しからず。
以下の点を確実にアウトプット
①何で学んでるか
②日々の学習内容
③学びのポイント
④制作物
⑤+αで参考にした記事
⑥+αでやってみたこと

①デイトラ「Web制作コース初級編」　Bootstrap復習②
②　デイトラ簡易版サイトをBootstrapで書き直す
③なし
④簡単なｻｲﾄの作成
⑤・mr-auto は右側に、.ml-auto は左側に最大限のマージンをつける
 ・font sizeの変更方法
　　https://www.fenet.jp/dotnet/column/language/html-css/6524/
 ・行間調整方法
　　https://qiita.com/gaku0202/items/4101549592ad197103fc
 ・ﾌｫｰﾑﾀｸﾞの中央揃え方法
　　https://mebee.info/2022/06/21/post-71570/
⑥なし
【PHP】$_POSRで送信するためのチートシート

# $_POSTで送信するためには

## 発端
* $_POSTでデータが欲しいがやり方が曖昧だったためまとめる。
【結論】formに```method="POST"```、```buttonのtype="submit"```にしてれば飛ぶ。


## 方法
### form内で色々な情報を集めてまとめて送信する場合
```php:index.php
<form action="" method="POST">
    // inputBox
    <input id="userId" type="text" name="userId">
    // password
    <input id="password" type="password" name="password">
    // adress
    <input id="adress" type="adress" name="adress">
    // selectBox
    <select name="gender">
         <option value="0">選択してください</option>
         <option value="1">男</option>
         <option value="2">女</option>
         <option value="3">その他</option>
    </select>
    // button
    <button type="submit" class="btn">登録</button>
</form>
```
### POSTデータの取得
```php:recieve.php
$userId = $_POST['userId'];
$password = $_POST['password'];
$adress = $_POST['adress'];
$gender = $_POST['gender'];
```
<br>

### HOMEボタンやLOGOUTボタンのようにボタンのデータだけ飛ばしたい場合
```php:index.php
<form method="post">
    <button type="submit" name="navber" value="home">HOME</button>
    <button type="submit" name="navber" value="logout">LOGOUT</button>
</form>
```
### POSTデータの取得
```php:recieve.php
    if($_POST['navber'] == "home"){
        // homeボタンが押されたときの処理
    }elseif($_POST['navber'] == "logout"){
        // logoutボタンが押されたときの処理
    }
```
pythonのバイナリパッケージなぜwheelというのか説明できるやつ0人説

pythonは世界中で使われている最もポピュラーなプログラミング言語の一つです。
その名前が何にちなんでいるかは調べたことのある人はわかるでしょう。
そう、イギリスのコメディグループ[モンティ・パイソン](https://ja.wikipedia.org/wiki/%E3%83%A2%E3%83%B3%E3%83%86%E3%82%A3%E3%83%BB%E3%83%91%E3%82%A4%E3%82%BD%E3%83%B3)です。
もともとpypiはCheeseShopというコードネームで開発され、今もその呼び方で呼ぶ人がいるようにモンティ・パイソンは名前に関して多大な影響を与えています。

wheelもその例にもれずなのですが、その前に実際のスケッチ、日本語で言うショートコントを見てみましょう。

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

これは[空飛ぶモンティパイソン](https://ja.wikipedia.org/wiki/%E7%A9%BA%E9%A3%9B%E3%81%B6%E3%83%A2%E3%83%B3%E3%83%86%E3%82%A3%E3%83%BB%E3%83%91%E3%82%A4%E3%82%BD%E3%83%B3
)第33話チーズ・ショップです。


あらすじをwikipediaからコピペすると：

> ジョン・クリーズ演じる博識ぶった客（脚本では "Mousebender" と書かれている）がチーズ屋を訪れ、もったいぶった言い方で「チーズが欲しい」と店主に伝える。店主（マイケル・ペイリン）が表へ出て来て応対をするが、この店には「世界で最も人気なチーズ」であるチェダーすらも在庫が無い。一度、ウェンズリーデール（英語版）の時だけ店主が「はい！」と勢いよく答えるが、これは名前が「アーサー・ウェンズリーデール」（英: Arthur Wensleydale）だった店主が[注 1]、自分の名前を呼ばれたと勘違いして返事をしただけだった。

> 最後に客がチーズの在庫が本当にあるのか聞くと、店主は「勿論ですよ」と答える。客はその言葉を信用しようとせず、逆に「もし『いいえ』と答えたらお前さんの頭をぶち抜くぞ」と脅しをかける。店主が正直に、実は在庫が無いことを伝えるために「いいえ」と答えると、客はたちまち店主の頭を拳銃で撃ち抜く。

聞き取りに自信のある方はぜひご自身で楽しんでほしいのですが、聞き取りづらいところもあるので台本のリンクを置いておきます。
https://montycasinos.com/montypython/scripts/cheese.php.html

あらすじはwikipediaの通りなのですが、チーズショップというだけあって後ろに大きいチーズが丸々のっています。（劇中で触れられていませんでしたが一体なんのチーズ何でしょう？）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230043/c6d2d9b8-2a5b-eb7d-db6c-a9e1b30819d9.png)

この後ろにあるチーズこそがwheelなのです。

![Cheeseshop.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230043/679f32d8-c78e-81cb-f655-d240bcf53eab.jpeg)

a wheel of cheeseで円盤型のチーズ一個という意味になります。
wheelとは車輪とかそういうことではなかったというわけです。


今でこそ[チェダーも並んでいますが](https://pypi.org/project/cheddar/)当時のチーズショップには何もなかったことでしょう。vscodeもなくpoetryもない時代、python1の時代からpythonに馴染んでいた人たちには頭が下がります。

もしpypiにwheelを並べるときがあったらハードタイプのチーズの名前をつけてあげると少しかっこいいですね。
SAP GUI for Windows 8.00が出るぞっ

現時点(2023/1/21)でのSAP GUIの最新バージョンは7.70ですが次のバージョンは"SAP GUI for Windows 8.00”となるようです。
地味に7.10, 7.20...,7.70と小数点以下のバージョンアップでしたが一気に8.00に上がります。
この辺り、S/4HANA 2023に大きな変更があるのと関連があるのでしょうか。

変更点は下記のノートに記載があります。
3075781 - New and changed features in SAP GUI for Windows 8.00

・True 64bit version of SAP GUI for Windows
　完全に64bit化されるようです。確かに今まで32bitでしたからね。
　サポートプラットフォームに32bitもあるので32bit版と64bit版がリリースされるんでしょうか。
  →Note.3218166が出ていました。32bit版と64bit版が出て、機能が異なるようです。
　この辺、初物なので勇気がいりますね。

・Quartz Themes
　7.70に引き続きQuartzですが、レンダリングが最新化されるのと、見た目もまたちょっと変わるようです。
　

・HTML Control based on Microsoft Edge / WebView 2
　昨年Internet Explorer11のサポート終了の時に、WebView 2を入れて、HTMLコントロールを変更しましたが制限事項がありました。
　8.00ではデフォルトでEdgeベースになっていて、制限がなくなっている、らしい。
　GUIだけでは七区、Edgeのブラウザ拡張をインストールす必要があるらしいのでインストール手順追加されそう。
　要チェック。
　
ほかにも、下記の記載がありますがインストールしてから確認しようと思います。
・Usability Improvements
・SAP Logon
・Branding Image: Images can be configured per SAP system and client
・Revised font settings dialog and persistence of font settings per character set

尚、出荷予定は、2023/01/27の予定です。

--
66971 - Unterstützte SAP GUI-Plattformen
3075781 - New and changed features in SAP GUI for Windows 8.00
147519 - Maintenance strategy / deadlines for SAP GUI for Windows / SAP GUI for Java
3218166 - SAP GUI for Windows: Functional differences of the 64bit version compared to the 32bit version
①Portfolio using Python : Creating a Python Environment with Docker and VS code

【Objective】
I heard there are some data analysts using Python who dob't not have any CS background at all.
Therefore, I suddenly wanna know how difficuly python is compared to Java.


【Day1】
Before anything else, creating a dev environment is a must.
The list below is all required to install.
- Docker
- WSL2
- linux
- Git
- VS code
- creating a new docker container

I could build and run a Python in a container with VS code and Docker.
![スクリーンショット 2023-01-21 015107.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2935967/b9be18b8-2cb0-7c32-b10b-5c61bb3acf46.png)
【PHP】requier_oneceのパスについて

# requier_oneceのパスについて

## 発端
* ファイルパスは合っているはずなのに読み込めなくて何度もハマったのでまとめる。

## 原因
PHPは、「実行したファイルのあるディレクトリが常に実行時のカレントディレクトリになる」という規則があるためエラーとなってしまっていたっぽい。

## 解決策
### ```__DIR__```もしくは```dirname(__FILE__)```を使おう
1. ```__DIR__```は記入したファイルが所属するディレクトリまでのパスを返してくれる。
```
test--
    |-layout
    |   |_layout.tpl
    |
    |-module
    |   |_module.php
    |
    |-template_c
```
```php:module.php
// layout.tplを読み込みたい場合
// __DIR__には ~/test/moduleまでのパスが入っている
requir_onece(__DIR__."/../layout/layout.tpl");
```

２. ```dirname(__FILE__)```は記入したファイルが所属するディレクトリまでのパスを返してくれる。
```php:module.php
// layout.tplを読み込みたい場合
// dirname(__FILE__)には ~/test/moduleまでのパスが入っている
requir_onece(dirname(__FILE__)."/../layout/layout.tpl");
```
【LuaTeX】句読点をビルド時にピリオドとコンマに変換する

$Lua\TeX$限定。論文を書くときに日本語入力と英字入力を行き来するのが面倒なので、コンパイル時に勝手に置き換えてもらう。
```tex:以下を貼り付ける
% 「。」「、」→「. 」「, 」
\usepackage{fontspec,xcolor}
\usepackage{luacode,luatexbase} 

\begin{luacode}
local function kutenToPeriod ( line )
  return string.gsub(line, "。" , "\\Kuten{}") 
end
luatexbase.add_to_callback( "process_input_buffer",  kutenToPeriod, "kuten_to_period")

local function totenToComma ( line )
  return string.gsub(line, "、" , "\\Toten{}") 
end
luatexbase.add_to_callback( "process_input_buffer",  totenToComma, "toten_to_comma")
\end{luacode}

\newcommand\Kuten[1]{. }
\newcommand\Toten[1]{, }
```

## 例
```tex:document.tex
\documentclass{article}
\usepackage{luatexja}

\usepackage{fontspec,xcolor}
\usepackage{luacode,luatexbase} 

\begin{luacode}
local function kutenToPeriod ( line )
  return string.gsub(line, "。" , "\\Kuten{var}") 
end
luatexbase.add_to_callback( "process_input_buffer",  kutenToPeriod, "kuten_to_period")

local function totenToComma ( line )
  return string.gsub(line, "、" , "\\Toten{var}") 
end
luatexbase.add_to_callback( "process_input_buffer",  totenToComma, "toten_to_comma")
\end{luacode}

\newcommand\Kuten[1]{. }
\newcommand\Toten[1]{, }

\begin{document}
ごめん、同級会には行けません。いま、シンガポールにいます。 \\

この国を南北に縦断する地下鉄を私は作っています \\

本当は、あの頃が恋しいけれど……。 \\

でも、今はもう少しだけ知らないふりをします。 \\

私の作るこの地下鉄も、きっといつか、誰かの青春を乗せるから。
\end{document}
```

`output.pdf`
![Screen Shot 2023-01-21 at 2.17.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2658828/6373e395-35fe-6594-7fa5-b058f1d5a305.png)

## その他
- $\TeX$の命名規則はよく知らないが、`\kuten`は定義されているのでとりあえず`\Kuten`とした。
- 日本語の文章は日本語用に設計された句読点を使った方が当然読みやすいのに、なぜアルファベット用のピリオドとコンマの使用を強いられなければならないのかとても謎である。

## 参考
https://tex.stackexchange.com/questions/165218/macro-replace-all-occurrences-of-a-word
LaTeX 図表の相互参照で番号が??になってしまう

# 起きたこと

$\LaTeX$ の相互参照を使おうとしたら`表??`の表記になってしまい、番号が挿入されなかった。

# 直し方
`\label`を`\caption` の後に書くようにしたら直った。

変更前
```latex
\begin{figure}[h]
  \centering
  \includegraphics[width=0.9\linewidth]{image.png}
  \label{fig:label}
  \caption{キャプション}
\end{figure}
```

変更後
```latex
\begin{figure}[h]
  \centering
  \includegraphics[width=0.9\linewidth]{image.png}
  \caption{キャプション}
  \label{fig:label}
\end{figure}
```
Cloudflare "Always Use HTTPS" を Redirect Rules で書く

# Always Use HTTPS とは

- [Always Use HTTPS · Cloudflare SSL/TLS docs](https://developers.cloudflare.com/ssl/edge-certificates/additional-options/always-use-https/)
    - 参考：[Cloudflare SSL mode による HTTPS 化を確認する - Qiita](https://qiita.com/khayama/items/842d68f617e1ba2f16e9)

対象ドメイン内ですべての `http` リクエストを `https` に 301 リダイレクトする設定です。

![image-20230121012552757](https://cdn.jsdelivr.net/gh/kyouheicf/image@master/uPic/image-20230121012552757.png)

# Ridirect Rules で書く

Redirect Rules を使えば、従来の Page Rules より柔軟で Dynamic な挙動を実現できます。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Dynamic Redirect Rules (Beta) の発表。これも Ruleset Engine による表現が肝。様々なユースケースに対応でき、ローカル言語に応じたサイト誘導、デバイスタイプ、クッキーベースなど。<a href="https://t.co/fy7lx0IbVd">https://t.co/fy7lx0IbVd</a></p>&mdash; kyhayama (@kyhayama) <a href="https://twitter.com/kyhayama/status/1578056316211580928?ref_src=twsrc%5Etfw">October 6, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

今回の "Always Use HTTPS " を Redirect Rules で書くと以下のようになります。

ここをスタートポイントとして、除外したい条件やより特定したい条件を追加すると便利です。

![image-20230121013008782](https://cdn.jsdelivr.net/gh/kyouheicf/image@master/uPic/image-20230121013008782.png)

# 確認

以下のように想定通りの挙動になったことが確認できます。

```
% curl -v "http://www.example.com/articles/index?section=539061&expand=comments"
*   Trying 2606:4700::6812:9e2:80...
* Connected to www.example.com (2606:4700::6812:9e2) port 80 (#0)
> GET /articles/index?section=539061&expand=comments HTTP/1.1
> Host: www.example.com
> User-Agent: curl/7.82.0-DEV
> Accept: */*
> 
* Mark bundle as not supporting multiuse
< HTTP/1.1 301 Moved Permanently
< Date: Fri, 20 Jan 2023 16:16:14 GMT
< Transfer-Encoding: chunked
< Connection: keep-alive
< Cache-Control: max-age=3600
< Expires: Fri, 20 Jan 2023 17:16:14 GMT
< Location: https://www.example.com/articles/index?section=539061&expand=comments
< Server: cloudflare
< CF-RAY: 78c91d09fa57ef81-NRT
< 
* Connection #0 to host www.example.com left intact
```
ワードプレスの管理画面にスタイルを適応させる

クライアントさんにとって扱い使いやすいWordrPessにするために、管理画面にもCSSを適応させます。以下のコードは`functions.php`に記述します

~~~ php
function enqueue_post_styles() {
  global $pagenow;
  if ( $pagenow == 'post.php' || $pagenow == 'post-new.php' || $pagenow == 'edit.php' ) {
    wp_enqueue_style( 'post_styles', get_template_directory_uri() . '/assets/css/post.css');
  }
}
add_action( 'admin_enqueue_scripts', 'enqueue_post_styles' );
~~~
上のコードでは投稿画面にCSSを適応させます。固定ページにしたい場合は`post`の部分を`page`に変えましょう。
また、特定のページのみにスタイルを当てたい場合は、`if`部分を`$_GET['post'] == 'ページID'`に変えます
~~~ php
  if ( $_GET['post'] == '100' ) {
    wp_enqueue_style( 'post_styles', get_template_directory_uri() . '/assets/css/post.css');
  }
~~~
こうすればそのページIDにのみ読み込みます。また、カスタム投稿にCSSを当てたい場合は、100の部分をそのカスタム投稿名に変更すれば適応されます。


#### 参考
https://deco8.net/admin-custom-post-css/#news

https://baigie.me/officialblog/2022/04/19/wordpress-tips-1/

https://memocarilog.info/wordpress/7570
Auroraのカスタムエンドポイントが変更中も利用できるようになってた


# 以前まで（公式ドキュメントによると、2022/3/18前まで）

Auroraカスタムエンドポイントは変更中に一時的に接続エラーとなる場合があり
カスタムエンドポイントのメンバーを変更したりするためにシステムを停止する必要がありました。

> You can't connect to or use a custom endpoint while the changes from an edit action are in progress\. It might take some minutes before the endpoint status returns to **Available** and you can connect again\. 

勘弁してくれよAWSって思いながら、実際にカスタムエンドポイントを変更している最中に
クライアントエラーするのかテストをしたことがあり
記載の通り、数十秒繋がらなくなる場合があるという結果が出ていました。

クライアント側がリトライするように実装すればいいんですけどね。。。


# ひっそりと更新されてた

https://github.com/awsdocs/amazon-aurora-user-guide/commit/de3513a3a4a6895860d62b9ba37de3e82d755b9b#diff-76dd5975ee79dd0552a3b498d853f22376f7ba80325881b99d3e0bd00327a384R299

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77622/7853c73d-f555-9782-f285-5b027394b00d.png)

https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Aurora.Overview.Endpoints.html

>Editing a custom endpoint
>
>You can edit the properties of a custom endpoint to change which DB instances are associated with the endpoint. You can also change an endpoint between a static list and an exclusion list. If you need more details about these endpoint properties, see Membership rules for custom endpoints.
>You can continue connecting to and using a custom endpoint while the changes from an edit action are in progress.

ひっそりと仕様が更新されて、カスタムエンドポイント変更中も接続できるようになっていました！

何が言いたいかというと、このアップデートで結構世の中のエンジニア救われているんじゃないか説があると思っており
AWSはこのリリースノートを出していないと思われるので（個人的に確認した限り）
AWSさん大きめにリリースノートとかAWSブログとかに書いてよ！
っていう気持ちが強くて、とりあえずqiitaに書いて、困っているインフラ担当者に届けばいいなという投稿でした。
流行りのAIでBGMを作ってみた

# 前段
ここ最近ずっとAIの流れ来てますよね。
やっぱ流行りには乗っていきたいよねという事でChatGPTとかをちょっと触るくらいの事はやってたのですが、コミュ障なものでAIと会話するテーマが見つからずにそっと閉じてました。

そんな折に諸事情でBGMが必要な状況になりました。
ちょうどそのタイミングでAIで作曲できるよねみたいな話も聞いたところだったので、
外部に発注するとお金かかるしAIにBGMを作ってみようかという事でやってみることにしました。

# 事前調査

## 使ってるツールの調査
そもそもどうやってAIで作曲できるかわからないのでAIで作曲してそうな人を探す。
すると落合陽一さんが動画メディアの中でいじってるのを発見。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29008/a60de401-3e12-c7bd-6c8a-78f853b37252.png" width="500">

引用：[【落合陽一のシンギュラリティ論】シンギュラリティは2025年に来る／ディフュージョンモデルの衝撃／知的ホワイトカラーが没落する／最新版デジタルネイチャー／音楽と論文が数秒でできる](https://www.youtube.com/watch?v=j2TbvmXN_Y4)

Mubert_Text_To_Musicなるものがあるらしいのでこいつを調査する。

## Mubert_Text_To_Musicの調査
ぐぐると比較的すぐに見つかるったので、
セットアップ方法から手順を紹介してくれてるっぽいサイトを参考にする。
[【音楽生成AI】Text to musicの使い方を解説！テキストから音楽を作成する魔法のツール
](https://gussan-no-ie.com/text-to-music-tsukaikata/)

記事とリポジトリの情報によると、

> Text to musicとは、その名の通りテキストにより指示を出すことで音楽を生成してくれる音楽生成AIです。

テキストから音楽を生成してくれるらしい。ほしかったやつです。

>A custom license works for colab. You can use the music for free with attribution to sync with images and videos, but you can't release it on DSPs (Spotify, Apple Music, Deezer etc.) as your own. We also ask you to mention @mubertapp and hashtag #mubert. If you need a commercial license — please contact us.

これは詳しくはもうちょい調査が必要だけど、
自由に使ってもらっていいけど、デジタル音楽配信には載せないでね。
商用で使いたいときには問い合わせてねと解釈しておく。

## セットアップ
手順に関してはまんま参考資料に載せたところで解説するので割愛。
ざっくりいうと
1. Mubert-Text-to-Musicのgithubリポジトリに行く
2. [Open in Colab]ボタンを押す
3. Colabページで表示されてるsetupっぽいボタンを上から順に押していく

以上！
実に簡単。情弱の僕でも10分程度でセットアップできました。

## いろいろ試してみる

promptをいじっていくつかbgmっぽいものを生成してみました。
同じpromptでも毎回違う音楽が生成されるので何度も試してみてそのうちいいのができたら採用みたいなのがいいかもしれません。

ただ実際に業務で使うのであれば、細かくここをこうして欲しいみたいな注文をしたくなるもので、
そのまま使うってのは厳しそう。（商用は相談してねと書いてあるのもあるし）
さらに結構コツが必要でまだ自分はそのコツを掴みきれてない印象。

なのでこういうサウンドがいいよねーというイメージを伝えたり、
明確にこういう音が良いとかがない雰囲気で良いような場面では良さそう。

ぜひお試しあれ。

# 参考資料
[【落合陽一のシンギュラリティ論】シンギュラリティは2025年に来る／ディフュージョンモデルの衝撃／知的ホワイトカラーが没落する／最新版デジタルネイチャー／音楽と論文が数秒でできる](https://www.youtube.com/watch?v=j2TbvmXN_Y4)
[【音楽生成AI】Text to musicの使い方を解説！テキストから音楽を作成する魔法のツール
](https://gussan-no-ie.com/text-to-music-tsukaikata/)
主なOpenLDAPの管理用コマンド

主なOpenLDAPの管理用コマンド

・slapadd　エントリの追加
・slapcat　データベースからデータをLDIFファイルとして出力
・slaptest　設定ファイル「slapd.conf」の構文をチェック
・slapindex　設定ファイル「slapd.conf」で設定したインデックスを作成
・slappasswd　サーバ管理者のパスワードをハッシュ化して生成

上記コマンドの主な共通オプション
・-v 詳細情報の表示
・-d 数　デバッグレベルの指定(slappasswdコマンド以外)
・-f ファイル名　設定ファイルの指定(slappasswdコマンド以外)
・-c エラー発生時も処理を継続(slappasswdコマンドとslaptest以外)
・-n 数　使用するデータベースをDB番号で指定。DB番号はデータベースの設定がslapd.confに何番目のdatabaseディレクティブとして記述されているのかを表す。「-b」との併用は不可。(slappasswdコマンドとslaptest以外)
・-b DN 使用するデータベースをDNで指定。DNはsuffixディレクティブで使用されているもの。「-n」との併用は不可。(slappasswdコマンドとslaptest以外)
MacのSublime TextでLaTeX環境構築.備忘録

# 注意
個人的なメモのため、適当に書いていることがあります

# 環境
macOS Catalina (10.15.7)
Sublime Text (Build 4143)
Homebrew 3.6.20

# インストール
## コマンド
BrewでMacTex, Skimをインストール
MacTexはTexで, Skimはpdfを見るアプリ
```bash
brew install --cask mactex
brew install --cask skim
```

## Sublime
パッケージ「`LaTexTools`」をインストール
パッケージのリンク: https://latextools.readthedocs.io/en/latest/

Sublime Text / Preferences / LaTexTools / Settings-User
最初は何か言われるけど無視でok

398行目, `"builder-settings"`の中に以下を追記
```json
		"command" : ["latexmk", "-cd",
				"-e", "$latex = 'platex %O -no-guess-input-enc -kanji=utf8 -interaction=nonstopmode -synctex=1 %S'",
				"-e", "$biber = 'biber %O --bblencoding=utf8 -u -U --output_safechars %B'",
				"-e", "$bibtex = 'pbibtex %O %B -kanji=utf8'",
				"-e", "$makeindex = 'upmendex %O -o %D %S'",
				"-e", "$dvipdf = 'dvipdfmx %O -o %D %S'",
				"-f", "-%E", "-norc", "-gg", "-pdfdvi"],
```

# 終わり、テスト
`latex テスト` って調べて一番上に出てきた[サイト](http://www.damp.tottori-u.ac.jp/~hoshi/info/doc-info-2009/sample.tex)で試してみた

ショートカットキー: `cmd + b`
選択画面が出てくるので、一番上(LaTex)でビルド
Skimが出てきたらOK
ruby3.1に上げたらrubyの外部コマンド起動がエラーになって途方に暮れたら

ruby2.7を3.1に上げた時、それまで動いていたruby on railsのプログラム起動の仕組みが、起動時に
```
can't find executable rails for gem railties. railties is not currently included in the bundle, perhaps you meant to add it to your Gemfile? (Gem::Exception)
```
というエラーで起動できなくなりました。

原因と対策はこちらのページに御世話になりました（感謝）。

おおたの物置
　bundle中に別のbundleを呼ぶと予期しない結果になる対策
https://ota42y.com/blog/2015/01/28/bundle-in-bundle/

こちらにあるようにruby3.1の直接の問題ではありませんが、
当方で起動をしかけていたのは別のrubyプログラム（プロセス監視）で、ruby3.1にした際に
net-smtpなどをGemfileで指定しなければならなくなり、それによって起動しようとしたrailsの方のGemfileを読んでくれなくなった、という因果関係でした。
時期的に移行でひっかかる人がいる可能性があるかと、ruby3.1をタイトルに入れた次第です。

なお、上記ページに書かれていた対策の　Bundler.with_clean_env　は has been deprecated とのことで、現在は Bundler.with_unbundled_env　か　Bundler.with_original_env　が推奨とのメッセージが出ました。
【Android】不労所得のために入れたAdViewで遭遇したエラーを解決するTips

# はじめに

Jetpack Composeを使って、アプリに広告を配置するために`AndroidView`と`AdView`を使用しました。

その際に発生したエラーの解決方法をコードを交えて紹介したいと思います。

# val cannot be reassigned

`adSize`プロパティに、`AdSize.BANNER`を代入しようとしたらエラーが発生しました。

```kotlin
val cannot be reassigned
```

こういう場合は`setAdSize()`を使用しましょう。

```kotlin
val adView = AdView(context).apply {
    setAdSize(AdSize.BANNER)
    loadAd(AdRequest.Builder().build())
    adUnitId = "ca-app-pub-xxx"
}
```

# The ad size and ad unit ID must be set before loadAd is called.

`loadAd()`の呼び出しを`adUnitId`への代入の前に実施していました。

```kotlin
val adView = AdView(context).apply {
    setAdSize(AdSize.BANNER)
    loadAd(AdRequest.Builder().build())
    adUnitId = "ca-app-pub-xxx"
}
```

するとエラーが発生しました。

```shell
The ad size and ad unit ID must be set before loadAd is called.
```
次のように、`loadAd()`の呼び出しを`adUnitId`への代入後に行うことで解決しました。

```kotlin
val adView = AdView(context).apply {
    setAdSize(AdSize.BANNER)
    adUnitId = "ca-app-pub-xxx"
    loadAd(AdRequest.Builder().build())
}
```

# テスト広告が表示されない

設定は正しく行なっているのに、テスト広告が表示されない場合があります。

まず、AndroidManifest.xmlを確認します。

正しくアプリIDが設定されていますか？

> ※ android:valueに設定しているアプリIDはテスト用の値です。
> 

https://developers.google.com/admob/android/quick-start?hl=ja#import_the_mobile_ads_sdk

```xml
<application>
    <activity
        ...
    />
    <meta-data
        android:name="com.google.android.gms.ads.APPLICATION_ID"
        android:value="ca-app-pub-3940256099942544~3347511713" 
        />
</application>
```

**MainActivity.kt**の`onCreate()`で、正しく初期化されていますか？

```kotlin
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    // Google Mobile Ads SDKを初期化する
    MobileAds.initialize(this) {}
    // ...
}
```

広告ユニットの識別子が正しく設定されていますか？

そして、`adView`単体ではなく、`adView.rootView`を返していますか？

僕の場合は`adView`のみを返すようにしてしまったため、表示されませんでした。

必ず`adView.rootView`を返してください。

> ※広告ユニットの識別子はテスト用です。

https://developers.google.com/admob/android/banner?hl=ja

```kotlin
AndroidView(
    modifier = Modifier.fillMaxWidth().background(Color(0xff000000)),
    factory = { context ->
        val displayMetrics = Resources.getSystem().displayMetrics
        val width = (displayMetrics.widthPixels / displayMetrics.density).toInt()
        val adView = AdView(context).apply {
            setAdSize(AdSize.getCurrentOrientationAnchoredAdaptiveBannerAdSize(context, width))
            adUnitId = "ca-app-pub-3940256099942544/6300978111"
            loadAd(AdRequest.Builder().build())
        }
        adView.rootView
    }
)
```

# まとめ

バナー広告が正しく表示されると次のようになります。

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577119/79c1c743-f158-18a2-aa6d-ca8734ace23f.png)

広告を開発中に表示する場合は、本番用のIDや識別子を使用しないように注意してから開発に挑みましょう。

# 参考にした記事

https://developers.google.com/admob/android/quick-start?hl=ja



https://stackoverflow.com/questions/72407459/android-kotlin-adview-adsize-val-cannot-be-reassigned

https://qiita.com/tsumuchan/items/3e88e8fcc78a2781df85

https://qiita.com/kewpie134134/items/31f678a30deeb9c2465e

https://itnext.io/admob-banner-interstitial-in-jetpack-compose-47a1b700198c
ChatGPTにソースコードのリファクタリングをお願いしたら想像以上にレベルが高くて感動した話

最近巷ではChatGPTが話題になっていますね。

どれだけすごいの？と気になったので試しにプログラムのリファクタリングをお願いしてみました！

最初に感想を述べてしまうと、もはや中にベテランエンジニアが入ってるんじゃね！？と思うほどレベルが高く良くできていると感じました。

※ 記事中は英語での会話になっていますが日本語でも可能でした

### ChatGPTとの会話

とりあえず最初のやり取りはこんな感じでリファクタリングをお願いしてみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309621/355aa32d-8656-5996-c59e-6029c1046da7.png)

自分のシンプルなメッセージに対してすごい熱量で前向きに返信してくれます。この時点ですでに感動。そのまま翻訳を適用すると以下の日本語になります。

> ソース コードのリファクタリングをお手伝いできれば幸いです。コードの機能と、具体的にどのような変更を加えたいかについて、さらに詳しい情報を提供していただけますか?また、ソース コードまたはそのリンクを提供してください。確認できるようになります。

快く受け入れてくれたので早速リファクタリングしてほしいソースコードを貼り付けて送ってみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309621/24f09e1c-6faa-2f4c-804c-c28cc2cc3d4a.png)

上記のソースコードは、過去に以下の記事で紹介したeachよりもmapを使う方が適切なパターンです。さて、ChatGPTの実力やいかに・・・

https://qiita.com/massaaaaan/items/d90d10cb023bedc74fb2

その後返ってきたメッセージがこちら

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309621/64359589-7907-8d2f-17df-b4d7b41dba5d.png)

おおおお！最初は送ったソースコードの処理の流れを説明してくれていますね
そしてmapを使う方が良いよと教えてくれて期待通りeachをmapに変更したソースコードを送ってくれました！しかも2パターン！
(2023/1/21追記：実際には後者のパターンは文法エラーになります。提案されたコードが正しく動作する保証はないのでご注意ください)

この時点で感動して鼻血出そう。すごいぞChatGPT！

早速続いてのお題を与えてみます。
次はifをネストしたプログラムを送ってみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309621/f63f2491-4382-884f-a405-6b089c618344.png)

そして返ってきた返答がこちら。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309621/2227683b-e655-107f-ccb2-65312ba8e4fd.png)

先ほどと同様にプログラムの解説とリファクタリング後のソースコードが返ってきました。
期待通りぼっち演算子(&.)を使った書き方に直してくれています！

しかもプログラミング言語がrubyだと教えていないのに勝手に判断してくれたようです。すごすぎる。

最後に人間にとっては理解が難しいような条件式を試してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309621/73d42742-c0bb-7758-d668-5871913afdfb.png)

こちらも例の如く解説とリファクタ後のコードを返してくれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309621/27082e27-d6ee-be91-d694-ccb1881077a9.png)

一つ目は期待通りド・モルガンの法則を使ってリファクタリングしてくれました！
しかし、二つ目はどうやら元のプログラムとは結果が変わってしまいます。


どうやらChatGPTも完璧というわけではなさそうです。

最後にお礼を述べて去ることにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309621/60d43293-a3c7-da9b-4233-412f2f56e014.png)

私の一言だけのそっけないメッセージに対しても温かい返事をくれました。
ホスピタリティが高くて涙が出そうです。

### おわりに

AIのレベル感がどんなものか興味本位での試みでしたが、どのお題に対しても私の想像を超えるレベルの高い回答が返ってきたので正直度肝を抜かれました。

返答のホスピタリティも非常に高く「AI = 冷たい」という私の勝手なイメージも覆されました。

果たしてChatGPTはエンジニアの存在を脅かす存在なのか？はたまたエンジニアと並走できる強力なパートナーなのか？

いずれにせよ私たちのプログラミングのやり方を大きく変えるゲームチェンジャーになり得る存在だと感じました👏

### 追記

勝手に英語でないと使用できないと思っていましたが日本語でも大丈夫でした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309621/dc64dadf-e2a6-cb7a-b73a-36b9c2f04608.png)
GitHub Actionsのcronが60日で止まる件対応をしてみる


こちらの記事になるように60日間動きがないとcronが止まってしまう模様です。

https://zenn.dev/hellorusk/articles/fc6d4696f5b269

定期的に定期実行処理が止まってる。。

## 現在時刻をもとにファイル作成してGit Pushしてみる

- 現在時刻取得
- JSONファイル作成
- GitHub Actions側からGit Push

をして定期実行すれば常に動き(commitやpush)がある状態になりそう。

## JavaScriptの処理でJSONファイルを書き出す

現在時間を取得してJSONに書き出す処理です。
時間はday.jsを使用

```js

const fs = require('fs');
const LOGFILE_NAME = `log.json`;

//日本時間
const dayjs = require('dayjs');
const utc = require('dayjs/plugin/utc');
const timezone = require('dayjs/plugin/timezone');
dayjs.extend(utc);
dayjs.extend(timezone);
dayjs.tz.setDefault("Asia/Tokyo");


//ロギング
const logjson = {
	msg: 'success',
	time: dayjs().tz().format()
}

fs.writeFileSync(LOGFILE_NAME, JSON.stringify(logjson));
console.log(`log done--`);    
```

## GitHub Actionsに追記

以下でGitHub Actions側でGit commit & pushをしてくれる

```yml
      - name: git commit & push
        run: |
          git config core.filemode false
          if ! git diff --exit-code --quiet
          then
            git add --update
            git config user.name github-actions
            git config user.email action@github.com
            git commit -m "Commit by github-actions"
            git push https://${{github.actor}}:${{secrets.GITHUB_TOKEN}}@github.com/${{github.repository}}.git HEAD:${{github.ref}}
          fi
```

参考: https://intestine.hatenadiary.jp/entry/2021/08/10/151409

## ということで様子見

一旦回してみるけどこれで60日経った時にうごいてればセーフです。
検証中...
【Linux】tarでアーカイブを展開する方法

## アーカイブの展開
```:ターミナル
$  tar xvf アーカイブ名 対象ファイル1 対象ファイル2　...
```

```:ターミナル
$ tar xvf sample.tar
```

## 圧縮したアーカイブの解凍及び展開
```:ターミナル
$  tar xvzf アーカイブ名 対象ファイル1 対象ファイル2　...
```

```:ターミナル
$ tar tar xvzf sample.tar.gz
```

## オプション
| オプション | 説明 |
|:-:|:-|
| c | アーカイブを新規作成 |
| x | アーカイブを展開 |
| v | 実行時に詳細を表示 |
| z | 圧縮処理を行う  |
| f | アーカイブファイルを指定 |
| t | アーカイブファイルの一覧を表示  |
interfaceやprotocolってなんぞ？

## はじめに
私は、現在大学生なのですが、同じ学部の大学生からソフトウェアエンジニアのバイトをできる人が集まりませんでした。そこで今回は使用している`interface`をわかりやすく解説していこうと思います。

Goにおける`interface`は他言語にも実装されており、JavaやObjective-Cも同様の語句で使用・実装できます。ただ、私の専門がswiftなので`interface`と同じ役割の`protocol`を使います。 :pray:
説明上は`interface`を使いますが、コード上では`protocol`と書きます。



## そもそも`interface`とは？

`interface`の説明の前に、、、オブジェクト指向って知ってる？:thinking: 

### オブジェクト指向（言語）をざっくり解説
「この世の全てのものは`object（モノ）`であり、`モノ`はそれ固有の処理を有する。その`モノ`が集まってこの世の`モノ`はできている。」みたいな考え方。`モノ`を表現する方法で`class`や`struct`を使用します。
例）荷車：タイヤ（回転して移動する）、荷台（積載物を乗せる）

基本の構成要素は
- `class`や`struct`の持つ`モノ`を`property`
- `class`や`struct`の持つ処理`method`

です。

仮に人（`Human`）クラスを作ると下記のようになる。
↓ swiftだとこんな感じ

```swift
class Human {
    // これがproperty
    var arm: Arm

    // 今回の話に関係ないので無視（イニシャライザって言います）
    init(arm: Arm) {
        self.arm = arm
    }

    // これがmethod
    func bend(angle: Float) {
        // ここに何をするか記載
    }
}

class Arm {
    // これもmethod
    func bend(angle: Float) {
        // ここに何をするか
    }
}
```

例えば、上のクラス`Human`は腕（`arm`）を持っていることがわかる。腕を持っているので曲げる処理`bend(angle: Float)`といった`method`がある。

:angel:＜「あれ、、、`Human`だから「腕がある」、「腕が曲げられる」って本当？腕がない人も骨折して曲げられない人もいるよね？」

というわけで、そんな例外を減らそう！！

### 設計方針
今回の条件は
1. `Human`は腕`arm`という`property`を保有します。四肢が見た目上、揃っていると思ってください。腕がない人は存在しません。
1. `Human`は腕を曲げる`method`を保有します。
1. 腕を曲げる`method`は`arm`の曲げる`method`を呼び出します。

これをコードにすると
```swift
class Human {
    var arm: Arm

    init(arm: Arm) {
        self.arm = arm
    }

    func bend(angle: Float) {
        self.arm.bend(angle: angle)
    }
}

class Arm {
    init() {}
    
    func bend(angle: Float) {
        print("腕を\(angle)度、曲げます。")
    }
}
```

`Human`、`Arm`クラスともに内容を見ての通り健常者の腕を想定して作りました。つまり、義手の人や骨折した人は想定できていませんね。そこで、`interface`の出番です。

### interfaceとは、、、

`interface`とは、`method`や`property`を保有していることを宣言する道具です。つまり、処理の中身が伴わなくても問題ないということです。

具体的にいうと、、、
「腕のように見える`モノ`は腕として見做す。」ということです。この「腕のように見える`モノ`」を`interface`といいます。

これをswiftで書き表すと、、、

```swift
class Human {
    var arm: ArmInterface

    init(arm: ArmInterface) {
        self.arm = arm
    }

    func bend(angle: Float) {
        self.arm.bend(angle: angle)
    }
}

protocol ArmInterface {
    func bend(angle: Float)
}
```

となります。ちゃんと腕のように見える`モノ`を人は保有していますし腕としての動作を保証しているので問題ありません。ここで、それぞれの腕クラスを作りましょう。それぞれ、`class`名の後に`: ArmInterface`を書いて`ArmInterface`であることを示しています。

#### 腕
```swift
class Arm: ArmInterface {
    init(){}
    
    func bend(angle: Float) {
        print("腕を\(angle)度、曲げます。")
    }
}
```

#### 骨折した腕
```swift
class BrokenArm: ArmInterface {
    init() {}
    
    func bend(angle: Float) {
        print("骨折しているので動かないです")
    }
}
```

#### 義手
```swift
class ProstheticArm: ArmInterface {
    init() {}
    
    func bend(angle: Float) {
        print("ウィ〜んと音が鳴りながら、腕を\(angle)度、曲げます。")
    }
}
```

これで、`Human`クラスは腕、骨折した腕、義手を使用できるようになりました。

本当に動くのか確認してみましょう。
```swift
let a = Human(arm: Arm())
let b = Human(arm: BrokenArm())
let c = Human(arm: ProstheticArm())

a.bend(angle: 20)
b.bend(angle: 20)
c.bend(angle: 20)
```
実行結果です。
```
腕を20.0度、曲げます。
骨折しているので動かないです
ウィ〜んと音が鳴りながら、腕を20.0度、曲げます。
```

## まとめ
`interface`とは「`class`や`struct`が〜に見える」と宣言する道具です。

## 最後に謝罪
この記事において人が腕を持つといった話を出したのはあくまで概念を具体化し説明しやすくするためです。差別的な意図はないですが、ご気分を悪くされましたら申し訳ありません。
PowerAutomateで動的コンテンツの候補が出ない場合について

# 概要
## 動的コンテンツとは？
PowerAutomateでは基本的には動的コンテンツの候補が自動で出てきてくれると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130969/c4aa0d20-ddae-1000-e80a-aebfa947692b.png)
↑↑↑こういうやつですね

## 今回の問題
そしてタイトルにも書いたように動的コンテンツの場合は出てこない場合もあります。
こうした際は自身で定義・書かないといけないです。

さらに今回は下記画像のように同じ処理2回目に自動挿入される「2,3…」出てきた場合にハマったエラーになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130969/a78f5cb3-0a67-e97c-8034-cea5708bcc4b.png)


### 保存が出来ない
今回のエラーの場合、間違っていても式で挿入は可能でした。
しかし保存（フローチェッカーを使用）した際に出てきたエラーが下記画像になり、保存が出来ませんでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130969/61112b77-3f71-d11e-0db9-6bac2d525edd.png)


# エラー
## 今回ハマった実際の定義
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130969/a269e7fb-ed1a-838f-a66d-fdc87ac4e8f3.png)
※「モバイル通知を受け取る」でデバックのために出力してます。

### ここで定義していた式（エラーになります）
```
outputs('アダプティブ カードを投稿して応答を待機する 2')?['body/data/member_choice']
```

# 解決方法
## 何が間違っていたか
定義にスペースが入っている場合は、「_（アンダーバー）」が必要なようです。
従って今回であれば、「カード」と「2」の直前のスペースと置換しました。

### 上手くいった定義式（解答）
```
outputs('アダプティブ_カードを投稿して応答を待機する_2')?['body/data/member_choice']
```

# 最後に
今後もハマった箇所については、なるべく備忘録として残していく予定です。
また、間違っていた場合などはコメントください。
【Mac】Macからリモート接続したWindows上のiTunesで再生中の音をMacから出す

Microsoft Remote Desktop経由でWindowsマシンにリモート接続し、Windows側でiTunesを起動し再生中の音をMac側で出せるようにする。

Microsoft Remote Desktopの接続先情報で、Devices&AudioタブでPlay soundを「On this computer」に設定。
![スクリーンショット 2023-01-20 22.47.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2988380/f0c664e2-6127-1fca-fac5-0fbb3d930a48.png)

Windows側のiTunesの環境設定で、再生タブでオーディオの再生方法を「Direct Sound」に設定する。デフォルトは「Windows Audio Session」だが、この状態だと他の音がMacから出てもiTunesの音だけWindowsから出てしまう。設定後はiTunesを再起動する。
![スクリーンショット 2023-01-20 22.56.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2988380/b0916065-91ba-3e9c-9982-330a16e1e6ce.png)

リモート経由なのでラグや遅延が発生する場合があるが、これでWindows側のiTunesの音をMacから出せる。
同時実行するゴルーチンの数を抑える

ゴルーチンを使って並行処理を書きたいが同時実行数を制御したいという場面は多々ある。メモリ・CPUなどリソースは限られてますから。

## バッファ付きを使ったゴルーチン数の制御
バッファ付きチャネルの次の特性を使って、計数セマフォとして使うことで簡単に実現できる。

- 空きがあれば送信側は待たされない
- 空きがなければ送信側は待たされる（ブロックされる）

```go
package main

import (
	"fmt"
	"sync"
	"time"
)

const concurrencyNum = 3 // 同時実行数

func main() {
	tasks := []string{"タスクA", "タスクB", "タスクC", "タスクD", "タスクE"}

	sem := make(chan struct{}, concurrencyNum)
	var wg sync.WaitGroup
	for _, t := range tasks {
		sem <- struct{}{} // 
		wg.Add(1)
		go func(t string) {
			defer func() {
				wg.Done()
				<-sem // チャネルから値を送信して空きを作る（解放）
			}()
			doTask(t)
		}(t)
	}
	wg.Wait()
	fmt.Println("おわり")
}

func doTask(name string) {
	fmt.Printf("[%s] 実行中\n", name)
	time.Sleep(300 * time.Millisecond) // 時間のかかる処理
	fmt.Printf("[%s] 完了\n", name)
}
```

実行結果
```
[タスクC] 実行中
[タスクA] 実行中
[タスクB] 実行中　 // ← タスクA,B,Cの３つが起動
[タスクB] 完了
[タスクA] 完了
[タスクD] 実行中 // ← 空きができたのでDが起動
[タスクC] 完了
[タスクE] 実行中　　// ← 空きができたのでEが起動
[タスクD] 完了
[タスクE] 完了
おわり
```

もし、各ゴルーチンでエラーが起きたときにメインゴルーチン側でなにかするとか考慮するとこれだと不十分。

そんなときは`golang.org/x/sync` で用意されている `errgroup`パッケージを使うと良い。

## errgroupパッケージの例
[errgroupパッケージ](https://pkg.go.dev/golang.org/x/sync@v0.1.0/errgroup)
準標準ライブラリっていうのかな？

いつからか知らないけどerrgroupパッケージに同時実行数を制限する[SetLimit](https://pkg.go.dev/golang.org/x/sync/errgroup#Group.SetLimit)が実装されているので、これを使う。
> SetLimit limits the number of active goroutines in this group to at most n. A negative value indicates no limit.
Any subsequent call to the Go method will block until it can add an active goroutine without exceeding the configured limit.
The limit must not be modified while any goroutines in the group are active.

ちなみに、errgroupの実装をチラ見したところバッファ付きチャネルを使っており、上述したロジックに近いかたちで制御していた。
（SetLimitで指定した数のバッファ付きチャネルを作る）

```go
package main

import (
	"context"
	"errors"
	"fmt"
	"time"

	"golang.org/x/sync/errgroup"
)

const maxConcurrency = 3

func main() {
	ctx := context.Background()
	tasks := []string{"タスクA", "タスクB", "タスクC", "タスクD", "タスクE"}
	eg, _ := errgroup.WithContext(ctx)
	eg.SetLimit(maxConcurrency)
	for _, t := range tasks {
		tmp := t
		eg.Go(func() error {
			return doTask(tmp)
		})
	}
	if err := eg.Wait(); err != nil {
		fmt.Printf("err: %s\n", err)
	}
	fmt.Println("おわり")
}

func doTask(name string) error {
	fmt.Printf("[%s] 実行中\n", name)
	time.Sleep(300 * time.Millisecond) // 時間のかかる処理

	if name == "タスクC" { // 格好悪いけど、無理やりエラーを起こす
		return errors.New("エラーが起きた！！")
	}

	fmt.Printf("[%s] 完了\n", name)
	return nil
}
```

結果
```
[タスクC] 実行中
[タスクA] 実行中
[タスクB] 実行中
[タスクD] 実行中
[タスクA] 完了
[タスクE] 実行中
[タスクB] 完了
[タスクE] 完了
[タスクD] 完了
err: エラーが起きた！！
おわり
```
【ネットワーク】サブドメインとは



# サブドメインとは

サブドメインとは、本体ドメインを元に任意に作るドメインのことです。

メインサイトから枝分かれした別のコンテンツを立てたいときに、`hoge.com`（独自ドメイン）を本体ドメインとしたとき、`fuga.hoge.com`のように本体ドメインの先頭に文字列を挿入しているドメインがサブドメインとなります。

メリットとしては、メインサイトのブランドイメージを引き継げることや少しでもSEOを引き継げることなどがあります。


サービスによって独自ドメインを取得していればサブドメインを（数の制限等はあるにしても）任意に作ることができるようです。

ドメインサービスで取得した独自ドメインに対して、別のサービスでサブドメインを作成するということもできるようです。

サブドメインを作った場合は親ドメインにNSレコードを作成することで紐付けができるようになります。


# NSレコードとは


NSレコードは、ドメインの管理を委託しているDNSサーバを管理しているものです。

```
ドメイン名      | DNSサーバ名
fuga.hoge.com | ns-XXXX.awsdns-XX.com
```

ドメイン`fuga.hoge.com`は、DNSサーバ`ns-XXXX.awsdns-XX.com`で管理していますよという意味になる。



# まとめ

サブドメインとは、本体ドメインを元に任意に作るドメインのことです。

メインサイトのブランドを引き継いで、新たなコンテンツを作りたい時などに作成します。
[Azure SDK for JavaScript] ContainerClient.listBlobsFlat が上手く動かず、blob一覧が取得できない

# TL;DR

- `@azure/core-http`の特定バージョンにバグが含まれていたのが原因
    - 私の環境では`2.3.0`が入っていて、このバージョンだと上手く動かない模様
- 現在は修正されているため、`@azure/storage-blob`や`package-lock.json`をクリーンアップし、`@azure/core-http`を`2.3.1`以上にする

# 環境

```txt
MacOS:　13.1
Node.js: v18.12.1
npm: 8.19.2
@azure/storage-blob: 12.12.0
```

# 関連Issue

GitHubのIssuesを参照

https://github.com/Azure/azure-sdk-for-js/issues/23762#issuecomment-1309194107

## 適当に流れをざっくり説明(違ってたらごめん)

- `ContainerClient`.`listBlobsFlat`やら`listBlobsByHierarchy`なんかの一覧表示系メソッドが動かへんのやけど
    - ワイも！
- `@azure/core-http`の`2.3.0`がどうやら原因らしい
- `@azure/core-http`の問題があるバージョンはnpmで配信されないよう`deprecate`したで
- bugfixした`@azure/core-http@2.3.1`をリリースしたで！

まあこんな感じですかね。
Issueの発行からCloseまでが24時間以内で終わってるんだからすごいものです。

# 実施した対応内容

## `package-lock.json`の削除

`@azure/core-http`の`2.3.0`が入っていたので、一旦`package-lock.json`を削除

```package-lock.json
{
  "dependencies": {
......略......
    "@azure/core-http": {
      "version": "2.3.0",
      "resolved": "https://registry.npmjs.org/@azure/core-http/-/core-http-2.3.0.tgz",
......略......
```

## 再度`npm install`

依存関係を入れ直します

## `@azure/core-http`のアップデートを確認

`package-lock.json`を確認し、`@azure/core-http`が`2.3.1`となっているのを確認

```package-lock.json
{
  "dependencies": {
......略......
    "@azure/core-http": {
      "version": "2.3.1",
      "resolved": "https://registry.npmjs.org/@azure/core-http/-/core-http-2.3.1.tgz",
......略......
```

## 再度動作確認

Blobが一覧表示されるようになりました

# keyword

同じ問題で困ってる人たちが検索でこのページを見つけられるように

- listBlobsFlat
- listBlobsByHierarchy
- not working
- Azure Blob Storage

# 参照

https://learn.microsoft.com/en-us/javascript/api/@azure/storage-blob/containerclient?view=azure-node-latest

https://github.com/Azure/azure-sdk-for-js/issues/23762
Xcodeでタイポをチェックする


# Xcodeでタイポをチェックする方法
Xcodeのメニューで[Edit]→[Format]→[Spelling and Grammar]→[Check Spelling While Typing]をONにする

<img src= "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651213/74a625e7-0414-1f49-ecaa-c547fc662d60.png" width=500px>!

タイポでスペルミスがあると以下のように赤い点線で教えてくれます。
<img src= "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651213/e3a2d082-45e8-4a07-fb14-534435a4753a.png" width=500px>!


また、スペルミスを検索するには
上記と同じメニュー項目にある[Check Document Now]を使用します。



## 参考
[Xcodeでスペルミスを無くす方法【Check Spelling While Typing】](https://blog.pentagon.tokyo/2064/)
winget のエラー (failed to update source)

こんにちは。
winget を実行した際に、```Failed in attempting to update the source``` （ソースを更新できませんでした）というエラーとなる場合があるようです。下記を見ると、現在、取り組み中のようです。
* "[Publishing is down again (failed to update source)](https://github.com/microsoft/winget-cli/issues/2718)" (microsoft/winget-cli: issue #1718; GitHub)

なお場合によっては、```winget source reset winget``` を実行して修復されるようですが、上記の取り組みを待った方が良さそうです。

```console
PS> winget upgrade
ソースを更新中に失敗しました
PS> winget source reset winget
```
リモートデスクトップでログイン画面が出ない

<h2>はじめに

WindowsProライセンス買った、ホスト名もばっちり、RDP有効化もOK！
よし、リモートデスクトップだ！... あれ、ログイン画面出なくね...？

こうなった事ありませんか？（私はなりました）
同じ事象がMicrosoftコミュニティに上がってましたが、対策が初期化だったりセーフモードでの起動だったり...
それは最終手段として、私が解決した方法を紹介します。

※同じ事象の記事
https://answers.microsoft.com/ja-jp/insider/forum/all/%E3%82%B5%E3%82%A4%E3%83%B3%E3%82%A4%E3%83%B3/c4ccb258-1be2-4e7e-ac61-d8cdf4426db4



<h2>解決方法

サインイン方法を変更しましょう！
・Microsostアカウントログイン　→　ローカルアカウントでのサインイン ...等々

https://support.microsoft.com/ja-jp/windows/windows-10-%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9%E3%82%92%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB-%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%81%AB%E5%88%87%E3%82%8A%E6%9B%BF%E3%81%88%E3%82%8B-eb7e78a9-88ee-9bc3-8f06-831b56e339fd#:~:text=%5B%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%88%5D%20%E3%81%A7%E3%80%81%5B%E8%87%AA%E5%88%86,%E5%88%87%E3%82%8A%E6%9B%BF%E3%81%88%E3%82%8B%5D%20%E3%82%92%E9%81%B8%E6%8A%9E%E3%81%97%E3%81%BE%E3%81%99%E3%80%82&text=%5B%E6%AC%A1%20%E3%81%B8%5D%E3%82%92%E9%81%B8%E6%8A%9E%E3%81%97,%E3%82%B5%E3%82%A4%E3%83%B3%E3%82%A4%E3%83%B3%E3%81%97%E7%9B%B4%E3%81%97%E3%81%BE%E3%81%99%E3%80%82

簡単な方法ですが、これで解決します！
(初期化してしまった人は...)
【echo】カスタムloggerの実装

# はじめに
ハンドラーの処理をロギングする際に、echo middlewareに用意されているloggerではなくサードパーティのロギングライブラリを利用したかったため、カスタムしたloggerをechoに設定する必要がありました。

以下を前提条件とします。
- Go version：1.19
- echo version：4.0.0
- ロギングライブラリ：logrus

# 実装
logrusをカスタムloggerとして設定する場合は、以下のコードになります。
ポイントは、logrus.Fields構造体のフィールドを増やすだけではなく、RequestLoggerConfigのフィールドにあるLogXxxの値をtrueにしておくことです。
以下のようにフィールドを列挙してログに残したい項目を追加していきましょう。

```go
log := logrus.New()
e.Use(middleware.RequestLoggerWithConfig(middleware.RequestLoggerConfig{
    LogMethod:  true,
	LogURI:    true,
	LogStatus: true,
    LogResponseSize:  true,
	LogValuesFunc: func(c echo.Context, values middleware.RequestLoggerValues) error {
		log.WithFields(logrus.Fields{
            "method":  values.Method,
			"URI":   values.URI,
			"status": values.Status,
            "response_size": values.ResponseSize,
		}).Info("request")

		return nil
	},
}))

```





# 参考
上記のサンプルコードは、こちらの公式ドキュメントに記載されています。

https://echo.labstack.com/middleware/logger/#customizable-function-based-requestlogger

logger middlewareのソースコードはこちらです。今回は4種類の項目をサンプルに記載しましたが、その他の項目については、こちらを確認してください。

https://github.com/labstack/echo/blob/master/middleware/request_logger.go
【Python】ChatGPTに点群データ出力を手伝ってもらった

# 概要
研究で使おうとしていた点群データがテキストファイルで提供されており、可視化をしたいと思ったものの3Dファイルの作り方がよくわからなかったので、[ChatGPT様](https://chat.openai.com/chat)にお願いしました。

**今回使用するデータセット**：https://github.com/czq142857/BAE-NET にて提供されているデータセット

（元データは[A Scalable Active Framework for Region Annotation in 3D Shape Collections](https://cs.stanford.edu/~ericyi/project_page/part_annotation/) ）


# ChatGPTの回答

**質問内容**

以下のような、一番右の値がクラスIDを示す、テキストファイルに書かれた点群データを、同じクラスIDを持つ点に同じ色を付与して、obj形式に変換したい。pythonで実装する方法を教えて。

```
-0.182850 0.206710 -0.143640 0.156600 -0.987600 0.007967 12.000000
-0.219480 0.243130 0.110640 -0.963900 -0.030290 0.264400 12.000000
-0.233670 0.382100 -0.009580 -0.953300 0.298200 -0.048420 12.000000
-0.205430 0.209390 -0.143920 -0.372100 -0.928000 -0.018820 12.000000
0.112450 0.048600 -0.033050 0.003796 1.000000 0.000014 13.000000
0.110120 0.048700 0.084670 0.048400 0.998800 0.000005 13.000000
0.111600 0.048630 0.042720 0.043930 0.999000 0.000002 13.000000
0.101950 0.049040 -0.020610 0.042370 0.999100 0.000032 13.000000
```

**回答**

Pythonで実装するには、まずファイルから点群データを読み込み、それらをパースして、必要な情報を抽出します。その後、それらの点に対して色を割り当て、obj形式に変換して保存することができます。

詳細な手順は以下になります。

1. ファイルから点群データを読み込み、それらをパースします。
    ```py
    points = []
    with open("points.txt", "r") as f:
        for line in f:
            x, y, z, a, b, c, class_id = [float(i) for i in line.split()]
            points.append([x, y, z, class_id])
    ```
2. 各クラスIDに対して色を割り当てます。
    ```py
    colors = {}
    for point in points:
        class_id = point[-1]
        if class_id not in colors:
            # 適当な色を割り当てる
            colors[class_id] = [random.random(), random.random(), random.random()]
    ```

2. obj形式のテキストを生成し、ファイルに保存します。
    ```py
    with open("points.obj", "w") as f:
    for point in points:
        class_id = point[-1]
        color = colors[class_id]
        f.write("v {} {} {} {} {} {}\n".format(point[0], point[1], point[2], color[0], color[1], color[2]))
    ```

# まとめ

文章として分かりづらい日本語でも、きちんと返してくれるのが素直にすごいと思いました。しかもちゃんと動く。

色部分だけはクラスIDごとに特定の色になるように別途color_listを用意して設定して、さっそく点群データ(.obj)を生成してみました。

**生成結果**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1590483/4d346c75-3c2e-aa4c-59b4-99c930d39e19.png)
MeshLabのスクショなので見づらいですが、きちんと色分けされています。

点群のみであれば`v`行だけでよいのも今回初めて知りました。
ChatGPTを今後も活用しながら勉強してみようと思います。
Railsでの画像の保存場所

# はじめに


#### <font color="red">※以下の内容には誤りが含まれる可能性があります</font>


Railsでアプリケーションを作っていて、トップページの画像や背景画像を配置する際、
私がやったことを書きます。



# 具体的な内容



画像は「public」フォルダに配置しておくと、<img src="/画


像名">や「background-image:url("/画像名");」のよう


に、画像名を指定するだけで、簡単に画像を表示できます。




```
public/
├─ top.jpg
├─ rails.phg
     └─────── 画像はpublicフォルダの中に置く
```




 __ビューファイル(views/home/about.html.erb)__
```about.html.erb
<img src="/rails.png">
```



__cssファイル(assets/stylesheets/home.scss)__
```home.scss
background-image: url("/top.jpg");
```




# まとめ



今回はpublic配下に画像を置きました。


補足ですが、Railsではもう１つassets配下に画像を設置出来ます。`app/assets/images`ディレクトリです。

これついてはアセットパイプラインについての知識が必要になってくるので今回は省きます。
Rails7でdata: { turbo_method: :delete }が効かなかったときの解決法

初歩的な内容かもしれませんが、備忘録として残しておきます。

前提として以下のgemがインストールされていること。
```
gem "importmap-rails"

gem "turbo-rails"

gem "stimulus-rails"
```

インストールが済んでいたら
```
$ rails importmap:install
```
```
$ rails turbo:install stimulus:install
```

以上のコマンドを実行することで無事deleteメソッドが使用できるようになりました。

その際以下のファイルは初期化されるので既に存在＆記述してある場合は注意が必要です。
app/javascript/application.js
config/importmap.rb