OmniAICreator/Qiita-1.07M huggingface dataset:
Next > Netlify > Deploy with Environment Variables 



Netlifyにデプロイするサイトで、Environment Variables を扱う



![スクリーンショット 2021-05-22 12.30.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49910/5d2e3006-b8d9-1379-300c-2444e649e5c3.png "スクリーンショット 2021-05-22 12.30.32.png")



```.env.local
ENV_LOCAL_VARIABLE="server_only_variable_from_env_local"
NEXT_PUBLIC_ENV_LOCAL_VARIABLE="public_variable_from_env_local"
```

.env.localの設定をNetlifyのEnv設定へ追加

![スクリーンショット 2021-05-22 12.31.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49910/1d4597fd-60b9-9f6f-c655-221b550f47cf.png "スクリーンショット 2021-05-22 12.31.46.png")



ビルドする
![スクリーンショット 2021-05-22 12.37.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49910/a42a36ff-bc2e-4a3e-542d-5c6a1764ddc8.png "スクリーンショット 2021-05-22 12.37.20.png")


![スクリーンショット 2021-05-22 12.36.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49910/f2694fc3-7c9d-1ec4-8847-0dbb5230df59.png "スクリーンショット 2021-05-22 12.36.24.png")


NEXT_PUBLIC_ENV_LOCAL_VARIABLEが入りました





[sugasaki/next\-environment\-variables](https://github.com/sugasaki/next-environment-variables)




参考

[Environment variables in Next.js and Netlify](https://www.netlify.com/blog/2020/12/10/environment-variables-in-next.js-and-netlify/)


[next\.js/examples/environment\-variables at canary · vercel/next\.js](https://github.com/vercel/next.js/tree/canary/examples/environment-variables)
[Kotlin]拡張関数を使ってみたい

#拡張性ってナンダ
どうもReoです。

ある時、このメソッドもっとこういう処理が追加されると、今作っているアプリ内でとっても便利なぁと思う場面が出てきました。
当然、それをメソッド内でそれを定義すればよいだけの話なのですが、可読性が落ちがちです。
その為、メソッドをその場で最適化した振舞をするように定義したいなと思うわけです。

そこで、拡張性を活かす次第です。
ちなみに、Extensionとも言います。
拡張というのは、「性能向上」とすぼめて換言出来ますね。
筆者は、すぼめて理解、覚えるのが好きなんですｗ

kotlinでは、既存のクラスを拡張性を踏襲した拡張関数なるものを作りやすい特徴があるようです！
折角、kotlinというモダンな言語を学習しているのですから、是非とも使いたいですね。

#使ってみよう
何を作ってみましょうか。
その前に、キーワードを確認しておきます。

レシーバ：
拡張する元となるオブジェクトの事です。MutalbeListのメソッドを拡張するとしたら、MutableListが「レシーバ」となります。
「拡張元」と覚えると良いかなと。

それでは、[Kotlinのリファレンスにて、拡張の記事](https://dogwood008.github.io/kotlin-web-site-ja/docs/reference/extensions.html)があるのでそれを参考にしてみましょう。

```kotlin:
fun MutableList<Int>.swap(index1: Int, index2: Int) {
  val tmp = this[index1] // 'this' がリストに対応する
  this[index1] = this[index2]
  this[index2] = tmp
}
```
記事では、MutableListには、本来ないswapという要素を入れ替えるメソッドを定義しています。
拡張関数を定義するときは、リファレンス内にもあるように、レシーバをメソッド前に宣言します。
そこから、書き始めます。

ちなみに、拡張関数はこれで完成です。
実際に使ってみましょう。

[glot.ioというサイト](https://glot.io/new/kotlin)を用いるとさくっとコードが書けます。

```kotlin
fun main(args : Array<String>){
  val m = mutableListOf(1,2,3)
  m.swap(0,2)
  println(m)
   
}

fun MutableList<Int>.swap(index1: Int, index2: Int) {
  val tmp = this[index1] // 'this' がリストに対応する
  this[index1] = this[index2]
  this[index2] = tmp
}

// 結果：[3, 2, 1]
```
なんと、swapという処理があたかも静的なメソッドとして使えるではありませんか！

また、リファレンス内に
>拡張は 静的 に解決される

とありますが、これは実際にクラスを根本的に変えているのではなくて、拡張関数をオブジェクトから呼び出せるようにしているだけだよ！みたいなことをいってます。

また、レシーバをnull許容にすることもできるみたいですね。
拡張関数内で、ヌルチェックを記述することで、呼び出しがスマートになりますね！

拡張プロパティなるものもあるみたいです。
使い道が良く分からんですがｗ

これ以上、リファレンス掘り下げると頭がパンクしそうなので、切り上げましょう。

拡張関数が「性能向上」
レシーバが「拡張元」

これさえ、覚えておけば実装出来ると思います！

#終わり
意外と、簡単でしたね。
プログラミングは、実際の内容よりも難しく感じる用語が多いので、気を付けないとですね笑。
[AtCoder] ABC 178 C - Ubiquity

https://atcoder.jp/contests/abc178/tasks/abc178_c

全通りは $10^N$ 通りです。
$A_{i} = 0$ または $A_{i} = 9$ の場合は $2 \times 9^N - 8^N$ 通りです。
よって求める値は、$10^N - 2 \times 9^N + 8^N$ です。
ここまでは解説を見ずともわかりました。
しかし制約で、$1 \le N \le 10^6$ とあり、$10^N$はかなり巨大な数となることがわかります。
果たしてどうやって計算したらいいのか。
これも剰余を使うんだろうなと思ったんですが、具体的にどう計算すればいいのかわからなかったので解説を見てしまいました:sweat_smile:

https://atcoder.jp/contests/abc178/editorial/104

なるほど、ループで乗算しながら同時に剰余も求めているんですね。
そこはわかりました。
しかし、解説のソースコードの最後、

```c++
ans=(ans+mod)%mod;
```

がわからなかった。
そこでいろんな数字を入れて試したら、上記の行の直前では`ans`が負の数になる場合もあるんですね(例えば$N = 1000000$)。
そのための1行ということがわかりました。
いやー、気付きませんでした:sweat_smile:
Unfolded StudioでQGISプロジェクトをWebに公開してみよう

## Unfolded Studioってなに?
[Unfolded Studio](https://www.unfolded.ai/studio)はWebベースの地理情報分析可視化ツール。Kepler.glを開発していたUberのチームが独立したUnfolded inc.が開発しています。2021年5月20日にはFoursquareに参加することが発表されました([Unfolded and Foursquare Join Forces to Build Future of Geospatial Analytics](https://www.unfolded.ai/blog/2021-05-20-unfolded-joins-foursquare/))。
![スクリーンショット 2021-05-22 11.53.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303239/af18b824-dbf0-94b9-c7ef-b5c9e3b4c85a.png)


---

## QGISプロジェクトを公開してみる
## プラグインのインストールと起動
QGISプラグインリポジトリに公開されています。

- プラグイン > プラグインの管理とインストール からUnfoldedをインストール
- web > Unfolded かプラグインアイコンから起動する
![スクリーンショット_2021-05-22_11_39_20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303239/f45cb496-8d5d-8b0f-9daf-84c10af99741.png)
@OpenstreetMap contributors

### プラグインの設定
**Setting**タブでプラグインの設定をしておきます。

- Export でファイルをエクスポートするフォルダを設定する(初期設定はプラグインフォルダ内なのでちょっと不便かも)
- General > Mapbox API Token にMapboxのAPIトークンを入力しておくとMapboxのWMTS形式の背景地図が使えるようになる(っぽい。未検証です。)
![スクリーンショット 2021-05-22 11.43.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303239/9570af79-cb16-4e11-02c2-6e2cb63a24cc.png)


### QGISプラグインでプロジェクトをエクスポートする
**Export**タブからQGISのプロジェクトをエクスポートします。

- Layers to export でエクスポートしたいレイヤにはExportのチェックを入れる
- Title を入力する
- **Export map** をクリックするとzipファイルが出力される
![スクリーンショット 2021-05-22 11.42.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303239/32a00800-66e1-1559-4b89-640a9c3cc207.png)

### Unfolded Studioにアップする
エクスポートされたzipファイルをUnfolded Studioにアップします。

- Unfolded Studio にログインする
- **Maps** > Import Map をクリック
- QGISからエクスポートしたzipファイルをBrowseボタンから選択するか、ドラッグ&ドロップでアップロードする
- QGISのレイヤが表示されるので、Importボタンをクリックしてインポートすると、My Mapに追加される
- My Mapに追加された地図をクリックすると、地図編集画面が表示される
![スクリーンショット 2021-05-22 11.32.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303239/3b51d33e-101a-a8a1-4a79-f6161f3e7c9e.png)
@OpenStreetMap contributors, @Mapbox

### Unfolded Studioで公開する
My Mapを公開して、URLで共有してみます。

- 画面左下のPublishメニューを選択すると、Map TitleとMap Descriptionの入力画面が表示されるのでタイトルと地図の説明を入力する。Publishボタンをクリックする
- 共有用URLと埋め込み用コードスニペット、埋め込み用URLの3種類が取得できる
  - Share - 共有用URL: URLを開くとUnfolded Studio が立ち上がり、**編集できる**。
  - Embed Code - 埋め込み用コードスニペット: ブログなどのiframeに埋め込むコードスニペット
  - Embed URL - 埋め込み用URL: URLを開くと地図画面のみが表示される。**編集できない**ビューワー。
![スクリーンショット_2021-05-22_11_44_31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303239/53414abf-80b7-43e4-9c4c-d3e60513243e.png)


---
QGISのプロジェクトを共有する方法にまたひとつ選択肢が増えました:tada:
【UiPath】Excel - 右下最終セルを求める

# はじめに

この投稿は、RPAツール「UiPath」でExcelの最終列／最終行を取得する方法についての記事です。

この記事は、`UiPath Friends もくもく会 2021年5月開催 2021-05-22（土）08:45 - 12:00` で書きました。

https://uipath-friends.doorkeeper.jp/events/121159

# 幾つかある方法

VBAだと、

```
　VBAで良くある例
　　最終行：Cells(1, 1).End(xlDown)」　　　　　　'// 下に移動する
　　最終列：Cells(1, 1).End(xlToRight).Column 　'// 右に移動する
```

のように「指定位置から下または右へ移動」して取得するのが王道ですが、UiPathでは、方法が取得方法が幾つかあります。

# 1）範囲を読み込みアクティビティの行数列数から求める

「範囲を読み込み（ReadRange）」アクティビティでシート全体を読み取り、データテーブルの行数（rows.Count）または列数（columns.Count）から最終列・最終行を計算します。UiPathのフローだと以下のような感じです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154139/544cd629-c603-2a34-4db9-8ff44d0246a7.png)

列名は計算式で列数から求められます。
ただし、この方法は以下のような「表位置が左上では無い」場合は「ズレてしまう」ので、そのまま取得できません。
（先頭行が列名ではない。先頭列が空白になっている）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154139/9d534214-1763-b81f-8d90-0a2adc7c865d.png)

以下に確認しやすいように、以下にxaml形式でアップしました。

https://github.com/miyag/UiPath.ReusableCode/blob/master/ExcelGetLast/GetLastCell-ReadRange.xaml

# 2）コードを呼び出し (Invoke Code) アクティビティで実行

VBAで良くある例の

```
　VBAで良くある例
　　最終行：Cells(1, 1).End(xlDown)」　　　　　　'// 下に移動する
　　最終列：Cells(1, 1).End(xlToRight).Column 　'// 右に移動する
```

をUiPathで実施します。「VBA を呼び出し (Invoke VBA)」アクティビィティでも良いのですが、ここでは「コードを呼び出し (Invoke Code) アクティビティ」で VB.NET で記載します。

``` VB
'// 起点から右下セルを取得する
'//   入力引数 - firstPosition ： 起点となる開始セル（例：B2）
'//   出力引数 - lastPosition  ： 結果セル（例：E2）
Dim ap As New Microsoft.Office.Interop.Excel.Application
Dim wb As Microsoft.Office.Interop.Excel.Workbook
Dim firstCell, lastColCell, lastRowCell As Microsoft.Office.Interop.Excel.Range
Try
	wb = ap.Workbooks.Open(bookPath)
	For sidx As Integer = 1 To wb.Sheets.Count
		Dim ws As Microsoft.Office.Interop.Excel.Worksheet =  CType(wb.Sheets(sidx), Microsoft.Office.Interop.Excel.Worksheet)
		If ws.Name = sheetName Then
			firstCell = CType(ws.Range(firstPosition), Microsoft.Office.Interop.Excel.Range)
			lastColCell = firstCell.End(Microsoft.Office.Interop.Excel.XlDirection.xlToRight)'// 右移動
			lastRowCell = lastColCell.End(Microsoft.Office.Interop.Excel.XlDirection.xlDown) '// 下移動
			lastPosition = lastRowCell.Address(RowAbsolute:=False, ColumnAbsolute:=False)
			Exit For
		End If
	Next
	wb.Close
Catch ex As Exception
	Console.writeLine(ex.ToString)
	Throw(ex)
Finally
	If Not(wb Is Nothing) Then wb = Nothing
	ap = Nothing
End Try
```

以下に確認しやすいように、以下にxaml形式でアップしました。

https://github.com/miyag/UiPath.ReusableCode/blob/master/ExcelGetLast/GetLastCell-InvokeCode.xaml

# その他

他に「画面操作で位置取得する方法」もありますが、ホットキーを押下 (Send Hotkey) を伴うため操作の邪魔が入ると取得できないことがあります。

また、画面操作せずに「範囲を読み込み（ReadRange）」アクティビティを駆使して実施する方法もありますが、ココでは割愛します。（時間が出来たら書きます）

# 終わりに

いかがでしたでしょうか。表取得で困った時に、方法の一つとして役立てば幸いです。

この記事が参考になったら、 LGTMをお願いします。閲覧ありがとうございました。
AWS CLIのコンフィグ設定

# AWS CLIのコンフィグ設定

スイッチロールの権限をAWS CLIで使う方法
以下記事の補足記事

https://qiita.com/morita-toyscreation/items/eeba120471cfad628c49

### AWS CLIのコンフィグ設定

スイッチロールに対応するには~/.aws/configにprofileを設定

```bash
$ vi ~/.aws/credentials
[default]
aws_access_key_id = xxx
aws_secret_access_key = xxx

$ vi ~/.aws/config
[default]
region = ap-northeast-1
output = json

[profile toyscreation-sandbox]
role_arn = arn:aws:iam::689371460795:role/toyscreation-sandbox
source_profile = default
```

### 確認

profileを指定することで、スイッチ先のロールで操作が可能

```bash
$ aws s3 ls
An error occurred (AccessDenied) when calling the ListBuckets operation: Access Denied
$ aws s3 ls --profile toyscreation-sandbox
2021-05-16 02:50:54 toyscreation-sandbox
```
【UiPath】Excel - 表（DataTable）の縦横を変換する

# はじめに

この投稿は、RPAツールのUiPathで、表（DataTable）の縦横を変換する方法についての投稿です。

この記事は、`UiPath Friends もくもく会 2021年5月開催 2021-05-22（土）08:45 - 12:00` で書きました。

https://uipath-friends.doorkeeper.jp/events/121159


# 表（DataTable）の縦横変換とは

表で、横軸に時系列などが設定されている時に、縦横を変換したくなります。
例えば、以下のようなケースです。
![pv1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154139/ea42f17b-4680-d6f7-7bbd-fa921257867f.png)

UiPathで表を扱うときは、DataTable形式で取得して使用しますが、基本は行でループさせながら処理するほうが普通なので、上記の表の場合は、縦と横を入れ替えてから処理するのもありです。


# UiPathで縦横変換する

UiPathで表（DataTable）の縦横を変換するなら、以下の方法が考えられます。

1）UiPathの標準アクティビティで変換する
2）UiPathの「コードを呼び出し (Invoke Code)アクティビティ」で変換する
3）Excel操作の「形式を選択して貼り付け」で「行列を入れ替える」

以下で説明します。

# 1）標準アクティビティで変換する

列と行を入れ替えるために、以下のようなフローを使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154139/b669bba6-5528-2e38-8b0c-9fc7451cdc3a.png)

１列目の名前はkeyという名前にしていますが、変えてもOKです。

確認しやすいように、以下にxaml形式でアップしました。

https://github.com/miyag/UiPath.ReusableCode/blob/master/ExcelPivot/PivotDataTable1.xaml


# 2）コードを呼び出し (Invoke Code)アクティビティで変換する

.NETのコードでも、縦横変換が可能です。

https://prettytabby.com/vb-datatable-sample/

以下は、コードを呼び出し (Invoke Code)アクティビティで、VB.NETのコードで書いた例です。

``` VB
'// in_dt：変換前のデータテーブル
'// out_dt：変換後のデータテーブル
out_dt = New DataTable()
out_dt.Columns.Add("key")
For idx As Integer = 0 To in_dt.Rows.Count - 1
	out_dt.Columns.Add(in_dt.Rows(idx)(0).ToString)
Next
For idx As Integer = 1 To in_dt.Columns.Count - 1
	Dim drow As DataRow = out_dt.NewRow()
	Dim colName As String = in_dt.Columns(idx).ColumnName
    drow(0) = in_dt.Columns(idx).ColumnName
	For idxRow As Integer = 0 To in_dt.Rows.Count -1
		drow(idxRow + 1) = in_dt.Rows(idxRow)(colName)
    Next
	out_dt.Rows.Add(drow)
Next
```

確認しやすいように、以下にxaml形式でアップしました。

https://github.com/miyag/UiPath.ReusableCode/blob/master/ExcelPivot/PivotDataTable2.xaml


# 3）Excel画面操作で「行列を入れ替える」

Excel単体でも「表の縦横変換」ができます。

https://azby.fmworld.net/usage/windows_tips/20060426/#:~:text=%E4%BD%9C%E6%88%90%E3%81%97%E3%81%9F%E8%A1%A8%E3%81%AE%E7%AF%84%E5%9B%B2,%E3%83%9C%E3%82%BF%E3%83%B3%E3%82%92%E3%82%AF%E3%83%AA%E3%83%83%E3%82%AF%E3%81%97%E3%81%BE%E3%81%99%E3%80%82

UiPathのフローにするなら以下のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154139/c965db33-59ba-5551-5686-66813510a5a2.png)

# 終わりに

いかがでしたでしょうか。扱いにくい表の場合は、思い切って縦横変換してみるのもありです。

この記事が参考になったら、 LGTMをお願いします。閲覧ありがとうございました。
MAMP PRO とNetBeansでxdebugのブレークポイントが止まらない際の対処方法

#躓いた症状
NetBeansでデバッグができると、var_dumpで毎回チェックするよりも数段作業効率が上がるという情報を得て、自分もそれに挑戦してみた。

しかし、ブレークポイントで処理が止まらない。
普通のRUNと同じになってしまう。

ローカルのサーバー環境として、MAMP PROを使用している。
PHP > Default versionの横にある「Open template...」ボタンから編集できるphp.iniへの追記も大丈夫だと思うのだが。。。
Apacheの再起動も何度もかけたが、症状は変わらない。


#考察・確認
<?php phpinfo() ?>
でPHPインフォを見てみる。
xdebugに関する項目が、ない！
ということは、php.iniの設定がうまくいってないのか。。。

#対処
MAMP のphp.iniをもう一度見直す。

自分の場合、下記のような表記でブレークポイントが正常に止まるようになった。

```
[xdebug]
MAMP_Xdebug_MAMP

zend_extension="/Applications/MAMP/bin/php/php7.4.9/lib/php/extensions/no-debug-non-zts-20190902/xdebug.so"

 xdebug.remote_enable=1
 xdebug.remote_host=localhost
 xdebug.remote_port=9000
 xdebug.remote_autostart=1
 xdebug.remote_connect_back = 1
 xdebug.remote_handler="dbgp"
 xdebug.idekey="netbeans-xdebug"
```

※不要な設定もあるかもしれないが、そこは詳しく検証していません。

#さいごに
今回、正直なところ、php.iniの設定は、かなり惜しいところまで行っていた。
自分の場合、何が原因だったのかというと、１行目と次の行の間に

```
MAMP_Xdebug_MAMPzend_extension="/Applications/MAMP/bin/php/php7.4.9/lib/php/extensions/no-debug-non-zts-20190902/xdebug.so"
```

のように、改行を入れていなかったこと。
MAMP PRO のphp.iniには、この記述は初めから設定済みなのだが、なぜか改行されていない。
これを改行することで、phpインフォにxdebugに関する一覧が追加された。

そして実際にNetBeansでトライしたら、ブレークポイントで止まるようになった。

半日かかってしまった。。。が、前進したのでいいだろう。
今後同じ設定をするときにはここに立ち戻りたい。


同じような症状で悩まれている方、ぜひお試しください^^
Learn Python In Seminar

# 概要

計量経済学のゼミでPythonを用いてデータ分析を行なっています。ゼミでの学習や自己学習、プレゼン資料をQiitaの記事として投稿し、この投稿にまとめていきます。


# 基本

- [基本統計量と簡単なグラフ化](https://qiita.com/k8m/items/fa3f8f2282c1e3552fa9)
- [相関関係](https://qiita.com/k8m/items/d83cb5f589360841b6fc)
- [欠損値の処理](https://qiita.com/k8m/items/65814585832432b12815)
- [モデル学習の基本](https://qiita.com/k8m/items/0db8a5d2e729544ce2f6)

# ライブラリ

- [pandas(予定)]()
- [scikit-lean(予定)]()
- [matplotlib(予定)]()
- [seaborn(予定)]()

# 演習

- [自動車の走行距離予測](https://qiita.com/k8m/items/b758dd7fa5818d86cb41)
- [債務履行リスクの低減](https://qiita.com/k8m/items/bcb679d907d3e19e0c5a)


<br>
- Miyata Koki -
O:inc.でAmplify×React×React Nativeを使用して開発しています。大学のゼミでは統計学をPythonで行っています。
インターンやゼミで学んだ情報を発信していくので、フォロバもしますのでぜひこちらのアカウントのフォローお願いします！
auto-complete がフリーズする問題

# 解決するには
auto-complete を使っているとき候補の擬似ウインドウが開いたまま逝ってしまうことがあったのですが、

```emacs-lisp:source.el
(setq ac-use-quick-help nil)
```

これでしなくなりました。
設定して半年以上経過し Emacs は毎日使っていますが以降一切フリーズしていません。

おそらく黄色だかオレンジだかでチラチラ出るヘルプ窓の抑止オプションですね。
思い出したようにフリーズするが、これが無くても困らない人は試してみる価値在りです。

# 環境
## プラットホームは Windows 10 で Emacs は
```emacs-lisp:source.el
"GNU Emacs 28.0.50 (build 1, x86_64-w64-mingw32)
 of 2021-01-16"
```
## auto-complete
```emacs-lisp:sample
Version: 1.5.1
```


# いろいろ
これについてはかなり前の OS or Emacs から困っていて、ググってみていくつか出てきた解法では解決には至らず、最初は使っている Emacs のバイナリのせいかと思っていたのですが、Emacs の版が変わって治ったかなと思っても忘れた頃にフリーズ...
auto-complete の最新版を見てみても未だにデフォルトではイネーブルされていて問題ないようですし、ぐぐっても新たな情報も出てこないので、自分のプラットホーム固有の問題なのかもしれないです。

作者が日本人だった気がしたので、報告しようと辿ったら github に掲示板がありましたが、英語だし勝手がよく判らないので、ここに記事として書いてしまいました。

一時はカンパニにへの乗り換えも考えてバインドやフェイス等設定して少し使ってみたのですが、候補に余計なものが出すぎて使いにくいのでさようならとなりました。
設定で追いつめられるのかもしれないですが、そこまでの余裕もなく。
Azure Logic AppsのHTTPトリガーのパラメータ渡しでメール送信内容を切り替える

# 背景
サクッとメール送信する機能を実装する為、Azure Logic AppsのGmailコネクタを使用して、HTTPトリガーから起動できるようにしたのですが、「このときは、このメッセージ」「このときは、このメッセージ」みたいな切り替えが必要になってきたので、Webhookのパラメータに応じて送信内容を切り替える機能を実装してみました。

# 概要
**大雑把な構成はこちら。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475457/252924ca-4171-00ce-2e95-2160584b0bd2.png)
HTTP TriggerからGmailコネクタを読んでメールを送信します。

**もう少し詳しく**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475457/d0fc304d-fe2f-9d76-32c5-3f7ba7626fa7.png)

* HTTP要求の受信でパラメータを受信しておきます
* メール本文のコメントを切り替える用の[変数]を初期化しておきます
* スイッチ分岐で、受信したパラメータに応じてコメント用の[変数]を設定します
* Gmailコネクタの本文内で、コメント用の[変数]を使い、送信するメール内容を切り替えます。

# 詳細
### HTTPリクエストでのParameterの渡し方
[以前の記事](https://qiita.com/yukimatsu/items/c8330f01027a161f3c25) でも紹介していますが、HTTPトリガーで発行されるURLで「postalCode=123456」が渡したいParameterの部分になります。

公式ドキュメントの書き方
>1 つ目の位置: https://prod-07.westus.logic.azure.com:433/workflows/{logic-app-resource-ID}/triggers/manual/paths/invoke?postalCode=123456&api-version=2016-10-01&sp=%2Ftriggers%2Fmanual%2Frun&sv=1.0&sig={shared-access-signature}

なので、今回は例として、[param=0]とします。
「param=0」に変更した例が以下になります。
>https://prod-07.westus.logic.azure.com:433/workflows/{logic-app-resource-ID}/triggers/manual/paths/invoke?param=0&api-version=2016-10-01&sp=%2Ftriggers%2Fmanual%2Frun&sv=1.0&sig={shared-access-signature}

参考の公式ドキュメント
https://docs.microsoft.com/ja-jp/azure/logic-apps/logic-apps-http-endpoint#accept-values-through-get-parameters

### メールの本文中で使用するコメントの初期化
[変数]を[文字列]として初期化しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475457/cbe40115-23dd-a141-2396-a0d301938b8b.png)

### HTTPトリガーで受信したパラメータによる処理の切り替え
先ほどの公式ドキュメントにも記載がありますが、以下のような式に入れてやると、[param]の値を取得することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475457/8efc0478-3317-f829-cfbd-a44140522630.png)

>triggerOutputs()['queries']['param']

スイッチ分岐を使って、[param]で渡されてくる文字列を比較として、[変数]のコメントに切り替えるコメントを代入します。[param]の値を見て、[変数]に代入する文字列を切り替えます。
パラメータで渡されるのは文字列になるので、比較する値も"0"など、文字列にすることはお忘れなく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475457/4be7d588-39ea-7130-c6a4-9c802675cc23.png)

### メール送信の本文内で使用します
このような感じで [コメント変数] を使用することで、送信するメールの内容を切り替えることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475457/d3dd192a-7309-e7d5-8e58-46f08e6afd40.png)

### メールの送信
このようなメールを送信することができます。
[param]の値を変えることで、送信する内容を切り替えることが出来ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475457/f0ede5b3-9f3c-cbdf-2d74-118b8cbe7b1b.png)

# まとま
上記のような方法で、HTTPトリガーで渡されるパラメータで送信メールの内容を変更することが可能です。
HTTPトリガーのパラメーターとしていろいろ渡すことも可能ですが、微妙なメールでの言い回しなどはLogicApps側で変更可能にしておくことで、プログラマーでなくても容易にカスタムできる環境が作れると思います。
Learn Python In Seminar〜相関関係〜

# 概要

今回は相関関係を数値し、それを可視化する方法です。
他にも「[Learn Python In Seminar](https://qiita.com/k8m/items/4952894a80c1833e5501)」のシリーズとして書いているので、よければご覧ください！


# 用語

### 相関(correlation)
変数間の関係

### 相関係数
- **相関の度合い**を表す
- **-1から1の範囲**で表現
- -1/1に近いほど相関が強く、0に近いほど相関が弱い
- プラスであれば**正の相関**、マイナスであれば**負の相関**

# 数値化

## インポート

```
import pandas
import seaborn as sns
from matplotlib impot pyplot as plt
```

## 相関係数

Pandasライブラリのcorr関数で相関係数を確認可能

```
DataFrame.corr()
```

# 可視化

## 散布図

- 2変数からなる1組のデータを点で表現した図
- 量的データ同士の相関

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542018/68e5ce34-1aea-1a2e-5ad6-c44f5c602809.jpeg" width=100 height=100></img>

Matplotlibライブラリのplt.scatter関数

```
plt.scatter(横軸のデータ, 縦軸のデータ)
plt.show()
```

## 箱ひげ図

- 最大値、最小値、四分位数の情報が含まれた図
- 質的データと質的データの相関

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542018/b2de8534-c50f-857e-fa85-165905610f24.png" width=150 height=150></img>


Seabornライブラリのboxplot関数

```
sns.boxplot(横軸のカラム, 縦軸のカラム, data=分析対象データのDataFrame)
```

## ヒートマップ

- 数値の大小は色の濃淡で表現した図
- Seabornライブラリのheatmap関数

```
sns.heatmap(DataFrame)
plt.show()
```

# 注意点

相関関係＝因果関係ではない！
詳しくは[こちら](https://ja.wikipedia.org/wiki/%E7%9B%B8%E9%96%A2%E9%96%A2%E4%BF%82%E3%81%A8%E5%9B%A0%E6%9E%9C%E9%96%A2%E4%BF%82)
Chrome DevToolで表示時間を出力し、PowerShellで集計する

サイトの表示に時間がかかるが手元に測定できるツールがない。そんなときでもChromeがあれば右クリックして「検証」を選び、「Network」タブを開けば何に時間がかかっているか確認することができる。（下図の①）


![0521-1144.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33389/623e3e89-d188-aabb-7f3a-29741d55a34c.png)

これをHARという形式で保存することができる。先頭だけ抜粋すると、こんな感じのJSONファイルになっていてリクエストで送信したパラメータやCookie、時間など多くの情報が含まれている。

```json
{
  "log": {
    "version": "1.2",
    "creator": {
      "name": "WebInspector",
      "version": "537.36"
    },
    "pages": [
      {
        "startedDateTime": "2021-05-21T14:42:21.112Z",
        "id": "page_1",
        "title": "https://www.google.co.jp/",
        "pageTimings": {
          "onContentLoad": 1403.932999999597,
          "onLoad": 3186.3129999983357
        }
      }
    ],
    "entries": [
      {

```

HARを読むのは大変なので、特定のフォルダにharファイルをまとめて、timeだけ抜き出して表示するPowerShellスクリプトを書いた。

```powershell
$path = "C:\Users\user\Documents\powershell\*.har"

Get-ChildItem -Path $path | ForEach-Object {

    $json = Get-Content $_.FullName -Encoding UTF8 -Raw
    $temp = ConvertFrom-Json $json

    $startedDateTime =  $temp.log.pages[0].startedDateTime

    foreach($entry in $temp.log.entries ){
        if ( $entry.request.url -eq "https://www.google.co.jp/" ) {
            Write-Output("{0},{1}" -f $startedDateTime,$entry.time)
        }
    }

}
```

timeのほかに、timing.waitという値もある。Chromeのサイトを見るとTTFB(Time To First Byte)、つまりブラウザがリクエストを投げてからサーバが最初の１バイトを返すまでの時間のようだ。これも併せて記録すると有用だろう。

https://developer.chrome.com/docs/devtools/network/reference/
Ubuntu20.04へのアップグレード中に"Please fix the '/usr/bin/python3' symlink."エラー

# 環境

動作環境は以下の通り。

```bash
$ cat /etc/os-release 
NAME="Ubuntu"
VERSION="18.04.5 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.5 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic
```

# 事象

Ubuntu 20.04 LTSへのアップグレード実行時に、"Please fix the '/usr/bin/python3' symlink." エラーが表示され、アップグレードに失敗した。

```bash:エラーメッセージ
$ sudo do-release-upgrade -d
...
...
アップグレードできません 
Your python3 install is corrupted. Please fix the '/usr/bin/python3' symlink. 
```

# 原因調査

## シンボリックリンクの確認

`/usr/bin/python3`のシンボリックリンクを確認する。

```bash:シンボリックリンクの確認
$ ll /usr/bin/python3
lrwxrwxrwx 1 root root 25  1月  4 16:51 /usr/bin/python3 -> /etc/alternatives/python3*
$ ll /etc/alternatives/python3
lrwxrwxrwx 1 root root 18  5月 22 09:36 /etc/alternatives/python3 -> /usr/bin/python3.6*
```

OSデフォルトのPython3バージョンであるPython3.6までシンボリックリンクが通っており、問題ないように見える。

## 再インストール

そこで、python3を再インストールしてみる。

```bash:再インストール
$ sudo apt-get install --reinstall python3
```

処置確認のため、再度アップグレードコマンドを実行する。

```bash:処置確認
$ sudo do-release-upgrade -d
...
...
アップグレードできません 
Your python3 install is corrupted. Please fix the '/usr/bin/python3' symlink. 
```

python3の再インストールでは解決せず。

## シンボリックリンク再作成

次に、シンボリックリンクを再作成する。

```bash:シンボリックリンク再作成
$ sudo ln -fs /usr/bin/python3.6 /usr/bin/python3
$ ll /usr/bin/python3
lrwxrwxrwx 1 root root 18  5月 22 09:42 /usr/bin/python3 -> /usr/bin/python3.6*
```

処置確認のため、再度アップグレードコマンドを実行する。

```bash:処置確認
$ sudo do-release-upgrade -d
...
...
```

成功した。

# まとめ

Ubuntuは、以下のようにPython3のシンボリックリンクが別のフォルダ経由すると`corrupted`と判定してしまうらしい。

OK: `/usr/bin/python3 -> /usr/bin/python3.6`
NG: `/usr/bin/python3 -> /etc/alternatives/python3 -> /usr/bin/python3.6`

従って、シンボリックリンクを再作成すれば解決される。

```bash:シンボリックリンク再作成
$ sudo ln -fs /usr/bin/python3.6 /usr/bin/python3
$ ll /usr/bin/python3
lrwxrwxrwx 1 root root 18  5月 22 09:42 /usr/bin/python3 -> /usr/bin/python3.6*
$ sudo do-release-upgrade -d
...
...
```
JLCPCBにFedexとSFエクスプレスエコノミー（SF Economy Express）でPCBを発注する

JLCPCBにSFエクスプレスエコノミー（SF Economy Express）でPCBを発注するの続きです。
https://qiita.com/usashirou/items/74374397ee92a678c445
今回は、FedexとSFエクスプレスをほぼ同じタイミングで発送されるように発注してみました。
見事に同日に発送されました。
___5月13日発送連絡___
#Fedex
5月14日18：55のWEBは下記の通り
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/5e0c1e7d-f41c-73ad-82c5-d6512d3a9636.png)
#SFエクスプレス
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/2a1f9208-4996-ed45-97ff-502be7d53dba.png)
#Fedex
５月１７日到着
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/5d304640-ee49-4386-dff3-cf065cf6fc21.png)
#SFエクスプレス
５月２０日西濃運輸にて到着
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/1a855e7b-1110-ced7-e1f9-365c7a02c135.png)
#総評
Fedex：木曜日⇒月曜日：4日
SFエクスプレス：木曜日⇒木曜日：7日
Fedexの方が３日早く届きました。
ちょっと急ぐ人はＦｅｄｅｘを使う方が良いでしょう。
ActiveRecord::PendingMigrationError ( Migrations are pending. To resolve this issue, run:rails db:migrate RAILS_ENV=development ): の対処法


#背景

ローカルでサーバーを起動しようと
rails s　を実行したところタイトルのエラーが発生しました。



```php:エラー文
ActiveRecord::PendingMigrationError (
Migrations are pending. To resolve this issue, run:
        rails db:migrate RAILS_ENV=development
):
```

解決するためにはマイグレーションを行えとのメッセージがあります。

#解決策

migrate を実行します。
ここでideas テーブルが作成されました。

```
rails db:migrate RAILS_ENV=development
== 20210122234052 CreateIdeas: migrating ======================================
-- create_table(:ideas)
   -> 0.0048s
== 20210122234052 CreateIdeas: migrated (0.0049s) =============================
```

その後、エラーが解決しました。どうやらマイグレーションが行われていない故に発生したエラーのようでした。
Sass 1.33.0 へのアップデートで警告が出た

npm で Sass をアップデート。
sass ^1.32.13  →  ^1.33.0

gulp の CSSタスクを実効すると、以下の警告が出た。
"DEPRECATION WARNING: Using / for division is deprecated and will be removed in Dart Sass 2.0.0."
[» 説明：Releases · sass/dart-sass](https://github.com/sass/dart-sass/releases)

CSSはちゃんと生成されているようだが、エラーメッセージが多過ぎてはかどらない。WordPress や Bootstrap に含まれている SCSS でも大量の警告が出ているので、他人と未来の自分に託して一旦バージョンを戻した。

`npm uninstall sass`
`npm install -d sass@1.32.13`
Rails　Bootstrap導入による必要事項

#head要素内でmeta name="viewport"...を使用する理由
デバイスごとにサイズを調整するのに記述が必要。

```csharp:application.html.erb
meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
```
【解説】

```
content="width=device-width
```
横幅をデバイスの幅に合わせるという意味です。

```
initial-scale=1
```
倍率を指定するもの

```
maximum-scale=1
```
最大倍率を示す


レスポンシブの対応を行うために必要のため記述を行う。

参考：https://www.tagindex.com/html5/page/meta_viewport.html
【Arduino】Raspberry Pi Picoの標準出力

# Raspberry Pi Picoの標準出力

Raspberry Pi PicoをArduino IDEで扱う際の標準出力先を調べてみました。

結果的に言うと1,2ピンのUART0です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/1658eed9-19e5-ae77-173a-b7ebac7df4ab.png)


## スケッチ

そのまま定期的に`printf()`で標準出力します。

```cpp
void setup() {
  // put your setup code here, to run once:

}

void loop() {
  // put your main code here, to run repeatedly:
  static int count = 0; 
  printf("count:%d\n",count++);
  delay(1000);
}
```

## 配線
USBシリアルは秋月電子の[ＦＴ２３４Ｘ　超小型ＵＳＢシリアル変換モジュール](https://akizukidenshi.com/catalog/g/gM-08461/)をブレッドボードに挿したRaspberry Pi Picoに[両端ロングピンヘッダ](https://akizukidenshi.com/catalog/g/gC-09055/)で繋ぎました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/efe8c224-d4cd-d122-77c0-22042bb5e9fd.png)

ちょうど、ＵＳＢシリアル変換モジュールのピンが`RX`、`TX`、`GND`の順なので、そのままRaspberry Pi Picoの`1:UART0 TX`、`2:UART RX`、`3:GND`に繋いでます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/88b118f8-734b-7f96-8b07-a7bfe0e47718.png)


## 動作確認
Tera Termなどのターミナルソフトで、Raspberry Pi Picoからの受信を確認します。

シリアルの設定は、次のとおりです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/ec286a26-cd60-a534-1d4c-d725076cecc1.png)

受信が確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/1e382a9d-760b-e2d7-f799-3838a7edd1b8.png)

# Mbed OSのAPIを使ったシリアル出力
ついでにMbed OSのAPIを使ったシリアル出力を確認してみました。

Raspberry Pi PicoのファームウェアはMbed OSをベースに作られています。そのため、Mbed OSのAPIも使用可能です。ついでにMbed OSのシリアルAPIの`UnbufferedSerial`の使い方を確認します。

## スケッチ
`mbed`という名前空間でMbed OSのAPIが使用できます。
ターミナルソフトからの受信をそのまま返すエコーのスケッチです。

```cpp
#include "mbed.h"

using namespace mbed;

static UnbufferedSerial serial_port(CONSOLE_TX, CONSOLE_RX);

void on_rx_interrupt() {
    char c;
    if (serial_port.read(&c, 1)) {
        serial_port.write(&c, 1);
    }
}

void setup() {
    serial_port.baud(115200);
    serial_port.format(8,SerialBase::None,1);

    serial_port.attach(&on_rx_interrupt, SerialBase::RxIrq);
}

void loop() {
  
}
```

## 配線
上記と同様です。

## 動作確認
ターミナルソフトで打つとそのまま打った文字が返ってくることが確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/84f6d5fe-0926-c57f-10de-cb5e0c3099eb.png)



# 紹介
Raspberry Pi PicoをArduino IDEで開発するための手順を解説した本の第一弾を出版しました。

[マイコンはじめの一歩！ Arduino IDEではじめるRaspberry Pi Pico: 1st](https://amzn.to/3oIybNB)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/e95e18b8-f2ce-62ab-d5bd-c5e2aea212ee.png)

## 目次
本書 について
　本書の利用について
　本書の内容 について
　権利 について
サポートページ
動作環境について
1 はじめに
2 必要なもの
3 Raspberry Pi Picoについて
　3.1 性能
　3.2 プログラミング方法
4 プログラミング環境の準備
　4.1 Arduino IDEのダウンロードとインストール
　4.2 スケッチを書 きこむための準備
　　4.2.1 Raspberry Pi Picoの準備
　　4.2.2 Arduino IDEの設定
5 Raspberry Pi Pico単体でプログラミング
　5.1 Raspberry Pi Pico上のLED をコントロール
　　5.1.1 LEDを点滅させる
　　5.1.2 LEDの明るさをコントロール
　5.2 パソコンと通信する
　　5.2.1 Raspberry Pi Picoから文字を送る
　　5.2.2 Raspberry Pi Picoに指示する
　5.3 USBデバイスにする
　　5.3.1 USB キーボードにする
　　5.3.2 USBマウスにする
6 補足情報
7 最後に

## 第二弾予告
第二弾はブレッドボードや[Grove Shield for Pi Pico](https://akizukidenshi.com/catalog/g/gM-16336/)を使って、センサや表示機などを繋げて動作させる方法を解説します。
フォームからのデータを保存できない


データの保存
-
フォームからのデータを保存するために、以下のようにコードを。しかしながら、2つの誤りが原因でデータが正しく保存できませんでした。

```rb:app/views/posts/new.html.erb
<h1>新規投稿ページ</h1>
<%= form_with url: "/posts", method: :post, local: true do |form| %>
  <%= form.text_field :context %>
  <%= form.submit '投稿する' %>
<% end %>
```

```rb:config/routes.rb
Rails.application.routes.draw do
  get 'posts', to: 'posts#index'
  get 'posts/new', to: 'posts#new'
  post 'posts', to: 'posts#create'
end
```

```rb:app/controllers/posts_controller.rb
class PostsController < ApplicationController
  def index
    @posts = Post.all
  end

  def new
  end

  def create
    Post.new(content: params[:content])
  end
end
```


① text_fieldで指定した値がcontextになっているが、コントローラーで受け取っているパラメーターはparams[:content]であるため
② Post.newでインスタンス（レコード）を生成しただけで保存していないため
①については、問題で提示したフォームでは、params[:content]の中身は空っぽです。データをコントローラーで受け取るためには、params[:context]とするか、<%= form.text_field :content %>と修正。名前は揃えた方がわかりやすいのので、意図がなければ後者の方が望ましい。

②については、1行で書くのであればPost.create(content: params[:content])として、インスタンスの生成と保存を一度に行ってしまうことが望ましい。一方で、以下のように記述しても、データは保存できます。

｀｀｀rb
def create
  post = Post.new(content: params[:content])
  post.save
end
```
フォームを追加しよう


フォームの実装
-
新規投稿フォームとして、以下のようにフォームを記述。このフォームには誤っている場所が2つありました。

```rb
<%= form_with url: "/posts", method: :create, local: true do |form| %>
  <%= format.text_field :content %>
  <%= format.submit '投稿する' %>
<% end %>
```


①HTTPメソッドがcreateという存在しないメソッドになっている
②パイプで囲まれた変数（|form|）と、フォーム内のヘルパーで使用している変数が異なっている（formatになっている）
新規投稿をするときのHTTPメソッドはPOSTで。また、パイプで囲まれた変数名と、フォーム内のヘルパーで使用している変数名は一致する必要があり。
文字数を算出するプログラムの実装


概要
-
対象となる文字列から特定の文字列の数を算出し、その数を出力するプログラムを実装。次の要件を満たすcount_hiメソッドを実装。

対象となる文字列の中から、"hi"という特定の文字列の数を取得すること
上記で取得した数を出力すること

雛形
-
```rb
def count_hi(str)
  #  処理を記述
end

# 呼び出し例（引数には対象となる文字列を指定します）
count_hi('abc hi ho')
出力例：
count_hi('abc hi ho') → 1
count_hi('ABChi hi') → 2
count_hi('hihi') → 2
```

scanメソッド
-
scanメソッドは、対象の要素から引数で指定した文字列を一致を調査し、配列として返すメソッド。

```rb
"foobarbazfoobarbaz".scan("ba")
=> ["ba", "ba", "ba", "ba"]
```

```rb:完成コード
def count_hi(str)
  puts str.scan("hi").length
end
```

```rb:呼び出し例
count_hi('abc hi ho')
```

対象の文字列の中に"hi"という文字列がいくつあるか数える為、scanメソッドを使用します。scanメソッドは、検索結果を配列として返します。
1行目のcount_hiメソッドの仮引数strには対象の文字列が格納されているため、以下のように記述することで、”hi”という文字列の数だけ配列の要素を返すことができます。

```rb
def count_hi(str)
  str.scan("hi")
end
```

配列の中の要素の数をlengthメソッドで返し、putsメソッドで出力すれば完成。
閏年処理を考える


ある年のある月の日数を求めるメソッドを作ります。2月、つまり閏年かどうかです。　　
閏年かどうかは以下の判定基準があります。

① その年が4で割り切れる場合は閏年の可能性がある
-
まず、閏年は4で割り切れる年であることが最低条件ですね。4で割り切れる年は閏年である可能性です。ただし、4で割り切れるだけでは閏年とはかぎりません。例外が１つあります。

② 年が100で割り切れて400で割り切れない場合は閏年ではない
-

厄介な条件です。その年が4で割り切れても100で割り切れて400で割り切れない場合は閏年でない。

具体的な例
-

|2000年|
|--|
|2000年は4で割り切れますね。そして100でも割り切れます。さらに400でも割り切れます。100でも400でも割り切れるので、2000年は閏年となります|

|1900年|
|-|
|1900年は4で割り切れますね。そして100でも割り切れます。ただし、400では割り切れません。100で割り切れて、400で割り切れないため、1900年は閏年ではありません|

以上をふまえて閏年の判定。

雛形
-
```rb:question2.rb
  def get_days(year, month)
    # ここに処理を書き加えてください
  end

  puts "年を入力してください："
  year = gets.to_i
  puts "月を入力してください："
  month = gets.to_i

  days = get_days(year, month)
  puts "#{year}年#{month}月は#{days}日間あります"
```

```rb:完成版
def get_days(year, month)
    month_days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
    if month == 2
      if year % 4 == 0
        if year % 100 == 0 && year % 400 != 0
          days = 28
        else
          days = 29
        end
      else
        days = 28
      end
    else
      days = month_days[month - 1]
    end

    return days
  end

  puts "年を入力してください："
  year = gets.to_i
  puts "月を入力してください："
  month = gets.to_i

  days = get_days(year, month)
  puts "#{year}年#{month}月は#{days}日間あります"
```

2月以外は各月の日数が決まっていますね。よって、とりあえず以下のようなソースコードを。

```rb
  def get_days(year, month)
    month_days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] # 各月の日数は配列で管理
    return month_days[month - 1]
  end

  puts "年を入力してください："
  year = gets.to_i
  puts "月を入力してください："
  month = gets.to_i

  days = get_days(year, month)
  puts "#{year}年#{month}月は#{days}日間あります"
```

実はこれでほとんどの場合をカバーしています。ただし、例外が存在します。2月が閏年の場合。そこで2月のときにだけ条件分岐して別の処理を書く。

```rb
  def get_days(year, month)
    month_days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
    if month == 2 # 2月のとき
      # 閏年のときはdaysに29を代入
      # それ以外はdaysに28を代入
    else
      days = month_days[month - 1]
    end

    return days
  end

  puts "年を入力してください："
  year = gets.to_i
  puts "月を入力してください："
  month = gets.to_i

  days = get_days(year, month)
  puts "#{year}年#{month}月は#{days}日間あります"
```

あとは閏年か判定するだけです。閏年かどうかの判定は以下の2つです。

① その年が4で割り切れること
② ただし、年が100で割り切れて400で割り切れない場合は閏年ではない

これをソースコードにしていくと以下。

```rb
  year = 指定の年

  if year % 4 == 0                         # 年が4で割り切れること
    if year % 100 == 0 && year % 400 != 0  # 年が100で割り切れて400で割り切れない場合
      # 閏年でない
    else
      # 閏年
    end
  end
```

このソースコードをget_daysメソッドに組み込み。

```rb
  def get_days(year, month)
    month_days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
    if month == 2
      if year % 4 == 0                         # 年が4で割り切れること
        if year % 100 == 0 && year % 400 != 0  # 年が100で割り切れて400で割り切れない場合
          days = 28 # 閏年でない
        else
          days = 29 # 閏年
        end
      else
        days = 28   # 閏年でない
      end
    else
      days = month_days[month - 1]
    end

    return days
  end

  puts "年を入力してください："
  year = gets.to_i
  puts "月を入力してください："
  month = gets.to_i

  days = get_days(year, month)
  puts "#{year}年#{month}月は#{days}日間あります"
```
起動時に自動的にterminalを起動する（Linux-Kali）

#はじめに
起動時にVPNに接続したい、あるいは直接接続はしないが、接続するためにシェルを使いたい。でも毎回開くのがめんどう。などいろいろな理由があってPCを起動したら自動的にターミナルエミュレータも立ち上がって欲しい人は意外と多いのでは。

twitter:[@ikk_hck](https://twitter.com/ikk_hck)

#現在のterminalの確認
```
update-alternatives --config x-terminal-emulator
```
で現在のターミナルを確認。アスタリスクがついている番号が現在のターミナル。

```
There are 3 choices for the alternative x-terminal-emulator (providing /usr/bin/x-terminal-emulator).

  Selection    Path                             Priority   Status
------------------------------------------------------------
  0            /usr/bin/gnome-terminal.wrapper   40        auto mode
* 1            /usr/bin/gnome-terminal.wrapper   40        manual mode
  2            /usr/bin/mate-terminal.wrapper    35        manual mode
  3            /usr/bin/qterminal                40        manual mode

Press <enter> to keep the current choice[*], or type selection number: 
```


#ファイル作成
kaliの場合、/etc/xdg/autostart配下にファイルを作成する。

```
cd /etc/xdg/autostart    
```
移動してエディタをつかって

```
sudo vim auto_terminal.desktop 
```

以下を書き込んで保存。

```
[Desktop Entry]
Type=Application
Exec=gnome-terminal 
Hidden=false
NoDisplay=false
X-GNOME-Autostart-enabled=true
Name=Terminal
```

3行目の

```
Exec=gnome-terminal 
```
の部分は指定したいエミュレータに合わせてください。
またターミナルを表示する位置を指定したい場合は

```
Exec=gnome-terminal --geometry=100x20+0+0 
```

--geometry=WxH+x+yとなっており、それぞれ横幅、縦幅、横軸開始位置、縦軸開始位置となっています。自分の都合にあわせて変更してください。
再起動して完了。

#複数ウィンドウたちあげたい
複数ウィンドウをそれぞれ別々の位置で起動したい場合、私はそれぞれファイルを４つ作成しました。もちろん--geometryの値以外は同じ内容が書かれたファイルです。ほかにもっといいやり方があるかも。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197716/0a32f3a8-bd6d-4267-da0b-facca74f3f1f.png)

では。
WEB広告に関して考えて見る

最近導入したプラウザの機能でポップアップ広告の規制をするものがあったので、WEB広告に関して再度考えてみることにする。

# WEB広告とは
WEB広告とはテレビでいうところのCMみたいなものである。WEB広告によって成り立つWEB運営者も数多くいる。

# WEB広告のデメリット
## 無駄なパケットを消費する
WEB広告を表示させるための無駄なパケットを消費してしまう。格安SIMで運用している人にとっては結構痛手なことである。

## 余計なものの購入
WEB広告では、過去の検索歴をもとに自分の趣味嗜好にあったWEB広告を効率よく選択している場合がある。なので、無駄なものを購入してしまう場もある。

# WEB広告のメリット

## 有料サービスを無料で使える場合がある
なにかを運用するに当たっては何らかの費用を捻出していかなくてはならない。これがWEBの広告収入だけでまかなえることになれば、利用ユーザーからお金をいただく必要はなくなる。また、WEB広告が邪魔だという人に対してはWEB広告を拒否する代わりにお金を支払ってもらうなどのサービス形態を作ることができる。

## 自分の知り得なかったサービスを知ることができる
WEB広告を見ることによって、自分が今まで知ることが出来なかったWEBサービスを知ることもできる。なので、ある意味では、WEB広告広告を見ないということはその分の機会費用を損しているとも言うことができる。

# 結局どう思っている?
別にWEB広告を悪いというわけではない。ただ、最近のブログにしろ、ページ枚数を増やしたり、PV数を稼ぐためのあおり文句を掲載したりとちょっと過激なことをする人も多いのはないかと思う。ただ、有効にWEB広告を活用していけたらとも思う（データ通信量が使い放題であればの話にはなるが）。
RubyOnRails 画像サイズの指定方法

#「refile」「refile-mini_magick」をインストールする
投稿フォーム等で得た画像データをリサイズすることができる機能を持っています。Gemfileにてインストールを実行。

```csharp:Gemfileに記述
gem "refile", require: "refile/rails", github: 'manfe/refile'
gem "refile-mini_magick"
```

#サイズ指定の実例

①サイズ指定のみ

```csharp
<%= attachment_image_tag post_image, :image ,size:'100x100'%>
```

②サイズ指定＋写真が無い場合のfallback設定

```csharp
  <%= attachment_image_tag book.user, :profile_image, :fill, 100, 100, format: 'jpeg', fallback: "no_image.jpg", size:'100x100'  %>
```

③少し変わったバージョンでのサイズ指定（（）の中にsize指定記述を入れる）

```
<%= image_tag('sample-author1.jpg',size:'100x100') %>
```
【PHP】PHPからPythonを遠隔操作する

<h1>PHPからPythonをどうやって遠隔操作するの？</h1>

どうも少し久しぶりのカラボンです。
この間、PHPを使ってPythonを遠隔操作出来たので紹介します。

だいたいこんな感じ。

![IMG_6164.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086026/84fb42c6-3708-256b-709f-00a81ecaa83f.gif)

これ、どうやって操作してるのかというと、

1.PHP側でフォームを作る

2.フォームの転送先でその変数の値をjsonに記録する

PHP側はこれだけです。

Python側は

1回、while Trueに噛ませる
json読み取りを入れる

もし、json側でonとかになったときだけまたwhile True文に入る

1回だけ処理をさせたい場合はjsonにoffなどを書き込む

させたくない場合はそのまま。

もし、offなどになったらbreakする

これだけで実質遠隔操作ができるということです。
plunkerでcssフレームワーク その7

#概要

plunkerでcssフレームワークやってみた。
pure使ってみた。

#サンプルコード

```
<link rel="stylesheet" href="https://unpkg.com/purecss@2.0.5/build/pure-min.css">
```

#成果物

https://embed.plnkr.co/plunk/JmFbJd75PKIYDexD

以上。
FreeRTOS理解その11（マイコンによる違い）

FreeRTOSを用いて、いくつかのボードでソースコードが共通となるようプログラミングおよびテストをしていたところ、マイコンによる差を見つけたので、ここに記録する。

## 用いたボード（マイコン）および環境
Arduino(ATmega328p)、M5Stack(ESP32)、Nucleo-F303RE(STM32)を、Arduino IDEにて扱う。

## サンプル内容
あるタスク（loop()）がシリアル通信によりPCからダミーデータを受けると、loop()内で定義されているカウンタ値を別タスク（Task1()）に伝え、その別タスクがシリアル通信によりPCにそれを伝えるというもの。例えば、次のような結果が得られる。
![結果.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/35cb2eea-3ebf-b80e-8781-06e69adfbe35.png)

## サンプルソースコード
```c++:CompBoard0.ino
//#define ARD
#define ESP32
//#define STM32

#ifdef ARD     // ARDUINO word NG for STM32
#include <Arduino_FreeRTOS.h>
#include <queue.h> 
#define STACK_SIZE (64+32)  // 80 NG
#endif

#ifdef ESP32
#define STACK_SIZE (512+128+64)  // 640+32+16 NG
#endif

#ifdef STM32
#include <STM32FreeRTOS.h>
#define STACK_SIZE (64+32+16)    // 96 NG
#endif

TaskHandle_t xTask;
QueueHandle_t qMsg;

void Task1(void *arg) {
  uint32_t count;
  char buf[8];
  for (;;) {
    if (xQueueReceive(qMsg, &count, portMAX_DELAY) == pdPASS) {
      sprintf(buf, "N=%d", count);
      Serial.println(buf);
    }
    vTaskDelay(1);
  }
}

void setup() {
  Serial.begin(9600);
  qMsg = xQueueCreate(1, sizeof(uint32_t));
  xTaskCreate(Task1, "Task1", STACK_SIZE, NULL, 0, &xTask);
#ifdef STM32
  vTaskStartScheduler(); // ESP32: Must not exist;  STM32: Must,  ARD: Either OK
#endif  
}

void loop() {
  static uint32_t val = 0;
  if (Serial.available()) {
    (void)Serial.readString();     
    xQueueSend(qMsg, &val, portMAX_DELAY);
    val++;
  }
#ifdef ESP32
  vTaskDelay(1); // STM32 and ARD: Must not exist;  ESP32: Either OK
#endif
}
```

- setup()：タスクTask1()の作成、タスクloop()とタスクTask1()との通信用のキューを作成する。
- loop()：シリアルからデータを受けたら、データを読み捨て、キューにカウンタ値(val)を入れる。
- Task1()：キューにデータがある場合、カウンタ値(count)を読み取り、それを加工したデータをシリアルに送信する。

なお、使用するマイコンに応じて、「#define ARD」（Arduino）、「#define ESP32」、「#define STM32」のいずれかを定義する。

## 結果＆考察
各マイコン（Arduino(ATmega328p)、M5Stack(ESP32)、Nucleo-F303RE(STM32)）での差を下記表に示す。

||必要スタックサイズ(16バイト単位)|setup()のvTaskStartScheduler()|loop()のvTaskDelay()|
|---|:-:|:-:|:-:|
|Arduino|96|有無関係なし？|有ると動作せず|
|M5Stack|704|有ると動作せず|有無関係なし？|
|Nucleo|112|必須|有ると動作せず|

かなり差があることが判明。

- 「有ると動作せず」とは、上述した結果が得られないことを意味する。
- 「有無関係なし？」とは、vTaskStartScheduler()やvTaskDelay()が、有っても無くても、上述した結果が得られていることを意味する。
- ESP32(M5Stack)にて必要なスタックサイズが突出している。

あくまで私の環境の結果であり、すべてのケースに当てはまるかどうかまでは不明である。

### おまけ
- タスク生成時のタスク優先度を変えてみたが、結果は変わらない様子（詳細未調査）。
- 「#define ARDUINO」がある状態で、Nucleo(STM32)のBuildはできず。
plunkerでcssフレームワーク その6

#概要

plunkerでcssフレームワークやってみた。
spectre使ってみた。

#サンプルコード

```
<link rel="stylesheet" href="https://unpkg.com/spectre.css/dist/spectre.min.css">
    <link rel="stylesheet" href="https://unpkg.com/spectre.css/dist/spectre-exp.min.css">
```

#成果物

https://embed.plnkr.co/plunk/byfthpEwis85xpdK

以上。
plunkerでcssフレームワーク その5

#概要

plunkerでcssフレームワークやってみた。
material使ってみた。

#サンプルコード

```
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:regular,bold,italic,thin,light,bolditalic,black,medium&amp;lang=en">
<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
<link rel="stylesheet" href="https://code.getmdl.io/1.2.1/material.grey-orange.min.css">
```

#成果物

https://embed.plnkr.co/plunk/7G3KD4Mzm68kcSq5

以上。
plunkerでcssフレームワーク その4

#概要

plunkerでcssフレームワークやってみた。
tailwind使ってみた。

#サンプルコード

```
<link href="https://unpkg.com/tailwindcss@1.4.0/dist/tailwind.min.css" rel="stylesheet">
```

#成果物

https://embed.plnkr.co/plunk/vL7N4D1bDlBhthu7

以上。
plunkerでcssフレームワーク その3

#概要

plunkerでcssフレームワークやってみた。
jquery.mobile使ってみた。

#サンプルコード

```
<link rel="stylesheet" href="//code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.css" />
<script src="//code.jquery.com/jquery-1.11.1.min.js"></script>
<script src="//code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.js"></script>
```

#成果物

https://embed.plnkr.co/plunk/JyKKMjBmMxGdOCzJ

以上。
plunkerでcssフレームワーク その2

#概要

plunkerでcssフレームワークやってみた。
jquery-ui使ってみた。

#サンプルコード

```
<link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
    <script src="https://code.jquery.com/jquery-1.12.4.js"></script>
    <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
```

#成果物

https://embed.plnkr.co/plunk/q6XP76ddoo47IK8v

以上。
plunkerでcssフレームワーク

#概要

plunkerでcssフレームワークやってみた。
font-awesome使ってみた。

#サンプルコード

```
    <link href="//maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet">  

```

#成果物

https://embed.plnkr.co/plunk/Kj74uNaQtS4rW55d6mGW

以上。
Python: ２歳児の語彙でWordcloud

完成品
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/fe7ee166-d0f6-47e9-80d4-0cd37fb0f1a2.png)


## 用意するもの

- `pip install wordcloud`
- フォントファイル、以下では `mini-wakuwaku.otf` を使用した。
    - http://mini-design.jp/font/mini-wakuwaku.html
    - https://photoshopvip.net/japanese-kawaii-free-fonts
- **イヤイヤする２歳児を観察し発言を耳コピ** 


```wordcloudtest.py
from wordcloud import WordCloud

text = "やだ, \
       やだ,\
       ばす,\
       ちがうの,\
       ばす,\
       やだ,\
       こっち,\
       こっち,\
       やだ,\
       ぱとかー,\
       こっち"

wordcloud = WordCloud(background_color="white",
    font_path="./mini-wakuwaku.otf",
    width=800,height=600).generate(text)

wordcloud.to_file("./wordcloud_sample.png")

```

## 参考記事

工夫はない。初心者向け。いくらでも凝ったことをやろうかなと思えるが、オシャレなものは既に色々あったので、調査のみ。

https://qiita.com/str32/items/4539e417a9cb333abd52

https://qiita.com/kiyokiyo_kzsby/items/554c571404f3f9844aaf

https://qiita.com/uminchu987/items/07baa1a354cf96d2564b

https://qiita.com/Kuma_T/items/ec0d97bda154407cfccc

https://atmarkit.itmedia.co.jp/ait/articles/2102/05/news027.html


オマケ: 

https://github.com/TheRaphael0000/nge_wordcloud

*[他、スクレイピング注意事項](https://qiita.com/nezuq/items/c5e827e1827e7cb29011)


## まとめ

非常にネタみが強くなってしまったが、Wordcloud って、本来の用途以上にもはや芸術なのではと思うことが多々ある...。今回のソースではひとまず初心者の初心者でもこのくらいのかわいいお遊びができるというお話でした。ちなみに上の子（４歳女子）はこんなです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/781843a9-9dee-ccfb-44ca-da4178b00ce8.png)

### 追記

２歳児は３歳に、４歳児は５歳に成長した。最近の５歳の発言を追記しておく。

```py
import MeCab
import unidic
from wordcloud import WordCloud

sample_txt = 'ぞうらいおんまちのさいごのもじをつなぐとなにになるでしょう'

wakati = MeCab.Tagger('-Owakati')
result = wakati.parse(sample_txt)

print(result)

result = result.replace(' ', ',')
print(result)

wordcloud = WordCloud(background_color="white",
    font_path="./mini-wakuwaku.otf",
    width=800,height=600).generate(result)

wordcloud.to_file("./wordcloud_sample2.png")
```

```
root@0230359a1b81:~/opt# python mecab.py
ぞう らいおん まち の さいご の もじ を つなぐ と なに に なる でしょう

ぞう,らいおん,まち,の,さいご,の,もじ,を,つなぐ,と,なに,に,なる,でしょう,
```


![wordcloud_sample2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/480a0422-3c53-1d0e-9e6d-9537b7fe169b.png)


:hankey:... 

以上お楽しみいただければさいわいです。
yukicoder contest 296 参戦記

# yukicoder contest 296 参戦記

## [A 1511 A ? B Problem](https://yukicoder.me/problems/no/1511)

使っているプログラミング言語の論理和と論理積の演算子が分かっていれば書くだけ.

```python
A, B = map(int, input().split())

print((A | B) - (A & B))
```

## [B 1512 作文](https://yukicoder.me/problems/no/1512)

まず文字列内の文字がソート順に並んでないものは良い文字列になることがなく、選択できないので省く. 次に aa の後に ab は接続できても、その逆は無理なのでソートする. 後は末尾文字をキーとした DP をすれば解ける. 開始文字が DP のキー以上のときに、末尾のキーに対して最大長を取る DP をすればいい.

```python
from sys import stdin

readline = stdin.readline

N = int(readline())
S = [readline()[:-1] for _ in range(N)]

dp = {'a': 0}
for s in sorted(S):
    if ''.join(sorted(s)) != s:
        continue
    start = s[0]
    last = s[-1]
    l = len(s)
    dp.setdefault(last, 0)
    for c in 'zyxwvutsrqponmlkjihgfedcba':
        if c not in dp:
            continue
        if start < c:
            continue
        dp[last] = max(dp[last], dp[c] + l)
print(max(dp.values()))
```
マイナビプログラミングコンテスト2021(AtCoder Beginner Contest 201) 参戦記

# マイナビプログラミングコンテスト2021(AtCoder Beginner Contest 201) 参戦記

2週連続でコケてしまった…….

## [ABC201A - Tiny Arithmetic Sequence](https://atcoder.jp/contests/abc201/tasks/abc201_a)

2分で突破. 書くだけ.

```python
A = list(map(int, input().split()))

A.sort()

if A[2] - A[1] == A[1] - A[0]:
    print('Yes')
else:
    print('No')
```

## [ABC201B - Do you know the second highest mountain?](https://atcoder.jp/contests/abc201/tasks/abc201_b)

4分で突破. 高さがそれぞれ相異なることが保証されているので、何も考えずソートすればいい.

```python
N = int(input())
ST = []
for _ in range(N):
    S, T = input().split()
    ST.append((int(T), S))

ST.sort(reverse=True)
print(ST[1][1])
```

## [ABC201C - Secret Number](https://atcoder.jp/contests/abc201/tasks/abc201_c)

14分で突破. 最大でも10<sup>4</sup>通りしかないので、全部生成してしまうことにした. Python の itertools がパワフルなので、全生成してよければ簡単.

```python
from itertools import product, permutations

S = input()

if S.count('o') > 4 or S.count('x') == 10:
    print(0)
    exit()

base = []
option = []
for i in range(10):
    if S[i] == 'o':
        base.append(str(i))
    if S[i] != 'x':
        option.append(str(i))

result = set()
for p1 in product(option, repeat=4 - len(base)):
    for p2 in permutations(base + list(p1)):
        result.add(''.join(list(p2)))
print(len(result))
```

## [ABC201D - Game in Momotetsu World](https://atcoder.jp/contests/abc201/tasks/abc201_d)

73分半で突破. RE3、TLE6. メモ化再帰で素直にシミュレートすればいいかと思いきや、Python / PyPy では TLE となった. Go で書き直しても 457ms だったので、そりゃダメだなあと思った.

```go
package main

import (
	"bufio"
	"fmt"
	"math"
	"os"
	"strconv"
)

func max(x, y int) int {
	if x > y {
		return x
	}
	return y
}

var (
	cache []int
	H, W  int
	A     [][]int
)

const (
	INF = math.MaxInt64
)

func f(y, x int) int {
	key := (y << 12) + x
	if y == H-1 && x == W-1 {
		return 0
	}
	if cache[key] != INF {
		return cache[key]
	}
	result := -INF
	if y < H-1 {
		result = max(result, A[y+1][x]-f(y+1, x))
	}
	if x < W-1 {
		result = max(result, A[y][x+1]-f(y, x+1))
	}
	cache[key] = result
	return result
}

func main() {
	defer flush()

	H = readInt()
	W = readInt()
	A = make([][]int, H)
	for i := 0; i < H; i++ {
		A[i] = make([]int, W)
		s := readString()
		for j := 0; j < W; j++ {
			if s[j] == '-' {
				A[i][j] = -1
			} else if s[j] == '+' {
				A[i][j] = 1
			}
		}
	}

	cache = make([]int, 1<<24)
	for i := 0; i < len(cache); i++ {
		cache[i] = INF
	}

	result := f(0, 0)
	if result == 0 {
		println("Draw")
	} else if result > 0 {
		println("Takahashi")
	} else if result < 0 {
		println("Aoki")
	}
}

const (
	ioBufferSize = 1 * 1024 * 1024 // 1 MB
)

var stdinScanner = func() *bufio.Scanner {
	result := bufio.NewScanner(os.Stdin)
	result.Buffer(make([]byte, ioBufferSize), ioBufferSize)
	result.Split(bufio.ScanWords)
	return result
}()

func readString() string {
	stdinScanner.Scan()
	return stdinScanner.Text()
}

func readInt() int {
	result, err := strconv.Atoi(readString())
	if err != nil {
		panic(err)
	}
	return result
}

var stdoutWriter = bufio.NewWriter(os.Stdout)

func flush() {
	stdoutWriter.Flush()
}

func println(args ...interface{}) (int, error) {
	return fmt.Fprintln(stdoutWriter, args...)
}
```