OmniAICreator/Qiita-1.07M huggingface dataset:
Automation Anywhere Enterprise A2019 - エクセルで桁数の多い数字

#エクセルで桁数が大きくセルの幅を越えてしまい「#」表記となった時、A2019では値は取れる？

↓こういうやつです。この３行目と４行目の値をロボットで読んだ時にどうなるのか。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615564/12445c29-2862-193c-aa6f-58cdc6fe9e84.png)


#テスト１ Excelの基本操作
まず、Excelの基本操作を使い、ループで値を取ってみます。
Botはこんな感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615564/9293b1e9-5776-c81e-dc1e-8c49e1be1dc9.png)

結果は・・・出てます！問題ないですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615564/b3c53779-223c-6872-65e3-ec9b2643ec39.png)

#テスト２―１ Excelの高度な操作①
つぎに、Excelの高度な操作を使った方ですが、
赤く囲んだところ、読み込みのオプションがあります。
まずは、上の方。表記通りのテキストを取る・・・表記通り・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615564/5ec11442-48b5-f122-1fb2-c129055ba5f8.png)

表記通りでした（笑）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615564/9328008a-4953-f22c-4042-9b9f63d077e7.png)

尚、桁数少なく正しく表記できている物は、問題なく取れますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615564/64897e46-fb43-9ff2-36a8-9a5cb65c3a40.png)

なので、Excelの高度な操作で、表記通りの値を取る場合は、セルの幅を事前に設定しましょう！

#テスト２―２ Excelの高度な操作②
今度は、下の方、セルの値を取る設定で・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615564/b561afce-24dc-8898-b572-f94e635dd265.png)

こちらは、#になっている状態でも取得出来ました。
ただ、確かにセルの値ですね。円マークやカンマも入ってない形になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615564/048e7974-5fbd-e57b-47cf-56cec3e8f31e.png)

そして、こちらのやり方の場合ですが、
16桁以上の数字がセルに入ってい場合、このアクション自体が失敗しますのでご注意を。
AWSIotでのMQTT通信　WioLTE編

#３G通信でのMQTT

##WioLTEでの送信
Iot機器がいつもWi-Fiなどの通信環境にあるわけではない。
SIMカードを使用した情報送信が必要になってくる。

## 使用機器
* WioLTE
* SIM(soracom)
* usb コード

今回の環境は、自宅
つまり、電源に関しては、USBポートから安定して供給されるので省電力化の話はしません。

## なぜWioLTEなのか？

esp32などの小型で汎用性の高いものを使用するほうがいい気がするが、SIMの使用が一番簡単に行えるからだ。

## AWSIot

今回は、SIMでの送信でMQTTを使用する。
その際、ブローカーサーバに対して、証明書を発行し通信しないといけない。
なので、AWSIotで証明書を発行する。

手順は、[AWSIoTらくらく通信方法](https://dev.soracom.io/jp/docs/aws_iot_guide_console/)

上記のリンク先でほとんど書いている。

##　MQTT通信
通信時soracomのサーバを経由してAWSに送る。
その際、soracomが証明書を添付してAWSに送るので、マイコン送信時にコードでの記載必要ない。

```C++:testMqtt.ion

#include <WioLTEforArduino.h>
#include <WioLTEClient.h>
#include <PubSubClient.h> // https://github.com/SeeedJP/pubsubclient
#include <stdio.h>


#define APN "soracom.io"
#define USERNAME "sora"
#define PASSWORD "sora"

#define MQTT_SERVER_HOST "beam.soracom.io"
#define MQTT_SERVER_PORT (1883)

#define ID "AWS IoT"
#define OUT_TOPIC "test/wio"
#define IN_TOPIC "inTopic"


WioLTE Wio;


void setup()
{
  wio_setUP();
  connectMqtt();
}
void loop(){
  MqttClient.publish(OUT_TOPIC, "testDESU");
err:

  delay(2000);
}

void wio_setUP()
{
  delay(200);

  SerialUSB.println("### I/O Initialize.");
  Wio.Init();

  Wire.begin();
  Rtc.begin();

  SerialUSB.println("### Power supply ON.");
  Wio.PowerSupplyLTE(true);
  Wio.PowerSupplyGrove(true);
  delay(500);

  SerialUSB.println("### Turn on or reset.");
  if (!Wio.TurnOnOrReset())
  {
    SerialUSB.println("### ERROR! ###");
    return;
  }

  SerialUSB.println("### Connecting to \"" APN "\".");
  if (!Wio.Activate(APN, USERNAME, PASSWORD))
  {
    SerialUSB.println("### ERROR! ###");
    return;
  }
}

void connectMqtt()
{
  SerialUSB.println("### Connecting to MQTT server \"" MQTT_SERVER_HOST "\"");
  MqttClient.setServer(MQTT_SERVER_HOST, MQTT_SERVER_PORT);
  MqttClient.setCallback(callback);
  MqttClient.setClient(WioClient);
  if (!MqttClient.connect(ID))
  {
    SerialUSB.println("### ERROR! ###");
    return;
  }
  delay(1000);
}

```

WioLTEのMQTT＿exampleのコードです。
これで送信してみて通信できれば完了です。

## あとがき
私自身、これをやった際に、オンプレのサーバにデバイスIDではじかれる現象がありました。
なので、AWSIotを使用することになったのですが、触った感じすごく簡単だなっと思いました。データが来れば自動的にデータベースに格納してくれる。
認証周りもほどんと、外部サービスを使用しています。

ちなみに、オンプレですが、認証なしでは、送信できたんです。
ライブラリを改造しようとしましたが、修正箇所が多すぎるため断念しました。
phpunit テスト実行時にエラー　General error: 1 no such table テーブル名

エラー内容

```tarminal:tarminal
SQLSTATE[HY000]: General error: 1 no such table: users ...................
........
.....

```

usersテーブルが無いよ！って返事が北

テーブルあるけどなぁ、、、、
ggったらphpunit.xmlの設定を変えると改善するとのこと

```phpunit.xml
    <php>
        <server name="APP_ENV" value="testing"/>
        <server name="BCRYPT_ROUNDS" value="4"/>
        <server name="CACHE_DRIVER" value="array"/>
        <server name="DB_CONNECTION" value="sqlite"/><!--使用しているDB言語に変更-->
        <server name="DB_DATABASE" value=":memory:"/><!--使用しているDB名に変更-->
        <server name="MAIL_DRIVER" value="array"/>
        <server name="QUEUE_CONNECTION" value="sync"/>
        <server name="SESSION_DRIVER" value="array"/>
    </php>


```

```tarminal:tarminal

PHPUnit 8.5.8 by Sebastian Bergmann and contributors.

...                                                                 3 / 3 (100%)

Time: 4.47 seconds, Memory: 24.00 MB

OK (3 tests, 7 assertions)
```
無事テスト成功しました🙌
Retargeting vs remarketing campaigns


Retargeting vs remarketing campaigns
----

"Retargeting" and "remarketing" are pretty similar as they mean to achieve the same goals:

- Target audiences who already visited your site and are aware of your brand
- Engage and target people who are most likely to make a purchase
Help start building a lasting connection with the customers through brand awareness and recognition
- The differences between retargeting vs. remarketing are in the tactics used to accomplish these goals.

Retargeting primarily uses paid ads to target audiences who have visited your website or social media profiles.

Remarketing primarily uses email to target people who have already done business with your brand.

That’s where Google remarketing ads come in. It’s a powerful new marketing channel in Mailchimp that helps you convert website visitors into customers after they’ve left your store.

ref [link](https://mailchimp.com/resources/what-is-retargeting/)
【Flutter】multi_image_pickerでlivePhotoの拡張子が.MOVになったので.jpgにした

## multi_image_picker
Flutterのmulti_image_pickerというパッケージがあります。

これはデバイスの画像ライブラリにアクセスし画像を複数枚選ぶことができるパッケージです。

## 生じた問題
`multi_image_picker: ^4.7.14`
バージョンを`4.7.14`でインストールし、
iOSのlivePhotoを選択すると、エラーが生じる。

iOSの画像の拡張子は.heicで、これは.jpgに変換する様にコードも描いていたのでなぜエラーが起きるのか不明

調べてみると、livePhotoの拡張子が、.MOVになっていました。

選択した画像は、Assetなので、
`Image.asset(name)`
で表示すれば問題ないですが、保存するときには困りました。

## 原因
正直あまりよくわからないですが、
multi_image_pickerが4.7.12の時に、
`Fix picking live images on iOS will now pick the correct image`
`約：iOSでのライブ画像の選択を修正し、正しい画像を選択するようになりました`
と変更ログがありました。

これで変更があったのかもです。
iOSのlivePhotoは撮影すると、.heicと.movの二つのファイルが保存されるそうです。
したがって、選択するときに.heicではなく.movの方が選択されてしまうみたいです。

## 対処
.MOVののファイルを、.jpgに変換したら問題なく、画像になってくれました。

mime_typeというパッケージを使って、動画ファイルであることを調べて拡張子を変更できる様にしました、

ちょっと適当なサンプルなんですが、画像を選択して1枚目の画像のファイル名を変更するようにしました。
printでファイル名みれるようにしたが、ファイル名は変わってます。


```dart

loadAssets() async {
  List<Asset> resultList = List<Asset>();
  String name;

  try {
    resultList = await MultiImagePicker.pickImages(
      maxImages: 300,
      enableCamera: true,
      materialOptions: MaterialOptions(),
    );
  } on Exception catch (e) {
    print(e);
  }

  setState(() {
    name = resultList[0].name;
  });

  print('元の画像：$name');
  if (mime(name) == 'video/quicktime') {
    name = name.toLowerCase().replaceAll('.mov', '.jpg');
  }
  print('変更後の画像：$name');
}
```
wysiwygエディタ『Quill』の角を丸くする

#概要
Quillを素の状態で実装すると四つ角が直角になっている。
レイアウトを柔らかい印象にするため、角張ったデザインではなく、丸い形（角丸）にしたくなったので検証開始！

#環境
公式に丁度いい遊び場があるので利用する。[https://quilljs.com/playground/]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233660/27034080-f6da-c79e-4f79-b70619e297bf.png)

#検証
今回はChromeのデベロッパーツールを利用して、角丸にしたい部分のクラスを確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233660/e42bf5f2-70da-ec4d-a48e-a5adbe5c04a3.png)

まずはじめにツールバーの上部だけ丸くしたいのでCSSに下記を追加する。

```CSS
.ql-toolbar {
  border-radius: 10px 10px 0 0;
 }
```
いい感じの角丸に！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233660/36b7d22e-a5c5-3c69-8e6f-0896d05e3476.png)

ツールバー下の記入部分（editor)もツールバーと同様にクラスを確認して、CSSを追加していく。
今回は下の部分だけ角丸にして、ツールバーと一体として認識させるようにする。![image.png](https://qiita

```CSS
#quill-editor {
    border-radius: 0 0 10px 10px;
  }
```
いい感じの角丸に！（2度目）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233660/947c70b0-28fb-e7d0-5e2e-147394f17eb2.png)

#まとめ
書き残すほどではない内容ですが、一応備忘録として。
~~最初ツールバーだけ丸くならなくて「なんで!?」ってなったのは内緒。しっかり見ないとダメですね~~
Unity + Android メモリリーク調べる方法

<資料作成時の動作環境>
・windows 10 home
・Unity 2019.4.10f
・Androidが接続されてる状況

<対象>
・メモリリークの調べ方が分からん
・すぐに忘れる

<参考資料>
[公式]
https://docs.unity3d.com/ja/2018.4/Manual/ProfilerMemory.html
[動作している動画]
https://www.youtube.com/watch?v=rvnsU8oCMcI&feature=emb_logo
[参考資料]
https://kan-kikuchi.hatenablog.com/entry/Unite2017_BeforeOptimizing_1
https://light11.hatenadiary.com/entry/2019/07/14/235740

<確認方法>
Menu > Windows Profiler > Analysis > Unity Profiler
にて開く
※動画とか導入してるAssetで表示場所が変わるので注意。
多分Ctrl +7 のショートカットで表示するのを覚えるほうが楽。
<img width="300" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182971/b2ecff54-f185-2b7f-1cfe-cf78dc2f68dd.png">

とりあえずチェックが多いので減らす
（わかってる人は好きに増やす）
<img width="100" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182971/d209c0bd-345f-ff17-87d6-44d75eba6fcf.png">

端末を選ぶ
◎：データを端末から取得する
▶▶|：リアルタイムで最新データを表示（これがOHHの場合選択したタイミングのデータとなる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182971/531079de-2597-7def-aa51-67cdf83f1261.png)



<実機を動かす>
①DevelopmentBuildにチェック
<img width="300" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182971/f3b2f8e5-3374-e806-97ae-72b21cd9d7bd.png">

②commandプロンプトで端末と接続させる
 adb forward tcp:34999 localabstract:Unity-[ここにBundleIdentifierを入力]
例 `adb forward tcp:34999 localabstract:Unity-com.mydomain.name`

<あとは>
下にあるUsed Total が増え続けなければメモリリークをしていない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182971/f5e75d0e-80a5-2c2b-88e1-e85668718913.png)

以上最低限の動作確認。
データ分析基盤におけるデータレイクでの保持ファイル形式、および、インターフェースファイルの形式について

## 概要
データ分析基盤にてよく用いられるファイル形式を整理します。

## データ分析基盤で用いるファイル形式と利用指針

| 番号 | フォーマット                         | 説明                                                         | データ分析基盤での利用推奨                                   |
| ---- | ------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ |
| 1    | 区切り型テキストファイル（CSV、TSV） | カンマ区切り、あるいは、タブ区切りによりデータを保持したファイルフォーマットであり、容易に利用できる。データストアに取り込む際には、最も高速に取り込むことができることが多い。 | データレイク：× <br> 業務システム：〇 <br>     バッチレイヤーへの連携時：〇 <br> サービスレイヤーへの連携時：〇  <br> リアルタイム処理時：〇 <br> データ連携サービス：〇      <br> クエリエンジン：× |
| 2    | json                                 | システムで利用されるデータ形式。                             | ×                                                            |
| 3    | xml                                  | システムで利用されるデータ形式。                             | ×                                                            |
| 4    | Apache Parquet                       | 列指向のデータ形式。スキーマの自動読み込みが可能。           | データレイク：〇      <br> 業務システム：× <br> バッチレイヤーへの連携時：〇 <br> サービスレイヤーへの連携時：× <br> リアルタイム処理時：× <br> データ連携サービス：〇 <br> クエリエンジン：◎ |
| 5    | Delta Lake                           | ACID特性などを保持させなどのParquetを拡張させたデータ形式。データレイクにおけるスタンダードとなりそうなファイル形式。ただし、利用するサービスで対応しているか確認する必要がある。 | データレイク：◎ <br> 業務システム：×  <br> バッチレイヤーへの連携時：× <br> サービスレイヤーへの連携時：× <br> リアルタイム処理時：〇 <br> データ連携サービス：〇      <br> クエリエンジン：〇 |
| 6    | Apache Avro                          | スキーマ情報を保持しており、システム間でデータ交換を行うための行指向のデータ形式。 | データレイク：× <br> 業務システム：× <br> バッチレイヤーへの連携時：◎ <br> サービスレイヤーへの連携時：×  <br> リアルタイム処理時：◎ <br> データ連携サービス：〇 <br> クエリエンジン：× |
| 7    | ORC                                  | Hiveの処理に最適化された列指向のデータ形式。                 | ×                                                            |
| 8    | Common Data  Model                   | 標準の共通データ  モデル形式のスキーマ化されたデータとして保存するデータ形式。 | データレイク：×  <br> 業務システム：◎ <br> バッチレイヤーへの連携時：× <br> サービスレイヤーへの連携時：× <br> リアルタイム処理時：×      <br> データ連携サービス：〇 <br> クエリエンジン：× |

## Q&A
CentOS8.2でApacheのインストールがエラーになる

個人的に詰まったのでメモ

```
# dnf install httpd
エラー:
 問題: package httpd-2.4.37-21.module_el8.2.0+494+1df74eae.x86_64 requires system-logos-httpd, but none of the providers can be installed
  - conflicting requests
  - package centos-logos-httpd-80.5-2.el8.noarch is filtered out by exclude filtering
(インストール不可のパッケージをスキップするには、'--skip-broken' を追加してみてください または、'--nobest' を追加して、最適候補のパッケージのみを使用しないでください)
```
###原因
system-logos-httpdのCentOS8.2 2004版がAppStream,remi,epel,Ravenにまだ上がっておらず、dnfコマンドからインストールできないことが原因かと思われる


###対処
ここからrpmファイルをダウンロード
https://rpmfind.net/linux/rpm2html/search.php?query=system-logos-httpd

FTPツールで/home/hogehomeに転送してインストール

```
# rpm -ivh centos-logos-httpd-80.5-2.el8.noarch.rpm
```

再度Apacheインストールを試みるとインストールができるようになっていた
【VSCode】スクロールどんだけ下いくねん問題の対処方法

## 結論
以下のようにすればok

```json
{
  "editor.scrollBeyondLastLine": false,
  "editor.padding.bottom": 100
}
```

## 説明
何も設定しないとこうなります。地獄です。
![スクリーンショット 2020-10-26 14.13.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420501/701484a6-6a9d-85f2-d2fb-ff03e8f2e5ce.png)


とりあえず、スクロールについての設定を追加。行き過ぎないようにします。

```json
  "editor.scrollBeyondLastLine": false
```

![スクリーンショット 2020-10-26 14.15.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420501/ec56e32f-1c4a-54ec-d9a1-d0f4b6ea4643.png)
これはこれでギュウギュウなので僕は好きじゃありません。

なので隙間を作リます。

```json
  "editor.padding.bottom": 100
```
![スクリーンショット 2020-10-26 14.13.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420501/c4b3ca43-db3c-96c2-f226-8f972d58cae8.png)
これで幸せですね。好みで数字を変更してください。
AWSのEC2(Amazon Linux2) でNEM Symbol のテストネットノードを起動

Symbolのノード起動方法を様々な環境で紹介するのが流行ってるっぽいので（流行ってない）、私はAWSのEC2(Amazon Linux2) での起動方法を紹介します。

### 起動スペック
~~t3.small(2CPU メモリ2GB)
30GB SSD~~
t3.large(2CPU メモリ8GB)
50GB SSD(うちスワップ割り当て16GB)



[Using Symbol Bootstrap](https://docs.symbolplatform.com/ja/guides/network/using-symbol-bootstrap.html)

### インスタンス起動直後
```
sudo yum upgrade -y
sudo yum install git ntp -y
```

取り合えず実行する、いつものあれです。
正しい時刻を持っていないと同期されにくいかもしれないので、NTPもインストールしておきます。

### NodeJSインストール
```sh
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.35.3/install.sh | bash
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"
source .bashrc
nvm install  v14.12.0
```
今回は適当に NodeJS v14.12.0をインストールしてみました。


### docker インストール
```sh
sudo amazon-linux-extras install docker -y
sudo systemctl enable docker
sudo systemctl start docker
sudo usermod -a -G docker ec2-user
sudo curl -L https://github.com/docker/compose/releases/download/1.25.1/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
exit
```


docker、docker-composeをインストールして最後にログアウトしてもう一度入り直します。
これは入りなおさないとec2-userでdockerを起動できないからなのですが、
どなたか公式な手順をご存知でしたら教えてください。

### スワップ設定
```
sudo dd if=/dev/zero of=/swapfile bs=512M count=32
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
sudo swapon -s
```

EC2はスワップ設定無しで提供されます。
初回起動時は最新ブロックまで追いつこうと急激な負荷がかかりますのでスワップ設定をして耐えましょう。
今回は512MBx32cntで16GBほど確保しています。

##### 再起動時設定

```sh
sudo vi /etc/fstab

最終行に以下を追加して保存
/swapfile swap swap defaults 0 0
```
次回、サーバ起動時にも有効になるようにfstabに記述をしておきます。


### symbol起動設定
```
npm install -g symbol-bootstrap
symbol-bootstrap config -p testnet -a dual
symbol-bootstrap compose
```

最新のsymbol-bootstrapをインストールし、テストネット用の設定をします。

##### friendlyName 修正
```sh
vi target/nodes/api-node/userconfig/resources/config-node.properties
```
friendlyNameの欄を自分の好きな名称に変更します。ここを変更しておくと同期が完了した後にこちらのページで楽しめます。
https://symbolnodes.org/nodes_testnet/

### 起動
```
symbol-bootstrap start -d --timeout 600000

#ノードの設定状態確認
curl http://localhost:3000/node/info
#チェーンの同期状態確認
curl http://localhost:3000/chain/info

```

さあ、最後に起動です。
起動したら、ノードの設定状態とチェーンの同期状態を確認して終わりです。

お疲れ様でした。
WioLTEの使い方

# WioLTEの使い方

## 目次

- WioLTE とは
- センサーの差込口
- 電力周り
- 省電力化
- 参考ページ

## WioLTE とは

WioLTE では、SIM を使ったデータ通信が可能になる。
また、SD カードも積むことができるので log データを簡単に保存することができる。

## センサーの差込口

- Uart × １
- I2c × １
- デジタル × ２
- アナログ × ２

## 電力周り

※ 個人での測定（センサー未使用）

- 通常時：100mAh
- 通信時：800mAh
- スリープ時：50mAh

動作電圧

- USB 給電：5v
- 電池給電：3.3v

USB 給電時には、3.3 ｖ、3.7 ｖでは、動作しなかったです。
5v での給電で動作しました。
１ A での動作もできますが、通信はできませんでした。

## 省電力化

WioLTE では、電源供給に悩まなければ考えなくでよいことです。
ですがたいていの場合、コンセントでの給電でなく電池などの電源を使用すると考えています。

```Arudino
wio.sleep()
```

一番簡単な省電力化が上記のコードです。
これで、50mAh まで消費電力を抑えることができます。

長期間動作させるとなるとさらに、抑える必要があります。ソフトウェア側からのアプローチになるとかなりめんどくさくなるので、Wio_extension_RTC というものを使用を考えます。

Wio_extension_RTC(以下 eRTC)は、I2C ポートを使用します。

### eRTC のモードが A と B があります。

- A:常時給電
- B:間隔給電

WioLTE がこの eRTC に対して何秒間寝ることを宣言します。eRTC は、その間 Wio への電源供給をやめます。なので、省電力性が格段に高くなります。

```Arudino
#include <WioRTC.h>

WioRTC Rtc;

～～～略～～～
void loop(){
    SerialUSB.println("sleep");

    //60秒間寝ます
    Rtc.SetWakeupPeriod(60);

    //電源供給をしないでください
    Rtc.Shutdown();

    //loop関数だと電源が落ちる前に繰り返してしまうので足止めコード
    while (1){}
}
```

## 参考ぺージ

[WioLTE リファレンス](https://seeedjp.github.io/Wiki/Wio_LTE_for_Arduino/Reference-ja.html)
ソート済み配列の挿入点を知る

# python の bisect_left をＣ言語に移植します
https://docs.python.org/ja/3/library/bisect.html
https://github.com/python/cpython/blob/3.9/Lib/bisect.py#L50
ほぼこれを丸写ししただけです。


``` c

#include <stdio.h>

typedef float Decimal;

int ArrayBisectLeft(int size, Decimal* a, Decimal target) {
    int mid;
    int lo = 0;
    int hi = size;
    
    if(target < a[0]) {
        return -1;
    }
    
    mid = 0;
    while(lo < hi) {
        mid = (lo + hi) >> 1;
        if(a[mid] < target) {
            lo = mid + 1;
        } else {
            hi = mid;
        }
    }
    return lo;
}

int main(int argc, char** argv) {
    Decimal arr[] = {1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5};
    int arrSize = sizeof(arr) / sizeof(arr[0]);
    for(int i = 0; i < 7; i++) {
        printf("target=%f, idx=%d\n", (Decimal)i, ArrayBisectLeft(arrSize, arr, i));
    }
}

// g++ main.cpp -o main -Wall -O2
```

**実行結果**

```
target=0.000000, idx=-1
target=1.000000, idx=0
target=2.000000, idx=3
target=3.000000, idx=6
target=4.000000, idx=9
target=5.000000, idx=12
target=6.000000, idx=15
```

## 範囲外の挙動について

* 最小値よりも小さい場合は -1 を返します
* 最大値よりも大きい場合は 最大値インデックス+1 を返します

qsort や bsearch のように標準関数で欲しいなと思いました。
以上です。
英単語から絵文字を検索するWebアプリを作ってみた

# まずは動かしてみた
英単語「dog」をいれると犬の絵文字が出てきました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/726018/9f924f3b-9079-1cd1-5485-1043acde446d.png)

もし、その絵文字がなければ、エラーメッセージが出るようにしてます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/726018/e7d1f80b-2b7c-0e4f-0540-01485dff78b2.png)

# URL
画面は一般公開しています。
https://todo-heihei.tk/

# 使用したライブラリ
■Javascript
●Vue.js
https://cdnjs.cloudflare.com/ajax/libs/vue/2.6.11/vue.min.js
●Bootstrap
https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.3/js/bootstrap.min.js
●emojione
https://cdnjs.cloudflare.com/ajax/libs/emojione/4.5.0/lib/js/emojione.min.js

■CSS
●Bootstrap
https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.0/css/bootstrap.min.css
●emojione
https://cdnjs.cloudflare.com/ajax/libs/emoji-awesome/0.0.2/css/emojione.min.css

# ソース
プログラム自体はCodePenを利用しています。

```HTML:index.html
<!DOCTYPE html>
<html lang="ja" >
<head>
  <meta charset="UTF-8">
  <title>絵文字検索ツール</title>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel='stylesheet' href='https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.0/css/bootstrap.min.css'>
  <link rel='stylesheet' href='https://cdnjs.cloudflare.com/ajax/libs/emoji-awesome/0.0.2/css/emojione.min.css'>
</head>
<body>
<!-- partial:index.partial.html -->
<!-- 全体をVue.js有効にする -->
<div class="container text-center text-white bg-dark" id="app">
  
  <!-- タイトル行 -->
  <div class="row my-3">
    <div class="col-sm-6 mx-auto"><h1>絵文字検索ツール</h1></div>
  </div>
  
  <!-- タスク入力行 -->
  <div class="row my-3">
    <div class="col-sm-6 mx-auto">
      <input v-model:value="word" placeholder="単語を入力…" class="form-control"><br>
      <button v-on:click="searchEmoji" class="btn btn-primary">絵文字を調べる</button>
    </div>
  </div>
  
  <!-- タスク追加されると表示される部分 -->
  <div class="row my-3">
    <div class="col-sm-6 mx-auto">
      <p v-if="emoji === ''" class="alert alert-danger">対象の絵文字がないよ</p>
      <p v-else class="alert alert-success">{{ emoji }}</p>
    </div>
  </div>

</div><!-- 全体ここまで -->
<!-- partial -->
  <script src='https://cdnjs.cloudflare.com/ajax/libs/vue/2.6.11/vue.min.js'></script>
  <script src='https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.3/js/bootstrap.min.js'></script>
  <script src='https://cdnjs.cloudflare.com/ajax/libs/emojione/4.5.0/lib/js/emojione.min.js'></script>
  <script  src="./script.js"></script>

</body>
</html>
```

```javascript:script.js
const app = new Vue({
  el: '#app', // Vueが管理する一番外側のDOM要素
  data: {
    // Vue内部で使いたい変数は全てこの中に定義する
    word: '',
    emoji: '', 
  },
  methods: {
    // 関数はここ
    searchEmoji: function() {
      console.log('次の単語が入力されました：', this.word);
      console.log('絵文字は次の通りです：', emojione.toImage(':' + this.word + ':'));
      this.emoji = emojione.toImage(':' + this.word + ':');
      if (this.emoji.indexOf('img') == -1) {
        this.emoji = '';
      }      
    },
  },
});
```

# 考察
・絵文字だけ返すことができずに、imgタグが出てくるかっこ悪い表示となっている。
　→絵文字だけ返却できるようにしたい。

・英単語しか検索できない。
　→日本語で検索できるようにしたい。
Apache POI Excelの基本文法 kotlin

現在のApache POI Excel公式ドキュメント(https://poi.apache.org/components/spreadsheet/index.html) が新旧メソッドが混ざって解説されているなど、分かりづらい部分が多かったためこちらによく使う記述をまとめました。
言語　kotlin

#### セットアップ

##### gradlle インストール

```gradle:build.gradle
dependencies {
/* 2020 8月現在の安定版4.1.2*/

　'ApachePOI'
  compile("org.apache.poi:poi:4.1.2")

  'xlsxファイルを作成する場合は下記poi-ooxmlが必要'
  compile("org.apache.poi:poi-ooxml:4.1.2")

}
```

#### 基本操作　
##### シートの作成

```kotlin:sample.kt

// XSSFWorkbookエンティティを作成
val workBook = XSSFWorkbook()

// エクセルシートを作成
val sheet = workBook.createSheet()
```

######指定セルに値を記入

```kotlin:sample.kt
// 値を記入するセルを指定する

// createRowで列を指定
val row = sheet.createRow(0)

// createCellで行を指定
val cell = row.createCell(0)

// 値を記入
cell.setCellValue("テスト")
```

###### シートの保存

```kotlin:sample.kt
val fileOutputStream = FileOutputStream("test.xlsx")

workBook.write(fileOutputStream)

fileOutputStream.close()
```
##### 結果
![スクリーンショット 2020-08-15 22.44.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207872/9e29b11e-edb4-b84f-9f6e-f19d5490ddc6.png)



#### 応用操作
---
##### セルの色指定
```kotlin:sample.kt
// スタイルインスタンスを作成
val style = workBook.createCellStyle()
// セルを黄色に設定
style.fillForegroundColor = (XSSFColor(byteArrayOf(255.toByte(), 255.toByte(), 204.toByte()), null)
// 塗りつぶしを指定
style.fillPattern = FillPatternType.SOLID_FOREGROUND
//cellにスタイルを設定
cell.setCellStyle(style)
```
##### 結果
![スクリーンショット 2020-08-16 16.25.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207872/477c1ba5-b619-4492-afa7-1e6168a3f6f9.png)

---
##### フォントの設定

```kotlin:sample.kt
// フォントインスタンスを作成
val font = workBook.createFont()
// 文字サイズを設定
font.setFontHeightInPoints(16.toShort())
// 文字種類を設定
font.fontName = "ＭＳ Ｐゴシック"

val style = workBook.createCellStyle()
// スタイルにフォント情報を追加
style.setFont(font)

```

---
##### 条件付き書式の設定

設定できる条件の一覧
https://github.com/apache/poi/blob/trunk/src/java/org/apache/poi/ss/usermodel/ComparisonOperator.java

```kotlin:sample.kt
val sheet = workBook.createSheet()

// 条件付き書式設定用のインスタンスを生成
val sheetCF: SheetConditionalFormatting = sheet.sheetConditionalFormatting

// 条件を設定　この場合は値が90%以下である事
val rule1 = sheetCF.createConditionalFormattingRule(ComparisonOperator.LT, "90%")

// 上記条件の時に利用するフォントを設定(フォント以外も様々な要素を設定できる)
val font = rule1.createFontFormatting()
// フォントを赤に設定
font.fontColor = XSSFColor(byteArrayOf(255.toByte(), 0.toByte(), 0.toByte()), null)

// 上記条件が有効なセルの範囲を設定(下記の場合はA1セルからA5セルまで)
val range = "A1:A5"

// 範囲は配列内に複数設定できる
val regions = arrayOf(
      CellRangeAddress.valueOf(range)
    )

// 条件を有効化
sheetCF.addConditionalFormatting(regions, rule1)

```

---
#####セルに数式を設定

```kotlin:sample.kt

val sheet = workBook.createSheet()
val row = sheet.createRow(0)
val cell = row.createCell(0)

// A1セル/C1セルの割合を出す数式を作成
val formula = "A1/C1"

// セルに数式を設定
cell.cellFormula = formula

// 数式を有効化する
sheet.setForceFormulaRecalculation(true)

```
Newtonsoft.Jsonのデシリアライズ時の挙動についてわかったこと

# はじめに
本記事はNewtonsoft.jsonを使用した際に分かったデシリアライズ時の挙動についてわかったことをまとめた記事です。

# わかったこと
Newtonsoft.jsonを使用してJson形式にシリアライズしたJsonオブジェクトをデシリアライズしたときに以下の挙動をしています。

①オブジェクトのコンストラクタに引数がある場合
コンストラクタの引数名がJSONオブジェクトの対応するプロパティ名と一致し（大文字と小文字を区別しない）、コンストラクタ内でプロパティの値の設定を行っていると、インスタンス生成時にプロパティが設定されます。以下のような場合です。

```csharp

	#region 構築

	/// <summary>
	/// コンストラクタ
	/// </summary>
	public MetaData(string key)
	{
		Key = key;
	}

	#endregion

	#region プロパティ

	/// <summary>
	/// キー
	/// </summary>
	[JsonProperty]
	public string Key { get; }

	#endregion

```


では、デシリアライズ時に復元したい全てのプロパティ値をコンストラクタ引数に追加しなければならないのかというと、そうではありません。

② オブジェクトのコンストラクタに引数が無い場合
コンストラクタで引数を受け取りその引数を使用してプロパティ値の設定をしない場合は、インスタンスの生成後、オブジェクトのパブリックなプロパティまたは[JsonProperty]属性を付けたプロパティのセッターを使用して値を設定しようとします。

# さいごに
どうやってデシリアライズされているのか仕組みを知らずに使っていたため、デバッグ中にうまくプロパティ値が復元できるプロパティとできないプロパティがあり混乱することがありましたので、本記事にまとめました。
皆様の参考になれば嬉しいです。
最後までお読みいただきありがとうございます。

# 参考サイト
https://www.it-swarm-ja.tech/ja/c%23/jsonnet%EF%BC%9A%E3%83%87%E3%83%95%E3%82%A9%E3%83%AB%E3%83%88%E3%81%AE%E3%82%B3%E3%83%B3%E3%82%B9%E3%83%88%E3%83%A9%E3%82%AF%E3%82%BF%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%9B%E3%81%9A%E3%81%AB%E3%83%87%E3%82%B7%E3%83%AA%E3%82%A2%E3%83%A9%E3%82%A4%E3%82%BA%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%E3%81%AF%EF%BC%9F/1046211064/
【Ruby on Rails】論理削除（退会機能）

# 目標
![画面収録 2020-10-25 21.31.39.mov.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700999/2bd21794-639c-fb48-0cf8-08c59ef18241.gif)

# 開発環境
ruby 2.5.7
Rails 5.2.4.3
OS: macOS Catalina

# 前提
- [【Ruby on Rails】gemのdeviseを使用し、名前とパスワードのみでログインする方法](https://qiita.com/japwork/items/275110b810965fbdf72f)
- [【Ruby on Rails】URLのidをカラム名に変更](https://qiita.com/japwork/items/5b490d1784bc7f062f82)
この続きでコードを編集していきます。

# 流れ
1 カラムの追加
2 modelの編集
3 controllerの編集


# カラムの追加
```:ターミナル
$ rails g migration AddIsValidToUsers is_valid:boolean
```
default: true, null: falseを追加。
booleanを使用することにより、ture、falseで退会しているかどうかを判断します。
下記の場合は初期値をtrueに設定しますので、退会済みの場合はfalseとなります。

```rb:db/migrate/xxxxxxxxxxxxx_add_is_valid_to_users.rb
class AddIsValidToUsers < ActiveRecord::Migration[5.2]
  def change
    add_column :users, :is_valid, :boolean, default: true, null: false
  end
end
```
```:ターミナル
$ rails db:migrate
```

# controllerの編集
退会画面と退会処理のアクションを作成

```rb:app/controllers/homes_controller.rb
  def unsubscribe
    @user = User.find_by(name: params[:name])
  end

  def withdraw
    @user = User.find_by(name: params[:name])
    @user.update(is_valid: false)
    reset_session
    redirect_to root_path
  end
```
退会後のログインを阻止する記述。

```rb:app/controllers/users/sessions_controller.rb
class Users::SessionsController < Devise::SessionsController
  before_action :reject_inactive_user, only: [:create]

...

  def reject_inactive_user
    @user = User.find_by(name: params[:user][:name])
    if @user
      if @user.valid_password?(params[:user][:password]) && !@user.is_valid
        redirect_to new_user_session_path
      end
    end
  end
end
```
# routesの編集

```rb:config/routes.rb
get 'unsubscribe/:name' => 'homes#unsubscribe', as: 'confirm_unsubscribe'
patch ':id/withdraw/:name' => 'homes#withdraw', as: 'withdraw_user'
put 'withdraw/:name' => 'users#withdraw'
```

# viewの編集
```erb:app/views/homes/unsubscribe.html.erb
<div>
  <h2>本当に退会しますか？</h2>
  <div>
    <p>退会する場合は、『退会する』をクリックしてください。</p>
  </div>
  <div>
    <%= link_to '退会しない', mypage_path(@user) %>
    <%= link_to "退会する", withdraw_user_path(@user), method: :patch %>
  </div>
</div>
```


# 参考
[PUT か POST か PATCH か？](https://qiita.com/suin/items/d17bdfc8dba086d36115)

# まとめ
論理削除のメリット、デメリットは色々あると思いますが、
サービスを運営する場合、顧客情報は大切になりますので、
物理削除ではなく、論理削除で退会にしたほうが、
復活の手段にもなるためおすすめです。

またtwitterではQiitaにはアップしていない技術や考え方もアップしていますので、
よければフォローして頂けると嬉しいです。
詳しくはこちら　https://twitter.com/japwork
ネット回線速度を簡単に定期監視する方法 for Windows

#はじめに
家のネット回線が夜になると異常に遅くなる(10Mbps以下)時があるので、回線速度を定期監視することにしました
**<font color="RED">回線に負荷をかけることになるため必要以上に監視を行うことは推奨しません
また本記事の内容にもとづくあらゆる事象につきまして、一切の責任を負いかねますので予めご了承ください</font>**

#検証環境

- Windows10 64bit
- Speedtest by Ookla 1.0.0.2

#SPEEDTEST CLIのダウンロード
まずはこちらからSPEEDTEST CLI(Windows用)をダウンロードしてください
[https://www.speedtest.net/ja/apps/cli](https://www.speedtest.net/ja/apps/cli)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36793/dfc003d6-3389-290e-5b64-05f395db7d89.png)
zipファイルなので適当な場所に展開します

#speedtest.exeを実行
初回起動時のみLicense許可を求められるのでYESと入力します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36793/2fcd1225-9241-92e4-38c6-0255f15cd032.png)

#バッチファイルを作成
適当な場所にspeedtestを実行するバッチファイルを作成

```speedtest.bat
echo|set /p=%Date% %Time%, >>d:\Log.csv
d:\speedtest.exe -fcsv >>d:\Log.csv
```

日付時刻が出力されないのでechoで出力、-fcsvで出力形式をCSVに指定
結果をLog.csvに追記で出力してます
ここで試しにバッチファイルを実行するとLog.csvが生成されてこんな感じで書き込まれてるかと思います
2020/10/26 11:46:13.55, "ITS - Tokyo","36871","23.971","0.226","0","2318402","8687647","28282364","119665908","https://www.speedtest.net/result/c/60eafb5e-37c6-41c4-8107-9b3202d98a50"

#VBSファイルの作成
バッチファイルをタスクスケジューラに登録してもいいですが、実行するたびにコマンドプロンプトが出てしまうので非表示でバッチファイルを実行するVBSファイルを作成します

```speedtest.vbs
Set objWShell = CreateObject("Wscript.Shell")
objWShell.run "cmd /c d:\speedtest.bat", vbHide
```
#タスクスケジューラに登録
最後に一定間隔で実行するためタスクスケジューラに登録します
1.基本タスクの作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36793/bd05c900-fcde-abdd-a1cc-38b62a889d01.png)
2.タスク名入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36793/f315048b-9aff-0930-f0ff-2dcd19301318.png)
3.トリガー設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36793/985a790a-9d2c-41f6-052b-6e690df2d398.png)
4.開始時刻設定(直近の正時でいいかと思います)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36793/1d020200-aa6e-5886-ecbe-77ab5696d565.png)
5.操作の設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36793/184bdca7-9b27-4fd1-58f6-38b3a08ddbce.png)
6.プログラムの設定(speedtest.vbs)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36793/31296bd8-67c9-a40e-941b-6c8908d28beb.png)
7.完了後登録したタスクのプロパティを開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36793/fb1f4a38-050e-4077-2a32-1d6746ff3c01.png)
8.トリガーの編集
繰り返し間隔と継続時間を無期限に設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36793/a5a5fd14-a2d6-2f1f-d811-2543d96e88ae.png)
以上でタスクスケジューラの登録が完了
開始時刻以後、設定間隔でバッチが実行されログが蓄積されていきます

#回線速度の確認
CSVをExcelで開くとG列がダウンロード速度、H列がアップロード速度を示しています
計測値はバイト単位なのでMbpsで確認したい場合は8倍して1000000で割ればよいかと思います
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36793/e5d2e0aa-2a1c-188e-79a7-6330842b2595.png)
Firestoreひと言メモ(クエリ)

#Firestoreでのクエリ条件文
**リファレンス**に対して.where .orderBy等を実行すればよい。
sql文わかっているなら簡単

##例

```js
//参照しているリファレンスのdateの降順にする
reference.orderBy('date','desc')

//参照しているリファレンスの中のcolorがwhiteであるものだけを取得
reference.where('color','==','white')

```
ディストリビューションとは

## 勉強前のイメージ

RHEL系とかcentos系とか...?
あんまよくわかってない

## 調査

### ディストリビューションとは

カーネルだけでは手軽に使えないので
アプリケーションなどをパッケージにしてすぐ使えるようにしたものをディストリビューションと呼ぶ
ディストリビューションによってパッケージ管理の仕方が違う

### ディストリビューションの主要グループ

- Redhat系

商業ディストリビューションの代表。
Redhatが提供している有償の `Red hat Enterprise Linux (RHEL)` が企業向けに特化しており、商業的に成功している
Redhat社のディストリビューションから派生したディストリビューションは大体 `rpm形式` でパッケージ管理をされている
Redhat系のディストリビューションには無償版もあり、 `CentOS` や `Fedora` がある

- Debian系

Debian系はパッケージ管理が非常に優秀なディストリビューション
パッケージは `deb形式` で、 `aptコマンド` を使用する
Debianの歴史は古く、派生ディストリビューションも多く存在
その中でも `Ubuntu` は人気である


- Slackware系

最も歴史があるSlackwareをベースとしたディストリビューションがSlackware系
公式に配布されている状態が一つの完成系になっており、ソフトウェアの追加やライブラリの管理はユーザ依存が多く、
RedHat系やDebian系と比べると初心者がいきなり扱うのには難しいディストリビューションという印象
メリットとしては、安定性が高く・セキュリティが強い・速いというものがあります。

### 代表的なディストリビューション

- [Redhat系] Red hat Enterprise Linux

最も成功している、有償のディストリビューション。
ライセンス料を支払うことで、技術的サポートやセキュリティfixを開発会社として行う責任があるので企業が安心して利用できる
サポート期間は約10年程度
パッケージ管理は、rpmとyumを採用している

- [Redhat系] CentOS

Red hat Enterprise Linuxの有償部分を除去し、リビルドすることでクローンを作成することが出来た
あまりRed hat Enterprise Linuxとの違いはないが、セキュリティfixが遅れるなどはある
個人で試してみるのではCentOSは有用である

- [Debian系]Debian

Debian系と名前のつくディストリビューションの本家であり、後述するUbuntuの元にもなっている
歴史は古く、Slackwareと同じように長い
日本国内ではRed hat Enterprise Linuxほど多くはないが使ってる人は多い印象

- [Debian系]Ubuntu

Debianの開発版を元に開発された無償のディストリビューション
開発のスローガンが、 `他者への思いやり`
使いやすく、標準で写真編集ツール、ブラウザ、メッセンジャーなどが組み込まれている
日本語の環境が充実しており、コミュニティも活発なので入門者にはおすすめのディストリビューションである

- [Slackware系]Slackware

Linux史上最古のディストリビューションとして現在も存在している老舗ディストリビューション
シンプルな作りで、パッケージもバイナリをtarでアーカイブしただけ
現在はサードパーティーのソフトウェアのパッケージを半自動でコンパイルするコマンドも開発されているが、
ユーザが管理をするという点は変わっていないので、自力で解決する部分が大きい

## 勉強後のイメージ

ふんわり合ってたけど、ちゃんと調べることによって知識が入った。
いつもCentOSやRedhatでパッケージの依存関係とかを自動で解決してくれていたけど
それはすごいありがたいことなんだなと思う。

## 参考

- [Linuxディストリビューションとは？](https://www.linuxacademy.ne.jp/lablog/infrastructure/266/)
- [Linuxとは？初心者でもわかる概要や基礎を解説！](https://game-creators.jp/g-job-tenshoku/news_articles/13)
- [【ざっくりまとめ】Linuxディストリビューションを比較してみる](https://eng-entrance.com/linux-distribution-compare)
pythonのグローバル変数を操作するときの話

##グローバル変数とローカル変数
pythonで実装中に何度かつまずいたので、自分用にメモ。
このコードが以下の結果を返すことは理解できる。

```python
x = 1

def func1():
    print(x)

def func2():
    x = "hoge"
    print(x)

func1()
func2()

>>> 1
>>> hoge
```

pythonでは変数を参照するとき、ローカルスコープ内部で宣言されていない場合グローバルスコープを参照しに行く。

また、ローカルスコープで変数を書き換える前に変数が宣言されていない場合エラーを返す。

```python
def func3():
    y += 1
    y = 5
    print(y)

func3()

>>> Traceback (most recent call last):
>>>   File "/test.py", line 8, in <test>
>>>     func3()
>>>   File "/test.py", line 4, in func3
>>>     y += 1
>>> UnboundLocalError: local variable 'y' referenced before assignment
```

ここまでは理解していたが、グローバル変数が絡むと途端に混乱してしまった。
つまり、グローバル変数として宣言されている変数を操作する場合は明示的に宣言せねばならず、普通にかくとエラーが返ってくる。

```python
x = 1

def func4():
    x += 1 #この時点ではまだxを参照できない
    x = 5 #この段階でローカルスコープに変数xが追加される
    print(x)

func4()

>>> Traceback (most recent call last):
>>>   File "/test.py", line 8, in <test>
>>>     func4()
>>>   File "/test.py", line 4, in func4
>>>     x += 1 
>>> UnboundLocalError: local variable 'x' referenced before assignment
```

##じゃあどうしたらいいの

解決方法は簡単で、グローバル変数を使う時はちゃんとグローバル変数であることを明示しましょうねって話。

```python
x = 1

def func5():
    global x #グローバル変数であることを明示
    x += 1 
    print(x)

def func6():
    x = 10 #ローカル変数であることを明示
    x += 1
    print(x)

func5()
func6()

>>> 2
>>> 11
```
.NET frameworkのバージョンを上げる方法【Rider編】

 .NET frameworkのバージョンによって使えないパッケージが存在します。
私はVisual StudioよりもRider派（Jetbrain社のIDE）なのですが、初めてで迷いました。
メモを残しておきます。

## バージョンアップ方法

以下の流れでバージョンアップを行います。

![2020-10-26_12h36_06.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247515/b47874fa-1ff3-2a1b-f122-507c5df58079.jpeg)

![2020-10-26_12h43_21.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247515/a5193536-dd24-61bc-37f3-f6cffbc34d92.jpeg)
素のPHPしか触ってなかった人がlaravelを触ってみる

初書：2020/10/26
PC：macOS 10.15.7

タイトル通りですが、素のphp以外でライブラリもフレームワークも使ったことがないんですが、
よく見かけるしちょっと気になったので触ってみようと思った次第。

# 前提
・composer、homebrewインストール済み

# Laravelとは
> Laravel は、MVCのWebアプリケーション開発用の無料・オープンソースのPHPで書かれたWebアプリケーションフレームワークである。

[Wikipedia](https://ja.wikipedia.org/wiki/Laravel)より
つまりフレームワークである。
どうやら今phpで一番人気があるフレームワークらしい。

# 早速使って・・・

みようと思ったのだが、ググってみると
「laravelのインストールから表示まで」か
「機能を追加してみる」という感じの記事が多く、
フレームワークが何かすらなんとなくしか分からなかった自分からすると全然使い方が分からん。

ので、結構調べてみると、次の記事を見つけた
[Laravel入門 - 使い方チュートリアル -](https://qiita.com/sano1202/items/6021856b70e4f8d3dc3d)

これが結構分かりやすかったのだが、フレームワークとは先に用意された一式の中に、自分でコードを書いて作っていくという形なので、今までの素のphpのように書いていくわけではない模様。

# インストール

ちなみにcomposerというものを使用するので、composerを先に入れる必要がある。
脳死でインストールする場合は以下をどうぞ

```zsh
% brew install composer
```
その後composer -vを実行して、バージョン情報が表示されればインストール完了

そしてlaravelをダウンロードする
[公式のサイト(英語)の日本語訳ページはこちら](https://readouble.com/laravel/8.x/ja/installation.html)

ローカルにのみインストールをする方法もありますが、グローバルにインストーラーをダウンロードして、それをローカルにインストールする方法もあるみたいなので、お好きな方でインストールしてください

```zsh
% composer global require laravel/installer # これはグローバルにインストール
% laravel new application # アプリケーションの作成。"application"はお好きな名前に
```

# バージョン確認をする

```zsh
% php artisan --version
Laravel Framework 8.11.2
```
8.11.2だそうです。

# とりあえずサーバーを立てる

```zsh
% php artisan serve
```
これで、```Laravel development server started: http://127.0.0.1:8000```のような感じで表示されるので、後半のurlにアクセスすると、laravelのページが表示される

![スクリーンショット 2020-10-23 22.34.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636785/e5148784-a479-dc79-6ba7-755e05483a6a.png)
調べたら出てくる、よくみるページでは無い、だと、、、

どうやらversion8からデフォルト画面が変わったっぽい
起動できているのに間違いはなさそうなので、これでよしとする。右下にバージョンも書いてるし。

# 設定する(.env)

調べてみるとこんなページが。
[Laravel8をインストールしたらやっていること一覧](https://qiita.com/schrosis/items/cce304870fcb27498a5e)
[保存版！Laravelの.envでできること大全](https://blog.capilano-fw.com/?p=1382)
.envファイルとconfig/app.phpに色々と設定できる項目があるらしい。せっかくなので設定しておく

とりあえず、データベース周りと言語周り、時刻関連は設定しておいた。

# 機能を追加していく

本当はこれ以降に記述する予定だったのだが、思ったより長くなりそうなのでそれぞれ記事を作成して、ここにはリンクだけ貼る、という形にする。

## とりあえず新規ページを作成する

[laravel8 とりあえずページを作成してみる](https://qiita.com/yuu_1st/items/41d90b75aa10bf2be9e0)
ページを作らないことには始まらないと思うので



## ログイン機能をつけてみる

[Laravel8でログイン機能を実装する](https://qiita.com/yuu_1st/items/8495bf670442980b3311)
jetstream - Livewire を使用したログイン機能周りの実装

[【laravel】Fortifyでログインを作成する](https://zenn.dev/yuuyu/articles/93623ecae2710c)（※zenn）
jetsteramの基盤となるFortifyのみでログイン機能周りを実装



## 管理ページ(ログイン)

[【laravel】管理ページを作ってみる - Qiita](https://qiita.com/yuu_1st/items/d580fb4cb10b5fcc85d9)



## Laravel mixを使う

Q. Laravel mix？
A. jsとかcssを便利に使えるやつ(だと思う)

[【laravel】laravel mixを使ってみる](https://zenn.dev/yuuyu/articles/8bf953a0fd2a98) （※zenn）



## SPA(React)関連

[【laravel】laravel+Reactを使ってSPAにしてみる - Qiita](https://qiita.com/yuu_1st/items/bf0c932cacde20b105a1)



# まとめ

まだまだ手探りの状態なので、間違い等があれば、その時は指摘をお願いします。
また「機能を追加していく」の欄は随時追加していく予定です。
Docker pull制限 まもなく開始... CircleCIはどうなる？ React, Laravel, NPMリリース情報！【やっすんのエンジニアニュース 10月4周目】

# はじめに
Hello World!!
教育系YouTuberに転身したやっすんです！

10月最後のエンジニア向けニュースを独断と偏見で紹介していきます！
一番の注目ポイントは、11/1から開始するDockerのpull制限ですね...

動画でもまとめているので、ぜひ確認してみてください！！
[【YouTube動画】 Docker pull制限がまもなく開始... CircleCIはどうなる？ React, Laravel, NPMリリース情報！【やっすんのエンジニアNews】](https://youtu.be/PS2_WkxdvoQ)
[![Docker pull制限がまもなく開始... CircleCIはどうなる？ React, Laravel, NPMリリース情報！【やっすんのエンジニアNews】](https://img.youtube.com/vi/PS2_WkxdvoQ/0.jpg)](https://www.youtube.com/watch?v=PS2_WkxdvoQ)

# Docker Hub無料ユーザーに制限
2020年11月1日からDocker Hubで、未使用のイメージ保持期間の制限とpull回数の制限が開始します。

未使用イメージの保持期間の制限は無料ユーザーで半年になります。有料ユーザーは無制限です。

pull回数の制限は以下のようになります。
基本的に有料ユーザーであれば、制限はありません。

|  | 未認証ユーザー | 無料ユーザー | 有料ユーザー |
|:------------:|:------------:|:------------:|:------------:|
| 未使用のイメージ保持期間 | 半年 | 半年 | 無制限 |
| pull制限 | 100回/6h | 200回/6h | 無制限 |


## Circle CIはどうなるの？
Dockerのpull制限で一番ダメージを受けそうなのは、CIサービスですね。
特に、CircleCIでテストを回しているチームは簡単に制限に届きそうです。

基本的には、CircleCIのbuildジョブ内でDockerに認証すれば、大丈夫です。

詳しくは公式ページを確認してみてください。
[Docker の認証付きプルの使用](https://circleci.com/docs/ja/2.0/private-images/)

# React 17.0 リリース
Reactもバージョンアップしました。
このバージョンアップで、コードを部分的にReactに置き換えやすくなりました。
[React v17.0](https://reactjs.org/blog/2020/10/20/react-v17.html)

# Laravel 8.11, NPM 7 リリース
Laravelは毎週バージョンアップしています。
今回はジョブに関するミドルウェアを追加しました。

NPM 7はyarn.lockを認識するようになりました。

# 今月のニュース
10月最後なので、今月のニュースも振り返ってみます。

10月最初の週はGitHub CLIがリリースされました。
PRのチェックがCLI上でできるようになり、便利になりました。
[GitHub CLI正式リリース！ どんなことができるか紹介します！！](https://qiita.com/yassun-youtube/items/d571c3d15144400d497a)

GitHubは他にもmasterリポジトリの廃止やGitHub Code Scanningのリリースをしましたね。
[GitHub master廃止！Ruby2.7.2リリース GitHub脆弱性診断！！【やっすんのエンジニアニュース 10月1周目】](https://qiita.com/yassun-youtube/items/59bfd517c1d72cb67874)

10月2週目はアメリカで完全自動ロボタクシーの提供が始まったり、Python, Dartでバージョンアップがありました。
[未来が目前に？！完全自動ロボタクシー！ Python 3.9.0 , Dart 2.10 リリース【やっすんのエンジニアニュース 10月2周目】](https://qiita.com/yassun-youtube/items/5049aed80a6831df7c10)

10月3週目はGitHub for mobileのバージョンが上がり、さらに操作性が上がりました。Laravelは毎週アップデートしてますが、この週はメソッドが大量に追加されましたね。
[GitHub for mobileがさらに使いやすく！ Laravel 新メソッド追加！Google Ads API リリース【やっすんのエンジニアニュース 10月3周目】](https://qiita.com/yassun-youtube/items/d8487d5d8d130cc0f0ae)

# まとめ
今週のニュースはいかがでしたか？


来月も続けていくので、よろしくお願いします。

[twitter](https://twitter.com/yassun_youtuber)や[youtube](https://www.youtube.com/channel/UCajrdoGzHzDogrNrLYYmGsg/featured?view_as=public)でのコメントもお待ちしています！
【Core ML】自動生成されるMLモデルをアプリに組み込む

#この記事はなに？
Create ML Appでトレーニングした独自のモデルを、アプリに導入するまでの手続きです。

### 環境
macOS 10.15.7
Xcode 12.1
Swift 5.3

# 手順
## モデルをトレーニングする
この作業は、Create ML Appで行います。
トミカ（ミニカーの玩具）を識別するモデルを作成しました。

## Xcodeプロジェクトに組み込む
Create ML Appから書き出した.mlmodel形式のモデルファイルは、ドラッグ&ドロップするだけでXcodeに組み込むことができます。
同時に、MLモデルのクラスを定義したコードが自動的に生成されます。

## MLモデルのインスタンス
CoreMLフレームワーク発表当時のコードは一部、非推奨になっています。
現在は以下のコードで、インスタンスを作成できます。

````swift:モデルのインスタンスを作成する        
let modelURL = Bundle.main.url(forResource: "MyTomicaClassifier", withExtension: "mlmodelc")!        
let tomicaClassifier = try! VNCoreMLModel(for: MLModel(contentsOf: modelURL))
````
Cannot convert IterationStatusとなった時の対応方法

# 事象 : `ui:repeat`に指定した`varStatus`を`rendered`に指定したら怒られた
- 環境
    - Windows10 Pro バージョン1909
    - openjdk version "11" 2018-09-25
    - JSF 2.3.9

```bash
java.lang.IllegalArgumentException: Cannot convert IterationStatus{index=0, first=true, last=false, begin=null, end=null, step=null, even=true, current=null, iterationCount=0} of type class com.sun.faces.facelets.tag.IterationStatus to class java.lang.Long
    at com.sun.el.lang.ELSupport.coerceToNumber(ELSupport.java:272)
    at com.sun.el.lang.ELSupport.equals(ELSupport.java:137)
    at com.sun.el.parser.AstEqual.getValue(AstEqual.java:36)
    at com.sun.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:183)
```

## 原因 : varStatusはオブジェクトなのにそのままインデックス番号として判定式を書いたから

```xml
<ui:repeat var="item" varStatus="status" value="#{itemlist}">
  <tr>
    <ui:fragment rendered="#{status == 0}">
```

> Name of the exported request scoped variable for the status of the iteration. Object is a POJO with the following read-only JavaBeans properties. This scoped variable has nested visibility.
> begin of type Integer
> end of type Integer
> index of type int
> step of type Integer
> even of type boolean
> odd of type boolean
> first of type boolean
> last of type boolean
> [repeat(JSF 2.0 Page Decraration Language: Facelets Variant)](https://docs.oracle.com/javaee/6/javaserverfaces/2.0/docs/pdldocs/facelets/ui/repeat.html)

### 対応 : インデックス番号の判定式を書くときはindexプロパティを使う

```xml
<ui:fragment rendered="#{status.index == 0}">
```
Railsで問い合わせフォームを実装する

RailsでGmailを利用した問い合わせフォームを実装しました。

##ルーティングの設定

まず、ルーティングを設定します。
問い合わせフォームのページで問合せ内容を入力→送信したら送信完了ページに遷移するという想定です。

```config/routes.rb
Rails.application.routes.draw do
  resource :contacts, only: [:new, :create] do
    get "/thanks" => "contacts#thanks"
  end
end
```

##モデルの作成
問合せフォームで入力する内容は、お名前、メールアドレス、問合せ内容の3点としました。

```
$ rails g model contact name:string email:string content:text
```

```
$ rails db:migrate
```

##コントローラの作成

```
$ rails g controller contacts
```

```app/controller/contacts_controller.rb
class ContactsController < ApplicationController
  def new
    @contact = Contact.new
  end

  def create
    @contact = Contact.new(contact_params)
    if @contact.save
      ContactMailer.contact_mail(@contact).deliver
      redirect_to thanks_contacts_path
    else
      render :new
    end
  end

  def thanks
  end

  private
  def contact_params
    params.require(:contact).permit(:name, :email, :content)
  end
end
```

##ビュー（お問い合わせフォーム）の作成
私が作成したサイトのテイストに合わせて一部ひらがなにしている箇所がございますが気にしないでください。

```app/view/contacts/new.html.erb
<h3>おといあわせ</h3>
<%= form_with(model: @contact, local: true) do |f| %>
  <%= f.label :name, "おなまえ" %>
  <%= f.text_field :name %>
  <%= f.label :email, "メールアドレス" %>
  <%= f.email_field :email, autocomplete: "email" %>
  <%= f.label :content, "ないよう" %>
  <%= f.text_field :content %>
  <%= f.submit "おくる" %>
<% end %>
```

##ビュー（送信完了画面）の作成

```app/view/contacts/thanks.html.erb
<h3>おといあわせ、ありがとうございました。</h3>
```

##メーラーの作成

```
$ rails g mailer ContactMailer
```

##メール送信処理を記載

```app/model/contact_mailer.rb
class ContactMailer < ApplicationMailer
  def contact_mail(contact)
    @contact = contact
    mail to:"自分のメールアドレス", subject: "お問い合わせ"
  end
end
```

##メール文の作成

```app/view/contact_mailer/contact_mail.html.erb
<p>ユーザーネーム:<%= @contact.name %></p>
<p>メールアドレス:<%= @contact.email %></p>
<p>お問い合わせ内容:<%= @contact.content %></p>
```

##Gmailサーバーの設定

```config/environments/development.rb
Rails.application.configure do
  config.action_mailer.perform_deliveries = true
  config.action_mailer.raise_delivery_errors = true
  config.action_mailer.delivery_method = :smtp
  config.action_mailer.smtp_settings = {
    address: 'smtp.gmail.com',
    domain: 'gmail.com',
    port: 587,
    user_name: '自分のメールアドレス',
    password: ENV["GMAIL_KEY"],
    authentication: 'plain',
    enable_starttls_auto: true
  }
end
```
パスワードはGitHubに上がってしまわないように、.envファイルに記載することにします。

##Gmailキーの設定
アプリケーションディレクトリ直下の.envファイル（ない場合は作成）に以下を記載します。

```
GMAIL_KEY=パスワード
```

ここに入力するパスワードは[Googleアカウント](https://myaccount.google.com/intro?utm_source=OGB&tab=mk&utm_medium=act)にアクセスし生成したアプリパスワードを入力します。

セキュリティ→Googleへのログインの欄
2段階認証を設定していない方は、まず設定をした上で、アプリパスワードを生成します。
ここで生成したパスワードを入力します。

こちらで実装は完了です。

これで問合せフォームからメールを送信すると
![スクリーンショット 2020-10-25 23.32.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/823464/5e0d5904-b5f8-82b5-ad4f-fcecefedf0ef.png)

無事、送受信ができました。
プロジェクト管理ツール動向(2020.10)


会社ではRedmineを使用していますが次のツールを検討した際に，プロジェクト管理ツール(Redmine, JIRA, Trello，Backlog，Trac)の動向をGoogleトレンドで調べてみました。(2020年10月現在)

参考にした記事
https://qiita.com/runmaru/items/1b9db88a853d4a50b723

# まとめ
- 2014年以降JIRA，Trelloが大幅増加
- Backlogは微増傾向
- Redmineは2012年ごろから減少傾向
- Tracは2008年ごろから減少傾向
- 国によって上位のツールが異なる。
- 日本はRedmineが多いが減少傾向。JIRA, Trelloが増加傾向

# 2004年-2020年10月, すべての国
JIRA, Trello: 上位。増加傾向
Trac: 2008年をピークに減少
Redmine: 2012年をピークに減少
Backlog:徐々に増加
![redmine, Backlog, trac, JIRA, trello-trend-WW-2004_to_2020.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583230/e6834b86-326c-83f6-2ea5-05061e7789b4.jpeg)

# 2010年-2020年10月, すべての国
2004-2020年と同様の傾向
![redmine, Backlog, trac, JIRA, trello-trend-WW-2010_to_2020.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583230/e36bb9e0-8df2-2f1f-fbb4-bd13d2e92305.jpeg)

# 2010年-2020年10月, すべての国，できる限り「ソフトウェア」として指定した場合
各キーワードは「検索キーワード」として指定したので，一般名称と重複するTracの数値が大きくなっているようだったので，念のため。
Trac: 大幅に減少
![redmine, Backlog, trac, JIRA, trello-trend-WW-2010_to_2020-category.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583230/c2abc0d1-85cd-5456-31f1-6065e5e8bcd3.jpeg)

# 2010年-2020年10月, 地域別比較
JIRA: 北米，東欧，ロシア，中国などで上位
Trello: 中南米，ポルトガルで上位（スペイン語，ポルトガル語圏？）
Redmine: 日本で上位

![redmine, Backlog, trac, JIRA, trello-trend-WW-2010_to_2020-Region1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583230/dfd5525d-301a-b6ae-5f04-59e51c78637e.jpeg)

# 2010年-2020年10月, 日本に絞った場合
Redmine:上位だが，減少方向
JIRA, Trello, Backlog: ほぼ同数で徐々に増加
![redmine, Backlog, trac, JIRA, trello-trend-JP-2010_to_2020.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583230/23813d31-96c2-29c8-506d-52255e1a6751.jpeg)
Webアプリ？作成時の描画部分のリアルタイムメモ

#今回やろうとするポイント
　フロントエンドの方で簡単に描画する方法を探る

#メモ
　Chart.jsでやろうとする
　→Vue.jsとの共存（vue.jsからChart.jsを呼び出す方法　newでインスタンス作ってる？）の仕方がわからん。
　→他の方法を試みる。gstaticsというgoogleの描画ライブラリがあるみたい。これを使おう。

　データ：配列のデータを作る
　描画場所：htmlのIDで指定
　グラフの種類：メソッドで指定
　でいけた。
　むしろbootstrapで困ったのでメモ。

```html
  <div class="row my-3">
    <div class="col-sm-6 mx-auto">
      <div id="stage"></div>  
    </div>
  </div>

```
これだと↓

<img width="60%" alt="first" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737206/ed83127d-09ec-b9c3-65cf-493b10a615bd.png">

　⇒こんなに小さくなくてよい。

次は、

```html
  <div class="row my-3">
    <div class="col-sm-6 mx-auto">
    </div>
      <div id="stage"></div>  
  </div>
```

このパターンだと
<img width="60%" alt="second" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737206/e4f81a18-ecd5-5982-fec7-cbad9f19c924.png">
　⇒右に寄った。



外に出すと、

```html

  <div class="row my-3">

    <div class="col-sm-6 mx-auto">
    </div>
  </div>
      <div id="stage"></div> 

```

<img width="60%" alt="third" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737206/6c4fff3f-f38d-4ca3-1a27-ea0d32151bdf.png">

⇒うまいサイズによしなに変わってくれた。

グラフをフルじゃなく１０コラム分（bootstrapの書き方）とると、

```html

  <div class="row my-3">

    <div class="col-sm-6 mx-auto">
    </div>
  </div>
      <div class="col-lg-10 mx-auto" id="stage"></div>  
```

<img width="60%" alt="forth" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737206/e5b67643-8cd7-788c-437c-bce25d2e5a2e.png">




#参考にしたサイト
 [描画の部分](https://paiza.hatenablog.com/entry/2016/06/07/JavaScript%E3%81%A7%E3%82%B0%E3%83%A9%E3%83%95%E6%8F%8F%E7%94%BB%E5%85%A5%E9%96%80%EF%BC%81%E5%85%A8%EF%BC%98%E5%80%8B%E3%81%AE%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%82%92%E3%82%B3%E3%83%BC)
 [bootstrapの部分](http://websae.net/twitter-bootstrap-grid-system-21060224/)


```ソース