OmniAICreator/Qiita-1.07M huggingface dataset:
Kotlinのfunctional interfaceが使えないとき

## はじめに

Kotlinには、functional interfaceという機能があります。

https://kotlinlang.org/docs/fun-interfaces.html

ドキュメントに載っている例をそのまま使って説明すると、functional interfaceとは次のような関数を1つだけ持つインターフェースです。通常のinterfaceと異なる構文上の違いは、interfaceというキーワードの前にfunがついていることです。

```kotlin
fun interface IntPredicate {
   fun accept(i: Int): Boolean
}
```

function interfaceを使うとラムダ式を用いて通常のinterfaceよりも簡易な構文でインスタン化できます。

```kotlin
val isEven = IntPredicate { it % 2 == 0 }
```

利用の仕方は通常のインターフェースと同じです。

```kotlin
fun main() {
   println("Is 7 even? - ${isEven.accept(7)}")
}
```

この記事では、実体験で気づいたfunctional interfaceが使えないケース（機能しないケース）を紹介したいと思います。

この記事ではほとんど触れませんが、functional interfaceの利点や他の機能との使い分けが気になるかもしれません。その場合は、既にリンク済みのドキュメントやEffective Kotlinの[Use function types or functional interfaces to pass operations and actions](https://kt.academy/article/ek-function-types)が参考になると思います。

## 関数に型パラメータが存在するとき

下記のような型パラメーターを持つ関数は、functional interfaceとして表現できません。

```kotlin
// コンパイルエラー
fun interface ElementSupplier {
    fun <T> get(list: List<T>): T
}
```

代替案は、通常のinterface（先頭のfunを取り除いたもの）を使うことです。

```kotlin
// コンパイルOK
interface ElementSupplier {
    fun <T> get(list: List<T>): T
}
```

## 関数にレシーバーが付いているとき

Kotlinには、extension functions（拡張関数）と呼ばれる機能があります。

https://kotlinlang.org/docs/extensions.html#extension-functions


拡張関数はfunctionl interfaceで表現できるでしょうか？

まず定義は問題なくできます。

```kotlin
fun interface IntCalculator {
    fun Int.calculate(a: Int) : Int
}
```

それからインスタンス化もできます。

```kotlin
val sum = IntCalculator { other -> this + other }
```

ここで問題が発生します。`sum`インスタンスの`calculate`関数はどうやって呼び出せばいいのでしょうか？<del>色々と試してみましたが呼び出すことができませんでした。このケースでは、`IntCalculator`と`Int`の2つのレシーバーが存在しており、外部から呼び出すのはKotlinの言語デザイン上無理な気がします。</del>

こうすれば呼び出せることがわかりました。（でも冗長ですね）

```kotlin
with(sum) { 
    println(1.calculate(2))
}
```

代替策は、function literals with receiverを使うことです。

https://kotlinlang.org/docs/lambdas.html#function-literals-with-receiver

function literals with receiverを使えば上記の`sum`の定義は次のように書き換えられます。

```kotlin
val sum: Int.(Int) -> Int = { other -> this + other }
```

呼び出すには次のようにします。

```kotlin
2.sum(1)
```

`Int.(Int) -> Int`のようなシグニチャがいろんなところに登場して煩雑だということであればtypealiasの出番でしょう。

```kotlin
typealias IntCalculator = Int.(Int) -> Int
```

上記のtypealiasを使えば`sum`の定義は次のように書き換えられます。

```kotlin
val sum: IntCalculator = { other -> this + other }
```

## 余談

さらに上記typealiasを使って下記のようなユーティリティ関数を作ってみます。

```kotlin
fun IntCalculator(calculator: IntCalculator): IntCalculator = calculator
```

この関数を使うと型推論との組み合わせで見た目としてはfunctional interfaceと同等のコードにできます。

```kotlin
val sum = IntCalculator { other -> this + other }
```

大きな利点はないですが、DSLを作るときなどコードの並び順序を整える時に役立ちます。

## おわりに

Kotlinのfunctional interfaceがうまく機能しないケースを紹介しました。

関数にレシーバーがついている時の話は、もっと深い議論（例えば[Multiple receivers on extension functions/properties](https://youtrack.jetbrains.com/issue/KT-10468) ）に関係しているのかもしれません。

議論の内容は追っていないのですが、複数のレシーバーをうまく扱えるのであればDSLの表現の幅が広がるので期待したいところです。
RDS復元時に起こるWordPressでのデータベース接続確立エラーの解消方法

#エラー発生の前提条件
![-ページ1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697228/2641ed8d-f2a5-45d8-5acf-f09d4bacdcc7.jpeg)

上記、構成図の通り、環境を構築します。
一旦、パブリックサブネット内EC2インスタンスを停止または、終了し、RDSについては、スナップショットで保存後、削除します。
その後、EC2インスタンスを再開or AMIから起動し、RDSはスナップショットから削除前の設定で復元します。

その状態でアクセスすると、データベース接続確立エラーとなります。
![スクリーンショット 2021-12-19 22.32.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697228/6f257910-be3d-43a5-a82f-1e461823d4a4.png)

#今回のエラーの原因は？
Word Pressの設定ファイル「wp-config.php」内の設定情報がRDS復元に伴って更新されていないことです。

#エラー解消手順
全体的な流れとして、パブリックサブネット内EC2インスタンスにログインし、その中にインストールされているWordPressの設定ファイル「wp-config.php」を編集していきます。
##EC２インスタンスにログイン

MACの方はターミナルを起動してEC2インスタンスにログインします。

```
ssh -i xxxx ec2-user@△△△△△△△△
```
xxxx:キーペア名
△△△△:パブリックIPアドレス

##wp-config.phpの編集
cdコマンドで「wp-config.php」があるディレクトリまで移動します。

```
cd /var/www/html
```

ディレクトリにあるファイル一覧を見てみます。

```
ls -l
```

![スクリーンショット 2021-12-25 17.16.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697228/6054bf83-ee8a-8a7d-4e6e-44bb72ff9123.png)

wp-config.phpを編集します

```
vi wp-config.php
```
白塗りの箇所が合っているかどうか確認します。
![スクリーンショット 2021-12-25 17.19.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697228/5b539a2c-a492-87d5-77c4-27a0c95095b7.png)

今回のエラー解消は、RDSのエンドポイントを更新してあげることですが、念の為、他の設定箇所も確認します。
MYSQLのホスト名には、復元後のRDSエンドポイントが入ります。
RDS→データベース→データベース名選択→「接続とセキュリティ」
![スクリーンショット 2021-12-25 17.27.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697228/fe6eacc4-b35b-95a7-628f-4909281f53f5.png)

Control＋Cで編集を終え、：wqで上書き保存します。

再度、アクセスしてみると、

![スクリーンショット 2021-12-23 23.01.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697228/a12b0cfb-0578-7731-d453-7002eb79da47.png)

無事、エラーが解消されました。
お疲れ様でした
[Laravel]Collectionにあるnullの値を削除したい！

## 前提

- Laravel 8.x

## やりたいこと

- Collectionの操作で、

「Collection内にある要素の内、nullの値を消したい！

## 状況

- 例えば、orderとuserは1対多の関係であり、`users()`というメソッドでorderに紐づくuserを取得できる場合、

```php
$users = Order::find($order_id)->users()->get();
dd($users);
```

- デバック結果↓

```php
Illuminate\Database\Eloquent\Collection {#** ▼
  #items: array:6 [▼
    0 => App\Models\User {#** ▶}
    1 => App\Models\User {#** ▶}
    2 => null                     // 消したい
    3 => App\Models\User {#** ▶}
    4 => null                     // 消したい
    5 => App\Models\User {#** ▶}
  ]
}
```

- こんな感じで要素にnullを含むCollectionとなったとき、値がnullの要素を消したい、という状況

## 対策案

- 今回の「やりたいこと」をかなえる手段で一番に浮かんだのは、`whereNotNull`というCollectionメソッド
    - メソッド名からしていかにも感。

https://readouble.com/laravel/8.x/ja/collections.html#method-wherenotnull(https://readouble.com/laravel/8.x/ja/collections.html#method-wherenotnull)

- ただ、公式を見ると、引数が必要そうな感じ。。。
- 「使えないかな…」と思ってダメもとで引数無しで以下のように使ってみたところ、、、

```php
$users = Order::find($order_id)->users()
    ->get()
    ->whereNotNull(); // 引数無しで使ってみる
dd($users);
```

- デバック結果↓

```php
Illuminate\Database\Eloquent\Collection {#** ▼
  #items: array:4 [▼
    0 => App\Models\User {#** ▶}
    1 => App\Models\User {#** ▶}
    2 => App\Models\User {#** ▶}
    3 => App\Models\User {#** ▶}
  ]
}
```

- イケんじゃん笑
 ということで一件落着。

---

- とはいえ、「どういうことだ？」ということでvender配下の`whereNotNull`メソッドの定義場所を漁ると以下のようになってました

```php
public function whereNotNull($key = null)
{
      return $this->where($key, '!==', null);
}
```

https://github.com/laravel/framework/blob/c2dd983c83c097819db016ef3d23107d43e596fd/src/Illuminate/Collections/Traits/EnumeratesValues.php#L578

- 予想通りではあったけど、引数$keyの初期値がnullとしているので、引数なしでも使えるんですねー

### 余談

同じnull系を扱う`whereNull`も同じく$key=nullなので引数無しで使えますね

```php
public function whereNull($key = null)
{
    return $this->whereStrict($key, null);
}
```

https://github.com/laravel/framework/blob/c2dd983c83c097819db016ef3d23107d43e596fd/src/Illuminate/Collections/Traits/EnumeratesValues.php#L567

# 所見

- こうやってvender配下を見るようになると、意外な使い方できるんだ！って気づきがあってオモロイですね
- これは個人的な思いですが、`where`メソッドって引数にクロージャ使えるようにしたい、って思うときないですかね？
    - 例えば、「とあるコレクション内にあるモデルのリレーション先のプロパティの値と他の値を比較して一致したときに、その値を返す」みたいな処理

### whereの使用例（クロージャ―を引数で使えるなら、、、の前提）

- 先ほどの`$users`が以下を持っているとして
    
    ```php
    Illuminate\Database\Eloquent\Collection {#** ▼
      #items: array:4 [▼
        0 => App\Models\User {#** ▶}
        1 => App\Models\User {#** ▶}
        2 => App\Models\User {#** ▶}
        3 => App\Models\User {#** ▶}
      ]
    }
    ```

- もし、whereでクロージャが使える前提で書くならこんな感じ

```php
for($i=0; $i < 10; $i++){
	$users->where(function($user)use($i){
		return $user->id === $i;
	});
}
dd($users);
```

これでデバッグの結果が`$user→id`と`$i`が一致するモデルを返す、見たいに使えたらいいのにな、と思った次第です。

「いやいや、既存のCollectionメソッドで行けるでしょ！」

などツッコミ大歓迎です。どうぞご鞭撻のほどお願いします。


最後までお読みいただきありがとうございました！
エンジニア暦1年目のクリスマスの過ごし方

# はじめに
エンジニアになってから半年が経過しました。
去年の今頃は寒空の中営業活動をしていたと思うとこの1年でだいぶ環境が変わったなあとしみじみします。
そんな人生を変える1年だった自分のクリスマスの過ごし方をご紹介します。
※稼働している平日を取り上げるため、実際は24日の内容になっています。何卒ご容赦くださいませ。

#7:00　起床
ジングルベルのアラームで目が覚めた。今日はクリスマスイブ。
世間はクリスマス当日に向けて盛り上がっているが
一人前のエンジニアになるために脇目も振らず今日もコードを書く。
シャワーを浴び、身支度を整えてから出発。

#8:00　勉強開始
いち早く一人前のエンジニアになるために毎日の勉強は欠かせない。
最寄り駅にあるマックでコーヒーを購入。
店内のクリスマスソングをBGMに集中モードに入る。

勉強内容はFirebaseについて。
個人開発で進めているアプリに必要なConverterを実装する。
型エラーが止まらない。
今年のサンタさんは自分にワクワク（エラー）を与てくれたんだなあ。

#11:00　業務開始
個人開発が不完全燃焼のまま着席。
一人前のエンジニアとはオンとオフを切り変えられるものだ。
そう鼓舞し会社のパソコンを立ち上げる。
今日はクリスマスイブの金曜日ということもあってオフィスにいる人はまばらだった。

#14:00　ランチ
席近くの同僚とランチ。オフィス近くのラーメン屋で麺を啜る。
お腹いっぱいにならないように普通盛りを選択できるようになった辺り
自制ができるようになった自分を褒めたい。
スマホを見ると社内報でサンタさんが社内に来ていた模様。
まじか。見逃した。

#15:30　プロジェクトの定例MTG
ディレクターからの報告と各エンジニアの進捗報告会。
が、本日はディレクターが急用のためslackでの進捗報告になった。
心の中で「今日も一日頑張りましょう！」と呟く。
そう、サンタならね。

#18:00　小休憩(散歩)
そろそろ集中力が切れてきそう。
そんな時は近くのカフェに散歩がてらコーヒーを買いに行く。
行きつけのお店だ。
なぜか100円で飲める恩恵に預かって毎日通っている。

散歩から帰っきた後はフロントdivでクリスマスパーティ。
ブッシュドノエルの甘さが五臓六腑にしみる。
やっぱりサンタはいたんだと思う。
糖分補給を済ませラストスパートをかける。

#20:30　退勤・勉強
急ぎの用件がなかったため定時で仕事を切り上げる。
そのままオフィスの自席で勉強。
一人前になるには誰よりも努力しなければならない。
仕事が終わった後でも、集中力が続いているのか作業が捗る。

今駆け出しの自分がサンタさんから貰えるプレゼントはごく僅かだろう。
なぜならエンジニアとしてGiveできる存在になれてないからだ。
来年の今頃にはもっと成長してサンタさんになると誓う。

#22:30　晩飯
家に帰ってnoshを食べる。
手元にはコンビニで買ったチキンとケーキもあった。
きっとサンタさんが入れてくれたのだろう。
気付いたら一人では食べきれない量になっていた。
明日の朝ごはんにしよう。

#23:00　休憩
孤独を紛らわせるためにYoutubeを開く
目に止まったのはフェルミ漫画大学の<a href="https://youtu.be/CGeOmpdDoDU">この動画</a>だった。
エンジニア以外の情報にも目を向けることが大事だと隣のおばあちゃんが言っていたので
最近はジャンル問わずいろんなチャンネルを見る。

今日もいい事を学ぶ事が出来た。
今年のサンタさんはりん先生だったと知ったのは地球上で自分1人だけだろう。
やったね！

#24:00　就寝
明日も勉強するため早めに寝る。
そうだ、サンタさんが来てもいいように靴下とクッキーとミルクを用意しないと！
靴下いっぱいのUdemyが欲しいなあ。

#さいごに
自分が入社したのが6月で引用している記事を書いている先輩社員も1年前の6月入社ということで勝手にシンパシーを感じ、先輩リスペクトで記事を書かせていただきました。
当社では絶賛エンジニアを募集しております。興味のある方は是非ご応募ください。それでは！

#参考URL

https://qiita.com/miumi/items/9b1e6a6fffdb20b9b6df
コミュニティを1年間運営した振り返り

メリークリスマス！！！  
まめぞうです。

アドベントカレンダー最終日ということもあり、私が運営している「まめコーヒー」というコミュニティの振り返りを勝手に行います。  
普段、コミュニティを運営している人や、これから何かしらのコミュニティに参加を考えている人に対してはいくつか参考になる内容もあるのではないでしょうか。

それでは早速みていきましょう！

## そもそもなぜ運営しようと思ったのか
当時はコロナで外に出れないという情勢で、自分自身Netflixを観てだらけてしまう生活が続いていました。  
なんとかその状況を脱して勉強をしようと考えたのですが、一人だと絶対に続かないので「いっそのこと主催すれば絶対に参加しないといけないから勉強するんじゃね？」という結論に至ったわけです。  
また日曜日の昼からの枠は当時勉強会がなかったので、昼から夕方にかけて開催しようと思い企画しました。

## どのように運営しているの？
もくもく会は「GoogleMeet」を利用しています。  
当時は無料で100人まで利用できていました。現在は無料期間が終了したため、月額\750 + 年間のドメイン費用で運用しています。  
※現在は所属会社が負担してくれています。ありがとう、弊社！

また、徐々に人が増えてきて運営が大変になってきたので、よく参加してくれている人に運営を手伝ってもらうようになり、現在は管理者6名くらいで運営しています。

## 1年間運営してみて良かったこと
振り返ってみればほんとに良い事づくめで、やってよかったなーと思います！

- 勉強癖がついた
    - まめコーヒーでは毎週日曜日の13:00から18:00までもくもく会を開催しているのですが、さすがに毎週しているといい意味で勉強グセが付きますよね。これまでゼロだったのが一気に5時間になったわけです。
    - この時間帯は強制的に勉強するようになるため、かなりの学習時間の確保となりました。
- 繋がりが増えた
    - 年間で450人くらいの方ともくもく会を通して触れ合うこととなりました。
    - 必然的によく接する人もような親しい方も増え、全国を通じて（海外も）つながりができました。
- 知識が幅広く身についた
    - 様々な業界や職種のエンジニアさんが集いますから、普段知らないような情報を教えてもらったりできます。特にファシリテーターをしていると話に着いていく必要があり、必然的に広い知識が身につくことになります。
    - 中にはおすすめの書籍情報やサイト情報など有益な情報を教えてくれるエンジニアさんばかりなのでいい機会となりました。

他にも良かったことはたくさんありますが、上記3つは特に感じるポイントです。  
もちろんトラブル系のネタもたくさんありますが、割愛とさせてください。笑

## 1年間運営してみて大変だったこと
あまり深くは触れずに箇条書きで振り返ります。

- もくもく会の参加人数が増えた時
    - 当初は数人で開催していましたが、一時期は30人を超える人数でもくもく会を行う時期がありました。
    - 回しが結構大変でした。
- GoogleMeetが有料になる際
    - 赤字やん...となりました。代替のツールも検討しましたが、検討した結果GoogleMeetに落ち着きました。
- LT会やオフラインの企画
    - やはり企画は大変なんだなぁ...としみじみ感じてます。

振り返りましたが、そんなにありませんでした。

## 今後について
コミュニティとしては**「みんなが勉強できる環境」**として残していきたいなぁーと考えています。

気の合う人と作りたいものを協力して楽しく開発などはやっていきたいなぁと思います。  
課題としてはいくつかありますが、負担にならない程度で取り組んでいきます。

## 最後に
人と接することになるので、もちろん自分の対応を振り返ったときなどによくなかったなと反省することもありますが、それも含めてとても良い学習だったなぁと感じています。  

というか始めた当初はまさか一年続くとは思ってもおらず（一ヶ月続けばいいなぁ〜と感じていました。）自分自身が一番驚いています。まさかこうなるとは...  
今となっては協力してくれる方がたくさんいて、ほんとに恵まれているなと思います。

普段参加してくれている方やお手伝いしてくれている方、本当にありがとうございます。


そんな感じでゆるーくやってるコミュニティですが、温かい目で見守っていただけると幸いです。
2021年個人的に面白かったpythonライブラリなど振り返り

## はじめに
2021年も残り１週間、早いものですね。
今年は業務でも様々なプログラムをつくって実際にお客様や社内業務に納品することができました。
この記事では今年記憶に残ったpythonライブラリを振り返り、2022年に向けてのやる気を高めることを目的とします。

## その１：[BigSleep](https://github.com/lucidrains/big-sleep)
ズバリ、テキストから画像が生成できるしろもの。
簡単な紹介記事は[こちら](https://qiita.com/NGOhiroshi/items/74029052ff777ad5082f "BigSleepで憧れだった画家になろう！")になります。
![Early morning country road.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635959/86f00dc8-8462-f97c-a14f-0aa9c1cbde34.png)
*Early morning country road:* 朝日が土の道に差し込む感じ、イイネ！！


人間とAIのコミュニケーションみたいなものを体感しました。AIがつくってくれた絵に自分で少し修正を加えて、しばらくの間インスタ投稿などやっていました。笑


<details><summary>**その他、個人的に気に入っているアートたち**</summary><div>
![Piano in the forest.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635959/a78f1e4c-2fcc-123c-1185-5917bc80ef3d.png)
*Piano in the forest:* ピアノが森に同化していてなんかエモイ
<br>
![Doctor Stomach.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635959/4d2109f0-9658-7606-34ed-85fe426a293b.png)
*Doctor Stomach:* 飲みすぎた次の日に作成。胃の中に謎医者がいます。
<br>
![red eyes black dragon.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635959/b1d1a78d-dbd3-932f-57a1-6aa511bba85a.png)
*Red eyes black dragon:* 遊戯王のやつよりだいぶカワイイです。
<br>
![Flower blooming under the sea.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635959/0d504aa9-d037-c30c-bc44-1bab82fb3309.png)
*Flower blooming under the sea:* 完成度高いな..

</div></details>

来年はひとまず、キャンバスプリントして自分の部屋に飾ってみようかな。

## その2：[OpenJij](https://openjij.github.io/OpenJijTutorial/build/html/ja/index.html)

量子アニーリングを使って組合せ最適化問題を解いたりする事ができます。
[HackDayのイベント](https://qiita.com/NGOhiroshi/items/9c3f7b2c68335a5fc78e)や、東北大学の大関先生開催の[Quantum annealing for you(QA4U)](https://qiita.com/NGOhiroshi/items/68559e02fc2a87b5004f)で活用し、それぞれ記事を書かせていただきました。

特に今年の10月は先述のQA4Uを通して幕張メッセで１時間も発表する機会をいただき、それはそれは楽しい時間を過ごすことができました。

(発表の様子 ↓)

https://youtu.be/UIHf-HeR6mE?t=10908

このイベントを通して様々な方と知り合いになれたのも、大きかったですね。コラボして面白いことやりたいです。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">初対面でしたが、既に戦友のような心持ちでお話しできました。来てよかった。 <a href="https://t.co/5oH9fr2z0F">pic.twitter.com/5oH9fr2z0F</a></p>&mdash; ながひろ (@df_ngo) <a href="https://twitter.com/df_ngo/status/1453562362728828935?ref_src=twsrc%5Etfw">October 28, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


先日友人がオープンした居酒屋にて、食器や材料の配置に四苦八苦しているのを目撃しました。この課題解決が来年のネタかな..と密かに企んでおります。

## その３：[Google Cloud Vision](https://cloud.google.com/vision/docs/pdf?hl=ja)
これ、ライブラリの紹介なのかっていうと？？ですが、面白かったので紹介させて下さい。（すでにリリースされて久しいですが）
Google恐るべしですね..。OCRの威力をとくと味わっております。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635959/bdcf33f1-af8f-9223-26d4-32f76c07c205.png)
(左：PDFファイル　右：OCR結果)

Google Cloud Storageにアップロードしたのち、文字認識結果をjson形式で出力。
テキスト情報はもちろん、テキストの位置情報も取得できるので色々なサービスに利用できそうです。


## 最後に
２年目のアドベントカレンダー、期日ギリギリですがなんとかDone。
Qiitaさんには10周年Tシャツも貰ったし、来年も気付いた事やちょっとした発見など投稿していきたいですね。
Kotlin で地図アプリ作成  : ユーザーの現在地を表示


#スリープ解除

アプリ使用中はスリープしないように


```xml:activity_maps.xml
　android:keepScreenOn="true"
```

```kotlin:MapsActivity.kt

override fun onCreate(...){
  window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
```


#位置情報へのアクセスをリクエスト


```xml:AndroidManifest.xml
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
```

```gradle:build.gradle
dependencies {
    implementation 'com.google.android.gms:play-services-location:18.0.0'
```


#地図にユーザーの現在地を表示

```kotlin:MapsActivity.kt

const val RC_LOCATION_PERMISSIONS = 0x01

val PERMISSIONS = arrayOf(
    Manifest.permission.ACCESS_FINE_LOCATION,
    Manifest.permission.ACCESS_COARSE_LOCATION
)

    override fun onMapReady(googleMap: GoogleMap) {
        if (ActivityCompat.checkSelfPermission(
                this,
                Manifest.permission.ACCESS_FINE_LOCATION
            ) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(
                this,
                Manifest.permission.ACCESS_COARSE_LOCATION
            ) != PackageManager.PERMISSION_GRANTED
        ) {
            // TODO: Consider calling
            //    ActivityCompat#requestPermissions
            // here to request the missing permissions, and then overriding
            //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
            //                                          int[] grantResults)
            // to handle the case where the user grants the permission. See the documentation
            // for ActivityCompat#requestPermissions for more details.
            ActivityCompat.requestPermissions(this, PERMISSIONS, RC_LOCATION_PERMISSIONS);
            return
        }
        mMap.setMyLocationEnabled(true);

```

#現在地に合わせて地図をスクロール


```kotlin:MapsActivity.kt

import android.location.LocationListener 

    override fun onLocationChanged(location: Location) {
        val latLng = LatLng(location.latitude, location.longitude)
        mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng,zoom))
    }
```

その他、MapsActivity.ktのMapsActivityにLocationListenerを実装。


#追記（2021-12-26）

この方法では、onLocationChangedが上手く動かなかったので、以下の記事を参考に修正させていただきました。

https://qiita.com/folivora/items/11fae5f25fa4c166da37



#参考にさせていただいたサイト

https://gfx.hatenablog.com/entry/2016/04/03/174516

https://qiita.com/amay077/items/2b13c915183fa500e430

https://qiita.com/hotdrop_77/items/bb8c97a3c197ee4f44df

https://teratail.com/questions/85713

https://qiita.com/kyabetsuda/items/f8665b1e2af680283b02
ターミナルでコマンドの実行が終わったら音を出して知らせる

## はじめに
実行するコマンドの処理が長くて、終わったら知らせてくれる方法無いかなと思ったので実験してみました。

## sayコマンド
`say`を使うと指定したテキストを読み上げてくれます。
以下を実行するとテストと読み上げてくれます。

```terminal
% say 'テスト'
```

## 時間がかかるコマンド＋sayコマンドで解決出来そう
今回は`pod install`の処理が終わったら知らせてくれるようにします。


```terminal
% pod install ; say '終わり'
```

`pod install`が終わったら`終わり`と読み上げられました。出来た！

## 余談
はじめに`&&`で出来るやろ！と思ったんですが、`pod install`が成功した時しか`say`コマンドが実行されないのでダメそうです。
失敗した時も`say`は実行して欲しいので。。。

```terminal
pod install && say '終わり'
```

## 最後に
他にも良い方法あれば教えてくださーい！
長い処理するときにこのやり方使っていこう！
スピーカー特性の測定方法・・・2-2）矩形波形の作成&再生

前回はサイン波形の作成について記述しましたが
今回は、矩形波形について説明します。

## 矩形波作成
```python
import wave
import pyaudio
import numpy as np

nchannels = 1
freq = 400
framerate = 44100
sampwidth = 2 #16bit
total_secs = 2.0

# 1 cycle
half_frames_per_cycle = int(round(framerate / freq /2 ))
frames_per_cycle = half_frames_per_cycle * 2

w0 = np.full(half_frames_per_cycle * nchannels, 32767, dtype=int)
w1 = np.full(half_frames_per_cycle * nchannels, -32768, dtype=int)
d = np.concatenate([w0.astype(np.int16), w1.astype(np.int16)])

cycle_time = frames_per_cycle / framerate
data = np.tile(d, int(total_secs/cycle_time))

out_wave = wave.Wave_write('square.wav')
out_wave.setnchannels(nchannels)
out_wave.setsampwidth(sampwidth)
out_wave.setframerate(framerate)
out_wave.writeframes(data)

out_wave.close()
```

##再生（読み込み&再生）


```python
#保存した音声ファイルを再生する
wf = wave.open(file_name, "r")
# ストリームを開く
p = pyaudio.PyAudio()
stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
                    channels=wf.getnchannels(),
                    rate=wf.getframerate(),
                    output=True)

    # 音声を再生
chunk = 1024
data = wf.readframes(chunk)
while data != b'':
        stream.write(data)
        data = wf.readframes(chunk)
stream.close()
p.terminate()
```

前回と同様にfreqを変更することで音の高低が変化します。
AWS認定ソリューションアーキテクトのYouTube解説動画を作ってみた

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

AWSソリューションアーキテクトアソシエイト試験の対策についてまとめています。
「これだけ押さえれば試験に受かるだろう」という網羅性を意識して動画を作成しました。
スライド100ページ以上ありますが、試験のポイントをまとめてますので、ご視聴頂ければと思います。

#AWS関連動画
【AWS再生リスト】
https://www.youtube.com/playlist?list=PLxYF49tVE84yN5IYiEv0aOtqrNskNNneS

###1 AWSとは
https://youtu.be/3wNbmfjolGE
###2 アカウント作成とIAMの初期設定
https://youtu.be/cZHu-YzFdZc
###3 認証とユーザ管理 (IAM)
https://youtu.be/kix3jlbPsss
###4 ストレージサービス (S3, Glacier, EBS, EFS)
https://youtu.be/1C3ZPTbVZ70
###5 仮想サーバー (EC2)
https://youtu.be/Y9TIoGZXcGI
###6 仮想ネットワークサービス (VPC, Route53)
https://youtu.be/51-sQbKxa_s
###7 データベースサービス (RDS, Redshift, Aurora, DynamoDB, ElasticCache)
https://youtu.be/xzrihutcx98
###8 運用管理および環境構築 (CloudWatch, CloudTrail, Elastic Beanstalk, OpsWork, CloudFormation)
https://youtu.be/DjaoT1MvhKI
###9 連携サービス (SNS, SES, SQS)
https://youtu.be/FL_lINJgOYg
###10 開発支援 (CodeCommit, CodeBuild, CodeDeploy)
https://youtu.be/7Adpz52ZL1Y


#関連リンク
######テキスト
この1冊で合格! AWS認定ソリューションアーキテクト
https://www.amazon.co.jp/dp/4046042036/
徹底攻略 AWS認定 ソリューションアーキテクト − アソシエイト教科書
https://www.amazon.co.jp/dp/4295010650/
AWS認定資格試験テキスト AWS認定ソリューションアーキテクト
https://www.amazon.co.jp/dp/4815607389/

######問題集
AWS認定資格 無料WEB問題集＆徹底解説
https://aws-exam.net/saa/
AWS Cloud Tech
https://aws-cloud-tech.com/
AWS Koiwa Club
https://aws.koiwaclub.com/
これだけでOK！ AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座（SAA-C02試験対応版）
https://www.udemy.com/course/aws-asso...
PowerShellForGitHubを使ってみる

PowershellにてGitHubを操作(?)するライブラリがあったので使用してみました。

https://github.com/microsoft/PowerShellForGitHub

GitHub CLIでも十分なのですがPowerShellが便利だとういことに最近気づいたので、PowerShellでできることはやっていきたいと思います。

## Install方法
https://github.com/microsoft/PowerShellForGitHub#installation

を確認してください。管理者権限でPowerShellを起動し、

```
PS > Install-Module -Name PowerShellForGitHub
```
を実行するとインストールされます。

## Tokenの取得
まず、APIを使用するためにTokenを取得します。
![2021-12-25_15h28_24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257498/bec28c5c-2bf7-0d20-57cf-efcdf78ab8b5.png)
右上のところからSettingsを選択
![2021-12-25_15h31_23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257498/45cf1724-aae6-cbec-ebeb-c9b6f0f41edb.png)
Developer settingsを選択
![2021-12-25_15h32_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257498/6b97ed64-b231-fc9a-158e-757e1ae607d8.png)
Personal access tokens -> Generate new tokenを選択
![2021-12-25_15h32_43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257498/85207d95-afa8-2db8-07e3-4025b1577074.png)
NoteやExpirationとかは妖刀に応じてご自由に...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257498/096150ac-f491-fde2-820a-9f046a34128b.png)
生成されたら、出てきたtokenを忘れないようにしましょう。一回しか出ません。

## Powersehll scriptでIssueを取得してみる

```
### Parameters ###
$token = "Input_your_token"
$uri = "https://github.com/path/ToRepository"

### If you use GitHub Enterprise ###
#Set-GitHubConfiguration -ApiHostName "github.example.com"

$secureString = ($token | ConvertTo-SecureString -AsPlainText -Force)
$cred = New-Object System.Management.Automation.PSCredential "username is ignored", $secureString
Set-GitHubAuthentication -Credential $cred
$secureString = $null # clear this out now that it's no longer needed
$cred = $null # clear this out now that it's no longer needed

### Get Issue list ###
$issues = Get-GitHubIssue -Uri $uri

### Output ###
foreach ($item in $issues) {
    $title = $item.title
    $url = $item.html_url
    Write-Host "$count, $title, $url"
    $count ++
}

```
簡単に取得できました。
Enterprise版の場合、URLを設定してやると使えるようになります。このときにAPI用のURL(v3とかついているやつ)ではなくURLを入力してやらないとだめなようです。

Pull Requestの操作等もtoken生成時に付与する権限次第でできるようになるので便利だと思います。
細かいことはwikiにかかれているのでそちらを参考にしてください、若干説明が足りないところもありますが...

https://github.com/microsoft/PowerShellForGitHub/wiki
KotlinとArrowで関数型プログラミング

# 概要
以下のウェビナーで紹介されるArrowライブラリのサンプルの一部を紹介します。
https://www.youtube.com/watch?v=IDMmmrRhUvQ&ab_channel=KotlinbyJetBrains

サンプルに使用するArrowのバージョンは　1.0.1
# Arrow fx
##  Scheduler
https://arrow-kt.io/docs/0.10/apidocs/arrow-fx/arrow.fx/-schedule/

 特定の結果の取得するまで・している限り処理を行う際に利用できる。
以下ので例では外部API通信を行い、3回までリトライします。計4回の試行で全て失敗した際は S3GenerateSignedURLError型になり、一回でも成功した際はSignedURL型にマップされます。

```Kotlin
Schedule
    .recurs<Either<S3GenerateSignedURLError, SignedURL>>(3)
    .zipRight(Schedule.doWhile { it.isLeft() })
    .repeat {
        s3Driver
            .generatePreSignedUrl("bucket", "key")
    }
```

##  Circuit breaker
https://arrow-kt.io/docs/apidocs/arrow-fx-coroutines/arrow.fx.coroutines/-circuit-breaker/

マイクロサービスアーキテクチャで特定のサービスの負荷によるカスケード障害を防ぐためのパターンとしてサーキットブレイカーをArrow fxで容易に実現できる。

以下の例では定義したサーキットブレイカーで実行される処理は設定による制御が入る。この場合は２回の失敗の際に、２秒のタイムアウトが伴う（多箇所からのサーキットブレイカー経由の通信は行われない）。

```Kotlin
@OptIn(ExperimentalTime::class)
val circuitBreaker = CircuitBreaker.of(
    maxFailures = 2,
    resetTimeout = Duration.seconds(2),
    exponentialBackoffFactor = 2.0,
    maxResetTimeout = Duration.seconds(60)
)
circuitBreaker.protectOrThrow {
    coreDriver.importantApi()
}
```
＊例ではその場でインスタンス化しているが、実際はシングルトンとして生成する
## 組み合わせ
上記のにパターンで重要なシステムに対して負荷をかけずにリトライを試行することができる

```Kotlin
Schedule
    .recurs<Either<ApiError, Result>>(3)
    .zipRight(Schedule.doWhile { it.isLeft() })
    .repeat {
        circuitBreaker.protectOrThrow {
            coreDriver.importantApi()
        }
    }
```
IBM Cloud PaaS ベストテンの2021年版

これは、[IBM Cloud Advent Calendar 2021](https://qiita.com/advent-calendar/2021/ibmcloud)　25日目の記事です。

# IBM Cloud PaaS ベストテンの2021年版
年末の風物詩とも言うべき人気ベストテン。来年はIaaS部門もやってみたいなと思いながらしたためております。
さて。今年もまたお茶目な（昨年とは別の）同僚から連絡がありました。

同僚：「ベストテンってあります？」
わたし：「まだないです。」
同僚：「来週末には使いたいんです」
わたし：「あと1週間ですね。準備します」
同僚：「木曜日までに送ってくれると助かります」

丁寧な言い回しながらも言葉尻に圧力を感じます。何かのスキルなんでしょうか。リモートなのにおそるべし(笑)

# IBM Cloud で利用できるサービスの変遷
今年は大阪リージョンにPaaSの機能が順次実装された一年でした。さらには、サーバーレスやバッチ、はたまたお手軽にコンテナアプリ開発にも使える注目の新サービス「Code Engine」がリリースされ、分散クラウド業界でもっとも高い注目を集めている「IBM Cloud Satellite」が東京リージョンでサービスを開始しました。
一方、IaaS領域ではありますが、AIX/IBMiがやっと東阪リージョンでご利用いただけるようになり、Linux on zもVPC環境で利用できるOSとしての提供も始まり、LIFTしやすい環境が急速に充実した一年だったと思います。

# さぁ、いよいよIBM Cloud PaaS 人気ベストテン 2021
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53057/29d2eab3-a153-f6b4-1759-230857045a2c.png)

集計単位は、対象のサービスを<b>有償プラン</b>で利用しているユーザー数です。無償枠での利用やライトアカウントでの利用は含まれていません。
今年は「日本のユーザー」に絞って集計してみました。

昨年はベストテンじゃあ傾向が分からないほどの堅調っぷりでしたが、日本のユーザーにフォーカスしてみると別の傾向が見えてきますね。
なんとSDK for Node jsが堂々の1位。
3，4，7位にランクインしているWatson系のサービスと組み合わせて使っているユーザーが多いようです。ベースのサービスとなっている、Cloud Foundaryはアプリ開発のしやすさでも利用者の多いサービスですね。アプリ開発基盤としては、新サービスであるCode Engineが来年どういう動きを見せるか楽しみですね。

Cloud Object Storageが2位（全世界では1位）と高い人気を集めているのは世界共通です。利用頻度に応じて最適なプランに切り替えてくれる「Smart Tier」が利用できるようになってさらに使い勝手が向上しました。東京リージョンに加えて大阪リージョンが選択できるようになったのも便利でいいですよね。

そして今年の注目のひとつ「Kubernetes Cluster」です。ランクを上げて5位。Kubernetesをシンプルに使い倒したいユーザーには「IBM Kubernetes Service（IKS）」と「IBM Cloud Red Hat Openshift Kubernetes Service（ROKS）」の二つから選択して利用することができます。共に東京や大阪リージョンでも本格的に利用できるようになったのと、アプリケーション開発がコンテナで実装される、ということが利用者が増えてきている傾向も見て取れるかと思います。

最後に注目しないといけないのは、VPC系のサービスが3つもランクインした点でしょうか。Xenベースの第一世代（いわゆるSoftLayer）から、KVMベースの第二世代（VPC）となり利用できるインスタンスのサイズやNIC帯域の拡大、デプロイ時間の短縮だけでなく、システムそのものの安定性が向上したというのも人気の理由の一つかもしれません。
Virtual Server for VPC では、OSS系のOSだけではなく、Red HatやWindows Serverも選択できます。それに加えて、なんとzLinuxも今年はラインナップに登場しました。エミュレーターじゃないですよ。LinuxONE上のzLinuxです。どういうOSが今後増えてくるのか楽しみですね。

# もうすぐベストテンから見る来年の傾向
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53057/28d81456-63a7-36e4-0617-4fd69cc22cb1.png)
人気ベストテンの圏外だったけど、年間で上昇トレンドだったサービスをご紹介します。

ログ系サービス（IBM Log Analysis with LogDNA）や、モニタリング系サービス（IBM Cloud Monitoring with Sysdig）は地味ながらもクラウド上のサービスには欠かせないものですね。これまでのベストテンでもなかなかランクインしないまま圏外にいます。

Databases for PostgresSQLは、注目のサービスのひとつです。IBM Cloud Databasesでは、PostgresSQLだけではなく、Redis、Mongo、Etcd、Elasticsearch、EnterpriseDBなどに加えMySQLも選択できるManaged Databasesのひとつです。AWSでも人気のRDSに相当するIBM Cloudのサービスですね。

Power Systems Virtual Serverは、その名の通りPower（IBMi、AIX）を利用できるサービスです。SoftLayer時代からあったOpenPowerではなく、Powerそのものを利用できます。2021年は日本語にも対応し、また、VPNaaSがPower Virtual Serverにも対応したことで専用線での接続が非常にお手軽に（そしてお安く）なったのは嬉しいお知らせです。

Cloud Internet Servicesは、一時期ベストテンにもランクインしていた人気のサービスです。Global LB、WAF、DDoS、CDNなどなどWebアプリケーションには必要な基本的なサービスがオールインワンで、かつ、非常にお得にご利用いただけます。年末ゼロデイで話題になったLog4Jの対策もCISを適用している環境なら、水際で防御しやすいですね。まだ試したことが無い方はぜひお試しください。最初の30日間無料でお試しいただけます。

いかがでしたでしょうか？
ご利用いただいているサービスはランクインしていましたか？ここ数年、ベストテンを発表しています。今年は「日本のユーザー」に絞って人気ベストテンをお送りしました。

来年は、分散クラウドの注目サービスとして今年リリースされた「IBM Cloud Satellite」がランクインしそうな気配があります。また業界向けクラウドも順次出てくるようです。IBM Cloud、来年も目が離せません。
【Node-RED】Node-PADで風呂グラミングのススメ

本記事は [Node-RED Advent Calendar 2021](https://qiita.com/advent-calendar/2021/node-red) の25日目です。

#はじめに
[うめりん](https://inside.dmm.com/entry/2020/08/06/yondemasu07)です。自身の[Node-RED](https://nodered.org/)歴は2週間程度で、アドベントカレンダー記事を書くために触り始めたくらい（MacでDockerインストール〜HelloWorld、http in・request・responseをデバッグした程度）なのですが、定期的に何か作りたい欲が出てくるので、今年の夏頃は『[ナビつき！ つくってわかる はじめてゲームプログラミング](https://www.nintendo.co.jp/switch/awuxa/)』や『[ユカイなパチパチブロックキット](https://store.ux-xu.com/products/block-kit)』を触っていました。
冬になって寒いので、湯船にゆっくり浸かりながらスマホ（iPhone）を触っていることが多くなってきたのと、風呂に入っているとリラックスできるおかげか良いアイデアを思い付けることが多いので、前々からメモは取っていたものの、すぐにその場で作れるともっと良いなと感じていました。
これらの思いが蓄積して「ノードベース・フローベースのプログラミング環境で、風呂グラミング（風呂でプログラミング）しよう！」となった訳です。

#Node-PADとは
有料（本記事執筆時点で、250円:税込）ですが、[Node-REDがiOS(iPhone/iPad)で使えるアプリ](https://discourse.nodered.org/t/node-red-on-ios/34359)です。
現時点での最新アプリバージョンは1.2で、[Node-RED v1.2.1](https://nodered.jp/blog/2020/10/15/version-1-2-released)が搭載されています。
AppStoreの各種説明は英語ですが、アプリ内は日本語化されています。

#試してみた環境
iPhone 12 Pro Max（iOS 14.7.1）

#使用感
起動直後の画面。
iPhone 12 Pro Maxだと「デプロイ」がノッチ部分で見切れてしまうのですが、横向きにして画面回転することで問題がなくなります。
![IMG_7003.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362837/c892c54d-5e1e-5abd-79a0-7f5ff393c51a.png)

[dashboard](https://flows.nodered.org/node/node-red-dashboard)がプリインストールされているので、直感的なUI操作やテストが簡単にできます。
![IMG_7005.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362837/fa988e40-e5cc-f90b-62c6-de351608f1b4.png)

![IMG_7012.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362837/2714484e-ca78-0dcd-7af0-a9defdfdb88a.png)

![IMG_7014.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362837/5c18e79f-4550-e7fc-c78b-dc72625750a6.png)

#おわりに
MacでNode-REDを触った際には、まだパレットの管理からdashboardなどのノードを追加していなかったので、buttonやtextなどを始めて触ったのですが、すごく直感的に使えて、全く知らない状態から30分以内で試すことが出来ました。

サクッと出来るとモチベーションを落とすことなく試すことが出来るので、皆さんもNode-PADでの風呂グラミング生活始めてみませんか？
スピーカー特性の測定方法・・・2-1）サイン波形の作成&再生

[第1回解説](https://qiita.com/fluo0916/items/431a9128b5351c015650) にてWAVファイルの読み込み方法を説明しました。

次にオーディオ評価用の音源の作成を行います。

##Sin波形の作成&保存
では、基本ということでSin波形の作成手順を示していきます。

```python:create_wav.py
import wave
import numpy as np
import pyaudio

nchannels = 1
freq = 100 #作成するサイン波形の周波数
framerate = 44100
sampwidth = 2 #16bit
total_secs = 2.0

file_name = 'sin.wav'

data_num = int(total_secs * framerate)

t = np.linspace(0, total_secs, data_num)
wav = 32767 * (np.sin(np.pi*freq*t))

if nchannels == 2:
    wav = np.array([wav,wav]).transpose()
data = wav.astype(np.int16)

out_wave = wave.Wave_write(file_name)
out_wave.setnchannels(nchannels)
out_wave.setsampwidth(sampwidth)
out_wave.setframerate(framerate)
out_wave.writeframes(data)

out_wave.close()

```

##再生（読み込み&再生）


```python
#保存した音声ファイルを再生する
wf = wave.open(file_name, "r")
# ストリームを開く
p = pyaudio.PyAudio()
stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
                    channels=wf.getnchannels(),
                    rate=wf.getframerate(),
                    output=True)

    # 音声を再生
chunk = 1024
data = wf.readframes(chunk)
while data != b'':
        stream.write(data)
        data = wf.readframes(chunk)
stream.close()
p.terminate()
```

以上で、簡易な波形ジェネレータが作成できました。
パラメータ：freqを下げたり上げたりすると音の高低が調整できます。

今後の解説では、再生した音声を
マイクで録音し周波数特性の解析をするまで行います。
その前に、矩形波の作成方法を説明します。
【Git】空のディレクトリをリポジトリに追加する方法

# 方法
以下のファイルをディレクトリに追加する。

```
.gitkeep
```

```
$ touch test/.gitkeep
$ git status
On branch main
Your branch is up to date with 'origin/main'.

Untracked files:
  (use "git add <file>..." to include in what will be committed)

	test/

nothing added to commit but untracked files present (use "git add" to track)
```

--- 

空のディレクトリを作成しただけだと、差分として認識されない。

```
$ mkdir test
$ git status
On branch main
Your branch is up to date with 'origin/main'.

nothing to commit, working tree clean
```

# 補足
この方法は、公式ドキュメントに書かれていないので、お作法的な感じなのかな。ディレクトリ内にファイルがあることが重要なので、`.hoge`でも良いんだと思います。


# 参考
【改訂新版】Gitポケットリファレンス   岡本 隆史 
https://www.amazon.co.jp/dp/4774185930
AWS EC2 AmazonLinux2の中にMySQLを導入したが、起動してくれない時の対策法(自分用メモ）

ローカル環境では、起動できていたMySQLなのですが、AmazonLinux2の配備した途端動かなくなってしまいました。

```
[ec2-user@ip-10-0-0-165 WorkShare]$  sudo service mysqld start
Redirecting to /bin/systemctl start mysqld.service
Failed to start mysqld.service: Unit not found.
```
というエラーが発生。

ググった結果、[AWS EC2 AmazonLinux2の中にMySQLを入れたがすんなり起動してくれず、いろいろやってターミナルからMySQLにログインできるようにした話(駄々流し)](https://qiita.com/miriwo/items/e7afd5e1ae0de94f27c2)と同じようような症状であることがわかったので、参考にさせていだきます！

```
$ yum list installed | grep mariadb
```
を実行。CentOS7には「MariaDB」がデフォルトで入っているということらしいので、削除しないといけない。

```
mariadb.x86_64                      1:5.5.68-1.amzn2                 @amzn2-core
mariadb-devel.x86_64                1:5.5.68-1.amzn2                 @amzn2-core
mariadb-libs.x86_64                 1:5.5.68-1.amzn2                 installed
```
が入っていました。

```
$ sudo yum remove mariadb-libs
$ sudo yum remove mysql*
```
この後MySQL用のリポジトリを作成する。

```
$ sudo rpm -ivh http://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm

```
その後

```
$ sudo systemctl start mysqld.service
$ sudo service mysqld start
```
無事に起動することができました。

#参考にさせて頂いた記事
[AWS EC2 AmazonLinux2の中にMySQLを入れたがすんなり起動してくれず、いろいろやってターミナルからMySQLにログインできるようにした話(駄々流し)](https://qiita.com/miriwo/items/e7afd5e1ae0de94f27c2)
[Amazon Linux2のMariaDBをMySQLに差し替えでつまずいた点](https://mylops.jp/activity/blog/00105.html)
AI Quest2021のススメ


#はじめに

@kmd252525です。**AI Quest**という教育プログラムに参加しています(**現在進行中**)。大変刺激をもらっているので、今回紹介させていただきます。

## AI Questとは？

**AI Quest**(以下URLを参照)は、参加者同士が学び合い、高め合いながらAI活用を通した企業の課題解決方法を身に付ける教育プログラムです。経済産業省主催で、2019年度から開講されています。

https://aiquest.meti.go.jp/2021/

私は、たしかSNSで情報を得て、興味を持ち申し込みました。
上のURLに詳細はありますが、その中からピックアップして以下に募集要綱、プログラムの流れ等を説明します。


##募集要綱
- 基本
    - 開催期間: 2021年9月～2022年2月初旬
    - 募集人数: 600名程度
    - 募集対象: 学生・社会人
    - 受講料金: **無料**

- 追加
    - 受講資格：応募フォームへの記載(①個人情報 ②AIに関する技術レベル ③志望動機)とアセスメント
    - 情報共有：slack
    - 学習方式：[PBL(Project-based Learning)](https://career-ed-lab.mynavi.jp/career-column/929/)

https://career-ed-lab.mynavi.jp/career-column/929/

- 補足
    - アセスメントは、データセットを用いた特定の課題に対してAIモデル構築・分析し、結果を提出する。Signate上でのコンペ形式で、他の応募者のスコアも閲覧可能。
    - 期間中、週6時間程度(課題取り組み時間も含む)取組度合によっては、$+\alpha$の時間投入が必要。
    - プログラムはオンラインで実施。


## プログラムの流れ
プログラムは、以下の２つで構成されています。
1. 架空の企業課題について、受講生がコンサルタントになり、要件定義・データ分析・企業への提案プレゼンの学習。
2. 企業協業プログラムへの参加。

### 修了条件 
プログラムは前後半の２タームに別れており、1.を２回取り組むか、1.と2.を1回ずつ取り組むかについて、受講生は選択します。
1.については、期日までに各課題を提出したか、最終プレゼン資料については受講生で相互評価することで修了評価します。
2.については、定期的なプロジェクトの進捗を専用サイトで報告します。

### 企業協業プログラム

企業協業プログラムは、参加希望者で複数名のチームを作り、**[AI Quest](https://aiquest.meti.go.jp/2021/)**にエントリーされた企業様とマッチングをはかり、マッチングした企業様の業務課題に対し、AIの導入を検討する学習プログラムです。
定期的な顧客ミーティングとチームでのデータ分析を繰返し、最終成果物を提出します。


## プログラムの流れ
第２タームが現在進行中ではありますが、これまでのプログラムの流れを簡単に紹介します。

### 第１ターム
課題自体は個人課題のため、ある程度経験のある人は個人単位で課題を取り組めます。
初学者の受講生は、slack上でわからないことを共有し、経験者にヒントを出してもらい解決していきます。
また課題とは別に、運営事務局主催で開催する定期的なオンラインサロンで参加者間で雑談したり、有志で集まりBIツール等の勉強会を行う機会もあります。

### 第２ターム

現在プロジェクト途中で、詳細な情報公開ができないので、さっくりとしたスケジュール感を紹介します。
(プロジェクト詳細について知りたい方は、AI Quest2020に参加されたこちらの方の記事が参考になると思います。[経済産業省のAIコンペに参加しました](https://note.com/norikazuu/n/nf1218e96b10c))

https://note.com/norikazuu/n/nf1218e96b10c

- 11月半ばに企業様とマッチング
- 11月末に初回ミーテング(取組むテーマの確認とデータの受渡し、今後の進捗会合の設定)
- その後は１週間ごとに平日(定時後)や休日に定例会合で１時間ほど進捗報告を行う(現在継続中)

※私の参加しているチームのマッチングしたプロジェクトには、複数のチームが参加しています。 


### プログラムの良いと感じること
- プログラムが講師なしのPBL方式で一気通貫しているため、資料作成能力からプログラミングの実装力まで、挫折せずに取り組める。
    - 第１タームでのデータ分析や提案資料作成のTipsが満載で毎日勉強になります。 　
- プログラミング初心者のために、実装課題の途中までコードを書いて公開して下さる気さくな受講生が多数、在籍している。
- 情報共有にslackを用いていますが、受講生の質問と回答がログとして残っているので、他の受講生も後ほど確認できる。
- 昨年度の受講生(AI Quest2020)の報告会や受講生間で有志の勉強会が開催される。
- 架空の企業課題のみの学習にとどまらず、実際の企業様のコンサルティング&データ分析まで経験できる。
    - （これはあくまで私の参加するプロジェクトでのことですが...）企業様との定例会合を許諾を得た上で録画し、内部のみで共有しているため、定例会合に出席できなくても、後から確認できる。
    - 所属企業が異なるメンバーで構成されているため、変に気を遣うことなく、議論ができる。
    - 定例会合で、顧客への他のメンバーのコンサルティング力を目の当たりにして、大変勉強になる。

総じて、会社に所属しながら**インターンシップ(Input & Output)レベルの経験が無料でつめる**ため、大変お得だと思います。


### プログラムで難しいと感じること
- 企業協業プログラム自体は大変やりがいがありますが、本業との兼合い上、注力時間が減り、進捗が生み出せないことがある。
    - 特に、チームで役割を割り振ったのに、本業との兼合い上、進捗会合までに間に合わないと心苦しいです。
- 運営事務局に質問等で問い合わせた際に、返信が遅くなることがある(受講生が多いのでやむを得ないとは思いますが...)。


## 最後に

**AI Quest**は、PBL型のAI教育プログラムです。会社に所属しながらインターンシップレベルの経験が無料でつめるため、大変お得だと実感しています。
これからAIを学んで実務に活かしたい方から、AIについては独学等で理解しているが、実務経験を少しでも他で積みたいという方まで、楽しめるプログラムだと思います。
M5Stackでロボットっぽいものを作った

この記事は**M5Stackアドベントカレンダー2021(https://qiita.com/advent-calendar/2021/m5stack)**の24日目の記事です。

こんばんは。ThousanDIYこと@tomorrow56です。

#作ったもの
今まで、M5Stack用の拡張基板ばかり作っていて、あまり動くものを作っていなかったのですが、ツイッターで**スタックチャン**を見たことで、気がついたらサーボを使ったロボットを作っていました。

![0be66f34-2800-4784-b265-94383ad6fd8e.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120903/378e5336-87bf-e7ca-6518-17d9d7725a4f.jpeg)

#システム構成
M5Stackをhttpサーバーとしコントローラを作成、同じネットワーク内のルータ経由でアクセスできるようにしています。
割り振られたIPアドレスはLine Notifyで通知て簡単にアクセスできるようにしました。
構成は以下のようになっています。
![a4f6e15c-fdcb-43b7-9f6d-eb7402c75201.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120903/6309d57f-b261-14dc-6fab-7cedf616d95e.png)

#ボディの設計
ボディの構成はシンプルに、3Dプリンタで出力しやすい構造で部品を設計しました。 TOYサーボ(SG-90)を使用することでコストを抑える設計としています。特に足の部分はできるだけサポートを使わずコンパクトに、他にも流用できるような形にしています。ケーブル類の外部への露出は最小限になるようにして、できる限りボディの内側で結線が完結するように設計しました。

![Fusion360.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120903/5c790d8b-e528-8557-56e4-b67f98ef19aa.png)

#サーボの電源
サーボは合計9個です。M5Stackのポートでは足りないので、以下の基板を使用しました。
[Servo Driver Shield for M5Stack](https://www.switch-science.com/catalog/5411/)

M5Stack用の電源としてカメラ用のLipoバッテリーを本体部分に内蔵しています。
サーボの電源はこれとは別に単4型乾電池4本で電池ボックスを本体の底面につけていますので交換も簡単です。

![Battery.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120903/57fa8d49-d2b0-65b8-d78c-c77a64b0d43e.jpeg)

#実際の動作の様子
あまりトルクの高くないSG-90ですが結構キビキビ動きます。

https://twitter.com/tomorrow56/status/1425657428507381764?s=20

最終的に前後左右の動きと回転のアクションを作成しました。重心移動と足の制御で苦戦しましたが、何とか動きましたので、以下のリンクをぜひ見てください。(とアピール)
[M5Stack QSpider](https://youtu.be/-8-ZW75RgNI)

#設計データはフリーで公開中
 3DプリントのためのSTLデータとArduinoのスケッチはGithubで公開していますので、自由にアレンジしてください。

[Quadruped Spider Robot for M5Stack](https://github.com/tomorrow56/M5Stack_QSpider)

やっぱり動くものを考えるのは楽しいですね。それでは、メリークリスマス！
箱ひげ図と散布図の重ね合わせをつくる

棒グラフを作成したい際に、エクセルを使って作ることもできますが、
R上で棒グラフに各データ値を重ね合わせて、よりおしゃれな図を作りたいと思いました。


◯環境
MacOS 11.6 Big Sur
RStudio Version 1.3.1093


>```ruby:ggplot
> library(ggplot2, lib.loc = "/Library/Frameworks/R.framework/Versions/3.3/Resources/library")


◯数値の読み込み
>```
> d1 <- read.table(pipe("pbpaste"),header=TRUE)
> d1
    Group Intensity
1  Before        12
2  Before         7
3  Before         9
4  Before        11
5  Before        14
6  Before        11
7  Before        10
8  Before        13
9  Before        11
10 Before         7
11  After         5
12  After         4
13  After         2
14  After         7
15  After         3
16  After         4
17  After         6
18  After         4
19  After         9
20  After         5



◯boxplotで箱ひげ図
>```
> p1<-ggplot(d1,aes(x=Group,y=Intensity))+geom_boxplot()

![Rplot01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2404682/29a0066c-ae25-770b-52c7-ea5ea0df5a62.jpeg)

◯X軸の順序を入れ替える
> ```
> levels(d1$Group)
[1] "After"  "Before"
> d2<-transform(d1, Group=factor(Group,levels=c("Before","After")))
> levels(d2$Group)

![Rplot02.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2404682/725c4c42-a750-85ec-931c-bba577e78293.jpeg)

◯散布図を重ねる
> ```
>p2<-p1+geom_point(aes(col=Group), size=5)

![Rplot03.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2404682/5a1655b9-8dd1-e151-3cda-ebdbdde83d16.jpeg)

> ```
> p3<-p1+geom_jitter(aes(col=Group), size=5,width=0.2)

![Rplot04.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2404682/10987b3f-1d7c-f804-1b7c-e2a7f7e7202e.jpeg)

◯背景とXY軸、項目ラベルの編集
> ```
> p4<-p3+theme_classic()+scale_y_continuous(breaks = c(0,5,10,15),limits = c(0,15))+theme(axis.text.y = element_text(size = rel(2), family = "Helvetica", colour = "black"), axis.title.y=element_text(size = rel(2)))+theme(axis.text.x = element_text(size = rel(2), family = "Helvetica", colour = "black"), axis.title.x = element_blank())+ylab("Intensity")

![Rplot05.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2404682/335bf0d9-4241-eda9-8d51-294c7676c84d.jpeg)


◯カラーパレット読み込みとプロット色の変更
> ```
> library(RColorBrewer, lib.loc = "/Library/Frameworks/R.framework/Versions/3.3/Resources/library")

> my_color <- adjustcolor(c("grey33","blue"),alpha=0.5)
> p6<-p5+scale_color_manual(values = my_color)

![Rplot06.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2404682/38226b23-e24f-ce30-1910-0ec5f1c29d41.jpeg)


◯参考にしたサイト
・ggplot チートシート  https://www.rstudio.com/resources/cheatsheets/
・plotのオプション  https://bookdown.org/rdpeng/RProgDA/basic-plotting-with-ggplot2.html
・軸ラベルの編集  https://mukkujohn.hatenablog.com/entry/2016/10/11/220722
・X軸の順序を入れ替える  https://qiita.com/kazutan/items/7840f743d642122d1219
・カラーパレットの選択  http://www.suikou.fs.a.u-tokyo.ac.jp/blog/2019/12/05/12-5-色の調整、箱ひげ図を用いて/
今年1年の開発チームのコミットをビジュアライズする方法

## はじめに

[ランサーズ AdventCalendar](https://qiita.com/advent-calendar/2021/lancers) 23日目担当の [@sayanet](https://twitter.com/sayanet) です。
※ 投稿遅れてしまってすみません！！

今回は、以前記事にした [ランサーズ創業時から今まで12年分のコミットをビジュアライズしてみた](https://qiita.com/sayakob/items/400d5cef869d6a3084ff) を年末振り返りバージョンとして公開します。

## この記事でできること

年間で誰がどれくらいコミットしたかのビジュアライズが簡単に作成できます。
できあがりのイメージ↓
![commit_2021.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40767/cc4cdfa6-6beb-81e2-635e-15366d1371a9.gif)


## つくりかた

### 1. コミットログの取得
`git shortlog`を利用してユーザーごとのコミット数を取得します。
例えば今月のコミットをユーザーごとにリストアップしたい場合はこんなかんじです。

```
git shortlog -sn --no-merges --since='date +%Y/%m/01' --until='date +%Y/%m/%d'
```
**オプション説明**
`-s`: ユーザー毎にサマライズ
`-n`: コミット数多い順にソート
`--no-merges`: マージコミットは除外
`--since`: 対象期間いつから
`--until`: 対象期間いつまで

**出力結果**
コミット数合計とユーザー名が表示されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40767/c78b2256-9f65-508c-c70e-0838fbaaea65.png)

今回は2021年の振り返りで、月ごとにサマったコミット数がほしいので、月単位で2021年1月〜12月までループをまわします。

```php
$year=2021;
for ($month=1; $month<=12; $month++) {
    echo $month . "月\n";
    $command = sprintf("git shortlog -ns --no-merges --since='%d/%02d/01' --until='%d/%02d/31'", $year, $month, $year, $month);
    system($command);
}
```
結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40767/8a09fa95-af5e-851e-2664-22eed1c4344c.png)

### 2. データを整形する
ここからはスプレッドシートでデータを加工していきます。
（前回のやり方より今回のピボットテーブル使う方が簡単:point_up:）

1で取得したユーザーごとのコミット数をスプレッドシートに貼り付けます。
そして、あとで加工しやすいよう、先頭列に年月を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40767/5e970eea-b515-783e-3c22-7ea779dc9fdb.png)

続いて、A~C列を選択した状態で「挿入 > ピボットテーブル」をクリックし、ピボットテーブルを作成します。
行に「名前」、列に「年月」、値に「コミット数」を指定すると、ユーザーの月ごとのコミット数が整形されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40767/4cb4ad0a-4936-de82-8ebf-4cb540e18eff.png)

ただ、これだと月ごとの合計になってしまいますね。今回は延べ数が欲しいので、もうひと手間。
ピボットテーブルの結果をコピペしたものから青枠のように前月までの値と当月の値を合算（単純に関数で足し算）した表を作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40767/d6d01336-c914-8553-28d5-72097818ef48.png)
最後に、空のセルがあるとビジュアライズのときに見づらいので0にしておきます。
ここまでできればデータ整形は完了です。

### 3. ビジュアライズする

ビジュアライズには引き続きFlourishのBar chart raceを使いました。
https://app.flourish.studio/@flourish/bar-chart-race/9

Dataにスプレッドシートの内容をそのまま貼って画面右側にある設定項目をいじればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40767/687fde15-1bb8-d569-1c57-cb66c7d661b9.png)

Previewモードで動きを確認しながら表示まわりの設定もできます。
デキアガリ＼(^o^)／

![commit_2021.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40767/32a749de-0132-8721-d75f-5b3d5efc5dae.gif)


## さいごに

年末にウェーイするために遊びで作って社内メンバーに公開していますが、今年はメインのリポジトリだけでも前年より2000以上コミット数が多く、メンバーも増えかなり活発な一年だったと思います。

もちろん、コミット多いから良いとは一概にはいえませんが、純粋にこれだけコミットしたのすごいな〜おつかれさま！という意味合いで作っています。（コミット数だけで評価されることはないです）
開発チームの生産性や健全性の可視化・改善観点で取り組んでみるのも面白そう。

2021年もおつかれさまでした！！!

24日目のアドベントカレンダーは @sazanami5 さんの [初心者が語るフレームワークの違いと魅力　~CakePHPとLaravel~](https://qiita.com/sazanami5/items/06e47d667a912ddc98ba)です！
Node.jsからMySQLに接続する時に起きるエラーの対処法

# 参考

https://github.com/linnovate/mean/issues/1066

https://stackoverflow.com/questions/50093144/mysql-8-0-client-does-not-support-authentication-protocol-requested-by-server


# エラー

MySQL 8.0 に接続するとエラーが起きる

```
[nodemon] app crashed - waiting for file changes before starting...
```

```
Error: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client
```

# 解決

```
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'ここにパスワードを入力';
```

更新するクエリ

```
flush privileges;
```

これらのクエリをMySQLで実行すれば解決
OculusLink(AirLink含む)トラブルシューティング

# アプリ実行中にトラッキングの基準位置をリセットしたい
スリープ状態から抜けた際に基準位置がリセットされるようです。
このことを利用し、電源ボタンを二回押すとトラッキングの基準位置がリセットされます。
※一回目の電源ボタン押下後に直ぐにもう一度押しても、リセットされない（スリープに入らない）ため、一回目のボタン押下から数秒待ってから二回目を押すと確実です。
SQLで使いそうな記法Tips


備忘録。今後使うかもしれない記法。
随時更新予定。
postgresで動作確認。


###  複数のカラムの中でいずれか特定の値で部分一致するレコードを検索する

例
xテーブル

|  id |  memo_a  |  memo_b  |  memo_c  |
| ---- | ---- | ---- | ---- |
| 1 |  卵を買った  |  水泳をした  |  ドライブに行った  |
| 2 |  豆腐を買った  |  ランニングをした  |  釣りに行った  |

`memo_a` ~ `memo_c` のなかで、「釣り」を含むレコードを取り出したい場合

ORでつなげれば実現できるが、カラムが多いほど記述量が増えてしまう。
対象のカラムをすべて繋げてから検索すると１度で済む。

```sql
SELECT * FROM x
WHERE concat(memo_a, memo_b, memo_c) ILIKE '%$input%'
```

### 親テーブルのIDごとに連番を振りたい

例

1:N 関係の schoolsテーブル : studentsテーブル があるとする

students テーブル

|id|school_id|name|
|:----|:----|:----|
|1|1|田中|
|2|1|鈴木|
|3|2|本田|
|4|1|佐藤|
|5|2|後藤|

これを親テーブルの `school_id` ごとに連番を算出したい場合、ROW_NUMBER関数を利用する

```sql
SELECT 
	s.*, 
	ROW_NUMBER() OVER(partition by s.school_id ORDER BY s.id) AS order
FROM students s
```

結果

|id|school_id|name|order|
|:----|:----|:----|:----|
|1|1|田中|1|
|2|1|鈴木|2|
|4|1|佐藤|3|
|3|2|本田|1|
|5|2|後藤|2|
外部設定Excelを使ってブラウザに繰り返し入力する部品を作ってみた

#ロボット概要
「設定ファイル.xlsx」で紐づけれた台帳カラム(InputDataColumn)と入力Selectorのアンカー情報(AnchorName)をもとに、文字入力を繰り返しするロボット。

[ロボット公開Github](https://github.com/RiNA2048/Uipath_Example)


#作成背景
以前参画していたPRA開発プロジェクトでユーザー様より、入力元の台帳(Excel)のカラム名と、入力処理をするサイト画面の項目名を突合せ出来る資料の要望をいただいた。
保守は別の会社に引き継ぐためそういった資料があることは望ましいが、実際に作るとなるとロボットの規模的に大変であり、どうにかこのジレンマを解消できないかと考えていた。

そんなとき、UiPath Friendsで実施された「RPAチャレンジ タイムアタック⁉」で、ブラウザの入力をTypeInto(文字を入力)を複数並べるのではなく１つだけ設置し、アンカー名のDataTableを作成してループ作業で処理する挑戦者に衝撃を受け、

これをアレンジして、台帳とサイトの入力項目の突き合わせ資料 + 外部設定Excelで動くロボットを作れるのではないかと思い作成してみた。

挑戦者様の記事▼
[UiPath Friendsのクリスマス交流会で 「RPAチャレンジ タイムアタック⁉」に参戦してきた！！！](https://note.com/kambekinu/n/nbfaa26dd4d92)

RPAチャレンジ タイムアタック⁉▼
[RPA Challenge](https://rpachallenge.com/?lang=ja)

#具体的なロボットの動き

引数の内容と、その設定については下記
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616232/ffeacd60-0859-e877-3523-269b9d8f2835.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616232/f2a072b0-04cf-7108-1bcf-feac1ffb6c2f.png)

###今回はUiPath Friendsで実施された「RPAチャレンジ タイムアタック⁉」を例に説明。

下記の様なDataTable型に変換できる台帳Excelを
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616232/1632ed15-0895-0b2c-ea21-25fd809b5fd8.png)

下記のような入力項目が一様なSelectorになるサイトへ繰り返し入力し登録する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616232/f20abc58-0a8e-ad55-3bf5-66d5bfdb6cce.png)

同ファイルに格納された「設定ファイル.xlsx」を開き
「InputDataColumn」行に台帳Excelのカラム名を、「AnotherName」行に入力サイトの項目名を入力して紐づけし、Selectorに入力項目のSelector(アンカー部分を{0}に変換)を設定する。
「PROCESS_NAME」行は連続して繰り返す処理の切り分けに利用。

例：
・PROCESS_NAME：RPA_Challenge
・InputDataColumn：苗字
・AncorName：苗字
・Selector：

```Selector
<html app='msedge.exe' title='Rpa Challenge' /><webctrl tag='LABEL' aaname='{0}' /><nav up='1' /><webctrl tag='INPUT' />
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616232/fadb87f2-b410-056a-00c0-f748afe03dd7.png)

入力元Excel台帳をDataTableに変換し、繰り返しアクティビティを使ってDataRowに変換。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616232/6d067398-cc4d-d157-1287-46715e422070.png)

今回作成した「ブラウザ入力部品.xaml」の引数にを下記の様に設定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616232/eacee25e-9e94-5f49-6378-81a98f5cb472.png)

####「ブラウザ入力部品.xaml」の動作

「設定ファイル.xlsx」をDataTable型で取得。(今後「dtSetting」と表記)
「dtSetting」のカラム名「PROCESS_NAME」に対して、引数「in_PROCESS_NAME」と一致するものでフィルタリング。

フィルタリングされた「dtSetting」を上らか順番に入力処理を実施。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616232/7b65618c-da16-8e75-7f3a-b8e432fff352.png)


#おわりに
初めてロボット公開したため説明が下手くそで申し訳ありません。
別途突き合わせファイル作るのメンドクサイな、今回みたいに外部Excelで入力項目を紐づけ出来たら、可視化されてわかりやすいし、ロボットも修正しやすいし、突合せExcelもこのまま(もしくは加工して)提出しやすいので良いよな…と作ってみたものです。

実践でどれだけ使用できるかはわかりませんが、面白がっていただけたら幸いです。

最後に、
今回公開を許可していただいたアイデア元のkinuはねこが好き([@kambekinu](https://twitter.com/kambekinu))さんありがとうございました！
AWS Certified SysOps Administrator - Associate 合格しました

先日、AWS認定SysOpsアドミニストレータアソシエイトの試験を受験し、合格しました！
その記録を残しておきます。

今回の受験は、前回のデータアナリティクス専門知識の1週間後です。AWSの資格としては今回が7個目です。

- 前回 [AWS Certified Data Analytics - Specialty 合格しました - Qiita](https://qiita.com/suzuki-navi/items/936741e02a5869856ad8)

今回でアソシエイトが3つそろいました。


# 勉強方法

数日前に公式の無料のサンプル問題集を解き始めました。たった10問ですが、夜に眠い中でやっていたので、1日数問ずつ解いて試験の前日までかかってしまいました。解きながら、よく知らないサービスや機能が出てきたら、Black Beltなどのドキュメントを読みました。自分でメモを取って整理しながらです。

Black Beltの資料はVPC、EFS、Systems Manager、EC2、Auto Scalingあたりの資料を読みました。

マネジメントコンソールを操作する実技試験があるとは聞いてましたが、それに対する対策はなにもできませんでした。実技の練習をいまさらやっても仕方がないと割り切りました。

前回の試験ではBenchPrepってやつの模擬試験を解いたのでしたが、今回はその存在を忘れてました。PDFで出てるサンプル問題だけ解きました。


# 試験当日

前回と同じく試験中は集中力がなく、のんびりやってました。自信もって回答できた問題は少なく、半分以上の問題に見直しフラグを付けてました。ひととおり解いた後は、全部を見直しました。

実技問題のほうは、操作したことのある機能と、ほとんど経験のない機能とありました。前者は普通に業務でやっているような感じでできました。後者は机上の勉強が役になったとは思います。どちらも見落としがなければ問題に沿った操作ができたように思います。ただ、要件にあいまいな点があるように感じました。

問題文の日本語に違和感あるものは、前回の試験よりは少なかったです。実技試験のマネジメントコンソールは、普段の業務と同じく、英語に切り替えてから操作しました。

時間配分としては実技問題は1問あたり30分近くかけてしまいました。それでも全体で180分中20分ぐらい時間を余らせて終了しました。


# 結果

スコア 777 でした。ラッキーセブン。


# 所感

模擬試験を解いたうえでBlack Beltの資料を読んで理解するというやりかただけで、今回の試験は大丈夫でした。逆に模擬試験をやらずに試験に臨んだらダメだったと思います。

今回の試験とは別にセキュリティやネットワークのために勉強していた領域も役に立ちました。もともとその分野が弱いというのもあります。

前回のデータアナリティクス専門知識の1週間後ということもあり、連続してAWSの試験向けの勉強をしていたためか、今回はあまり難しいとは感じませんでした。