OmniAICreator/Qiita-1.07M huggingface dataset:
Flutter iOS 幅320px端末で status barを隠す

iPhone SEサイズの場合で、表示したいものの領域が足りなくなり、ステータスバーを隠すことで、領域を増やす対応をしたい場合があったのでメモ。

画面のサイズの取得と、ステータスバーの非表示のコードです。

```dart
if (MediaQuery.of(context).size.width == 320) {
 SystemChrome.setEnabledSystemUIOverlays([]);
}
```

~~アプリケーションの開始直後からこの設定を行いたかったので、main()の中でやりたいところでしたが、contextへアクセスが難しいのでコードを書く場所を悩みました。~~
~~Widgetのbuild内に書くのは好ましくないような気がしたので、最終的にはinitState()内に書くことにしました。~~
~~しかし、initState（）が呼び出された時には、contextが取れずdelayを付けて実行する形にしました。~~

contextのアクセスが、didChangeDependencies内であれば安全ということだったので、最終的に、didChangeDependencies() を overrideして、そこに書いた。
[api.flutter.dev: didChangeDependencies method
](https://api.flutter.dev/flutter/widgets/SingleTickerProviderStateMixin/didChangeDependencies.html)

```dart
@override
  void didChangeDependencies() {
    super.didChangeDependencies();

    //幅320px端末で status barを隠す
    if (MediaQuery.of(context).size.width == 320) {
      SystemChrome.setEnabledSystemUIOverlays([]);
    }
  }
```

### 動作コード
こちらに一式用意しています。
https://github.com/quqjp/flutter-test

コード箇所はこちら。
https://github.com/quqjp/flutter-test/tree/master/lib/sample2


### 参考ページ
- stackoverflow : [Hide status bar only on iPhone 5, 5s, SE](https://stackoverflow.com/questions/46243548/hide-status-bar-only-on-iphone-5-5s-se)
- stackoverflow : [Flutter get context in initState method](https://stackoverflow.com/questions/49457717/flutter-get-context-in-initstate-method)
マイクロサービス化でやってしまった2つのアンチパターンとその教訓

Webエンジニアの @nagata03 です。1年3ヶ月間、モノリシックなWebサービスのマイクロサービス化に携わってきました。そこで経験した2つのアンチパターンとそこから得た教訓について、走り書きですが残しておこうと思います。

## アンチパターンその１. 分断されたモノリス

### 何をしたか

- モノリシックなサービスを toC と toB のコンテキスト境界で２つに分割した

### 何が起こったか

- **超巨大モノリス１つ**から**巨大モノリス２つ**が爆誕した
- 本来のマイクロサービスアーキテクチャのメリットが享受できていない
    - 改修時の影響範囲調査は以前より楽になったと思うがまだ決して楽ではない
    - デプロイ早くなっていない
    - 好きな時間にデプロイができていない
- 分割に時間がかかった（分割開始してから約3年？まだ分割しきれていない）
- 「開発の難易度が上がる」とか「APIコールによるパフォーマンス低下」などの**デメリットの方が目立ってしまった**

### 教訓

- マイクロサービス化するなら**小さく切り出して**いこう
    - 2週間でつくり直せる規模で

## アンチパターンその２. マイクロサービス化専門チームによるマイクロサービス化

### 何をしたか

- アンチパターンその１の教訓を活かし、小さくサービスを切り出した
- 切り出す対象のサービスを管理するチーム（以下「開発チーム」）**とは別に**、マイクロサービス化を専門とするチーム**だけ**でマイクロサービス化を実施

### 何が起こったか

- 開発チームに、マイクロサービス化に対する納得感を持ってもらえていない
    - サービス開発で手一杯
    - マイクロサービス化どころではなかったりする
- マイクロサービスの開発手法や運用方針がうまく引き継げていない
    - マイクロサービス化専門チームの中ではマイクロサービス化の過程でいろいろ共有できている
    - が、開発チームには過程をすっ飛ばして結果だけを共有
    - 開発チームとしては結果だけ見せられても「へー」とか「？？？」となってしまう

### 教訓

- マイクロサービス化は開発チームと一丸となって進めるべき
- マイクロサービス化を専門チームでやるのであれば開発チームと密にコミュニケーションを取る必要がある
- 開発チームが自律的にマイクロサービス化を進められるような下地を作る必要がある
    - マイクロサービス化に納得感を持ってもらう
    - マイクロサービス化およびその後の開発・運用のノウハウを蓄積し、簡潔にまとめ、共有する
    - とはいっても最初はどうしても手探りになるのでトライ＆エラーを繰り返してブラッシュアップしていく

## おわりに

- モノリシックなアーキテクチャからマイクロサービスアーキテクチャへの移行は絶対に一筋縄ではいかない
- アンチパターンはあるが決まった正解はないし、正解は組織によって違ってくると思う
- 組織も変化していく必要がある
- 目的を見失わないことが大事（マイクロサービス化によって何を実現したいのか！）

以上、乱筆乱文失礼しました。
SQL Server の使用ポートをコマンドで変更する

#はじめに
SQL Serverのインストールから設定を全てC#のプログラムから実行する必要が出ました。
その際に使用ポートを設定をコマンドで実行する方法が見つからずに詰まったので今後のためにメモを残します。
#使用ポートの変更方法
**以下のレジストリパスの「TcpDynamicPorts」と「TcpPort」を書き換えることで変更できました。**


``` :レジストリパス
コンピューター\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL{バージョン}.{インスタンス名}\MSSQLServer\SuperSocketNetLib\Tcp\IPAll

TcpDynamicPorts = ""
TcpPort = 使用したいポート番号
```
SQL Serverのバージョンを調べるには[こちら](https://sql-oracle.com/sqlserver/?p=208 "SQLServer バージョン")が参考になりました。

コマンドプロンプトから実行するとこんな感じでしょうか。

```bash:コマンドプロンプト
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL{バージョン}.{インスタンス名}\MSSQLServer\SuperSocketNetLib\Tcp\IPAll" /v "TcpDynamicPorts " /t REG_SZ /d ""  /f 
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL{バージョン}.{インスタンス名}\MSSQLServer\SuperSocketNetLib\Tcp\IPAll" /v "TcpPort " /t REG_SZ /d "1433"  /f 
```

実際にプログラムに組み込んだコードはこんな感じです。

```C#:C#コードサンプル
//レジストリを書き換えて使用ポートを設定した値にする。
RegistryKey key = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);
key = key.OpenSubKey(@"SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL{バージョン}.{インスタンス名}\MSSQLServer\SuperSocketNetLib\Tcp\IPAll", true);

//レジストリに書き込み
key.SetValue("TcpPort","1433");
key.SetValue("TcpDynamicPorts", "");

//閉じる
key.Close();
```

#おわりに
以上、SQL Serverの使用ポートをコマンドで変更する方法でした。
初めての記事なので多分今後編集予定です。。
#Rails + #MySQL で INSERT による transaction & Rollback を利用しての排他制御を試してみるが、これはうまくいかないな

# Console A

Start transaction
Insert to DB
Sleep some seconds

```rb
[6] pry(main)> SomeModel.transaction { SomeModel.create(unique_string: 'some unique key'); sleep 10 }
   (0.7ms)  BEGIN
  SomeModel Create (0.9ms)  INSERT INTO `stripe_webhook_succeeded_events` (`unique_string`, `created_at`) VALUES ('some unique key', '2019-12-25 01:43:00')
```

# Console B

After INSERT in Console A
Run INSERT in Conssole B with same unique string
It will be blocked but Not raise error immediately

```rb
[3] pry(main)> SomeModel.transaction { SomeModel.create(unique_string: 'some unique key'); sleep 10 }
   (0.8ms)  BEGIN
```

# Console A

After Sleep some seconds
committed After sleep

```rb
[6] pry(main)> SomeModel.transaction { SomeModel.create(unique_string: 'some unique key'); sleep 10 }
   (0.7ms)  BEGIN
  SomeModel Create (0.9ms)  INSERT INTO `stripe_webhook_succeeded_events` (`unique_string`, `created_at`) VALUES ('some unique key', '2019-12-25 01:43:00')
   (8.1ms)  COMMIT
```

# Console B

After INSERT in Console A
INSERT Rollbacked

```rb
[3] pry(main)> SomeModel.transaction { SomeModel.create(unique_string: 'some unique key'); sleep 10 }
   (0.8ms)  BEGIN
  SomeModel Create (8756.6ms)  INSERT INTO `stripe_webhook_succeeded_events` (`unique_string`, `created_at`) VALUES ('some unique key', '2019-12-25 01:43:02')
   (7.7ms)  ROLLBACK
ActiveRecord::RecordNotUnique: Mysql2::Error: Duplicate entry 'some unique key' for key 'index_stripe_webhook_succeeded_events_on_unique_string': INSERT INTO `stripe_webhook_succeeded_events` (`unique_string`, `created_at`) VALUES ('some unique key', '2019-12-25 01:43:02')
from /usr/local/bundle/gems/mysql2-0.5.2/lib/mysql2/client.rb:131:in `_query'
Caused by Mysql2::Error: Duplicate entry 'some unique key' for key 'index_stripe_webhook_succeeded_events_on_unique_string'
from /usr/local/bundle/gems/mysql2-0.5.2/lib/mysql2/client.rb:131:in `_query'
```



# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2869








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
WordPress Gutenbergで絵文字プラグイン

# はじめに
WordPressがエディターをGutenbergにしてから結構経ちましたね。
自分でブログを書く分には、お気に入りなんですが、仕事で絵文字のプラグインを入れてと言われるとつらい

だいたい、前までは絵文字プラグインといえば「Native Emoji」だったと思いますが、Gutenbergになってからは使えないよと

まぁ別に絵文字をコピペできる[サイト](https://fromkato.com/emoji)もあるので、そういうの使えばいいんじゃ？とも思う
でも仕事で指示されたから...

# [Emoji Autocomplete Gutenberg](Emoji Autocomplete Gutenberg)
↑こちらです！

使い方はいたってシンプル

絵文字を入力したい箇所に半角コロン「:」を入力するだけで、候補が表示されます。
「heart」「star」とか入力すると絞り込みがかかります。

![スクリーンショット 2019-12-26 11.40.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392006/2ca10382-edf2-95e0-9ff8-742783af29eb.png)
![スクリーンショット 2019-12-26 11.41.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392006/e6c7c183-7e0e-a967-230a-b4326523ad94.png)


でも、英語なので英単語知らないと自分のほしい絵文字出てこないぞ！！！
スライスで1つ飛ばし

※だいぶざっくりとしてるのでコメントwelcomeです

スライスには引数が3つ埋め込めるらしい。
始点、終点、飛ばし数の3つ。
2つだけだと思ってました。
そもそも引数っていう言い方が違う気がする。

cf) [他の方のQiita記事](https://qiita.com/yossyyossy/items/0c8dc2ed53466d970fe4)

```python
a = [1,2,3,4,5,6,7,8,9]
print(a[1::2])
```

これで[2,4,6,8]と出力された。
sedのsコマンドの区切り文字について

例えばシェルスクリプトでパス書き換えするのに

```shell
PATH="aaa/bbb/ccc"
sed -i "s/src=\"hoge\"/src=\"${PATH}\"/g";
```
これだと変数展開されませんでした。

文字列としてスラッシュ含むような場合
sedの区切り文字に認識されてた様子。

区切り文字って別の文字使えたんですね...

```shell
sed -i "s:src=\"hoge\":src=\"${PATH}\":g";
```

これで展開できた
おわり。
RTPatch Tips

## pbindスクリプトファイル[Success]セクションにはRTパッチ適用後のダイアログに出力する文字列を定義するが、必ず改行すること。
そうでないと、ダイアログ出力文字列の末尾が文字化けする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548182/d54c72ef-5065-4407-fd70-c4aecfdccff5.png)


## patchbld.exeでpatchbldスクリプトファイルを指定する際には「@」を付ける。
> patchbld.exe @{patchbldスクリプトファイル}

patchbldスクリプトファイル名の先頭に「@」を付けないと、
patchbldスクリプトファイル自身がパッチで適用するファイルと見なされてしまう。

## レジストリしか更新しないパッチを作るには。
レジストリだけを更新するパッチを作ろうと思った。
そこでpatchbldスクリプトファイルに、「REGSCRIPT {レジストリコマンドファイル}」だけ書いてビルドした。
RTPatchドキュメントファイル（.rtdファイル）は出力したが、
RTPatchモジュール（.rtpファイル）は出力されなかった。
Patchbld.ERRファイルを吐かないので理由が分からない。

何かのファイル操作が必須なのかな？と考え、
TEMPFILE句（一時的にファイルを展開し、RTPatchが終了したら削除してくれる）でダミーファイルを指定したら、ビルドできた。模様。

```
TEMPFILE "NEWDIR\dummy.txt"
REGSCRIPT "reg_cmd.txt"
```

もしかしたら、patchbldオプションなどで指定する方法があるのかも知れないけれど、現在の貧弱なマニュアル環境からは見つけられなかった...
UbuntuでCCFinderXを使いたい人向けメモ

重複コード検出として有名な[CCFinderX](http://www.ccfinder.net/)だが，バイナリは32bitのWindowsとUbuntuしか提供されていないため，最新のUbuntuで使いたければ自分でビルドする必要がある．
ソースコードは多くの人が再配布しているが，ビルドで詰まることが多かったので，備忘録として書き残しておく．
(注. 本記事ではあくまでCCFinderXをUbuntuで利用できるようになることを目的としているため，GUIフロントエンドであるGemXの利用は保証しない)

## ソースコードの入手
ここからcloneしてくる
https://github.com/radekg1000/ccfinderx

## 必要な依存関係のインストール
以下を`sudo apt install`で片っ端からインストールする．
インストールできないものはとりあえず放置
`autoconf, automake, build-essential, libboost-all-dev, openjdk-7-dev, ant, libicu4j-java, libswt-gtk-java, libtrove-java, libswt-cairo-gtk-3-jni`

## ビルド
cloneしてきたプロジェクトの`README.md`通りにビルドを実行する
おそらく`3. ../configure`で詰まる

## `configure`の書き換え
`ccfinderx/configure`を書き換える
具体的には17593行目の

```sh
boost_major_version=`echo "boost_cv_lib_version" | sed 's/_//;s/_.*//'`
```

を

```sh
boost_major_version=153
```

に書き換える

## 再ビルド
`3. ../configure`から再びビルド
おそらく`4. make`で詰まる

## `ccfx.cpp`の書き換え
`ccfinderx/ccfx/ccfx.cpp`を書き換える
具体的には1877行目の

```cpp
fileLength == 0
```

を消す

## 再々ビルド
`4. make`を実行すると`ccfinderx/build`以下にバイナリができているはず
お疲れ様でした
GolangのJSONでomitemptyしても出力されてしまう

タイトルどおり。
omitemptyの前にスペースを入れるとomitemptyが有効にならない。

ビルド環境 Go1.13

NG例

```go
type hoge struct {
    Str string `json:"str, omitempty"`
}
```

OK

```go
type hoge struct {
    Str string `json:"str,omitempty"`
}
```
axiosライブラリを使ったHTTP通信


# axios とは
**HTTP通信を簡単に行うことができるJavascriptライブラリ**


### GET通信を行う

```index.js

// GET通信

axios.get('http://localhost:3000/users')

    // thenで成功した場合の処理をかける
    .then(response => {
        console.log('status:', response.status); // 200
        console.log('body:', response.data);     // response body.

    // catchでエラー時の挙動を定義する
    }).catch(err => {
        console.log('err:', err);
    });
```

また、以下のようにaxiosにconfigオブジェクトを渡す形でも、`GET通信`を行うことができます。

```index.js

// configオブジェクトを使ったGET通信の例
axios({
    method : 'GET',
    url    : 'http://localhost:3000/users'
}).then(response => console.log(response.status));
```

### POST通信

POST通信を行う場合には、axios.post関数を用います。

```index.js

// POST通信
// POSTデータは、axios.postの第2引数で渡します.
const data = { firstName : 'Yohei', lastName : 'Munesada' };
axios.post('http://localhost:3000/users', data).then(response => {
    console.log('body:', response.data);  // Yohei Munesada
});

// または、configオブジェクトを使う場合
axios({
    method : 'POST',
    url    : 'http://localhost:3000/users',
    data   : { firstName : 'Yohei', lastName : 'Munesada' }
}).then(response => console.log(response.status));

```
VS2019環境でのUE4.23.1エンジンビルドで "fatal error C1083: Cannot open include file: 'metahost.h'" が出たときの対処法

# 前提
- UE4.23.1 （from Github source code build)
- VisualStudio 2019 Community
    - 開発環境の構築は済んでいるものとする

# 事象
Chaos用にUE4.23.1をソースコードからビルドする際、下記のエラーが発生してビルドが完了しない

```
fatal error C1083: Cannot open include file: 'metahost.h'
```

ビルドに必要な `.NET Framework v4.6.2 SDK` は入っているのになぜ…？
（`metahost.h`は `C:\Program Files (x86)\Windows Kits\NETFXSDK\X.X.X\Include\um` あたりに存在する）

UnrealLightmassのビルド中に起こっている模様


# 解決策
- もしSDK4.6.2以上（`4.7`とか`4.8`）が入っている場合は、それらをUninstallする

上位のSDKが入っているとそっちが優先されるのか、指定のファイルが見つからずビルドに失敗する
ソースコード内にレジストリキーがハードコードされているのが問題になっている…らしい？


# 参考文献
https://forums.unrealengine.com/development-discussion/engine-source-github/1679341-don%60t-compile-from-source-fatal-error-c1083-cannot-open-include-file-metahost-h
サッカーのトレセンのような役割をオープンソースで担えるか

日本サッカー協会には、トレーニングセンター制度（略称トレセン）があります。

http://www.jfa.jp/youth_development/national_tracen/

>トレセンでは、チーム強化ではなく、あくまでも「個」を高めることが目標です。世界で闘うためには、やはり「個」をもっともっと高めていかなくてはなりません。レベルの高い「個」が自分のチームで楽にプレーができてしまって、ぬるま湯のような環境の中で刺激なく悪い習慣をつけてしまうことを避けるために、レベルの高い「個」同士を集めて、良い環境、良い指導を与えること、レベルの高い者同士が互いに刺激となる状況をつくることがトレセンの目的です。テクニックやフィジカルの面から、その「個」のレベルに合ったトレーニング環境を提供することは、育成年代において非常に重要な考え方です。

プログラマでも、10歳の頃から、こういった社会制度があれば、個が伸びるかもしれません。

新たに何か組織を作るのは大変かもしれず、オープンソース事業がこの役割を担えないか考えてみます。

#現状

子供向けの行事を記録します。

## セキュリティ・キャンプ

「セキュリティキャンプ」そんな素敵な

https://qiita.com/kaizen_nagoya/items/7c94180fb0415ef83f4d

一般社団法人セキュリティ・キャンプ協議会事務局
https://www.security-camp.or.jp

2019年度セキュリティ・キャンプ講師一覧
https://www.security-camp.or.jp/instructor/index.html

#道具類

## Raspberry PI
https://www.raspberrypi.org

## Scratch 3.0
https://ja.scratch-wiki.info/wiki/Scratch_3.0

## ichigojam
https://ichigojam.net

#考察

## 検索

## 質疑
http://quora.com

http://okwave.com

## 助言

## 評価

評価は作ったもののダウンロード数が一つの指標。
記事であればviews。

いいね(star)などの機能がある場合には、その数。

# 参考資料

プログラマが大学に推薦入学、大学院に直接入学できるような仕組みを検討する

https://qiita.com/kaizen_nagoya/items/0c829f73e1df987032d0

＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
Ruby表示メソッド p、pp、puts、print

#Rubyの表示メソッドの違いについて

##1.printメソッド
引数を出力するメソッド

##2.putsメソッド
引数を出力するメソッド
printと違い、引数の最後に改行が自動で入る

##3.pメソッド
引数を表示をしたうえで、引数のオブジェクトが分かりやすいように表示させる
デバック用

##4.ppメソッド
引数を表示をしたうえで、引数のオブジェクトが分かりやすいように表示させる
pと違い、適切なインデント、適切な改行が特徴であり、配列を扱うときに効果大
デバック用

##5.参考文献

https://www.sejuku.net/blog/16119

https://qiita.com/naoge/items/f5d84581d3a301a9c22f
競馬データをスクレイピングしてみた


先日、Twitterで競馬についてのツイートをみました。ある大学生さん、自作のAIに有馬記念を予想させ、118万当たったというツイートがネットで話題になりました。本当にAIに予想できるの、競馬というもの？
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262932/c245917e-94ac-a0bc-4ac2-0219f3202c4f.png" width=50%>

グーグルしてみると、競馬予想の方法が様々ですが、AIは今年から登場しました。AIは統計解析によって競馬の結果を予測しているそうです。競馬にも技術介入の時代ですね。

ですが、競馬の統計解析を行うには、解析するためのデータがなければ何も始まりません。ということで、今回は競馬のデータをスクレイピングしてみることにします。

今回、JRA公式サイトのデータソースをスクレイピングします。JRA公式サイトには、有馬記念はもちろん、過去の様々なレースの成績データを見ることができます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262932/bc09e253-9d74-9d75-2096-f7969985ddcd.png" width=50%>


データを取得には[Octoparse](https://www.octoparse.jp/)を使います。Octoparseは使いやすい[Webスクレイピングツール](https://www.octoparse.jp/blog/the-10-best-web-scraping-tools/)で、プログラミングを必要としなく誰でも簡単にWebデータを取得できます。これから、2019年の有馬記念のデータを収集します。

さて、始めましょう！



#ステップ1.　対象のWebページを設定する

Octoparseを起動して、ホーム画面の「カスタマイズモード」に表示されている「+ タスク」ボタンをクリックします。「Webサイト」に対象のURLを入力し、「URLを保存する」ボタンをクリックします。

下記のURLを使います。

http://jra.jp/datafile/seiseki/g1/arima/result/arima2019.html

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262932/61154e13-bea7-3c60-8071-609728b10213.png" width=50%>


#ステップ2.　取得する項目を設定する

今回は着順、馬名、騎手、調教師などテーブルにあるデータを全部取得します。

まず、着順の「1」をクリックすると、緑色に変わり、選択されたことを示します。残りの着順は赤色に変わり、類似した要素として識別されたことを示します。各行目のデータを行別で取得するには、「操作ヒント」でエリア拡大のボタンをクリックし、一行目のデータが全部選択されるようにします。テーブルの構造だから、ソースコードには各行のタグは「TR」です。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262932/948dc175-c345-09e5-29f9-3cd354cfc7bd.png" width=80%>

各行にあるデータを細かく取得するため、「操作ヒント」で「すべてのサブ要素を選択する」をクリックします。そうすると、16行にあるデータはすべて選択され、「すべて選択」、「選択したデータを抽出する」を順番にクリックすると、Octoparseはデータを抽出します。
![微信截图_20191225183349.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262932/dbc2a54a-38c0-4471-5b19-eb78ab3fa69b.png)

フィールド名を編集し、余計なデータを削除することもできます。
![图片6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262932/bd56fbab-7a40-784d-08db-77741a6cd9ba.png)

「ループアイテム」の各項目をクリックして、データが正しく抽出されるかどうかを確認することができます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262932/6925abd6-cbb4-b148-f773-ea3350be77ec.png" width=80%>

検証したところ、「枠」のデータが取得されません。その部分は画像で表示されるのです。しかし、その数字は画像のURLに隠されています。そのため、まず画像のURLを取得し、それから数字を取得します。

http://jra.jp/JRADB/img/waku/3.png

「枠」の画像をクリックし、「操作ヒント」で「選択した画像のURLを抽出する」をクリックすると、データを取得できます。
![图片8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262932/0e7ede4a-65d7-b28d-5766-b88523f33c15.png)


画像のURLから数字を取得には、２つの方法があります。１つはエクセルの「切り替える」機能です。もう1つはOctoparseの[データ再フォーマット機能](https://www.octoparse.jp/tutorial/re-format-data-extracted/)です。どっちでも簡単ですので、ここでは省略します。

 
#ステップ3.　データ抽出を実行する

これで、スクレイピングのワークフローが完成しました。簡単でしょう！「抽出の開始」をクリックし、「ローカル抽出」を選択し、実行してみると、とてもきれいにまとまてくれました！
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262932/34581054-2d3c-9f1f-1b69-ca84faff7296.png" width=80%>


 
この方法でほか年度のデータも取得できます。競馬のデータはほぼテーブルで表示されるから、テーブルのスクレイピングを把握すれば、簡単に取得できますね。最近、Octoparseは初心者への「Hello World」を用意し、テストサイトを使って、スクレイピングの方法を紹介しています。テーブルのスクレイピングデモもありますので、必要があれば、参考してみてください。

分析し予測しようとしますが、手元に適当な統計モデルがないし、やる気も尽きてしまったので、今回はここまでにしましょう（笑）。もし皆さんが予測モデルがあれば、教えてくださいね！
PHP ジェネレータについて

## ジェネレーター

>ジェネレータを使えば、シンプルな イテレータを簡単に実装できます。 Iterator インターフェイスを実装したクラスを用意する オーバーヘッドや複雑さを心配する必要はありません。
[PHP: ジェネレータとは - Manual](https://www.php.net/manual/ja/language.generators.overview.php)


 - ジェネレータは前方にしか進めないイテレータである。
 - 反復処理が始まれば巻き戻すことはできない。
 - 一度だけreturnするのでなく、必要に応じて何度も yield することができる。 
 - 遅延評価を作る時に使える。

```php
<?php
function gen_one_to_three()
{
    for ($i = 1; $i <= 3; $i++) {
        yield $i;
    }
}

$generator = gen_one_to_three();
foreach ($generator as $value) {
    echo $value,PHP_EOL;
}
/*
1
2
3
*/
```
- ジェネレータ関数が呼ばれると、反復処理が可能なオブジェクトを返す。(このオブジェクトは Iterator インターフェイスを実装しており、前方にしか進めない)

- このオブジェクトを (foreach ループなどで) 反復させると、 値が必要になるたびにPHPがオブジェクトの反復メソッドを呼ぶ。 

- ジェネレータが値を yield した時点の状態を保存しておき、 次に値が必要になったときにはそこから再開できる。

- yield できる値がなくなると、ジェネレータは終了する。
QualityForward Pythonライブラリを使ってテスト結果件数を集計する

[QualityForward](http://bit.ly/2t1yv1u)はテスト管理のクラウドサービスを提供しています。Web APIも提供しているのですが、Web APIを直接実行するのは面倒です。そこでPython向けのライブラリを開発中です（非公式）。

[goofmint/qualityforward-py: QualityForwardのPythonライブラリです](https://github.com/goofmint/qualityforward-py)

今回はPythonライブラリを使ってテスト結果を日ごとに集計するコードを解説します。

## ライブラリの読み込みと初期化

初期化は次のように行います。

```py
from qualityforward.QualityForward import QualityForward
q = QualityForward("0aa...340") # APIキー
```

## テスト結果の取得と集計

テスト結果を取得するためには、テストフェーズから順番にドリルダウンしてデータを取得する必要があります。

```py
# テストフェーズの取得
for test_phase in q.get_test_phases():
  # 各テストフェーズにおけるテストスイートアサインメントを取得
  for test_suite_assignment in test_phase.test_suite_assignments:
    # テストサイクルを取得
    for test_cycle in test_suite_assignment.get_cycles():
      # テストサイクルの取得
      test_cycle.get_results()
```

この集計結果を次のように出力してみます。

```py
for date in results:
    print(date)
    for result in results[date]:
        print(f'  {result}: {results[date][result]}')
```

## 実行

実行すると次のように出力されます。

```
$ python3 test.py
2019-08-16
  pass: 2
  fail: 1
2019-11-26
  pass: 4
  fail: 1
  skip: 1
  cut: 1
  block: 1
  qa: 1
2019-12-25
  pass: 3
  fail: 2
  skip: 1
  cut: 2
  block: 1
  na: 2
  qa: 2
2019-07-08
  pass: 38
  fail: 3
  block: 2
2019-07-09
  pass: 7
2019-08-15
  pass: 24
  fail: 1
```

日ごとにソートしたり、引数で特定範囲の日付のデータだけを表示するようにしてもいいでしょう。

## まとめ

QualityForward Pythonライブラリを使うことで、QualityForwardのWeb APIをPythonから簡単に使えるようになります。クラウド上にあるデータを加工したり、自社システムと連携させる、メール送信させるなど様々な使い方が考えられます。ぜひ試してみてください。

[QualityForward](http://bit.ly/2t1yv1u)

[goofmint/qualityforward-py: QualityForwardのPythonライブラリです](https://github.com/goofmint/qualityforward-py)
QualityForward Pythonライブラリをバージョンアップしました

[QualityForward](http://bit.ly/2R6KPFI)はテスト管理のクラウドサービスを提供しています。Web APIも提供しているのですが、Web APIを直接実行するのは面倒です。そこでPython向けのライブラリを開発中です（非公式）。

[goofmint/qualityforward-py: QualityForwardのPythonライブラリです](https://github.com/goofmint/qualityforward-py)

今回のバージョンアップで、QualityForward APIの全モデルに対応しました。現在は取得のみで、データの追加や更新には対応していませんので注意してください。

## 使い方

初期化は次のように行います。

```py
from qualityforward.QualityForward import QualityForward
q = QualityForward("0aa...340") # APIキー
```

プロジェクト、テナント（企業情報）は次のように取得できます。

```py
# プロジェクトの取得とテナント取得
print(q.get_current_project().tenant)
```

テストフェーズからドリルダウンしてテスト結果を取得する流れです。

```py
# テストフェーズの取得
for test_phase in q.get_test_phases():
  # 各テストフェーズにおけるテストスイートアサインメントを取得
  for test_suite_assignment in test_phase.test_suite_assignments:
    # テストサイクルを取得
    for test_cycle in test_suite_assignment.get_cycles():
      # テストサイクルの出力
      print(test_cycle.get_results())
```

テストスイートとバージョンを取得する流れです。

```py
# テストスイートを取得
for test_suite in q.get_test_suites():
  # テストスイートバージョンを取得
  print(test_suite.get_versions())
```

## まとめ

Pythonを使ってシステム開発を行っていたり、社内で使えるちょっとしたスクリプトを作っている方であればPythonライブラリが役立つはずです。テスト管理結果を定期的に取得したり、Slackへ通知したりするのにも使えるでしょう。

[QualityForward](http://bit.ly/2R6KPFI)
QualityForwardのテスト集計を返すSlackコマンドを作ってみた

社内の情報交換にSlackを使っている開発チームは多いと思います。テストがうまく進んでいるかどうかを毎回QualityForwardにログインして確認するのは面倒で、できれば情報が集客できるSlack上で確認したいはずです。

そこでQualityForward APIとGoogleスプレッドシートでサーバレスのSlackボットを作ってみました。

## 制限について

本来であればSlackからのコマンドを受けてQualityForward APIを実行したいのですが、Googleスプレッドシート側での処理時間もあってタイムアウトしてしまいます。そこで、[QualityForward APIでGoogleスプレッドシートに一日の作業件数を記録する]()で使ったスクリプトを用いて、集計は自動で行っておきます。そこに書かれた情報をSlackメッセージとして返却します。

## Slackボットについて

Slackボットは `/qf` でメッセージを受け付けます。その際、日付を指定するようにしました。これで過去の状態についても確認しやすくなります。

```
/qf 2019-12-25
```

<img width="1552" alt="Screenshot_ 2019-12-25 11.03.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/0d12928f-210e-0db6-ff66-295cf0321afc.png">

リクエストURLはGoogleスプレッドシートのスクリプトエディタで、Webアプリケーションとして公開した際のURLになります。

## コードについて

Google Apps ScriptではSlackからのPOSTメソッドを `doPost` 関数で受け付けます。そして、結果の記録されているシートからデータを抽出して、テンプレートに当てはめて返却します。

コードは以下のようになります。詳細はコメントを参考にしてください。

```js
function doPost(e) {
  // 一日の集計結果が記録されているシートを取得
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("TestResult")
  // 最終行を取得
  var lastRow = sheet.getLastRow() - 1;
  // 日付列をまとめて取得（処理高速化のため）
  var dates = sheet.getRange(2, 1, lastRow, 1).getValues();
  var results = {};
  // 上から順番にチェックします
  for (var i = 0; i < dates.length; i++) {
    var date = new Date(dates[i][0]);
    // 指定された日付とマッチするかチェックします
    if (e.parameter.text === Utilities.formatDate(date, 'JST', 'yyyy-MM-dd')) {
      // 指定された日付のデータを取得します
      var values = sheet.getRange(i+2, 2, i+2, 8).getValues()[0];
      // 結果をまとめます
      results = {
        date: Utilities.formatDate(date, 'JST', 'yyyy年MM月dd日'),
        pass: values[0], fail: values[1],  skip: values[2],
        cut: values[3],  block: values[4], na: values[5],
        qa: values[6]
      };
    }
  }
  // Slackメッセージ用テンプレート
  var template = '%date%のテスト作業結果です。パス%pass%件、失敗%fail%件、スキップ%skip%件、カット%cut%件、ブロック%block%件、N/A%na%件、Q&A%qa%件となっています。';
  // 取得した結果でテンプレートを置き換えます
  for (var k in results) {
    template = template.replace('%' + k + '%', results[k]);
  }
  // HTTPレスポンスを作ります
  var out = ContentService.createTextOutput();
  out.setContent(template);
  return out;
}
```

## まとめ

これでSlackのスラッシュコマンドを使ってテストの状況を確認できるようになりました。

<img width="602" alt="Screenshot_ 2019-12-25 11.50.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/caf92546-1c38-8da5-ab41-de1d6a769ac7.png">


トリガーの頻度を細かくすれば、現時点での状況を確認することもできるでしょう。テストが滞りなく行われているか管理する上で便利なコマンドになりますので、ぜひお試しください。

[QualityForward](https://cloud.veriserve.co.jp/)
【Windows】PythonでCP932(Shift-JIS)エンコード以外のファイルを開くとエラーになる問題がとりあえずの解決に至った件

Windous環境において`Python`の`open()`関数を使用して日本語を含むファイルを開こうとすると以下のようなエラーが発生します。

```
UnicodeDecodeError: 'cp932' codec can't decode byte 0xef in position 60: illegal multibyte sequence
```
参考にさせていただいた、[こちら](https://qiita.com/Yuu94/items/9ffdfcb2c26d6b33792e)の記事でプログラムにエンコードを追加することでエラーを回避する方法をご教授して頂きました。
ただ、`Python`の`open()`関数を使用する箇所全てにエンコードを追加するのは辛い。
パッケージをインストールするたびに`open()`関数を使用する箇所全てにエンコードを追加するのは辛い。
ということで、`Python`の`open()`関数にまとめて`UTF-8`エンコードを指定できないか調査をしました。
結果、`Windows10`の以下のバージョンから対応できることが分かったので手順を記載します。

# バージョン
以下OSバージョンで動作することを確認しました。
バージョン：`1709`以前だと対象の機能が実装されていないので以下の手順は行えません。
バージョン：`1709`～`1809`の間のバージョンは検証できていません。
![バージョン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472784/b35fe6b3-9385-fb78-9a1c-955ddfad2ad6.png)

# 手順
1. コントロールパネルを開き、`地域`リンクを押下する。
![コントロールパネル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472784/21c698e6-7d07-c684-c336-19acfafa8142.png)

2. 管理タブの`システムローケルの変更`ボタンを押下する。
![地域.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472784/b1606949-eaf1-dd4a-217f-1500a0cec86a.png)

3.`ワールドワイド言語サポートで Unicode UTF-8 を使用`をチェックし、`OK`ボタンを押下する。
![システムローケル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472784/11ef3342-1f47-0402-0179-4a002d3b91d5.png)

4.システムの再起動を求められるので、再起動を行う。

# 結果
Windows10環境でパッケージ`cfn-lint`を使用して日本語を含むファイルをチェックすることができました。

```
$ cfn-lint test.yaml
E0000 did not find expected key
test.yaml:2:3
```

# おわりに
ワールドワイド言語サポートの機能ですが、画面キャプチャにもある通りベータの機能なので、使用することにより他の機能に影響がある可能性があります。
この記事を書いた時点ですべての影響範囲を検証できていません。
使用される方はご自身の責任の範囲にてお願いします。
SuperAgentで画像送信の方法とTips

# 記事の内容
AxiosではなくSuperAgentの使うことになりました
その際に画像の送信でなど詰まったので方法やTipsをまとめます

# SuperAgentとは
ブラウザやNode.jsで動作するajax APIです
基本的な使い方などは一番下に資料をまとめたので参考にしてください

# 画像などを送信したい時
### 使い方
```js
import request from 'superagent';
request
    .post(url)
    .field('name', 'Image Name')
    .attach('image',file)
```

### 注意点
1. `.send()`は使えないので`.attach()`と`.field()`を使いましょう
2. `Content-Type`は使わない(正しいtypeをセットしてくれます)

> To send a file use .attach(name, [file], [options]). You can attach multiple files by calling .attach multiple times.

### 

# fieldでオブジェクトをまとめて渡す時
fieldは2通りの値の渡し方があります
>field(name: string, val: MultipartValue): this; 
>field(fields: { [fieldName: string]: MultipartValue }): this;


```js
const queryObj = {
    query1:'value1',
    query2:'value2',
    query3:'value3',
};

request
    .post(url)
    .field(queryObj)
```
#sendでまとめて渡す時
```js
const queryObj = {
    query1:'value1',
    query2:'value2',
    query3:'value3',
};

request
    .post(url)
    .send(stringfy(queryObj))
```



### 資料
[公式ドキュメント](https://visionmedia.github.io/superagent/)
[github](https://github.com/visionmedia/superagent)
https://qiita.com/hashrock/items/3113690bb3de5bba639b
【ぶっちゃけAndroidアプリ開発】targetSdkVersion、minSdkVersion、compileSdkVersion、buildToolVersionに何を指定すればいいか

これは2019年12月に書いた記事です。
せっかく作ったアプリはできるだけ多くの人に使ってもらいたいですよね。
その前提で、Androidアプリ開発する時に指定するSDK Versionについてまとめておきます。
##targetSdkVersion
####「targetSdkVersion 26」を指定する。GooglePlay推奨だから。
・インストールのターゲットとなるAndroid端末のAPIレベル。(当たり前)
・アプリ開発する時に使用するAPIレベル。このAPIレベルより高いAndroid端末の事は気にしない。
・このAPIレベルのSDKをSDK Managerでインストールしておく。
##minSdkVersion
####「minSdkVersion 19」を指定する。実在しているAndroid端末が多いから。
・このAPIレベルより低いAndroid端末にはインストールできない。
・このAPIレベルより高いものしかサポートしていなAPIを使うと警告が出る。
##compileSdkVersion
####「compileSdkVersion 29」を指定する。最新だから。
・新しいバージョンを使っておけば良い。
・変更するとgradleプラグインとの整合でぐちゃぐちゃになって面倒。
・このAPIレベルのSDKをSDK Managerでインストールしておく。
##buildToolVersion
####「buildToolVersion "29.0.2"」を指定する。最新だから。
・compleSdkVersionと合わせて最新バージョンを使っておけば良い。

---
ぶっちゃけAndroidアプリ開発は、アプリ開発にあたってとりあえず知っておくべきことをズバリ書きます。例外はありますのでご了承ください。
勉強中の身でありますので、誤りなどあればご指摘いただけると有り難いです。
ターミナルで文字列を探すコマンド

# 文字列がどこにあるか探したい
いちいちファイルを開いて検索かけて探すのは面倒 ...

そんな時は

```:terminal
$ find ./ -type f -print | xargs grep 探したい文字列
```

これを使えば一発
でも、こんな長いの叩くのはナンセンスなので
aliasでお好みのコマンドに設定しよう  => [aliasについて](https://qiita.com/Taiga_Ito/items/e9d6259f48b982c3294f)

以下、作成したコマンドを使用して実行します。

# 今回使うファイル
```:ファイル構成
hoge
  ├── file      (含まれる文字列)
  │   ├── a.txt (Good)
  │   ├── b.txt (Better)
  │   └── c.txt (Best)
  └── text
      ├── d.txt (I)
      ├── e.txt (My)
      └── f.txt (Me)
```

# 実際に使ってみる

```:terminal
$ fw Goo
.//file/a.txt:Good

$ fw B
.//file/c.txt:Best
.//file/b.txt:Better

$ fw M
.//text/e.txt:My
.//text/f.txt:Me
```

こんな感じ

# 終わり
(VSCodeだったら ***command + shift + f*** で検索できるんですけどね)
aliasについての[記事](https://qiita.com/Taiga_Ito/items/e9d6259f48b982c3294f)
音ゲー好きの新人がpythonを1日だけ学んで作ったアプリ

#前提
スペック:IT企業の新卒1年目
Python歴:1日
(好きな音ゲー:***Jubeat***)

#今回作ったアプリケーション
アプリ名:***これで愛無双の終盤16連はOKくん***
開発時間:***10分***

開発背景
　・I'm so happy(赤)の終盤16連が***光らない***。
　・運指さえ覚えれば…でも、***覚えられない***。
　・何回も練習すれば覚えられるけど、***練習する環境が無い***。
　　
じゃあ、PCのキーボードを4×4のマスに見立てて、暇な時に練習できるようにすれば良いのでは？
ここから、『これで愛無双の終盤16連はOKくん』の開発が始まった・・・・。　


#コード
imso関数の中身

~~~python:im_so_happy.py
def imso():
    print("""
    ----
    1234
    qwer ←キーボード上のこれらのキーを4×4のjubeatのパネルに例えてね。
    asdf
    zxcv 
    ----""")
    print("""
    --------
    ⑩⑭⑤⑬
    ②⑥⑨①
    ④⑫⑮⑦
    ⑯⑧③⑪
    --------""")
    unsi = input('運指を入力：')
    if unsi == 'rqca3wfxe1vs42dz':
       print("""
        __人人人人__
        ＞EXCELLENT＜
        ￣Y^Y^Y^Y^Y
       """)
    else:
       print("""
         _人人人_
        ＞FAILED＜
        ￣Y^Y^Y^
       """)
~~~

imso関数の単体テスト用コード


~~~python:im_so_happy.py
if __name__=='__main__':
    imso()
~~~

#まとめ
すみませんでした。
GCP アップデート (12/20-12/26 2019)


### BigQueryML: [Dec19, 2019](https://cloud.google.com/bigquery-ml/docs/release-notes#December_19_2019)
- 前処理してくれるdata processingがGAになったよ。

### AI Platform: [Dec 19, 2019](https://cloud.google.com/ml-engine/docs/release-notes#december_19_2019)
- 画像データ向けの2つのアルゴリズムがベータでビルトインされたよ。アルゴリズム書かなくても利用できる。
  - 画像の分類してくれるclassification
  - 物体検知してくれるobject detection
- 新しいランタイム1.15がトレーニングとプレディクションで使えるようになったよ。
  - Python3.7サポート。
  - TPUでの学習は現状未サポートなので注意。

### VPC: [Dec 19, 2019](https://cloud.google.com/vpc/docs/release-notes#December_19_2019)
- オンプレからGCPのサービスに内部IPでアクセスできるPrivate Google Access for on-premises hostsがRFC1918以外の内部IPからアクセスできるようになったよ。(ベータ)

### Dialogflow: [Dec 19, 2019](https://cloud.google.com/dialogflow/docs/release-notes#December_19_2019)
- Telegramを利用していて、ボットを8/19/2019前に起動していた場合、再起動を2/28までに行う必要あり。

### BigQuery: [Dec 20, 2019](https://cloud.google.com/bigquery/docs/release-notes#December_20_2019)
- ALTER TABLEとALTER VIEWがGAになったよ。
- スロット予約できるReservationsが東京で使えるようになったよ！

### AI Platform: [Dec 20, 2019](https://cloud.google.com/ml-engine/docs/release-notes#december_20_2019)
- トレーニングでVPCSCが使えるようになったよ。ベータ。

### GKE: [Dec 23, 2019](https://cloud.google.com/kubernetes-engine/docs/release-notes#december_23_2019)
- v1.15で全リージョンからインターナルLBを参照できるGlobal Accessがベータになったよ。

### Cloud Run: [Dec 23, 2019](https://cloud.google.com/run/docs/release-notes#December_23_2019)
- フルマネージドのSLAが99.95%に！

### ディスクレーマ
- アップデートの内容はあくまでも個人の理解していることを書いています。正しい内容はリリースノート等を確認下さい。
- リリース内容できるだけ拾うようにしているのですが、抜けていそうなリリースノートが追加するのでぜひ教えて下さい！(一覧[ここ](https://qiita.com/kenzkenz/items/ac18a359b803dbb6b490)で更新してます。)
#Stripe でサブスクリプション(定期支払い)の請求リトライ、請求の最後のリトライをテストしたい

# 手順

設定ページのカスタムのリトライスケジュールで、請求リトライ回数を一回だけ、1日後にしておく

1日の間隔でのプランを作成しておく

定期支払いを作成する

顧客のカードを削除するなりして、次の請求サイクルの支払いが失敗するようにしておく

1日待つ

請求が失敗する

もう1日待つ

請求のリトライが起こり、失敗し、最後の請求リトライとなる

# 確認

イベントやwebhookリクエストの中身を見ると、次の値が見つかり、これが最後の請求リトライであることがわかる

`"next_payment_attempt": null`

```
{
  "id": "evt_xxxxxxxxxxxxxxxxxxx",
  "object": "event",
  "api_version": "yyyy-mm-dd",
  "created": **********,
  "data": {
    "object": {
...
      "next_payment_attempt": null,`
```

# 設定

https://dashboard.stripe.com/account/billing/automatic


![image](https://user-images.githubusercontent.com/13635059/71426531-37e44480-26ee-11ea-901d-ecebb9589aab.png)


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2868








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
EC2 Linuxにscalaインストール


#### 環境
|モノ        |       Version|
|:-----------------|:-------------------------------|
| OS             |              Amazon Linux AMI release 2018.03 |
| Scalaインストール対象バージョン           |            2.13.1 |


#### 参考リンク
[https://qiita.com/MiraGi/items/11741f6436b52aa45c81](https://qiita.com/MiraGi/items/11741f6436b52aa45c81)　本投稿は左記リンク先とほぼ同じ内容です

### 1. Javaのバージョンを確認。1.8以上が必要

```
$ java -version
openjdk version "1.8.0_222"
OpenJDK Runtime Environment (build 1.8.0_222-b10)
OpenJDK 64-Bit Server VM (build 25.222-b10, mixed mode)
$ javac -version
javac 1.8.0_222
```

### 2. Scalaインストール

```
$ wget https://downloads.lightbend.com/scala/2.13.1/scala-2.13.1.tgz
$ tar xvzf ./scala-2.13.1.tgz
$ mv scala-2.13.1 /usr/local/scala
$ sudo chown -R root:root /usr/loca/scala
```

### 3. パス設定

```
$ vi .bashrc

下記追加
export SCALA_HOME=/usr/local/scala
export PATH=$PATH:$SCALA_HOME/bin

$ . .bashrc
```

### 4. 確認

```
$ scala -version
Scala code runner version 2.13.1 -- Copyright 2002-2019, LAMP/EPFL and Lightbend, Inc.
```
FijiのU-Netで3次元のセグメンテーションをする方法


前回記事ではFijiのプラグインからU-Netで細胞認識するソフトを紹介しました。
(https://qiita.com/takeajioka/items/0d0873af09245bffc793)
この記事では、ソフトの発展機能である、3D U-Netによる三次元データのセグメンテーション方法を紹介します。
この3D U-Netを使う方法は、開発者のホームページやビデオチュートリアルにも解説がされていませんでした。

##必要な設備
3D U-Netは大規模な処理をするため、バックエンドPCには、GPUが必須になります。
特にfine-tuningをするには7GB以上のGPUが必要になります。(6266MB以上無いと動かせないようになっています。)
また、RTX2080、2070のGPUではfine-tuningをするときになぜかCUDAエラーになったので書いておきます。
自前PCの場合はGPUはGTX1070が8GBあるのでお勧めです。

##方法
ホームページで公開されているcaffeモデルには光学顕微鏡用(bright field)と、蛍光顕微鏡用(fluorescence)の2つのモデルがあります。(別フォルダには電子顕微鏡用のモデルもあるようです。)
これらのモデルを使って、segmentation・detectionを行うこともできますが、精度をよくするならfine-tuningで自分の画像専用のモデルを作成しそれを使う方がよいです。
###fine-tuning
自分の画像がどういう条件で撮ったものか(光学顕微鏡か蛍光顕微鏡か、または電子顕微鏡か)を確認して、それに合わせたモデルを選択します。
また、ROI取りをした教師データを作成しなければなりません。
3次元データは一気にROIを作成することができません。教師データの作成方法は、ImageJのROI取りツールでｚスライス一枚一枚にROIをとっていくことになります。
ROIには「<クラスの名前>#<個体の番号>」のように番号を付けます。クラスは細胞の種類、個体はｚでつながった同じ細胞の領域ということになると思います。正しくROIの名前を付けないと以下のようなエラーが出ます。
<img width="432" alt="1.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521288/4d06f611-4150-59f6-a212-4c9219da8ecb.png">

後は学習をかけるだけです。
自前のPCでは、エポックを多くすると途中でImageJが落ちることがありました。
この場合はエポックは20くらいにして繰り返し行うことで、解決することができました。


###segmentaionまたはdetection
2次元画像の場合と変わりません。GPUも7GB以下でも問題なく動きます。ただし、タイル幅が小さくなるとそれだけ時間がかかります。
超初心者がログイン機能のついたサイトのデスクトップアプリ化に挑戦（あんど失敗・・）

##挑戦したこと
[前回](https://qiita.com/marumaruchan/items/552cc7b679c06bc66d53)はAuth0を活用してログイン機能の付いたID写真付きカレンダー表示に挑戦してみました。今回はそちらをElectronを活用してデスクトップアプリ化にしたいと考えました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508834/efa3f772-efa5-8234-4055-1395e23fbb3d.png)
##手順/環境
Node.js v10.16.3
Windows 10 pro
Visual Studio Code v1.39.1
Auth0
Bootstrap
手順は[こちらの記事](https://qiita.com/zgw426/items/b5e5b62ea86b1974136d)を参考にしました。Auth0もElectonも難しい手順は特になくサクサクできるはずでしたが・・・。
##結果
あれ？あれれ？という感じで右上にあるべきログインボタンがありません（汗）おまけにログイン前なのに写真らしき残骸が左下に表示されている・・。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508834/a9fe9b5d-de5b-b42e-c907-f88f7d3cb35d.png)

ちなみに下記がローカルで作成した元のウェブサイトです。
きちんと青いログインが表示されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508834/ac06234e-3bea-fa29-7323-5c8bb9f3633c.png)


##今後
まだまだ初心者なので、何が問題かすぐには解決できません。が、もう少し色々模索して、原因が分かればこちらで再度アップしていきたいと思います。
Node.jsの"Error: Cannot find module 'cfn-response'"の解決方法

# Error: Cannot find module 'cfn-response'
Lambda-Backedカスタムリソースにおいて、Node.js 8がEOLとなるため、コードはそのままでランタイムの指定だけをNode.js 12.xに変更したところ、このようなエラーが発生しました。

```エラーメッセージ
Response:
{
  "errorType": "Runtime.ImportModuleError",
  "errorMessage": "Error: Cannot find module 'cfn-response'",
  "trace": [
    "Runtime.ImportModuleError: Error: Cannot find module 'cfn-response'",
  云々
```

Node.js 8では以下の指定で同じ階層のファイルrequireできるのですが、

```Node.js8:
const response = require('cfn-response'); 
```

Node.js 12では、パスを明記する必要があるようです。

```Node.js12
const response = require('./cfn-response'); 
```
AtCoderわからん日記_1　ABC148D

# はじめに
こないだはじめてAtCoderのコンテストに参加してみました。過去問はほんのちょびっとだけ解いたぐらい。
マジの初心者なんですが、なんかCがむちゃ簡単でDもなんかいけるのでは？　って思ったので解いてました。時間内にはだめだったけど。
プログラミング強人（つよびと）の解答、マジのスマートすぎて初心者には難しいです。え？　そんな入力の受け取り方ある？！　その出力の仕方アリなの？！　みたいになる。精進します。
とりあえず自分で考えたアルゴリズムでどうしてダメだったのか考えていこうと思います。自分の考えた操作をきちんとコードとして書きおろせなければ意味ないので。
問題は[ABC148](https://atcoder.jp/contests/abc148)のD問題より。以下引用です（ルールに則っているつもりですが、間違っていれば教えてください）。

（どうでもよい追記）
蟻本まだ買ってないです。持ち金が少ないので。学校の図書館にあれば年末年始借りるかも。
それとなく買ってほしいな～ってパッパにねだったつもりが、方向性をミスったのでおうちにあった
・アルゴリズム教科書　-実用的なプログラムで示すアルゴリズムの基礎と応用-
・アルゴリズムパズル　-プログラマのための数学パズル入門-
の本を貸してもらい、まあまずはアルゴリズムを学びたいわけだし、これでいいやと思いました。てか前者の本、わたしより年上なんですけど……

# D - Brick Break

N個のレンガが横一列に並んでいます。
左からi(1≤i≤N)番目のレンガには、整数a<sub>i</sub>が書かれています。
あなたはこのうちN−1個以下の任意のレンガを選んで砕くことができます。
その結果、K個のレンガが残っているとします。
このとき、任意の整数i(1≤i≤K)について、残っているレンガの中で左からi番目のものに書かれた整数がiであるとき、すぬけさんは満足します。
すぬけさんが満足するために砕く必要のあるレンガの最小個数を出力してください。もし、どのように砕いてもそれが不可能な場合、代わりに -1 を出力してください。

##考えたこと
①1から順に数字が並んで残ればいいらしい。
②じゃあ前からインデックスと一緒に確かめて、違うやつを消していけばいいか[^1]
固有名詞ってどうやって決めてるんだろう。あと比喩の要素は何をどうしてこうなったんだ。など。
[^1]: これは間違いですね。消さんでもカウントするだけでいいので。そもそも求められているのは最終的な数列ではない。問題をきちんと読みましょう

### 1回目

```python3
n = int(input())
a = list(map(int, input().split()))
ans = 0
i = 0
while i + 1 <= len(a):
    #index+1がリストの要素と違ったら削除
    if a[i] != i + 1:
        del a[i]
    #同じなら次の要素を確認
    else:
        i += 1
#全部消しちゃったら不可能
if len(a) == 0:
  print(-1)
#残ってる要素を引いたら壊した数になる
else:
    print(n - len(a))
```
いくつかのテストケースでTLEに。
う～～～んしばらく考えたけど何がだめなのかわかんない……絶対にあっているという自信こそないけれど。無限ループでTLEなんじゃなく、数列が長すぎるテストケースの時に時間オーバーしたとかじゃないだろうか？　あまりこのへんのしくみを完全に理解していないけれど。
このあと悩みながら途中でbreakさせたりしてたけど全然関係なかったので省略。

###4回目
③一個ずつ消すから良くなかったかも。一気に消せばいいじゃん。
とのことで、

```python
n = int(input())
a = list(map(int, input().split()))
ans = 0
i = 0
while i + 1 <= len(a):
    #index+1がリストの要素と違ったら
    if a[i] != i + 1:
        #正しい要素があるか確認
        if i + 1 in a:
            #正しい要素の手前まで削除
            del a[i:a.index(i + 1)]
        #正しい要素がないなら全部削除
        else:
            del a[i:]      
    #index+1がリストの要素と同じなら次の要素へ
    else:
        i += 1
#全部消しちゃったら不可能
if len(a) == 0:
  print(-1)
#残ってる要素を引いたら壊した数になる
else:
    print(n - len(a))
```
これで通りました。やったね。
強人（つよびと）の解答
---
全然関係ないけど別に読み方きょうじんでもよいですね。~~狂人みたいで。~~[^2]

- 現時点で最短のコード、全く意味がわからなさすぎて泣いちゃった[^3][^4]
- 変数にリストを入れることすらせず、直接入力を確かめている
- 正しい要素にあたる変数をおき、リストの要素を前から確かめ、同じなら+1して次へ
- print内でもifとか使えるんだ……てかこれ何……？

わたしはなぜかきれいなレンガの並びを求めようとしていたけれど、きれいに並んだレンガの数を数えるだけでよかったという感じですね。

###三項演算子っていうんだね
if, else文を一行で書いていいらしいです。

```
（真ならこう返すよ）if（この条件で）else（偽ならこうね）
```
こんな感じ。コロンもいらない。便利だなあ。
なので、最後4行は

```python
print(-1 if len(a) == 0 else n - len(a))
```
でよい。なるほど～！　学び。
[^2]: コンプラ
[^3]: 誇張表現
[^4]: 別に今最強コードを書くことが目的でなく、わかる範囲で問題を解くことが大事だし、気にせずいこうね
docker上のjupyter notebookでtensorboardを表示できない（解決済み）

随分と時間がかかってしまったが、ようやく解決した！

[すぐに使える! 業務で実践できる! Pythonによる AI・機械学習・深層学習アプリのつくり方](https://www.amazon.co.jp/%E3%81%99%E3%81%90%E3%81%AB%E4%BD%BF%E3%81%88%E3%82%8B-%E6%A5%AD%E5%8B%99%E3%81%A7%E5%AE%9F%E8%B7%B5%E3%81%A7%E3%81%8D%E3%82%8B-Python%E3%81%AB%E3%82%88%E3%82%8B-AI%E3%83%BB%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%83%BB%E6%B7%B1%E5%B1%A4%E5%AD%A6%E7%BF%92%E3%82%A2%E3%83%97%E3%83%AA%E3%81%AE%E3%81%A4%E3%81%8F%E3%82%8A%E6%96%B9-%E3%82%AF%E3%82%B8%E3%83%A9%E9%A3%9B%E8%A1%8C%E6%9C%BA/dp/4802611641)
この本でpythonを勉強中。
５章のtensorboardの表示でつまずいた。

結論：必要なpipパッケージを本家のサンプルと同じバージョンに揃えたら動いた！

・もとの環境
jupyter-tensorboard    0.1.10
tensorflow             1.5.0
tensorboard            2.0.2
tensorflow-tensorboard 1.5.1

・本家のサンプル
jupyter-tensorboard  0.1.9
tensorflow           1.13.1
tensorboard          1.13.1

これだけ。

本家のページ
https://github.com/lspvic/jupyter_tensorboard

> docker pull lspvic/tensorboard-notebook
> docker run -it --rm -p 8888:8888 lspvic/tensorboard-notebook

実際に動く環境で、利用されているパッケージのバージョンを確認することで一発で解決できた。
早くそうすればよかった。。。
LaravelでMySQLのログを日時で出力する方法

ほぼメモ用。
Providers/AppServiceProvider.phpの中にboot()というメソッドがいるので、その中に以下を記述。

```Providers/AppServiceProvider.php
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        DB::listen(function ($query) {
            $sql = preg_replace_array('/\?/', $query->bindings, $query->sql);
            \Log::info("[Query Time:{$query->time}s] {$sql}");
        });
    }
```

<code>$query->sql</code>だけだと実際に渡っているパラメータは確認出来ない。
以下のようになっている
<code>SELECT * FROM hoge WHERE id = ?</code>

<code>$query->bindings</code>で実際にWHERE区に渡っている値を確認する事が出来るがやりたいことはそうじゃなかった。
ちゃんと連結して実行クエリが見たかったんや...！

上記はただ「？」で渡ってきた値をbindingの値に置換するだけだけど、自分の理想の形になった。実行すると以下のようになる。
<code>SELECT * FROM hoge WHERE id = 1</code>
キタコレ！

## Laravelのログを日時で出力する
Laravelのログ出力はデフォルトだと日時にはなっていない。
詳しくは『.env』の中身をチェック。
以下のように変更。

```.env
- LOG_CHANNEL=default
+ LOG_CHANNEL=daily
```

logの出力については『config/logging.php』に書いてある。

上記の設定を行うと以下のように日時でログが出力され、PHPのログもSQLのログもここに出力される。
<code>storage/logs/laravel-2019-12-25.log</code>

```laravel-2019-12-25.log
[2019-12-25 12:37:27] local.ERROR: Call to undefined method
[2019-12-25 13:36:43] local.INFO: [Query Time:155.68s] select * from `hoge`  where `id` = 1
```

終わり！
ログを見てこそ開発は進む（知らんけど

参考：[Laravel 5.6 ログ](https://readouble.com/laravel/5.6/ja/logging.html)
レンガのようなUI

![20191226.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554769/40a32b02-afcc-17fc-2b37-81f780907f4e.png)
初めての記事です。

赤外線リモコン制御用に作ったソフトのUIです。
１５個のボタンに「右手のホームポジション付近のキー」を割り当てています。

これでキーボードをリモコンのように使うことが出来ます。

また、Fキーが押されると、
![20191226_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554769/e94d4ae5-81d4-0d53-a097-e23a2db3321c.png)
このように左手モードに切り替わります。

そのほかに、

- [Backspace]または[Escape]で閉じる
- [Space]で複数リモコン切替

などの特徴があります。

`#C0FFEE`
Go Playground で time.Now() が 2009-11-10 の理由

Go Playground (https://tour.golang.org/welcome/4) で `time.Now()` の結果を下記のように説明しています。

> In the playground the time begins at 2009-11-10 23:00:00 UTC (determining the significance of this date is an exercise for the reader). This makes it easier to cache programs by giving them deterministic output.

簡単に訳すと、`time.Now()` を実行すると `2009-11-10 23:00:00` と出力されますが、その意味は「読み手で調べてね」とのことです。

## 結論
調べてみた結果、***Golang が世に登場した日*** のようです。
(リリースした日というより、アナウンスされた日)

## 時間が始まるタイミング
「あなた」の時間がスタートしたのはいつでしょうか？

そうです。生まれたときですね。
そとのときから時間がスタートしています。

Golang は 2009 年 11 月 10 日に生まれ、その時から時間が始まっていると、Go Playground で言っているんですね。

Google さんよ。粋なことしますね。。好き \:kissing_closed_eyes:

## 参考
Golang が世に出た時の動画がこちら (アップされた日付に注目！)
- [Hey! Ho! Let's Go!](https://opensource.googleblog.com/2009/11/hey-ho-lets-go.html)
- [The Go Programming Language Promo](https://youtu.be/wwoWei-GAPo)
- [The Go Programming Language](https://youtu.be/rKnDgT73v8s)
【CSS】floatで並び方をかえる

## リストを横並びと縦並びとでわける
<img width="475" alt="スクリーンショット 2019-12-26 3.55.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532773/9b7a829e-e63c-f567-1e49-db1f8965e632.png">


:thinking: フルーツは横並びで野菜（赤文字）は縦並びにしたい。

```例.html
<div class="fruits">
  <ul>
    <li>りんご</li>
    <li>みかん</li>
    <li>メロン</li>
  </ul>
</div>
<div class="vegetable">
  <ul>
    <li>トマト</li>
    <li>かぼちゃ</li>
    <li>キャベツ</li>
  </ul>
</div>
```

```例.css
.fruits {
  float: left;
}

.vegetable {
  float: left;
  color: red;
}

li {
  float: left;
  list-style: none;
  margin-right: 20px;
}
```

コードを確認すると・・・

CSSファイルの fruits クラスと vegetable クラスの float: left; はHTMLファイルで div を使っているのでブロック化されている。
それを横並びにしただけ。
これはとくに関係なさそう。

CSSファイルの li の float: left; はブロック関係なく全ての li に対して横並びになっている。
原因はこれだな。

これを野菜ブロックだけ縦並びにしたい。
野菜ブロックだけに適応させたいということは、CSSを・・・

```例.css
li {
  list-style: none;
  margin-right: 20px;
}

.fruits li {
  float: left;
}
```

まずは li の部分の float: left; を消す。
それからフルーツブロックの文字を横並びにしたいので
.fruits クラスの li に float: left; を適用するようコーディングすれば・・・

Web
↓
<img width="343" alt="スクリーンショット 2019-12-26 4.20.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532773/401565f2-b061-bd48-b3c2-71cfc90022a6.png">

できました！:laughing: 

### まとめ
:sunny: CSSでクラス名のあとに要素名を記入すると、そのクラスの要素にのみcssを適用することができる。

```
.クラス名 要素名 {
  プロパティ: 値;
}
```

## 左右に配置する
<img width="343" alt="スクリーンショット 2019-12-26 4.20.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532773/fe22f41f-949e-a4af-d836-a42d2011c3f1.png">

:thinking: さきほどの野菜ブロックを右端に配置してみる

```例.css
.vegetable {
  float: right;
  color: red;
}
```

float: left; を float: right; に変更

Web
↓
<img width="1056" alt="スクリーンショット 2019-12-26 4.49.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532773/1e8e0d15-f73f-5021-6979-0fe0d1fb4ea9.png">

かんたん:laughing:
メモ「Automate the Boring stuff -chapter5 Dictionaries and Structuring Data」

# Dictionaries and Structuring Data

## The Dictionary Data Type
```
>>> myCat = {'size': 'fat', 'color': 'gray', 'disposition': 'loud'}

>>> myCat['size']
'fat'

>>> 'My cat has ' + myCat['color'] + ' fur.'
'My cat has gray fur.'

>>> spam = {12345: 'Luggage Combination', 42: 'The Answer'}
```

## Dictionaries vs. Lists

```
>>> spam = ['cats', 'dogs', 'moose']
>>> bacon = ['dogs', 'moose', 'cats']
>>> spam == bacon
False
>>> eggs = {'name': 'Zophie', 'species': 'cat', 'age': '8'}
>>> ham = {'species': 'cat', 'age': '8', 'name': 'Zophie'}
>>> eggs == ham
True
```

```
>>> spam = {'name': 'Zophie', 'age': 7}
>>> spam['color']
Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    spam['color']
KeyError: 'color'
```

# The keys(), values(), and items() Methods

```
>>> spam = {'color': 'red', 'age': 42}
>>> for v in spam.values():
        print(v)

red
42

>>> for k in spam.keys():
        print(k)

color
age

>>> for i in spam.items():
        print(i)

('color', 'red')
('age', 42)
```
- the values in the dict_items value returned by the items() method are tuples of the key and value.

- If you want a true list from one of these methods, pass its list-like return value to the list() function.

```
>>> spam = {'color': 'red', 'age': 42}
>>> spam.keys()
dict_keys(['color', 'age'])
>>> list(spam.keys())
['color', 'age']
```

```
>>> spam = {'color': 'red', 'age': 42}
>>> for k, v in spam.items():
        print('Key: ' + k + ' Value: ' + str(v))

Key: age Value: 42
Key: color Value: red
```

## Checking Whether a Key or Value Exists in a Dictionary

```
>>> spam = {'name': 'Zophie', 'age': 7}
>>> 'name' in spam.keys()
True
>>> 'Zophie' in spam.values()
True
>>> 'color' in spam.keys()
False
>>> 'color' not in spam.keys()
True
>>> 'color' in spam
False
```

- 'color' in spam is essentially a shorter version of writing 'color' in spam.keys(). 

## The get() Method

```
>>> picnicItems = {'apples': 5, 'cups': 2}
>>> 'I am bringing ' + str(picnicItems.get('cups', 0)) + ' cups.'
'I am bringing 2 cups.'
>>> 'I am bringing ' + str(picnicItems.get('eggs', 0)) + ' eggs.'
'I am bringing 0 eggs.'
```

## The setdefault() Method

## Pretty Printing

# Using Data Structures to Model Real-World Things

## A Tic-Tac-Toe Board

# Nested Dictionaries and Lists

# Fantasy Game Inventory

```
stuff = {'rope': 1, 'torch': 6, 'gold coin': 42, 'dagger': 1, 'arrow': 12}

def displayInventory(inventory):
    print("Inventory:")
    item_total = 0
    for k, v in inventory.items():
        print(str(v) + ' ' + k)
        item_total = item_total + v
    print("Total number of items: " + str(item_total))

displayInventory(stuff)
```

## List to Dictionary Function for Fantasy Game Inventory
【備忘録】AutoHotKeyでリマップしてみた

#はじめに
※当記事は備忘録となっていますので、その点はご留意ください。


#参考ページ
[AutoHotkey wiki](http://ahkwiki.net/Top)

上記リンクのページにも記載されていますが、
AutoHotkeyの学習プロセスは以下の通りです。

１．リファレンスを全部読む。
２．どのようなコマンドがあるか確認。
３．サンプルコード、各コマンドページの例文 を手本に実際に書いてみる

#AutoHotkeyでリマップしてみた
~~~reMap.ahk
 F13 & PgUp::WheelUp
 F13 & PgDn::WheelDown
 PrintScreen::F14
~~~
処理概要を説明しますと
置換前キー::置換後のキー(操作)
F13 かつ Pgup キー　⇒　ホイールアップ操作
F13 かつ PgDn キー　⇒　ホイールダウン操作
PrintScreenキー　   ⇒　F14キー
といった処理になります。
簡単だよなぁ！？:thinking:

#まとめ
AutoHotkey wikiをみるとGUIアプリ作成やファイル操作が行えたり、
マクロ言語かと思っていましたが、ちゃんとしたスクリプト言語でした。

おわり！ｗ
CircleCI の時間制限について

# CircleCI の時間制限について

CircleCI でジョブを実行する場合時間制限があります。
気を付けるべき点など書いておきたいと思います。

## デフォルト時間制限

時間制限のデフォルト値はと書きたいのですが、ちょっと違って、出力がない状態でのタイムアウト値というのが正しいです。
その値のデフォルト値が `10分` です。


## リミッター解除！

では、そのタイムアウト値を引き延ばすための、リミッター解除を行うにはどうするか？です。
下記のように、 `no_output_time` を設定します。
単位は、秒の `s` 、分の `m` 、時間の `h` が使用できます。
秒で設定することはあまりないと思いますが、デフォルトの10分では短すぎる場合に調整をしてみてください。

```
- run:  
    command: . ./script.sh
    no_output_timout: 30m
```

## 上限はないのか？

これ、`no_output_timeout` のとこに上限値書いておいてくれても良いと思うのですが、書いてないんですよね。
で、結論として、上限がないのかどうかというと、あります。

ドキュメントには、`Note: Jobs have a maximum runtime of 5 hours. ` と書かれていて、ジョブ実行時間の上限値が `5時間` であることがわかります。
ジョブを実行開始してから5時間たつと、（多分）落とされます。
ですので、最大でも5時間で、それ以上かかるような場合は、パラレルで動かすことを検討するという感じですね。
まぁ、パラレルになると、有償プランということになると思いますが。

## まとめ

通常ではそこまで気にすることはないですが、サイレントで動き続けるような場合にはこの設定が必要になってくると思います。
全体としての実行時間なども一応考えておくといいのかもしれません。