OmniAICreator/Qiita-1.07M huggingface dataset:
Discover How: IoT Drives the Future of Banking & Financial Industry

The banking industry is considered to be slow, conservative, and also open to various forms of bureaucracy. Owing to the multiple apprehensions and myths, the industry is often perceived as a slow adopter of technology innovations. Talking about Fintech organizations and modern banks, they have been the early adopters of opportunities offered by IoT technology. 
![iot-future.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277629/fc039f84-8bb1-6b10-a0d5-6329e4b0bf99.jpeg)
IoT Use Cases in Banking

The Internet of Things can be a competent growth driver for the financial industry to succeed. Most of the technology adoption cases in the industry might look far-fetched; still, the pace at which IoT is developing, the concept of connected banking is no more superficial.

Following are some prominent use-cases in which the IoT technology can revolutionize the banking industry
Personalization of Wealth Management

By using data processing algorithms, we can easily get wealth management insights. IoT technology in financial services will enhance further the accuracy and speed of collecting the information and also expand the present set of insights. IoT enables business leaders can get real-time financial data for facilitating and improving the decision-making process. 
Better Security of Payments

IoT in the financial services will strengthen the newer forms and methods for payment, such as- smart cards and biometric tokens. ATM-based transactions will become obsolete as most devices have already started using smart card technology.

IoT is also boosting wearable payment methods. We will witness individuals making payments using the wristbands rather than carrying cards. Recently, a leading global Bank has introduced wearables for contactless payments. 

Read More>> https://www.esds.co.in/blog/discover-how-iot-drives-the-future-of-banking-financial-industry/
映画情報を取得できるTMDb API　画像（poster_path）のサイズは、決まっていた！！

#はじめに
[TMDb](https://www.themoviedb.org)のAPIを使って、映画アプリを開発していおります。
[Vue 映画情報をTMDb APIを使って取得](https://qiita.com/kokogento/items/569d85c760c4d0316fbd)
**※この記事のコードは、全て上記のページを元にしています**

このAPIを使えば、こんな感じで映画を取得する事ができます。
![movie-search.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/c2255ab5-1c56-f18f-3891-10bd525976ae.png)


で、この映画のポスター画像なんだが、、どうもサイズの扱いが難しく思い通りにできなかった。。:expressionless:

その記録をここに残す。

#ポスター画像の大きさを変えるには
https://developers.themoviedb.org/3/getting-started/images
:point_up_2:ドキュメント

`http://image.tmdb.org/t/p/w300/`
画像のURLの中にある`w300`の部分を変更すると、画像サイズは変更できる。

で、ここから本題となるのだが、この**画像サイズ変更**がなかなかうまくいかないのである。。

##width100%にしてみる

```vue
<v-img v-bind:src="'http://image.tmdb.org/t/p/w100%/' + movie.poster_path"></v-img>
```

`w100%`にした場合、ポスター画像は表示されない。。。
何も表示されない！

##width150にしてみる

```vue
<v-img v-bind:src="'http://image.tmdb.org/t/p/w150/' + movie.poster_path"></v-img>
```

`w150`にした場合、ポスター画像は表示されない。。。
何も表示されない！

あれ？でも`w300`なら表示されてたよね？？なんで`w150`なら何も表示されないの？


#サイズは決まっている

https://www.themoviedb.org/talk/5aeaaf56c3a3682ddf0010de

![スクリーンショット 2020-10-12 13.43.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/4a8f90f7-5616-8f33-dfba-ea65f6f43fed.png)


どうやらサポートされている画像サイズは決まっているようで、上記のサイズ以外を指定しても何も表示されないらしい。。。

なので、poster画像の場合`w150`では表示されず、`w154`では正常に表示されたのである！
【Mac用ランチャーアプリ Alfred】ブックマーク検索からコードスニペットまでなんでもできる！

# はじめに
今回はMac用便利ツール Alfredについて紹介します！
デスクトップ、ブックマーク、スニペットがカオスになっているエンジニアの方、必見です！！

[【YouTube動画】 エンジニアの必需品 Mac用便利ツール Alfred](https://youtu.be/ujBpjIF3nq0)
[![Collation](https://img.youtube.com/vi/ujBpjIF3nq0/0.jpg)](https://www.youtube.com/watch?v=ujBpjIF3nq0)

# Alfredとは？
https://www.alfredapp.com
![スクリーンショット 2020-10-12 10.28.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/751408/b8e538d3-47b3-168e-bff9-5c1d6f3000a9.png)

### Alfredはランチャーアプリと呼ばれる分類のアプリで、他のアプリを簡単に呼び出すために使います

起動時は以下のようなウィンドウが開きます。
MacのSpotlightみたいですが、それよりも高機能で、楽しいアプリです！！
![スクリーンショット 2020-10-10 18.07.57のコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/751408/b631afa0-5c40-472c-0424-e5518ffc1de0.png)

# Alfredの便利機能 (無料版)
Alfredは無料でも利用できます。
無料の場合、ブックマーク検索が非常に便利です。

## ブックマーク検索
ブックマーク検索は、ブックマークしたサイトを文字列で検索できる機能です。

みなさん、ブックマーク管理はどうしてますか？
フォルダを作ったり、グルーピングして管理してますか？ (私は途中で諦めました)

![スクリーンショット 2020-10-12 10.50.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/751408/16f822de-ba0d-2a2d-7e56-a4b603898414.png)

`chrome://bookmarks` にアクセスして、文字列で検索することもできますが、AlfredならAlfred上でブックマークしたサイトを検索できます！
![スクリーンショット 2020-10-12 11.59.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/751408/8af8ee8c-5506-3656-9db7-dc11fe0e780f.png)


## スリープ
コマンドでスリープさせるのも便利です。
スリープするときは、ディスプレイだけをスリープするか、Macをスリープするか選択できます。
![スクリーンショット 2020-10-12 12.01.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/751408/e60020e0-e746-5308-1538-9535c4e62049.png)



## 計算, 辞書
計算や辞書引きも簡単にできます。
![スクリーンショット 2020-10-12 12.05.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/751408/51b969b3-fd12-0852-eed1-32a3b4287edd.png)

![スクリーンショット 2020-10-12 12.07.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/751408/62211f1a-399f-5c2e-8d9c-1e98f6868ae8.png)



# Alfredの便利機能 (有料版)
AlfredにはPowerpackという有料プランがあります。
29ポンドでAlfred 4を購入できます (4,000円前後)。

https://www.alfredapp.com/shop

有料プランにすると、便利な機能が一気に増えます。

## スニペット機能
よく使うコマンドを登録しておくと、作業時間の短縮になります！
Option + command + cで、クリップボードを開き、Collection一覧から使いたいコマンドを選ぶこともできます。
このキーを打ったら、このコードを書き出すとかもできるので、大変便利です！

![スクリーンショット 2020-10-12 12.17.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/751408/b563aa1f-178d-a391-68b2-8c432155e40f.png)

Collection一覧から選択する例
![docker.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/751408/3ce66b28-e1d1-f508-d6bf-9802c9f836e3.gif)


キー入力でコマンドを出力する例
![terminal2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/751408/ca29e367-1958-9651-47d6-b1ad6bdd04f7.gif)


## クリップボードの履歴
指定した期間内のクリップボードの履歴も表示できます。
![click.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/751408/37495ecd-dd49-eee5-10ea-1ef1ebaf331b.gif)


## その他の便利機能
その他にもGitHubのリポジトリを簡単に開く機能やIPアドレスチェック、色とカラーコードを選択ができる機能もあります！
多機能ですね。

個人的には、スニペット機能だけでも価値があると思うので、ぜひ導入をオススメします！！



# まとめ
今回、Mac用便利ツール Alfredについて紹介しました！
ぜひ使ってみて、便利な使い方とか共有していただけると嬉しいです。

[twitter](https://twitter.com/yassun_youtuber)や[youtube](https://www.youtube.com/channel/UCajrdoGzHzDogrNrLYYmGsg/featured?view_as=public)でのコメントもお待ちしています！
初投稿　UNIXコマンドのまとめ

#UNIXコマンドのまとめ
##lsコマンド
ディレクトリの内容をリスト表示するコマンド。

実際の表示画面↓
**nikawadori**ディレクトリーの表示
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/747599/068a6f5b-d633-90a0-0c46-4ed5c92fabf5.png" width=50%>

ターミナル上↓

```
% ls
Applications	Downloads	Music		nika_blogapp
Desktop		Library		Pictures	rails
Documents	Movies		Public

```

##touchコマンド
フォルダーを作成できるコマンド

```
% touch memo.text
```
とすることで、ディレクトリー内にファイルを作成できる

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/747599/22905c39-ce4b-65d8-4117-618ecc89c3cf.png" width=50%>

##catコマンド
フォイルの中身を確認できるコマンド
先に**memo.text**に「練習内容を書きました」と記載しておきました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/747599/ee69c192-4aa8-94b5-bc6a-43b20692dc4b.png" width=50%>



```
% cat memo.text
練習内容を書きました%
```
最後の%は、わかりませんが**memo.text**の内容を表示できました。

##pwdコマンド
現在の作業しているディレクトリの表示をするコマンド


```
% pwd
/Users/nikawadori/practice
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/747599/846136e8-10cc-b305-ea6e-7ce1f59f493a.png" width=50%>

##cdコマンド
ディレクトリーを移動するコマンド

```
% pwd
/Users/nikawadori/practice
% cd ../
% pwd
/Users/nikawadori
nikawadori@MacBook-Pro ~ % cd ./practice.text
% cd ./practice
% pwd
/Users/nikawadori/practice
```
pwdコマンドで現在の作業ディレクトリーを確認
↓**nikawadoriの中のpractceにいることを確認**
①cdコマンドで一個上のディレクトリーに移動
↓
pwdコマンド実行
↓**nikawadoriに移動完了**
②
cdコマンドにて一個したのディレクターへ移動
↓
pwdコマンドにて***practiceディレクトリーへ移動していることを確認***
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/747599/23b1d833-848d-81b5-3445-f1cea624cce7.png" width=50%>

###以上
Pythonで間違い探し


```
import random

def main():

    # rnd = random.randint(50, 100)
    # rnd = random.random()
    count = 0
    postions = []

    problem = ""

    A = "ぬ"
    B = "め"

    for x in range(1, 11):
        for y in range(1, 11):

            if y % 10 == 0:
                print(A)
                problem += A + "\n"
            else:
                if random.random() < 0.1:
                    print(B, end="")
                    count = count + 1
                    problem += B

                    p = [x, y]
                    postions.append(p)
                else:
                    print(A, end="")
                    problem += A

    # print(count)
    # print(postions)
    # print("=======")
    # print(problem)


    print("--------------------")
    print("答え⬇︎")
    
    print("「め」の数は{}個".format(count))
    

    for a in postions:
        print("「め」は{}行、{}列目".format(a[0], a[1]))

    with open("result.txt", "w") as f:
        f.write("間違い探しクイズ\n")
        f.write(problem)
        f.write("「め」の数は{}個\n".format(count))

        for a in postions:
            f.write("「め」は{}行、{}列目\n".format(a[0], a[1]))

if __name__ == '__main__':
    main()
```

![スクリーンショット 2020-10-12 13.31.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692893/8eff2ceb-f505-296c-7479-d8a00e3f4463.png)

縦×１０、　横×１０の列でランダムで『め』の位置や個数が変わります。

#最後に

理解を深める為にやったので時間はかかりましたが、ちゃんと動いて良かったです。
hiddenの使い方

# hiddenの使い方

hiddennは疑似要素として扱うことができる。

```php:ctpファイル
echo $this->Form->hidden('isSelectArea',["id" => "isSelectArea"]);
```


***
jQueryで疑似要素にval()で値を与える。

```php:js
$(function () {
	$(document).on("change", "#area", function () {
		$("#isSelectArea").val(true); //地域を選択したときにコントローラーで条件分岐をしてaddアクションにリダイレクトさせるためのhidden
		$("#UserConfirmForm").submit(); //一旦confirmアクションに飛ばす
	});
});

```

***

最後にコントローラで疑似要素を元にif文などで条件分岐できる

```php:controller
if ($this->request->data["User"]["isSelectArea"]){ 
	//もしisSelectAreaというキーを持っていればここで処理
}
```
Failure/Error: require File.expand_path('/../config/environment', __dir__)　というエラー

#エラー文
結合テストコードの１行目のrequireが読み込まれていないらしい...

```
An error occurred while loading ./spec/system/users_spec.rb. - Did you mean?
                    rspec ./spec/system/comments_spec.rb

Failure/Error: require File.expand_path('/../config/environment', __dir__)

LoadError:
  cannot load such file -- /config/environment
# ./spec/rails_helper.rb:4:in `require'
# ./spec/rails_helper.rb:4:in `<top (required)>'
# ./spec/system/users_spec.rb:1:in `require'
# ./spec/system/users_spec.rb:1:in `<top (required)>'
No examples found.
```
誤

```
('/../config/environment', __dir__)
```
正

```
('../config/environment', __dir__)
```
#原因
('../../config/environment', __dir__)というふうに記述すれば直るという記事を見て変更してみたがうまくいかなく戻し他たきに戻し間違えたと考えられる。
根本的にはcapybaraなどのテスト用gemをgemfileのテストの部分のみに記述していたのが原因だったようだ。それをtestとdevelopmentに適用される部分に記述し直し、bundle installをすると直った。
[Rails]　Herokuデプロイの流れ

## 備忘録
Herokuを使ったデプロイよく忘れてしまうので記録用
初学者のため間違っていたらご指摘お願いします。
尚本環境ではRails、MySQLを使っています。
プログラミング初心者の方に役立てばと思います！


 
## 手順１ Heroku CLIをインストール
こちら最初のデプロイのみです。
2回目以降の方は手順２からご覧下さい

ターミナル

```
使用するディレクトリ内で以下のコマンドを入力
% brew tap heroku/brew && brew install heroku
```

このコマンドでherokuコマンドが使用できるようになり、ターミナルからHerokuにログインできるようになります。


## 手順２ Herokuにログインしましょう
```
ターミナルで以下を入力
% heroku login --interactive
  => Enter your Heroku credentials.
# メールアドレスを入力し、エンターキーを押す
  => Email:
# パスワードを入力して、エンターキーを押す
  => Password:
```
これでHerokuにログインできました！

## 手順３ rails_12factorを導入
Railsアプリケーションを本番環境などのサーバ上で動かすためのアセットがまとまったGem

```ruby
# Gemfileに追加
group :production do
  gem 'rails_12factor'
end
```



```
gemインストール
% bundle install
```

```
編集したのでコミット
% git add .
% git commit -m "gem rails_12factorの追加"
```
デプロイはリモートリポジトリ上のデータを使うので変更の都度コミットしてプッシュを行うことを忘れないで下さい。


## 手順４ Herokuにアプリを作成
heroku createコマンドでheroku上にアプリを作成します。
heroku create 作成したいアプリ名

```
ターミナルにて入力
例
% heroku create heroku-test01
```

## 手順５ HerokuでMySQLを使えるようにする
ClearDBアドオンを追加する事でHeroku内でMySQLを使用できるようになります。

```
ターミナルで以下コマンドを実行
heroku addons:add cleardb
```

```
ターミナルで以下入力
# ClearDBデータベースのURLを変数heroku_cleardb
% heroku_cleardb=`heroku config:get CLEARDB_DATABASE_URL`

# データベースのURLを再設定
% heroku config:set DATABASE_URL=mysql2${heroku_cleardb:5}
```

ここまででMySQLを使えるようになりました。
手順4に進む前にcredentials.yml.encファイルとmaster.keyファイルについて軽く説明します。

credentials.yml.encファイルはrailsで外部に漏らしたくない情報を扱うファイルのこと。

master.keyファイルファイルはcredentials.yml.encの暗号文を複号するためのファイルのことです。
master.keyは重要なファイルのためデフォルトでGitで扱われないようになっています。

## 手順５.５ credentials.yml.encをmaster.keyで複号
以下コマンドでcredentials.yml.encをmaster.keyによって復号し、中身を確認できた状態です

```
# ターミナルで以下コマンドを実行
% EDITOR="vi" bin/rails credentials:edit
```

## 手順６ Heroku上にmaster.keyを設置
先ほども説明しましたが、master.keyはGitで扱えないため環境変数を設定する必要があります。
heroku config:set 環境変数名="値"
これにより、Heroku上で環境変数を設定でき、master.keyを使えるようになります。

```
ターミナルで以下入力
heroku config:set RAILS_MASTER_KEY=`cat config/master.key`
```

```
以下コマンドで環境変数の設定を確認
% heroku config
```

## 手順７ アプリをプッシュ
git push heroku masterコマンドでheroku上のアプリにリモートリポジトリの内容をプッシュしています。

```
以下ターミナルで実行
% git push heroku master
```

ここまででHeroku上にアプリケーションを反映する事ができました！
ですがマイグレーション情報が反映されていません、、、

## 手順8 Herokuでマイグレーションを実行
heroku run rails db:migrateコマンドでHerokuのDB上にマイグレーション情報を反映させています。

```
ターミナルで以下コマンド実行
% heroku run rails db:migrate
```
```
# 以下コマンドでHeroku上にデプロイしたアプリの情報確認できます
% heroku apps:info
```

今後追加機能などを本番環境にデプロイする際には、コミット→プッシュ→手順7で簡単にデプロイする事ができます。

 

## まとめ
お疲れ様です！
ここまでで一通りのデプロイ作業が終了しました！
実際の現場ではHerokuを使う事はほとんど無いと思いますが、私を含め初学者にとっては簡単にデプロイできるツールなのでデプロイの入門としてとても便利ですね！
誰かの助けになれば幸いです。


##追記
ご指摘を頂きましたので修正させて頂きます。
手順3でrails_12factorを導入していますがrails5以降は不要なようです！
一応rails_12factorを導入しても問題なく動作は確認ができていますが、rails5以降をお使いの場合は手順3
を飛ばして手順4から進めてみて下さい！
【kintone】アプリのレコードにコメントを書いたときの通知

今回はアプリのレコードにコメントに書いたときに通知が行く場合について考えてみたいと思います。

特に、メンション（＠ユーザー名で名指し）していないのに、「自分宛」通知が届いてしまう場合・・・
について物語風？に書いてみました～

前回のお話↓
[【kintone】レコード追加で「通知」を送りたいとき](https://qiita.com/juri_don/items/cb375d307d317fa804c1)

登場人物

* 部長（経理部の部長。決算書が読める。指示したり承認したりする。）
* 太郎（経理部の手を動かす人。知識はあるし手は動かせるけど、言われないと動かない。）

## コメントを書いたら何故か上司に通知が行ってしまった

経理の太郎くん「部長から頼まれた、『犬の散歩』終わったぞ・・・」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/e2ef7536-9e60-6fae-8d4c-268d4c848e35.png)

太郎「犬も可愛かったし、満足。」

ツイ廃（ツイッター廃人）でもある太郎君は、ついついコメント欄に何かを書きたくなりました。

太郎「担当者は、僕だけだし、誰にも通知は行かないだろう(゜-゜)」

そう思った太郎くんは調子に乗ってコメントを書きまくりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/59eb8c0e-f79b-beb8-3d87-8aa63e92a54d.png)

太郎「いっぱい書いて気が済んだぞ。」

・・・一方その頃・・・

部長「通知めっちゃ来てるやん。これはきっと太郎君の仕業だな。」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/cc5d6f7c-9397-0146-e8d2-b45c883d0b45.png)

部長「太郎君、ちょっといいかい？通知がむっちゃ来てるんだけど・・・」

太郎「あっ、部長！犬の散歩終わりました。完了にしておきました。
　　　・・・って、コメントの通知が行ってるんですか👀！？！？」


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/1afabccc-0da7-844b-d3eb-efdf52cee163.png)


## アプリの通知設定を確認してみよう

### 起こったこと

今回・・・、

* 「犬の散歩」というタスクのレコードを作成したのは部長
* 太郎君はタスクを完了してコメントを書いた
* 太郎くんはコメントを書いたが、部長にメンションしてない


そして、部長には

* メンションついてないのにコメントの書き込み通知が「自分宛」で来た
* 完了通知は来なかった

でした。

そんな、部長に通知が行ってしまった設定とは！？

### アプリの通知設定

[kintoneヘルプ-通知が送信されるタイミングと宛先](https://jp.cybozu.help/k/ja/user/notifications/notification_type.html)
の「レコードにコメントを書き込んだとき」を確認してみましょう。


**レコードにコメントを書き込んだとき**
「自分宛」を受信するユーザーの中に

* 「アプリの条件通知」の「コメント書き込み」が有効な、次のフィールドに該当するユーザー

とあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/f9c838ac-9ff1-56df-fa70-a9b82dad9e89.png)


### 「アプリの通知設定」を確認してみると

下図の赤枠で囲んでいるところを見てほしいのですが、
「**作成者フィールド**」の「**コメント書き込み**」にチェックが付いています。

「犬の散歩」タスクのレコードを作ったのは部長です。
これは・・・、
**太郎君がレコードにコメントを書くと、レコードを作成した部長に通知が行く**設定になっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/b5c0499d-2d2d-0143-389b-8bb696d65a35.png)

一方、太郎くんがステータスを「**完了**」にしても、部長には通知が届きませんでした。

なぜなら、上図の青枠で囲まれている「**ステータスの更新**」にチェックが付いていないからです。
「**ステータスの更新**」で、作成者に通知が行かない設定だったため、
太郎君がステータスを「**完了**」に更新しても、部長は通知を受信しなかったのです。


太郎「**レコード作成者**に『**コメント書き込み**』の通知が行くようになってたんだなぁ」

部長「いや～、いっぱい通知来てたからびっくりしたよ～。」


## まとめ
メンションをつけていないのに「**自分宛**」通知が上司に送られる状況を再現してみました。
メンションがついていなくても、「レコードの作成者」にコメント書き込みの通知が送られました。

アプリ新規作成時は、デフォルトで、アプリ通知条件に「**作成者**」と「**更新者**」の「**コメント書き込み**」にチェックが付いているようなので、
他人が作成したレコードにコメントする際は作成者に通知が飛ぶかも！？

また、レコードの作成者や更新者が「ステータス更新」を追いかけたい！という場合には
作成者または更新者の「**ステータスの更新**」にチェックを入れてみましょう。

以上です！
エンジニアの最新技術キャッチアップに使えるサイト

エンジニアにとって技術は財産であり、現状維持では、そのうち需要がなくなってしまいます。その為、常に最新技術について敏感になっていなくてはいけません。

そこで、今回は、最新技術のキャッチアップができるサイトについてご紹介したいと思います。

## [Microsoft Learn](https://docs.microsoft.com/ja-jp/learn/?WT.mc_id=AZ-MVP-5001601)

> [Microsoft Learn](https://docs.microsoft.com/ja-jp/learn/?WT.mc_id=AZ-MVP-5001601) は、Microsoft 製品についての対話式学習などを提供する無料のオンライン トレーニング プラットフォームです。 Microsoft の目標は、お客様の役割や目的に特化したガイド付きの楽しく実践的な対話型コンテンツを使用して、お客様が Microsoft のテクノロジを上達させ、さらに多くのスキルを習得できるようにすることです。 詳細については、こちらの[ビデオ](https://channel9.msdn.com/Blogs/One-Dev-Minute/What-is-Microsoft-Learn/?WT.mc_id=AZ-MVP-5001601)をご視聴ください。

「[Microsoft Learn](https://docs.microsoft.com/ja-jp/learn/?WT.mc_id=AZ-MVP-5001601) は、Microsoft 製品についての対話式学習などを提供する無料のオンライン トレーニング プラットフォームです。」と書いてありますが、AI・機械学習・ディープラーニングといった Microsoft に限定されない技術についても情報が提供されています。

[Microsoft Learn](https://docs.microsoft.com/ja-jp/learn/?WT.mc_id=AZ-MVP-5001601) で最新技術をキャッチアップするのをおすすめする理由で最も大きなものは、「対話式学習などを無料で提供」している点です。

どういうことかというと、多くの技術情報共有サイトやサービスでは、情報がドキュメントやムービーで提供されています。そのため、読んだり聞いたりするだけで理解しなければなりません。また、数年前の内容が更新されずにそのまま放置されていることも珍しくありません。

そういったサイトやサービスで最新技術をキャッチアップしようとすると、

* 記載されている手順通りに実行しても動作しない
* そもそも情報が古い

といったことが起こります。

しかし、[Microsoft Learn](https://docs.microsoft.com/ja-jp/learn/?WT.mc_id=AZ-MVP-5001601) ではドキュメントやムービーで学習するのみならず、Azure 上に トレーニング用の環境を構築し、ハンズオン形式で学習します。そのため、常に最新の状態になっており、記載されている手順通りに実行しても動作しないといったことが起こりにくくなっています。また、学習コンテンツごとに、理解度チェックのテスト（間違ったからといって特にペナルティはなく、自身の理解度を知るための問題）があり、至れり尽くせりです。

実際、私自身も AI・機械学習・ディープラーニングなどの今まで触れてこなかった技術をキャッチアップする際にはかなりお世話になりました。

## 参考
- [Microsoft Learn](https://docs.microsoft.com/ja-jp/learn/?WT.mc_id=AZ-MVP-5001601)
JavaのRecordに対するcloneメソッドの実装

Java 15で2nd previewとなっているRecordにcloneメソッドを実装し、deep copyできるようにします。
特にこれといって使う場面は浮かびませんが、いつか使うかもしれないので備忘録に。
ポイントは`super.clone()`を使わずにコンストラクタでcloneを作ることくらいです。

## 環境
Java 15（Oracle Open JDK）
IntelliJ IDEA Community版
Windows

※IntelliJでRecordを使うための設定は以下を参考にしてください（手前味噌ですが）。
https://qiita.com/tora_kouno/items/58eff9f4eb99a941fd41

## 実装
### clone実装前
`ExampleRecord.java`

```java
public record ExampleRecord(String name, int age, ExampleDto dto) {
}
```

`ExampleDto.java`

```java
public class ExampleDto {
  private String name;
  private int age;
  private NodeDto node;
  // setter, getter, toStringは省略
}
```

`NodeDto.java`

```java
public class NodeDto {
  private String name;
  // setter, getter, toStringは省略
}
```


### clone実装後
`ExampleRecord.java`

```java
public record ExampleRecord(String name, int age, ExampleDto dto) {
  @Override
  public ExampleRecord clone() {
    try {
      return new ExampleRecord(this.name, this.age, this.dto.clone());
    } catch (CloneNotSupportedException e) {
      e.printStackTrace();
    }
    return null;
  }
}
```

`ExampleDto.java`

```java
public class ExampleDto implements Cloneable {
  private String name;
  private int age;
  private NodeDto node;
  // setter, getter, toStringは省略

  @Override
  public ExampleDto clone() throws CloneNotSupportedException {
    ExampleDto copy = (ExampleDto) super.clone();
    copy.node = this.node.clone();
    return copy;
  }
}
```

`NodeDto.java`

```java
public class NodeDto implements Cloneable {
  private String name;
  // setter, getter, toStringは省略

  @Override
  public NodeDto clone() throws CloneNotSupportedException {
    return (NodeDto) super.clone();
  }
}
```

## 試す
### 実装
`Main.java`

```java

public class Main {
  public static void main(String[] args) {
    ExampleDto dto = new ExampleDto();
    NodeDto nodeDto = new NodeDto();
    nodeDto.setName("node1");
    dto.setNode(nodeDto);
    dto.setName("dto1");
    dto.setAge(1);
    ExampleRecord exampleRecord = new ExampleRecord("record1", 2, dto);
    System.out.println("exampleRecord:"+exampleRecord);// 1
    dto.setName("dto2");
    nodeDto.setName("node2");
    System.out.println("exampleRecord:"+exampleRecord);// 2

    ExampleRecord clone = exampleRecord.clone();
    System.out.println("clone:"+clone);// 3
    dto.setName("dto3");
    nodeDto.setName("node3");
    System.out.println("clone:"+clone);// 4
  }
}
```

### 実行結果
`1.`

```
exampleRecord:ExampleRecord[name=record1, age=2, dto=ExampleDto{name='dto1', age=1, node=NodeDto{name='node1'}}]
```
`2.`

```
exampleRecord:ExampleRecord[name=record1, age=2, dto=ExampleDto{name='dto2', age=1, node=NodeDto{name='node2'}}]
```
`3.`

```
clone:ExampleRecord[name=record1, age=2, dto=ExampleDto{name='dto2', age=1, node=NodeDto{name='node2'}}]
```
`4.`

```
clone:ExampleRecord[name=record1, age=2, dto=ExampleDto{name='dto2', age=1, node=NodeDto{name='node2'}}]
```

1->2ではDtoの中身が変わってしまっていますが、3->4では別インスタンスであるため`dto.setName("dto3");`や`nodeDto.setName("node3");`の影響を受けず、問題なくcloneされていることがわかります。
Laravel Eloquent の whereHas が遅い

## バージョン
Laravel5.4

## whereHas を用いた場合
whereHasメソッドを用いると処理が重くなります。

```php
$query->when($filter->get('category_id'), function ($query) use ($filter) {
    $query->whereHas('categories', function ($query) use ($filter) {
        $query->whereIn('category_id', $filter->get('category_id'));
    });
});       
```


## 解決方法
Github の issue に解決策が記載されていました。
whereHasメソッドの代わりに、whereInメソッドを用いる。

>Laravel is creating a temporary column on literally every row in the database, in which it fills with true or false. If any indexes can be used, they are probably used after this. Any query that uses whereHas is probably going to be a full table scan.

>Here is a similar query, except it does not induce full table scans.

```php
Profile::whereIn('profiles.id', function($query) use ($mac_address) {
    $query->from('devices')
        ->select('devices.profile_id')
        ->where('devices.mac_address', $mac_address);
})
```

処理が重かった whereHasを用いたソースを whereIn を用いた形に修正すると下記のようになります。

```php
$query->when($filter->get('category_id'), function ($query) use ($filter) {
    $query->whereIn('id', function ($query) use ($filter) {
        $query->from('content_category')
            ->select('content_id')
            ->where('category_id', $filter->get('category_id'));
    });
});        
```

## 参考
 [WhereHas query is too slow #18415](https://github.com/laravel/framework/issues/18415)
IntelliJでJavaのプレビュー機能（Java 15のRecordなど）の試し方

## 結論

1. （IntelliJ IDEAの最新版にする）
1. プロジェクトで当該のJDKを使うように設定
    1. 使いたいJDKをダウンロード
2. プレビュー機能をオンにする
    2. File>Project Structure>Project Settings>Modules
    1. Language levelで「`15(Preview) - Sealed types, records, patterns, local enums and interfaces`」を選択

※上記はWindows環境の場合です。Macの場合、Project Structureの開き方がちょっとだけ違います。
※「Ctrl」+「Shift」+「Alt」+「S」でもProject Structureを開くことができます。

## 環境

 - Windows
 - IntelliJ IDEA Community版(2020.2.2)
 - Open JDK15

## 詳細手順

### 1.IntelliJ IDEAの最新版にする
Java 15の新機能の場合、2020.2より新しいIntelliJが必要です。
<a href="https://www.jetbrains.com/ja-jp/idea/whatsnew/" target="_blank" rel="noopener">2020.2のアップデート情報はこちら</a>
もしバージョンが古い場合は以下の方法でアップデートしてください。
#### 自動アップデート
Help>Check for Updates...から自動アップデートができます。
`update and restart`ボタンを押して待てば完了です。
※`update and restart`ボタンが表示されない場合、手動アップデートを行ってください。

#### 手動アップデート
<a href="https://www.jetbrains.com/idea/download/other.html" target="_blank" rel="noopener">こちら</a>から指定のバージョンのファイルをダウンロードしてアップデートすることもできます。
インストールウィザードで古いバージョンを消して設定を引き継ぐか確認があります。

### 2.プロジェクトで当該のJDKを使うように設定
IntelliJを開き、新規プロジェクトを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365356/8cc87750-648b-23ef-1187-bd7f43414c18.png)
プルダウンでDownload JDKを選択すると、選択したディストリビューションとバージョンのJDKが、プロジェクトで使用するJDKに設定されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365356/6a9a2c49-356e-32ce-b24c-4efa1234e39e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365356/b265dc54-e5c7-a402-1ee0-1dd6f31a0e7b.png)
ここに表示されないアーリーアクセス版などを利用したい場合は各自でダウンロードした後、「Add JDK...」でダウンロードしたJDKを指定してください。(binやlibがあるディレクトリを指定します。)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365356/4fe68e35-2444-8ce3-7a70-6c3af9130ab6.png)

### 3.プレビュー機能をオンにする
File>Project Structure>Project Settings>Modulesを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365356/b472b494-1989-cc38-048f-de483bb5613a.png)
Language levelのプルダウンから使いたい機能に合わせたものを指定します。
今回はrecordsを試すので「`15(Preview) - Sealed types, records, patterns, local enums and interfaces`」を指定しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365356/97160fb6-9e73-4f36-1063-6f9800fcd8d5.png)

もしJava 15の設定が出ない場合はIntelliJのバージョンやJavaのバージョンを再度確認してみてください。

## 実行してみる
まずRecord classを作ります。

```java
package records;

public record ExampleRecord(String name, int age) {
}
```
次に実行するMainクラスを作ります。

```java
package main;

import records.ExampleRecord;

public class Main {
  public static void main(String[] args) {
    ExampleRecord exampleRecord = new ExampleRecord("test", 20);
    System.out.println(exampleRecord);
  }
}
```

実行してみるとこんな感じになります！

```bash
{JDK_path}\bin\java.exe --enable-preview "-javaagent:{IntelliJ IDEA_path}\lib\idea_rt.jar=50507:{IntelliJ IDEA_path}\bin" -Dfile.encoding=UTF-8 -classpath {workspace_path}\{project_name}\out\production\record_refrection main.Main
ExampleRecord[name=test, age=20]
```

ポイントは`--enable-preview`がオプションとして付与されているところです。
これによりpreview機能であるRecordが利用できます。
以上になります。
Rails:メールの正規表現を攻略する！

<a href="https://qiita.com/HIROKOBA/items/0648715a7588313afd31">前回の記事</a>の続きになります。

name、emailカラムにバリデーションを設置した後、有効なメールアドレス（sample@sample.comなど）かどうかを判別するために正規表現を使おうと思いますが、Rubyのリファレンスを見ても膨大な情報に溺れてしまいそう。。。そこで今回はemailが有効かどうかを判別するのに必要な分だけを調べて使ってみることにしました。

結論からいいますと、今回使った正規表現はこちら。

```
/\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
```
正規表現についてはRubyのリファレンスよりも[Railsチュートリアル](https://railstutorial.jp/chapters/modeling_users?version=5.1#sec-format_validation)の方が分かりやすく説明されていました。下記はRailsチュートリアルよりの抜粋ですが、これを見ながらだと理解できそうです。

| 正規表現 | 意味 |
|:-----------|:------------|
| /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i | （完全な正規表現） |
| / | 正規表現の開始を示す |
| \A | 文字列の先頭 |
| [\w+\-.]+ | 英数字、アンダースコア (_)、プラス (+)、ハイフン (-)、ドット (.) のいずれかを少なくとも1文字以上繰り返す |
| @ | アットマーク |
| [a-z\d\-.]+	 | 英小文字、数字、ハイフン、ドットのいずれかを少なくとも1文字以上繰り返す |
| \. | ドット |
| [a-z]+	 | 英小文字を少なくとも1文字以上繰り返す |
| \z | 文字列の末尾 |
| / | 正規表現の終わりを示す |
| i | 大文字小文字を無視するオプション |

さらに<a href="https://rubular.com/">Rubular</a>を使えば正規表現を簡単にチェックできるようです。これは便利！

・・・で、この正規表現を<a href="https://qiita.com/HIROKOBA/items/0648715a7588313afd31">前回の記事</a>で作成したバリデーションに追加します。フォーマットを検証するためには。。。

```
validates :email, format: { with: /<regular expression>/ }
```
このような形でformatオプションを使用するとのことなので、"regular expression"の箇所に正規表現を追加。
app/models/user.rb

```ruby
class User < ApplicationRecord
  validates :name,  presence: true, length: { maximum: 20 }
  validates :email, presence: true, length: { maximum: 300 }, format: { with: /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i }
end
```
Rails consoleで email: "ruby" と入力して登録しようとすると、sample@sample.comのような形でないので、エラーになっていました。正規表現は使いこなせればとても便利！

```
> user = User.create(name: "ruby", email: "ruby")
   (0.2ms)  BEGIN
   (0.3ms)  ROLLBACK
 => #<User id: nil, name: "ruby", email: "ruby", created_at: nil, updated_at: nil>
> user.errors.messages
=> {:email=>["is invalid"]}
```
[Swift] アプリのサポートがiOS11以降であればIntとInt64を使い分ける必要はなかった話

私は今までなんとなく、「値がデカくなる可能性がある整数にはInt64、そうでもない整数はInt」で変数宣言するように気を配ってきましたが、実行環境次第ではそんな考慮は不要、という話です。

本記事の前提環境：
・iOS 11以降
・Swift 5 

冒頭のような考慮をしてきた背景としては、
Intの最大値・最小値は、**『実行環境が32bitか64bitによって違う』という特性があって、32bitだと範囲が狭い**ためです。

|型|最大値|最小値|
|:--|:--|:--|
|Int|2147483647<br>9223372036854775807|-2147483648<br>-9223372036854775808<br>(実行環境が32bitか64bitによって違う)|
|Int64|9223372036854775807|-9223372036854775808|

引用：[意外と知られていないSwift数値型の細かい仕様](https://qiita.com/shimesaba/items/dbbc0f4ec80d011273d6)

なので32bit環境のIntにおいては、例えば扱う数値が金額（円）であれば21億4千7百万ウン円が最大値なので、セレブの場合はアプリがクラッシュする恐れがあります。

ですが、よくよく考えたら私が今担当しているアプリはiOS 11以降のiPhoneでしか使えません。

調べたところ、**iOS 11以降では32bitの実行環境はない**ようです。

参考：[iOS端末 画面サイズ・対応OS早見表（iOS7〜12）](https://an.hatenablog.jp/entry/2016/10/19/212646)

ってことは、iOS 11以降のみサポートのアプリであれば、**IntとInt64を使い分ける意味はない**ので、冒頭のような考慮は不要でした。
iOSアプリ開発のスキルロードマップ（紹介）

[Developer Roadmaps](https://roadmap.sh/)という有名なサイトがありまして、Webフロントエンド、バックエンド、Androidなどのスキルロードマップを図として提案してくれています。

しかし、iOS版はないのですね。。。

ってことで探してみたところ、「Reddit」というアメリカの投稿SNSに割と良さげなモノが投稿されていました。

引用：[2018 Roadmap to iOS Development](https://www.reddit.com/r/iOSProgramming/comments/82w6qa/2018_roadmap_to_ios_development/)

![ix44k24k9ik01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122917/f2707a58-97a9-c121-4b93-61eb29ea8bab.png)

数年前に書かれたモノであるためか、
「Objective-Cは必須にしなくても良いのでは…」など若干ツッコミたいところもありますが、、、

それ以外は、

**「黄色背景のスキルを学習していくと、iOSエンジニアとして及第点に到達するよ」**
という観点で、概ね同意できるかなと思いました。

ところで、最後のApp Storeの項にPick any（何かを選択）の区分で「Lucky Reviewer」という項目があるのは、Appleに対する皮肉ですかね（笑
【AWS初学者用】AWS グローバルインフラインストラクチャとは？

#本記事について
本記事はAWS初学者が学習していく中でわからない単語や概要をなるべくわかりやすい様にまとめたものです。
私自身もAWS初学者なので、もし誤りなどありましたらコメントにてお知らせいただけるとありがたいです。

## AWS グローバルインフラインストラクチャとは？
まずはじめにAWS公式サイトの説明を載せておきます。

> AWS グローバルクラウドインフラストラクチャは、安全性、広範性、信頼性に最も優れたクラウドプラットフォームであり、世界中のデータセンターから 175 以上の完全な機能を提供しています。一度のクリックで世界中にアプリケーションワークロードをデプロイする必要がある、あるいは 1 桁台のミリ秒のレイテンシーでエンドユーザーにさらに近い特定のアプリケーションを構築しデプロイしたいなど、どんな場合においても AWS は必要なときに必要な場所で、クラウドインフラストラクチャを提供します。
世界中に何百万ものアクティブなお客様と数万のパートナーを有し、AWS は最も動的で最大規模のエコシステムを備えています。スタートアップ企業、エンタープライズ、公共部門の組織など、ほとんどの業界やあらゆる規模のお客様が、考えつく限りのユースケースを AWS で実行しています。

予想通り理解が深まりませんでした...
なのでまずは私が調べた上での概要を書いていきます。

## AWS グローバルインフラインストラクチャの概要
1. **リージョン**
リージョンは「地域」のことを指す単語です。AWSは世界中にデータセンターを持っていて、そのまとまりを**リージョン**と呼びます。(2020年10月12日現在 24のリージョンが存在します)![スクリーンショット 2020-10-12 11.30.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/782134/4bd752e0-75ab-cb72-91b2-8967475b6c14.png)
2. **アベイラビリティーゾーン(AZ)**
アベイラビリティーゾーン(AZ)はリージョン内に複数あるデータセンターの集合体を指します。
AZが複数存在する理由はデータセンターに何らかの障害が発生したときに、他のAZでシステムを継続することを可能にするためです。(2020年10月12日現在 77のAZが存在します)
3. **エッジロケーション**
エッジロケーションはDNSサービスを提供するためのデータセンターのことです。
ユーザーから最も近いエッジロケーションを利用するので、低いレイテンシでコンテンツを配信できます。

※「**ローカルリージョン**」というリージョンもあり、広範囲による災害などが起きた際に遠隔地でシステムの復旧・再開を行うためのリージョンです。日本には大阪ローカルリージョンが存在します。

## AWSサービスの範囲
AWSのサービスは各サービスのレベルによって以下の3つに分類できます。
1. **グローバルサービス**
リージョン外、要するにリージョンに縛られないサービスのことです。
例）IAM , CloudFront , Route 53
2.**リージョンサービス**
リージョン内でのみ利用できるサービスのことです。
例）VPC , DynamoDB , Lambda
3. **アベイラビリティーゾーンサービス**
AZ内で利用するサービスのことです。
例） EC2 , RDS

※S3はグローバルサービスに分類されますが、データは**リージョン内**に保管されます。

## まとめ
AWS グローバルインフラインストラクチャ世界中に存在する「**リージョン**」、「**アベイラビリティーゾーン**」、「**エッジロケーション**」により構成され、安全性、信頼性・セキュリティに優れたクラウドプラットフォームです。
curl --compressed -o- -L https://yarnpkg.com/install.sh | bash でyarn をupdate したら動かなくなった話

# 前書き
　先日[^01]、`yarn` でパッケージをインストールした時に、「最新のyarnはv1.xx.xxだけど、あなたのyarnはv1.xx.xyですよ」的な感じのメッセージと共に、↓のコマンドが出てきました。

```shell
> curl --compressed -o- -L https://yarnpkg.com/install.sh | bash
```
どうやら、これを実行すれば`yarn`を最新化できるとの事。最新化と言ってもパッチレベルが1上がるだけで、正直面倒くさいとも思いました。しかし親切にもコマンドまで出してくれてupdateよろしくと言われた手前、無視するのは人道に反します(言い過ぎ)。一応やっておくかと実行して。。。

　そして私の`yarn`は逝ってしまったのでした[^07]:innocent:
　

# なにが起きたのか
　一応環境を記載しておくと

　OS : Windows10 Home
　Nodist : 0.9.1
　Node : v11.13.0
　npm : v6.14.1
　yarn : v1.22.4

な感じの一般的な(?)Windows環境です。

　事象としては、gitbashで`yarn`と打った後に全く入力を受付ないんですよね。
コマンドプロンプトやpowershellだと普通に動く模様。

```shell:bash
$ yarn -v
   # 何も出ず、コマンドラインが返る
$  # ← どんなにキーを叩いても何も出ない
```

`ctrl + c` は受け付けているので、それの直後に`ctrl + d`でセッションを切って再度起動すれば普通に入力できるようになります。


# どうやって直したか
　前回修正した時のメモが残っており、それによるとyarn関連のファイル・ディレクトリを一旦全部削除して、入れ直したみたいです。今回も同じ手順を踏んでみます。

## `yarn`を全削除
　ひとまず、今の時点で入っている`yarn`関連のファイル・ディレクトリを全て削除します。ここで消し忘れがあると、再度`yarn`を入れても動かなくなりました。

　消したのは以下
・`C:\Program Files (x86)\Nodist\bin\yarn*` にマッチする全ファイル
・`C:\Program Files (x86)\Nodist\bin\node_modules\yarn`　ディレクトリ
・`C:\Users\username\AppData\Local\Yarn`　ディレクトリ
・`C:\Users\poket\.yarn\`　ディレクトリ
・`C:\Users\poket\.yarnrc`　ファイル

3つ目はただのキャッシュで削除不要なのかもしれませんが、とりあえず消す事にします(時間がかかるから、消さなくて良いならそうしたい)。

追記(2020/10/18)
4, 5つ目を消さないと他3つを削除しても上手くいかないことから、ここが解決の糸口になりそうです:exclamation:

削除できたか(=`yarn`コマンドが使用不可になっているか)は、powershellとbashで確認します。

```powershell:powershell
$ yarn -v
yarn : 用語 'yarn' は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前として認識されません
。名前が正しく記述されていることを確認し、パスが含まれている場合はそのパスが正しいことを確認してから、再試行してくださ
い。
発生場所 行:1 文字:1
+ yarn -v
+ ~~~~
    + CategoryInfo          : ObjectNotFound: (yarn:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException
```

```shell:bash
$ yarn -v
bash: yarn: command not found
```

その後、npmでyarnをインストール。
バージョンを確認してみると、無事インストールが確認できます！やったね！！

```shell:bash
$ npm i -g yarn

> yarn@1.22.10 preinstall C:\Program Files (x86)\Nodist\bin\node_modules\yarn
> :; (node ./preinstall.js > /dev/null 2>&1 || true)

C:\Program Files (x86)\Nodist\bin\yarn -> C:\Program Files (x86)\Nodist\bin\node_modules\yarn\bin\yarn.js
C:\Program Files (x86)\Nodist\bin\yarnpkg -> C:\Program Files (x86)\Nodist\bin\node_modules\yarn\bin\yarn.js
+ yarn@1.22.10
updated 1 package in 1.19s

# インストールされたか確認
$ yarn -v
1.22.10
```


# 原因は何なのか
　分かりません、全くわかりません(誰か教えて:confounded:)

想像ですが、`msys`が絡んでそうかなーって思ってます。gitbashってchmodとか一部のコマンドが使えないんですよね。いや、それは関係ないか？いやあるのか？？:thinking:
兎に角、bashが使えるからといってUnix/Linux環境と同じ事ができる訳ではないって所にヒントがありそう。というのも、タイトルにもあるコマンドってUnix/Linux環境だと正しく動作するらしいんですよね。


# 後書き
　もう二度と同じ失敗はしたくない、そして誰も二の舞になって欲しくないです。この記事が誰かのお役にたてば幸いです。
　余談ですが、Windowsだと[chocolatey](https://chocolatey.org/)[^50]なるパッケージマネージャがあるらしく、それでyarnを入れるとか入れないとか[^53]。。。
どれくらいメジャーか分からないのですが、ちょっと使って見ようかしら:thinking:


# 参考
１．[Nodist で yarn 使うときのパス](https://let.blog.jp/article/15821286)


[^qt]: 
[^01]: この記事を書いている時
[^07]: ちなみに2回目のやらかしです、ごめんよ:sob:
[^50]: チョコレートがアイコンでした、何それ美味しそう:chocolate_bar:
[^53]: 自動翻訳っぽいサイトに載ってました(https://qastack.jp/programming/49689174/how-to-upgrade-yarn-version-using-terminal )、元記事どこ？？
SQLでテーブルにデータ挿入がうまくいかない時

テーブルを作成して、実行すると以下のエラーが発生してしまいました。

エラー内容

>SQLSTATE[22003]: Numeric value out of range: 1264 Out of range value for column 'phone_number'
(phone_numbeカラムに入ってる値が指定してる範囲を超えています)


phone_numberのカラムタイプに ”integer” を指定していて、それが原因でした。


$table->integer(‘phone_number');


”integer(INT)” には、最小値〜最大値まで決められた数値があり、それがこちらです。


![(ENEEU).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674912/a2af288d-21e4-6915-115d-6c4ba01ae822.png)


INTの部分を見てみると、最小値が２〜最大値が８までとなっています。






私は、phone_numbeのカラムに “08022339999” と指定していて、最大値の８を超えた９を入れてしまっていました。
そのため、エラーが発生してしまったのです。


カラムタイプをbigintに変更すれば解決です。



参考記事
https://dev.mysql.com/doc/refman/5.6/ja/integer-types.html
FileMakerとChatwork

今更ながら備忘録として、chatworkとFileMakerをつなぐ話。

https://developer.chatwork.com/ja/endpoints.html

大体のことは、エンドポイント見てたら出来る。
URLにcURLオプション付けてURLから挿入。
↑FileMaker16くらいから追加。それ以下のバージョンは正直分からん...

---

/meを例に

curl -X GET -H "X-ChatWorkToken: 自分のAPIトークン" "https://api.chatwork.com/v2/me"

と書かれているので、この通りにURLから挿入する。

---

変数を設定[$APItoken ; 値:自分のAPIトークン ] 

変数を設定[$URL ; 値:"https://api.chatwork.com/v2/me" ] 

変数を設定[cURL ; 値:"-X GET -H \"X-ChatWorkToken:" & $APItoken ] 
エスケープする事が大事。Windowsなら半角￥

URLから挿入[選択;ダイアログあり:オフ;ターゲット;$$Response
$URL;cURL　オプション:$cURL]

一応動きを確認するためにグローバル変数にしていますが。その時に応じて変えてください。

---

出した結果を見ると、
"name":"\u7af9\u5185 \u62d3\u4e5f"
名前が正常に出てないよ。って方。
JSONFormatElements ( $$Response )
でしっかりと出るようになるのでご注意を。

---

簡単にまとめた備忘録。
エスケープとか、カールオプション色んなものに応用がきくので忘れないように。
これからも頑張れ自分！
TypescriptでWebpackは使ってないがパス解決はしたい

フロントエンドの開発ではなくTypescriptを書いててWebpack使ってない時に、パス解決の方法がわからなかったので調べてみました。
結果、`module-alias` というライブラリがさくっと導入できて便利です。

```
yarn add module-alias
```
```
// Typescriptのエントリポイントの先頭にこう書く
import 'module-alias/register'
// こういうのがコンパイル後のファイルでも解決できる
import Hoge from "@/hoge";
```

これだけです！
Herokuで作成したWebサイトにGoogleSearchConsoleを適用する

備忘録として記録しておきます。
# 環境
- Python3.6.5
- Mac OS

# 概要
Herokuでサイトを立ち上げ、お名前ドットコムで独自ドメインを取得。
GoogleSearchConsoleでDNSを用いて登録するためには、Heroku側のPointDNSで変更する必要がある。
（当たり前）
mysql　プリペアドステートメント

プリペアドステートメントとは？？

>sqlのコードをわかりやすくしたテンプレートのようなものです。



書き方
// SQL文の作成
```$stmt = $mysqli->prepare("INSERT INTO nekosan (
	name, price, better_before, modify_datetime, create_datetime
) VALUES (
	?, ?, ?, ?, ?
)");
```// パラメータを設定
```$stmt->bind_param( 'sisss', $name, $price, $better_before, $date,
$date);```
// 実行
```$res = $stmt->execute();
$stmt->close();
```



![name, price, better_before.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674912/2e40f068-e243-3216-e187-6bc807f58724.png)


‘sis’とは、$nameや＄priceのデータ型を意味しています。


$nameはstring   「s」

$priceはinteger 「i」

$better_beforeはstring 「s」




?（ハテナ）には、bind_paramで指定したデータが入ってきます。



参考記事; https://gray-code.com/php/prepared-statement-by-mysqli/
Bootstrap4 ハンバーガーメニューの色変更

#CSSで設定する
##1.ハンバーガーメニューの３本線の色を変更する
rgbaのところいじってやる`rgba(255,255,255,1)`

```
.navbar-toggler .navbar-toggler-icon {
  background-image: url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 32 32' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255,255,255,1)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 8h24M4 16h24M4 24h24'/%3E%3C/svg%3E");
}

```
##2.ハンバーガーメニューの背景色を変更する

```
.navbar-toggler{
  background-color: #000000;
}
```

##3.ハンバーガーメニューの枠線を変更する
```
.navbar-toggler{
  border-color: #ffffff;
}
```
Javascriptでbase64エンコード化されたExcelファイルをダウンロードする

#やりたいこと
これもタイトル通りなのですが、仕事の要件的にSOAPでサーバーサイドプログラムを使用せずにJavascriptだけで[base64binary](https://docs.microsoft.com/ja-jp/exchange/client-developer/web-service-reference/base64binary)をブラウザでダウンロードさせるというものがあり、苦戦したので自分メモとして書いときます。


##ソースからの解説
atobでASCIIからBinaryへ変換し、それを1文字ずつUnicodeの数値に変換し、その数字を配列化します。
この配列をBlobコンストラクタに入れてtypeをExcelの形式で指定します。
このBlobをcreateObjectURLでブラウザのメモリに展開してaタグを作成し、強制的にクリックしたことにしてダウンロードさせます。

```javascript:sample.js
var filename = 'something';
var binary = 'バイナリ文字列ーーーUEsDBBQACAgIABp2QlEAAAAAAAAAAAAAAAALAAAAX3JlbHMvLnJlbHOtksFqwzAMhl/F6N447WCM
UbeXMuhtjO4BNFtJTGLL2NqWvf3MLltLChvsKCRDQANAGgDAAAYBAEAAAA=ーーー的な';
binary = atob(binary);
var decoded_array = new Uint8Array(Array.prototype.map.call(binary, c => c.charCodeAt()));
var decoded = new Blob([decoded_array], {type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"});
var url = window.URL.createObjectURL(decoded);
var a = document.createElement("a");
a.href = url;
a.download = filename + ".xlsx";
a.click();
window.URL.revokeObjectURL(url);
```

#大変参考にさせていただきました
[Blob, ArrayBuffer, Uint8Array, DataURI の変換](http://var.blog.jp/archives/62330155.html)
[JavaScriptでBase64エンコード・デコード（UTF-8も）](https://qiita.com/i15fujimura1s/items/6fa5d16b1e53f04f3b06)
RPAツール「アシロボ」最新レビュー／実際の評判はいかに

#RPAツールの中でも低価格で実装できる「アシロボ」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698158/841d420a-57bb-0cdc-f800-0d18c26b5ef3.png)

そもそもRPAツール自体が、PCに不慣れたユーザーや初心者にはとっつきにくいイメージを抱かれているように思えます。
業務自動化という言葉だけが先行して、トップダウンでいれたはいいものの、実際は使われないというケースもあるのではないでしょうか。

私自身もそこまでRPAに対しての知識はあるとはいえないのですが、使えると非常に便利なツールだと最近感じるようになりました。
いくつかRPAツールを試してみたのですが、そんな中今回は「アシロボ」を使用してみましたのでご紹介を。

#そもそもRPAとは
RPAは、「Robotic Process Automation」ロボティック・プロセス・オートメーションの略語。
簡単に言うと、パソコン操作を自動化してくれるツール/ソフトウエアです。
どういう操作を自動化するかといいますと、データを集計してメールで報告するなど、日々行ってる業務の中でも、
手順やルールが決まっていて、いわばルーチンになっている業務をロボットが代わりに行ってくれるというものです。

人によって左右されない、思考や判断を伴わない業務はロボットに任せて、
人間しかできない業務に専念しようというわけですね。

#RPA使用に至った経緯
クライアントへの請求書発行業務に経理部が毎月多くのリソースを割かれていました。
CRMはいれているのですが、数多くのクライアントを抱えると、
CRMに登録する作業自体に多くの時間を要します。
ルーチン業務なので、アルバイトなど人を増やすことも考えました。

ただ、CRM自体はこのまま継続、会社としては業績を拡大を当然目標としているので、
人を増やすことで対応していくというよりも、RPAをいれることで将来的なリソースコスト軽減に対して
RPAツールの活用を決定しました。

#ツールの選定
限定的な使い方だったのもあり、スモールスタートが可能であること
アルバイトいれる前提だったので、月々の人件費をみて、だいたいこれくらいなら、、、と
結構ざっくりなんですが予算も決めました、

選定に際しては、3つほどデモツールが用意されているRPAツールにまず絞り、実際何個かは試しました。
何が優れているのかの判断は正直難しかったんですが、
顧客情報を扱う業務でもあったのもあり、
セキュリティリスクをふまえインストール型であるアシロボを選定しました。
アルバイト1人雇うくらいの予算感でみてたんですが、予算面も問題なくクリア。
あとは実際に使う人が経理の人間なのでそこがクリアできるかどうか。

#実際使ってみて
デモから試してみたのですが、営業担当の方がついてくれたので、導入は比較的スムーズでした。
(わざわざ担当が説明してくれるとは思わなかった)

##シナリオ作成
メモ帳を起動させるためのシナリオを作成してみます
※ログインは割愛で

###まずは新規をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698158/5bd5c893-2b4e-1fcc-4ba3-eefdb1758cfb.png)


###メモ帳起動と入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698158/22954ccf-9cdf-acb8-d94a-5a2100c0169f.png)

###シナリオ編集画面に
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698158/57210d95-5467-6fa5-f213-7542d85ac29b.png)

###編集を選択したらアプリの起動に
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698158/b9c821a6-00e4-bd18-74fd-15ac904930bf.png)


### アプリの起動が表示される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698158/9f1b9deb-7c3d-3561-f512-613cb90021c6.png)

### 実行パスをクリックして起動したいアプリのコマンドを入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698158/983b3120-5ea2-1ebf-2826-16bfe13cda98.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698158/ebad27fb-9ef9-a9ee-4ae0-742100206f95.png)

### あとは保存して実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698158/9a296a43-fc6f-d702-1d49-b02130a5cdd1.png)
  
### 実際見てみる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698158/57f4c6f0-dfc4-6fa3-ea2b-7eeb501d92b8.png)

メモ帳が起動してました

#実際の評判は？
プログラムを書くという作業が一切ないので、経理の人も比較的スムーズに導入ができました。
実際の運用の幅も広がりそうで今では他部署でも検討が進んでます。
システム化しても結局は人の手がかかる部分だったのですが、
人件費を想定して設定した当初の予算に対しても、問題なくクリアできたのかなーと思います。

あと結構いじると面白いです(笑)
複雑ながらもルーチン業務になっている業務などいろいろチャレンジしてみようかな

■アシロボ
https://assirobo.com/
【xampp+LibXL】libxlをxamppに導入

自分用のメモとして残します。
LibxlのLinuxへのインストールはそこそこありましたが、
Win環境＋xamppへのインストール方法があまりにも少なすぎるため、メモ程度ですが残します。

#■やり方
##1. php_excel.dllインストール
####ダウンロード
下記サイトから対応するPHPのバージョンのビルドをダウンロードする。
https://www.apachelounge.com/viewtopic.php?t=6359
####php_excel.dll設置
解凍して以下のファイルをxamppに設置
`\ext\php_excel.dll`を**\xampp\php\ext直下**に設置。

##2. libxl.dllインストール
####ダウンロード
下記サイトからLibXLをダウンロードする。
https://www.libxl.com/download.html
####libxl.dll設置
解凍して以下のファイルをxamppに設置(2か所)
`\libxl-3.9.2.1\bin\libxl.dll`を**\xampp\apache\bin直下**に設置。
`\libxl-3.9.2.1\bin\libxl.dll`を**\xampp\php直下**に設置。

##3. php.ini変更
下記をphp.iniに追記。
トライアルで使う場合は、license_name、license_keyは無くてもOK。

```php.ini
[excel]
extension=php_excel.dll
excel.license_name=""
excel.license_key=""
```

以上


#■さいごに
導入後の動作はぼちぼちググれば出てくるので、そちらを参考してください。。
また、今回はwindows上のxamppへのLibxl導入になります。
そのため、当該記事と同環境の場合はwindows用のライセンスでないとライセンスの認証が通らないようになっているため、製品版をwindowsで使用する場合はLinux用のライセンスでなく、win用のLibxlライセンスを取得して動作確認をしましょう。
wslでopen



# イントロ

wslでもmacみたくopenを使いたい．


# 実装(bash)

bashでのopenです．.bashrcに追加して読み込むようにしています．

```bash
open() {
    local browser='/mnt/c/Program Files (x86)/Microsoft/Edge/Application/msedge.exe'
    for arg; do
	if [ -e "${arg}" ]; then
	    readlink -f ${arg} |xargs wslpath -w |powershell.exe start
	elif [[ ${arg} =~ http ]]; then
	    echo "${arg}" | xargs "${browser}" 
	fi
    done
    }
```

-   参考
    -   [WSL から open](https://qiita.com/aohmusi/items/a46e3267ab506cedd1ad)
    -   [WSLにもそこそこ使えるopenが欲しい！](https://qiita.com/ahuglajbclajep/items/7e72acd689c7b302795a)
    -   [WSL から open でウェブサーフィン](https://qiita.com/aohmusi/items/3651a84a63551ae36ff1)


# 実装(ruby)

rubyでの実装です．ほんとうはfishのfunctionにしたかったのですが，あんまり情報なくて．しかたがないので，~/bin/openとして置いて，これをfishのPATHに入れてうごかしています．openというのがubuntuの/sbinにあるようですが，それとは違うようです．

```ruby
#!/usr/bin/env ruby
require 'open3'

target = ARGV[0] || '.'
case 
when target == '.'
  out, err, status = Open3.capture3("explorer.exe .")
when target.match(/^http/)
  system "cmd.exe /c start #{target}"
else
  puts "no command for #{target}"
end
```


# 追記

-   同じ用途に，xdg-open がUbuntuでは使えるらしい．

wslで確認が必要．



------
 - **source** ~/git_hub/ruby_docs/multi_scale_22_text/excludes/semi_lattice_20f/open_script_onWSL/wsl_open.org
~JavaScript~残り何日？をやりたくて

#はじめに
Todoリストを作成中に``残り何日？``という期限をつけたくてそれの表示のために
``new Date()``を使って、今日の日付から残り何日かを表示させたかった。

#コード
```javascript
getLimit(limit) {// 2020/10/05
      const d = new Date()
      const nowDate = new Date(d.getFullYear(), d.getMonth(), d.getDate())//今の日付
      const year = Number(limit.slice(0, 4))
      const month = Number(limit.slice(5, 7)) - 1
      const date = Number(limit.slice(8, 10))
      const limitDate = new Date(year, month, date)//期限日
      const day = 1000 * 60 * 60 * 24//一日のミリ秒の値
      return (limitDate - nowDate) / day
    },
```

``引数のlimit``には``2020/10/05``というよな形で期限の日が入ります。
``const month``で``-1``しているのは引数として取った時に既に``+1``された値が入ってくるため
``limitDate - nowDate``で日数分のミリ秒がでるのでそれを``day``で割ると結果がでる。
LAMMPS コマンドのメモ（自分用）

#概要
LAMMPS用のコマンドをまとめておきます。完全に自分用ですが、誰かの役に立つかもしれないので一応公開しておきます。
https://lammps.sandia.gov/doc/Manual.html ←基本はここから、自分の役に立ったことについて日本語でメモをしていきます。
間違いなどありましたら、ご指摘いただけると非常に助かります。

## リスタートファイルを作りたい
restartとwrite_restartは違うので注意
### write_restart
```
write_restart filename.rst
```
コマンドが実行された時点での状態を保存する。`run`の後とかにおいておくと良い。
基本的に計算後の状態の保存に使う。
### restart
```
restart N filename1.rst filename2.rst
```
Nステップごとにfilename1.rstとfilename2.rstが交互に更新されていく。
計算中の状態の保存に使える。

## リスタートファイルからデータファイルを作りたい
例えば、`hoge.rst`から`hoge.data`を作りたいときコマンドラインで以下を打ち込む。（わざわざ`.in`を作らないで良い）

```
lmp_serial -r2data hoge.rst hoge.data
```
SPSS Modeler Clientのゴミ掃除Tips

SPSS Modeler Clientを使用していて、気が付いたらPCのディスクの空き容量がとても少なくなっていることがたまにあります。

これまでの経験上、大きなファイルがごみとして残っている可能性がありそうなのは、主に2ヵ所です。
下記を参考に掃除してみてください。

##SPSS Modeler Clientのハングが原因の場合
`C:\ProgramData`の下をチェックしてみましょう。

ハングした場合に、core, javacore, heapdumpなどの大きなファイルが作成されていることがあります。

サポートに問い合わせする時は必要かもしれませんが、自分ではこのファイルは使わないので、不要なら削除するとディスクスペースを確保できます。

##キャッシュファイルが原因の場合
`C:\Users\ユーザー名\AppData\Local\Temp`の下をチェックしてみましょう。

ストリーム内でキャッシュを設定していると、キャッシュで使用したファイルがたまにごみとして残ることがあります。
ストリーム作業中に削除してしまうと大事なキャッシュファイルが削除されてしまう可能性もあるので、SPSS Modeler Clientを落とした後にファイルを削除することをお勧めします。
検証ツールにて擬似要素を確認する方法

## ■ はじめに

検証ツールにて擬似要素を確認する方法について記事にしました。
この記事で得られることは以下の通りです。

・検証ツールで確認する際の基礎知識が増える
・サイト模写等で、擬似要素を確認する際の方法が理解できる様になる

## ■ 例

例えばこのボタンに、マウスを置いた際のエフェクトを調べる時。

![ボタンホバー.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/772631/b7bc43e0-6dd1-cef2-abd1-96c01bcc2d83.gif)

## ■ 方法①

**① 調べたい要素の左にある「･･･」をクリックする**

![スクリーンショット 2020-10-12 10.54.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/772631/7d251257-64be-2ebd-8cfc-fa1028b5c43c.png)

**② 「Force state」を選択し、今回はマウスを置いた時の動きを調べたいので、「:hover」をクリックする**

![スクリーンショット 2020-10-12 10.59.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/772631/d050c50d-3147-d6c9-b57e-468d76cd3931.png)

クリックすると、「･･･」が黄色い丸印に変わり、a要素にマウスを乗せた際のCSSが表示される様になります。

![スクリーンショット 2020-10-12 11.08.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/772631/35458efd-6e38-e448-4de1-caa899bef920.png)

## ■ 方法②

もう一つ、方法がありますのでご紹介します。

![スクリーンショット 2020-10-12 11.13.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/772631/cffc9ec6-6185-78fb-9b72-ea1d95c00e9d.png)

**① 調べたい要素の左にある「･･･」をクリックする**

**② 「:hov」をクリックする**

**③ 「:hover」にチェックを入れる**

こちらでも擬似要素を表示させることができます。
この方が、一度の操作で複数の要素をまとめて選択できるので、便利かもしれませんね。
タイトルの横に線を引くCSS

メモ。

```
.title-border {
    display: flex;
    align-items: center;
}
.title-border:before,
.title-border:after {
    border-top: 1px solid;
    content: "";
    flex-grow: 1;
}
.title-border:before {
    margin-right: 1rem;
}
.title-border:after {
    margin-left: 1rem;
}
```