OmniAICreator/Qiita-1.07M huggingface dataset:
2021年の terraform-jp 振り返り

# tl;dr

- この記事は[terraform Advent Calendar 2021](https://qiita.com/advent-calendar/2021/terraform)の1日目です
- 2020年に引き続きコロナな１年でしたがお疲れさまでした
- [terraform-jp](https://join.slack.com/t/terraform-jp/shared_invite/enQtNTM2NTYzNDY0OTkyLTcxOTYxNmZhZmU3ZGIzOWU3M2RiODkyZTRmZTc0MjEwNjQ1NjMyZDAwMTExODc3MzkxNjAwNmU5ZDY1MTg3YTA) は 2/10 のオンラインミートアップ以外の活動ができませんでした
- 来年こそ、コロナがある程度落ち着いたら、[一昨年書いた記事](https://qiita.com/raki/items/96691d45922dd25e1365)のやりたいことをやっていきたいと思います

# 活動報告

- 2021年のオフライン活動は[2/10のオンラインミートアップ](https://terraform-jp.connpass.com/event/200581/)開催のみでした
- 夏頃にも開催の気配だけはあったのですが開催できずでした
- 本当に活動できていませんね。。。
- ちょいちょい質問チャンネルは動いているんですけれどもｗ

# terraform では

- v0.14.0 は2020年12月にリリースされました（去年の記事書いた後）
- v0.15.0 は2021年4月にリリースされました
- v1.0.0（=v0.15.5） は2021年6月にリリースされました
- v1.1.0 は2021年12月1日現在 beta2 です

# その他の HashiCorp 製品では

- [HCP に packer](https://cloud.hashicorp.com/products/packer) がベータ版で登場しました
- [HashiCorp Vault ユーザ会日本](https://hashicorp-japan.github.io/vault-user-group/)が開設されました
- [HashiCorp Cloud Engineer Certifications](https://www.hashicorp.com/certification) に HashiCorp Professional Security Automation Certification が追加されて準備中です。Vault Operations Professional です。かっこいい。

# 来年は

- コロナでオフラインにはまだ忌避感あったり、感染対策が必要だったりするので、オフライン開催をあきらめ、定期的な小規模オンラインMTGを実施したい
    - 月一とか週一とかで雑談的な Zoom ミーティングとかどうだろう、とか
    - slack ハドルがユーザ会とかにも無償で提供されると楽なんだけど
- [terraform associate](https://www.hashicorp.com/certification/terraform-associate) 取得しないといけませんかね

# 最後に

[terraform-jp](https://join.slack.com/t/terraform-jp/shared_invite/enQtNTM2NTYzNDY0OTkyLTcxOTYxNmZhZmU3ZGIzOWU3M2RiODkyZTRmZTc0MjEwNjQ1NjMyZDAwMTExODc3MzkxNjAwNmU5ZDY1MTg3YTA) を参加している人たちみんなでもっと盛り上げていけるようにしたいと思います。
って去年と同じこと言ってるジャン。。。_no
阿里云 短信服务 (Alibaba Cloud SMS) を使おうとして詰んだ話。

この記事は <A HREF="https://qiita.com/advent-calendar/2021/alibabacloud" target="_blank">Alibaba Cloud Advent Calendar 2021</A> の1日目です。
アリババクラウド(Aliyun)関する話題であれば何でもオッケー。皆様の参加をお待ちしております。


# あらすじ

アリババクラウドには中国サイトと国際サイトの２種類が有ります。
AWSやAzureで中国だけは契約から分離されているのと同じですね。
自分は中国サイトを中国の携帯電話・銀行口座・住所で使っています。

アリババクラウドにもSMS送信サービスが登場しました。
中国ではSMS通知を多要素認証の他にも通知等で日常的に使います。
ECS（仮想サーバ）からSMS送信出来たら便利ですよね。
じゃあ試してみようとしたら詰んだ話。

# 利用開始に向けて

## アクティベーション

アリババクラウドのお作法ですね。
新しいサービスはサービス毎に規約が定められており、都度同意させられます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96018/33cae388-fbcc-3089-35bb-22b098d57ada.png)

## まずはチュートリアル

実際に携帯電話機へ試験送信を行い実践します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96018/80b299bf-8db8-4a04-1ae9-b07c922c7fc5.png)

なんとこれにも料金がかかります。
残高が０元だとこのように失敗します。
チャージして再試行したところ、ちゃんと届きました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96018/99c91511-813f-f00c-b6fa-850bb26bdd8f.png)


## 最初に署名を作成

中国ではSMSの送信には文頭に署名を記入することが義務づけられています。
中国から届くSMSは必ず `【阿里云】` のようなヘッダが付いているのはこのためです。
まずはこれを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96018/1d1b81e7-0a7b-f861-9d9e-3d8307867fe2.png)

記入していくと、なにやら営業許可証をアップロードしろとか出ています。
いやいやそんなはずは。
良く読むと第三者と名前空間で競合するような名前でない場合は否を選べと書かれています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96018/2bb3bed1-b7c4-5f5d-f920-644613cfc2a3.png)

否を選ぶと証明書類のアップロード欄が消えました。
ホームページのFQDNを入れて申請。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96018/061db0e4-413b-5e1c-7ba0-f998c866ef7a.png)


申請が完了。結果を待ちます。

## 却下の通知が

約３時間後、携帯電話に却下のSMS通知が届きました。
早速内容を確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96018/472a8033-d56f-92ac-7fe3-91dc84392145.png)

ICP番号なんて自家用ですからもちろんありません。
`個人のパブリックアカウントやミニアプリは駄目` と書かれています。
だめじゃん個人じゃ使えないじゃん！

## 詰んだ

このプロセスが完了しないと先に進めません。
ゲームオーバーです＞＜

# まとめ

- 阿里云 短信服务 は中国の法人でないと使えない
- 国際サイトを使いましょう（多分使える…はず）


------

# 倚天710の話？

アドベントカレンダーにアリババのArmベースの新プロセッサ倚天710を試す。と予告していたのですが、残念ながら本日時点でECSインスタンスとして利用不可能であります。
というわけで急遽お題変更となりました。。
期待していた皆様、申し訳ない。利用可能になったら試します！
Ubuntu 20.04.3 LTS を Intel Mac でつかってみた

Ubuntuは気が向いたときにちょっと楽しんでみて，そしてまたしばらく使わない，なんてのを繰り返している。

今回，小型マイコン遊びが多くなってきて，Macでもいいけど，Ubuntuではどんな感じに開発環境を揃えていくのか興味があって，久しぶりに使い始めてみた。

MacでUbuntuを使うのは多少コツがあったけど，結果，最新の 20.04.3 では，少々のセットアップでかなり快適に使えるようになっていたので，一応書いておくことにした。

# この記事の目的

Ubuntu 20.04.3 のちょっとした紹介
VS Code + PIO をセットアップするところまでを軽く紹介

# 環境

- MacBook Pro 15 2015だったかな？ 普段は Mojave
- Ubuntu 20.04.3 LTS
    - 32GのSDカードにインストールした。手順は色々やってみましたが，以下が安心でうまくできました。
    - https://kanzmemo.cocolog-nifty.com/blog/2020/08/post-87edd7.html
    - インストール，日本語環境等整備し，20Gほどの余りがありました。小規模の開発環境ならいけるか？
    - 末尾に追記しました。

# 使ってみて感じたこと
- 起動すると，Retina Dislplayを活かしたすごくきれいな画面ですぐに使い始められます。
- スケーリングが効いていて，文字が小さすぎるといったことはありません。もちろんスケーリングは変更可能。
- 音も出る。TouchPadもすぐに使える。2本指タップとかもできる。
- ネットワークにつながれば，日本語環境がすぐに入る。こんな感じ。
https://hirooka.pro/ubuntu-20-04-japanese-input-ibus-fcitx-mozc/
- [command]キーをポンと押すことで，ウィンドウ一覧選択 兼 ランチャーが起動する。すごく便利。

細かい挙動はディストリやフレイバーによっても違うと思いますので注意してください。私のは無印です。

# セットアップ作業記録

自分のスマホを接続。USBテザリングでネットワークに接続。

私の基本の一歩 ディレクトリー名，WiFiドライバー

```bash
sudo apt update ; sudo apt install xdg-user-dirs-gtk bcmwl-kernel-source
LANG=C xdg-user-dirs-gtk-update 
```

いったん再起動。WiFiを有効にして，VS Code + PIO を導入

```bash
sudo apt install curl
curl -L https://go.microsoft.com/fwlink/?LinkID=760868 -o vscode.deb
sudo apt install ./vscode.deb 
sudo apt install python3-venv # PIOインストールに必要だった

# 以下 PIO 導入後

curl -fsSL https://raw.githubusercontent.com/platformio/platformio-core/master/scripts/99-platformio-udev.rules | sudo tee /etc/udev/rules.d/99-platformio-udev.rules
sudo udevadm control --reload-rules
sudo udevadm trigger
sudo usermod -a -G dialout $USER
sudo usermod -a -G plugdev $USER
```

# （追記）SDカードへのインストール

上記で紹介した手順は確実ではあるけど、ちょっと手順が多いのが泣ける... [rEFInd](https://www.rodsbooks.com/refind/index.html)とVMwareを使って楽をしてみた。以下、作業した記録。

作業環境

- MacBook Pro 15 Mid 2014 w/ Big Sur 11.6.1
- VMware Fusion Player 12.2.1
- `ubuntu-20.04.3-desktop-amd64.iso`
- `refind-bin-0.13.2.zip`
- 64G SDカードとカードリーダー

作業手順

- 予めSIPを無効にしておく必要があった。（確認甘い）
- ubuntu live iso を VMware で起動。UEFI使用。仮想マシンの内蔵ディスクは無し（レガシーBIOSでもいいのかも？ これも確認甘い）
- VMwareでカードリーダーに入れたSDカードをUSB端子に接続。Ubuntuをインストールする。「ディスクをすべて消去」で，ブートローダーも普通に任せて設定してもらう。
- インストール終了したら，VMwareを終了させる。以下Mac上で作業

```bash
diskutil list # カードリーダー内のEFIの位置を確認
sudo ~/Downloads/refind-bin-0.13.2/refind-install --usedefault /dev/disk2s1
```

こうして完成したものは，以下で起動確認を行った。
- 作業したMacで，カードリーダーでrEFInd経由で起動 OK
- 作業したMacで，SDカードストットでrEFInd経由で起動 OK
- 同世代の別Macで，カードリーダーでrEFInd経由で起動 OK
- 同世代の別Macで，SDカードストットで起動 なぜかだめ


Thanks to:

https://qiita.com/yoshiyasu1111/items/e21a77ed68b52cb5f7c8

更新
- 最初にUSBテザリングを使ったことを追記
- インストールについて追記
2021-11-30 esa.io > 一文字検索ができない


2021年11月30日現在の状況です。

### 動作環境

- Windows 10 Pro (v21H2)
- Firefox v94.0.2

### 文字検索で見つからない

- ★
    - Scrapboxの検索にて使っている
- ＃（全角）
    - タイトルに使っている (タグにならないように)
- ／（全角）
    - タイトルに使う場合がある (カテゴリにならないように)
- ■
- □

### 備考

- `★`で検索できない
- `(★)`では検索できる

単独の「`の`」でも検索ができない。一文字の検索の処理が期待通りではない。
「のに」や「のは」では見つかる。

### 希望

`★`で検索できるようになってほしい。
他のサービスと同じようでないと検索性が落ちるため。
(運営には連絡済）

### 関連

- 公式: [記事の検索方法](https://docs.esa.io/posts/104)

### 検索できる

- ★★

二文字だと検索できるようだけど、esa.ioの検索に合わせて他のサービスでの検索方法に制約ができるのは困るところ。
愛知県の市区町村をRと色々なデータを使って可視化してみた③

## はじめに
以前作成した以下の記事で、愛知県を市区町村ごとに分けた地図を描画してみました

#### 愛知県の地図関連の記事
https://qiita.com/zumi0/items/4b8df477d9b62008064e

https://qiita.com/zumi0/items/bfc9046c7a4a3dcc6ee4

https://qiita.com/zumi0/items/3fb0e1bb01cf58b07da9

今回は、このシリーズの第３弾です。

## 今回使うデータ
今回は以下のデータを使ってみようと思います。

- 市区町村の空き家比率

こちらのデータはどれも201８年度のもので、[政府統計の総合窓口（e-Stat）](https://www.e-stat.go.jp/)からダウンロードしました。

## 描画

```r
# 各種パッケージの読み込み
library(tidyverse)
library(jpndistrict)

# 愛知県の地図を描くためのデータ
aichi <- jpn_pref(23)

data <- read_csv("./area_data_empty.csv") %>% # e-StatからダウンロードしたCSVの読み込み
        mutate(area_code = as.character(area_code), # aichiとdataを結合するために、型変換
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　empty_rate = as.numeric(empty_rate)) # 数値に変換

# 地図データと面積データを結合
aichi_joined <- inner_join(aichi, data, by = c("city_code" = "area_code"))

# 市区町村の空き家比率のデータを描画
g_empty_rate <- ggplot(aichi_joined,aes(fill = empty_rate)) + # 居住地面積比率で色分け
                   geom_sf() +
                   theme_gray(base_family = "Osaka") + # フォントを指定
                   theme(axis.text = element_blank(),axis.ticks = element_blank()) + # 軸をきれいにする
                   labs(title = "市区町村別の空き家比率",fill="空き家比率") # グラフのタイトルなどを指定

```

## 結果
### 空き家比率
空き家比率のデータを使って作成したコロプレスマップは、以下です。

![スクリーンショット 2021-11-30 23.46.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581736/18d2d608-6817-68a7-c960-3d73347abaca.png)

思いの外、県内全域で空き家比率はあまり高くない感じでした。勝手なイメージですが、県の東側の面積が大きい地域の空き家比率は高くなると予想していましたがそんなことはなく、名古屋市の方が高いかなといった印象です。名古屋市周辺は都市部であるため、住む場所が多く、その結果空き家が増えてしまっているのではないでしょうか？

## さいごに
今回は空き家のデータを使って、コロプレスマップを作成してみました。愛知県シリーズはこの辺にしておいて、次回からはもっと面白いデータの可視化をやっていこうと思います。
LinuC2を受けようと思ったのできっかけや勉強方法を書く

# 概要
 - 本記事は[MDC Advent Calendar 2021](https://qiita.com/advent-calendar/2021/mdc)の1日目の記事です。
 - LinuC2の個人的勉強方法やきっかけを書きます
 - MDC Advent Calendar一発目なので、難しいことは抜きに書こうと思いました


## そもそもLinuCって？
 - https://linuc.org/
 - Linuxシステムの構築・運用に関する認定資格
 - インフラエンジニアが持っていて非常に役に立つ資格の一つ（※個人的な感想です）
 - 1~3と試験が分かれている
 - 昔の名前はLPIC

## きっかけ
 - 過去に取得していたLPIC1の資格認定の有意性(あなたはLinuxの知識がありシステム設計に活かせますという認定、5年間が期限)がそろそろ切れるため
 - 有意性が切れることは、過去に資格を持っていたけど現在のシステムではスキル活用できません、を意味します
 - 技術は常に新しくなるので、LinuCを継続して取得することでLinuxに関するスキルを継続して身につけようということです

## どうして受けようと思ったか
 - 昨今LinuC1,2はVersion 10.0と内容を改定し、**クラウド時代に活躍する全てのIT技術者が身につけておきたい内容を網羅すべく生まれ変わった**とあり、興味がでてきた
 - Linuxは基本的なコマンドを利用するレベルであり、いまやAWSでサーバ構築やサービス起動がポチポチできる時代なのでLinuxの細かい知識はいらないのではと感じていましたが、クラウドサービスを使いこなす上で、**クラウドサービスが裏でどの作業を自動で行ってくれているのか理解するため、クラウドサービスのありがたみをより深く享受するため**に、受けようと決意しました


## LinuC2の学習範囲(2021/12時点)
 - LinuC2は201試験、202試験と分かれており、両方の試験に合格する必要があります
 - 詳細は[公式の学習範囲](https://linuc.org/docs/v10/level2text.pdf)を参照
 - **太字**は個人的にとても勉強になったところです。ボリュームマウントなどはインフラエンジニアの基礎知識ですね
  
|試験区分|テーマ  |一言で言うと  |
|---|---|---|
|201試験| 主題2.01：システムの起動とLinuxカーネル |GRUB|
|| 主題2.02：ファイルシステムとストレージ管理  | **マウント、ファイルシステム、ボリューム作成** |
|| 主題2.03：ネットワーク構成|インタフェース設定、ルーティング|
|| 主題2.04：システムの保守と運用管理|make、バックアップ、**リソース確認コマンド**、運用ツール、**Ansible**|
|| 主題2.05：仮想化サーバー|仮想マシン、KVM|
|| 主題2.06：コンテナ|**Docker**|
|202試験| 主題2.07：ネットワーククライアントの管理|DHCPサーバー、**認証方法、LDAP構築**|
|| 主題2.08：ドメインネームサーバー|BINDの構築|
|| 主題2.09：HTTPサーバーとプロキシサーバー|Apache、Nginxの構築、**HTTPS化**|
|| 主題2.10：電子メールサービス|Postfix設定|
|| 主題2.11：ファイル共有サービス|Samba,NFS設定|
|| 主題2.12：システムのセキュリティ|パケットフィルタリング、OpenSSH、VPN|
|| 主題2.13：システムアーキテクチャ|**可用性、リソース予測、xaaS、クラウドの典型アーキテクチャ**|


## 学習方法


### 教材
1. [Linux教科書 LinuCレベル2 Version 10.0対応](https://www.amazon.co.jp/dp/4798167967)
 - いわゆるあずき本です。公式参考書にもなっています
 - LinuCは非常に勉強内容がボリューミーなので、章立てて体系的に学ぶためにも教科書は必須だと思います

![text.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289060/f20c749e-ed2c-f75a-3b9b-95fbbcdf02f5.jpeg)


2. [Ping-t](https://ping-t.com/)
 - 色々な資格の問題集サイト。問題数が多く実際の試験のイメージにも近いので非常に良いです。スマホ版もあるので電車内でもできます
 - 対象：CCNA/CCNP、LinuC、LPIC、HTML5、OSS-DB、オラクルマスター、ITパスポート、ITILファンデーション
 - 無料だとLiunC101,CCNAなどいくつかしか見れないため、プレミアム会員登録しました
 - 1ヶ月2400円と割高なので、３ヶ月か６ヶ月がおすすめです。私は６ヶ月にしました
 - 以下は問題集の問題選択画面です。章ごとにランダムに解くことができます
![pingt.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289060/b36dd600-7cf2-0ebd-6e47-ee2d69a34e00.png)


### 学習方法
1. あずき本を章ごとに読み、重要な単語やコマンドはメモを取る(書いて覚えるタイプなので紙に書き写してました)
2. Ping-tで対応する章の問題を解く
    - 20問解き、間違えたものは正解するまで解く
    - 20問正解したら次の20問を解く、という流れでその章の問題を全問潰します
    - 全問潰したらもう1周問題を解きます
3. 次の章に移り以下繰り返し
4. 全章終わったら、Ping-tの問題集で全範囲から100問ほどランダムに抽出し解きます。この時点で80％正解なら試験を受けます



### 合格したの？
- 201試験は合格、202試験はまだ未受験です…
- 受講のきっかけにあったLPIC1の有意性はとっくに切れているので(?)、自分とPing-tのプレミアム期間との戦いです

### 感想
- 勉強していて、LinuCはアプリ・インフラ問わず受けるべき資格だと改めて感じました
- Ping-tが本当にオススメです。ぜひ周りに広めたい。AWS認定ソリューションアーキテクトアソシエイトの問題も作成中らしいので今後に期待
- Ping-tのプレミアム期間が余ればHTML5にも挑戦したいです
- 記事を読まれた皆さんも是非エントリーをお願いします！
- 私が202試験を受けるように誰かお尻を叩いてください
- 明日の記事は、@omix222 さんの[資格試験と自己成長について](https://qiita.com/omix222/items/8e8af2b1b6e3f18db1ce)です！
Snowflakeのリネージュをデータカタログで可視化してみる

この記事は [インフォマティカ Advent Calendar 2021 Day 13 ](https://qiita.com/advent-calendar/2021/informatica)の記事として書かれています。
# はじめに
インフォマティカのデータカタログである、[ Enterprise Data Catalog(以下、EDC)](https://blogs.informatica.com/jp/2017/02/15/edc-necessary/)の大きな特徴として、リネージュを可視化できるという機能があります。
リネージュ(Lineage)とは系統や系列を表す英単語で、DBやファイルシステム間でのデータの流れを可視化し、データの流通経路の全体像を、視覚的に把握する事ができる大変便利な機能です。詳細は[こちらの過去のブログ](https://blogs.informatica.com/jp/2021/09/24/impact-of-data-lineag-and-next-generation-data-lineage/)もご覧下さい。

今回は、最新のCould NativeなDWHソリューションである、Snowflakeのリネージュを可視化してみます。
インフォマティカのデータカタログ(EDC)では、Snowflakeの固有の機能も含めたメタデータおよびリネージュを取得する事ができます

# メタデータ
Database, Schema, Tables, Views, External tableをはじめとするデータ・オブジェクトに加えて、Stage, Pipe, Procedureなどのデータ・パイプラインやスクリプトも取得することができます。
[ こちらの過去のブログ](https://blogs.informatica.com/jp/2020/02/17/snowflake-on-aws/)でも詳細を記載しています

- メタデータの一覧 (Schema, Tablesの確認、ViewsのSQLとリネージュ)<BR>※クリックして拡大表示できます

|![wjDXZLzRkc.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110338/c67c870a-8e0d-8425-127e-cab3b961536d.gif)
|:-:|

<BR>

- リレーションの表示 (外部キー、Viewなどの関係性)

|![rIkMcxCixB.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110338/2636e042-3252-e271-b1aa-31e75828ae4c.gif)
|:-:|


## Stage / Pipesのリネージュ
前の章で見たメタデータは、各オブジェクトのシステム属性を表示したものとなりますが、この後の章ではSnowflakeが持つデータの流れであるリネージュを視覚化してみたいと思います。

Snowflakeでは、標準機能として下記のようなデータロードを行うオプションがあり、クラウド・ストレージなどの外部データを容易にかつ継続的に取り込む事ができます。

<B>1. ステージ(Stage) : </B>各種クラウド・ストレージ上のファイルへのSnowflakeからの透過的なアクセス
<B>2. パイプライン(Snowpipe / Pipe) : </B>ステージからの一括もしくは継続的なデータロード


- ステージとパイプラインのリネージュ

下記のイメージの例では、ステージとして定義されたS3上に配置されたCSVファイルから、Snowpipeを使ってSnowflakeのテーブルに対してロードするパイプライン処理が定義されています。それらをデータカタログを使って、カラムレベルでのリネージュの表示、およびPipeで実行されているSQLクエリの内容を確認する事ができます。
これによりデータの流れと内部的な変換ロジックを、正確にかつ視覚的に確認することができます。
※クリックして拡大表示できます

|![Rm1zuUta0J.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110338/61cea072-f3c0-0d0a-f642-fa8330da3722.gif)|
|:-:|


## Stored procedureのリネージュ

Snowflake上でのアプリケーション開発として、ストアドプロシージャやUDFs(ユーザー定義関数)などを使って、バッチ処理などの複雑で高度な処理を実装することができます。
インフォマティカのデータカタログでは、それらの複雑なコードやスクリプト群を解析し、メタデータやリネージュとして取り込み、ブラックボックスになりがちなビジネスロジックの全体像やデータの流れ、詳細な変換ロジックを容易に把握する事が出来ます。

具体的には、Javascriptで書かれたストアドプロシージャで処理するデータの流れを解析し、それらを線でつながったリネージュとして可視化でき、さらにドリルダウンすることで、カラム単位でどのようなロジックを使って変換処理をしているかをSQLの構文レベルも含めて解析する事で詳細に把握する事ができます。
また、UDFs(ユーザー定義関数)についても、SQLベースの定義から解析することができます。
下記のイメージでは、リネージュ上でドリルダウンして、詳細なロジックを確認できる事がわかります。

|![5us8V04oUq.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110338/6f307bbf-c353-9f0d-d1c7-e0732c39930b.gif)|
|:-:|

# まとめ
インフォマティカのデータカタログである、Enterprise Data Catalog(EDC)では標準的なメタデータの取得に加えて、リネージュの取得・描画に関する機能を強化しており、さまざまなデータソースから高度で複雑なリネージュを取得する事が出来ます。
別の記事において、他システムからのリネージュ取得についても解説していきます。
Workato：Lookup tableで列を飛ばして定義するのは避けるべき

# はじめに
WorkatoでLookup tableを利用する際、将来的な利用を想定し、以下のように間の列を飛ばして定義したくなる（例えば、1列目, 2列目, 10列目を有効な列とし、3～9列目を無効な列として定義したくなる）場合があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/9ecbe7cb-640d-b19e-7f14-4bc00a6d91a5.png)

しかし、このような列の定義は、思わぬトラブルを引き起こすためお勧めしません。具体的には次の問題が生じる可能性があります。

# 発生する可能性のある問題の例

## １．CSV出力における問題
この状態で「Download as CSV」をクリックしてCSVを出力すると、3～9列目が空列で出力されるのではなく、1,2,10列目のみが出力されます。これが意図した結果であれば問題ありませんが、そうでない場合は注意が必要です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/9516152f-f774-fe43-e334-418e7d58e71e.png)

## ２．Recipe Lifecycle Managementにおける問題
Recipe Lifecycle Managementにて以下のようなManifestを作成し、レシピとLookup tableをエクスポートしてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/4079cad7-58d7-653e-2991-56a3facc9047.png)

上でエクスポートしたレシピをインポートしてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/381b7aef-04c5-d3b5-ceb4-e164a6919b78.png)

インポート後にLookup tableを確認すると、10列目が空になっていることに気づきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/08116c1f-bc4f-020b-bbec-58acac97fd18.png)

元々10列目に存在した値はどこに行ってしまったのか・・・3列目を有効化すると、10列目にセットされていた値が3列目にセットされている（列がずれてセットされてしまっている＝意図しない結果となっている）ことが分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/055f5df4-bc88-6d0a-f1f3-b44df923c60e.png)


Recipe Lifecycle Managementで発生する問題は、開発環境（あるいはステージ環境）から本番環境へのデプロイにおいて支障を来す問題にもなります。このような問題を避けるためにも、Lookup tableにおいて、列を飛ばす定義は避けていただくことをお勧めします。
LINEで画像を集めて、素敵なモザイクアートを作ろう

## はじめに
まもなく年末が近づいてきました。
今年の思い出にモザイクアートなどを作ったら盛り上がるんじゃないかといった提案です。
クリスマスパーティーとか年賀状とか、いろんなところで友達や家族、クラスで集めた画像を一つにまとめて、みんなでいい思い出を作れると楽しいですよね。

## 以前挑戦して大成功した

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488939/43da44ab-678b-0a60-8323-a1e8a63909d7.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488939/cc928a92-0e1b-20b8-6a4d-3e5ef02de32e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488939/c2963aa9-3092-7e48-ace1-b64f2b9bb141.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488939/04c93535-3f77-672b-5706-e6f7572134bd.png)

こちらは今年の頭に、高校の卒業記念に卒業生みんなで作ったモザイクアートです。
8700枚ぐらいの画像を使って作ったのですが、すごくいいものが出来上がってみんな喜んでくれました。メインになっている画像は、母校の校舎です。

## 今回の特徴

高校の公式イベントとして行ったため、いくつかの制約がありました。

- みんなが簡単にかつ大量に提出できること
- 集めた画像は学校が管理するサーバーなどで管理すること
- モザイクアートにする前に、不適切な画像などは教員側で確認し、削除できること

こちらを守ることを約束に企画は進みました。
この制約を突破するために

- LINE公式アカウントに画像を送信するだけで応募できる
- 画像はS3などにアップロードせず、学校のGoogleDriveにアップロードする
- GoogleDriveの中なら先生も簡単に画像の確認&分別ができる


## 技術構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488939/828db9f5-42a6-6bc8-f28e-3875fd81e971.png)

## GoogleDriveに画像をアップロードする
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">LINEBot▶️googleDrive　画像のアップロードに成功した<a href="https://twitter.com/hashtag/lineapi?src=hash&amp;ref_src=twsrc%5Etfw">#lineapi</a> <a href="https://t.co/PC59b6CmfG">pic.twitter.com/PC59b6CmfG</a></p>&mdash; ようかん / Yosuke Inoue (@inoue2002) <a href="https://twitter.com/inoue2002/status/1351808483335700480?ref_src=twsrc%5Etfw">January 20, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## LINEBotをつくる
AWS Lambdaを使って、LINEbotを構築する手法を[LINEBotをみんなで作ろう](https://qiita.com/inoue2002/items/ab226d9836a891b01bc9)の記事にて解説しています。
サンプルコードもこの記事の[後半記事のこちら](https://qiita.com/inoue2002/items/dbbd862d6149c83f6513#%E4%BB%A5%E4%B8%8B%E3%82%92%E3%82%B3%E3%83%94%E3%83%BC%E3%81%97%E3%81%A6%E3%81%9D%E3%81%AE%E3%81%BE%E3%81%BE%E8%B2%BC%E3%82%8A%E4%BB%98%E3%81%91)に記載しています。

## 画像を受け取って、GoogleDriveにアップロードする
まず[LambdaからgoogleDriveAPIを操作](https://qiita.com/inoue2002/items/f8d0a270d1457e687432)を参考にLambdaからgoogleDriveを操作する手法を確認してください。
- GoogleDriveAPIの有効化
- privatekey.jsonの生成

連携ができたら

[LINEBotに送った画像をGoogleDriveに保存して共有URLを返すまで](https://qiita.com/inoue2002/items/5732568fe640e1e7bb79)の記事の通りに実装を進めると実際にLINEBotに送信された画像をそのままGoogleDriveに送信することが可能になります！

```
//1行でユーザーの送信した画像を取得可能
const imageStream = await client.getMessageContent(event.message.id);
```

## モザイクアートを生成する
今回はこちらの[mosaic-node-generator](https://www.npmjs.com/package/mosaic-node-generator)モジュールを利用させていただきました。
細かい設定も幅広くできますが、とりあえず試すには2行のコードを書いて、コマンドを叩くだけで生成されます！

```index.js
const mosaic = require("mosaic-node-generator");
mosaic.mosaic("元画像.jpg","素材フォルダ名")
```

```
node index.js  //大掛かりなものは軽く1hぐらいかかって生成される
```


## 終わりに
是非みなさんもLINEで複数人から画像を楽に集めて、素敵なモザイクアートを生成してみてください！
それでは、良い年末を！！

説明を端折っている箇所もいくつかあるので、わかりにくいところなどありましたらコメントいただけますと追記いたします！！
リード獲得は蟻地獄(マーケティング編）

#リード獲得の始まり
4月からマーケティングをやっていて、学べば学ぶほど案件の受注が遠のいていく気がする。とてつもなく労力をかけてもリターンが雀の涙程度だとモチベーション保つのも難しいわって話なの:girl_tone2:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518723/8658325e-6c81-6eaa-1ae2-870544b042de.png)
#活動内容
最初のリード獲得に向けたマーケティング活動が地道すぎるって話なんですけんど、これまで取り組んできたこととしては以下のイベントなどなど。
①ウェビナー
https://www.ap-com.co.jp/pressrelease/post-7857
※2021年は4回開催
スーパーエンジニアの皆さんに感謝感激です:girl:

②展示会
https://www.interop.jp/
https://www.janog.gr.jp/meeting/janog48/

③WPのダウンロード施策
https://www.ap-com.co.jp/network-automation/whitepaper/

#半年ほどの成果と感想
これまで活動をしてきて受注出来ませんでした:girl_tone1:
一般企業だとDMしまくるシステムを導入しているだろう。
今は私が1人1人にGmailでメール送るって思ってたりする。コスパ悪杉君だと分かっているけど地道な活動が実を結ぶと思いながらやっているの:girl_tone2:
これが正解なのかも分からず100通ぐらいの方にイベント告知や勉強会、サービス紹介をどばっと送付しているんやけど・・こういう初動で良いのか心配。サイトから情報収集していてやっている手法はあっていると思うんやけど手ごたえがなくて、インサイドセールスのムズサ地味さを痛感しているところ:girl_tone2:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518723/64c3282f-2dd8-fd3b-1707-efac81e1ffae.png)

とはいえ、リードはそれなりに獲得出来てきているので、その次のアポ獲得をしていく壁を乗り越えないといけないなと思っておるんですわ。
この壁を乗り越えたら提案フェーズになって、受注に向けたクロージングをしてくと。
・・・
長い道のりっすね。圧倒的リソース不足と知識不足、一足飛びを期待しちゃってるな。
[Twitter](https://twitter.com/higashim4/status/1453006036441370638)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518723/b39de773-786f-6ca4-7ade-339e8132cc61.png)
（地道な活動だ....)
#まとめ。ただの感想とこれからの意気込み
落ちもなんやけど、マーケティング活動は中長期（半年～1年以上）の戦略だなってつくづく思うわけで、SIの業務が体内メモリに染み付いたおっさんの私からしたら3か月、6か月のスコープで結果を出したいと思ってしまうわけなんです:girl_tone2:
胸の中で西川師匠の言葉「**小さなことからこつこつと**」を持ち合わせならが継続してやっていこうとおもいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518723/ce32d474-984e-50e7-2f62-7967a2318218.png)

有識者の方々、アイデアをアドバイスを頂きたいところですわ。
営業DMでもうれしみです:girl_tone2:
キャリブレーションパターンを Python で作って見よう

# TL;DR
https://github.com/tomoaki0705/calibrationPatternGeneratorPython

![Ubuntu 18.04](https://img.shields.io/badge/Ubuntu-18.04-brightgreen)![Python 3.6.9](https://img.shields.io/badge/python-3.6.9-brightgreen)![python-pptx 0.6.21](https://img.shields.io/badge/pythonpptx-0.6.21-brightgreen)

# はじめに
- 本記事は[OpenCV Advent Calendar 2021](https://qiita.com/advent-calendar/2021/opencv) の6日目の記事です。
    - [5日目の記事](https://qiita.com/dandelion1124/items/ffe223d7474f7be7a8ef)はdandelion1124先生による最新のOpenCVで導入されたプラグイン制度の紹介です。是非お読み下さい。
    - その他の記事は[目次](https://qiita.com/advent-calendar/2021/opencv)をご覧ください。
- キャリブレーションパターンというのは以下の写真のような、既知のサイズの円や正方形が描かれてるものを指します
![IMG_20170622_145547.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12162/fd7cb061-a522-0f81-d358-185d2c59d1cd.jpeg)

- このパターンを画像で撮影することで空間中のカメラの位置姿勢、レンズの画角などの特性を計算から求めることができます。
- パターンの特徴としては簡単なものながら、こいつをきっちり作らないとキャリブレーションがちゃんと収束しないため、丁寧に作る必要があります
- [4年前に公開したQiita記事](https://qiita.com/tomoaki_teshima/items/39bc1b6cca9f1cf8f040)では、パターンの大きさを測定する誤差をなくすために「パワーポイント」を使って、指定した長さ/大きさピッタリに印刷できるスクリプトを自作/公開/紹介しました
- そのときは[Visual Studio + CMakeというヘンテコな組み合わせでパワーポイントを作った](https://github.com/tomoaki0705/calibrationPatternGenerator)のですが、今回はPythonスクリプトの紹介です

# 使い方

```
$ ls
generator.py
$ python3 generator.py
$ ls
calibration_pattern.pptx  generator.py
```

# 工夫した点
- 基本的には4年前に公開したスクリプトと同じで、以下の3種類のパターンを生成できます
    - チェッカーボード
    - 円形パターン(格子)
    - 円形パターン(互い違いに配置)
- 内部的には`python-pptx`というライブラリを使用しており、これでパワーポイントが作れます。
    - 前回みたいな`xml`のdirtyハックは不要です。
    - Pythonは個人的には嫌いで、できれば避けて通りたかったのですが業務で`python-pptx`に触れざるを得ず、結果4年前の宿題を終わらせることに。
- ベクタ形式で作れるので、変なピクセルのアンチエイリアスに悩む必要はありません
- プリンタで出力される際に変なサイズに縮小/拡大される問題も、「等倍で印刷」すれば1mm以下の誤差で印刷ができます。
- 印刷したチェッカーボードの位置やサイズを定規で測る必要もありません

# 工夫しなかった点
- どうやらPythonには引数を受け取ったり、スクリプトを実行バイナリに落とし込む方法とかもあるみたいですが、そんな高等なことは一切しておりません。
- サイズや個数を変える場合はハードコードされている定数やパラメータを直接書き換えて下さい。
    - Pull Request、いつでも受け付けております
- 4年前のツールではヘッダファイルを生成することで、キャリブレーションパターンに関する情報をスムーズにC++のコードに読み込めるようにしましたが、今回はPython版なので、このあたりは割愛しました。
    - Pull Request、まじでいつでも受け付けております

# スクリーンショット
## チェッカーボード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12162/c8c5b2bf-eabd-39e3-ee49-c220c8b0e55b.png)

## 円形パターン(格子)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12162/becd7a2e-74fc-5036-6213-18f8d887166e.png)

## 円形パターン(互い違いに配置)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12162/94ca5ea2-85b1-c69c-e450-17dc5225fee4.png)

#その他
- 本記事は以下のバージョンで確認しました

    - Python 3.6.9 - 
    - python-pptx 0.6.21
    - Ubuntu 18.04 (x86_64)
- ベクタ形式で作るだけならば、OpenCV本体内にsvgファイルを生成するPythonスクリプトが同梱されており、[ドキュメントも公開されている](https://docs.opencv.org/4.5.4/da/d0d/tutorial_camera_calibration_pattern.html)
- 本記事が気に入った方は、記事のLGTMの他、Githubのスター評価をしていただけると幸いです。
- キャリブレーションはパターンをちゃんと平面にする必要があるし、撮影時の手ブレやカメラがずれることに神経を尖らせるのが常です。
    - 本スクリプトを使えば、少なくとも、「長さを定規で丁寧に測定する」手間が1ステップ省けます。
    - Happy Calibration Lifeを！
- 明日はhon_no_mushiさんの担当で、[「アイエエエエ! ニンジャ!? ニンジャナンデ!?」(OpenCV module開発のおともに)](https://qiita.com/hon_no_mushi/items/7e342629892c2d60d0e2)です。全OpenCVユーザ注目！！
Pulumi (TypeScript) で Elastic Load Balancing account ID を取得する


## はじめに

AWS の Elastic Load Balancing (以外、 LB) にはアクセスログを S3 に出力する機能があり、出力先となる S3 の bucket policy の設定に Elastic Load Balancing account ID を利用します。
Elastic Load Balancing account ID はそう変更されることがないため、べた書きしてしまうこともあると思いますが、 Pulumi の AWS Provider から取得する方法があるためその方法を記載します。

ちなみに、 Elastic Load Balancing account ID はリージョンごと異なるため、複数リージョンにリソースを配置する際は注意が必要です。

## Elastic Load Balancing account ID について

各リージョンの Elastic Load Balancing account ID については公式ドキュメントを参照してください

https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/enable-access-logs.html#attach-bucket-policy

ちなみに、 日本国内の東京、大阪リージョンそれぞれの Elastic Load Balancing account ID は以下となります。

| Region         | Region name          | Elastic Load Balancing account ID |
| -------------- | -------------------- | --------------------------------- |
| ap-northeast-1 | Asia Pacific (Tokyo) | 582318560864                      |
| ap-northeast-3 | Asia Pacific (Osaka) | 383597477331                      |

## Elastic Load Balancing account ID を取得する

account ID の取得方法は 2 つあります。

- `Promise<GetServiceAccountResult>` を返却する形式 ( `getServiceAccount` )
- `GetServiceAccountResult` を返却する形式 ( `getServiceAccountOutput` )

`GetServiceAccountResult` は `arn`, `id`, `region` を返却します

```ts:get_service_account_result.ts
interface GetServiceAccountResult {
  arn: string
  id: stting
  region: string
}
```

今回は `GetServiceAccountResult` を返却する形式 ( `getServiceAccountOutput` ) で Elastic Load Balancing account ID を取得します。

以下例だと region を指定していますが AWS provider で default region を指定している場合は region を指定する必要はありません。

```ts:elb_account_id.ts
import * as pulumi from "@pulumi/pulumi"
import * as aws from "@pulumi/aws"

const serviceAccount = aws.elb.getServiceAccountOutput({ region: 'ap-northeast-1' })
export const serviceAccountArn = serviceAccount.arn // => 582318560864
```

^ は TypeScript ですが Python, Go, C# は 以下マニュアルを参照してください

https://www.pulumi.com/registry/packages/aws/api-docs/elb/getserviceaccount/

## 最後に

今回は Elastic Load Balancing account ID を例にしましたが CloudTrail Service Account や Redshift Service Account も同様に account ID を取得することができます。

### CloudTrail

https://www.pulumi.com/registry/packages/aws/api-docs/cloudtrail/getserviceaccount/

### Redshift

https://www.pulumi.com/registry/packages/aws/api-docs/redshift/getserviceaccount/
消防士からエンジニアになってみて

##前職の内容
前職では新卒から7年間消防士として働いていました！
仕事の内容は、火災に出動したり、救急車や救助工作車に乗って人を助けに行くことはもちろん、総務課での事務職も経験しました。

消防士といえばIT業界とは対局にある業種ですが、社会人としての基本である礼儀やマナー、コミュニケーションや気遣いなど、人として大切なことを教えてもらいました。

また、消防士の仕事には人の命が掛かっているため、プロとして中途半端な仕事はしないという精神を学ぶことができたのも貴重な経験だったと思います。

##エンジニアになろうと思ったきっかけ
きっかけとなったのは**「使い勝手の良いキャンプ場検索サービスが欲しい」**と思ったことでした。

私は幼い頃からよくキャンプに行っており、社会人になってからキャンプをする中で、自分の欲しい情報がWebサイトに載っていないことがよくありました。

**「もっとキャンプ場を便利に探せるサービスがあれば良いのにな。。」**

ということをずっと考えていました。

そこで**「欲しいサービスがあるなら自分で作ってみれば良いんだ」**

という流れでプログラミングをはじめることに。

▽実際に開発したポートフォリオはこちらの記事に記載しています▽
https://qiita.com/s7056i3056/items/841197ee506ceac52192

まず最初にProgateでHTML,CSS,JavaScript,Rubyを学習していると、画面をデザインしたり、ロジックを考えるのが楽しく、純粋にプログラミングが面白いと感じました。

特に、エラーで詰まり、調べてもなかなか解決できず何度も仮説・検証を繰り返して試行錯誤した結果、プログラムが動いたときには今まで感じたことのない快感を覚え、この感情は前職の面白さをも超えるものでした。

そして自然と**「職業としてプログラミングをやっていきたい」**という思いが強くなりました。

そこで**「今自分が本当にやりたいことに挑戦しよう」**と考え、エンジニアに転職することを決意しました。

##今後はどんなエンジニアを目指したいか

将来は、様々な問題をプログラミングを駆使して解決でき、仲間からも頼られるエンジニアになって、現場で活躍したいと考えています。

まずはバックエンドエンジニアとしてスキルを磨き、その後フロントエンド、インフラの構築等も経験したあと、上流工程にも関わっていき、設計からマネジメント、プログラミングまで一貫してこなし、会社に利益をもたらすことのできるリーダー的なエンジニアを目指していきたいと考えています！
[ionic] ion-contentがうまく動かない場合の確認点

ion-contentを使っているページで、どうしても表示が意図通りにならず、
色々と苦戦した結果、思わぬミスをしていることになかなか気づきませんでした。
個人的には、不用意にdivを使わず、ng-containerを使う方が良い、と反省しました。

# バージョン等
 * Ionic 6.15.0
 * Angular: 10.0.14

# 私的な結論
 * ion-contentの上位にdiv を使わない。*ngIfなどを使いたい場合は、ng-containerを使うようにする。

# 現象
 * ion-contentを使っていたページで、なぜか不要なスクロールが発生してしまうなど、意図しない状態となりました。
 * Chrome のdevlopment tool で確認したところ、ion-contentのサイズが意図通りになっていない(想定よりも高さが小さい)状態でした。

# 修正前のコード
 * 不具合が起きていたコードは下記のような感じでした。
 * isShowIntroが trueの時だけ、説明を表示します。app-introduction、app-titleは自作のコンポーネントです。
 * 実際、動作はこのコードでも意図通りに動いていましたが、ion-contentの高さがなぜかページサイズよりも小さくなってしまいます。
 

```html:start.page.html(不具合あり)
<div *ngIf="isShowIntro">
  <app-introduction></app-introduction>
</div>
<div *ngIf="!isShowIntro">
  <ion-header>
    <ion-toolbar color="primary">
      <ion-title>{{'APPTITLE'| translate }}</ion-title>
    </ion-toolbar>
  </ion-header>
  <ion-content [fullscreen]="true">
    <app-title></app-title>
  </ion-content>
</div>
```

![スクリーンショット 2021-11-30 22.49.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017303/58dde8b9-8a83-1937-bd14-2ac391ec4324.png)


# 修正後のコード
* divの代わりに ng-containerを使用したところ、正常に動作するようになりました。

```html:start.page.html(不具合なし)
<ng-container *ngIf="isShowIntro">
  <app-introduction"></app-introduction>
</ng-container>
<ng-container *ngIf="!isShowIntro">
  <ion-header>
    <ion-toolbar color="primary">
      <ion-title>{{'APPTITLE'| translate }}</ion-title>
    </ion-toolbar>
  </ion-header>
  <ion-content [fullscreen]="true">
    <app-title></app-title>
  </ion-content>
</ng-container>
```

![スクリーンショット 2021-11-30 22.47.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017303/68c16ed7-610d-0ac0-3634-e270572be65e.png)

# 考察
 * 公式のページもよく読んだのですが、ion-contentよりも上位に 不要なタグを入れてはいけないなどの記載がなかったため、なかなか問題に気づけませんでした。
 * もし似たような現象に悩んでいる方がいましたら、確認してみてください。
サクラエディタでハイフン含む連続文字を一括で選択できるマクロ

COBOLデータ定義に「WK-XXXXX」のような”-”ハイフンを含む変数がよくあります。残念ながら、サクラエディタで「WK-XXXXX」をダブルクリックして「WK-XXXXX」を1つ単語として認識されなくて、変数全体が選択されません。COBOLコーディング時、簡単にコピーやハイライト表示できず非常に不便と感じます。他の対応方法がわからなくて、初めて以下のサクラエディタマクロ（JavaScript）を作成しました。
サクラエディタ「共通設定」「マクロ」導入設定し、また「キー割り当て」「外部マクロ」のショートカットキーを設定したら非常に便利になると思います。ご意見とご参考をいただければと思います。是非試してみてください。

サクラエディタのJavaScriptマクロは、JavaScript関数とサクラエディタ関数でマクロを作成します。以下サイトのサクラエディタ関数はすべてマクロに使用できると思い参考してください。
[コマンド一覧 (機能別)](https://sakura-editor.github.io/help/HLP000193.html)
[マクロ専用関数/変数](https://sakura-editor.github.io/help/HLP000268.html)
[サクラエディタ関数(コマンド)全一覧](https://caymezon.com/sakura-function/)（このサイトに他のマクロ例もある）



```ruby:renzokumoji.js
//\s 正規表現空白文字：半角SPACE Tab 改行
//\S すべての非空白文字
//連続文字を区っきりする符号を変数pattに追加
//var patt = /\S/;
var patt = /[^\f\n\r\t\v\(\)."' 　（）「」]/;
var cx=0, cy=0, cx1=0, cy1=0, cx2=0, cy2=0;
var star=0, end=0
var text=""

Editor.CancelMode(0);
cx = Editor.ExpandParameter( '$y' ); //現在位置行の取得
cy = Editor.ExpandParameter( '$x' ); //現在位置列の取得

// 現在位置から左へ、空白までカーソル移動
//patt.test(text)：JavaScript 正規表現でtext内容に非空白文字をチェック
Left_Sel();
text = GetSelectedString();
while (patt.test(text)) {
  Left();
  Left_Sel();
  text = GetSelectedString();
}
Right();
cx1 = Editor.ExpandParameter( '$y' ); // 左側位置行の取得
cy1 = Editor.ExpandParameter( '$x' ); // 左側位置列の取得

MoveCursor(cx,cy,0)
// 現在位置から右へ、空白までカーソル移動
Right_Sel();
text = GetSelectedString();
while (patt.test(text)) {
  Right();
  Right_Sel();
  text = GetSelectedString();
}

cx2 = Editor.ExpandParameter( '$y' ); //右側位置行の取得
cy2 = Editor.ExpandParameter( '$x' ); //右側位置列の取得

//連続文字列を**選択**
MoveCursor(cx1,cy1,1);

//「検索文字列」**コピー**
Copy();
//「検索文字列」**ハイライト**表示されます（検索マーク）
SearchClearMark();
```
Workato：MySQL 8.0 のデータベースのテーブルに対してSELECTすると、濁点・半濁点が区別されない問題とその対応


MySQLコネクターでMySQL8.0をのデータベースのテーブルに対してSELECTすると、絞込条件で濁点や半濁点を指定していないにもかかわらず、濁点や半濁点を含む検索結果が返されない（濁点や半濁点が区別されない）場合があります。例えば、「ローコート」という条件で絞り込みを行おうとすると、「ローコート」と「ローコード」の両方が結果としてヒットしてしまいます。

# 原因
MySQL 8.0のデフォルトの照合順序(Collation)は `utf8mb4_0900_ai_ci` デフォルトであるため。この照合順序は、濁点と半濁点を区別しないため、濁点・半濁点を含まない検索条件を指定しても、濁点・半濁点を含む結果が返される場合があります。

# 対応方法
MySQLの Select rowsアクションを利用する際、Where conditionにおいて、`=` や `like`の後に `binary`を追加し、その後に検索したい値を指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/d30e8201-845e-df82-d102-fa0cdbde88fc.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/4182269a-2e31-98b3-03c5-ed36b6dc0823.png)


Workatoに限らず発生する可能性のある問題ですが、WorkatoからMySQLデータベースを利用される際は参考としていただければ幸いです。

# 参考
https://blog.kamipo.net/entry/2017/06/22/005958
PATHを通すとは?

#PATHを通すとは
本来、コマンドはフルパスで実行しなくては実行できないが、
PATHを通すことで、PATHの部分を省略してコマンドを実行することができます。


#なぜPATHを通すのか
普段何気なく使っているコマンド(ex.`ls`, `cat`)の実態はプログラムです。
多くは`/bin`や`/sbin`配下に設定されています。
※`bin`とは主にユーザーが使用するコマンドの実行ファイルが格納されているディレクトリです。

ではなぜ`ls`コマンドのみで実行されるのか。
それはPATHが通っているからです。
PATH変数を参照してみましょう。

````
% echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/sbin
```
上記の結果は、左から優先して実行されます。

```
% which ls
/bin/ls
```

`ls`コマンドの実態は、/bin配下にありPATHを辿っていけばたどり着くため、`ls`のみで実行可能というわけです。
ここでもしPATHが通っていなかった場合はwhichコマンドでエラーとなります。

#PATHの通し方


`.zshrc`に

```
$ export PATH=$PATH:通したいPATH
```

を追記します。
ここでは`export`コマンドを使い、PATH変数にPATHを追加しています。
`$PATH`は、今までのPATHを表しています。
githubからwebhookで自動pullが失敗する

# 現状
wordpressのプラグインで自動更新するもの（wordfence)を
git管理下に含めていた。
またwebhookを利用していて本番でもgit管理をしている状態で
gitpullをしている中でadd前の編集されたファイルができるので
コンフリクトを起こし自動プルが失敗している状態。

# add前の編集をなかったことに

```removeadd.sh
$ git checkout .
```

特定のディレクトリ以下の編集を無かったことにするなら以下

```removeadddir.sh
$ git checkout languages/.
```

特定のファイルの編集を無かったことにするなら以下
```removeadddir.sh
$ git checkout example.php
```


このコマンドでdeletedされたファイルやmodifiedされたファイルが元に戻せます。

# Untracked filesが残る
git checkout .ではUntracked filesが残っていると思います。
Untracked filesが残っている場合は
git cleanもしくはgit rmで一つづつ削除する必要があります。
git cleanを実行する場合は注意が必要です。
必ずパスを指定して削除範囲を最小限に絞りつつ
以下のコマンドで事前確認をしましょう。

```cleann.sh

$ git clean -n <PATH>

```

削除されるファイルが確認できたら
以下のコマンドで実行します。
この時、PATH以下のディレクトリに.gitignoreで
指定しているディレクトリ＆ファイルがないようにしましょう。
.gitignoreで管理外にしているディレクトリ、ファイルも
git cleanコマンドは削除してしまいます。

```cleanf.sh

$ git clean -f <PATH>

```
BoootStrap のGridシステムについて


この記事は[Aizu Advent Calender 2021](https://adventar.org/calendars/6636)の１日目の記事です。

##はじめに
最近、Webページを作成しています。レスポンシブなWebサイト作成にBootStrap使ってみました。皆さんにも紹介をしたいと思って今回の記事を書きました。

##BootStraptって？
ナビゲーションバーや、入力フォームなどのクラスが用意されており、クラス名を組み込むだけで、簡単にサイトを作成できる。
また、レスポンシブなサイトを簡単に作れる。

##導入方法
- みんな大好きCDN(下に例があります!!)
- npm,yarnなどのパッケージ
- 他は公式ページ見てね

[BootStrapダウンロードはここから](https://getbootstrap.jp/docs/5.0/getting-started/download/)

##Gridシステムとは
- #####12カラムのシステム
下図のように、ウィンドウは12個の**カラム**で、分割されています。
<img width="100%" alt="col-12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1751704/20da32db-283c-e75f-b985-f90802323c9a.png">
自分の好みに応じて、カラムの大きさを変えれます。(数字はカラムの数を表している)
<img width="100%" alt="col-12-width" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1751704/df08c406-0f60-8f10-da2e-946736c2c0f9.png">


- #####6段階のレスポンシブ
6つのデフォルトのブレークポイントが用意されている。
ブレークポイントに応じて、グリッドのレイアウトを変更できる。
![breakPoint.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1751704/54c3c712-4066-8162-e216-7d396421b464.png)

ブレークポイントを**sm(576px)**にした、コードはこのようになります

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="OJxJdrO" data-user="mattya144" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/mattya144/pen/OJxJdrO">
  Untitled</a> by suzu144 (<a href="https://codepen.io/mattya144">@mattya144</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

#####ブレークポイント576px
<img width="100%" alt="576.png "src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1751704/3a23258c-ad52-5d7c-0484-fbc1743743e3.png">
#####ブレークポイント768px
![768px.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1751704/eab99f9d-9840-9633-ecca-130fcec5eca9.png)

##終わりに
BootStrapのグリッドシステムについて、少しは理解できたでしょうか？？
今回初めての記事なので、分かりづらい部分があると思いますが、ご了承ください🙇‍♀️🙇‍♀️

##参考資料
[BootStrap公式ページ](https://getbootstrap.jp/docs/5.0/layout/grid/)
qtを使用して文字列を画面に表示するだけの試み

以下のような、文字列を画面に表示するだけの試み
![test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344880/3dc2d41a-4737-d567-c9f8-1a7ff76377a0.png)

１年に１回くらいこのような文字列を表示したい時がある。
以下はコードと実行方法

環境：ubuntu20.04

```python:display.py
from PyQt5.QtWidgets import * 
from PyQt5 import QtCore, QtGui 
from PyQt5.QtGui import * 
from PyQt5.QtCore import * 
import sys 
from argparse import ArgumentParser
import subprocess

def get_option(player_name):
    argparser = ArgumentParser()
    argparser.add_argument('--player_name', type=str,
                           default=player_name,
                           help='player name')
    return argparser.parse_args()

class Window(QMainWindow): 

    def __init__(self): 
        super().__init__() 

        # setting title 
        self.setWindowTitle("Player information") 

        # show information
        self.player_name = "testuser"
        args = get_option(self.player_name)
        if len(args.player_name) != 0:
            self.player_name = args.player_name

        # setting geometry
        upper_left = (10,10)
        width_height = (500, 75)
        self.setGeometry(upper_left[0], upper_left[1],
                         width_height[0], width_height[1]) 

        # calling method 
        self.UiComponents() 

        # showing all the widgets 
        self.show() 

    # method for widgets 
    def UiComponents(self): 

        # creating a label to show the time 
        self.label = QLabel(self)
        label_upper_left = (15, 15)
        label_width_height = (450, 50)
        self.label.setGeometry(label_upper_left[0], label_upper_left[1], 
                               label_width_height[0], label_width_height[1]) 
        self.label.setStyleSheet("border : 4px solid black;") 
        self.label.setText(self.gettimertext())
        self.label.setFont(QFont('Arial', 28))
        self.label.setAlignment(Qt.AlignCenter) 

    def gettimertext(self):
        text = "Player: " + self.player_name
        return text

# create pyqt5 app 
App = QApplication(sys.argv) 

# create the instance of our Window 
window = Window() 

# start the app 
sys.exit(App.exec())
```

以下のように実行する

```
python3 display.py --player_name "test_string"
```
その技術記事、価値あります

## はじめに
**「自分の技術力で記事書いても誰にも読まれない」**
**「検索の邪魔になるから書きたくない」**
**「同じ内容の記事あるから意味ない」**
そう思って技術記事を書かない人いますか？私もそうでした。
今回の記事ではこれらの気持ちに対する私の意見を書いていきます。異論は認めます。


ちなみに、記事を書くことのメリットはこの記事の通りだと思います。

https://qiita.com/e99h2121/items/2a092393fc772e743742



## 「自分の技術力で記事書いても誰にも読まれない」
わかる。
みんなの方がすごいし、ググって解決できるだろうし、ショボい記事書いたら笑われそうで怖い。

でも、
それを知ってる人より知らない人の方が圧倒的に多いです。
単純計算、それを知ってる人が100万人いても、知らない人はその1000倍以上います。
その記事は必ず誰かの役に立ちます。


## 検索の邪魔になるから書きたくない
わかる。
困ってる人を助けるための記事で誰かを困らせたくない。

でも、
あなたが責任を感じる必要は無いです。
検索エンジンのせいにしちゃいましょう。

> 私は、間違った知識の訂正をすること自体はまずいとは思いませんが、「間違った記事を書くな」「そもそも中身のない記事を書くな」といった論には賛成できません。特に、その理由が「検索上位に来てしまうから、さらに被害者を増やすから」というものであればなおさらです。まずい知識が検索上位やトレンドに乗ってしまい、間違った知識が再生産されてしまうのは、検索エンジンやトレンドの仕組みの問題であって、執筆者の責任にするべきではないと考えるからです。

https://zenn.dev/kaityo256/articles/save_the_earth#%E6%A4%9C%E7%B4%A2%E3%82%84%E3%83%88%E3%83%AC%E3%83%B3%E3%83%89%E3%81%AE%E5%95%8F%E9%A1%8C

（個人的にこの記事は筆者のアツい想いが語られてて好きです）


## 「同じ内容の記事あるから意味ない」
わかる。
しかも書いた人がすごい人だったら余計に意味ないと思っちゃう。

でも、
再現性があることの証明になります。1つの記事で言ってることよりも100個の記事で言ってることの方が信用できます。
AWSなどのプラットフォームについての記事なら、時期が違うだけでありがたい情報です。1年前とは仕様が変わってるというのはザラにあるので。
表現が少し違うだけで、誰かの理解の役に立つこともあります。


## おわりに

ちょうどアドベントカレンダーの時期なのでガンガン記事書いていきましょう！
（こんな記事書いておきながらたくさん記事書いてるわけじゃないので自戒をこめて）
オークファンのご紹介2021

#はじめに

オークファンで開発部長をしている @aucfan-nodake です。
振り返ると企業として Qiita Advent Calendar への参加も4年目となりました。

今年も興味を持って頂いた方に少しでも楽しんで頂ける情報が集まるといいな
と思いつつ紹介記事にて口火を切らせて頂きます。

どうぞよろしくお願い致します。

# オークファングループ

まず、当社ですが、全体で 150人ちょっとくらい、
Qiita の守備範囲となるであろう 開発部 の所属となると 30～40人くらい、
そんな規模感の会社になります。

グループの主体となるオークファンとその子会社でいくつかのサービスを運営しており、

会社名「オークファン」をグーグル先生にきくと、
サービス（ https://aucfan.com/ ）について先に教えてくれたりします。
↓ こういうの （※弊社決算資料より引用）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377233/d32d858c-ab54-614e-f3ed-b9ecb155ba44.png)

他にもサービスを運用していたりしますが、目指すところはこんな感じ↓（※同上）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377233/05efa57a-ec10-89ae-eaf7-73cba229c795.png)

日々、行われている大量の取り引き情報から、商品の価格、価値の情報を提供するサービスを土台とし
再流通を促進するサービスを展開、世の中への貢献を行う！

・・・そんな会社であれたらな、と思っています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377233/a7b49bfc-3c52-e2e5-8931-db30d6e4b0c7.png)

↑決算発表資料から抜いてくるとこんな感じ


あとは定型化してたりしますが

# 利用技術

複数のサービスがあり、利用している環境や技術も多岐にわたります。
主なものを紹介すると、

## 開発環境
* IntelliJ
* Vagrant、Docker
* Mac、Windows

## 言語
* PHP、kotlin、Java、Python、Ruby、Perl、Go

## DB
* MySQL、PostgreSQL、SQL Server
* Redis、memcached
* ElasticSearch、Solr

## インフラ
* AWS、Azure、DC、IDCF、さくら

## その他
* backlog
* AdobeXD
* GoogleDrive
* Kibela
* PlantUML
* SharePoint
* trello
* Redmine

他にもいろいろあります。。
現在、会社は16期に入っており、積み重なった歴史と対峙しつつ、新しい道を探し歩いているところ。

## もし気になることがあれば
今回のAdventCalendarで気になることがあれば、いつでもご連絡ください。
また、当社に興味を持っていただける方がいらっしゃれば、お気軽にお話だけでも聞きに来てください！
Apple silicon (M1 Max)でMailCatcherをインストールする

M1 MacでMailCatcher( https://mailcatcher.me/ )をインストールしようとした際にちょっとつまづいたので、解決策を備忘録的に。

# 環境

* MacBook Pro (2021)
* M1 Max
* macOS Monterey v12.0.1
* ruby 2.6.8p205 (2021-07-07 revision 67951) [universal.arm64e-darwin21]

# うまくいかなかった時

普通にMailCatcherのサイトにあるように

```
% gem install mailcatcher
```

を叩いたら

```
ERROR:  While executing gem ... (Gem::FilePermissionError)
    You don't have write permissions for the /Library/Ruby/Gems/2.6.0 directory.
```

とパーミッションエラーが出たので、「あちゃ、ヤベヤベ……」と`sudo`つけて再度`gem install mailcatcher`をしたんですが……

```
ERROR:  Error installing mailcatcher:
	ERROR: Failed to build gem native extension.

    current directory: /Library/Ruby/Gems/2.6.0/gems/thin-1.5.1/ext/thin_parser
/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/bin/ruby -I /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0 -r ./siteconf20211130-18489-1g2wtrg.rb extconf.rb
checking for main() in -lc... yes
creating Makefile

current directory: /Library/Ruby/Gems/2.6.0/gems/thin-1.5.1/ext/thin_parser
make "DESTDIR=" clean

current directory: /Library/Ruby/Gems/2.6.0/gems/thin-1.5.1/ext/thin_parser
make "DESTDIR="
compiling parser.c
parser.rl:142:7: error: implicit declaration of function 'thin_http_parser_has_error' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
  if (thin_http_parser_has_error(parser) ) {
      ^
parser.rl:142:7: note: did you mean 'http_parser_has_error'?
./parser.h:44:5: note: 'http_parser_has_error' declared here
int http_parser_has_error(http_parser *parser);
    ^
parser.rl:144:14: error: implicit declaration of function 'thin_http_parser_is_finished' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
  } else if (thin_http_parser_is_finished(parser) ) {
             ^
2 errors generated.
make: *** [parser.o] Error 1

make failed, exit code 2
```

と再度エラー。
ありゃ、以前のIntel Macの時は問題なく出来てたんだけどな……

# thinを個別にインストールしてみるも……

エラーメッセージを見るとthin（Webサーバ）のインストールで躓いているようなので

```
% sudo gem install thin -v '1.5.1'
```
でインストールを試みるも、やはりエラーが出る。え〜ん（ ;  ; ）

# どうもこのinvalid in C99というのが怪しい。

エラーメッセージに`implicit declaration of function 'thin_http_parser_has_error' is invalid in C99`とあるのでこれでググると[こんなページ](https://zenn.dev/orange634nty/articles/d3dd8ec1df63ec)を発見。

ふむふむ、C言語の規格違反エラーによってビルドが止まっているのね。エラーを無視する指定をしてあげれば良いらしい。

```
% sudo gem install thin -v '1.5.1' -- --with-cflags="-Wno-error=implicit-function-declaration"
```
これでどうだ！

```
Successfully installed thin-1.5.1
```
やっほ〜い♪

# 最後にもう一度MailCatcherをインストール
これで依存ファイルが入ったはずなので、

```
% sudo gem install mailcatcher
```
でインストールすると、無事インストール出来ました。
[Elixir] ラベル付きinspectのラベルをマクロで端折る

(この記事は「[fukuoka.ex Elixir／Phoenix 2021 Advent Calendar](https://qiita.com/advent-calendar/2021/fukuokaex)」の2日目です)
昨日の記事は @koga1020 さんでした．

---

fukuoka.ex所属の@hisawayです．自称メタプロ芸人です．
マクロの小ネタになります．

# IO.inspect(ビギナー向け)
iexでサクッと動作確認とかしたいときにどうしますか．
`IO.inspect`を使うとパイプライン`|>`で繋げられるのでとてもスマートに書けます．

```console
iex(1)> func1 = &(&1 + 1)
#Function<44.97283095/1 in :erl_eval.expr/5>
iex(2)> func2 = &(&1 * 2)
#Function<44.97283095/1 in :erl_eval.expr/5>
iex(3)> 1234 |> func1.() |> IO.inspect |> func2.()
1235
2470
```

## inspectの引数
ただパイプラインがずっと続くとどの関数を呼び出した後かわからなくなりますね？

```
iex(3)> 1234 |> func1.() |> IO.inspect |> func2.()
1235 # <-　ぱっと見どこ？
2470
```

そういう時のためか，inspectにはlabelをつけることができます．

```console
iex(4)> 1234 |> func1.() |> IO.inspect(label: "func1") |> func2.()
func1: 1235
2470
```

見やすくなりましたね．
ここまでが本題の前提になります．

# カスタムinspect
見やすくなったおかげで少し作りやすくなりましたが，毎回書くのは正直面倒です．
Phoenixで出てくるログのようなそれっぽいものがしたい...

ということでElixirマクロを使います．
コピペで使えますのでご安心を．

```elixir:MyIO.exs
defmodule MyIO do
  defmacro inspect(variable) do
    name = case variable do
      {{:., _, [{atom, _, _}]}, _, _} -> atom |> Atom.to_string() 
      {atom, _, _} -> atom |> Atom.to_string()
    end

    quote do
      IO.inspect(unquote(variable), label: unquote(name))
    end
  end
end
```

上記ファイルをiexを起動したパスにおいて後は次のようにiexに打ち込みます．
※iexでUNIXコマンド等使えるので打って確認しましょう．

```
iex> Code.compile_file("MyIO.exs")
[
  {MyIO,
   <<70, 79, 82, 49, 0, 0, 7, 72, 66, 69, 65, 77, 65, 116, 85, 56, 0, 0, 0, 178,
     0, 0, 0, 19, 11, 69, 108, 105, 120, 105, 114, 46, 77, 121, 73, 79, 8, 95,
     95, 105, 110, 102, 111, 95, 95, 10, 97, ...>>}
]
iex> require MyIO
MyIO
```

あとは`MyIO.inspect`に変えておしまいです．

```
iex> 1234 |> func1.() |> MyIO.inspect |> func2.() |> MyIO.inspect
func1: 1235
func2: 2470
2470
```

少しだけinspectが便利になりました．

## 解説(中級者向け)
まずは値確認のためにマクロに`inspect`を追加．

```elixir
defmodule MyIO do
  defmacro inspect(variable) do
    # 確認用に追加
    IO.inspect(variable)

    name = case variable do
      {{:., _, [{atom, _, _}]}, _, _} -> atom |> IO.inspect(label: "pt2") |> Atom.to_string() 
      {atom, _, _} -> atom |> Atom.to_string() |> IO.inspect(label: "pt1")
    end

    quote do
      IO.inspect(unquote(variable), label: unquote(name))
    end
  end
end
```

あとは呼び出して値を確認します．
マクロはもらった値のASTを`case`でパターンマッチします．

```console
iex> 1234 |> func1.() |> MyIO.inspect |> func2.() |> MyIO.inspect
{{:., [line: 9], [{:func2, [line: 9], nil}]}, [line: 9],
 [
   {{:., [line: 9],
     [
       {:__aliases__, [counter: -576460752303423486, line: 9], [:MyIO]},
       :inspect
     ]}, [no_parens: true, line: 9],
    [{{:., [line: 9], [{:func1, [line: 9], nil}]}, [line: 9], [1234]}]}
 ]}
{{:., [line: 9], [{:func1, [line: 9], nil}]}, [line: 9], [1234]}
func1: 1235
func2: 2470
2470
```

AST上では，一番後ろのパイプライン`|>`が先頭に来ます．
そのおかげで再帰を使ってマッチさせる必要がありません．

# まとめ
マクロを使ってinspectをちょっと便利にしました．

---

明日2021/12/03(金)は @torifukukaiou さんです！
画像サイズを一括変更する

画像サイズを一括変更する
imgpというツールを使えば便利である

```
sudo apt install imgp
```

画像ファイルのあるディレクトリに移動して、以下のように実行すればよい

```
# 200x200のサイズにリサイズする場合
cd ~
imgp -rx 200x200
```

# 参考
[imgpコマンドで画像を一括リサイズする方法](https://ubuntuapps.net/blog-entry-1080.html)
2次元正規分布の確率密度関数を3次元グラフにプロットする

#  はじめに
LabVIEWの3次元コンタープロット関数を使って、2次元正規分布の確率密度関数を3次元グラフ上に表示するプログラムを作成しました。
xおよびyの平均値を0とした、下記の確率密度関数を使って確率密度を計算しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674241/90fad08f-31bd-f134-8124-e49fb0f9fd0b.png)

#  処理のながれ
1. xおよびyの標準偏差および相関係数を設定可能とし、それらを使って共分散行列を作成します。
1. 共分散行列の逆行列と行列式を計算します。
1. expの指数部を計算します。
1. 3Dコンターへプロットします。

下にあるダイアグラムをながめた方が分かりやすいかもしれません。

#  フロントパネルとダイアグラム
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674241/86049915-9855-11b4-c9ab-430633b0e1dd.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674241/149d2827-34d5-98c9-5908-93b418f562f8.png)

#  おわりに
様々な角度からグラフの形状を眺めることで、2次元正規分布の理解の一助になれば幸いです。
ちなみにですが、LabVIEWの無料版は以下リンクからダウンロードできます。

LabVIEW Community Edition
https://www.ni.com/ja-jp/shop/labview/select-edition/labview-community-edition.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674241/661f4fac-f6e7-86a2-f189-8dbde025f921.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674241/6b221bc0-56da-3d3a-040a-efda5e34db43.png)