OmniAICreator/Qiita-1.07M huggingface dataset:
グラデーションを考える２

　
この記事は[アドカレ](https://qiita.com/advent-calendar/2022/lua)に参加しています。

# グラデーションを考える２
　二次元空間でのグラデーションを考えていきます。
　[グラデーションを考える](https://qiita.com/metaphysical_bard/items/d45369b139668062d633)とは違うタイプのグラデーションです。

## コード
ソースコードを以下に示します。LuaJitを使用しているので、お持ちでない方は[こちら](https://scrapbox.io/ePi5131/LuaJIT)から導入しておいてください。
```lua
<?--テキストボックスに貼っておいて、グロ変で流す
--sqrt
local function sq(x,y)
return math.sqrt(x*x+y*y)
end

--切り捨てとか
local function d(a)
if(a<0)then a=0
elseif(a>255)then a=255
else a=math.floor(a)
end
return a
end

--ピクセル座標から色を求める関数
function me(x,y)
local r,g,b=0,0,0
local k={}

for i=0,3 do--各点との距離を求める
k[i+1]=sq(pos[i*3+1]-x,pos[i*3+2]-y)
end

for i=0,3 do--逆2乗の法則で
if(k[i+1]==0)then
k={0,0,0,0}
k[i+1]=1
break
else
k[i+1]=1/(k[i+1]*k[i+1])
end
end

local s=0
for i=0,3 do
s=s+k[i+1]
end

for i=0,3 do
local e=k[i+1]/s
r=r+RT[i+1]*e
g=g+GT[i+1]*e
b=b+BT[i+1]*e
end

return d(r),d(g),d(b)
end
?>
```
```lua
--グラデしたいオブジェクトにこっちを貼り付ける

--ffiのロード
local ffi=require"ffi"

--RGBA形式の構造体定義
pcall(ffi.cdef,[[
    typedef struct Pixel_ {
      uint8_t b,g,r,a;
    } Pixel;
  ]])

--dataの取得
local data,w,h=obj.getpixeldata()

--キャスト
local cdata=ffi.cast("Pixel*",data)

--色関連
local ColorTable={0xff8e58,0x4dd9ff,0xe5ade0,0x7eb069}
RT,GT,BT={},{},{}
for i=1,4 do RT[i],GT[i],BT[i]=RGB(ColorTable[i]) end

--座標関連(xyzが必要。実際に使うのはxyだけ
pos={-200,-200,0,200,-200,0,-200,200,0,200,200,0}
for i=0,3 do
pos[i*3+1]=pos[i*3+1]+w/2
pos[i*3+2]=pos[i*3+2]+h/2
end

--ピクセル操作
for y=0,h-1 do
 for x=0,w-1 do
  local p=cdata+y*w+x
  p.r,p.g,p.b=me(x,y)
 end
end

--dataをはりつけ
obj.putpixeldata(data)
```

## 解説
　上記のコードは、4色でのグラデーションを行います。
　4つの座標とそれと対応するカラーコードでピクセルごとの色を決定していきます。

ピクセル操作については、[LuaJIT FFI で高速ピクセル操作](https://scrapbox.io/ePi5131/LuaJIT_FFI_で高速ピクセル操作)を見るといいです。

さて、ピクセルごとに色を決定していきますが、このときにピクセルの場所と4つの座標とで距離を求めて、その距離をもとに色に重みをつけていきます。

例えば、一つ目の座標とピクセルの距離が近ければ、ピクセルの色は一つ目の座標の示す色に近くなります。二つ目の座標とピクセルの距離が近ければ、ピクセルの色は二つ目の座標の示す色に近くなります。

ここで、[逆2乗の法則](https://ja.wikipedia.org/wiki/逆2乗の法則)を使用して自然にグラデーションするように色に重みを付けます。

纏めると、
1. 座標とピクセルの距離を求める。
2. 距離を逆2乗する。
3. 2の結果の総和を求める。
4. 3で求めた総和と2の結果をもとにピクセルの色を決定する。

…こんなかんじになります。

## おわりに
　今回は4色のグラデーションでしたが、同じような流れで5,6,7色以上のグラデーションも簡単にできます。とはいえ、除算があるので処理にはどうしても時間がかかります。

　いつかadobeさんの4色グラデーションのコードを覗きたいですね。

[twitter](https://twitter.com/metaphysicalba1)
Active Directory用語集

今さらかもしれませんが、MicrosoftのActive directory(AD)の用語集です。
ADに携わるのに最低限知っていたほうがいい用語をまとめてみました。

なおこの記事は弊社のアドベントカレンダーの12/13として参加しています。
https://qiita.com/advent-calendar/2022/ari-group

----------------------------

・Active Directory
Microsoft社が提供するオンプレミスにおけるディレクトリサービスシステム

・ドメインコントローラ,メンバーサーバ
ドメインコントローラ（ドメコン）はドメイン内における利用者アカウントやコンピュータなどへのアクセス権限などを一元的に管理し、利用者の認証を行うサーバコンピュータのこと。
メンバーサーバはドメイン内にあるサーバマシンの中でも、ドメインコントローラーではないサーバマシンの総称。
メンバサーバにはディレクトリ情報が格納されないため、ユーザーの認証を行うことができない。

・Azure Active Directory
Microsoft社が提供するクラウドベースのID及びアクセス管理サービス
 
・Azure AD Connect サーバ
ADとAzure ADの間でアカウント情報を同期する。
バックアップの管理と、ログやバックアップの保存先としても利用する。

・機能レベル
Active Directory では、フォレスト/ドメインのバージョンを統一するための機能がある。
フォレスト/ドメインの機能レベルをあげることで Active Directory の新しい機能を利用したり、古いバージョンのOSで実行されているドメインコントローラーの追加を制限するといったことができるようになる。

・ローリングアップグレード
ローリングアップグレード方式は、例として既存のWindows Server 2012がドメインコントローラのADに、新規のWindows Server 2019のサーバをドメインコントローラとしてに参加させ、参加後にAD機能レベルをバージョンアップする方式である。
その後既存のWindows Server 2012をメンバーサーバに降格させる。
　・クライアントPCのドメイン再参加作業が不要
　・ファイルサーバなどのアクセス権再設定作業が不要

・FSMO（操作マスタ）
Active Directoryのドメインやフォレストに複数のドメインコントローラがある場合に、
特定の役割を指定された一つのドメインコントローラに集中させる機能

・信頼関係
ドメインが複数ある場合、信頼関係を結ぶこと、1つのドメインにログオンすれば、他のドメインにもログオン操作なしでアクセスできるようになる。

・SYSVOL複製方式
ドメイン内の各ドメイン コントローラーのローカル ハード ディスクに存在し、
ファイルレプリケーションサービス(FRS)によってレプリケートされるファイルとフォルダーのセットのこと
・FRS  File Replication System
　ファイル単位でのレプリケーション方式（Windows2019から使用不可）
・DFS  Distributed File System(分散ファイルシステム)
　複数のサーバー上に配置されている共有フォルダーを、論理的に構造化された 1 つ以上の名前空間にグループ化できる Windows Server の役割サービス
・DFSR　DFSレプリケーション 
　複数のサーバやサイト間で効率的にフォルダをレプリケートできる Windows Server の役割サービス ADはドメイン内にある SYSVOL フォルダをレプリケートするために DFS レプリケーションを使用する。
　
・Kerberos
Active Directoryのユーザー認証のプロトコル。
Kerberosバージョン5はRFC1510で標準化されている（Cerberusとも綴る）

----------------------------

弊社のアドベントカレンダー12/13を担当したわけですが、他メンバーとは毛色の違う記事になったことをお許しくださいw
業務でかかわったことで、とても苦労したので供養とさせてくださいw
【Python】unittestでのModuleNotFoundErrorとAttributeErrorの解決方法


# エラー内容１ ModuleNotFoundError: No module named 'xxx'
* unittestを実施したら`ERROR: test_program (unittest.loader._FailedTest)`と表示された。

```
$ python -m unittest test.test_program
E
======================================================================
ERROR: test_program (unittest.loader._FailedTest)
----------------------------------------------------------------------
ImportError: Failed to import test module: test_program
Traceback (most recent call last):
  File "/opt/homebrew/Cellar/python@3.10/3.10.8/Frameworks/Python.framework/Versions/3.10/lib/python3.10/unittest/loader.py", line 154, in loadTestsFromName
    module = __import__(module_name)
ModuleNotFoundError: No module named 'test.test_program'


----------------------------------------------------------------------
Ran 1 test in 0.000s

FAILED (errors=1)
```

# エラー内容１の原因・解決方法
* 実行している場所が問題でした。実行コマンドでは`test.test_program.py`としていたのに、`/Users/aaa/bbb/ccc/python/test`で実行していました。`/Users/aaa/bbb/ccc/python`で上記コマンドを実施したら無事にテストできました。
    * 逆に、`/Users/aaa/bbb/ccc/python/test`であれば、`test_program.py`と実行してあげる必要があります


# エラー内容2 AttributeError: module 'test.xxx' has no attribute 'py'

```
$ python -m unittest test.test_program.py
E
======================================================================
ERROR: py (unittest.loader._FailedTest)
----------------------------------------------------------------------
AttributeError: module 'test.test_program' has no attribute 'py'

----------------------------------------------------------------------
Ran 1 test in 0.000s

FAILED (errors=1)
```

# エラー内容１の原因・解決方法
＊ 後ろに.pyをつけて実行しているのが原因でした。外して実行したら無事にテストできました。
よく使うvim操作のショートカットキー一覧


## 初めに
vim操作のショートカットキーをよく忘れるので
備忘録として記載します。

## 環境

| ツール    |バージョン |
|-----------|------------|
| __PuTTY__ | Release 0.77 |

## 検索関連
| キー  |意味 |
|-----------|------------|
| /［文字列］ | 文字列を検索してくれる。エンターで確定する。|
| ?［文字列］ | 上記と同様。  |


## 移動関連
| キー  |意味 |
|-----------|------------|
| 移動したい行の数字押下後に「G」  | 指定した行に移動することができる。|
| 「g」2回押下  | 先頭の行に移動することができる。|
| 「shift」＋「g」| 最後尾の行に移動することができる。|


## Undo(元に戻す)、Redo(やり直す)関連
| キー  |意味 |
|-----------|------------|
| 「u」 | Undo(元に戻す)、一つ前に戻る|
| 「ctrl」 ＋ 「r」 | Redo(やり直し)、一つ前に進む  |

## 選択、削除関連
| キー  |意味 |
|-----------|------------|
| 「shift」＋「v」 | 行選択モードに入る→その後「↑」or 「↓」で複数行選択可|
| 「d」 | 選択している箇所を削除する  |


## よく使うコンボ
　__全文削除__：「g」2回押下→「shift」＋「v」→「shift」＋「g」→「d」


## 最後に

使う時に少しずつ更新していきます！

ご指摘ありましたら、いつでもコメントお願いいたします💦
create-nuxt-appをするまでにつまずいたところまとめ

# はじめに
WSL環境でnuxtのプロジェクトを作成しようと思ったらいくつか躓いたところがあったので、備忘録として残します。

# 前提の環境
- Windows 10
- WSL2、ubuntuセットアップ済み

# つまずいたこと
## 1. ubuntuのユーザのパスワードを忘れた
sudoが実行できなくなってしまいました。
### 対処方法：コマンドプロンプトからrootユーザのパスワードを変更する
<a href="https://linuxfan.info/wsl-password-reset">こちらの記事</a>を参考にして、rootユーザのパスワードを変更しました。

1. コマンドプロンプトで`ubuntu config --default-user root`を実行する
ubuntuターミナルでコマンドを実行するユーザをrootユーザに変更します。
2. ubuntuターミナルを開き、`passwd ユーザ名`を実行する
パスワードを変えたいユーザの名前を入力し、パスワードを変更します。
3. コマンドプロンプトで`ubuntu config --default-user ユーザ名`を実行する
変更したユーザでubuntuを実行するように、ユーザをもとに戻します。

## 2. node.jsが入っていなかった
create-nuxt-appを実行するためのnpmも入っていませんでした。
### 対処方法
<a href="https://learn.microsoft.com/ja-jp/windows/dev-environment/javascript/nodejs-on-wsl">こちらの記事</a>を参考に、nvmをインストールしました。（nodeやnpmもついてきます）

以下すべてubuntuターミナル上で操作します。
1. `sudo apt-get install curl`を実行してcURLをインストールする
2. `curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/master/install.sh | bash`を実行する
2. `nvm ls`でnvmがインストールされていることを確認する
2. `nvm install --lts`で安定板を、`nvm install node`で現在のリリースをインストールする
2. `node -v`と`npm -v`でnodeとnpmがインストールされていることを確認する

## 3. yarnが入っていなかった
なんとなくyarnでやりたかったのですが、yarnもありませんでした。
### 対処方法
ubuntuターミナル上で実行します。
1. `npm install -g yarn`を実行する
    `sudo npm install -g yarn`で実行するという記事を見かけたのですが、sudoを付けると実行できませんでした。

## 4. VSCode上でubuntuに作成したフォルダを開きたかった
開きたかったです。
### 対処法
1. ubuntuターミナル上で開きたいフォルダまで移動し、`code .`を実行
開きます。

## 5. SPAとSSRどっちにしたらいいかわからん
どっちにしたらいいかわからなくて、しばらく悩んでいました。
### 対処法：後で変更できる
<a href="https://nishimura.club/nuxt-spa-ssr-ssg">こちらの記事</a>曰く、`nuxt.config.js`で後から変更できるみたいなので、とりあえずSPAにしました。

## 6. deployment targetどっち選べばいいかわからん
serverとstaticでどちらにするかわかりませんでした。
### 対処法
staticは静的サイト作成時に選択するそうなので、今回はserverにしました。（<a href="https://nuxtjs.org/docs/features/deployment-targets/">参考記事</a>）

## 7. `yarn dev`したら`error:0308010C:digital envelope routines::unsupported`エラーが出た
ビルドできなくてビビりました。
### 対処法：コマンドを流して一時的に対処
nodeのバージョンの問題らしく、<a href="https://qiita.com/ryo_hagiwara/items/c433160765a7d66a8f82">こちらの記事</a>を参考に対処しました。
1. nuxtプロジェクトを作成したディレクトリ内で、`export NODE_OPTIONS=--openssl-legacy-provider`を実行する

# まとめ
環境を整備するのって難しいですね。

# 参考
- <a href="https://learn.microsoft.com/ja-jp/windows/dev-environment/javascript/nodejs-on-wsl">Node.js を Linux 用 Windows サブシステム (WSL2) にインストールする</a>
- <a href="https://nishimura.club/nuxt-spa-ssr-ssg">Nuxt.jsでSPA, SSR, SSGの違いと設定方法について</a>
- <a href="https://linuxfan.info/wsl-password-reset">WSLでLinuxのパスワードを忘れてしまった場合の対処法</a>
- <a href="https://nuxtjs.org/docs/features/deployment-targets/">Deployment Targets</a>
- <a href="https://qiita.com/ryo_hagiwara/items/c433160765a7d66a8f82">【備忘録】error:0308010C:digital envelope routines::unsupported</a>
カスタム拡張機能で「いろんなモノ」につなぐ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/7d59d722-50ef-117e-8c7e-f581d892b8b1.png)

**カスタム拡張機能**は、New Watson Assistant になって初めて追加された機能ですので、初めて聞く人も多いと思います。

# カスタム拡張機能とは

カスタム拡張機能とは何か、何ができるようになるのか、[オンライン・マニュアル](https://cloud.ibm.com/docs/watson-assistant?topic=watson-assistant-call-extension)から抜粋します。

### カスタム拡張機能とは何か
カスタム拡張機能は、<font color="DeepSkyblue">**外部サービスとの統合**</font>です。 アシスタントはアクションから拡張機能を呼び出すことにより、外部サービスに要求を送信したり会話で使用できる応答データを受信したりできます。

### 何ができるようになるのか
例えば、拡張機能を使用して、<font color="DeepSkyblue">**チケット発行システムやカスタマー・リレーションシップ・マネジメント (CRM) システムと対話したり、住宅ローン金利や気象条件などのリアルタイム・データを取得したりできます。</font>**
これにより、拡張機能からの応答データがアクション変数として使用可能になり、それをアシスタントが会話で使用できるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/453b0683-4867-2d14-b8f2-e672f4fd7c9a.png)

# カスタム拡張機能の作成方法

REST API をサポートするシステムであれば、OpenAPI 文書をインポートすることで比較的簡単にカスタム拡張機能を作成できます。

:::note warn
カスタム拡張機能で取り込む OpenAPI 文書は、[オンラインマニュアルに記載](https://cloud.ibm.com/docs/watson-assistant?topic=watson-assistant-build-custom-extension#build-custom-extension-openapi-file)の要件と制限事項を満たす必要があります。ベンダーが提供する OpenAPI をダウンロードして取り込む際にエラーが発生する場合は、表示されるエラー内容を確認し、要件と制限事項をクリアするように修正してください。
:::
カスタム拡張機能が作成されると、OpenAPI 文書の定義にならって、**操作名称**と接続先の**エンドポイント**が表示されます。

**インテグレーションズ**にて
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/cd15c81b-3003-f224-b25d-c6b2267fec7b.png)
この操作名称をステップの中から呼び出し、パラメータに値をセットすることで、Watson Assistant と外部サービスを統合する事ができます。

**ステップ**にて
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/5c05a87a-21ac-291f-bbfd-e61390c1a7c7.png)

:::note info
外部 API の呼び出しは、[30 秒以内に完了](https://cloud.ibm.com/docs/watson-assistant?topic=watson-assistant-build-custom-extension#build-custom-extension-openapi-file)する必要があります。
:::

# カスタム拡張機能と IBM App Connect との連携

カスタム拡張機能を使用する場合は、接続先の外部システムが提供する API の仕様を定義した OpenAPI 文書の準備が必要ですが、IBM App Connect と連携することで、OpenAPI 文書の準備が不要となり、GUI 操作で外部システムとの連携が可能になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/08477307-7474-adc7-c38a-bb411ff1edd7.png)

詳細は、Medium [Watson Assistant just got connected!](https://medium.com/ibm-watson/watson-assistant-just-got-connected-a1f46dc9b130) を参照してください。

#### IBM App Connect がサポートするコネクター

詳細は[こちら](https://www.ibm.com/cloud/app-connect/connectors/)。
非常に多くのサービスと接続するコネクターがサポートされています。
今お使いのサービスがきっとあるはずです。ぜひ、探してみてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/6bd55e50-78fc-250f-b12d-f501cad420a9.png)

# いかがでしたでしょうか

New Watson Assistant から機能追加された**カスタム拡張機能**をご紹介しました。
外部システムの API の仕様を定義した OpenAPI 文書を取り込むことで、ステップの中から操作名称の指定とパラメータに値をセットして、簡単に呼び出すことができます。

カスタム拡張機能を活用することで、バーチャル・アシスタントの**サービスの幅を広げる事が可能**になります。

# 参考情報

### 公式オンライン・マニュアル: カスタム拡張機能
https://cloud.ibm.com/docs/watson-assistant?topic=watson-assistant-call-extension&locale=ja

### 公式オンライン・マニュアル: カスタム拡張機能の作成
https://cloud.ibm.com/docs/watson-assistant?topic=watson-assistant-build-custom-extension

### IBM App Connect

https://medium.com/ibm-watson/watson-assistant-just-got-connected-a1f46dc9b130

https://www.ibm.com/cloud/app-connect/connectors/
One Observability Workshop をやってみた

今年も re:Invent 2022 では多くの発表がありました。
オブザーバビリティに関する情報も多く、その内容は以下のブログにまとめられています。

https://aws.amazon.com/jp/blogs/news/whats-new-in-aws-observability-at-reinvent-2022/

本記事では、このブログのなかで紹介されている「One Observability Workshop」というワークショップをやってみたのでその所感を記録します。

https://catalog.workshops.aws/observability/ja-JP

# ワークショップの概要

## ワークショップの内容について

このワークショップでは以下のようなペットの里親探しのWebアプリを題材に CloudWatch のサービスの使い方について学ぶことが出来ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314315/420ff9eb-c338-da3e-0da5-caf64e2ad489.png)

ワークショップには 2022/12/12 時点で以下の 19 のモジュールがあり、かなりのボリュームとなっています。

- CloudWatch ServiceLens
- AWS X-Ray
- Contributor Insights
- CloudWatch Synthetics
- CloudWatch RUM
- CloudWatch Evidently
- Container Insights
- Logs Insights
- Lambda Insights
- メトリクス
- ダッシュボード
- 異常検出
- 埋め込みメトリックフォーマット
- アラーム
- Amazon Managed Service for Prometheus
- Amazon Managed Grafana
- AWS Observability Accelerator
- AWS Distro for OpenTelemetry
- 負荷テストとトラブルシューティング

ワークショップの説明には

> すべてのモジュールを完了するには、通常約3〜4時間かかりますが

とあるのですが、すべて行うと4時間では絶対に終わりません。自分は10時間以上かかりました。

ただし、それぞれのモジュールは独立しているので自分が学びたい項目だけをピックアップして取り組むことも可能です。


## 学べることと前提知識

このワークショップでは CloudWatch の機能について学ぶことが出来ますが、そもそもオブザーバビリティとは何か、について学ぶことは出来ません。
オブザーバビリティに関する前提知識は必ず必要なわけではないですが、知っているとより効果的だとは思います。

オブザーバビリティについて知るためには以下のベストプラクティスが役立ちます。

https://aws-observability.github.io/observability-best-practices/


## 費用

このワークショップでは以下のようなインフラを構築します。なかなかの規模のシステムです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314315/88013c83-da0c-a274-fa89-94c94d90556c.png)

リージョンにも依ると思いますが、自分が実施した経験だと1日35ドルくらいかかっています。
ボリュームは大きいのですが、なるべく短い時間でワークショップを完了させるよう努力をした方が経済的で良いと思います。

# やってみた感想

事前のおぜん立てがとてもよく出来ていて、エラーやボトルネックの調査をどのように行うのか、オブザーバビリティの学習に集中することが出来る素晴らしいワークショップだと思いました。
インフラの構築やアプリケーションのことはそれほど意識する必要がなく、書かれている通りに進めていけば CloudWatch の機能を学ぶことが出来ます。
Synthetics や RUM, Evidently のような比較的新しいサービスのワークショップがあるのも良いなと思いました。

一方で、ボリュームが大きくて長く続けていると飽きてくるのがツラいなと思いました。
料金を考えると早く終わらせたいのですが先は長く、果たしてどれくらい真面目に取り組もうか悩みながら進めることになってしまいました。

途中で止める場合には都度インフラを削除する手もあると思いますが、CDKですぐに環境が作れるとは言え構築には30分くらいかかるので悩ましいところです。

ワークショップを始める前に一通り資料に目を通しておき、計画を立てた方が良いかもしれないと思いました。


コスト面以外の悪い点は特にないので、オブザーバビリティを学びたい方には是非やってみていただきたいオススメのワークショップでした。
Azure Data Factoryでアクティビティのエラーメッセージを取得する方法

## 概要
Azure Data Factory(ADF)でアクティビティのエラーメッセージを取得する方法を調べた際のメモです。
ADFではアクティビティのsuccess, fail, skip, completeというステータスコードを条件に依存関係を定義できるので、エラーが起きたら通知用のパイプラインを呼び出すといった実装は容易にできます。
ただ、直前のアクティビティでのエラーメッセージの取得には少し工夫が必要です。

## 実装方法
今回は、Execute Pipelineアクティビティにおけるエラーメッセージを取得する方法を紹介します。
※他のアクティビティでも同様に実装が可能だと思います。

まず、Failアクティビティのみを実行するraise_errパイプライン(`c_raise_err.json`)を作成します。
Failアクティビティではエラーコード`408`で`timeout`というエラーメッセージを出力するよう設定します。
※先頭のc, pはchild, parentの頭文字です。
```json:c_raise_err.json
{
	"name": "raise_err",
	"properties": {
		"activities": [
			{
				"name": "raise-err",
				"type": "Fail",
				"dependsOn": [],
				"userProperties": [],
				"typeProperties": {
					"message": "timeout",
					"errorCode": "408"
				}
			}
		],
		"folder": {
			"name": "sample"
		},
		"annotations": []
	}
}
```
次にraise_errパイプラインを呼び出し、そのエラーメッセージを変数`err`に設定するmainパイプライン(`p_main.json`)を作成します。
```json:p_main.json
{
	"name": "main",
	"properties": {
		"activities": [
			{
				"name": "set-err-msg",
				"type": "SetVariable",
				"dependsOn": [
					{
						"activity": "exec-pipeline",
						"dependencyConditions": [
							"Failed"
						]
					}
				],
				"userProperties": [],
				"typeProperties": {
					"variableName": "err",
					"value": {
						"value": "@activity('exec-pipeline').error.Message",
						"type": "Expression"
					}
				}
			},
			{
				"name": "exec-pipeline",
				"type": "ExecutePipeline",
				"dependsOn": [],
				"userProperties": [],
				"typeProperties": {
					"pipeline": {
						"referenceName": "raise_err",
						"type": "PipelineReference"
					},
					"waitOnCompletion": true
				}
			}
		],
		"variables": {
			"err": {
				"type": "String"
			}
		},
		"folder": {
			"name": "sample"
		},
		"annotations": []
	}
```
ADFコンソール(GUI)では以下の表示になります。
![pipeline.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/337794/074fb998-b9db-ee57-5a05-5afa1abc23db.png)
上記2つのパイプラインを作成後に実行します。
すると、ADFコンソールで変数`err`を確認すると、アクティビティのエラーメッセージが取得できていることを確認できました。
![set-err-msg-comp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/337794/6bd26ac4-369c-db8f-9d04-92c023f806ac.png)

## 最後に
ADFではアクティビティの入出力はjsonで記述されています。
基本、アクティビティの出力結果はJSONPathでクエリできると思っておけば大丈夫です。

## 参考リンク
https://learn.microsoft.com/en-us/answers/questions/205748/adf-getting-the-error-message-of-a-previous-activi.html
python 関数のアンパック

## 関数の戻り値をアンパックしよう
関数の戻り値は、以下のコードのように、複数の変数に対してアンパックが可能。
~~~python:exam.py
def func(numbers):
    max_num = max(numbers)
    min_num = min(numbers)
    return max_num, min_num


numbers = [4, 1, 6, 2, 10, 100, 5, 200]

max_num, min_num = func(numbers)
print(f'最大値:{max_num} 最小値{min_num}')

>>>最大値:200 最小値1
~~~

## アスタリスクを用いたアンパック
例えば、リストの最大値と最小値だけを個別に変数に代入して、そのほかは一つの変数に代入することもできる。
~~~python:exam2.py
def func(numbers):
    numbers.sort(reverse=True)
    return numbers


numbers = [4, 1, 6, 2, 10, 100, 5, 200]
max_num, *others, min_num = func(numbers)
print(f'最大値:{max_num} 最小値{min_num} その他{others}')

>>>最大値:200 最小値1 その他[100, 10, 6, 5, 4, 2]
~~~

## 複数の戻り値を返す際の注意
例えば以下のようなシチュエーションを考えてみる。
~~~python:戻り値注意！
def func(numbers):
    ............
    return max_num, min_num, median_num, count, length

# max_numとmin_numが反対になっている。
min_num, max_num, median_num, count, length = func(numbers)
~~~
このように、多くの戻り値を返しすぎると、バグやヒューマンエラーのもとになりやすい。多くても３つ以内の戻り値にするのが、妥当だろう。

## 補足事項
アスタリスクを用いた場合は、listインスタンスを返すことになる。
~~~python:exam3.py
numbers = [1, 2]
one, two, *other = numbers
print(one, two, other)

# *（アスタリスク）を用いると、listで返され、要素が残っていない場合は、空のリストを返す
>>>1 2 []
~~~
<b>*（アスタリスク）を用いるとリストで返されるということは、リスト内のデータ量には注意が必要である。</b>なぜなら、リストは格納されている要素すべてを返してしまうからだ。大量のデータがリスト内にあった場合、プログラムがクラッシュする危険をはらんでいる。メモリ以上のデータを扱わない確信がないときは、＊（アスタリスク）は使うべきではない。

## 参考
Effective Python

python japan
<https://www.python.jp/train/tuple/unpack.html>

https://qiita.com/1023shogo2013/items/db93fb6a0319759a834a
SigfoxをESP32で使ってみる①(準備～ATコマンドまで)

# はじめに
ラズパイ・ArduinoでIoT的なことをしたい場合wifiを使うことが多いと思います。しかし、屋外などで通信を行いたい場合の選択肢としてLTEがあると思いますが、モジュールが高価でハードルが高いのではないでしょうか？今回はLPWAの一種であるsigfoxを使って接続およびAWSとの連携までやってみたいと思います。
# LPWA及びsigfoxとは？
一言でいうとLTE・4Gの逆の存在である通信規格です。大容量・高速がメインのLTEに対してLPWAは低容量・省エネのイメージです。
sigfoxはLPWAの一種で他の規格と比較しても、低消費電力・低価格が特徴です。

詳しくは→[Sigfoxとは](https://www.kccs.co.jp/sigfox/service/)

# Sigfoxモジュールについて
今回はSigfoxブレークアウトボード BRKWS01というモジュールを使用します

https://www.marutsu.co.jp/pc/i/1357859/


下記サイトにもある通り、sigfoxクラウドにてデバイス登録をしなければなりません。

https://www.kccs.co.jp/sigfox/buy/flow/

:::note info
sigfoxクラウドへのデバイス登録は上記の説明通りでできますが、注意点として下記画像内の赤線部分にはデバイスIDを入力してください
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342722/c7c4b94a-92cb-2b64-ca9b-b1df8cf700eb.png)


# ESP32との接続方法
配線は簡単です。モジュールにピンがたくさんありますが、基本的に使うのはTX/RXです。

|ESP32  | BRKWS01 |
|---|---|
| 3.3V|vcc |
|GND |GND  |
|TX|IO16|
|RX |IO17|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342722/c02f0267-9ed4-ac5b-72f0-d1a0fd951550.png)

# ATコマンドよりアップリンクしてみる
配線及びsigfoxクラウドへの登録が済んだら、ＡＴコマンドで通信してみましょう。
```cpp
//ESP32+BRKWS01　ATコマンドコード
//ESP32 16→TX,17→RX

void setup() {
  // Open serial communications and wait for port to open:
    Serial.begin(115200);
    Serial2.begin(9600); 
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }

  // set the data rate for the SoftwareSerial port
  Serial2.begin(9600);
  Serial.println("Connect to the Sigfox Breakout board...");
  Serial.println("AT$I=10 : get Device ID");
  Serial.println("AT$I=11 : get PAC");
  Serial.println("AT$T? : get Temperature");
  Serial.println("AT$V? : get Voltages");
  Serial.println("AT$P=unit : set Power mode (unit = 0:software reset 1:sleep 2:deep_sleep)");
  Serial.println("AT$TR=unit : set Transmit repeat (unit = 0..2)");
  Serial.println("AT$WR : save config");
  Serial.println("AT$SF=[payload] : SEND SIGFOX MESSAGE");
  Serial.print("Device ID : ");
  Serial2.print("AT$I=10\r");
}

void loop() { // run over and over
  if (Serial2.available()) {
    Serial.write(Serial2.read());
  }
  if (Serial.available()) {
    Serial2.write(Serial.read());
  }
}
```
### ATコマンドの使用例
シリアルにて
```AT$I=10```を入力すると```デバイスＩＤ```返ってきます。
sigfoxクラウドにメッセージを送信する場合は
```AT$SF=0000```を送信し、通信が完了すると```OK```が返ってきますので、さらにsigfoxクラウド(**Device→MESSAGE**)を確認すると下記のように確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342722/2476835f-063d-db74-5a46-031c95d324d4.png)

送信したメッセージと大まかな位置がわかると思います。この時点では緯度経度の情報は見ることができません。Callbackの設定をすることでwebhookやAWSなどのエンドポイントを用意することで詳細の情報を受信することができます。

それらの方法はまた次回で。
【AWS初学者向け】Amazon Route 53とは？を解説

# はじめに
Amazon Route53を何となく知っているが、具体的に何をしているのかわからないと思い、調べた結果を、以下にまとめました。
（ドメインを登録して、そのドメイン名を検索したらシステムが見れるようになるぐらいのイメージでした・・・）

:::note
本記事の対象者
・Amazon Route53とは？と疑問を持っている方
:::

:::note alert
本記事で解説していないこと
・ハンズオン方法
:::

# Amazon Route53とは？
Amazon Route53とは、可用性と拡張性に優れたドメインネームシステム (DNS) ウェブサービスです。

https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/Welcome.html

`example.com`のようなドメイン名を登録できたり、ウェブサイトで`example.com`と検索した時に、サイトやアプリケーションに接続するための支援を行います。

ちなみに、53は「フィフティースリー」と呼ぶ方が正しそうです。（ただ、現場では「ごじゅうさん」と呼ぶことが多いみたいです。）

# Hosted Zoneとは？
Amazon Route53を設定するには、まずHosted Zoneを作成する必要があります。
![スクリーンショット 2022-12-09 21.22.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2849898/183fb96a-2aff-1f5b-8409-d1bba380aa16.png)
例えば、`example.com`用のHosted Zoneを作成します。
そうすることで、`example.com`と検索した際に、どのようにルーティングするかに関する情報を保持します。

https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/hosted-zones-working-with.html

パブリックとプライベートがありますが、**パブリック**で設定することが多いです。
主にインターネットで検索した際に、情報を得ようとするため、プライベートだと情報を得ることができないためです。

次に、名前解決の流れに関して、記載します。

# 名前解決の流れ
名前解決とは、クライアントからの問い合わせに応じて、ネームサーバーから情報を取り出すことを言います。

https://jprs.jp/glossary/index.php?ID=0084

今回は、`example.com`で例えます。
`example.com`のドメイン名は、以下に分けることができます。
- **.** （ルート）
- com
- example.com

また、それぞれにドメイン・ゾーン・サーバーがあります。

https://jprs.jp/glossary/index.php?ID=0160

https://jprs.jp/glossary/index.php?ID=0142

サーバーに関しては、**権威DNSサーバー**といい、あるゾーンの情報を保持し、他のサーバーに問い合わせることなく応答を返すことができるサーバーのことを指します。
（Amazon Route53は、権威DNSサーバーにあたります。）

https://jprs.jp/glossary/index.php?ID=0145

流れとしては、ルートから順に委任され、最終的に`example.com`にたどり着きます。

```
. (ルート) ▶︎ com ▶︎ example.com
```

ルートドメイン ▶︎ ルートゾーン ▶︎ ルートサーバーで応答を返して、次に、comドメイン ▶︎ ・・・ という流れになります。

# まとめ
任意のドメイン名でHosted Zoneを作成して、情報を得るための名前解決を学ぶことができました。
ドメイン名は、Amazon Route53でも作成できますが、よく聞くところだと、以下が挙げられます。

- お名前.com
- Value Domain　...etc

今回は`example.com`を例にまとめましたが、`example.com`の情報を得るために、どのような流れでたどり着くのか、イメージができたら幸いです。

# 最後に
今回は、以下に関してまとめました。
- Amazon Route53とは、ドメインネームシステム (DNS) ウェブサービスとのこと。
- 設定するには、Hosted Zoneを作成する必要がある。
- 名前解決の流れ

ウェブサイトで検索した際に、正しい情報を返すために、Amazon Route53でHosted Zoneを作成して、名前解決の流れまで把握することができました。

今回、ハンズオン方法はまとめていないので、この記事で前提を理解して、実装に活かしていただきたいと思います！

記事をご覧いただき、ありがとうございました。
グラデーションを考える

　
この記事は[アドカレ](https://qiita.com/advent-calendar/2022/lua)に参加しています。

# グラデーションを考える
　半年前に書いたものを載せます。
　半年前の僕は文章が上手ですね。

## ＜はじめに＞
スクリプト制御でグラデーションをやっていきます。 
四隅の色でやるやつです。 

## ＜コード＞
```lua
local w,h=obj.getpixel() 
local ColorTable={0xff8e58,0x4dd9ff,0xe5ade0,0x7eb069} 
local RT,GT,BT={},{},{} 
local r,g,b={},{},{} 
for i=1,4 do 
 RT[i],GT[i],BT[i]=RGB(ColorTable[i]) 
end 
for x=0,w do 
 for y=0,h do 
 local xw,yh=x/w,y/h 
 r[1]=RT[1]+(RT[2]-RT[1])*xw 
 r[2]=RT[3]+(RT[4]-RT[3])*xw 
 r[1]=r[1]+(r[2]-r[1])*yh 
 g[1]=GT[1]+(GT[2]-GT[1])*xw 
 g[2]=GT[3]+(GT[4]-GT[3])*xw 
 g[1]=g[1]+(g[2]-g[1])*yh 
 b[1]=BT[1]+(BT[2]-BT[1])*xw 
 b[2]=BT[3]+(BT[4]-BT[3])*xw 
 b[1]=b[1]+(b[2]-b[1])*yh 
 obj.putpixel(x,y,RGB(r[1],g[1],b[1]),1) 
 end 
end
```

## ＜断り書き＞
たぶん、今回のアルゴリズムは効率が悪いです。 
じゃあ、なぜ効率の良いアルゴリズムを使わないかというと、僕があまり理解できていないからです。 
　
興味ある人は以下のサイトとかを見るといいかもしれないです。 
https://talavax.com/gradationimage4.html
https://daeudaeu.com/linear/

## ＜普通のグラデ＞ 
まずは普通のグラデーションを考えてみます。
　
↓こんなかんじのものです。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005402/92b3cb34-8f2f-a6ff-b5d6-e71ddbe25983.png)

これはとても単純で、 
右に行くほど一つ目の色(赤)に、左に行くほど二つ目の色(青)になるようにします。 
コードは以下のようになります。 
```lua
local w,h=obj.getpixel() 
R_1,G_1,B_1=RGB(0xff0000) 
R_2,G_2,B_2=RGB(0x0000ff) 
for x=0,w do 
 local r,g,b 
 r=R_1+(R_2-R_1)*x/w 
 g=G_1+(G_2-G_1)*x/w 
 b=B_1+(B_2-B_1)*x/w 
 for y=0,h do 
 obj.putpixel(x,y,RGB(r,g,b),1) 
 end 
end
```
コードを少し細かく見ていきます。 
　
まず、obj.getpixel()で縦と横のピクセル数を取得します。 
次に、RGB()でカラーコードを RGB の要素に分解します。 
　
分解して得られた RGB をもとに、一つずつピクセルの色を書き換えていきます。すべてのピクセルの色を書き換えるので、二重ループになります。 
　
色を書き換える際には obj.putpixel()を使います。 
　
これでグラデーションを作れました。 

## ＜四隅のグラデ＞
それでは、四隅のグラデを作っていきます。 
　
↓こんなかんじのものです。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005402/6e7e3852-d7af-ffcf-e48b-ac464768b7c1.png)
まず、どのようになっているかを考えてみます。

色は四つあります。
角に近くなるにつれて、何かしらの色に近くなります。
真ん中らへんは四色の平均の色です。

…こんなかんじになっているのが分かると思います。


では、(x,y)の位置にあるピクセルの色を求めていきます。

それぞれの色と位置の座標をまとめてみると、以下のようになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005402/30cb01b1-c32a-92ed-76e3-3162536f01e8.png)
考えやすくするために、xとyに分けて考えます。

xについては、
左上と右上、左下と右下の組み合わせがあります。

どちらも、普通のグラデーションと同じように色を求めることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005402/45ec7712-3ca4-628a-793b-8ebe1b05f49e.png)
任意のピクセルの場所を白丸として、

左上と右上、左下と右下で補間したときに、黄色丸の色を見つけたことになります。

この二つの黄色丸をさらに補間することで、任意のピクセルの色を求めれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005402/f636038e-7621-d24a-1726-bfc6c964279f.png)

## ＜おわりに＞
ピクセル操作はオブジェクトのピクセル数が多ければ多いほど重たいですが、
とても便利なものです。

一時保存系のスクリプトなどを上手く駆使することで、編集にとても役立ちます。

今回のグラデーションの場合は画像に加算合成するだけでも楽しいと思います。

[twitter](https://twitter.com/metaphysicalba1)
scroll-marginとscroll-paddingを使ってみる

[ひとりCSS Advent Calendar 2022](https://qiita.com/advent-calendar/2022/css-becolomochi) 13日目です。


scroll-marginとscroll-paddingを使ってみます。

## どんなときに便利か

- たとえばページ上部にヘッダーを固定させて、ページ内スクロールを実装したとき
    - margin padding だとスクロールさせたときにヘッダーとかぶる
        - 頻繁に遭遇する（またか〜…みたいな。）
        - 考慮するの結構面倒だった
    - scroll-padding を使うとヘッダー分の高さを考慮できる
- scroll-margin より scroll-padding のほうが使うことが多そう 

## 作ってみる

```html
<header>
  <nav>
    <a href="#1">section1</a>
    <a href="#2">section2</a>
    <a href="#3">section3</a>
    <a href="#4">section4</a>
  </nav>
</header>
<main>
  <section id="1">
    <h2>Headline1</h2>
    <p>Paragraph</p>
  </section>
  <section id="2">
    <h2>Headline2</h2>
    <p>Paragraph</p>
  </section>
  <section id="3">
    <h2>Headline3</h2>
    <p>Paragraph</p>
  </section>
  <section id="4">
    <h2>Headline4</h2>
    <p>Paragraph</p>
  </section>
</main>
```

```css
html {
  scroll-behavior: smooth;
  scroll-padding-top: 64px;
}

header {
  position: fixed;
  left: 0;
  right: 0;
  height: 56px;
  background: #fff;
  border-bottom: 1px solid #eee;
  display: flex;
  justify-content: center;
  align-items: center;
}

main {
  padding: 64px 0;
}

section {
  height: 200vh;

}
```

![gif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41088/791be005-f1c3-5581-4a09-8642b3d697b2.gif)

https://codepen.io/becolomochi/pen/OJEYpEN


## 感想

- 便利〜！

## 参考

- https://developer.mozilla.org/ja/docs/Web/CSS/scroll-margin
- https://developer.mozilla.org/ja/docs/Web/CSS/scroll-padding
【JDLA認定プログラム】学生が無料で受講する方法

# はじめに

この記事はCDLE youth Advent Calender 2022 13日目の記事です。今回は私が受講している最中の大学生が無料で受ける事ができるJDLA認定プログラムを紹介していきたいと思います。。大学生・大学院生のうちにE資格を受験しようと考えている方の参考になれば幸いです。

# 24卒向け【AIエンジニアになるための長期インターンプログラム】

こちらが現在、受講している最中のJDLA認定プログラムになります。このプログラムはSkillupAIが2020年からAI領域での活躍を目指す大学生・大学院生を対象に行っている長期インターンになります。参加者は2020年：194人,　2021：392人、2022年：未定ですが、より多くの方が参加していると予想されることから、参加者は年々増えているように感じます。G検定、E資格の受験者数も増加傾向にあるため、かなりニーズがあると思います。

# 受講してみて感じたこと

- かなり基礎的なところから（数学、Pyhtonの基礎）学ぶことができるので、文系、理系問わず学ぶ意志があればだれでも受講することができる。
- 前半はそこまで難しく感じないかもしれないけど、後半にいくにつれて機械学習や深層学習のコーディング課題が出てくるので、かなり勉強しないと途中で挫折してしまう可能性があると感じた。
- 形式がe-learnigなので、動画と資料を見て、理解を深める必要があり、エラー処理に時間がかかってしまったり、困ったときに相談ができない。（Slackで質問をなげることはできる）
- 大学の授業と並行して勉強しなければならないため、かなり気合いをもって取り組まないと中途半端になってしまい、認定プログラムを修了できずに、途中で終わってしまう。（E資格が受験できなくなる）
- 自分で勉強できる人、事前知識がかなりある人などは他の安い認定プログラムを受講することでE資格の受験資格を得ることができるので、がっつり基礎から勉強したい人向けのプログラムだと思う。(安くても数万円はかかるのがネック）

# さいごに

私自身、E資格の受験はこれからなので本腰を入れて勉強に取り組まないといけないと感じてます。E資格を取得したからと言って、すぐにAI領域で活躍できる人材になれるかというとそうとは限らないと感じています。この資格は難易度も高いし、それなりに評価される資格だと思いますが、これから自分で勉強を継続していくことがより重要だと思います。また、G検定もしくはE資格合格後にはSlackのコミュニティに参加できます。学生同士の交流や社会人が主催しているイベントに参加したりできるので、ぜひ挑戦してみてください！
Kageki (TD4互換機) でガッテンRもどき

[TD4の命令を実行できる自作CPU「Kageki」](https://elchika.com/article/9ac9fd67-86c5-4b1b-a355-4f662e8af794/)で「ガッテンR」もどきを作ってみた。

# ガッテンR

「ガッテンR」とは、プロジェクト59 タケ様がかつて頒布していたキットである。

[『ガッテンR』 ⑥　キット頒布について - プロジェクト59　：　キット頒布、電子工作　『ユルハム派』](http://project59.blog.fc2.com/blog-entry-619.html)

以下の仕様となっているようである。

* ボタンを押して離すと、モールス信号の「R」の音が鳴り、LEDが光る。
* 光るLEDの色は、緑と赤がボタンを押すたびに交互になる。
* スイッチを切り替えると、「R」のかわりに「FB」の音を鳴らすモードにできる。

# 今回の仕様

* 入力ポートの最上位ビットを「1」にして「0」にすると、出力ポートの最上位ビットにモールス信号の「R」を出力する。
* 光るLEDの切り替えは無い。
* 「FB」を出力するモードは無い。

# プログラム

```
位置 機械語   アセンブリ言語
--------------------------------
0    00100000 WAIT1: IN  A
1    00001000        ADD A, 1000
2    11100000        JNC WAIT1
3    00100000 WAIT2: IN  A
4    00001000        ADD A, 1000
5    11100111        JNC SOUND
6    11110011        JMP WAIT2
7    10111000 SOUND: OUT 1000
8    10110000        OUT 0000
9    10111000        OUT 1000
A    00000000        ADD A, 0000
B    00000000        ADD A, 0000
C    10110000        OUT 0000
D    10111000        OUT 1000
E    10110000        OUT 0000
F    11110000        JMP WAIT1
```

# 実行結果

入力ポートに [Pmod BTN](https://digilent.com/shop/pmod-btn-4-user-pushbuttons/) を、出力ポートに [Dice Board](https://elchika.com/article/e6cf654e-8504-4796-b806-97110ab73bc6/#h_Dice%20Board) を接続して実行した。

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

* 20Hzのクロックで実行すると、ちょうどいい速さになった。※感じ方には個人差があります
* ボタンを押す時間が短いと、タイミングによって反応しないことがあった。
macOS Monterey 12.3「python2.7廃止」でArduino IDEでESP32のビルドが通らない時の応急処置



https://twitter.com/tomorrow56/status/1504822905917808640?s=20&t=g1qII4Bcnl3pSpDRz6uCwg


pyenvで2系と3系もどちらもターミナルでは呼び出せるのですが、ArduinoIDEからビルドすると、pythonが呼び出せないんです...

https://qiita.com/nthr7286/items/4b68ce2d7e77c1e0110b

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120903/c5014759-7dbc-3108-9fa5-259152b75e88.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120903/8994911e-a20c-c465-5806-0fd28be7248d.png)

$PATHは通っているんですよね...

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120903/3ad41e20-c2a5-b1be-2fa2-83f38b5d08ac.png)

結局、platform.txtの"python"(2箇所)を"python3"に書き換えて無理やりビルドを通してみる。
Library/Arduino15/packages/esp32/hardware/esp32/1.0.6/platform.txt

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120903/69246f27-3825-7f22-1e88-8331a31f6796.png)

うん、ビルド通った...

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120903/70b67493-de3c-9cc2-743f-17d7c7202276.png)
Dependabot で GitHub Actions (composite) の更新を行う


## はじめに

Dependabot で GitHub Actions の action を更新出来ることはご存じの方も多いと思います

https://docs.github.com/en/code-security/dependabot/working-with-dependabot/keeping-your-actions-up-to-date-with-dependabot

今回は、GitHub Actions の composite action の定義更新も Dependabot にお任せできるのでその設定方法をまとめました

### Dependabot について

Dependabot は多くの方が説明されているので省略します
気になる方は、 [deoendabot- Qiita](https://qiita.com/tags/dependabot) の記事をいくつか参照してみてください

https://docs.github.com/en/code-security/dependabot

### Composite action について

Composite action は workflow 内の job で実行する定義をまとめた物です
普段何気なく job に定義して利用しているのは composite action だったと言うことですね

https://docs.github.com/en/actions/creating-actions/creating-a-composite-action

今回は "同一 repository 内に folder を作成し composite action 定義している場合を例に記載します

## Dependabot を定義しよう

### repository の構成について

設定例を記載する前に、repository 構成等を始めに記載します

今回は、 `.github/actions/test-prepare` 以下に composite action が定義されているものとし、 `.github/workflows/test.yml` に定義されている workflow から `test-prepare` を呼び出しているものとします

```console
.
└── .github
    ├── actions
    |   └── test-prepare
    |      └── action.yml
    └── workflows
        └── test.yml
```

```yml:.github/workflows/test.yml
neme: Test

on:
  push:

permissions:
  contents: read

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: ./.github/actions/test-prepare
```

```yml:.github/actions/test-prepare/action.yml
name: "test-prepare"
runs:
  using: "composite"
  steps:
    - run: echo "Hellow World!!"
      shell: bash
```

### `.github/dependabot.yml` を更新する

それでは `.github/dependabot.yml` の定義を変更し、 composite action 内の定義も Pull request を作成してもらえるように設定しましょう

```diff_yaml:.github/dependabot.yml
 version: 2
 updates:
   - package-ecosystem: "github-actions"
     directory: "/"
     schedule:
       interval: "daily"
+  - package-ecosystem: "github-actions"
+    directory: "/.github/actions/test-prepare"
+    schedule:
+      interval: "daily"
```

`package-ecosystem: "github-actions"` かつ `directory: "/"` を定義した場合 `.github/workflows` を参照します、 今回見て欲しいディレクトリは `.github/actions/test-prepare` であるため `directory: "/.github/actions/test-prepare"` と定義することで dependabot が pull request を 作成してくれるようになります

## References

https://github.com/dependabot/dependabot-core/issues/4178

https://docs.github.com/en/actions/creating-actions/creating-a-composite-action

https://docs.github.com/en/code-security/dependabot/working-with-dependabot/keeping-your-actions-up-to-date-with-dependabot
ico球の面を求める

　
この記事は[アドカレ](https://qiita.com/advent-calendar/2022/lua)に参加しています。
　
# ico球の面を求める
　球を疑似的に表現する方法はいくつかありますが、その一つにico球があります。サッカーボールみたいなやつです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005402/c9f7716c-5954-f08b-5afd-dc7443c2e38a.png)
　
## 文献
[ICO球の作り方（１）](https://suzulang.com/cpp-code-ico-q-1/)
[Creating an icosphere mesh in code](http://blog.andreaskahler.com/2009/06/creating-icosphere-mesh-in-code.html)
　上記のリンク先が参考になりますが、今回は再帰処理を使って記述していきます。
　
## アルゴリズム
　ico球の面を求めるアルゴリズムを考えていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005402/5ecd9fb1-db77-a86f-ca2c-70f73a28a3ab.png)

1. まずは、各頂点の座標を求めます。1：(1+√5)/2 の比率の長方形を三枚思い浮かべたとき、各長方形の頂点をそのまま使います。

2. 次に、この頂点をもとに三角形を作ります。
このとき、三角形を任意の回数で分割していきます。

3. 最後に、三角形の頂点と原点からの距離を調整します。

以下の動画のように進めていきます。[twitter](https://twitter.com/metaphysicalba1/status/1602210455707172864)だとヌルヌル動いて分かり易いかもしれないですね。
![交通モデル.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005402/f8c6bffc-34f5-cfca-6379-e89359925b04.gif)

　
## コード
　以下にaviutlで使用できるコードを示します。(注：以下のコードは古いものですので、バグがあります。完全なものを作成したい場合は[こちら](https://github.com/metaphysical-bard/ico)を参考にしてください。)
```lua
<?--こっちはテキストボックスとかに貼り付けておく
--変数
MR=100--半径
MS=1--[[再帰回数(0~5ぐらいが目安。大きすぎるとフリーズ)]]
MS=math.max(0,math.floor(MS))
MK=math.sqrt(MR*MR)/(2^MS)+1

--長さをもとめる関数
local function sn(x,y,z)
return math.sqrt(x*x+y*y+z*z)
end

--長さをMRにする関数
local function se(k)
local q=math.sqrt(k[1]*k[1]+k[2]*k[2]+k[3]*k[3])
k[1]=k[1]*MR/q
k[2]=k[2]*MR/q
k[3]=k[3]*MR/q
return k
end

--二地点の中点を求める関数
local function sl(w,e)
local d={}
d[1]=(w[1]+e[1])*0.5
d[2]=(w[2]+e[2])*0.5
d[3]=(w[3]+e[3])*0.5
return d
end

--描画関数
local function sd(a,b,c)
obj.load("figure","四角形",0xffffff,1)
obj.alpha=0.95
a,b,c=se(a),se(b),se(c)
obj.drawpoly(a[1],a[2],a[3],
         b[1],b[2],b[3],
         c[1],c[2],c[3],
         c[1],c[2],c[3])
end

--頂点をもとに描画
function sa(a,b,c)
local k=sn(a[1]-b[1],a[2]-b[2],a[3]-b[3])
if(k<MK)then
 sd(a,b,c)
else
 local ab,ac,bc=sl(a,b),sl(a,c),sl(b,c)
 sa(a,ab,ac)
 sa(b,ab,bc)
 sa(c,ac,bc)
 sa(ab,ac,bc)
end
end
?>
```
```lua
--こっちは図形(四角形)にスクリプト制御から貼り付け
local r,yr
r=MR/2
yr=(1+math.sqrt(5))/2*r

local p={}

--二十面体の頂点を求める
p[1]={r,yr,0}
p[2]={r,-yr,0}
p[3]={-r,yr,0}
p[4]={-r,-yr,0}

p[5]={yr,0,r}
p[6]={yr,0,-r}
p[7]={-yr,0,r}
p[8]={-yr,0,-r}

p[9]={0,r,yr}
p[10]={0,r,-yr}
p[11]={0,-r,yr}
p[12]={0,-r,-yr}

--頂点をもとに描画
sa(p[2],p[4],p[11])
sa(p[2],p[4],p[12])

sa(p[2],p[6],p[12])
sa(p[2],p[5],p[11])
sa(p[4],p[8],p[12])
sa(p[4],p[7],p[11])

sa(p[2],p[5],p[6])
sa(p[4],p[7],p[8])
sa(p[1],p[5],p[6])
sa(p[3],p[7],p[8])

sa(p[6],p[10],p[12])
sa(p[8],p[10],p[12])
sa(p[5],p[9],p[11])
sa(p[7],p[9],p[11])

sa(p[1],p[6],p[10])
sa(p[1],p[5],p[9])
sa(p[3],p[8],p[10])
sa(p[3],p[7],p[9])

sa(p[1],p[3],p[9])
sa(p[1],p[3],p[10])
```

## バグの修正とか
　上に示したコードはバグがあるので、それを直す必要があります。
[こちら](https://github.com/metaphysical-bard/ico)にあるc言語で書かれたコードがバグ修正されています。変更点としては、
・描画時に頂点が時計回りになるようにした。
・再帰処理の終了判定が曖昧だったため、しっかりと変数でカウントするようにした。
…の二つです。
~~本当はluaもコードも直した方がいいけど、めんどいんや、、、~~
　
## 最後に
　本来は、重い処理を再帰処理で書くのは良くないことです。ですが、今回はたのしいので再帰処理で書きました。いつか機会があれば、再帰処理を使わない処理も書いてみたいですね。

[twitter](https://twitter.com/metaphysicalba1)
とても参考になった記事まとめ

業務のいろんな場面で参考になった、現在進行形で活用している記事をまとめました。
投稿者の皆様には改めてお礼申し上げます。
# コマンド

コマンド覚えられないので何度でも見返します。

https://qiita.com/keisukee/items/a07743279ae86effe1ca
# PostgreSQL
カラムが多いテーブルをselectした際の表示のあまりの見辛さに悩んでいたので、\x に救われました。

https://qiita.com/kiyodori/items/b9b34c7abe7e45f65c46

特定のテーブルをdumpする方法。

https://qiita.com/y_u_i_c_h_i/items/c3a0a981d01c790133ac
# Laravel

修正が反映されない…何かおかしいと思ったらとりあえずキャッシュを疑ってみる。

https://qiita.com/Ping/items/10ada8d069e13d729701
# その他
Carbonを使う機会が多いので、めちゃくちゃ助けられてます。

https://blog.capilano-fw.com/?p=867

命名の悩みが解消されました。ありがとうございます！

https://qiita.com/YutaManaka/items/62dda256bb7ba6c08399

常に心に留めておきたい教典。

https://qiita.com/alt_yamamoto/items/25eda376e6b947208996
Databricksのアカウントコンソールが日本語に対応しました

以下の記事で説明しているように、ワークスペースのUIは日本語化されていましたが、ワークスペース管理や使用量の確認が行えるアカウントコンソールは英語のままでした。

https://qiita.com/taka_yayoi/items/ff4127e0d632f5e02603

今回、このアカウントコンソールも日本語(多言語)に対応しました！

1. アカウントコンソールにアクセスします。
1. サイドメニューのギアマーク(Settings)をクリックします。
![Screen Shot 2022-12-12 at 18.49.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/8c5680b2-a3d1-e753-a86f-bd72024e261a.png)
1. **Language settings**をクリックします。
![Screen Shot 2022-12-12 at 18.49.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/ce19083f-d6ff-7fdb-e946-4fa57519ca13.png)
1. **日本語**を選択すると、GUIが日本語に切り替わります。
![Screen Shot 2022-12-12 at 18.50.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/e80f8bbf-9572-d074-6bb0-3a6f2c3b83a4.png)
![Screen Shot 2022-12-12 at 18.50.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/6c876b4c-0cdc-d75e-ed58-5b865da8aced.png)

これまで以上に管理しやすくなるかと思いますので、是非ご活用ください。
![Screen Shot 2022-12-12 at 18.50.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/ecfe0737-d44e-3de5-bcbd-7e33d9179d87.png)
![Screen Shot 2022-12-12 at 18.50.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/cc83bf82-2660-b3c0-331b-9f2ab6a37cc9.png)

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
OSPO Con Japan 2022 Report (全体概要)

### はじめに
[OpenChain Japan Advent Calendar 2022](https://qiita.com/advent-calendar/2022/openchainjapanwg) では2回目になります。パナソニックホールディングス株式会社でOSSコンプライアンス推進を担当している加藤と申します。
本日は、2022年12月5～6日に開催された OSPO Con Japan について紹介したいと思います。

### OSPO Con Japan
OSPO Conは、オープンソース テクノロジに依存する組織のオープンソース プログラム オフィスで働く人々が一堂に会し、直面する課題を克服するためのベストプラクティス、経験、およびツールを学び、共有する場所です。OSPOConは、TODO Group、OpenChain、およびThe Linux Foundationによって提供されます。[OSPO Con より](https://events.linuxfoundation.org/open-source-summit-japan/about/ospocon/)

2022年12月5～6日にかけては Open Source Summit Japan (OSS-J) が開催されていました。OSPO Con は OSS-J と併催のイベントで、OSS-J に申し込むことで参加できます。具体的には会期中の 1 Track (一部屋) が OSPO Con のセッションでした。今回の OSPO Con のセッション一覧は [こちらを参照ください。](https://ossjapan2022.sched.com/overview/type/OSPOCon)

最初のセッションは TODO Group の OSPO Program Manager の Anaさんの発表で、OSPOの概要からはじまり、OSPO 2022 Surveyの結果とそこからの考察でした [AnaさんのセッションのAbstractと発表PDFはこちらから。](https://ossjapan2022.sched.com/event/1D105/challenges-opportunities-for-ospos-in-asia-pacific-ana-jimenez-santamaria-todo-group)

また、OpenChain Japanメンバーによるパネルディスカッションでは、OpenChain Japan Workgroupにて OSPO Sub Groupを立ち上げたことや日本におけるOSPOに関する状況が語られたり、MIRACLE LINUX の Suzukiさんの発表([概要やPDFはこちら](https://ossjapan2022.sched.com/event/1D10T/what-we-learned-from-creating-ospo-at-cybertrust-japan-takanori-suzuki-miracle-linux-powered-by-cybertrust-japan-co-ltd))や、Ericssonn AB の Jimmyさんの発表([概要はこちら](https://ossjapan2022.sched.com/event/1D11y/forming-lasting-relationships-between-ospos-and-legal-departments-jimmy-ahlberg-ericsson-ab))や、Dynatrace の Davidさんの発表([概要やPDFはこちら](https://ossjapan2022.sched.com/event/1D12M/how-to-open-source-a-project-and-possibly-not-fail-while-trying-david-hirsch-dynatrace))など、所属企業でのOSPOの活動についての紹介などがありました。

数年前までは Open Source Summit において OSPO関連のセッションは数えるほどでした。それが Open Source Summit で OSPO Conが併催になり、OSPO関係のセッションが増えてきています。OSPO Con会場 (OSPO Conのセッションルーム)の参加者(聴講者)も多く、OSPOの活動が注目されていると感じることができました。

OpenChain Japan Workgroup の OSPO Sub Group の [Slakチャネルはこちら](https://openchain-japanwg.slack.com/archives/C03JV4Z5HJ4)です。興味のある方はぜひ覗いてみてください。
【CentOS】MACアドレス/デバイス名変更【RHEL】

VMコピーなどでMACアドレスを変更したい場合とか、ethXXのデバイス名がおかしくなった場合の対応。

```bash
dmesg | grep eth
udev: renamed network interface eth0 to eth7
udev: renamed network interface eth1 to eth8
```
名前が変わってしまっている...
```
[root@host01 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth7: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
    link/ether 52:54:00:c6:XX:XX brd ff:ff:ff:ff:ff:ff
3: eth8: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
    link/ether 52:54:00:c6:XX:XX brd ff:ff:ff:ff:ff:ff
```
こりゃ気持ち悪い。

まずIPアドレス設定と同じファイルに新しいMACアドレスを指定します。
```bash:/etc/sysconfig/network-scripts/ifcfg-ethX
HWADDR=52:54:00:c6:XX:XX    #ここに変更後のMACアドレスを記載
```
その後`/etc/udev/rules.d`フォルダ配下にある`70-presistent-net.rules`ファイルの各NICのデバイス名とMACアドレスの記載を書き換えましょう。
```bash:/etc/udev/rules.d/70-persistent-net.rules
[root@host01 ~]# vi /etc/udev/rules.d/70-persistent-net.rules
"70-persistent-net.rules" 56L, 3153C# This file was automatically generated by the /lib/udev/write_net_rules
 # program, run by the persistent-net-generator.rules rules file.
 #
 # You can modify it, as long as you keep each rule on a single
 # line, and change only the value of the NAME= key.

 # PCI device 0x1af4:0x1000 (virtio-pci)
 SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="52:54:00:c6:XX:X1", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

 # PCI device 0x1af4:0x1000 (virtio-pci)
 SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="52:54:00:c6:XX:X2", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"

 # PCI device 0x1af4:0x1000 (virtio-pci)
 SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="52:54:00:c6:XX:X3", ATTR{type}=="1", KERNEL=="eth*", NAME="eth2"

 # PCI device 0x1af4:0x1000 (virtio-pci)
 SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="52:54:00:c6:XX:X4", ATTR{type}=="1", KERNEL=="eth*", NAME="eth3"
```
`ATTR{address}==`と`NAME=`を変更。ethX以外の名前にしたい場合もここ。
で、ネットワーク再起動
```
systemctl restart network
```

以上。
VSCodeでgit pushができないとき

## 問題
VSCodeでgitを使っているときに`non-fast-forward`時の対処法を試してもエラーが消えない

## エラー

```:error
$git push origin main
>>>
 ! [rejected]        main -> main (non-fast-forward)
error: failed to push some refs to 'github.com:**/**.git'
```
`non-fast-forward`はリモートとローカルの最新情報が異なっているときに生じるエラー

```
リモートの情報をローカルに持ってくる(自動的にマージも行われる)ので
状態が一致してpushできるようになる(はず...!)
$ git pull origin master 
>>>
fatal: Need to specify how to reconcile divergent branches.
```
## 解決策
エラー文にある通り **`pull`によってとってきた情報とローカルとの差分がある時にその差分をどう扱えばいいのかを指定してあげる**必要がある．
詳しくは[ドキュメント](https://git-scm.com/docs/git-config#:~:text=ff%20when%20pulling.-,pull.rebase,branch.%3Cname%3E.rebase%22%20for%20setting%20this%20on%20a%20per%2Dbranch%20basis.,-When%20merges%20(or )を参考にしてください．

[参考](https://blog.agile.esm.co.jp/entry/git-warns-pulling-without-specifying-how-to-reconcile-divergent-branches)に倣って暗黙的な変更を把握できないのは怖いのでここでは`false`と設定する
```
$ git config pull.rebase false
```
## 最後に
pullの時の挙動を指定することができたので`push`を行うことができるようになった
[参考](https://blog.agile.esm.co.jp/entry/git-warns-pulling-without-specifying-how-to-reconcile-divergent-branches)
【JavaScript】JavaScript、はじめました。③テンプレートリテラル

※この記事は、プログラミング学習サイト「Progate」の学習内容に関するものです。

お疲れ様です！🍵
さすがに寒いですね。寒さに体が悲鳴をあげて、
<b><font color=#ffbbdd>口の中にできた口内炎(3ヶ)を10日ほど飼い慣らしている状態</font></b>です。

…はい、エアコンでも何でも使って、あったかくして寝ます😅

さて、今日は第3回！ということで、
<b>【テンプレートリテラル】</b>についてまとめました。
使いこなせると非常に見やすい記述になるので、
使いこなせるようにするためのアウトプットをしっかりしておきます。

<b>【テンプレートリテラル】</b>
　テンプレートリテラルは、コードの記述方式のひとつ
　・<b><font color="red">文字列の中に、式や変数・定数の値を埋め込むことができる</font></b>
　・<b><font color=#ff9900>\n</font> と記述すると、テンプレートリテラルで記述した文章を途中改行できる</b>
　　※ <b><font color=#ff9900>\n</font></b> は <b><font color=#ff9900>option + ¥</font></b> で入力可能
　などの利点がある
```:変数・定数の定義:
let name = "aogiri";
let age = "永遠の20";

// この部分は、テンプレートリテラルの使用・不使用に関わらず必要。
```
```:テンプレートリテラル不使用:
console.log('私は ' + name + ' です。年齢は ' + age + '歳 です。');

// '' または "" で文字列部分を囲み、+ でつなぐことで、
// 変数・定数を連結して1文として出力される
```
```:テンプレートリテラル使用:
console.log(`私は ${name} です。年齢は ${age}歳 です。`);

// `` で文字列部分を囲み、${変数・定数} を書き入れることで、
// 変数・定数を連結して1文として出力される
```
```:console:
私は aogiri です。年齢は 永遠の20歳 です。
```
'' や "" 、 + を何度も記述していると指がつりそうになる(笑)ので、
これは非常に便利！だと感じました。
テンプレートリテラルでの記述を心がけていきたいと思います。

第3回はここまで！
次回・次々回は<b>【配列】と【オブジェクト】</b>について書いていきます！
学習中、ちょっとつまづきかけた部分なので、丁寧に書いていこうと思います。
ご覧いただき、ありがとうございました！
imagemagickでプログラマも画像をいじってみよう

ジークスの酒井です。今日はちょっとしたツールの紹介記事になります。

# imagemagickでプログラマも画像をいじってみよう

プログラマがデザイナーから画像をもらった後、ちょくちょく変更の必要がある場合があります。
ios/androidなど端末ごとに各解像度用を用意したり
透過を削除したり、透過部分の背景色を変更したかったり
そんな場合に編集ソフトを使わなくてもimagemagickでなんとかなる事が多かったので
自分用メモとしてまとめました。

## 基礎知識
imagemagickをインストールすると、コマンドラインで動作する各種コマンドが追加されます。

- convert  
1つのファイルを操作するコマンド
- mogrify  
複数ファイルを操作するコマンド。コマンドラインオプションはほとんどconvertと共通です。
- identify
ファイルの情報を取得するコマンド

## 一括リサイズ
最近で一番多用したのはこの使い方です。

```
mogrify -resize 300x300 *.png
```
こうするだけで、同じフォルダの全部のpngファイルを300x300の四角に収まるようにリサイズします。
例えば1000x100の横長の画像は300x30に、100x1000の縦長の画像は30x300になります。

## 画像の透過された背景を差し替える
これはどういう使い方をするかというと、透過部分がある画像をもらった場合に
透過の背景に一定の灰色を配置して、透過部分を見える化したい時とかに使いました。

```
convert 下.png 上.png  -compose over -composite 保存名.png
```

下.pngの上に、上.pngを重ねて、保存名.pngとして保存します。

## 画像の情報を取得

```
identify sample.png
```

sample.png PNG 1182x1749 1182x1749+0+0 8-bit sRGB 503.91KiB 0.000u 0:00.000
こんな情報が返ってくるので、パースして、幅、高さや色のbit数などを取得できます。




## 画像のフォーマット変更
画像のフォーマット変更も簡単です。コマンドで出来るとバッチなどに組み込みやすいですね。


```
convert src.jpg dest.png
```

src.jpgをdest.pngに変換します。拡張子で判断して結構自動でやってくれます。

## 画像のコメントを削除
画像をテキストエディタで無理くり見てみると、先頭のほうに結構文字列でコメントが入っています。
主に使われた画像ソフトなどの情報が書かれています。
サイズもちょっとだけ大きくなるので、削除しておくといいでしょう。

```
convert src.jpg -strip dest.jpg
```

src.jpgの中のコメントを削除してdest.jpgとして保存します。

サーバに入れるツールとしては、古いとか言われてあまり歓迎されていない感がありますが
手元で使うコマンドラインツールとしてはまだまだ使えると思っています。

ちょっとした画像修正はプログラマでもやってみてはどうでしょうか？