OmniAICreator/Qiita-1.07M huggingface dataset:
フレックスレイアウトをやってみた

前回はグリッドレイアウトをやったので、今回ははフレックスをやってみた。


#ソースについて
ソースは前回のものを変更しました。
前回のリンクはこちら→[ナビゲーションバーをグリッドレイアウトにしてみた](https://qiita.com/yu-chan/items/5156f7c1de8eb586d84a)

#ソース


```flex_practice.html
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>フレックスレイアウト　練習</title>
	<link rel="stylesheet" href="base.css">
</head>
<body>
	<header>
		<nav>
			<ul id="nav_bar">
				<li><a href="#">ナビ1</a></li>
				<li><a href="#">ナビ2</a></li>
				<li><a href="#">ナビ3</a></li>
				<li><a href="#">ナビ4</a></li>
				<li><a href="#">ナビ5</a></li>
				<li><a href="#">ナビ6</a></li>
			</ul>
		</nav>
	</header>
<!-- ここから変更点 -->
	<main>
		<article class="clearfix">←clearfixを書くことで、次の要素の領域に侵入しないようにしている
			<div id="main_img1">
				<img src="sample.png" alt="sample1">
			</div>
			<p>
				フロートサンプル1
			</p>
		</article>

		<article class="clearfix">
			<div id="main_img2">
				<img src="sample.png" alt="sample2">
			</div>
			<p>
				フロートサンプル2
			</p>
		</article>

		<article>
			<p>
				フロートなし
			</p>
		</article>
	</main>
<!-- ここまで変更点 -->

	<footer>
		<div id="foot1">
			<h3>フッターサンプル1</h3>
			<ul>
				<li><a href="#">フッター1</a></li>
				<li><a href="#">フッター2</a></li>
				<li><a href="#">フッター3</a></li>
			</ul>
		</div>
	</footer>
</body>
</html>
```

```base.css
/* ページ全体 */
body {
	width: 600px;
	margin-left: auto;
	margin-right: auto;
}

/* 共通部分 */
a:link, a:visited {
	color: #0086e9;
}

a:hover {
	color: #f0f;
}

/*フロートしたら必ず指定*/
.clearfix:after {
	content: "";
	display: block;
	clear: both;
}

/* ヘッダー */
header {
	text-align: center;
}

#nav_bar {
	display: grid;
	grid-template-columns: 1fr 1fr 1fr;
	grid-template-rows: auto auto;
	margin: 0;
	padding: 0;
}

#nav_bar li {
	list-style: none;
	margin: 0;
	padding: 0;
	border: solid 1px;
	background: #f3f3f3;
}

#nav_bar a {
	text-decoration: none;
	margin: 0;
	padding: 0;
}

/* メイン */
#main_img1 {
	float: left;/*画像を左に配置*/
}

#main_img2 {
	float: right;/*画像を右に配置*/
}

/* フッター */
footer {
	background: #f3f3f3;
}

#foot1 {
	margin-top: 10px;
	margin-left: 10px;
	padding: 0;
}

#foot1 h3 {
	margin: 0;
	padding: 0;
}

#foot1 ul {
	margin: 0;
	padding-top: 0;
	padding-left: 10px;
}

#foot1 li {
	list-style: none;
	padding: 0;
}

#foot1 a {
	text-decoration: none;
	margin: 0;
	padding: 0;
}
```

#clearfix

cssで以下のコードがある。
フロートを適用している要素で、これを指定しないとどうなるか。

```
.clearfix:after {
	content: "";
	display: block;
	clear: both;
}

```

以下のように配置がおかしくなり、不自然なレイアウトになる。
![clearfix_no.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262917/ad57b109-ee2e-b9e0-9c62-8e71a6be0ec8.png)

では、指定してあげるとどうなるか。
以下のようになる。
![clearfix.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262917/9a465022-8b9a-ec3f-6e47-6baae526b567.png)

先程の画像が違って、配置がおかしくない。
フロートを適用している要素に、clearfixを適用することで、画像の配置が不自然になるのを防いでいる。


#おわりに
まだまだHTMLの理解は浅いが、本を一通り読んでみた感じとしては、グリッドレイアウトやフロートレイアウトが大事だと感じた。
使いこなすことで、様々なデザインを実現できると感じた。

#参考資料
[よくわかるHTML5+CSS3の教科書【第3版】 ](https://www.amazon.co.jp/dp/B07KQPY7PL/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)
Sequelize の transaction が commit has been called on this transaction ってなる時

複数のDB処理を一つのトランザクションで処理するときに、あらかじめ発行しておいたSequelize.transactionを使うが、それぞれ非同期関数で処理しないと、タイトルのすでにコミットされてるよエラーになる。

Sequelizeのオートコミット機能の影響なので、configでオートコミットをオフにするか、処理を全て非同期にすればなおる。

ちなみに、forEachは awaitに対応していないので、 for文やfor of文に書き直す必要がある。
STM32F769 Discovery Kit > Ethernet > pingが通るまでの手順 > trap: PHY addressの指定でハマる (STM32CubeIDEのデフォルト1では動かない)

```txt:動作環境
Ubuntu 18.04 LTS
STM32CubeMX v5.2.1
STM32CubeIDE v1.0.1
基板: STM32F769 Discovery Kit
(Ethernet PHY:  LAN8742A-CZ-TR from MICROCHIP @ UM2033 Rev 6 p19 6.11 Ethernet)
```

### 概要

- Ethernet設定をしてpingが通るようにする

### 大切なこと (PHY addressを0にする)

STM32CubeIDEを使った設定ではPHY addressは1に設定される。そのままでは動かない。

<font color=red>PHY addressは0にすること</font>

これを知らないで３日溶かした (平日の夜 * 3)。

- [LWIP with STM32F769](https://community.st.com/s/question/0D50X00009XkWVpSAN/lwip-with-stm32f769)
    - > Make sure you set the PHY address to 0.  STM32CubeMX application STILL wants to set it to 1. 

ここで「PHYアドレスは0にしろ」とある。STM32CubeIDE(STM32CubeMX)では初期値が１になる。

### ネットワーク環境

- ゲートウェイ: 192.168.0.1
- PC: 192.168.0.9
- STM32F769 Discovery Kit: 192.168.0.10とする

### 手順

手順は以下となる。

- `1. STM32 Projectプロジェクトを作る
    - Part Number Searchにて「769NI」
    - Reference: STM32F769NIHxを選択
    - プロジェクト名(任意): F769NI_ping_190808_2138

- `2. FREERTOSを有効にする
    - defaultTaskのStack Sizeを512に増やしておく
        - 今回の実装では不要かもしれないが

![Screenshot from 2019-08-08 21-46-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/5f676a72-9b73-1caa-0923-c4d50da0b415.png)


- `3. ETHを設定する
    - Mode: RMIIにする
    - <font color=red>PHY Address: 0にする</font>

![Screenshot from 2019-08-08 22-27-32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/68011ce1-89fa-46a9-73a7-09c6611aef38.png)


- `4. RCCのHSEを設定する
    - ST-LINK側のオシレータを使用することにした > BYPASS Clock Source選択

![Screenshot from 2019-08-08 21-46-20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/8c2646d5-88d1-ee08-8c74-fddf009851e2.png)


- `5. LWIPを有効にする
    - LWIP_DHCP (DHCP Module): Disabledにする
    - IP_ADDRESS : 192.168.000.010
    - NETMASK: 255.255.255.000
    - GATEWAY: 192.168.000.001

![Screenshot from 2019-08-08 21-46-34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/7c388285-05fc-c5c9-aa5f-f14775462214.png)

- `6. SYSの設定をする
    - Debug: Serial Wire
        - 今回は使わないかもしれない
    - Timerbase Source: TIM14 (Sys Tick以外の任意)

![Screenshot from 2019-08-08 21-47-37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/9e455e8e-2f04-755c-3a72-1b125a6a96ec.png)

- `7. Clock 設定をする
    - HSEのInput Frequency: 8MHzに
    - 他の設定は下記の画像を参考に

![Screenshot from 2019-08-08 21-27-25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/644879d2-2630-f965-3829-1740589b2b4a.png)

- `8. 保存してコードを生成する
    - > Do you want generate Code?
    - [Yes]

- `9. ビルドして実行すると192.168.0.10にpingが通るようになる



### トラブル

上記を実行して、STM32に接続できなくなった時はLWIPを再設定してみる。

その後、ビルドしてデバッガ接続するが、デバッガ接続できない時は下記を実施する。

- [STM32F769 Discovery Kit > Error: ST-Linkデバイスの初期化エラー. 理由: (9)ターゲットが停止出来ません。 > 対策 + 原因](https://qiita.com/7of9/items/aa7922d780edb63c3b46)
    - 既存のプロジェクトで動作確認し、こちらのプロジェクトに戻してみる
GUI版Arelleの活用法（inline XBRL Viewer）

# inline Viewer機能の紹介

Arellの[公式サイト](http://arelle.org/pub/applications/)から**GUI版**をダウンロード＆インストール。setup後、Mac上でおもむろに起動させる。（Windows版と多少見栄えが異なる）
<img width="941" alt="スクリーンショット 2019-08-08 21.02.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472427/90bd0090-83d0-4f97-d732-c1b7936c26e4.png">
その後、inlineXBRLを読み込ませると、`fact`情報やそれに対応する`Concept`などが表示される。便利。情報はテーブル形式のままコピーしたりできるのだが、日本語が文字化けする。しかし、主題ではないので一旦このことは忘れる。
<img width="934" alt="スクリーンショット 2019-08-08 21.10.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472427/ad453a53-2132-2fc4-fb48-dd51effef49f.png">
気を取り直して、Arellの[ Help ]-[ Manage plug-ins ]をクリックする。
<img width="346" alt="スクリーンショット 2019-08-08 21.02.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472427/3e60b308-75e1-26bc-f0f3-466f16a6448f.png">
Plugin Manager画面が立ち上がる。何も考えず、画面左部にある[ Select ]をクリックする。
<img width="822" alt="スクリーンショット 2019-08-08 21.03.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472427/f3ef03f0-3b61-970f-cc87-af5d59161699.png">
英語でよく分からないが、なんだか素晴らしそうなPlug-inがわんさか出てくる。どういった機能か調べたくなる気持ちを抑えつつ、**iXBRLViewerPlugin(ixbrl-viewer)**を選択し、[ OK ]をクリック。
<img width="743" alt="スクリーンショット 2019-08-08 21.03.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472427/5e013255-8e55-9d56-f43d-559328df938a.png">
Plug−in Managerに「**ixbrl-viewer**」が登録される。プラグイン適用のため、Arelleの再起動を促されるので、それに素直に従う。これで準備完了。あとは最初に読み込ませたものと同じiXBRLをArelleでオープンしてみる。
<img width="820" alt="スクリーンショット 2019-08-08 21.03.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472427/fc3eae69-e3db-0836-f732-b19504dad6c7.png">
iXBRLViewerPluginを適用したため、webブラウザで**inlineXBRL Viewer**が起動する。
XBRLの項目として定義されている所をクリックすると、当該箇所が枠で囲まれ、その情報（`Concept`,`Dimensions`,`Date`,`FactValue`など）が画面右に表示される。
<img width="956" alt="スクリーンショット 2019-08-08 21.08.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472427/b74821ca-729e-4cdc-bfdf-9319a177d64f.png">

画面右上の[ Display Options ]からHighlightをクリックし、チェックを入れる。(JapaneseとEnglishで、項目名称等の言語を変更可能。`LabelLinkbase`の`lang`属性で切り替えている、ように見える)
<img width="149" alt="スクリーンショット 2019-08-08 21.09.
00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472427/d05d6505-7f6b-b85c-a4da-8376d58763bd.png">
すると、あら不思議、XBRL化された項目が緑でハイライトされる。これで、XBRLとして取得できる情報か否かが画面上で簡単に確認できる。
<img width="948" alt="スクリーンショット 2019-08-08 21.07.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472427/72b63583-fd80-8d12-f54e-56ff45bc1d9d.png">

他のPluginの機能を調べてみても面白そう、特にDB系。あと、ArelleのWebAPIも便利だから、深堀りしたい今日この頃。
Socket.io のよく使う関数とか


#Socket.io
バージョン: 2.2.0
namespacesはデフォルト


##サーバ側
###送信
```js
const io = require('socket.io')(http);

//全クライアントに送信
io.emit('event', param); 

//'room'ルーム内のクライアントに送信
io.to('room').emit('event', param); 

//特定クライアントに送信
io.to('socetID').emit('event', param);

//送信元以外の全クライアントに送信
io.broadcast.emit('event', param); 
```

###受信
```js
//イベントハンドラを登録
io.on('event', () => {
});

//イベントハンドラを登録　一度のみ
io.once('event', () => {
});

/*connection(webSocket確立時)イベント時
クライアントが接続するたびにイベントハンドラを登録*/
io.on('connection', socket => {
    socket.on('event', () => {
    });
});

//最初のクライアント接続時のみ
io.once('connection', socket => {
    socket.on('event', () => {
    });
});
```

###クライアント情報取得
```js
io.of('/').in('room').clients( error,clients => {
    //'room'ルームのクライアントのソケットIDリスト
    console.log(clients); 

    //'room'ルームのクライアントの数
    console.log(clients.length); 
}); 
```

###ルーム
```js
io.on('connection', socket => {
    //'room'ルームに接続
    socket.join('room');

    //'room'ルームから切断
    socket.leave('room');
    });
});
```
##クライアント側
###送信
```js
const io = io();

io.emit('event', param);
```
###受信
```js
io.on('event', param => {
});
```

追記するかもしないかも
GNS3に関するメモ

最近ネットワークに興味が出てGNS3でシコシコしている。
そこで色々と調べたのでメモ。

# GNS3とは
GNS3はGraphical Network Simulator-3の略。

ハードウェアをエミュレートするソフトウェア。
Cisco製品だけではなく、その他のベンダでも結構対応している(Juniper, VyOS, OpenWrtとかね)。
https://www.gns3.com/marketplace/appliances を見ればGNS3が対応しているハードウェアが分かる。

GNS3は色んなソフトウェアの寄せ集めみたいな感じで、

- Dynamips ... Cisco機器のエミュレートをする
- Qemu ... Cisco ASA, Juniper, Vyatta, Linuxをエミュレートする
- Pemu ... Cisco PIX FWをエミュレートする
- VirtualBox ... Juniper, Vyatta, Linux, Windowsをエミュレートする

の主に４つから成り立っているらしい。
他にもWiresharkとかVPCS, WinPcapもバンドルされている。

# GNS3が生まれるまで
大昔はNetwork VisualizerというソフトウェアでCisco IOSをシミュレートしていたらしい。
そこからDynamipsが生まれてGUIとかその他色々を追加してGNS3となった。

# Cisco IOSとは
Cisco IOSはCisco Internetwork Operating Systemの略。
CiscoのほとんどのルーターとスイッチでCisco IOSが使用されている(大昔の機器にはCatOSというのが入っているらしい)。

# IOSイメージを手に入れる
GNS3上でCiscoルーターを動かすにはIOSイメージを手に入れる必要がある(ただしデフォで何個か入ってる)。

入手方法としては、

- CiscoのパートナーアカウントでCiscoの公式サイトにログインしてIOSのイメージをダウンロードする(これは自身が所属する企業や団体がCiscoのパートナーになっている必要がある)
- 実物のCisco機器からIOSイメージをGNS3を動作させているPCにコピーする(FTP/TFTP)
- ~~インターネットの海から探す(駄目です)~~

の３種類がある。

ちなみにGNS3では、Cisco 3640, Cisco 3660, Cisco3725, Cisco 3745, Cisco 7200シリーズの使用が推奨されている(それ以外でも動作する)。

# Cisco IOSのバージョニング
長くなりそうなので別記事でまとめた。
[Cisco IOSのバージョニングに関するメモ](https://qiita.com/h_tyokinuhata/items/defa2b98529cc57edb03)

# GNS3にIOSを追加する
Macの場合はPreferences > Dynamips > IOS routers > New からできる。他は知らん。
適切なRAMの容量とかは https://cfn.cloudapps.cisco.com/ITDIT/CFN/jsp/SearchBySoftware.jsp から調べられる。

# コンソールの設定
Macの場合はPreferences > General > Console applications から設定できる。他は知らん。
ちゃんと設定していないとバグってコンソール立ち上がらなかったりするので注意。
Twitterアナリティクスの分析で出来る事

# 概要
自分のツイートがどれくらい影響力があるのか、フォロワーはどのような内容に関心を持っているか、知りたいと思う方は多いのではないでしょうか。
こちらでは、自分のTwitterアカウントの分析ができる「**Twitterアナリティクス**」について、使用方法を具体的に紹介します。

## Twitter アナリティクスとは
「**Twitterアナリティクス**」とは、Twitterアカウントを分析することが出来るツールです。
Twitterより無料で公式提供されていて、Twitterのユーザーなら誰でも使用することが出来ます。

## Twitterアナリティクスでどのような内容を分析出来るのか？
自分のTwitterアカウントにどのようなフォロワーがいるか、そこに向けた効果的なツイートはどのようなものが良いのかなどを「**Twitterアナリティクス**」の情報を元に分析する事が出来ます。

### ツイートに関する分析
- 自分のツイートがどれくらい他のユーザーからアクセスされたか。
- 他のユーザーから自分のツイートに対して、どれくらいの反応(リツイート等)があったか。
- 直近で最も多く、他のユーザーから反応のあったツイートはどれか。
- 自分のプロフィールページがどれくらい見られているか。

### フォロワーに関する分析
- フォロワーの特徴
- フォロワーの増加率

## Twitterアナリティクスの始め方
「**Twitterアナリティクス**」の導入手順を説明していきます。

1. 「**Twitterアナリティクス**」のウェブサイト (https://analytics.twitter.com) にアクセスします。
2. 「Twitterアカウントでログイン」をクリックし、TwitterのIDとパスワードを入力してログインします。

![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229633/0a3421db-3eb2-6ed4-8929-3b7ca0525e33.png)
3. 「アナリティクスを有効にする」をクリックします。これで「**Twitterアナリティクス**」を利用出来るようになります。以降の利用は、Twitterのホーム画面のメニューに「アナリティクス」が追加されるので、そちらから利用出来ます。

## 知っておきたい用語

- **ツイート インプレッション**
自分のツイートがユーザーに見られた回数。
同一アカウントで複数回表示した場合、表示した回数分が加算されます。また、自分自身が表示した回数も含みます。
自分で何度もツイートを表示すると、その分だけインプレッション数が増えてしまうので注意が必要です。

- **エンゲージメント**
自分のツイートに対して、他のユーザーが何かしらのアクション(投稿をクリック、リツイート、いいね等)を起こした総数です。

- **エンゲージメント率**
インプレッション数に対するエンゲージメント数の割合。
自身のツイートを見かけた人のうち何％が、そのツイートになんらかのアクションを起こしたのかを示します。

## 画面の説明
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229633/6edd04ee-7237-b4f5-3a65-dfdc2f85919d.png)

### ホーム
「Twitterアナリティクス」を開くと最初に表示される画面です。

- **過去28日間でのパフォーマンスの変動**
直近の28日間のツイート数、ツイートインプレッション、プロフィールへのアクセス数、@ツイート、フォロワー数、関連するツイート数が表示されます。

- **該当月の概要**
パフォーマンス変動の数値のすぐ下には、月ごとのトップツイート、トップの＠ツイート、トップフォロワー、トップのメディアツイートが表示されています。
インプレッションやエンゲージメントがトップだったものが表示されますので、どのようなツイートがよく見られやすいのかを分析することが出来ます。

### ツイート
すべてのツイートのツイートアクティビティを確認することができます。
画面右上の「データをエクスポート」をクリックすると、CSV形式でデータをダウンロードすることが出来ます。また、分析期間についても任意の期間を設定することが出来ます。画面左上の「過去28日間」と表示されているボタンをクリックするとカレンダーが表示されますので、分析期間を選択してください。

※ CSV形式でデータからさらに細かい分析を行う方法は別途記載します。

### オーディエンス
オーディエンスでは、フォロワー、すべてのTwitterユーザー、オーガニックオーディエンスのユーザー属性のデータを確認することが出来ます。
世帯収入や純資産などの統計データについては、算出方法が明らかにされていません。
ツイート内容などから分析している可能性は高いと言えますので、参考程度に見ておくことをオススメします。

### イベント
イベントでは、Twitter上で話題になっている世界中のイベントや映画、トレンドなどを確認することが出来ます。特にTwitterを企業のプロモーションツールとして使用している方は、ここで掲載されているイベントやトレンド等のキーワードをチェックしておくと、比較的高いインプレッションやエンゲージメントを得やすくなります。

### 詳細
「詳細」をクリックすると、プルダウンでメニューが表示されます。

- Twitterカード
Twitterカードは、ホームページなどにTwitterカードの記述をすることで、ツイート内に画像や動画を添付することができる機能です。
※ 導入方法については、別途記載します。

- 動画アクティビティ
動画アクティビティでは、Twitterに投稿した動画の再生数や再生率を確認することが出来ます。
特に、動画を多く投稿している方はどのような動画がエンゲージメントを得られやすいのか傾向を分析する際に便利です。

- アプリマネージャー

- コンバージョン

※ 一部機能を使用する場合には、[Twitter Developer Platform](https://developer.twitter.com)への登録が必要です。

# まとめ
今回は、自分のTwitterアカウントの分析ができる「**Twitterアナリティクス**」について、基本的な使用方法や用語を紹介しました。
また別で、CSV形式のデータでディープラーニングを使ったさらに細かい分析を行う方法や、Twitter APIを使用して自分に必要な情報を取得する方法、Twitter botを使用して定期的にツイートする方法を紹介します。
Leetcode #392: Is Subsequence

Solution 1: Two-pointer

```swift
func isSubsequence(_ s: String, _ t: String) -> Bool {
    var i = 0
    var j = 0
    var s = Array(s)
    var t = Array(t)
    while i < s.count && j < t.count {
        if s[i] == t[j] {
            i += 1
        }
        j += 1
    }
    return i == s.count
}
```

Solution 2: Binary Search

```swift
func isSubsequence(_ s: String, _ t: String) -> Bool {
    var dict = Array(repeating: [Int](), count: 26)
    for (index, char) in t.enumerated() {
        dict[Int(char.asciiValue!)-97].append(index)
    }
    var s = Array(s)
    var target = -1
    for i in stride(from: 0, to: s.count, by: 1) {
        let index = binarySearch(dict[Int(s[i].asciiValue!)-97], target)
        if index == -1 {
            return false
        } else {
            target = dict[Int(s[i].asciiValue!)-97][index]
        }
    }
    return true
}

private func binarySearch(_ ar: [Int], _ target: Int) -> Int {
    var start = 0
    var end = ar.count - 1
    while start <= end {
        let mid = start + (end - start) / 2
        if ar[mid] > target {
            end -= 1
        } else {
            start += 1
        }
    }
    return start == ar.count ? -1 : start
}
```
JS テンプレートリテラル


バッククォートで囲めばテンプレートリテラルが使えます。${}を使うと、プレースホルダーが使えます。

```javascript:
var a = 5;
var b = 10;
console.log(`Fifteen is ${a + b} and \n
not ${2 * a + b}. `);
// "Fifteen is 15 and
// not 20."
```
DonkeyCar ステアリング連動式スロットルオフ機能

#ステアリングの角度に応じて車速を下げる
ストレートは早く，コーナーで車速を下げて走らせたい．
しかしそのように教師データを作っても学習してくれない．

ステアリングが直進のとき車速はそのままで，ステアリングを切る角度に応じて車速を自動で下げるようにする．
##myconfig.pyに追加

AUTO_THROTTLE_OFF = 0.5

右辺の数字（0.0～1.0）で車速を下げる割合を設定する．
0.0のとき：ステアリングを切っても車速は変わらない
1.0のとき：ステアリングを最大に切ったとき車速が0.0になる
##manage.pyを4箇所修正

    #Choose what inputs should change the car.
    class DriveMode:
        def run(self, mode, 
                    user_angle, user_throttle,
                    pilot_angle, pilot_throttle):

            auto_throttle_off = 1.0 - abs(user_angle) * cfg.AUTO_THROTTLE_OFF #1

            if mode == 'user': 
                return user_angle, user_throttle * auto_throttle_off #2
            
            elif mode == 'local_angle':
                return pilot_angle, user_throttle * auto_throttle_off #3
            
            else: 
                return pilot_angle, pilot_throttle * auto_throttle_off * cfg.AI_THROTTLE_MULT #4
VS Code + create-react-app v3でtsconfig.jsonのpathsを使用する

## やりたいこと
- `create-react-app`で作ったプロジェクトで、
- VS Codeの補完を有効にしつつ、
- `tsconfig.json` の `paths` オプションに設定したaliasを使いたい。
- 起動はデフォルトの `react-scripts start`

## 環境
- react-scripts: 3.0.1
- VS Code: 1.36.1
- typescript: 3.5.2


## 答え
### tsconfig.json
```.json
{
  "extends": "./tsconfig.paths.json",
  "compilerOptions": {
    "baseUrl": "src",
    ...
  },
  ...
}
```

- pathsは別ファイルに定義してextendsで読み込む。（ファイル名はなんでもいい）
そうしないと `react-scripts start` した時に `paths` オプションが消される。

- baseUrlは"src"にする。
そうしないと ```Your project's `baseUrl` can only be set to `src` or `node_modules`. Create React App does not support other values at this time.``` と怒られる。


### tsconfig.paths.json

```.json
{
  "compilerOptions": {
    "paths": {
      "components/*": ["./components/*"],
    }
  }
}
```

- baseUrlが"src"なのでsrcからの相対パスにする。  
 `"components/*": ["./src/components/*"]` にしちゃダメ


## 結論

importの相対パス地獄から解放されると同時にVS Codeの補完も使える。
VS Codeは天才なのでextendsで指定したファイルのpathsも読み込んでくれるらしい。
`create-react-app` は `paths` を消すのをやめろ。
`create-react-app` は `baseUrl` で "." を使用可能にしろ。
AWS Inspector導入

AWS Inspectorの導入手順を記載します。

Inspectorはサーバの脆弱性を検知するサービスです。脆弱性診断をする対象にAgentをインストールし、コンソール上でInspectorを実行します。

## 内容
・Agentの導入手順 
・スキャン手順 
・レポート表示機能など
・料金について

## Agentの導入手順 
対象インスタンスにSSHログイン

```
Inspectorエージェントをインストール
# curl -O https://d1wk0tztpsntt1.cloudfront.net/linux/latest/install

# sudo bash install

プロセス確認
# ps aux | grep inspector
```

### エージェントのインスタンスにタグを設定
※ここからすべてコンソールでの作業
EC2＞インスタンスより、タグを設定(キー:Inspector 値：True)

![Inkedキャプチャ_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131627/c7fc5585-8bb7-2cbb-1a7d-537775766626.jpeg)
ここではキー:Inspector、値:True というタグを設定。

## スキャン手順 
### AWSサービスよりInspectorを選択
※あらかじめユーザに、Inspectorを操作するロールを付与しておくこと。
### 評価ターゲットを選択
1,左上”作成”
2,名前を任意で入力
3,タグにキー:Inspector 値:Trueと入力
4,左下”保存”
![Inkedキャプチャ2_LI (2).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131627/f1ac5012-e1ed-4ca7-79a5-1a6f62b813c4.jpeg)


### 評価テンプレートを選択
1,左上”作成”
2,名前を任意で入力
3,ターゲット名に作成したターゲットを指定
4,ルールパッケージを選択 ※下記詳細あり
5,所要時間を選択 ※1時間が推奨
6,とりあえず左下”作成
![Inkedキャプチャ3_LI (2).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131627/2096a117-4a1c-183a-66a2-e549fffd9213.jpeg)


### ルールパッケージについて
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131627/12d30b18-3f29-092b-d002-d52da71ae57d.png)
Amazon Inspector のルール パッケージとルールについて
https://docs.aws.amazon.com/ja_jp/inspector/latest/userguide/inspector_rule-packages.html

### 評価の実行を選択
1,該当するテンプレートにチェックを入れる
2,左上”実行
<img width="574" alt="キャプチャ4.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131627/0662a7a8-feda-ba3a-ebf0-bb438ec1879c.png">
※実行後、ステータスは”データを収集中“となり、完了後は”分析完了”となります。

## レポート表示機能
評価の実行を選択。分析が完了したら、Download reportを選択。
![Inkedキャプチャ5_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131627/88532e05-234e-206e-5564-10160acb061d.jpeg)


### 結果を選択
“結果”からもテスト結果の各項目が確認できる。
![Inkedキャプチャ6_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131627/0377b6b1-10ba-c426-83bd-67f69b6253bd.jpeg)


###レポート概要(各セクションについて)
※レポートの内容は全編英語です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131627/59c55bdb-43ee-7919-a32a-b5dfaeaf41e7.png)

## 料金について
・無料トライアル
Amazon Inspector の評価を実行したことがない場合、90 日間最初の 250 回のエージェント評価を無料で利用できる。

・料金詳細
※エージェント評価というわかりにくい単語が使われていますが、エージェント数 x 評価回数を示すようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131627/c0af317b-3b6f-3872-7dcf-a3d6369b774b.png)
laravelでmaigrateすると発生したSQLSTATE[42S01]&SQLSTATE[HY000]に対する処理

## SQLSTATE[42S01]
### Base table or view already exists
訳：そのテーブルはもうあります。
処理：
$ php artisan migrate:reset
でテーブルを削除。
私の場合なぜかコマンドで削除されなかったのでSQLクライアントツール「TablePlus」を使って削除しました。

## SQLSTATE[HY000]
### foreign key constraint
訳：型が違います
BigIncrementsならBigIntegerに統一しなければならない。

```_user_table.php
<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->bigIncrements('id');<-ここが問題!!
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('users');
    }
}
```

```_create_posts_table.php
<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreatePostsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->BigIncrements('id');
            $table->string('title');
            $table->text('content');
            $table->integer('user_id')->unsigned();<-ここが問題！！
            $table->timestamps();
            $table->foreign('user_id')->references('id')->on('users');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('posts');
    }
}
```
```_create_posts_table.php
$table->integer('user_id')->unsigned();これを下記に書き換え
$table->BigInteger('user_id')->unsigned();
```
これで型が統一されました。
php artisan migrate...
できました!!

## 後書き
お気づき、ご指摘がありましたら
とても助かります。
よろしくお願いします。
51日目　BeautifulSoupでテーブルを文字列で検索、列をゲット

##日付と項目のテーブルがあって、日付を指定したら一列もってきたい。

ちょっと面倒ですが、forループで一行ずつ目的の文字列を正規表現で検索、
見つかったら該当の行を配列に入れて返すことにしました。


```find.py
from bs4 import BeautifulSoup
import re

table = '\
  <table>\
    <tr>\
      <td>20190801</td>\
      <td>ウサギ</td>\
    </tr>\
        <tr>\
      <td>20190802</td>\
      <td>ネコ</td>\
    </tr>\
    <tr>\
      <td>20190803</td>\
      <td>タヌキ</td>\
    </tr>\
    <tr>\
      <td>20190804</td>\
      <td>イタチ</td>\
    </tr>\
    <tr>\
      <td>20190805</td>\
      <td>キツネ</td>\
    </tr>\
  </table>'


def findstr(txt):
  soup =  BeautifulSoup(table, 'lxml')
  rows = soup.findAll("tr")
  data = []

  for row in rows:
      #一行ずつ正規表現で探す
      found = row.find(text=re.compile(txt))
      #見つかった行のデータを配列にいれて返す
      if found is not None:
        data.append(row.select('td')[0].get_text())
        data.append(row.select('td')[1].get_text())

        return data

#日付で探す
print(findstr("08"))

#名前で探す
print(findstr("ネコ"))
```

##実行

```
$ python find.py
['20190805', 'キツネ']
['20190802', 'ネコ']
```
`find_all`の方がよかったかな。

（所用時間 2時間）
SpacemacsのVim stateでinsert modeでもキーバインドからカーソル移動する

# 対象者

- [spacemacs](https://github.com/syl20bnr/spacemacs/blob/master/doc/DOCUMENTATION.org)使ってる
- Vim寄りにしている（いわゆるEvil State)
- 入力中（insert mode）でもちょっとしたカーソル移動をしたいが逐一normal modeに戻るのがしんどい

ちょっとしたカーソル移動というのは例えば、`"`を入力したら`""`にしてくれるようなエディタで`"okimochi"`まで書いた時、カーソルは`i`と`"`の間にあるので1文字だけ右に移動して入力し続けたい…ということ。

# キーバインドを設定する
設定ファイル`.spacemacs`を編集して、insert modeでもショートカットキーでカーソル移動できるようにする。

まず`Space f e d`で設定ファイルを開き、以下の関数を探す。

```
(defun dotspacemacs/user-config ()...
```

この直下にキーバインドを書く。例えば以下のようにする。

```
(defun dotspacemacs/user-config ()
  ;; Ctrl-hで左移動
  (define-key evil-insert-state-map (kbd "C-h") 'left-char)

  ;; Ctrl-lで右移動
  (define-key evil-insert-state-map (kbd "C-l") 'right-char)

  ;; Ctrl-jで次の行へ移動
  (define-key evil-insert-state-map (kbd "C-j") 'next-line)

  ;; Ctrl-kで前の行へ移動
  (define-key evil-insert-state-map (kbd "C-k") 'previous-line)
)
```

insert modeを狙い撃ってキーバインドを設定している。

`(bind-key "C-k" 'previous-line)`のようにmodeを問わず全体適用してしまっても良いが、まさにこのキーバインドが正常に動作しない罠。

（他は動くがprevious-lineだけカーソル移動せず、謎の文字が入力されてしまう）

normal modeでは同じ挙動をさせない、ということもできる。以下のように。

```
(defun dotspacemacs/user-config ()
  ;; まずキーバインドを取る
  (bind-key "C-h" 'nil)
  (bind-key "C-l" 'nil)
  (bind-key "C-j" 'nil)
  (bind-key "C-k" 'nil)

  ;; ここからキーバインドを当てる
  ;; Ctrl-hで左移動
  (define-key evil-insert-state-map (kbd "C-h") 'left-char)

  ;; Ctrl-lで右移動
  (define-key evil-insert-state-map (kbd "C-l") 'right-char)

  ;; Ctrl-jで次の行へ移動
  (define-key evil-insert-state-map (kbd "C-j") 'next-line)

  ;; Ctrl-kで前の行へ移動
  (define-key evil-insert-state-map (kbd "C-k") 'previous-line)
)
```


# 余談

既存のキーバインド一覧は`Space ?`で閲覧できる。

`Ctrl + k`にあたるキーバインドは見られないので、謎の挙動はキー衝突とは別の原因なのでは…？

（typoなど存在しない動作を割り当てると、怒られるだけで`謎の挙動はしない`）
bitnami で 導入した Redmine の テーマ を 追加する ～画像付き解説～

# 目的
bitnamiで立てたRedmineのテーマをテーマプラグインを用いて変更する方法をまとめる。
※bitnamiを用いたRedmineの立て方は[こちら](https://qiita.com/miriwo/items/0c687d1893bbc1e8f820)

# この記事のターゲット
- bitnamiをもちいてRedmineを立てたもののなんだか見た目が気に入らない方
- テーマプラグインのファイルを格納するフォルダがわからない方
- 日本語に特化したテーマに変更したい方

# 実施方法
日本語表記に特化したテーマプラグインである「farend fancy」の導入方法を記載する。  

1. Redmineのサービスを停止する
    1. WindowsのスタートよりRedmineを停止させるためのexe?を実行する。
    ![redmine_24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/436a79d1-ce68-53ec-2e32-fb1ddaf5e290.png)
    1. ブラウザからRedmineを開きRedmineが停止している事を確認する。(停止していない場合一つ前の手順からやり直す)
    ![redmine_25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/4956f6b7-4b6b-d0cc-2f54-9c8c190f98d0.png)
1. テーマプラグインのファイルを準備する。
    1. 下記サイトにアクセスする。  
    [https://github.com/farend/redmine_theme_farend_fancy](https://github.com/farend/redmine_theme_farend_fancy)
    1. 「clone or download」をクリックする。
    ![redmine_26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/717943f8-06d9-2c66-0fdc-0ac5c89f0993.png)
    1. 「Download ZIP」をクリックする。
    ![redmine_27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/96185d55-55e9-ad7a-b22b-f7cdebb57ae5.png)

    1. ダウンロードされたzipファイルを解凍する。
    1. 解凍して現れたフォルダを「farend-fancy」にリネームする。
1. テーマプラグインフォルダを格納
    1. 「farend-fancy」フォルダーを下記のフォルダに格納する。  
    皆さんの任意のフォルダ/Bitnami/redmine-X.X.X-X/apps/redmine/htdocs/public/themes
1. Redmineのサービスを再開する。
    1. WindowsのスタートよりRedmineを再開させるためのexe?を実行する。
    ![redmine_23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/a46e9607-27dd-70f8-1bf2-9f3faa4a677d.png)

    1. ブラウザからRedmineを開きRedmineが起動している事を確認する。(起動していない場合は一つ前の手順からやり直す)
    1. ブラウザでRedmineにログインし、「管理」 → 「設定」とすすみ「表示のテーマ」に「farend-fancy」が追加されている事を書く確認。
    1. 「farend-fancy」を選択し設定を保存した時、テーマが変更されれば完了！

# まとめ
- bitnamiを用いてRedmineを立てたときのテーマの変更方法をまとめた。
- 「themes」フォルダを探すことに苦労した。
人生捨てたもんじゃないなと思った話

##はじめに

こんにちは。
たかぴーと申します。

これは、僕がフリープログラマーとして独立して、3年ちょっとで月収5千円から、高額オファーを貰えるようになるまでの話です。
コネなし技術無しの状態から良い出会いに恵まれ、ここまで来ることが出来ました。
人生に感謝です。
興味がある方は、ご一読ください。

##基本スペック

性別：男
年齢：アラフォー
学歴：一応、旧帝
プログラミングを本格的に始めた時期：30代後半
生息地域：某福岡

##最後に勤めていた会社
　最後に勤めていた会社は、東京の某環境コンサルでした。そこで、河川や湖の流動解析やデータ分析の補助的な仕事をしていました。
元々、大学では数値解析の勉強をしていたので、それを買われてこの会社で働くことになりました。
ですが、この会社で働く前はお総菜屋さんでバイトしていたので、人生、順風満帆という訳ではないです。。。
　一応、仕事は面白かったのですが、無理をしすぎて体調を崩し、辞めることになりました。会社には申し訳ないと思っています。
昔から、頑張りすぎるところがあり、体調を崩しては2歩下がるということを繰り返していたような気がします。
反省ですね。

##会社を辞めてすぐ
　会社を辞めて再就職も考えましたが、また、無理をして辞めてしまうと思ったので、思い切ってフリーランスとして独立することにしました。
昔から、パソコンが好きだったので、フリープログラマーになることにしました。
ですが、独立と言っても自分で勝手に言っているだけで、何のスキルもないただの30代後半の男です。
ここから、苦難の道が始まりました。

##取り合えず、面接してみる
　ちょこちょことプログラミングの勉強をしながら、面接を受けてみることにしました。
取り合えず、リクナビやcodeIQ（今はmoffers）に登録するとエージェントからメールが来ました。
そして、幾つかのエージェントと面談することになりました。
ですが、当然のことですが、何のスキルもないアラフォーの男に良い求人が来るはずもなく、殆どは派遣プログラマーの求人でした。
正社員の求人は全て落ちました。

##クラウドワークスに登録する
　さて、どうしたものかと思いましたが、派遣プログラマーは良い噂を聞かなかったので、応募しないことにしました。
そして、クラウドワークスに登録して、小さな仕事をしながら地道にプログラミングの勉強をすることにしました。
ここから、借金生活が始まります。
最初は、画面デザインの仕事でしたが、5千円の仕事をするのに1か月かかりました。
月収5千円です。
その後も、数万円の仕事を1か月かけて行ったり、折角やった仕事が没になったり、色々ありました。
そして、いつの間にか2年近くの時が経っていました。

##転機
　2年近く小さな仕事を繰り返す日々でしたが、ある時、良い出会いがありました。
データ分析関連のソフト開発の仕事です。
前職と重なる部分もあり、時給も当時にしては良かったので（最低限の文化的生活が送れるレベル）、応募することにしました。
そして、採用されることになり、この仕事を始めることになりました。

##1年後
　頂いた仕事を始めて1年近くが経っていました。そして、ソフトも区切りの良いところまで出来ました。
その頃にこの依頼主から、また、次の依頼を受けることになりました。
今度は、データ分析支援ツールの開発の仕事です。
この仕事を行うことになりました。
この頃には何とか人並みの生活が出来るようになっていました。
月収5千円の頃と比べると夢のようです。
何とかフリープログラマーとして独立できたのかもしれません。

##そして現在
　更に1年近くが経ちました。もう、アラフォーです。データ分析支援ツールの仕事は現在も続けています。
そして、嬉しいことにリクナビやビズリーチから高額オファーを頂くことが出来ました。
主にソフト開発やデータ分析の仕事です。
3年前は、派遣の仕事しか貰えなかったのに信じられません。
現在の仕事をくれた依頼主様に感謝です。
やっぱり出会いって大事だなと思いました。

##振り返り
　一応、これが自分のここ数年の動きになります。求人は誰もが知っている大手からも頂きました。
そんな大手は、東大とか京大の成績優秀は人しか入れないと思っていたので、なぜ、自分なんかにオファーが来るのかカルチャーショックでした。
ですが、見方を変えてみれば、こんな人間にもオファーが来るということは、人生捨てたもんじゃないなと思った次第です。
それなりに勉強して、良い出会いがあれば、何とか這い上がれるのかなと思いました。
プログラミングを勉強中の方は、ぜひ、諦めないで良い出会いを掴んで頂ければと思います。
以上、失礼いたします。
UiPath イケてるワークフローの作り方 - 代入・変数・引数編 - 

UiPathイケてるワークフローの作り方シリーズの「代入・変数・引数編」です！

代入はまあともかくとして、変数や引数は特に複数人で開発しているときにダサくなりがちです。というかこれに関してはダサいというよりも開発として間違ってるわそれ...！っていうレベルなので、ご存知の方は結構多いと思います。

さっそくいってみましょう！

# 前振り

**■数日前の自分**

代入するときってさぁー、いちいち一つずつ代入しないといけないんだよね？面倒くさいなぁ。。。

**■今の自分**

そんなことねぇよお！！！（ほぼ答え言ってしまった。。）


**■数日前の自分**

変数とか引数の名前つけるの難しいなぁ。。みんなどうやってつけてるんだろ？

**■今の自分**

わかんねぇ。。（ダメじゃん）


# 代入のススメ

代入アクティビティって結構なーんとなく使っている方が多いのではないでしょうか。

このアクティビティ知ってたら「おぉ～～」ってなりますよ。っていうもの紹介します。（すでに知っている方多いかもしれませんが。）

## イケてない代入

普通に`代入アクティビティ`を使ってる場合は、3つ代入したいものがあれば、3つ代入アクティビティを入れる必要がありますよね。

まあ、変数の初期値に入れられる場合はそれでも良いんですけど、変数の初期値に入れない場合はこうなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238739/605521a2-eeeb-c7dd-35fd-cc0ed0561186.png)

## イケてる代入

僕は今まで知らなかったのですが、実は`複数代入アクティビティ`というものがありました！

それを使うとこんな簡潔になりました～！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238739/a2e35156-a8ca-657b-433b-098c6fd51aec.png)

もっと変数が多い場合は、もっとコンパクトになって嬉しいですね！


# 変数名・引数名のススメ

これに関しては絶対解があるわけではないという前提でご覧ください。

## イケてない変数名・引数名

これは、ずばり**同じワークフロー内で名前の形式が統一されていないもの**です。

エンジニアにとっては当たり前かもしれません。しかし、RPAは必ずしもエンジニアが開発するとは限りません。EUCの場合も考えられます。

例えば、以下の2つに名前の形式があります。
同じワークフロー内であれば、どちらかの形式に統一することが望ましく、混在しているのは良くないです。（もうイケてないとかいう話のレベルじゃない笑）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238739/f89d1aac-a0fa-d609-9928-80daf5405da6.png)

## イケてる変数名・引数名

イケてる変数名・引数名は、逆に**名前の形式が統一されている**ものです。

変数名・引数名については、web業界等の別の業界でも議論が様々あるところなので、今回はそれを紹介していきたいと思います。

## 一般的な変数名・引数名の付け方

### 1. キャメルケース or スネークケース

先ほど見せたこの画像、実は左の名前の付け方が「キャメルケース」、右の名前の付け方が「スネークケース」といいます。

キャメルケースは単語の先頭を大文字にする書き方で、スネークケースは単語の間をアンダーバーでつなぐ書き方です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238739/f89d1aac-a0fa-d609-9928-80daf5405da6.png)

この2つの書き方はどちらも一般的に使用されているもので、
どちらが良いどちらが悪いということではなく、統一されているか否かが重要です。

[参考サイト：命名規則「キャメルケース」「スネークケース」「ケバブケース」についてまとめてみました](https://designsupply-web.com/developmentlab/4052/)

UiPathの場合は型が分かりやすいように文字列型は`str`から始める～とか、引数のINの方は、`in_`から名前を付け始める！とかもありますよね～～。
それはそのプロジェクトのコーディング規約に従ってください！

### 2. 単語の省略方法

よくある単語の略し方はこんな感じです。

`format` → `fmt`
`count` → `cnt`
`address` → `addr`
`attribute` → `attr`

個人的には、単語を省略すると分かりにくくなるので、よほどのことがない限りは単語を省略しません。

一般的に「短くて」「正確に変数の役割を言い表している」「分かりやすい」名前が好まれます。

もーほんと名前の付け方がわからない！！っていう人は[codic](https://codic.jp/)というサービスを使ってみると良いかもしれません。

また、エンジニア向けの名著中の名著であるリーダブルコードを読んでみるのもありだと思います。

[リーダブルコード(Amazon)](https://www.amazon.co.jp/%E3%83%AA%E3%83%BC%E3%83%80%E3%83%96%E3%83%AB%E3%82%B3%E3%83%BC%E3%83%89-%E2%80%95%E3%82%88%E3%82%8A%E8%89%AF%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%9B%B8%E3%81%8F%E3%81%9F%E3%82%81%E3%81%AE%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%A7%E5%AE%9F%E8%B7%B5%E7%9A%84%E3%81%AA%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF-Theory-practice-Boswell/dp/4873115655)

# おわりに

今回は複数代入アクティビティと変数名・引数名は統一しましょうね！！っていう話をしました。

いやー、それにしても変数名・引数名は奥が深い！！
どれがいいとかはないので、どれが好きかな～～っていう観点で見ればよいと思います。個人的にはキャメルケース好き！あまり単語を省略したくない！です！

こう考えるとほんとに英語のスキル必要だな～と思うので、余裕がある方は英語も勉強してみてください笑
Raspberry Pi で Scratch 3 を使う

# Raspberry Pi で Scratch 3 を使う

Raspi向けにScratch3が提供され始めたっぽいので記録程度に
少し動かしてみましたが、まだ Scratch 2 の方が動きが良いかな感が...
GPIOも使えました。


## 環境

+ Raspberry Pi 3B
+ Raspbian Buster

## 導入

```
$ sudo apt-get update
$ sudo apt-get install scratch3
```
GPIOの制御ができなかったら

```
$ sudo apt-get install raspi-gpio
```
イラレの便利なスクリプト(jsx)まとめ

Adobe Illustrator で動く jsx で書かれたプラグインまとめ。とりあえず。
後で jsx のお作法もまとめたい。


##### AIのバージョンに依存せずにスクリプトを実行できるアプリケーション（無料）
- [SPAi - Script Panel for Illustrator](https://tama-san.com/spai/)

プラグインではないが、イラレでスクリプトをショートカットから起動するのに必要。
できれば、バージョンに依存せずにDropboxとかの共有フォルダ内に指定したいので、コレを使う。すごく便利。


##### Adobeのプラグインリスト
- [Creative Cloud](https://exchange.adobe.com/creativecloud.illustrator.html#product)

##### 任意の大きさと数のオブジェクトを、任意のシンボルを大きさに合わせて置き換える（無料）
- [Change or Replace Multiple Objects in Illustrator Using Symbols
](http://bcrockett.com/blog/2016/12/change-or-replace-multiple-objects-in-illustrator-using-symbols/)


##### イラレでトーンカーブが使えるプラグイン（有料）
- http://sysys.zouri.jp/tonecurveai/

##### 全体の形を保ったまま、不要なパスをキレイにしてくれる機能 「Point Removal」 （有料）
- Vector Scribe v3  [日本語解説](https://modelinghappy.com/archives/19375)



### ▼ リンク

- [DTP Transit | Illustratorを使うとき、私が手放せない10個のスクリプト（2017更新版）＋ 入手できるスクリプト一覧
](https://www.dtp-transit.jp/adobe/illustrator/post_2238.html)
- [DTP Transit | スクリプトで一変するIllustratorでのテキストの扱い
](https://www.dtp-transit.jp/adobe/illustrator/post_2293.html)
- [Illustratorがもっと便利になるスクリプト6選](http://hamfactory.net/illustrator/24h_ai_script/)
- [3flab inc.  | Illustrator Scripts](https://3fl.jp/d/is/)


### ▼ スクリプト関連のリンク
###### DTP Transit から引用 リンク切れ修正
#### ▼ スクリプト関連のリンク（スクリプト配布サイト） 
- [GOROLIB DESIGN - はやさはちから -](http://gorolib.blog.jp/search?q=%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88)
- [s.h’s page | hatenadiary](https://shspage.hatenadiary.org)
- [s.h’s page | hatenablog](http://shspage.hatenablog.com)
- [たけうちとおるのスクリプトノート: Illustratorアーカイブ](http://www.adg7.com/takenote_b/download/illustrator/)
- [gau (Toshiyuki TAKAHASHI) · GitHub](https://github.com/gau)
- [VoostOn　|　DTP Tips](http://vooston.web.fc2.com/dtp/dtp.html)
- [wundes.com](http://www.wundes.com/JS4AI/)
- [AI Scripts](https://aiscripts.com)
- [サンプルスクリプト一覧 | SampleScript of ROCAPPA](http://sun-nya.com/?cat=3)
- [スクリプト | 0.5秒を積み上げろ](https://efficiencydesign.info/category/illustrator/script/)
- [イラレ｜ぼんぷろぐ](https://sysys.blog.shinobi.jp)

#### ▼ スクリプト関連のリンク（Illustratorのスクリプトをこれから勉強するには）

- Illustrator Scripting | Adobe Developer Connection
- Adobe Illustrator スクリプト はじめのいっぽ | ここぽんのーと
- 日刊デジタルクリエイターズ: 02 古籏一浩 関連のバックナンバー
- 『llustrator自動化基本編』（Kindle）
- Adobe JavaScriptリファレンス (NextPublishing) [オンデマンド (ペーパーバック)]
- 『Adobe Illustrator CS3 + JavaScript 自動化サンプル集』サンプルコード (jsxファイル) 付き
- DTP Booster 035が終了しました+フォローアップ - DTP Transit（DTP Booster, セミナー, イベント, 展示会）
- corecara


### Qiita 参考リンク
- https://qiita.com/search?q=illustrator+javascript
勾配ブースティングを訪ねて～まずは決定木～

# はじめに
Kaggleの勉強を始めてアンサンブル学習が好成績をたたき出してるぞー
という話から始まりxgboostがなんかすごいぞ！ってことを知り
xgboostを使うと何がいいの？って疑問を抱いて調べていくと
どうも決定木がかかわってるということが分かってきたが決定木って
実は雰囲気しかわかってなくて、なんでこれがいいのかを知りたくて
調べて回っている最中

# 参考URL
紹介されているソースコードが自前の環境でうまくいったのでメモ。
これをちょっとずつ理解することにしようと思う。
https://blog.amedama.jp/entry/2017/04/25/224406
git-repo (layerhq/gradle-git-repo-plugin) でcloneできなくてハマった

# 結論
このライブラリは動かない。
https://github.com/layerhq/gradle-git-repo-plugin

こちらの修正してくれている版は動いた
https://github.com/atsushi-ageet/gradle-git-repo-plugin

# 社内ライブラリをgradleで使いたかった
そのため以下の記事を参考にしたが、git-repoを使う方法がうまくいなかい。
https://qiita.com/kgmyshin/items/87f560172c31c2fbd899

Personal Access Tokenでのやり方はできた。
https://qiita.com/tanjo/items/8e9becfafd049754aff5
しかしtokenをユーザー毎に設定してもらうのも面倒なので、ローカルのgit-sshの環境で接続してほしかった。

# 回答をくれたのはこちら

https://twitter.com/fushiroyama/status/966959478712094721

助かりましたm(_ _)m

# おわりに

もうこれ以上ハマる人が居ないことを祈ってる。
Nuxt のコンテキスト外で axios-module (@nuxtjs/axios) を使う

こんにちは、[@y_temp4](https://twitter.com/y_temp4)です。

[Nuxt.js](https://nuxtjs.org/) を使っている方であれば、API リクエストのライブラリとして [axios-module](https://github.com/nuxt-community/axios-module) を利用するケースが多いかと思います。

しかし、以前こちらの発表を聞かせていただいたときに、「**あえて axios-module を使わないで axios を使うことにより、コードの可読性を上げ、変更・追加に強くする**」といったことを学びました。

[replace axios\-module to axios](https://slides.com/nakajmg/replace-axios-module/#/)

> axios-moduleに限らず起こりうる問題だがthisやcontextに注入されるという性質上、
> 共通化や抽象化をする余地が少なく負債として顕在化しやすい

（上記スライド [p 15](https://slides.com/nakajmg/replace-axios-module/#/15) より抜粋）

> 置き換えて得られたもの
> ・ コードの可読性・一貫性が上がった
> ・ エディタの解析によって生産性が上がった
> ・ 変更・追加に強くなった

（上記スライド [p 26](https://slides.com/nakajmg/replace-axios-module/#/26) より抜粋）

このアプローチは非常に良いと感じましたが、同時に自分は考えました。

「**axios-module 使った上で共通化を図りたい･･･！**」と（よくばり）。

要は、エンドポイントの関数化を行い、そこから呼び出す`request.get` 等の関数が変更に耐えうる設計であれば良さそうなので、元となる axios が axios-module でも良いと考えました。

（一応ここまでして axios-module を利用したい理由を書いておくと、axios-module は [README](https://github.com/nuxt-community/axios-module/blob/dev/README.md) にあるように様々な便利機能が使えるからです。）

とはいえ、これをやろうとすると別ファイルから強引に $axios を利用する必要があるので、若干面倒です。

何か良いアプローチがないか調べた結果、以下の issue にある方法で自分のやりたいことは実現できそうでした。

[Can I use axios\-module in non\-vue files? · Issue \#28 · nuxt\-community/axios\-module](https://github.com/nuxt-community/axios-module/issues/28)

## 実装

以下、上記 issue を参考に書いたコードです。

```~/plugins/axios.js
import { setClient } from '~/utils/request'

export default ({ $axios }) => {
  setClient($axios)
}
```

```~/utils/request.js

let client

export function setClient(newclient) {
  client = newclient
}

function get(url, config) {
  return client['$get'](url, config)
}

function post(url, data, config) {
  return client['$post'](url, data, config)
}

export default {
  get,
  post
}
```

実は動作確認をしていないのですが、多分こんな感じで動くと思います（サンプルのコードでは使うメソッドを reqMethods として一覧にしていましたが、そこまでするかは好みの問題かと思います）。

要は Nuxt の [context](https://ja.nuxtjs.org/api/context/) が使える箇所で $axios を抽象化したいレイヤーに無理やりねじ込む感じですね。これなら新しく nuxt-community が xxx-module を出したときにも対応できるでしょう。

また、他の方法としては上記 issue にあるように `window.$nuxt.$axios` を使うという方法もあるかもしれません。こちらは window を参照している関係で利用可能な箇所はクライアントサイドのみですが。

## さいごに

とはいえ、繰り返しになりますがこれはかなり強引な方法です。より良いアプローチをご存じの方がいらっしゃれば、ぜひコメントで教えて下さい🙏

また、もしこの記事が参考になった方はいいねしていただけますと幸いです😄
SalesForceのWebサーバOAuth認証でアクセストークンをゲットしたい

# 前提
* 基本的に[この公式ドキュメント](https://developer.salesforce.com/docs/atlas.ja-jp.api_rest.meta/api_rest/intro_understanding_web_server_oauth_flow.htm)の通りにやっていきます。
* 本番はセキュアなサーバ上でホストされているアプリケーションでなければいけません。（httpsでなければいけない）
* sandboxでやっております。
* 今回は開発環境でアクセストークンをとりあえずゲットするところまでやります。
* SalesForce初心者がなんとなく認証の仕様が掴めるくらいまでを目指した記事です。
* SalesForceをこないだ知ったばかりの人間が無茶をして書いております。詳しい人逆に教えてください。

# 最終的には何がしたいの？
とあるWEBサービスのプロダクトにSalesForce（以下SF）のアカウントを連携させて、SFに登録されている情報を取得してこっちでも使いたい。
例えばQiitaでTwitterを使ってログインすると、Twitterのプロフィール画像が勝手に使われますよね。
あんな感じのことがしたい。

# どうやんの？
まず、情報を取得すること自体はSalesForceがAPIを用意してくれていますので簡単です。
RESTとかSOAPとか種類も豊富です。
しかし、APIを使うためには認証が必要で、その中でもREST APIを使用するための認証がOAuthなので今回はそれを攻略していきます。

# まずOAuthってなに？

この記事が一番わかりやすいです。
https://qiita.com/TakahikoKawasaki/items/e37caf50776e00e733be

# よし！なにからやる？？

[この公式ドキュメント](https://developer.salesforce.com/docs/atlas.ja-jp.api_rest.meta/api_rest/intro_defining_remote_access_applications.htm)の通りに接続アプリケーションを定義してみましょう。
これは何をしているのかというと、SF側に今回連携させたいアプリを登録しているだけです。
SF側からしてもどこの誰ともわからないアプリにアクセストークンは渡せないわけです。ちゃんと定義しましょう。

注：コールバックURLはhttps://localhost とかで定義しておいても問題ないです。

# できたよ！

そうすると「コンシューマの秘密」と「コンシューマの鍵」が発行・表示されますね。
これとコールバックURLを控えておきます。
なんかファンシーな響きですが機密情報なので漏らさないようにしましょう。

# いよいよcurlコマンドの出番だ！

と思いきや最初はGETリクエストなので

```
https://test.salesforce.com/services/oauth2/authorize?response_type=code&client_id=[コンシューマ鍵]&redirect_uri=[コールバックURL]
```

注：今回はテストなのでhttps://test.salesforce.com になっていますが、本番ではhttps://login.salesforce.com のエントリポイントを使います

ブラウザからここにアクセスします。
コンシューマ鍵、コールバックURLは先ほど定義したものを使用してください。

初回はSF側の認証画面が表示されますのでそのまま認証をすすめてください。

認証が済むとリダイレクトされますが、リダイレクトされたページのURL末尾に

```
?code=aWekysIEeqM9PiT2hEfm0Cnr6MoLIfwWyRJcqOqHdF8f9INokharAS09ia7UNP6RiVScerfhc4w%3D%3D
```
的な文字列がついてるのがわかると思います。

「これがアクセストークン！」と思いきや、これはアクセストークンを取得するためのcodeです。
これも控えておきましょう。

# 今度こそcurlコマンドだ！

さぁみなさんお待ちかねcurlコマンドです！

と思いきや僕はcurlを使うことをやめたのでコマンド自体はここでは割愛します。
（僕は[これ](https://chrome.google.com/webstore/detail/restlet-client-rest-api-t/aejoelaoggembcahagimdiliamlcdmfm
)使ってます。最高）

やることとしては

```
https://test.salesforce.com/services/oauth2/token
```

にPOST送信でリクエストを飛ばします。
その際、公式だとわかりづらく書いてあるのですが、**リクエストヘッダーではなく、ボディに全てのパラメータを詰め込みます**。

以下、ボディ。

```
grant_type=authorization_code
&code=[さっき取得したcode]
&client_id=[コンシューマ鍵]
&client_secret=[コンシューマの秘密]
&redirect_uri=[コールバックURL]
```

そして、公式だと多分書いてないのですが

```
Content-Type:application/x-www-form-urlencoded
```
を**リクエストヘッダーにつけないとgrant_typeのエラーが出ます。。**（これで死ぬほど時間を食った。）

参照：https://stackoverflow.com/questions/10890467/how-can-i-use-the-grant-type-password-oauth-flow-with-salesforce-com

すると

```
{
    "access_token": "hgoehogehohgoehogheohgoeh",
    "signature": "nsjlfnbljdgnslbnlsfgjnbjlnfglsb",
    "scope": "full",
    "id_token": "nfdksnvlnfsglbvnlsnblknfgls",
    "instance_url": "https://hogehoge.my.salesforce.com",
    "id": "https://test.salesforce.com/id/ghoeghoehoge",
    "token_type": "Bearer",
    "issued_at": "12345677777788"
}

```
こんな感じのレスポンスボディが得られます。

やりました！アクセストークンをゲットですね！

# 追記
一度発行されたcodeは一回アクセストークンを発行すると無効になる。

# 最後に
あの子の心のアクセストークンもゲットしたいですね。

はい？
Google Cloud Platform Fundamentals: Core Infrastructureを受講した話

# 3行で
https://www.coursera.org/learn/gcp-fundamentals
クラウドで何ができる？をざっくり網羅するにはよい。
浅く広くなので、各々進んだコースを受講するなりして深堀りの必要がある。

# courseraとは
https://www.coursera.org/
オンラインの教育サービスです。
大学やら企業やらが動画、文章、コーディング課題などを使って教えてくれます。
CS系の講義はかなり多いです。
ちょっと入門書から始めてみよう、ぐらいの内容ならだいたい探せばあるような気がします。
ただし、基本的に英語です。英語字幕を表示することもできます。

# どんな人におすすめか
必須
・英語字幕で動画が理解できる
・クラウドサービスに興味がある（触ったことがなくてもOK）

不適
・クラウドサービスを完全に理解しているマン
・どうしてもAWSしか使いたくないマン
・機械学習のモデリング部分にしか興味がない


# どんなコースか
クラウドって何？これがなかったときはみんなどうしてたの？という話から始まり
GCPの基本的な機能の紹介と、紹介した機能を使った簡単な実習があります。

computing, storage, networking, big data...それぞれに性格のことなる複数のサービスがあって
ユーザーはどういう状況のときはどれを選ぶべきか考えよう。
そしたら、それを使ったシステムを試しに組んでみよう、という構成になっています。

実習はQwiklabsというサービスを使っていて、GCPを実際に使えるけど(この講義の実習利用に限り)利用料は無料になっています。


# 感想など
講義受ける前はGCPにログインしても、サービスがたくさんあってこんなに羅列されてもまったくわからんという感じでしたが
講義を受けることで各機能の位置づけと基本的な運用方法を理解できたと思います。
ただし、各カテゴリごとのサービスの特徴を全部暗記しているかというと怪しいです。
Associate Cloud Engineerなどの資格を取るためには講義とは別に努力して覚える必要があると思います。

実際にGCPを使う実習があるのは大きなプラスでした。
GCP、勉強するにも（そんなに高くないとはいえ）利用料かかりますからね。

分散コンピューティングのご利益をようやく自覚できたように思います。
しゅごい・・・。

# お得な情報
基本無料です。（auditを選ぶ）
実習を行うためにはauditではだめで、enrollする必要があります。
最初の7日間は無料で、7日以内に課金を終了すれば実習も含めて完全に無料で受講できて、修了証がもらえます。

https://inthecloud.withgoogle.com/certchallacepca-jp/register.html#!/?utm_source=google&utm_medium=email&utm_campaign=FY19-Q2-apac-nurture-directmail-cs-gcp_field_tkyjp_DevCertifCamp_em&utm_content=inhouse_1
こういうサービスもあるので、GCPの認定資格であるProfessional Cloud Architectを目指す人にはオススメ。


# さらに深堀りをするには
https://cloud.google.com/certification/
ここにある認定資格を目指すための推奨学習方法を試すなど。
機械学習に関連が深そうなのは
https://www.coursera.org/specializations/gcp-data-machine-learning?utm_source=googlecloud&utm_medium=institutions&utm_campaign=GoogleCloud_Training_Data_ML_DE
今受講中なので、終わったらこっちも感想書こうかと思います。


# ぼやき
英語ができるというだけで良質な教育を低価格で享受できるなんて
VSCodeでマウスを使わないためのメモ

# VSCodeでマウスを使わないためのメモ
転職して以来テキストエディタをVsCodeからEmacsに変えました。
VsCodeは素晴らしいエディタだとは思うのですが、
Emacs時代はEmacsにカーソルを当てたが最後、一度もマウスに触らないというのが普通だったのに、
VsCodeの場合、未だにマウスを結構使ってしまっています。

マウスの使用は業務効率を下げるだけなのでこれはいけません。
自戒を込めてマウスを使ってしまっている操作や、
Emacs時代は普通に使っていたのにVSCodeではやり方を覚えていなくて妥協しているものを確認しました。

## 大前提：任意のコマンド実行
`` Ctrl + Shift+ P ``
流石にこれは使っていましたが。
キーボードショートカットが設定されていないものを含め任意のコマンドをコマンド名で実行できる

## ファイルをキーボードだけで開く
Windowsの標準のファイルシステムが開いてしまうとキーボードだけではきつくなります。
何らかの拡張を入れてキーボードだけで済むようにするとマウスから解放されます。

私はFileNavigatorという拡張を入れています。

## 戻る/進む
`` Alt + ← / Alt + → ``
なんだかんだよく使うコマンド。
ショートカットも使いやすい範囲

## エディタの先頭・末尾へ移動
`` Ctrl + Home/ Ctrl + End``

## エディタの移動
`` Ctrl + PageUp /Ctrl + PageDown``

## エディタの分割
`` Ctrl + \``
分割方向まで指定したい場合はSplit Editor　～　系のコマンドを使う

## 分割したエディタにカーソルを合わせる
``　Focus XX Editor Group 系コマンド ``
流石にキーバインドが付いていないものが多い。
よく使うものがあるなら個別にキーバインド弄ってもいいかも。

## Terminal系
よく使うコマンド系 あまりショートカットキーがデフォルトでは無い印象
* Open new Terminal `` Ctrl + Shift + C `` 新しくターミナルを開く
* Focus Termainal ターミナルにカーソルを合わせる
* Switch Active Terminal　複数ターミナルを開いている場合に切り替える

## マルチカーソル系
* Add Cursor Above `Ctrl + Alt + ↑`
* Add Cursor Below `Ctrl + Alt + ↓`

ここまで書いておいて難だけれども、マルチカーソルに関しては流石にキーボードの方が扱いやすそうな気がする。

## その他
しばらくマウス禁止縛りでVsCodeを使って何か見つかったら追記して行こうと思います。
Automation Anywhere のサンプルタスクを Windows 10 May 2019 Update バージョン1903 上で動作するようにする


## Automation Anywhere Client 付属の、すぐに動くサンプルコード
Automation Anywhere Enterprise や Community Edition には、Client 起動後にすぐに動作を確認できるサンプルタスクが Sample Tasks というフォルダーに入っています。
![AAE-client-sample-tasks.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/d1e12e34-56d0-1244-002f-5f08958827e2.png)

4つ目以降のFiles-Folders.atmx, List-Variable.atmx, Loops.atmx, Prompt.atmx, Variables.atmx は、メモ帳にキーストロークをリアルタイムで自動出力していくデモなので、とても直感的にRPAの動作を確認することができ、「Automation Anywhere すごいなー」というのをすぐに実感することができます。

しかし、これらのデモは、Windows 10 May 2019 Update バージョン1903 上 (以下、バージョン1903)ではテキストが1行入った後は途中停止してしまい、失敗してしまいます。


## Windows 10 May 2019 Update バージョン1903 上で動作しない理由
動作しない理由を調べてみると、バージョン1903ではメモ帳に仕様変更があり、本文テキストに変更がかかると、ウィンドウタイトルの文字列の冒頭にアスタリスク (*) が追加されるようになったことが原因であることがわかりました。Automation Anywhere では、ウィンドウの判別にはウィンドウタイトルの文字列を使っていますが、ウィンドウタイトルが変更されてしまうので、後に続くコマンドを入力するためのウィンドウを見失ってしまい、そこで失敗してしまいます。

起動直後
![notepad.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/ed173a6a-974c-6d6e-0905-24201ff4167e.png)

テキスト変更後 ("無題"の前にアスタリスク (*) が追加される)
![notepad-edited.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/b457d2d0-0e91-5d48-8664-c5623873222d.png)

## 解決策
これを踏まえて、元のサンプルを最小限の改変で動作させる方法ですが、各コマンドでウィンドウタイトルを参照しているところ (`$WindowTitle$`、5行目でActive Window Title をこの変数に格納している)について、前方にワイルドカード (`*`) をつけて、アスタリスクがあってもなくても該当ウィンドウを捕捉できるようにすればOKです。具体的には、以下の箇所をすべて変更します。(ちなみに、ここでは追加される文字がたまたまアスタリスクですが、今回追加するワイルドカードとたまたま文字が一致しているだけで、意味は違います。)

以下はLoops.atmxのアクションリストです。

![aa-sample-tasks-loop01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/b8f9f84e-f7d7-1d5b-b62e-51c0751de19a.png)

アクションリストの赤枠で囲った場所で`$WindowTitle$`を参照しているので、これが含まれているアクションリストをひとつずつ編集します。

![aa-sample-tasks-loop02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/1a62a5a5-e599-0d4d-879e-4d28f41b6f2e.png)


アクションリストを編集すると、たとえば以下のダイアログボックスが起動するので、「ウィンドウを選択」のテキストボックスを`$WindowTitle$`から`*$WindowTitle$`に変更します。この「ウィンドウを選択」のテキストボックスではワイルドカードなどの正規表現が使えます。
![AAE-Insert-keystrokes.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/5e166a9a-da23-27b8-3272-38662f2584c8.png)

(最初の編集では、現在起動中のウィンドウにウィンドウタイトルで一致したものがないと正しいものを選択するようにダイアログボックスが表示されることがあるので、その場合は「None of Above」ボタンを選択します。)

これでバージョン 1903 でもメモ帳デモが動作するようになります。
編集後のサンプルは、バージョン1903以前や Windows 7/8でも動作します。

編集箇所が多くて変更が面倒なので、次のリリースでは早く標準対応してほしいところです。

しかし、よく考えると、この件はサンプルコードだけに限らず、メモ帳を実行環境で使っているすべてのRPAプログラムに影響してしまいますね...Automation Anywhere に限らずすべてのRPAに影響があります。Windows 10 バージョン1903はメモ帳で何という大きな仕様変更を行ってくれちゃったんでしょう...(笑)


使用バージョン: Automation Anywhere Enterprise 11.3.2
[第2版]Python機械学習プログラミングのDeprecationWarningへの対応

[［第2版］Python機械学習プログラミング 達人データサイエンティストによる理論と実践 - インプレスブックス](https://book.impress.co.jp/books/1117101099)

この本のDeprecationWarningに対応したメモです．

# p108 欠測値を補完する
```python:before
from sklearn.preprocessing import Imputer

imr = Imputer(missing_values='NaN', strategy='mean', axis=0)
```

```python:after
import numpy as np
from sklearn.impute import SimpleImputer

imr = SimpleImputer(missing_values=np.nan, strategy='mean')
```
引数axisは廃止された?

[sklearn.impute.SimpleImputer — scikit-learn 0.21.3 documentation](http://scikit-learn.org/stable/modules/generated/sklearn.impute.SimpleImputer.html)

# p114 one-hotエンコーディング
```python:before
X = df[['color', 'size', 'price']].values
color_le = LabelEncoder()
X[:, 0] = color_le.fit_transform(X[:, 0])

ohe = OneHotEncoder(categorical_features=[0])
ohe.fit_transform(X).toarray()
```

```python:after
from sklearn.compose import ColumnTransformer

ct = ColumnTransformer([('color', OneHotEncoder(), [0])], remainder='passthrough')
ct.fit_transform(df)
```
LabelEncoderを使う必要はないみたいです．

[sklearn.compose.ColumnTransformer — scikit-learn 0.21.3 documentation](http://scikit-learn.org/stable/modules/generated/sklearn.compose.ColumnTransformer.html)
[scikit-learnのColumnTransformerを使ってみる - 静かなる名辞](https://www.haya-programming.com/entry/2019/06/29/194801)

# p142 主成分を抽出する
```python:before
from sklearn.cross_validation import train_test_split
```

```python:after
from sklearn.model_selection import train_test_split
```

cross_validationはもうないみたいです．

train_test_splitメソッドはパッケージを書き換えるだけでそのまま使えるみたい．(ドキュメントはあたってない)

[ImportError: No module named 'sklearn.cross_validation'の対処 - 静かなる名辞](https://www.haya-programming.com/entry/2018/12/04/052713)