OmniAICreator/Qiita-1.07M huggingface dataset:
Ubuntu 19.04 でwebpackをつかってbootstrapをインストールするまで

## Ubuntu 19.04 にNodeをインストール

[https://github.com/nodesource/distributions/blob/master/README.md](https://github.com/nodesource/distributions/blob/master/README.md#installation-instructions)

```sh
curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash -
sudo apt-get install -y nodejs
```

## webpack（とwebpack-bundle-tracker）のインストール

```sh
npm install --save-dev webpack webpack-cli webpack-bundle-tracker
```

設定ファイルを作成します

```sh
touch webpack.config.js
```

```js:webpack.config.js
var path = require("path")
var webpack = require('webpack')
var BundleTracker = require('webpack-bundle-tracker')

module.exports = {
  mode: 'development',
  context: __dirname,
  entry: {
      // 後ほどエントリポイントを作成します
  },

  output: {
      path: path.resolve('./assets/webpack_bundles/'),
      filename: "[name]-[hash].js",
  },

  plugins: [
    new BundleTracker({filename: './webpack-stats.json'}),
  ],
}
```

## Bootstrapのインストール

[https://getbootstrap.com/docs/4.0/getting-started/webpack/](https://getbootstrap.com/docs/4.0/getting-started/webpack/)

sassのインストール

```sh
npm install --save-dev sass
```

sassを扱うのに必要なローダー等をインストール

```sh
npm install --save-dev style-loader css-loader postcss-loader precss autoprefixer sass-loader
```

bootstrapと、必要なjqueryとpopperをインストールします

```sh
npm install --save-dev jquery popper.js bootstrap
```
設定ファイルを編集します

```js:webpack.config.js
var path = require('path')
var webpack = require('webpack')
var BundleTracker = require('webpack-bundle-tracker')

module.exports = {
  mode: 'development',
  context: __dirname,
  entry: {
    // エントリポイントを追記
    main_js: './assets/js/main.js',
    main_sass: './assets/scss/main.scss',
  },

  output: {
      path: path.resolve('./assets/webpack_bundles/'),
      filename: "[name]-[hash].js"
  },

  plugins: [
    new BundleTracker({
        path: __dirname,
        filename: './webpack-stats.json'
    }),
  ],

  // sass用のルールを追記
  module: {
    rules: [
      {
        test: /\.(scss)$/,
        use: [{
          loader: 'style-loader',
        }, {
          loader: 'css-loader',
        }, {
          loader: 'postcss-loader',
          options: {
            plugins: function () {
              return [
                require('precss'),
                require('autoprefixer')
              ];
            }
          }
        }, {
          loader: 'sass-loader'
        }]
      }
    ]
  }
}
```

```js:assets/js/main.js
import 'bootstrap';
```

```scss:assets/scss/main.scss
@import "~bootstrap/scss/bootstrap";
```

## django-webpack-loader

djangoに導入したい方はぜひ[こちら](https://qiita.com/gsk3beta/items/c2b902c3659610701071)をご高覧ください
ファイルにデータを書き込む（C言語）

#ファイルにデータを書き込む流れ
　C言語でファイルにデータを書き込む方法の概要を書きます。
以下の流れで行います。
(1)ファイルを開く（fopen）
(2)ファイルにデータを書き込む（fprintf）
(3)ファイルを閉じる（fclose）
まず、実行例を見てみましょう。
#実行例
ソースコード

```fprintfExample.c
#include<stdio.h>

int main(){
	int a = 100;
	FILE *fp;
	
	//「fprintfExample.txt」のファイルを書き込みモード（"w"）で開く
	fp = fopen("fprintfExample.txt", "w");
	
	//「fprintfExample.txt」に「aは100です」と書き込む
	fprintf(fp, "aは%dです\n", a);
	
	//「fprintfExample.txt」のファイルを閉じる
	fclose(fp);
	
	return 0;
}
```

実行結果

```fprintfExample.txt

aは100です
```

#(1)ファイルを開く（fopen）
　fopen()を使用してファイルを開きます。
第一引数：ファイル名
第二引数：開くモード（ファイルを開く目的）
戻り値：ファイルポインタ（成功）、またはNULL（失敗）

　開くモードは、ファイルを開く目的を指定します。書き込みの場合は"w"で、読み込みの場合は"r"です。今回は書き込みなので"w"と書きます。
　ファイルポインタは、(2)や(3)の関数で操作対象のファイルを指定するために使用します。
#(2)ファイルにデータを書き込む（fprintf）
　fprintf()を使用して(1)で開いたファイルにデータを書き込みます。fprintf()はprintf()のファイル出力版と言えます。
第一引数：ファイルポインタ
第二引数：書式指定文字列
第三引数：書式指定文字列に入れるデータ
戻り値：ファイルに書いた文字数（成功）、または負の値（失敗）
#(3)ファイルを閉じる(fclose)
　fclose()で書き込んだファイルを閉じます。
第一引数：ファイルポインタ
戻り値：0（成功）、またはEOF（失敗）
#まとめ
　ファイルへのデータの書き込みはfopen→fprintf→fcloseで行うことができます。
読んでくださりありがとうございます！
【RPA】オブジェクト指向のロボット作成/ツール別比較

ロボットのメンテナンスをなるべく省エネでやるには、ロボットの共通部品をまず作成してそれを組み合わせてロボットを作成していくオブジェクト指向型の作成方法になっていることが求められます。たとえば、CRMツールを自動化するロボットが300台あったとして、すべてのロボットが最初の手順としてCRMツールへのログインをする必要があるときに、CRMがバージョンアップしてログイン方法が変わった際に、ログイン部分が部品化されていない場合、300台のロボットをすべてメンテナンスしなければなりません。部品化されていれば、部品ひとつを修正すれば300台のロボットは修正の必要がありません。これは便利ですね！

ということで、オブジェクト指向のロボット作成について主要5大RPAソフトウェア (WinActor、BizRobo!、UiPath、Automation Anywhere、Blue Prism)の比較をしてみたいと思います。

# オブジェクト指向のロボット作成 - ずばり比較！

**凡例**
👍: 部品開発は部品開発者が別途行い、ロボット作成者から隠蔽されており、かつロジック修正は部品側だけをすればよいといったオブジェクト指向になっている。部品作成には通常ロボット作成と同じテクノロジーで行える。
🔺: 部品開発は部品開発者が別途行い、ロボット作成者から隠蔽されており、かつロジック修正は部品側だけをすればよいといったオブジェクト指向になっている。部品作成には通常ロボットよりも高度なプログラミングが必要となる。
❌: ロジック修正はすべてのロボットを直す必要があり、オブジェクト指向になっていない。

|RPAソフトウェア|オブジェクト指向|説明|
|:--|:--:|:--|
|WinActor|❌|ライブラリという概念があり、標準ライブラリやクラウド上の[プチライブラリ](https://winactor.biz/library/)やWinActor Brain Cloud Libraryといった仕組みができてきたが、あくまでもコードを作成するときのリファレンスであり、ライブラリ側で修正が必要な場合、修正必要箇所が自動的にロボット側に反映されるわけではなく、ロボット側を修正する必要がある。|
|BizRobo!|❌|スニペットと呼ばれる、自分が作成したよく使うコードを取っておき再利用する仕組みがあるが、あくまでもコードを作成するときのリファレンスであり、ライブラリ側で修正が必要な場合、修正必要箇所が自動的にロボット側に反映されるわけではなく、ロボット側を修正する必要がある。|
|UiPath|🔺|C#、VB.NET などでアクティビティライブラリを作成し、Nugetパッケージ化したものを取り込むことが可能です。パッケージは[UiPath Go!](https://go.uipath.com/ja)と呼ばれるマーケットプレースで一般的なものが配布されており、これを利用することも可能です。部品の開発には、通常のロボット作成でフローチャートを作っていくよりも高度な、プログラミング言語の知識が必要となります。|
|Automation Anywhere|👍|Meta Botと呼ばれるロボット部品を別途開発することが可能で、これをサーバーから配布することで各ロボットで再利用が可能。[Bot Store](https://botstore.automationanywhere.com/)と呼ばれるマーケットプレースで一般的なものが配布されており、これを利用することも可能です。通常のロボットとロボット部品を同じアクションリストを使って開発できることが特徴です。|
|Blue Prism|👍|ロボットを「プロセス」と「オブジェクト」を分けたオブジェクト指向のアーキテクチャで作成して、部品を再利用可能。[Blue Prism DX](https://digitalexchange.blueprism.com/dx/)と呼ばれるマーケットプレースで一般的なものが配布されており、これを利用することも可能です。|

# 関連記事

* [【RPA】ロボット実行環境のOS対応状況/ツール別比較](https://qiita.com/Okura_/items/8975d6cd7ba0ff2ff61b)
* [【RPA】基本用語/ツール別比較](https://qiita.com/Okura_/items/2cb0dd2ce17356bb50ea)
* [【RPA】どのランタイム環境上で作られているか/ツール別比較](https://qiita.com/Okura_/items/a3f9393267e655e7300d)
* [【RPA】メールの送受信/ツール別比較](https://qiita.com/Okura_/items/369d95a938a05e836417)
* [【RPA】自動化に対する思想/ツール別比較](https://qiita.com/Okura_/items/1c8b29d40d98f2e5ce63)
* [【RPA】サーバー管理の仕組み/ツール別比較](https://qiita.com/Okura_/items/dfc380ec50df6b289391)
* [【RPA】トリガー・スケジュール機能/ツール別比較](https://qiita.com/Okura_/items/7d5e617260378fd2947f)
* [【RPA】ロボットの稼働方法 (ヒトロボ協働型・ロボ自律型)別ライセンス提供/ツール別比較](https://qiita.com/Okura_/items/e9c9f394ae5805481b2b)
* [【RPA】シンクライアント操作への対応/ツール別比較](https://qiita.com/Okura_/items/13de777603cd9912992b)
* [【RPA】SAP対応/ツール別比較](https://qiita.com/Okura_/items/b265ca3f083b92471b58)
* [【RPA】対応ブラウザー/ツール別比較](https://qiita.com/Okura_/items/8501117954139300f427)
* [【RPA】コーディング知識の必要度/ツール別比較](https://qiita.com/Okura_/items/71a577e2141591c88a33)
* [【RPA】UI Automation 対応状況/ツール別比較](https://qiita.com/Okura_/items/95a78c46454ae0dac036)
* [【RPA】ログイン情報の保管方法/ツール別比較](https://qiita.com/Okura_/items/12cdcc743670c6d9c7c7)
年末まで毎日webサイトを作り続ける大学生 〜1日目 homepageを作る〜

##はじめに
情報系の学部にいながらwebサイトの1つもパパッと作れない男。
意識高いけど実力が伴っていない男。
そんな現状に嫌気がさして、年末まで1日1つwebサイトを作ることを決めた男。
扱う技術レベルは低いですが、同じように悩んでる初心者の方の参考になれば幸いです。
今日は1日目。
よろしくお願いします。

##サイトURL
https://sin2cos21.github.io/


##構成
使用言語 → html, css, javascript
レポジトリ → github
公開ページ → gitpages
アウトプット → qiita

##やったこと
まずは真似するところからだと思い、
偉大なる先人([Jennifer Dewalt](https://jenniferdewalt.com/index.html))のサイトを~~パクリ~~参考に、1日目はホームページを作りました。


#こだわったところ
header部分のAboutとContactは未実装なので、クリックするとポップアップが出るようにしました。
![スクリーンショット 2019-10-19 21.45.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516248/18022d26-bc96-d1ea-2d63-424a45698fd2.png)
ポップアップ！↓↓↓
![スクリーンショット 2019-10-19 21.44.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516248/0916c8d9-b6cf-f68d-cff2-e32d441e79cc.png)

---

###実装コード
実装してないけどデザインだけは反映させておきたいことってありますよね。
今後もそういうことが起きそうだったので、ポップアップは関数にしておきます。

html部分↓

```html
<header>
	<ul>
		<li><span class="unimplemented" onclick="unimplemented();">About</span></li>
		<li><span class="unimplemented" onclick="unimplemented();">Contact</span></li>
		<li><a href="/">Blog</a></li>
		<li><a href="/">GitHub</a></li>
	</ul>
</header>
```



javascript部分↓

```html


<script>
		function unimplemented() {
			alert('まだ実装していません。\n もう少々お待ちください。');
		}
</script>
```
こうしておけば次使いたいときは簡単にできますね！
関数は積極的に使っていきたいと思います！


##感想
予想していたよりだいぶ時間がかかりました。
最初は30分ぐらいでできるかなと思ってたんですが、結局1時間も...
サイト自体もそうなんですけど、サイトとコードを公開するためのgithub登録 & pagesの設定に手間取ってしまいました。
よく分からないまま進めたのでいつか向き合わないと。
と、反省することは多くありますが、実際にページが公開されると嬉しい気持ちになれるので
初心者の方はぜひやってみてください！
gitpagesなら無料なので挑戦する分にはお金かからないですよ！

最後までお読みいただきありがとうございます。
Python リスト 数値を任意の桁数で丸め込む

## 背景
リストを出力した際に、桁数が大きかったので、
簡易的に任意の小数の桁で四捨五入をさせるプログラムはないのかと漁ったが、、、。

そこで情報共有として書き込みさせていただきます。

## リスト内の値を小数第n位で丸め込む

コードとしてはシンプルで、
リスト内の値を初期化するように書き換えます。

### 参考コード
list_内のn番目を丸め込み小数第2位までに変更する

```python
#適当なリストを作成
list_ = [0.987654321, 0.87654321, 0.7654321]

#丸め込みは　round　を使用
new_list_ = [round(list_[n], 2) for n in range(len(list_ ))] 
#[0.99, 0.88, 0.77]
```

##参考文献
[Pythonで小数・整数を四捨五入するroundとDecimal.quantize](https://note.nkmk.me/python-round-decimal-quantize/})
[Python: リスト要素の桁揃えなどのフォーマット方法](http://ats.hatenadiary.com/entry/2016/09/14/190459)
過去のコミットログ中のメアド情報をダミーメアドに変更したい

# 概要
- githubの個人リポジトリでコミットした中に個人メアドが含まれている事に気が付いたので、ダミーメアドに書き換えたいなーと思って試行錯誤。
- 個人のリポジトリなら良いけど、チームとか複数人で使ってるリポジトリでは絶対にやらない方が良い。
- リモートへ適用する場合は責任をもってくれぐれも慎重に。

# やった事

- githubの用意してくれるダミーアドレスを取得
- 変更したいリポジトリをローカルにclone
- 過去のコミットログのAutherとEmailをごっそり書き換える
- 強制Pushで上書き
- ローカルgit設定のメアドをダミーに変える

## githubの用意してくれるダミーアドレスを取得
https://help.github.com/ja/articles/blocking-command-line-pushes-that-expose-your-personal-email-address
を参考に確認。

```
 Keep my email address private. で発行されるメアドをコピーしておく
${githubID}@users.noreply.github.com
みたいなアドレス。以下 ${ダミーメアド}
```
- 同じ画面で `Block command line pushes that expose my email.`を設定すると、ダミーメアド以外のメアドがコミットログにあると githubへPushできなくなるっぽい。
- 後でPushできなくなってハマっても面倒なので忘れないうちに以下でローカルgit設定のメアドをダミーメアドに変更して置く。
- https://help.github.com/ja/articles/setting-your-commit-email-address
を参考に設定

```
git config global user.email ${ダミーメアド}
```

## メアドを変更したいリポジトリをローカルにclone

```
clone ${リポジトリ} ${ディレクトリ}

# 転ばぬ先のバックアップとして、違うディレクトリ名でも同じリポジトリをcloneしておくと安全
clone ${リポジトリ} ${ディレクトリ}.bkup
```

## 過去のコミットログの情報をごっそり書き換える
cloneしたディレクトリへ cdしコミットログの状態を確認

```
git log
```
githubでコピーしたダミーメアドを下記のコマンドで上書き設定する

```
git filter-branch -f --env-filter \
    "GIT_AUTHOR_NAME='${変更後のAUTHER_NAME}'; \
     GIT_AUTHOR_EMAIL='${ダミーメアド}'; \
     GIT_COMMITTER_NAME='${変更後のCOMMITTER_NAME}'; \
     GIT_COMMITTER_EMAIL='${ダミーメアド}';" \
     HEAD
```
書き変わったか確認

```
git log
```

## 強制Pushで上書き

```
git push -f remote origin
```
やっちまったなーという時は、`バックアップしてあれば`バックアップしたディレクトリに移って手を加えずにoriginへ強制Pushすれば作業前の状態に戻せるとは思うけど慎重に作業する。
WordPressのフォルダ、ファイルの構成についてまとめ

WordPressをインストールしたら、複数のフォルダ、ファイルが構成されています。
インストールした直後のフォルダとファイルについて、どんなものがあるのかをざっくり把握しておきたい。

##WordPressのフォルダ、ファイル構成

|  ファイル  | 内容 |
|:-----------------|----|
|index.php| プログラムファイル |
|wp-config.php|設定ファイル。データベースのログイン情報など|
|wp-admin/|管理画面で使用されるプログラムファイル|
|wp-content/|投稿に含まれる画像、プラグインが保存される|
|wp-content/languages/|言語設定ファイルが含まれるフォルダ|
|wp-content/plugins/|プラグインファイルが含まれるフォルダ|
|wp-content/themes/|テーマファイルが含まれるフォルダ|
|...その他|その他の各種プログラムファイル等|


ほとんどのファイルは、直接編集するものではない。
例外的に直接編集する可能性があるファイルは、

- wp-confing.php
- wp-content/　の各種ファイル


wp-confing.phpは、データベースのログイン情報が入っているファイル
データベースのパスワードを変更した時や、デバックモードで開発をしたいときに編集する。


###補足：デバッグモードで開発を行う

ここで、PHPについておさらい
PHPは変なコードを書くとエラーメッセージをページに出力します。

PHPのエラーの種類

|  エラー  | 内容 |
|:-----------------|----|
|E_ERROR|重大な実行時エラー。プログラムの実行が中断される。|
|E_WARNING|実行時の警告（致命的ではない）プログラムの実行は中断されない|
|E_PARSE|コンパイル時のパースエラー。パースエラーはパーサでのみ生成される。いわゆる書き間違い（文法間違い、シンタックスエラー）によるエラーのことで、プログラムは中断される|
|E_NOTICE|注意。エラーとまでは言えず、そのまま実行されるが、未定義の変数を使っているなど、より大きなエラーにつながる可能性がある質の低いプログラムの修正を促す|

PHPのエラー表示は、E_PARSE以上のエラーが発生すると、ページ上にエラーが表示される仕組みです。

WordPressも同様。

wp-confing.phpの設定を変更することで、E_NOTICEのエラーも表示させることができます。
これがデバッグモードです。

wp-configを開いて、下の方にスクロールしていくと、以下のコードが書かれているので、修正します。

```php
/**
 * 開発者へ:WordPressデバックモード
 * 
 * この値を true にすると、開発中に（notice）を表示します。
 * テーマおよびプラグインの開発者には、その開発環境においてこの WP_DEBUG を使用することを強く推奨します。
 * 
 * その他のデバッグに利用できる定数については Codex をご覧ください。
 * 
 * @link http://wpdocs.osdn.jp/WordPress%E381%A7%E3%81%AE%E3%83%87%E3%83%90%E4%83%83%E3%82%B0
 */
 //define('WP_DEBUG', false);

 define('WP_DEBUG', true);
//falseをtrueに変更
```
PocketBeagleをUSB経由でインターネットに接続する

PocketBeagleを、USB接続したWindows10パソコンを経由して、インターネットに接続する方法です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109634/79cad448-a11b-dada-be02-9edbb0fe91f0.png)

### 1. PocketBeagleをWindows10パソコンにUSB接続

PocketBeagleとWindows10パソコンをUSB接続してください。
すると、自動的にWindows10のネットワーク接続に**Remote NDIS Compatible Device**が追加され、Windows10パソコンから**192.168.7.2**でPocketBeagleにアクセスができるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109634/c6a669df-60bf-9af2-7f4c-9492c5656f81.png)

> 赤枠がPocketBeagleのネットワーク。ピンク枠は以降でPocketBeagleのネットワークと接続する、インターネットに接続されたネットワーク。

### 2. インターネットに接続

インターネットに接続されたネットワークのプロパティを開き、`共有`タブの`ネットワークのほかのユーザーに、このコンピューターのインターネット接続をとおしての接続を許可する`をチェック、`ホームネットワーク接続`をPocketBeagleのネットワークにしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109634/ce30df47-5cd0-cade-28e2-6a6157f2c077.png)

### 3. PocketBeagleネットワークのIPアドレスを変更

共有設定すると、自動的にPocketBeagleのネットワークのIPアドレスが`192.168.137.1'になりますが、このままではPocketBeagleと通信できません。

PocketBeagleのネットワークのIPアドレスを、`192.168.7.1`に変更してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109634/036ec742-f08a-7ff9-bfe5-917b2b2728e7.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109634/3bab58b6-a069-4783-5ec9-96085fe517ec.png)

### 4. PocketBeagleのネットワーク設定を変更

ルーティングにゲートウェイ`192.168.7.1`を追加、DNSサーバーのIPアドレスを`8.8.8.8`に設定してください。

```bash
debian@beaglebone:~$ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.6.0     0.0.0.0         255.255.255.252 U     0      0        0 usb1
192.168.7.0     0.0.0.0         255.255.255.252 U     0      0        0 usb0
debian@beaglebone:~$ sudo route add default gw 192.168.7.1
[sudo] password for debian:
debian@beaglebone:~$ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         192.168.7.1     0.0.0.0         UG    0      0        0 usb0
192.168.6.0     0.0.0.0         255.255.255.252 U     0      0        0 usb1
192.168.7.0     0.0.0.0         255.255.255.252 U     0      0        0 usb0
debian@beaglebone:~$
```

```bash
debian@beaglebone:~$ sudo sh -c 'echo "nameserver 8.8.8.8" >> /etc/resolv.conf'
debian@beaglebone:~$
```

### 5. 疎通確認

`google.com`にpingして、インターネットへ通信できるか確認してください。

```bash
debian@beaglebone:~$ ping google.com
PING google.com (216.58.197.206) 56(84) bytes of data.
64 bytes from nrt13s48-in-f206.1e100.net (216.58.197.206): icmp_seq=1 ttl=50 time=15.3 ms
64 bytes from nrt13s48-in-f206.1e100.net (216.58.197.206): icmp_seq=2 ttl=50 time=16.8 ms
^C
--- google.com ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 15.306/16.064/16.822/0.758 ms
debian@beaglebone:~$
```

# 注意事項

* PocketBeagleを再起動すると、4.の設定が元に戻ってしまうので、再びインターネットに接続したいときは、4.を実施してください。（記憶させる方法が見つかったら追記する予定）
* BeagleBone GreenやBeagleBone Blueも、この方法が使えるんじゃないかと思う。（未確認）
threading.Eventをかじったので備忘録


#Eventオブジェクトについて
>イベントは、あるスレッドがイベントを発信し、他のスレッドはそれを待つという、スレッド間で通信を行うための最も単純なメカニズムの一つです。
>イベントオブジェクトは内部フラグを管理します。このフラグは set() メソッドで値を true に、 clear() メソッドで値を false にリセットします。 wait() メソッドはフラグが true になるまでブロックします。
参照([Pythonドキュメント](https://docs.python.org/ja/3/library/threading.html#event-objects))

#本題
##例

```python:qiita.py
import threading
import time


event = threading.Event()

def race():
    print("startしました。")
    event.wait()
    print("goalです。おめでとう！")

thread = threading.Thread(target=race)
thread.start()
time.sleep(1)
print("走っています")
time.sleep(1)
event.set()
```

##解説
`event = threading.Event()`
threading.Eventをインスタンス化してやることで何のイベントを行うのか判別できるようになります。

またEventオブジェクト内のメソッドは引数にselfを持っているのでインスタンス化させずに
`threading.Event.wait()`で実行しようとすると
`TypeError: wait() missing 1 required positional argument: 'self'`
を吐き出します。

イベントとして行いたいメソッドは`thread = threading.Thread(target=race)`のように
新しくスレッドを建ててその中で管理してやらないと`event.wait()`で操作が止まります。

###繰り返しイベントを行いたい場合

```python
def race():
    while True:
        print("startしました。")
        event.wait()
        print("goalです。おめでとう！もう一本！")
        event.clear()
```
`event.clear()`で内部フラグをFalseに戻してやらないと`event.wait()`が機能しなくなります。


以上、今回かじったメソッドがここまで、ということでここで終わり。
より詳しい解説や具体的な使い方は以下の記事を参考にすると良いかと思います。
[おまいらのthreading.Eventの使い方は間違っている](https://qiita.com/tag1216/items/2dcb112f8018eb19a999)

#おまけ
モジュール間を通したeventの管理。

###実例
```python:MainModule
import threading
import SubModule

event = threading.Event()

def switch_wait():
    n = 1
    while True:
        event.wait()
        print("例:"+str(n)+"秒経ちました")
        n += 1
        event.clear()

def switch_set():
    event.set()

thread = threading.Thread(target=switch_wait)
thread.start()

sub_func = SubModule.SubClass(func=switch_set)
sub_func.run()

```

```python:SubModule
import time


class SubClass():
    def __init__(self,func):
        self.switch=func

    def run(self):
        i = 0
        print("五秒まで一秒ごと数えます。")
        while i<5:
            time.sleep(1)
            i += 1
            self.switch()
        print("stop")

```
メールフォーマットに関する仕様まとめ

メールフォーマットに関する仕様（テキストメールとMIMEによる拡張）を簡単にまとめた。

* [RFC 5322](https://tools.ietf.org/html/rfc5322)（旧RFC 2822、RFC 822）に定義されるテキストメールには以下の問題があった。
	* ヘッダ・本文にASCII（US-ASCII）しか利用できない。
		* ASCII以外の文字を利用する地域では、本文に対する文字コードを独自に決めた（日本ではISO-2022-JP）ため、地域間の互換性がなくなった。
	* 本文はテキスト形式のみであり、1つのメールで1つの本文しか扱うことができない。
		* バイナリファイルを格納するために、uuencode形式のエンコードが用いられたが、これは一部のシステムで誤動作を起こす可能性があった。
* これらの問題を解決するためMultipurpose Internet Mail Extension (MIME) が定義された。
	* MIMEの仕様は[RFC 2045](https://tools.ietf.org/html/rfc2045)、[RFC 2046](https://tools.ietf.org/html/rfc2046)、[RFC 2047](https://tools.ietf.org/html/rfc2047)、[RFC 4288](https://tools.ietf.org/html/rfc4288)、[RFC 4289](https://tools.ietf.org/html/rfc4289)、[RFC 2049](https://tools.ietf.org/html/rfc2049)に定義されている。
* MIMEで定義される仕様のポイントは以下の通り。
	* ヘッダで非US-ASCII文字を利用できる。
		* 書式：`=?charset?encoding?encoded-text?=`
		* メールの件名に日本語を使うことができるようになった。
	* Content-Typeヘッダでデータ形式を指定する。
		* 書式：`Content-Type: type/subtype; parameter`
		* type（大分類）とsubtype（小分類）を分けて記述できるため、受信者は非対応のsubtypeに対しても最低限の取り扱いが可能となる。
		* テキスト形式の場合にはparameterで文字コードを指定できる。
	* マルチパート（`Content-Type: multipart/...`）により本文を複数に分割できる。
		* 本文と添付ファイルを1つのメールで送信する、本文にHTML形式と代替用のテキスト形式の両方を含める、といったことが可能となる。
	* Content-Transfer-Encodingヘッダでデータのエンコード形式を指定する。
		* 書式：`Content-Transfer-Encoding: mechanism`
		* uuencodeはサポート対象外となっている。

#### 参考

* [MIMEの基礎](https://www.mew.org/~kazu/doc/newsletter/3.html)
* [Multipurpose_Internet_Mail_Extensions - Wikipedia](https://ja.wikipedia.org/wiki/Multipurpose_Internet_Mail_Extensions)
* [UNIX/Linuxの部屋 uuencodeコマンドの使い方](UNIX/Linuxの部屋 uuencodeコマンドの使い方)
Androidアプリ実装でdrawableに保存した写真を表示する（Android Studio, Java）


# やりたいこと

画面に写真を表示したい。
写真は自分で撮影したものなどを使いたい。


# 画像ファイルを準備する

まず、自分のPCなどに保存されている任意の写真（画像ファイル）を、

```
res/drawable
```

に、コピーする。

Android Studioの左メニューに表示されている

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75451/9b19dca3-e76d-db17-e2bc-7bacefc471b4.png)

に直接D&Dすればよい。
（sample_image_01.jpg を保存した例。赤い車の写真。）



# ImageViewを配置する

パレットからImageViewをD&Dすると、
つぎの画面が表示されるので、
「プロジェクト」を選び、
先ほどコピーした画像を選択してOKを押す。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75451/fffe6d81-bfe4-17d1-3dcd-079dd69fb11f.png)

# 位置を調整する

ImageViewを適切な位置に移動させる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75451/5f094011-844b-87fe-2165-b3e6b82068f2.png)


```layout/activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:srcCompat="@drawable/sample_image_01"
        tools:layout_editor_absoluteX="0dp"
        tools:layout_editor_absoluteY="0dp" />

</androidx.constraintlayout.widget.ConstraintLayout>
```


# 表示を確認する

ビルドすると、つぎのように表示される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75451/7814777a-37ae-65e5-6a9a-d5891ec78f55.png)
Chrome and Gmail use different account

最近Chromeアップデータした後に、
Chromeをログインしたら、
Gmailを開くと自動的にChromeのあかうんとをログインします。

ほれは本当にBugかとか分からないですよね、
Chromeもうブラウザーの王様になったと見ると。
（当年IEも同じでしょう、王様になると我がままになるでしょう）

まあ、解決の案はないわけではないです。
このリンクによると：https://superuser.com/a/1369161
    
1, Navigate to `chrome://flags` in the URL bar.
2, Search for `consistency` to find `Identity consistency between browser and cookie jar` option.
3, Change its value to `Enabled Dice`.
4, Relaunch, as advised.
5, Logout all your login accounts.
6, Login your account which you want login as default.
7, Login other accounts.
8, Login your chrome account again.

段々ChromeはIEになりそうですよね。

####追記：毎回Chromeをアップデートすると又全部のGoogleのサービスはChromeのアカウントに戻る、この時は上記のステップ５からもう一回やったらいいです。
AWS の EFS を使ってみた

使ってみましたが、EC2 に簡単にマウントできるし、超便利ですね。
お値段は、S3 のように安くはないようなので、気をつける必要はありそうです。

EFS の、マウント方法では、以下のような Linux コマンドが紹介されています。

```
sudo mount -t nfs4 -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport <efs名>.efs.<リージョン名>.amazonaws.com:/ <マウントポイント>
```

これらのオプションを使用する事が推奨されており、意味は、以下のように説明されています。

```
rsize=1048576
```

それぞれのネットワーク READ リクエストで、NFS クライアントが受け取る最大バイト数の値。この値が EFS ファイルシステム上のファイルを読む時に適用される。パフォーマンスを損なわないように、最大値（1048576）を使用する事が推奨される。

```
wsize=1048576
```
NFS クライアントが WRITE リクエストの際に送る事ができる最大バイト数の値。この値が EFS ファイルシステムに書き込むときに適用される。パフォーマンスを損なわないように、最大値（1048576）を使用する事が推奨される。

```
hard
```

NFS リクエストがタイムアウトした時のNFS クライアントのリカバリ動作の設定で、サーバが応答するまで NFS リクエストは繰り返し試みられる。データの完全性を保つには、hard オプションの仕様が推奨される。soft マウントを使用するときは、timeo パラメータを少なくとも 150（150秒）にされたい。そのことにより、soft マウントに内在するデータ破壊の危険性を防ぐことができる。

```
timeo=600
```

NFS リクエストをリトライするまでの NFS クライアントが使用するタイムアウト値を 600 deci秒（60秒）にする設定。タイムアウトパラメータ（timeo）を変更しなければいけないのなら、少なくとも 150 という値（15秒と同値）にされたい。それにより、パフォーマンスの低下を防ぐことができる。

```
retrans=2
```

NFS クライアントがさらなるリカバリ動作を試みる回数

```
noresvport
```

NFS クライアントが、ネットワーク接続が再確立されたら、新しい TCP プロトコルのためのソースポートを使用することを宣言する。これにより、EFS ファイルシステムはネットワークの回復動作後にも可用性をとぎらせることがない。

```
_netdev
```

/etc/fstab に記述があれば、ネットワーク接続が可能になるまで、クライアントが EFS ファイルシステムをマウントする試みを防ぐ。 

（参考）
https://docs.aws.amazon.com/efs/latest/ug/mounting-fs-mount-cmd-general.html
https://www.slideshare.net/AmazonWebServices/moving-your-file-data-to-amazon-efs-aws-online-tech-talks
競プロを始めた初級者が感じたことをまとめてみる

# はじめに

競技プログラミング(競プロ)を始めて約二ヶ月経ち、生活の中に競プロが浸透してきたと感じたので、約二ヶ月を通して感じたこととこれからの予定を本記事にまとめます。

また、初心者の方は、本記事より前に[AtCoder に登録したら次にやること](https://qiita.com/drken/items/fd4e5e3630d0f5859067)を読むと良いと思います。

# (1) 競プロで感じたこと

以下では、競プロを通して感じたことをまとめます。

### [1] Pythonは遅い

今まで主にPythonでプログラミングをしてきたのですが、実行速度について意識したことがありませんでした。しかし、言語ごとで実行速度が異なるため、言語によっては正答の通りにコードを書いてもAcceptされないことが稀にあります。特に自分の使っているPythonはインタプリタ型の言語であるため、C++などのコンパイラ型の言語などと比べると、10~100倍程度遅いです[^1]。

### [2] 競プロ≒受験数学

受験数学は時間内により多くの問題を解く性質の競技であり、競プロも同様の性質を持ちます。また、いずれの競技にも典型問題が存在し、成果を出すためには典型問題で完答することが必要不可欠です。

### [3] 基本文法や基本アルゴリズムは必須

競プロを始めた際にはPythonの基本文法を一通り学んだ程度であり、完全には基本文法を覚えていませんでした。AtCoder Beginner Contest（ABC）では、A問題及びB問題は入力、出力、if文、ループ程度を知っていれば解くことができますが、それ以降の問題では基本文法を使いこなせないと解くことが難しいと感じました。また、特にD問題以降では基本的なアルゴリズムの知識も必要とされるため、単純な頭の体操ではないと感じました。

### [4] 慣れが重要

コンテストに出るほど問題を解くことに慣れていき、高いパフォーマンスを出すためにはこの慣れが非常に重要です。また、典型問題の場合は多くのコンテストでその問題を目にするため、考えずとも解けるという状態になります。この状態にすることで、より高速に問題を解くことができ、難しい問題への思考時間を確保することができます。

### [5] 強い人を見つける

自分よりも上のレベルの人を見つけることでモチベーションが上がり、勉強方法を真似ることもできるので、お勧めです。幸いにも自分の周りにはレベルの高い人が沢山いるため、勉強の励みになります。周りにいない場合は、Twitterなどで探すと良いのではないでしょうか。

###[6] 復習をする

[4]で多くのコンテストに出て慣れることが重要であると書きましたが、効率良く自身のレベルを上げるにはコンテストで出た問題を毎回しっかり復習することが重要だと思います。僕は、コンテストに参加した時に解いた問題全てとコンテストに参加した時に解けなかった問題のうちの一問を復習するようにしています。

ただ、理解ができない問題をいきなりやるのは無意味なので、問題のレベルを見て解くのも良いと思います。[AtCoder Problems](https://kenkoooo.com/atcoder)では、それぞれの問題名の色が「50%の人が正解できているレートの色」に対応しているので、参考にすると良いと思います。


# (2) これからの予定

以下では、競プロでこれから取り組もうと考えていることをまとめます。

### [1] バチャコンをやる

ゲーム性の高いものに面白さを感じるので、バーチャルコンテストを開いて過去問を解いていきたいと考えています。できれば二日に一回くらいのペースでやりたいと考えていますが、学校の授業の課題の進み具合と相談して進めようと思います。

### [2] 学校の課題を頑張る

アルゴリズムの基本を扱う授業を取ったので、その授業の課題を全力で頑張りたいです。

### [3] 螺旋本を進める

[螺旋本](https://www.amazon.co.jp/gp/product/4839952957)を買ったにも関わらず基本的なアルゴリズムを学んだら飽きてしまいました。避けては通れないと思うので、そろそろ取り組みたいと考えています。

[^1]: 競プロの範疇での話です
Raspberry Pi3 熱対策

KSYから「Pi3 B+ スターターキット」を購入した。
「Raspberry Pi3 Model B+」のことを調べてみると、パソコン等と同じでCPUの熱でパフォーマンスが下がるという記事を見つけた。

CPUの温度を調べるコマンド

```Bash
vcgencmd measure_temp
```
ヒートシンクありのアイドル時の温度が49.9度あった。
![pi3_49_9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289168/ebb5fcfe-2ca8-7f9f-6b5f-eec50909666a.png)

Amazonでネジ付属の冷却ファンを600円で購入し、付属の「Piケース RS V3」をヤスリと2.5mmドリルを使用して穴加工した。
ドリルで加工する際は摩擦熱でプラスチックが「削れる」ではなく「溶ける」になってしまう。加工しつつドリルを水か油で冷やし、削ること。
![raspi3_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289168/1e6dce29-7541-1203-b44c-bcaf7bdbe742.jpeg)　　![raspi3_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289168/98fbe555-5a41-0784-b09f-71eb9992f72b.jpeg)

ファン/ヒートシンクありアイドル時の温度は42.9度となり、-7度の冷却効果を得られた。
![pi3_42_9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289168/c60da217-4f06-9b80-8696-6676a92a5041.png)
初心者によるプログラミング学習ログ 130日目

# 100日チャレンジの130日目

twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。

100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。

130日目は、




<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>130日目<br><br>ドットインストールと、技術書でjavascript学習<br><br>javascriptな日でした<a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a><a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a><a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E3%81%A4%E3%81%AA%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアとつながりたい</a> <a href="https://twitter.com/hashtag/javascript?src=hash&amp;ref_src=twsrc%5Etfw">#javascript</a></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1183855345673748482?ref_src=twsrc%5Etfw">October 14, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
相関サブクエリの複数カラムを一括で取得する(LATERAL句)

[こちらの記事](https://qiita.com/ikedadb/items/fd3f6c76065aca8fa8e0) にある「相関サブクエリの複数カラムを一括で取得する」件、LATERAL句を使うことができないか？と思いました。

## LATERAL 句
* Oracle 12c (12.1) から
* PostgreSQL 9.3 から
* MySQL 8.0.14 から

## スキーマ

```sql
create table cmain
(
  n varchar(1),
  d varchar(2),
  key1 varchar(3),
  key2 varchar(4)
);
    
create table csubt
(
  d varchar(4),
  dd varchar(3),
  key1 varchar(3),
  key2 varchar(4)
);
  
insert into cmain values('1','11','111','1111');
insert into cmain values('2','22','222','2222');
insert into cmain values('3','33','333','3333');

insert into csubt values('1100','101','111','1111');
insert into csubt values('2200','202','222','2222');
insert into csubt values('3300','303','333','3333');
```

## SQL

```sql
SELECT cm.n    AS cm_n,
       cm.d    AS cm_d,
       cm.key1 AS cm_key1,
       cm.key2 AS cm_key2,
       cb.d    AS cb_d,
       cb.dd   AS cb_dd
FROM cmain cm,
LATERAL (
  SELECT t.d, t.dd
  FROM csubt t
  WHERE t.key1 = cm.key1
  AND t.key2 = cm.key2
) cb
ORDER BY cm_key1, cm_key2
```

## 実行結果

| cm_n | cm_d | cm_key1 | cm_key2 | cb_d | cb_dd |
|------|------|---------|---------|------|-------|
|    1 |   11 |     111 |    1111 | 1100 |   101 |
|    2 |   22 |     222 |    2222 | 2200 |   202 |
|    3 |   33 |     333 |    3333 | 3300 |   303 |

## 個人的には
使いみちとして合ってそうですが、頻繁に `LATERAL` を使うかと言われると、微妙。
列が2個くらいだったら、SELECT句に副問合せを書いてしまうかも。
UrlFetchApp.fetchAllもタイムアウトで使えない

[前回](https://qiita.com/khsk/items/7d90513c88559e3d703f)タイムアウトの待ち時間が設定できず、トリガーの時間浪費が厳しいと書きました。

そこで、`UrlFetchApp.fetchAll`を使って並列でリクエストを送ることにしました。
これなら全部タイムアウトしても最悪値ひとつだけの時間消費で済むはずと考えたからです。

[`UrlFetchApp.fetchAll`が並列であることは解説していただいているのでよいとして](https://qiita.com/tanaike/items/f6da88f0f769f6096c37)、タイムアウトしたときの処理はよくわかりませんでした。

```js
  // スプレッドシートで管理している監視先情報の取得
  var infoObj = JSON.parse(getData(SERVER_SHEET_NAME))
  
  var requests = []
  infoObj.map(function(row) {
    requests.push({
      url: row.URL,
      method: 'get',
      muteHttpExceptions: true,
    })
  })
  try {
    var responses = UrlFetchApp.fetchAll(requests);
  } catch(e) {
    Logger.log(e)
  }
  Logger.log(responses)
```

requestsの中には接続できないURLが含まれています。

結論として、
**タイムアウトで例外が発生し、`responses`が空だった**
というのが軽い検証の結果でした。

仮にこれが真だとすると、ひとつでもコケる可能性があるURLがあると他の正常なリクエストも巻き添えで死ぬため、
そういった場合は`fetchAll`ではなく`fetch`ループのほうがマシな可能性まで生まれるんじゃないかと思います。

頻繁に死ぬようなURLを短時間にチェックする方法がやはり異端かな。
firebaseのstorageでXMLHttpRequestエラーの対処法(ReferenceError: XMLHttpRequest is not defined)

# はじめに
firebaseの`CloudStorage`を`Next`で使おうとしたら次のようなエラーが起きた。

```
C:\XXXXXXXXXXXXXX\node_modules\@firebase\storage\dist\index.cjs.js:611
        this.xhr_ = new XMLHttpRequest();
                        ^

ReferenceError: XMLHttpRequest is not defined
```

# 原因
どうやら`XMLHttpRequest`はブラウザ用のAPIらしく、要はクライアントサイドでしか呼び出せないみたい。

# 対処法
`Next.js`であれば、`getInitialProps()`内でstorageを呼び出すのではなく、`useEffect()`等を使ってクライアントサイドで呼び出す。

`Node.js`には代替として`Http API`があるみたい(確かめていません)
詳しくはこちらの記事を参考にしてください。
[Qiita - Node.jsでFetch APIを使うと XMLHttpRequest is not defined になる @IzumiSy ](https://qiita.com/IzumiSy/items/ede321e9bc85f1ca499c)

# 参考

- [Qiita - Node.jsでFetch APIを使うと XMLHttpRequest is not defined になる @IzumiSy ](https://qiita.com/IzumiSy/items/ede321e9bc85f1ca499c)
- [stackoverflow - Loading an image with getDownloadURL() from firebase storage do not work
](https://stackoverflow.com/questions/54015608/loading-an-image-with-getdownloadurl-from-firebase-storage-do-not-work/54015966)
デバイスをSigfoxクラウド上で確認できないとき

「困ったときの再起動」
確かに一理ありますが、デバイスからメッセージを送っているはずなのに、Sigfoxクラウドで確認できないということがあるかもしれません。何か調子がおかしいからといって、**デバイスの削除(Delete Device)だけはやめましょう**。
まずは、[こちら(デバイスメッセージをSigfoxクラウド上で確認できないとき)](https://qiita.com/ghibi/items/d6d4256e7810b82a12b6)を参考にデバイスのトークンとシーケンス番号を確認してください。

#デバイスを削除すると何が起きるか
デバイスを削除しても、改めて登録すれば、トークンが有効になり、再び利用することができます。が、以下の点に注意してください。

- PACはワンタイムコードです。デバイス購入時に付属していたPACコードはデバイス登録動作時に新たなコードに変わります
- 削除したデバイスのPACコードがわからないことがあります

つまり、Sigfoxアカウントの権限次第ではありますが、場合によっては、一度**削除したデバイスは自分の力では再登録できない**ということになってしまいます。

#対策
##PACコードを確認する
Sigfoxクラウドのデフォルト設定では新たに発行されたPACコードはDeviceTypeリストに表示されていません。リスト右上の設定![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172313/cef417c6-09f8-78df-ae03-4d2c383f5117.png)ボタンをクリックし、**"PAC"**を選択してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172313/18529aa9-6f96-68a2-4dff-520e760d2ff6.png)
*PACは大切なコードです。第三者に見られないようにしてください。*

##削除されたデバイスかどうかを確認する
削除されたデバイスは、Device List画面の**DELETED DEVICES**メニューから辿ることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172313/91e19082-4f30-8ee7-5959-584f03009671.png)
Deleted Device Listに表示されているPACを使うことにより、削除されたデバイスの再登録が可能となります。

##（念のため）回線契約状態も確認する
Sigfoxは全世界共通でサブスクリプションモデルです。回線契約が有効になっていないと、お手持ちのデバイスを使うことはできません。
Sigfox backendクラウド上の[Contracts List](https://backend.sigfox.com/contractinfo/list)で各デバイスタイプに紐づく回線契約の状況を確認するようにしてください。
Contract Listページから、該当のContract Nameをクリックすると回線契約情報ページに推移します。特にこの中でも、下図の情報を確認することをお奨めします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172313/dc09e928-0d69-43d8-0d7d-8f1fcd7c122e.png)

|項目|説明|
|:---|:---|
|Start date|回線契約の開始日|
|Activation end date|デバイスアクティベーションが可能な期限|
|Communication end date|Sigfox通信が可能な期限|
つまり上図例ですと、この契約に紐づくデバイスタイプ（デバイス）は2019年11月10日以降は新たにデバイスをアクティベート（回線開通）できなくなります。ただ、既にアクティベート済みのデバイスは引き続き利用できます。2021年11月10日になると全デバイスが利用できなくなりますので、この期限までに回線契約の更新（新規契約）が必要となります。

|項目|説明|
|:---|:---|
|Maximum devices|契約上の最大デバイス登録可能数|
|Subscriptions in use|利用中のデバイス数|
|Subscriptions used|利用済みデバイス数|
Subscriptions in use数とSubscriptions used数の合計がMaximum devicesに達すると新たにデバイスをアクティベートすることができなくなります。
*デバイス登録は可能であるため、登録はしているがアクティベートされないという状況になる場合もあります。デバイス登録はMaximum devicesを超えないように登録しておくことをお奨めします*

[Sigfox Japan KCCS](https://qiita.com/organizations/sigfox)
【Rails】numericalityを使って属性に数値のみが使われている事を検証する

こんばんは！
validationのnumericalityヘルパーの備忘録

## DBに保存されちゃう

```erb:views/sample.html.erb
<%= form_for @post do |f| %>
  <%= f.label :price %>
  <%= f.text_field :price %>
<% end %>
```

![スクリーンショット 2019-10-19 20.11.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428016/446f067d-e15d-6e3c-99c8-58af5ac1dcef.png)

`form_for`内の`text_field`に全角数字を入れるとDBには「0」で保存されてしまう。カラムの型は`integer`

![スクリーンショット 2019-10-19 20.12.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428016/1b2fca70-0ab0-6177-dffd-a92110ac68d1.png)


## modelにnumericalityを追加

```ruby:models/sample.rb
class Post < ApplicationRecord
  validates :price, numericality: { only_integer: true }
end
```

`:only_integer`を`true`に設定すると、属性の値に対するvalidationで`/\A[+-]?\d+\z/`の正規表現が使われます。これで全角数字はDBに保存されず弾かれるようになります

## オプション色々

#### :greater_than
 指定された値よりも大きくなければならないことを指定します。デフォルトのエラーメッセージは「must be greater than %{count}」です。

#### :greater_than_or_equal_to
 指定された値と等しいか、それよりも大きくなければならないことを指定します。デフォルトのエラーメッセージは「must be greater than or equal to %{count}」です。

#### :equal_to:
指定された値と等しくなければならないことを示します。デフォルトのエラーメッセージは「must be equal to %{count}」です。

#### :less_than:
指定された値よりも小さくなければならないことを指定します。デフォルトのエラーメッセージは「must be less than %{count}」です。

#### :less_than_or_equal_to:
指定された値と等しいか、それよりも小さくなければならないことを指定します。デフォルトのエラーメッセージは「must be 
less than or equal to %{count}」です。

#### :other_than:
渡した値以外の値でなければならないことを指定します。デフォルトのエラーメッセージは「must be other than %{count}」です。

#### :odd:
trueの場合は奇数でなければなりません。デフォルトのエラーメッセージは「must be odd」です。
:even: trueの場合は偶数でなければなりません。デフォルトのエラーメッセージは「must be even」です。


## まとめ

整数の値のみ扱いたいのでれば`number_field`使えばいい事に気づきました

#### 終わり
Target Encodingを使ってみた

#背景
あるテーブルデータのコンペに参加していて、特徴量が少なく、Target Encodingなるものを使って特徴を増やそうと思い、色々探しました。
qiitaには以下の記事があります。

[Target Mean Encoding](https://qiita.com/suaaa7/items/cfe9a9e516b5b784570f)

によると、以下の方法でtarget encodingできるらしいとのこと

```
# 1
label_mean = df.groupby('category').label.mean()
df = df.assign(target_enc=df['category'].map(label_mean).copy())

# 2
df = df.assign(target_enc2=df.groupby('category')['label'].transform('mean').copy())
```

やってみると簡単にできました。
ただ、テーブルデータ初心者の私はあるところでつまづきます。そうテストデータです。
テストデータでも同様にgroupbyしてトレインデータと同じようにラベルの平均値を振る必要がありますが、
スマートに行う方法が思いつきません。
変換表を逐一つくるのも面倒です。

#適したライブラリを発見する

(個人的に)使いやすいライブラリを見つけました。
[Category Encoders](https://contrib.scikit-learn.org/categorical-encoding/targetencoder.html)

#使ってみる

まず、Category Encodersをインストールします。

```
pip install category_encoders
```

使ってみましょう

```
from category_encoders.target_encoder import TargetEncoder
import pandas as pd

df = pd.DataFrame({ 'category': ['A','A','B','B','B','C','C','C','C','D'],
                    'label': [1,0,1,0,0,1,0,1,1,1]
                  })

TE = TargetEncoder()
df["target_enc"] = TE.fit_transform(df["category"],df["label"])

```

```
|   | category | label | target_enc|
| 0 |    A     |  1    | 0.526894  |
| 1 |    A     |  0    | 0.526894  |
| 2 |    B     |  1    | 0.365121  |
| 3 |    B     |  0    | 0.365121  |
| 4 |    B     |  0    | 0.365121  |
| 5 |    C     |  1    | 0.742886  |
| 6 |    C     |  0    | 0.742886  |
| 7 |    C     |  1    | 0.742886  |
| 8 |    C     |  1    | 0.742886  |
| 9 |    D     |  1    | 0.600000  |
```

よくみると結果が少しおかしいですね。というのも、Aは1と0の平均なので0.5にならなければなりません。

これは、自動でsmoothingのデータの水増しが行われているためです。おそらくこのほうがLeakしないのかと思われます。
試しに、smoothingを0.1にしてみます(0にはできないらしいです。)

```
from category_encoders.target_encoder import TargetEncoder
import pandas as pd

df = pd.DataFrame({ 'category': ['A','A','B','B','B','C','C','C','C','D'],
                    'label': [1,0,1,0,0,1,0,1,1,1]
                  })

TE = TargetEncoder(smoothing=0.1)
df["target_enc"] = TE.fit_transform(df["category"],df["label"])
```

このように返ってきます

```
|   | category | label | target_enc |
| 0 |    A     |   1   | 0.500005   |
| 1 |    A     |   0   | 0.500005   |
| 2 |    B     |   1   | 0.333333   |
| 3 |    B     |   0   | 0.333333   |
| 4 |    B     |   0   | 0.333333   |
| 5 |    C     |   1   | 0.750000   |
| 6 |    C     |   0   | 0.750000   |
| 7 |    C     |   1   | 0.750000   |
| 8 |    C     |   1   | 0.750000   |
| 9 |    D     |   1   | 0.600000   |
```

そして、テストデータに適用する場合は簡単です。transformするだけ。

```
df_test = pd.DataFrame({ 'category': ['A','B','C','C','D']
                  })
df_test["target_enc"] = TE.transform(df_test)
```

上記のデータと同じようにエンコーディングされていますね。

```
　　category	target_enc
0	A	　　　　0.500005
1	B	　　　　0.333333
2	C	　　　　0.750000
3	C	　　　　0.750000
4	D	　　　　0.600000
```
flutterテストライブラリのバージョンによる依存

単体テストに必要なtestパッケージ、ウィジェットテストに必要なflutter_testでtest_apiというパッケージへの依存があり、それぞれ依存しているtest_apiのバージョンが競合しpub getが失敗するという状況になった。

うまく行ったのはflutter自体がv1.10.14のときに、次のように指定した場合。 test_apiのバージョンは0.2.5のようです。

```
dev_dependencies:
  test: 1.6.3
  flutter_test:
    sdk: flutter
```

失敗時のエラーメッセージは次の二種類でした。

```
Because every version of flutter_test from sdk depends on test_api 0.2.5 and test >=1.9.2 depends on test_api 0.2.9, flutter_test from sdk is incompatible with test >=1.9.2.

So, because couple_todo depends on both test 1.9.2 and flutter_test any from sdk, version solving failed.
```

```
Because every version of flutter_test from sdk depends on test_api 0.2.5 and test >=1.6.0 <1.6.1 depends on test_api 0.2.3, flutter_test from sdk is incompatible with test >=1.6.0 <1.6.1.
So, because couple_todo depends on both test 1.6.0 and flutter_test any from sdk, version solving failed.
pub get failed (1)
Process finished with exit code 1
```
LaravelのBladeで親-子-孫のレイアウトを実現するための簡単なやり方

# 概要

Laravelのbladeを利用して、3階層にレイアウトを振りたいときがあります。

例えば、タブを切り替えたいんだけど、viewを分けなきゃいけない・・・。でもタブの部分とかは共通だからviewに毎回書くのは面倒・・・というときです。
例として上げるとすれば食べログの詳細ページのように、メニューなどに移動するとしても上部は共通レイアウトですよね。こんなとき、マスターのレイアウトをもう一個作るというのもありですがそれはそれでレイアウトに重複する部分が出てきてしまって更新時にミスが起こりやすくなります。

# 想定

本来、以下の場合に

```master.blade.php
header
@yield('content')
footer
```

```sublayout.blade.php
@extends('master')
@section('content')
   aaa
   @yield('content')
   bbb
@endsection←か@stop
```

```show.blade.php
@extends('sublayout')
@section('content')
    ccc
@endsection
```

以下のような結果として出てほしいわけです。

```
header
aaa
ccc
bbb
footer
```

ただこのソースの場合だと以下の結果になります。

```
header
ccc
footer
```

sublayoutのsectionが意味を成してないことになってますね。

# 解決方法

endsectionをoverwriteに変更すれば解決します。

なんで直感的にならなかったのかは歴史的な背景があり、

https://github.com/laravel/framework/issues/8970

このissueで話されています。
端的に言えば5.1の時点でoverwriteじゃなかったから移せなかった。ってことですね。

そのうちこの仕様は変わるのかもですが・・・。

# 強引に切り替える

こういうのを入れれば良いですね。

```php
\Blade::directive('endsection', function () {
    return '<?php $__env->stopSection(true); ?>';
});
```
iTerm2で複数行のコピペ(貼り付け)の際にアラートを！

iTerm2でコピペしたものを貼り付けた際に複数行あやまってペーストしてしまった場合に警告を出し、誤操作を防ぐ。


作業中あやまって複数の更新クエリを流してしまったなどを防ぐために行う。

最初はトリガ機能で改行コードを正規表現で発見しアラート表示させようかとしたが失敗なぜかうまくいかない。。。


色々いじってた所シンプルにiTerm2の機能で、複数行コピペは警告が出せることを知った。。。

#肝心の設定は「Edit」→「Paste Special」で設定可能。
<img width="1077" alt="1571482110943.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165170/5d257e88-6b23-f3d1-7a3c-d3bec2a23d0f.png">


この上記画像のチェックの入っている箇所に注目する。（デフォルトではこの三つにチェックが入っているはず）
『Warn Before Multi-Line Paste』 :複数行の貼り付け前に警告する
『Limit Multi-Line Paste Warning to Shell Prompt』 :複数行の貼り付けの警告をシェルプロンプトに制限する
『Warn Before pasting One Line Ending in a Newline at Shell Prompt』 :シェルプロンプトで改行で終わる1行を貼り付ける前に警告する
（By Google翻訳）<br>
なので、『Limit Multi-Line Paste Warning to Shell Prompt』のチェックを外すとOK
複数行貼り付け時に警告が出る！！

<img width="752" alt="1571482764804.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165170/7ba2d21f-a272-f572-e53c-87537478ea81.png">


これで安心安全のiTerm2生活が送れます。。。
この前ほんと変な文章をサーバー上でコピペして貼ってしまった時は死ぬかと思った。。。


以上！！
[Ruby] 文字列からDateクラスのインスタンスを生成する

超シンプルなことなのに、なぜか僕は毎回忘れてしまう。

こうやって投稿することで、もう2度と忘れることはないだろう（期待）

# やりたいこと
```rb
"1996-03-01"
```
みたいな文字列から、この日付の `Date` クラスのインスタンスを生成したい。

# 結論
`parse` メソッドを使うだけ

```rb
Date.parse("1996-03-01")
# => Fri, 01 Mar 1996
```

# 無駄な努力
ここから先は読む必要ないです。

これまで僕は、`Date` クラスでインスタンス生成できるの `new` しか知らんかった。

```rb
Date.new("1996-03-01")
# ArgumentError (comparison of String with 0 failed)
```
無理やりぶち込もうと思っても怒られる。

だから毎回こんなことやってた。

```rb
list = "1996-03-01".split('-').map(&:to_i)
Date.new(list[0], list[1], list[2])
# => Fri, 01 Mar 1996
```

`parse` さんね、便利な世の中やな。

おわり。

参考
- [How do I create a Ruby date object from a string? - Stack Overflow](https://stackoverflow.com/questions/3529470/how-do-i-create-a-ruby-date-object-from-a-string)
- [class Date (Ruby 2.6.0)](https://docs.ruby-lang.org/ja/latest/class/Date.html)
Ubuntuをインストールしたら最初にすることメモ

# apt

## 一括アップデート

```
$ sudo apt update && sudo apt -y upgrade && sudo apt -y dist-upgrade && sudo apt -y autoremove && sudo apt -y autoclean
```

※アップデート後に再起動させる場合は、` && sudo init 6`を追加します。

# Python

## pipのインストール

```
$ sudo apt -y install pyhton-pip
$ sudo apt -y install python3-pip
```

## JupyterLabのインストール

[こちら](https://qiita.com/ats030/items/1324f41f6c4020808737)の記事を参照。

# VNC Connect

[こちら](https://qiita.com/ats030/items/14713e006a540141ebd3)の記事を参照。
VNC Connectでリモートデスクトップ環境を構築する

# VNC Connect

RealVNC社のVNC（Virtual Network Computing）を用いてリモートデスクトップ環境を構築します。

## VNC Serverのインストール

[VNC Server](https://www.realvnc.com/en/connect/download/vnc/)をインストールしたPCには別のPCからアクセスできます。各OSに応じたインストーラをダウンロードして、インストールを実行します。

## VNC Viewerのインストール

[VNC Viewer](https://www.realvnc.com/en/connect/download/viewer/)によりVNC ServerをインストールしたPCにアクセスできます。各OSに応じたインストーラをダウンロードして、インストールを実行します。

# その他設定

## UbuntuをインストールしたノートPCで蓋を閉じてもサスペンドさせない設定

ノートPCにインストールしたUbuntuをリモートデスクトップで用いることが多い場合は、蓋が閉じている状態でもサスペンドしない設定にしておくと便利です。

```
$ sudo nano /etc/systemd/logind.conf
```

```Ruby:/etc/systemd/logind.conf
- #HandleLidSwitch=suspend
+ HandleLidSwitch=ignore
```

再起動して設定を反映します。

```
$ sudo systemctl restart systemd-logind
```
strip()で文字列が削除されない場合の理由

[Python 3\.x \- \.strip\(\)で文字列を消去できない｜teratail](https://teratail.com/questions/168966)


```py
>>> a = 'www.example.com'
>>> a.strip('example')
'www.example.co'    # www..comを期待したのに
```

```py
>>> a.lstrip('example').rstrip('example') # ２つ合わせたのと同じ

>>> a.lstrip('example')
#'www.example.com'の先頭にeがあれば削除して次の文字へ
#'www.example.com'の先頭にxがあれば削除して次の文字へ
#'www.example.com'の先頭にaがあれば削除して次の文字へ
#'www.example.com'の先頭にmがあれば削除して次の文字へ
#'www.example.com'の先頭にpがあれば削除して次の文字へ
#'www.example.com'の先頭にlがあれば削除して次の文字へ
#'www.example.com'の先頭にeがあれば削除して次の文字へ
'www.example.com' # 変わらない

>>> a.lstrip('example')
#'www.example.com'の末尾にeがあれば削除して次の文字へ
#'www.example.com'の末頭にlがあれば削除して次の文字へ
#'www.example.com'の末頭にpがあれば削除して次の文字へ
#'www.example.com'の末頭にmがあれば削除して次の文字へ
#'www.example.co'になる 
#'www.example.co'の末頭にaがあれば削除して次の文字へ
#'www.example.co'の末頭にxがあれば削除して次の文字へ
#'www.example.co'の末頭にeがあれば削除して次の文字へ
'www.example.co'
```

理由は

[組み込み型 — Python 3\.7\.5 ドキュメント](https://docs.python.org/ja/3/library/stdtypes.html?highlight=strip#str.strip)

ということで文字集合だからでした。

replaceを使えば削除できる。

```py
>>> a = 'www.example.com'
>>> a.replace('example','')
>>> 'www..com'
```
Background Thread

start buttonを押すとThreadが背景で執行される方法。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505344/143685b2-e3af-eaba-8472-0529ea3b88fa.png)

#手法1. extends Thread class
```java:MainActivity.java

//This method will be onClick method of a button
    public void startThread(View view){
        MyThread myThread=new MyThread(10);
        myThread.start();
    }

//create a custom thread
    public class MyThread extends Thread{

        //defining second externally
        int seconds;

        //create a constructor and take parameter of seconds
        public MyThread(int seconds){
            this.seconds=seconds;
        }
        //Override run method
        @Override
        public void run() {
            for(int i=0;i<seconds;i++){
                    Log.d(TAG, "startThread:" + i);
                    try {
                        Thread.sleep(2000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
            }
        }
    }
```
startを押すと背景でThreadが執行されながらも、UIは凍結せず相変わらず使用可能です
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505344/09c762f2-4674-b5cc-0442-190ec1abc420.png)




#手法2. implements Runnable interface

```java:MainActivity.java

//This method will be onClick method of a button
    public void startThread(View view){
        Run run=new Run(10);
        new Thread(run).start();
    }

//defining custom runnable class
    public class Run implements Runnable{
        int seconds;
        //create constructor
        public Run(int seconds){
            this.seconds=seconds;
        }

        public void run() {
            for(int i=0;i<seconds;i++){

                Log.d(TAG, "startThread:" + i);

                try {
                    Thread.sleep(2000);

                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

        }
    }
```

二つの手法の結果は同じです。以上です。
sprintf()の機能

#フォーマット指定の文字列を作成できる
　printf()はフォーマット指定したものをコマンドプロンプトなどに出力することができた。一方で、sprintf()はフォーマット指定したものを文字列に入れることができる。
　ざっくりいうと、sprintf()はprintf()の文字列（String）格納版である。

#実行例
ソース

```sprintfExample.c
#include<stdio.h>

int main(){
	int a = 100;
	char mojiretsu[20];
	
	sprintf(mojiretsu, "aは%dです\n", a);	//文字列に入れるだけ
	printf(mojiretsu);						//コマンドプロンプトに表示する
}
```

実行結果

```sprintfExample.exe
$ gcc sprintfExample.c -o sprintfExample
$ sprintfExample
aは100です
```

#まとめ
 sprintf()はフォーマット指定で文字列を生成することができる（コマンドプロンプトには表示しない）。
　詳しいことは以下のサイトを参考にしてほしい。
http://www.c-tipsref.com/reference/stdio/sprintf.html
JupyterLabの環境を整える

# JupyterLabをインストールする（pip）

```
$ sudo pip install jupyterlab
$ sudo pip3 install jupyterlab
```

# JupyterLabを実行する

```
$ jupyter lab
```

# JupyterLabでRを使えるようにする

まず、devtoolsパッケージをRにインストールします。

```Ruby:R
> install.packages("devtools")
```

次に、devtoolsでGithubからIRkernelをインストールします。

```Ruby:R
> devtools::install_github("IRkernel/IRkernel")
```

最後に、IRkernelとJupyterLabを繋げます。

```Ruby:R
> IRkernel::installspec()
```
RailsAPIでページネーションに対応したJSONを返す(kaminari使用)

欲しいjsonのイメージは下記の通り。

(GET /api/v1/users を想定） 

```json
{
  "data": [ 
    {
      "id": "1",
      "type": "user",
      "attributes": {
        "name": "user1",
        "email": "test1@example.com"
    },
    {
      "id": "2",
      "type": "user",
      "attributes": {
        "name": "user2",
        "email": "test2@example.com"
    },
    {
      "id": "3",
      "type": "user",
      "attributes": {
        "name": "user3",
        "email": "test3@example.com"
    },
  },
  "pagenation": {
    "current": 1,
    "previous": null,
    "next": 2,
    "limit_value": 3,
    "pages": 2,
    "count": 6
    }
  }
}
```

dataとは別に、paginationというメタデータをクライアント側に送ることで、ページネーション機能を実装してもらうことを考えています。

## 実装方法

### kaminariの導入

```Gemfile

gem 'kaminari'
```

bundle installする。

```bash

$ bundle install
```

これにより、ActiveRecord:Baseを継承したクラスはpageメソッドを得る。

### Paginationモジュールの作成

app/controllers/concernに、pagination.rbを作成。

```app/controllers/pagination.rb

module Pagination
  def resources_with_pagination(resources)
    {
      pagenation: {
        current:  resources.current_page,
        previous: resources.prev_page,
        next:     resources.next_page,   
        limit_value: resources.limit_value,
        pages:    resources.total_pages,
        count:    resources.total_count
      }
    }
  end
end
```

resourcesはUser.allのような、ActiveRecord::Relation型のデータを受け取ることを想定しています。

current_pageといったメソッドは、kaminariによって追加されたメソッドなので、github参照。

kaminari: https://github.com/kaminari/kaminari


### コントローラーで組み合わせる

Paginationをincludeし、先程定義したresources_with_paginationメソッドを得る。


```api/v1/users_contoller.rb

module Api
  module V1
    class UsersController < ApplicationController
      include Pagenation

      def index
        users = User.all.page(params[:page]).per(3)
        pagination = resources_with_pagination(users)
  
        #方法は色々あるでしょうが、今回はmergeで結合。
        json = USER_SERIALIZER.new(users).serializable_hash.merge(pagination)

        render_200(json)
      end

      # ...
```

これで、最初に記述した形のjsonをクライアントに返すことができます。

GET api/v1/users?page=2 といった形でリクエストを送ることで、必要な部分の情報だけを得ることができるので、あとはクライアント側で調整しましょう。
Windows10 任意スクショ作成　Win+Shift+S 超便利

Windows10 任意スクショ作成　Win+Shift+S 超便利

Win+Shift+S

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125746/ccfdd5d8-4263-a24c-e3df-b1c48a70461a.png)