OmniAICreator/Qiita-1.07M huggingface dataset:
Delta Lakeへの変換

[Convert to Delta Lake \| Databricks on AWS](https://docs.databricks.com/ingestion/convert-to-delta.html) [2022/11/15時点]の翻訳です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

SQLコマンド`CONVERT TO DELTA`は、ParquetやIcebergテーブルのDelta Lakeテーブルへの変換処理を実行します。ParquetやIcebergテーブルのDelta Lakeへのインクリメンタルな変換に関しては、[ParquetやIcebergからDelta Lakeへのインクリメンタルなクローン](https://qiita.com/taka_yayoi/items/bc3edb691c6f1fc7c79a)をご覧ください。

Unity Catalogでは、Unity Catalogで管理される外部ロケーションに格納されているParquetやIcebergテーブルの`CONVERT TO DELTA`コマンドをサポートしています。

Databricksレイクハウスのすべての機能を解放するために、既存のParquetデータファイルをUnity Catalogの外部テーブルとして設定し、Delta Lakeに変換することができます。

技術的なドキュメントに関しては、[CONVERT TO DELTA](https://docs.databricks.com/sql/language-manual/delta-convert-to-delta.html)をご覧ください。

# 外部ロケーションにあるParquetやIcebergファイルのディレクトリを変換する

:::note
**注意**
Icebergテーブルの変換は[パブリックプレビュー](https://docs.databricks.com/release-notes/release-types.html)です。

Icebergテーブルの変換はDatabricksランタイム10.4以降でサポートされています。

Icebergメタストアテーブルの変換はサポートされていません。
:::

ストレージロケーションに対する書き込み権限を持っているのであれば、ParquetデータファイルのディレクトリをDelta Lakeテーブルに変換することができます。Unity Catalogによるアクセス設定に関しては、[Unity Catalogにおける外部ロケーションとストレージ認証情報の管理](https://qiita.com/taka_yayoi/items/18fee92365eee58e0b94)をご覧ください。

```sql:SQL
CONVERT TO DELTA parquet.`s3://my-bucket/parquet-data`;

CONVERT TO DELTA iceberg.`s3://my-bucket/iceberg-data`;
```

Unity Catalogの外部テーブルとして変換済みテーブルをロードするには、外部ロケーションに対する`CREATE TABLES`が必要となります。

:::note
**注意**
Databricksランタイム11.2以降では、`CONVERT TO DELTA`は自動でメタストアに登録されるテーブルのパーティショニング情報を推定するので、手動でパーティションを指定する必要はありません。
:::

# マネージドテーブル、外部テーブルをUnity CatalogのDelta Lakeに変換する

Unity Catalogでは、外部テーブルで多くのフォーマットをサポートしていますが、マネージドテーブルではDelta Lakeのみをサポートしています。マネージドのParquetテーブルを直接Unity CatalogのマネージドDelta Lakeテーブルに変換するには、[テーブルをUnity Catalogにアップグレードする](https://qiita.com/taka_yayoi/items/5e896b50b915b9de8fb3#%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%82%92unity-catalog%E3%81%AB%E3%82%A2%E3%83%83%E3%83%97%E3%82%B0%E3%83%AC%E3%83%BC%E3%83%89%E3%81%99%E3%82%8B)をご覧ください。

外部ParquetテーブルをUnity Catalogにアップグレードするには、[外部テーブルをUnity Catalogにアップグレードする](https://qiita.com/taka_yayoi/items/5e896b50b915b9de8fb3#%E5%A4%96%E9%83%A8%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%82%92unity-catalog%E3%81%AB%E3%82%A2%E3%83%83%E3%83%97%E3%82%B0%E3%83%AC%E3%83%BC%E3%83%89%E3%81%99%E3%82%8B)をご覧ください。

外部ParquetテーブルをUnity Catalogに登録すると、それを外部Delta Lakeテーブルに変換することができます。Parquetテーブルがパーティショニングされている場合には、パーティショニング情報を指定しなくてはならないことに注意してください。

```sql:SQL
CONVERT TO DELTA catalog_name.database_name.table_name;

CONVERT TO DELTA catalog_name.database_name.table_name PARTITIONED BY (date_updated DATE);
```

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
MacでのPHPバージョン変更方法（Brew）

#### BREWでPHPを管理していて、なぜか7.4のまま。

brew unlink php@7.4
brew link php@8.1

でもphp -vでは、php7.4....と表示される。。。

#### 原因

sourceコマンド打ってなかった。

備忘録
Android Studio内のみで完結させるパッケージ名の変更

# はじめに
個人開発中のアプリでFirebaseと接続させるときに適当なパッケージ名でプロジェクトを作成してしまっていたので変更させました。
結構面倒だったので記しておきます。

## 直接ファイル内部を弄る場所
- appレベルのbuild.gradleのapplicationId
- Android Manifestのpackage
- settings.gradleのrootProject.name
-> Gradle Sync

## 一括変更場所
![スクリーンショット 2022-11-26 13.33.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501570/54cfe17e-ff75-448f-08a4-678dfeea3204.png)

AndroidStudio左上のTabからAndroidを選択

- com.example.application のapplication部分の変更
java以下のフォルダを右クリックして
Refactor -> Rename -> Do Refactor

- com.example.application com.example部分の変更
java以下のフォルダを右クリックして
Refactor -> Move Package or Dorectory... ->Move Pacage ** to another package

Clean Projectをして既存のフォルダを削除して完了！
FormRequest 備忘録

Laravel9 が　どれくらい変わったのか、触ってみています。

ちょっとしくじったのが、４０３エラーが出る。ところ。

FormRequestのとき、authorizeの箇所をデフォルトのまま（False）で、４０３エラーに引っかかった。

FormRequestを作る際には、そこのチェックを忘れずに。
ジャンボフレーム とは

## 勉強前イメージ

フレームが大きいの？

## 調査

### ジャンボフレーム とは

NICや通信機器が持つ機能で、一度に送受信するデータの単位(フレーム)を大きくして通信効率を上げることを言います。

ethernetの標準規格では1フレームで送信できるデータのサイズをMTU(最大送信単位)といい、 `46bytes～1500bytes` になっています。
この仕様は10Mbpsだった初期の規格で決められたものです。
だんだん1Gbpsや10Gbpsに高速されていっても小さなサイズのフレームがやり取りを行うので通信機器の処理能力を逼迫させる要因にもなっています。
そこで、フレームのサイズを大きくして通信効率を上げるということが考えられたのが `ジャンボフレーム` です。
イメージとしては以下になります。

![2022-11-26 2022-11-26 # ジャンボフレーム とは - diagrams.net - Google C.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/72fe45ae-4824-b8a1-8323-47f65e116dbd.png)

ジャンボフレームは `46bytes～16000bytes` にすることで実行速度をあげています。
しかし、 `注意としては伝送経路にある危機すべてがジャンボフレームに対応していることが必要になります。`
また製品によってサポートされている最大サイズに違いがあるのでそれも注意が必要になります。

### ジャンボフレーム のメリット

- オーバーヘッドの削減

データを送信する際はIPやTCPのヘッダを付けて送信します。
1フレームに必ず付随するので、フレームの数が多ければ多いほどオーバーヘッドも多くなります。

- 断片化の減少

通常大きなデータを細かく切って送信します。
その断片化が少なくなるので、細かく切る処理などが少なくなります。

## 勉強後イメージ

MTUは結構昔に決められたから今の環境にそぐわない、だからサイズも大きくしちゃう的な？

## 参考

- [第5回 イーサネットを高速化するジャンボ・フレーム技術](https://atmarkit.itmedia.co.jp/ait/articles/1108/11/news103.html)
- [ジャンボフレーム【Jumbo Frame】](https://e-words.jp/w/%E3%82%B8%E3%83%A3%E3%83%B3%E3%83%9C%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0.html)
★画像再構成に関する記事の目次★

- 画像再構成とは？という話

https://qiita.com/airtech/items/cfd6099eb5003a1b1669

- 画像再構成のアルゴリズム体系の話

https://qiita.com/airtech/items/1db7ae0d7fad87d18750

- 画像再構成が活躍する装置の話

https://qiita.com/airtech/items/38052c1b56103df88653

- Eigenを用いたML再構成の実装の話

https://qiita.com/airtech/items/02f110f0b31c9c7b0d5c

- 画像再構成研究のモチベーションの話

https://qiita.com/airtech/items/c2c40ff4ef17a78d5505

- 個人的に注目している研究者のリスト

https://qiita.com/airtech/items/b188e93075a22d2fbb14

- 画像再構成のオープンソースソフトウェア

https://qiita.com/airtech/items/7e92bc8bf5ef3e6a157e

- 画像再構成の研究で使われるファントムの話

https://qiita.com/airtech/items/11c7f193e5744a9a47ca
rospyのモジュールコード分割


rospyを使うときに、
普通のやり方ではソースコードを分割できない。

ROSの機能を十分に使うためには役に立つTipsだと思うので、まとめておく。

# 参考記事

大体以下の通りであるが、
ざっくりしすぎているので、もう少し丁寧にまとめる

https://gist.github.com/zkytony/fb7616b745d77025f6abe919c41f8ea4

# 手順

## フォルダ構成の確認

catkin_makeをした後の構成の確認。

例えば、

```
+ beuato_monitor_test
  - setup.py                  /// 新しく作る
  - CMakeLists.txt
  - package.xml
  + scripts
    - beuato_server.py
    + common_driver
      - beuato_errorcode.py
```

と言った構成とし、
beuato_server.pyからデバイスのエラーコードを吐き出すための
共通の処理がcommon_driverのbeuato_errorcode.pyに書かれているものとする。

beuato_errorcode.pyは単なるEnum型で次のように記述した。

```python:beuato_errorcode.py
from enum import Enum

class BeuatoErrorCode(Enum):
    OK = 0
    DEVICE_NOT_FOUND = -100
    DEVICE_ACCESIBILITY_ERROR = -101
```

beuato_server.pyについては、beuato_errorcode.pyの実装をまだしていないものとする。

## setup.py

新しく作る。
ここは正直パターン化されているコードのようだ。

```python:setup.py
from distutils.core import setup
from catkin_pkg.python_setup import generate_distutils_setup
d = generate_distutils_setup(
    packages=['common_driver'],
    package_dir={'': 'scripts'},
    requires=['std_msgs', 'rospy']
)

setup(**d)
```

packagesの**common_driver**がscripts以下に記述される共通モジュールのパッケージ名、
package_dirの**scripts**が格納されているソースファイルの名前、
requiresに必要なパッケージを連ねる形式となる。

## CMakeLists.txt

```cmake:CMakeLists.txt
/**
 省略 
**/

catkin_python_setup()

/** 
省略
**/
```

基本的には次のようにcatkin_python_setupを入れるだけ。
ただし、入れる位置には注意が必要。

私が確認した限りでは、

- catkin_install_pythonの前に入れる
- generate_messagesの前に入れる
- catkin_packageの前に入れる

と言った内容は守らないといけないようだ。

## インポート側のコード

大体こんな感じで書きます

```python:beuato_server.py
### (省略) ###

from common_driver.beuato_errorcode import BeuatoErrorCode

### (省略) ###
```

## ビルド

```
$ source devel/setup.bash
$ catkin_make
```

ここで、よく注意書きに「python setup.py」と書いちゃダメ、というのがある。
setuptoolsにインストールするわけではなく、
ROSのwork folderに出来上がるためだ。

この後に

```
$ rosrun beuato_monitor_test beuato_server.py
```

を実行すれば動いてくれる。
自作ガジェット分解レポ

# はじめに
ProtoPedia Advent Calendar 2022への投稿用記事です。
今年は結構たくさんのものを作ったのですが、作ったあとは放置が基本なので詳細な設計など忘れてしまっています。振り返りの意味を込めて自作デバイスの分解記事を書いてみたいと思います。

2022年にアップした作品は10点ありましたが、今回分解するのは「[ニョロニョロック](https://protopedia.net/prototype/3084)」です。
おそらく最短時間で開発したデバイスのうちの一つで、twitterを見てみると思いつきから完成まで4日ほどで作り上げたみたいです。モノづくりはパッション大事！


# 外観確認

外観を確認します。
![01.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496179/580a4930-b0a9-1c03-1028-0032225c80d0.jpeg)
円筒形の土台の上にニョロニョロが載っています。
ニョロニョロの皮はフェルト素材、目は紙です（チープ）
土台からはケーブルが伸びてAtom Matrixにつながっています。
本体にはスイッチなどの操作ボタンやセンサは見当たりません。

# 動作確認

続いて動作チェックです。
放置していたので、まだ動くか心配でしたが無事動きました。
Atom Matrixで給電と制御の両方をまかなっています。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/OMMF2022?src=hash&amp;ref_src=twsrc%5Etfw">#OMMF2022</a> 動作確認その3はニョロニョロっく。自動脱皮機能付き <a href="https://t.co/Qurql1igfY">pic.twitter.com/Qurql1igfY</a></p>&mdash; airpocket (@AirpocketRobot) <a href="https://twitter.com/AirpocketRobot/status/1596357857150406656?ref_src=twsrc%5Etfw">November 26, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
電源を繋ぐと静止状態、atom matorixのAボタンで動作開始し、ニョロニョロが動きます。
服がジャストサイズすぎて苦しそうです。

もう一度Aボタンを押すと動きが逆転しました。
動かすと、ボディの蠕動運動で皮が脱げていくのがシュールです。（作りが粗い）


# 外皮を外す
少し待つと自動的に皮を脱いでくれました。
![02.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496179/e51e6706-1cde-5939-cfdc-487c1cec1156.jpeg)
![03.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496179/cb755a9a-937b-b254-a1a7-beb9c1565488.jpeg)
外皮はフェルト生地を下手な裁縫で縫い合わせて作ってあります。
一応縫い目は内側に隠していますが、縫い目が背中のセンターからずれているあたり、作業の出たとこ勝負感がにじみ出ています。
裁縫は嫌いではないので、今後ファブリックを使った作品も増やしたいですね。

## ニョロニョロックは外骨格？内骨格？
外皮を脱がすと鎧の様な武骨な骨格が見えてきました。
筒状の骨格が一軸のヒンジで連結されています。
![04.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496179/cd9d66a8-c365-de79-2f73-17f16a78994b.jpeg)

## 骨格を分解
骨格ははめ込み式のヒンジで接続されています。分解するとヘッドパーツ×1、ボディーパーツ×11個、ベースユニットに分解できました。
![05.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496179/c31e7b52-04c0-bcb0-9a37-a92ca2551c64.jpeg)

最下段のボディーパーツは、ベースユニットにネジで締結されていました。
![07.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496179/92e5c9a8-1762-6abb-cfd4-885ea91e3154.jpeg)

ベースパーツからはらせん形状に曲げられたアルミの棒が伸びています。この棒が回転すると、骨格の可動方向にのみボディのヒンジが曲がり、ニョロニョロムーブを再現する構造の様です。
![06.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496179/099fbfc8-ddd0-adbc-df19-6e4402dd5578.jpeg)

## ボトムを分解
ボトムはさらに4つの3Dプリンターパーツで構成されていました。中には360°回転サーボが固定されていて、アルミ棒を回転させていました。
![09.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496179/c9fd72f2-e3c3-a148-9113-0e9be8295f5f.jpeg)

# まとめ
マッチポンプなネタ記事でしたが、自分の設計の再レビューって、研鑽のためには結構重要なイベントだったりします。今回はかなりシンプルなデバイスですが、1年前に書いた自分のコードを見返すと突っ込みどころ満載ということはよくあろうかと思います。
今年はたくさんの作品を作ったので、一作一作の記憶も薄れてしまっています。この記事で振り返ることが出来たのは、良い機会になりました。
VISA APIを使ってみた。ープロジェクトの作成まで

<h1>初投稿になります。<h1>
<p>はじめまして。tak-yと申します。登録して初の投稿をさせていただきます。よろしくお願いいたします。</p>

<p>今回は、VISAカードのAPIを使って予算アラーム付きの家計簿アプリを作ってみたので、シリーズ第１回としてAPIの設定についてご紹介いたします。</p>
<h1>VISA APIとは？</h1>
<p>クレジットカードであるVISAの情報を管理したりデータを取得できるAPIです。</p>
<strong><p>何に使えるか？</p></strong>
<p>残高の取得やどこと取引したか、取引があったときにリアルタイムで通知できるように設定できます。
また、取引記録から今後のビジネスにどう生かすか分析できます。<p>
<hr>
<h1>プロジェクトの作り方</h1>
<p>VISA APIのホームページでサインインしたら、以下の流れに従って設定していきます。<p>
<a href="https://developer.visa.com/">https://developer.visa.com/</a>
<ol>
  <li>開発者/ビジネス利用者として、APIのアカウントを取得</li>
  <li>ダッシュボードに誘導されたら、Add New Projectをクリック
  <li>Project Name（プロジェクト名）とProject Description（プロジェクトの詳細、1,000文字以内）を入力</li>
  <li>＋Add APIsでAPI選択ページに移り、プロジェクトで使いたいAPIにチェックボックスを入れて、Confirm Changesをクリック。</li>
  <li>認証方法を選択する。（相互ＴＬＳベース認証かVisa’s Xpay Token）</li>
  <li>Certificate Signing Request (CSR)を提出する。</li>
</ol>
<hr>
<h1>認証方法を選択する。</h1>
<p>認証方法は以下の２つに分かれます。</p>
<p>
<b>相互ＴＬＳベース認証</b>・・・TLSとは、SSLの次世代型規格。情報漏洩のリスクが低い。
</p>
<p>
<b>Visa’s Xpay Token</b>・・・APIを使える人だけが持つパスワードみたいなものがToken
  TokenをURLに組み込むなどして、この人はAPIが使える権限を持っていますという証になる。
VISA APIのTokenの名前。
</p>
<hr>
<h1>ダッシュボードでプロジェクトを設定</h1>
<p>
以下のメニューで設定しないとAPIを使えません。
</p>
<p>
１．Summary・・・プロジェクトにあるAPIを確認
</p>
<p>
２．Credential・・・APIにアクセスための証明書
</p>
<br>
<p>
    Credentialで、証明書を作ることができます。
</p>
<br>
<p>
　ーVisa Developer Platform Certificate…SSL認証に必要
</p>
<br>
<p>
　ーGeo-Trust Certificate…二段階SSL認証に必要な第三者の証明書
</p>
<br>
<p>
　ーProject Certificate…Visa Developerのデータにアクセス許可をもらうために必要な証明書
</p>
<br>
<p>
　ーTLS based Mutual Authentication …外部のサービスやVisa DeveloperのAPIに必要な証明書
</p>
<hr>
<h1>ダッシュボードでプロジェクトを設定</h1>
<ul>
<li>
Configurations…外部からのコールバックを設定
</li>
<li>
Test Data…選択したAPIをテストするために作られた仮のデータ
</li>
<li>
Settings…APIのシステム設定
</li>
<li>
Sample Code…選択したAPIの初期段階としてこのコードを試す
</li>
<li>
Going Live…SandboxからProductionに移動するためのボタン
</li>
</ul>
<p>※Sandbox…開発時のみに使われる開発環境　✕本番運用
</p>
<p>
※Production…本番で使われる開発環境
</p>

<hr>
<h1>プロジェクトの開発・テスト</h1>
<ul>
<li>
Sandbox環境で開発、テストする。
</li>
<li>
API ExplorerでAPIを呼び出す（サーバーに要求）内容をURL欄に書くコードを探す。
</li>
</ul>
<ol>
<li>
プロジェクトキー、テストデータ、プロジェクトの詳細をコピーペーストする。
</li>
<li>
APIの名前の左に状態を表す色がある。（緑はAPIを呼べる準備ができている、赤は準備できないエラーがある、灰色は準備ができるまで待っていてほしいという状態）
</li>
</ol>
<hr>
<h1>APIを使える準備が整ったら…</h1>
<ul>
<li>
会社同士の取引か、個人に対しての取引かによって使えるAPIが異なります。
</li>
</ul>
<p>
以下のURLにアクセスしてみてください。
</p>
<ul>
<li>
会社同士の取引⇒https://sandbox.api.visa.com/
</li>
<li>
個人対象の取引⇒https://sandbox.webapi.visa.com/
</li>
</ul>
<hr>
<h1>次回は...</h1>
<p>
今回は、APIの準備段階まで行きましたので、次回からはアクセストークンの取得に参ります。
もうしばらくお待ちくださいませ。ご一読ありがとうございました。
</p>
多次元イメージビューワーnapariをインストールする

# サイト
公式: https://napari.org/stable/
Git Hub: https://github.com/napari/napari

# インストール
環境はWindows 11。

[こちら](https://mebee.info/2020/07/18/post-13597/)を参考にVisual C++ Build Toolsをインストールした。https://visualstudio.microsoft.com/ja/downloads/ の下の方で、Visual Studio 2022用のツール → Build Tools for Visual Studio 2022とたどっていくとインストーラーをダウンロードできる。インストーラーを起動してインストールする（途中でMSVC v140 - VS 2015 C++ ビルドツールにチェックを入れた）。PCを再起動した。

[こちら](https://atmarkit.itmedia.co.jp/ait/articles/1601/29/news043.html)を参考にOpen SSL v1.1.1 Lightをインストールした。PCを再起動した。

[こちら](https://www.anaconda.com/products/distribution)からanaconda3のインストーラーをダウンロードしてインストールした。

「C:\Users\owner\Anaconda3\Library\bin」にPathを通した。

下記のコマンドを実行してnapariをインストールした。
```
> conda create -y -n napari-env -c conda-forge python=3.9
> conda activate napari-env
> python -m pip install "napari[all]"
```

Pythonを起動して、以下のコマンドを実行した。
```
> python
>>> import napari
>>> from skimage.data import astronaut
>>> viewer = napari.view_image(astronaut(), rgb=True)
```

napariの起動に成功！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23570/80857ff2-e2b1-34bd-0b8d-bf26454a7a09.png)
Androidでスプラッシュ・スクリーンを出してみる

# スプラッシュ・スクリーンって？
スプラッシュ・スクリーンとはAndroidのアプリを起動して、アプリが完全に起動するまでの間、別な画面を表示するアレです。よくあるのはゲーム等で「Now loading...」とか「起動中です・・・」とか表示するやつです。
Android12かはら標準で、アプリアイコンがスプラッシュ・スクリーンになっていますが、それ以前は自前で組み込まないといけません。ここではAndroid11で自前で組み込む方法を説明します。

参考URL：
本家Android Develppers[スプラッシュ画面](https://developer.android.com/guide/topics/ui/splash-screen?hl=ja) (Android11まで)
[Splash画面を実装する方法](https://qiita.com/karass/items/bcb50607c0b9fc21f183)

まず、やり方には2通りあって
* Activityのテーマを変更する方法
* 別なActivityを用意する方法

があります。ゲームのようなより複雑、動きのあるスプラッシュ・スクリーンを実装したいのであれば、別なActivityを用意する方法のほうがよいでしょう。ここではActivityのテーマを変更する方法を説明します。
# スプラッシュ画像を用意する
なんでもいいです。いらすとやから適当に、焦って走ってる会社員をダウンロードしてきました。これをスプラッシュ・スクリーンとして表示してみます。
![run_businessman_aseru.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/933408/0e65a3bd-294e-1bcc-7bdf-99d09f73f4d6.png)
これをAndroid Studioのres/drawable(v24)に配置します。v24付きのフォルダじゃないとダメです。
![Screenshot_20221126_111914.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/933408/931823a3-d9ff-bc16-b61b-b29ee3268ab3.png)
# drawable(v24)にxmlを追加する。
res/drawable(v24)にsplash_drawable.xmlという名前でxmlを作成します
```xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list
    xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:drawable="@color/white" />
    <item
        android:drawable="@drawable/run_businessman_aseru"
        android:gravity="center"
        />
</layer-list>
```
**android:drawable="@drawable/run_businessman_aseru"**
の部分が上の焦って走っている会社員の画像のリソースです。
# valuesにstyle.xmlを作成する
res/valuesにstyle.xmlを作成します
```xml
<resources xmlns:tools="http://schemas.android.com/tools"
    xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- Base application theme. -->
    <style name="AppTheme.Splash" parent="Theme.AppCompat.DayNight.NoActionBar">
        <item name="android:windowBackground">@drawable/splash_drawable</item>
    </style>
</resources>
```
**@drawable/splash_drawable**
の部分が、上のsplash_drawable.xmlのリソースです。リンクしてますね。
# AndroidManifest.xmlを編集する
android:themeを追加します。
```xml
<activity
    android:name=".MainActivity"
    android:exported="true"
    android:theme="@style/AppTheme.Splash">
    <intent-filter>
    （・・・中略）
    </intent-filter>
</activity>
```
**@style/AppTheme.Splash**
の部分が、上のstyle.xmlの
**style name="AppTheme.Splash" ・・・**
とリンクしています。
# MainActivityを編集する。
MainActivityはsetContentViewでレイアウトを適用する前に、themeを適用してやる必要があります。
```kotlin
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setTheme(R.style.Theme_SplashKotlin)
        Thread.sleep(1000) // 早すぎるのでsleep
        setContentView(R.layout.activity_main)
    }
}
```
ここでちょっとよくわからないのが、**R.style.Theme_SplashKotlin**は**themes.xml**とリンクしています。この**themes.xml**から**styles.xml**にたどり着く経路がよくわかりません。
スプラッシュが消えるのが早すぎるのでsleepを入れました。本当はここで、色々な初期化処理が入るのだと思います。

完成形は[gitHub](https://github.com/cozyk100/AndroidStudioProjectsPublic/tree/main/SplashKotlin)に置きました。
【NeosVR】Referenceの解説

Valueの選択肢はたくさんあるくせにReferenceは一切なにも出てこなくてノーヒントで立ち向かわざるをえない問題を解決するためにこの記事を書きます。
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884654/3e76744e-cd56-24d5-0207-ad14aadb917f.png)|
|-|
|Valueは大量の例が出てくる。全ての数値型が出てくるわけではなく、UriやRefID、Enumなどはここに表示されない。しかし一方Referenceは……|

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884654/a8b31036-98a8-a72e-d635-a41a84fd20b2.png) |
|-|
|何も出てこない。結構不親切。|

## Referenceの名前を入力すると解決
- Valueと同様、Referenceもその型の名前を入力すると出てきます。ここでは、**大文字と小文字を間違えてはいけない**。
    - Slot
    - User
    - Material　（マテリアルコンポーネントが入る）
    - AudioOutput　（AudioOutputコンポーネントが入る）
    - IAudioSource　（音声ファイルとか、ユーザーの声とかが入る）
    - StaticTexture2D　（テクスチャ、要は画像）
    - 等

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884654/95b065ae-c3eb-d989-ce09-ed15155a4000.png) |
|-|
|Userを入力した例。「user」だと何も出てこない。|
- 恐らく、DynamicVariableを使ったりするほとんどの場面においてSlotとUser以外のReferenceを使うことはないので（AssetFrameでIAudioSourceやStaticTexture2Dを使うかも）、とりあえず↑の例さえ覚えておけば大体大丈夫です。


## 複合型Referenceの入力方法

- 複合型は、UserやSlotとは異なる、型指定の中でさらに型を指定しなければならないタイプのやつです。

- 一つ例を挙げると、「Sync`1[[BaseX.float3, BaseX]]」といったものが複合型の入力です。
    - これは、Float3のValueFieldそのものを格納できる型です。
        - 厳密には、Reference(RefID)です。
    - この他にもIAssetProvider`1[FrooxEngine.Material]などもあります。


- Syncなんちゃらの呪文をかみ砕いて説明すると、Sync`1が「1つのValueField」という意味で、後ろの[[BaseX.float3,BaseX]]で「float3だよ」、ということを指定しています。[[BaseX.color,BaseX]]とかにすればcolorにもなります。
    - 「Sync\`1が1つのValueFieldで」という文言の意味するところは、例えばCastClass（LogiXの色を変えるやつ）なんかだと、変換元と変換先の2つの型を指定する必要があるので、CastClass`2[[いろいろ]]みたいに入力します。



|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884654/394c591d-7842-da8a-cf93-ae61ab3b8dcc.png) |
|-|
|ValueFieldを格納できます|

### 使用例
- せっかくなので、例として挙げたSync型の詳しいつかいかたも説明しておきます
- Sync型は、DynamicVariableと組み合わせると便利です。
    - 複製したSlotを逐一Tweenでいろんな向きに動かす、みたいな使いかたができます。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884654/bdd18b3c-c860-fe06-2d6f-43ad392663dc.png) |
| -|
|Tweenノードの白いのが左になるmodを入れています（本来なら右側から出る）。|


- ReadDynamicSync\<float3>ノードは少し出し方が面倒です。(DVNodeGeneratorというユーザーメイドのこれをやりやすくするたためのツールがありますが、正規の方法を説明します。)
    - ノードブラウザからは出現させられないので、インスペクターから直接LogiXノードのコンポーネントを**空のスロットに**適用する必要があります。
    - 下の画像は、空のスロットに対してLogiX -> Variables -> ReadDynamicVariableから、Sync`1[[BaseX.floatt3,BaseX]]を入力してコンポーネントを適用したもの
        - コンポーネントを適用したスロットを掴んでアンパックするとノードが出現します。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884654/77f8c5f8-70af-6021-42de-e9ebb4a21c03.png) |
| - |
|情報量が多い|

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884654/657e5278-859a-9e26-24df-f79fe9863c50.png)|
|-|
|色はfloat3と変わらないが、型はfloat3ではなくSync\<float3>である。|

- Sync\<float3>はfloat3にキャスト（型変換）できないし、float3に限らずあらゆる型でできない。
    - そのため、どうしても値をいじりたい場合はToStringとParseを組み合わせる必要がある。
        - Parseは、Operators -> Parse内にあります。
        - ToStringもParseもLogiXノードの中では結構重たい（遅い）部類なので、Forで回そうとすると重たくなりやすい。
    - そもそも、これはいろんな場所にTweenを行えるようにするためのテクニックであるので値をいじりたい場合は素直にDynamicVariableを使うべき。
        - Tweenの他にWriteやDriveノードもつなげることができ、Driveの場合は動的にDrive先を変更できるという使いかたがあるが、Writeの場合はWriteDynamicVariableで事足りるので意味は薄い。
'method' object is not subscriptableのありがちなミス

# 'method' object is not subscriptableが出たときに確認したいポイント

毎度くだらないミスですが、自分用に投稿します。先に結論を書いてしまうと、メソッド名の後に()が抜けていることが原因でした。

# 前提コード

```python:
class Hoge() :
    def hage(self, list) :
        return(list)#リストを返す
hoge = Hoge()
hoge_hage = hoge.hage#ここがマズイ!()が抜けている
hoge_hage[0]#エラー。自分はリストだと思っている。
```

# 解決
（メソッドオブジェクトは添え字は）ないです、という意味です。
しっかりかっこを入れましょう。

```python:
class Hoge() :
    def hage(self, list) :
        return(list)#リストを返す
hoge = Hoge()
hoge_hage = hoge.hage()#ヨシ!
hoge_hage[0]#1919
```
社会貢献サークル＆ネットワーク

<h2>はじめまして</h2>

はじめまして。
ちばっしーと申します。
![051f9f0bdf3398c6164b346945183b74.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986658/98b6d4a1-3f18-7184-544b-e7556fb43ad4.jpeg)
[社会貢献サークル＆ネットワーク](https://chiba-shii.com/)というブログをやっております。

社会貢献を目指したブログです。
そちらでプログラミングに関する記事も書いております。

>【誰のどんな問題を解決するのか？】
>ひきこもりの人達の孤独、生きる楽しさがない、収入が少ないなどの問題を解決する。
>
>【理念】
>それぞれの好きなことから、人と繋がり、楽しみ、収入を得て、人生を豊かにする。

<h2>〇〇の始めかた</h2>

初心者の方向けの記事です。

[・プログラミングの始めかた](https://chiba-shii.com/start-programming/)
Progateで絶対挫折しない方法とは？

[・ブログの始めかた](https://chiba-shii.com/start-blog/)
より簡単に、安価なコストでブログを収益化できる方法を考察。

[・動画編集の始めかた](https://chiba-shii.com/how-to-start-video-editing/)
これから動画編集を始めてみたい方へ。

<h2>JavaScriptで遊ぶ</h2>

JavaScriptで制作したゲームなど。

[・JavaScriptで遊ぶ【1】](https://chiba-shii.com/attack-on-titan/)
進撃の巨人測定。あなたがどんな巨人かわかる！？

[・JavaScriptで遊ぶ【2】](https://chiba-shii.com/life-number/)
驚くほど当たる！？ ライフナンバー占い。

[・JavaScriptで遊ぶ【3】](https://chiba-shii.com/rock-paper-scissors/)
JavaScriptで作るじゃんけんゲーム。

[・JavaScriptで遊ぶ【4】](https://chiba-shii.com/new-year-quiz/)
挑戦者求む！ 高難易度「お正月クイズ」

[・JavaScriptで遊ぶ【5】](https://chiba-shii.com/breakout/)
JavaScriptでブロック崩しゲームを作る練習をしました。

[・JavaScriptで遊ぶ【6】](https://chiba-shii.com/omikuji/)
ドットインストールさんのレッスンを参考に作る「おみくじ」

[・JavaScriptで遊ぶ【7】](https://chiba-shii.com/dragon-quest/)
ドラクエ風ゲーム。
スライムとキメラを仲間にしてラスボスを倒せ！

[・JavaScriptで遊ぶ【8】](https://chiba-shii.com/body-weight/)
そのスポーツをやるのに理想の体重は？ 目標体重計算アプリ。
![ead0ac5c99e65de6c60421d2c8db3853.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986658/18dd0494-3eae-9ab3-3fe6-888a0fcb3d4c.jpeg)
__ぜひ遊びに来てくださいね！！__
Salesforce認定Platformアプリケーションビルダー試験の公式サンプル問題解説してみた-15

こんにちは

Salesforce認定Platformアプリケーションビルダー試験の公式練習問題があるのはご存じでしょうか。
Trailheadにフラッシュカードとして何度も解ける練習問題がございます。

https://trailhead.salesforce.com/ja/content/learn/trails/platform-app-builder-certification-prep



今回は

Platform アプリケーションビルダー試験に向けた学習
認定 Platform アプリケーションビルダー資格の受験準備: Data Modeling and App Deployment (データモデリングとアプリケーションリリース)
アプリケーションのリリースについて

にある問題1問目をご紹介します

なお今回の内容は動画でも公開しております

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

<iframe width="560" height="315" src="https://www.youtube.com/embed/h3TsCoEDYAk" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>


![００１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/e3007c9c-4a46-c57e-8093-4221ff9410ef.png)

正解はBです


こちらのヘルプをご確認ください

クイックリリース
本番環境へのリリースでは、すべての Apex テストが実行されます。本番組織に多数の Apex テストがある場合、テストの実行に時間がかかり、リリースが遅延することがあります。本番環境へのリリース時間を短縮するため、テストを実行せずにリリースするクイックリリースを行うことができます。クイックリリースは、変更セットおよびメタデータ API コンポーネントが次の要件を満たす場合に使用できます。

リリースの監視
https://help.salesforce.com/s/articleView?id=sf.deploy_monitoring.htm&type=5

こちらを見ても分かるようにクイックリリースではリリース時間を短縮できます

いかがでしたでしょうか
皆さんもリリースをしてみて確かめてみてください


## ほかのSalesforce認定アプリケーションビルダーの問題の解説などはこちらから

https://qiita.com/Takaa/items/6434c5838e23f409d01f
【知らなければハマる】AtCoderのF問題は、Python3の代わりにPyPyを使え！

参考サイト：

https://salamann.com/loop_in_python_is_slow

AtCoderのF問題をやっていると、同じ解法なのに、なぜかTLE(時間オーバー）になってしまう事があります。

原因がわからないため、何時間も迷路に迷い込みます。
たとえば、
・関数化と直書きの違い？
・変数を経由させるのと一行で書くのの違い？
など。
実際は、上記の違いは`AC`と`TLE`を分けるほどのレベルではありません。
（実際に時間を計測したら、自分の方が速い場合もある）

違いは、`Python3` で提出したか、 `PyPy3`で提出したかの違いだけでした。

たとえば、2022/11/5 (AtCoder Beginner Contest 276)のＦ問題

https://atcoder.jp/contests/abc276/tasks

詳細は割愛しますが、フェニック木を使って $O(N^2)$ の内容を$O(log(N))$の計算量で解きます。
しかし・・・・
`Python3`で提出すると、それでも`TLE`になります。
（私のローカルPCの環境では$N=10^5$で、2.3-2.8秒）

逆に、`PyPy3`で提出すると、セグメント木で、ビット演算の表記 (`i & -i`など）を使わなくても、`AC`となります。

結果一覧を検索する時に、言語を`Python3`にしても、`PyPy3`も一緒に表示されるため、提出時に`PyPy3`が選べる、という事に気づきませんでした。

これは、知らなければ確実にハマる内容です。
私も、ハマった挙句、ネットを検索して、表題の結論にたどり着きました。
IAMポリシーのARNを特定する方法

## IAMポリシーコンソール移動
IAMポリシーのコンソールに移動して`検索バーにポリシー名を入力`する
![スクリーンショット 2022-11-26 10.38.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983197/7d8c48bd-3cbb-58dc-15ff-256e38314a2a.png)

## ARNを特定する
ポリシーを選択したらARNが記載してあります。コピーが必要な方は右端の`□`をクリック！
![スクリーンショット 2022-11-26 10.41.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983197/bb5727da-e40b-d7fb-39a2-6e9ea650d0a1.png)
【OSS】小さなコントリビュートで得た気づき

Ruby開発の[Advent calendar](https://qiita.com/advent-calendar/2022/ruby-dev)の4日目です。本日はOSS参加での学びを書こうと思います。
数年経験を積んで開発はある程度できるけどOSSにはまだ参加したことない方に読んでもらえると嬉しいです。

# 自己紹介🙋‍♂️
経験5年程のエンジニアです。最近はRubyとReactを書いている事が多いです。
現在は福岡県に住んでいます。


# OSS参加のきっかけ
まず私がOSSをちゃんと認識したのは今在籍している会社に転職してきたタイミングです。
社内にRubyのコミッターが2名在籍されていてすごいなと思った記憶があります。
その後、社内の勉強会でOSS活動についての発表を聞いたりと意識する機会は何度かありました。

特に、RubyKaigiで登壇された方のエンジニアの話を聞いた時と、
10月に開催される[hacktoberfest](https://hacktoberfest.com/)のイベントを知った時は印象に残っています。

大きなきっかけは、11月から社内で**OSSに挑戦する人を増やそう**という動きがあったためです。
やったほうがいいんだろうなと思いつつ通ってこなかった道なのでこの機会にやってみようと思いました。


# 参加したもの
こちらのリポジトリにPR出しました。
オーナーのsuketaさんに感謝です🙏

https://github.com/suketa/ruby-duckdb

やったことは、テスト追加・GitHub Actionの設定変更・CAHNGELOG変更とかなり小さいものです。


# 気付いたこと&感じたこと
**自分より経験値の高い方のコードは読むだけでも単純に勉強になる**とか**初級者でも貢献できる部分がある**とか、そういうものはもちろん感じました。
ベタなのでそれ以外の気づきと感想を書きます。

## ① CHANGELOGひとつでも学びがある
CHANGELOG.mdに書くだけ、という小さなものでも学びがありました。
以下が私が作ったPRになります。

https://github.com/suketa/ruby-duckdb/pull/402

`CHANGELOG.md`に記載した`bump duckdb 0.6.0`という記述です。

いきなり非常に細かいですが`bump`という英単語。
「バージョンを上げる」という意味です。普通に`version up`とかで済ましていましたし、特段馴染みがない英単語ではないので深く調べおらず、今回初めてちゃんと知りました。
その後いくつかリポジトリ回ってコミットログなど確認しましたが普通に使われていました。

そして、バージョンアップから派生して番号の振り方も改めて調べました。
(たぶん何回も調べてる。)

https://qiita.com/t_nakayama0714/items/c312bc5edcce6c214856#%E3%83%93%E3%83%AB%E3%83%89%E3%81%A8%E3%83%AA%E3%83%93%E3%82%B8%E3%83%A7%E3%83%B3


正直なところ『CHANGELOGの変更は誰でもできるのだから他の方に譲ろうかな』と思っていましたがいざ取り組んでみると**小さなPRでも学びがある**ことに驚きました。


## ② コンプレックスが薄くなった
経験が増えているにも関わらずOSSに一度もPR送ったことないのは個人的に軽いコンプレックスを感じていました。
(コンプレックスと言いますか、優秀なプログラマーは多少なりともOSS開発を経験されている方が多いイメージなのでそれに近づいておきたい、という感じです）

まずはOSS参加に挑戦することということで、コンプレックスが薄くなりOSSが身近になったので良かったです。
最初のハードルを今回超えれたのでいずれはちゃんとロジックが絡む開発に取り組んでいければと思います。



## ③ もう一つのプロジェクトに参加している感じ
すごく当たり前かもしれないですが
**普段の仕事で言うところの参加しているプロジェクトがもうひとつ増えた感じ**でした。

新規で開発プロジェクトに参加すると通常以下のような作業が発生すると思います。

1. リポジトリを見れる権限を与えられて
1. そのプロジェクトのルールを一通り共有してもらって
1. まずは小さいタスクから担当して開発を進めて
1. 徐々にドメイン知識とソースコードの理解が進んで大きな開発も担当する

まさに上記のような感じで、1は公開されていて、2は`CONTRIBUTING.md`やリポジトリによってはcontribute guideが整備されたりしていて、issueを見れば3,4があるという感じです。

新しいプロジェクトに参加した方が、同じプロジェクトをずっと続けるより成長速度が速くなると思っていて(色んなパターンのコードや開発文化に触れられるため。)、成長を求めるという意味でもOSSいいなと思いました。

# おまけ: OSS参加する時に参考になるかもしれない情報
### good first issue
good first issue というラベルがついたISSUEが取り組みやすい

https://goodfirstissue.dev/

### OSS Gate
OSS開発に参加する人を継続的に増やすことを目的にしたイベントがある

https://oss-gate.github.io/

### 10月にOSSのイベントがある
[hacktoberfest](https://hacktoberfest.com)と言うOSS活動を広めるために行われているイベントが10月に開催されてます。
条件を満たしたOSS活動を行うとオリジナルTシャツがもらえるものです。

Qiita内にも記事上がっているみたいなので気になる方は見てみてください。

https://qiita.com/search?q=hacktoberfest


# おわりに
今回小さなコントリビュートですが学びがあった良い経験になりました。
いずれは高品質な開発で貢献できればと思います。
みなさんもまずは小さいコントリビュートから始めてみてはいかがでしょうか。
それでは Happy Hacking!
トリプルクォーテーション(三重引用符 """)の中に変数を入れる

結論、以下のようにf文字列にすればいい。

```sample.py
name = 'neko'
sentence = f"""My name is {name}."""
print(sentence)
#My name is neko.
```

三重引用符だからといって普通の文字列とは大きく違うんじゃないかと
難しく考えてました。
（もちろん仕様など全く同じとは思いませんが）

pythonでMySQLdbライブラリを使っていて
三重引用符の中に変数格納したいな〜と気になったので調査しました。
以上です〜
2022年のPC環境

# 自宅
## PC
### OS
Windows 11 Home 64ビット
### CPU
Core i9-11900K
### メモリ
16.0 GB (15.9 GB 使用可能)
### M.2 SSD
514 GB (NVMe)
### ハードディスク
2 TB
### グラフィックボード
NVIDIA GeForce RTX 3070
### 電源
850 W (Gold)
## ディスプレイ
2 x [Acer XV25eQXbmiiprzx 24.5/IPS/FHD/0.5ms/240Hz/HDR400](https://www.amazon.co.jp/gp/product/B085S4FNLH)
## キーボード
[SteelSeries Apex 7 TKL Blue Switch](https://www.amazon.co.jp/dp/B081JNDZV5)
## マウス
[Logicool G G502 X 有線/RGBなし](https://www.amazon.co.jp/gp/product/B0BHKRD3GY)
## マウスパット
[Logicool G G840 ブラック](https://www.amazon.co.jp/gp/product/B0995THVT7)
## スピーカー
[Logicool G G560](https://www.amazon.co.jp/gp/product/B07CL2TG6L)
## ヘッドホン
[Logicool G Pro X ワイヤレス](https://www.amazon.co.jp/gp/product/B08DTTW6R1)
# 構成の確認方法
## CPU
* 「Windows + X」→「Y」でシステムを開く
* プロセッサの欄に書いてある
## メモリ
* 「Windows + X」→「Y」でシステムを開く
* 実装RAMの欄に書いてある
## M.2 SSDおよびハードディスク
* 「Windows + E」でエクスプローラを開く
* PCからハードディスクの一覧を見られる
## グラフィックボードの確認方法
* 「Ctrl + Shift + ESC」でタスクマネージャーを開く
* パフォーマンス → GPUと遷移するとGPU名が書いてある
## 電源の確認方法
* 実機を見るか、購入時のスペック表を参照する
JupyterLabをChrome（Edge）のアプリモードで開く

　私の次の記事

https://qiita.com/Mitz-TADA/items/40369a8a526479edb8bc

で作ったポータブル版の Jupyter Lab ですが、Chrome がインストールされていない端末に対応できていませんでした。そこで、Chrome がなければ、Edge のアプリモードで開けるようにしてみました。
　また、ノートブックを notebooks というディレクトリに保存するように指定しています。

　次を `jupyter_lab_config.py` という名前で、起動用のバッチファイルと同じフォルダに保存する。（バッチファイルで指定する名前に合わせれば、他の名前でもよい。）

```python:jupyter_lab_config.py
import os

c = get_config()

# サーバー起動時のウェブブラウザの指定
chrome = "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe"
if os.path.isfile(chrome):  # Chromeがインストールされていれば、Chromeをアプリモードで開く
    c.ServerApp.browser = '\"' + chrome + '\" --app=%s --start-maximized --force-dark-mode'
else:  # Chromeがインストールされていなければ、Edgeをアプリモードで開く
    msedge = "C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe"
    c.ServerApp.browser = '\"' + msedge + '\" --app=%s'

# ノートブックに使用するディレクトリ
c.ServerApp.notebook_dir = './notebooks'
```

　そして、次のバッチファイルで Jupyter Lab を起動する。

```bat:start_jupyterlab.bat
@echo off
call environment_settings.bat
jupyter-lab.exe --config=jupyter_lab_config.py
```

　アプリモードで起動の様子。アドレスバーやタブバーが省略された状態で動作しています。
![JupyterLab.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1849635/7b800002-8c35-ce47-0196-2754a1cb6305.png)
Google UXデザイン：UXリサーチにおけるユーザデータのプライバシー

# はじめに

わたしが[Google UX Design Certificateで得られた素晴らしい体験][google]を、特に重要だと思われるポイントを小さく分割して、わかりやすく簡潔に紹介していきます。

興味があれば、ぜひ Google UX Design Certificateを受講してみてください。

[google]: https://qiita.com/mapami/items/7a0d0a3d4661c50f8bec

https://www.coursera.org/professional-certificates/google-ux-design

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/66d514dc-1996-9cf3-5acb-014309ebb027.png" width="800">

<details><summary>これまでの振り返り</summary>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/d326d1e3-3b70-ffc3-eabf-1ac6a7fcaec7.jpeg" width="500">

</details>

今回、UXユーザリサーチを行う上で、「なぜプライバシーが重要なのか」「どのようなデータを保護する必要があるのか」について説明します。

また、ユーザーのプライバシーを確保するために、デザイナーとして何ができるかを考えます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/1b74c208-7cba-3416-7b17-668e49c8bbab.png" width="700">


# ユーザーデータを非公開にする

なぜユーザーデータを非公開にすることが重要なのでしょうか？

- ***正しいことだから：*** リサーチを行う際には常に誠実に行動する必要があります。
- ***プライバシーに関する法律と倫理：*** 米国では、情報のプライバシーに関するいくつかの規制がありますが、世界の他の地域では、プライバシーはより徹底的に法制化されています。
- ***ハッキングのリスク：*** ハッキングされないように機密データを保護する必要があり、ハッカーがユーザーのデータを同意なしに共有する危険性があります。このような事態は、最近の有名な事件で数多く発生しており、絶対に避けたいことです。
- ***企業のブランドを守る:***　ユーザーがあなたのブランドを肯定的に認識することを保証することです。

# 保護すべきデータ

- ***個人を特定できる情報（PII）：***　ユーザーを特定するために使用される可能性のある具体的な情報で構成されます。名前、自宅の住所、電子メールアドレス、電話番号などが含まれます。
- ***個人を特定できる機密情報（SPII）：***　紛失、漏洩、盗難によって、ユーザーに経済的な損害や困惑を与えたり、差別を受ける可能性のあるデータです。社会保障番号、運転免許証番号、パスポート番号、金融口座番号、生年月日、人種、障害の有無、性別、セクシュアリティ、犯罪歴、医療情報などが含まれます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/4369a181-a4a9-3465-7ab4-3e7f711a1a82.png" width="700">

# プライバシーへの配慮

- ***データ収集について透明性を確保する:***　どのようなデータが収集されるのか、ユーザーに知らせましょう。
- ***絶対に必要なユーザーデータのみを収集する:***　例えば、参加者の生年月日を知る必要がない場合は、提供を求めないことです。
- ***ユーザーから積極的な同意を得る:***　通常、参加者は同意書を受け取り、それに署名して研究者に返送するよう求められます。参加者の情報をどのように使用し、プライバシーを保護するかについて、詳細を説明してください。
- ***誰が自分のデータにアクセスできるかをユーザーに知らせる:***　あなたのフィードバックは私の直属のチームと共有しますが、それ以上は共有しません」と言うかもしれません。
- ***ユーザーデータをどのように保存し、いつ削除する予定なのかを説明する:***　このリサーチが完了するまで、ビデオは安全なクラウドストレージサイトに保管され、その後削除されることを伝えるとよいでしょう。

# プライバシーを維持するために使用できる手段

- ***非識別化（de-identification）:***　非識別化とは、調査中に収集したユーザーのデータから、識別情報を取り除くことです。たとえば、チームと洞察を共有する場合、引用を参加者の名前に帰するのではなく、参加者1と言い、すべての代名詞を彼らに変更することができます。
- ***参加者が自分の架空の名前を選択できるようにする:***　これは、参加者に参加者1のような番号を付ける代わりに、人間的な要素を維持するのに役立ちます。
- ***秘密保持契約（NDA）を取り交わす:***　NDAは、ある当事者が他の当事者からアイデアを盗まれないように法的保護を与える契約です。研究参加者に新製品や新機能をテストしてもらう場合、公開前に何かを体験してもらうことになります。そのため、自分のアイデアが盗まれる危険性があります。しかし、研究を始める前に参加者に秘密保持契約書に署名してもらえば、そのリスクから法的に保護されます。
MySQL8Quickを公開する

# Better than Nothing

　朝起きると一番に、[Flutter大学](https://flutteruniv.com)のSlackをチェックする。朝活スレッドにおはようございます、と書き、私が早々と寝てしまった後にワイワイやっている若いエンジニアたちの様子を垣間見ようというわけだ。　
　すると、あるメンバーがこんな動画を紹介していた。　

https://youtu.be/bnfPUrJQh1I

　私は日本人としては完璧主義からほど遠い性格だし、Done is better than Perfectな路線を歩んできたと思っている。が、引退後に始めた個人開発では、かなり気負って事を運んできた。ま、いったら、これが人生最後の花道だから、己のすべてをつぎ込みたい。もし頓挫してだれ知らぬまま終わっても、それもまた人生、だれの迷惑にもなるまい、みたいな。　

　そんな気負いを、若いエンジニアが気持ちよくひっくり返してくれた。そうだ、これでいいんじゃないか。もっと軽く、自分らしくいこう。人生最後の作品にするなら、なおさら、これまでと違う路線を選ぶのは、あまり賢い方法じゃない。　

　とはいっても、開発中のProject本体は、あまりに混沌としていて、即座に公開できるような状態にない。だが私の性格としては、このYouTubeを見た、この朝に、なにか速攻でやりたい。　
 
## 個人開発の副産物　

　私は少し前に、MySQL8用のSampleアプリを公開している。　

https://medium.com/@dongri727/sample-app-for-mysql8-7f076d0182c5

　またこれをつくる過程を、このQiitaでも記事にしてきた。　

https://qiita.com/dongri727/items/412b97eed4943006a0a0

　これはMySQL8なんて知らない一般ユーザーが、アプリの背後にあるデータベースを活用する、という前提でつくられたSampleだ。だから特定のデータベースに繋がなければ機能しないし、私が自分のデータベースに繋いで実際に公開するのは、まだまだ先の話だ。

　だが実は、私はもう一つ、Sampleを作っていた。それは、MySQL8や、そうでなくても、自分でSQL文を書いてデータベースを利用する人向けのアプリである。最初は「１ドル販売しよう」ぐらいなつもりで作ったが、できあがってしまったら、なんかバカバカしく感じて、リリース作業を続ける気力が湧いてこなかった。少なくとも私自身の開発に関していえば、それは全く役に立たない作業だから。　

　だが、今朝のYouTubeを見ていて、そうだ、あれを公表しよう、という気になった。売るわけじゃない。ただ公表しておけば、世界で１人ぐらいは、使ってみようという人もいるかもしれない。いや、もっと改善して売ってやれ、という人が現れたりしたら、それはもう、とてもおもしろくて、光栄な話だと思う。

　一応、AppStoreに類似品があるかな、と覗いてみた。SQL文で扱うアプリはたいがいみな、Workbenchの簡易版、モバイル版を目指している。だからタブレット仕様で画面が大きかったりする。私のアプリは、「移動中に急に確認したくなった」とか、「一件だけ追加入力したい」みたいなことに特化したつくりになっている。だからそれはそれで、ちょっとニッチなアプリである。　

　よし、行ってみよう。　

## OSSってなんなんだ？　

　正直言って、OSSという言葉の意味もよくわかっていない。試しにいくつか記事を読んでみたが、私がやろうとしていることとは雲泥の差がある。例えばこんな記事。　

https://zenn.dev/ryo_kawamata/articles/b6f679bfe11261

　私のアプリはまだ私のStudioProjectフォルダの中にあって、GitHubにさえ上がっていない。ReadMeもない。上記の記事に書かれていることは何一つできていないまま、ただGitHubに上げて、そのアドレスをここに貼り付ける、それが、まずNothingよりマシな、今朝の一歩だ。

　なので、これから、GitHubにRepositoryをつくる。これがまた、苦手作業だが、仕方がない。 

　よし、できた。笑 

https://github.com/dongri727/MySQL8Quick

　このNothingよりマシななにかが、今後どうなっていくかは、今朝は考えないことにする。　

　以上、朝活終了。
iPhoneを選局用リモコンにしてRaspberry Pi -> USB DACでradikoやネットラジオを流す手順の忘備録

1. /etc/modprobe.d/alsa-base.confをsnd_usb_audio優先に書き換え
1. sudo apt install mpv
1. sudo apt install streamlink (radikoを使う場合)
1. ~/(チャンネル名)-streamlink.sh作成、chmod 755する
```(チャンネル名)-streamlomk.sh
#!/bin/sh
~/.local/bin/streamkink -p mpv http://radiko.jp/#~/live/(radikoの放送局名)
```
5\. iPhoneのショートカット作成
　1. 設定- ショートカット - 詳細 - スクリプトの実行を許可
　2. 「SSH経由でスクリプトを実行」
　3. 必要なチャンネルの数だけ繰り返す
```radio.sh
killall mpv ##念のため
nohup ./(チャンネル名)-streamlink.sh >/dev/null
##もしくは
nohup mpv --really-quiet http://xxx.xxx.xxx.xxx
```
```quit_radio.sh
killall mpv
```
6\. できたショートカットをホーム画面に置く

以上です。
マネージメント必見tips：変化させれば価値になる

![24264493_m.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/8723528a-09cc-f840-7565-11e29ebdecfc.jpeg)

日本の紙幣は、造幣局で作ってますが、紙幣って4、5年で廃止されるそうです。その後はリサイクルされてトイレットペーパーになるらしい。
これを聞いた時にゾッとしました。トイレットペーパーを見て、1万円と思ったわけではありませんｗ

# もの価値なんてあっても無いのと一緒
思えば紙幣ってただの紙です。それを日本国家がお金の価値を保証しているから、皆それを価値のあるものとして受け取ったり支払ったりしてます。これって日本銀行が偽造されない日本銀行券を作り上げて、そこに価値を植え付けてるから1万円だったり5000円だったりの価値があります。
中国では、紙幣の偽造が横行するため、キャッシュレスが普及しています。電子マネーなんて考えたら電子データであって見えすらしないモノ。
円安で１ドル１５０円近くまで最近行きました。これも日本国内では、何も変わってないのに勝手に日本円の価値が下がってしまいました。
考え方次第で価値って与えられるんだなと実感出来ます。

# アンカリング効果
マーケティング用語で、**アンカリング効果**というのがあります。 アンカーと呼ばれる先に与える情報が判断を歪めアンカーに近づく心理現象を指します。
例えば、Ａ店ではあなたの気に入った洋服が1万円で売っていた。Ｂ店では、セールと称して定価2万円の似た作りの洋服が1万円で売っていた。あなたは、どちらを買いますか？
定価2万円の洋服が1万だったらお得だと思ってB店で買うでしょう。原価は全く同じでも、B店の洋服の方がお得感を感じます。

# 割引以外でもシチュエーションを変えてみる
体重60キロの人が1キロ痩せると言っても、いつも体重60キロの人が1キロ痩せるのと、いつも57キロの人が60キロになった時に1キロ痩せるのでは、同じ1キロで価値が全く違います。いつも体重60キロの人の方が感動は大きいと思います。

# マネージメントで変化させてみる
１．スケジュール設定
スケジュールの設定の仕方って難しいものです。厳しすぎると守れない事ばかり発生します。優しすぎると遊びが出過ぎます。通常4週間かかるタスクだった場合、３週間くらいで出来るか打診してみます。そうすると相手からは、３．５週くらいのスケジュールの返答が来ます。前提を３週間に変化させたので、そこがベースになった結果です。

２．資格取得に関して受験費用は、合格したら支援する
人間というのは、支払った金額に対して、リターンを求めます。損する事が嫌いです。従って、資格取得の受験費用を負担すると合格に対しての意思が弱くなります。自分で支払って、合格したら支援するとすると損する事が嫌なために合格への意思が強くなり、合格しやすくなります。

3．勤務開始時間
深夜体質のエンジニアが多いので、エンジニアの遅刻は大きな課題だと思います。9時から勤務して欲しい場合は、９時から１0時までを加点タイムとします。９時から勤務を始めると、自宅テレワークをOKにしたり、ランチがタダになったり、評価に加点したりします。９時出勤にオプションが付加されてお得度が増しました。

４．悪役を作る
PJ責任者にわざと悪者になってもらいます。そして少し厳し目な納期を設定してもらいます。納期について上司であるあなは相談されるでしょう。その後、PJ責任者と調整して目標にしていた納期を設定します。
PJ責任者が悪者扱いとなる一方、あなたが正義の見方として認識され、あなたの言う事に従ってしまいます。

と言った感じにマネージメント上でも色々と使えます。
ポイントは、同じ価値のものでも、状態を変化させることで価値がかわるという事です。
是非、これを参考に自分なりの使い方を考えてみて下さい。
同一ネットワークにある IP アドレスを確認する話

## はじめに

同一ネットワーク（LAN）内に接続されている機器の IP アドレスを確認する方法をまとめました。

##  IP アドレスを確認するコマンド

ターミナルから以下のコマンドを実行します。
```
$ arp -a
```
AmazonLinux2でIPv4/IPv6対応のNATインスタンス作成する


:::note warn
注意事項
IPv6初心者のため、記載内容に理解不足・誤りがある可能性があります。
:::

# 目的
IPv6はIPv4と異なり、インターネットに直接ルーティング可能なアドレスがアサインされるようです。
とはいえ、特殊な環境要件においてIPv6でもNATしたいという場合の方法を考えました。

# 概要
* 環境はAmazonLiunx2を利用。
* AmazonLiunx2のIPフォワーディングを有効にし、パケットの中継ができるようにする。
* IPv4ではiptables、IPv6ではip6tablesを利用して変換設定を行う。

# 環境概要
パブリックサブネット側にNAT用のEC2インスタンスを配置し、プライベートサブネットに配置されたEC2とインターネット間の通信を中継するケースを想定。
![diagram.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309202/ace0e935-4e3a-1c9f-7927-7b37fe55e986.png)

# VPC/Subnet
* テストの環境では各subnetはipv4・ipv6のデュアルスタックとした。(ipv6のみには出来ない部分がある？)
* IPv4はプライベートアドレスのCIDRを設定。
* IPv6はAmazonからのアドレス払い出しを利用。

# RouteTable
* プライベートサブネットにアタッチしたルートテーブルでは、デフォルトルートをNATインスタンスのeniに向ける。
* パブリックサブネットにアタッチしたルートテーブルでは、デフォルトルートをInternet Gatewayに向ける。

# EC2
## パッケージインストール・基本設定
iptablesをNATとして使用するため、サービスをインストール。
```
yum -y install iptables-services
```
iptablesの定義は一旦全て空にしておく
(ipv4:iptables , ipv6:ip6tablesを利用)
```
iptables -F
ip6tables -F
```
## IP Forwardingの設定(IPv4)
```
echo 1 > /proc/sys/net/ipv4/ip_forward
echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf
```

## IP Forwardingの設定(IPv6)
* IPV6FORWARDINGをyesに指定。(OS起動時のスクリプトで有効になるため、下記設定後に一度OS再起動しておく。)
* RouterAdvertisementを受け取る設定を強制(accept_ra=2)
```
echo IPV6FORWARDING=yes >> /etc/sysconfig/network
echo net.ipv6.conf.eth0.accept_ra=2 >> /etc/sysctl.conf
```

## ip MASQUERADE設定
* プライベートサブネット⇒インターネットの通信はipマスカレード(アクセス元アドレスの動的変換)を設定しておく
* FORWARDの行はコネクション接続後の通信を通過させるためのもの。(ipv4は記載なくても問題なかったが念のため。ipv6は記載がないとうまく動作せず)
```
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
ip6tables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
```

## NAT設定の例
IPv4(パブリックのEC2 8001番ポート宛通信を、プライベートのEC2 80番ポートへ中継)
```
iptables -t nat -A PREROUTING -d 10.0.0.1 -p tcp --dport 8001 -j DNAT --to 10.0.1.1:80 -m comment --comment "PortMapping"
```
IPv6(パブリックのEC2 8001番ポート宛通信を、プライベートのEC2 80番ポートへ中継)
```
ip6tables -t nat -A PREROUTING -d ****:****:****:****:65b0:adc4:6e38:7fd0 -p tcp --dport 8001 -j DNAT --to-destination [****:****:****:****:9e25:e543:8a42:24e9]:80 -m comment --comment "PortMapping"
```

## iptablesの設定保存・サービス有効化
iptables設定保存
```
service iptables save
service ip6tables save
```
iptablesのサービス有効化
```
systemctl start iptables
systemctl start ip6tables
systemctl enable iptables
systemctl enable ip6tables
```
iptablesの実行状況確認
```
systemctl status iptables
systemctl status ip6tables
```

:::note info
以下はデバッグ・設定のコマンドメモです。
:::
## iptablesコマンドメモ
NAT設定状況の確認
```
iptables -t nat -L -n
ip6tables -t nat -L -n
```
NAT設定状況の確認(行番号付き)
```
iptables -t nat -L -n --line-numbers
```
NAT設定を全部消す方法(MASQUERADEも消える)
```
iptables -t nat -F
```
特定の文字列を含む設定を削除する
```
iptables-save | grep -v "PortMapping" | iptables-restore
ip6tables-save | grep -v "PortMapping" | ip6tables-restore
```

## デバッグ用コマンド(ipv6)
ipv6関連
```
ip -6 route
tcpdump icmp6 -n
```
ip fowardの状態確認
```
sysctl -a|grep forward
```
react.js next.jsエラーError: Invalid <Link> with <a> child. Please remove <a> or use <Link legacyBehavior>. Learn more: https://nextjs.org/docs/messages/invalid-new-link-with-extra-anchor


# [エラー]Error: Invalid <Link> with <a> child. Please remove <a> or use <Link legacyBehavior>. Learn more: https://nextjs.org/docs/messages/invalid-new-link-with-extra-anchorを解決

## 環境
Mac(M1, 2020)

## ぶつかったエラー
![スクリーンショット 2022-11-26 7.57.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884551/f4d55b2c-db75-0bee-b0d3-c39ec73e935e.png)

翻訳・意味
エラー: <a> の子を持つ <Link> が無効です。 <a> を削除するか、<Link legacyBehavior> を使用してください。
詳細: https://nextjs.org/docs/messages/invalid-new-link-with-extra-anchor

## やったこと
1.aタグを削除した


## 結果
エラーが解決されリンクが表示された。
詳細についてはこの記事が初学者の自分にとってわかりやすかった。
https://zenn.dev/luvmini511/articles/b5e9f02cadd160
エレキ素人が何か考える（その15）：ロジック回路の遅延

# ロジック回路(IC)の遅延を考える
NOT ICの時間的な遅延の考察である。言葉より、回路などを見れば、明確。

## 回路およびシミュレーション
NOTとANDとを組み合わせた下記回路図がターゲット。
![シミュ2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/57d68814-0b78-8dac-be94-d23c6ca50def.gif)
NOTにより、ANDの2本のInputに同時にHIGH('1')にならないと思われるが、実際には、NOT ICの遅延により、わずかな時間、同時にHIGHとなる時間が存在する。このシミュレーション（[falstad](https://www.falstad.com/circuit/circuitjs.html)利用）で、NOTのスルーレート（反応時間？）を遅くすることにより、同時にHIGHとなる時間を長めとし、LED点灯により、その状況を明確化。

## 実回路ではどうなるか？
### 用いたロジックIC
秋月電子で入手した[NOT IC](https://akizukidenshi.com/catalog/g/gI-10923/)。ピンアサインは下記のとおり。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/09c9d250-56e8-15f7-f8aa-0c8fb9fafb38.png)
同じく[AND IC](https://akizukidenshi.com/catalog/g/gI-13732/)。ピンアサインは下記のとおり。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/ad6254ed-8bcc-06ea-5100-066e3a608e08.png)

### ソースコード
```c++
#define PIN_OUT   6
#define PIN_IN    2

void detection () {
  Serial.println("Change");  
}

void setup() {
  Serial.begin(9600);
  pinMode(PIN_OUT, OUTPUT);
  pinMode(PIN_IN, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(PIN_IN), detection, CHANGE);
}

void loop() {
  digitalWrite(PIN_OUT, HIGH);
  delay(1000);
  digitalWrite(PIN_OUT, LOW);
  delay(1000);
}
```
ほぼ自明。ANDの出力をLEDに接続するだけではなく、Arduinoのピン2に接続し、割り込みルーチンにより、ANDの出力HIGH状態をソフトウェア的に検出する。ここでは、1秒ごとに、HIGHおよびLOWの繰り返しを発生させ、NOT ICやAND ICへのインプット。

## 検証
結論から言うと、NOT ICを1つ用いただけでは、LEDの点灯を確認するどころか、HIGH状態の検出もできず。NOT ICを3つ用いた時も同様。

NOT ICを5つ用いると、ソフトウェア的なHIGH状態を検出することができた（それでも、LEDは点灯せず）。下記回路図参照。
![3Not5Not.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/c2a8e9b8-db1b-9b59-e0fc-4d7cdf05f3d6.png)
実際の配線状況。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/d01d81cc-7f1b-abc3-11ef-7ccecae78282.jpeg", width=85%>
AND出力の電圧は、13-15mV程度。Arduinoからのシリアル出力は下記のとおり。
![シリアル出力.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/e71ca60c-a364-96cf-8f44-266fc4f341ac.png)

また、9V電池供給でも、LEDは点灯せずであった。

## 終わりに
一応、遅延があり、実感はできた、、と言ったところ。
Emacs Lisp では if のelse部に複数の式が書けます

Emacs Lisp 以外の Lisp では、if のelse部に複数の式が書けません(progn を用いる必要がある)が、Emacs Lisp ではelse部に複数の式が書けます(暗黙のprognが適用される)。

```cl:Common Lisp
#! /usr/bin/env -S sbcl --script
(defun xprint (x) (print x))
(defparameter x 1)
(if (= x 0)
  (xprint 'zero)
  (xprint 'not-zero)
  ;(xprint 'not-zero2)
  )

;;; Welcome to the Emacs shell
;;; 
;;; ~/lisp/if-else $ cd "d:/Users/javac/Documents/.repo/env/lisp/if-else/" && time "./if-else-1.lsp"
;;; 
;;; NOT-ZERO 0.280 secs
;;; ~/lisp/if-else $
```

```cl:Common Lisp(defun xprint (x) (print x))
#! /usr/bin/env -S sbcl --script
(defun xprint (x) (print x))
(defparameter x 1)
(if (= x 0)
  (xprint 'zero)
  (xprint 'not-zero)
  (xprint 'not-zero2)
  )

;;; Welcome to the Emacs shell
;;; 
;;; ~/lisp/if-else $ cd "d:/Users/javac/Documents/.repo/env/lisp/if-else/" && time "./if-else-2.lsp"
;;; Unhandled SB-KERNEL::ARG-COUNT-ERROR in thread #<SB-THREAD:THREAD "main thread" RUNNING
;;;                                                   {1001DC0003}>:
;;;   Error while parsing arguments to DESTRUCTURING-BIND:
;;;     too many elements in
;;;       ((= X 0) (XPRINT 'ZERO) (XPRINT 'NOT-ZERO) (XPRINT 'NOT-ZERO2))
;;;     to satisfy lambda list
;;;       (TEST THEN &OPTIONAL ELSE):
;;;     between 2 and 3 expected, but got 4
;;; 
;;; unhandled condition in --disable-debugger mode, quitting
;;; 0.217 secs
;;; ~/lisp/if-else $
```

```el:Emacs Lisp
#! /usr/bin/env -S emacs -batch -l
(load "~/xprint.el")
(setq x 1)
(if (= x 0)
  (xprint 'zero)
  (xprint 'not-zero)
  (xprint 'not-zero2)
  )

;;; Welcome to the Emacs shell
;;; 
;;; ~/lisp/if-else $ cd "d:/Users/javac/Documents/.repo/env/lisp/if-else/" && time "./if-else-3.el"
;;; Loading d:/Users/javac/Documents/.repo/env/xprint.el (source)...
;;; not-zero
;;; not-zero2
;;; 0.317 secs
;;; ~/lisp/if-else $
```

`xprint.el` については、[『Emacs Lisp でプリントデバッグをする (5) - Qiita』](https://qiita.com/javacommons/items/50b2ac5e84143308c2cc)をご覧ください。
企業さんの提供しているAPIまとめ

企業さんが公開・提供している無料のAPIをまとめて紹介します。

# SNS系
* Twitter API
https://developer.twitter.com/ja/docs

* LinkdIn
https://www.linkedin.com/help/linkedin/answer/a523174/linkedin-api-?lang=ja

# 画像SNS・素材サイト系
* Pinterest API
https://www.pinterest.jp/

* Instagram API
https://www.instagram.com/

* Pixabay
https://pixabay.com/ja/

# ファイル・データ加工系
* Image Resizer
画像サイズ変更、トリミング、ぼかし、グレースケール、フォーマット変換など
https://imageresizer.io/

* PicWish
画像高画質化と拡大
https://picwish.com/jp/

# AI・機械学習系
* Microsoft Face API
顔認識
https://azure.microsoft.com/ja-jp/products/cognitive-services/face/

* AmiVoice API
音声認識
https://acp.amivoice.com/

# オンライン決済系
* Stripe
ネット決済
https://stripe.com/jp

# ネットショップ系
* Amazon Product Acvertising API
参考記事(外部リンク):https://wporz.com/amazon-product-advertising-api-pa-api-5-0/
* Yahooショッピング API
https://developer.yahoo.co.jp/webapi/shopping/

# 飲食・ファッション系API
* ホットペッパーAPI
https://webservice.recruit.co.jp/doc/hotpepper/guideline.html

# その他
* Steamworkd API
Steamの提供しているAPI
https://partner.steamgames.com/doc/api?l=japanese

* Google Maps JavaScript API
Googleのマップ系API
https://developers.google.com/maps/documentation/javascript/overview
.emacs 内に custom-set-variables や custom-set-faces が自動的に書き込まれるのを防ぐ

.emacs や .emacs.d/init.el に以下のような記述が勝手に書き込まれることがあると思います。

```elisp
(custom-set-variables
 ;; custom-set-variables was added by Custom.
 ;; If you edit it by hand, you could mess it up, so be careful.
 ;; Your init file should contain only one such instance.
 ;; If there is more than one, they won't work right.
 '(package-selected-packages
   '(magit compat rust-mode racket-mode slime newlisp-mode d-mode janet-mode use-package)))
(custom-set-faces
 ;; custom-set-faces was added by Custom.
 ;; If you edit it by hand, you could mess it up, so be careful.
 ;; Your init file should contain only one such instance.
 ;; If there is more than one, they won't work right.
 )
```

これを別ファイルに書き込まれるようにしたい場合には以下のような記述を .emacs or .emacs.d/init.el に入れると良いです。

```elisp:.emacs or .emacs.d/iniit.el
(setq custom-file "~/.emacs.d/custom.el")
(condition-case nil
    (load custom-file)
  (error nil))
```

custom.el を .emacs.d の中に入れたくない場合は、以下のようにします。

```elisp:.emacs or .emacs.d/iniit.el
(setq custom-file "~/custom.el")
(condition-case nil
    (load custom-file)
  (error nil))
```

* .emacs を git 等で管理しているときに、他のPCの .emacs 内の custom-set-variables や custom-set-faces と衝突してしまうのを回避することができるようになります。custom.el は .gitignore などでバージョン管理対象から外しておくといいでしょう。

* ちなみに、`(load custom-file)` を `condition-case` で囲んでいるのは、custom.el がまだ作られてない時にエラーになるのを無視するためです。

それでは！
Ubuntu 22.10 Sound card shown as Dummy Output / ダミー出力になって音が出ない

Ubuntu 22.10から、PipeWireが前面に出てきた(?)ようですね。何かのタイミングでサウンド出力がDummy Outputになってしまった場合、22.04やそれ以前のTips(*)は大変に参考になる/なったのですが、それだけでは元の音の出る状態には戻らない感じでした。僕の環境では次で戻りました。ご紹介します。

(*)
+ https://net.youhei02.com/ubuntu10/
+ https://seesaawiki.jp/w/kou1okada/d/20200610%3A%20Ubuntu%2020.04%20LTS%20-%20%A5%C0%A5%DF%A1%BC%BD%D0%CE%CF%A4%CB%A4%CA%A4%C3%A4%C6%B2%BB%A4%AC%BD%D0%A4%CA%A4%A4

```
$ rm -r ~/.config/pulse
# sudo apt remove pulseaudio
# sudo apt install pulseaudio
# sudo apt remove pipewire
# sudo apt install pipewire
```
再起動します。
音量設定は初期化されます[PulseAudio 音量設定]を開くと直っているかと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159724/176e6a96-1076-b6e8-d775-753729958e91.png)
以上です。