OmniAICreator/Qiita-1.07M huggingface dataset:
allメソッドって良くないの？って話

こんにちは。たにーです。

今回は、チーム開発で少し議論した

「アクション内でのでのallは良くない？」についてです。

```items_controller.rb  
 @items_all = Item.all
```

#結論

結論から言うと、悪いことはないが
場面によっては使い方を考えなくてはいけないということです。

カリキュラムで作成したアプリでは、
レコード数がmax10個ぐらいで試していたこともあり、取り出すデータ量が少ないため問題なかった。

もし、その数が100個、1000個、１万個あった場合だと、
情報量が多すぎて、処理速度が遅くなり、ページのロードが遅いなどが起きるかもしれません。

なので、その処理速度をより早くする書き方をご紹介します。

#状況について

- railsでwebアプリケーションを開発中。
- 販売している商品数をviewに表示させたい。<br>
例:( 商品一覧(全:〇〇件) )
- viewとcontrollerには下記のように書いていた。


```rb:index.html.erb
    <div class="col-sm-12 px-sm-0">
      <h2>商品一覧(全<%= @items_all.count %>件)</h2>
    </div>
```

```rb:items_controller.erb

  class Public::ItemsController < ApplicationController
  def index
    @items_all = Item.all
  end

```

#実際にターミナルを見て確認します。

まずは、そのままでページを開いてみます。
そうすると、、、、、

```terminal:(item.allの場合)
 Started GET "/" for 106.180.147.162 at 2021-03-25 11:43:45 +0000
 Cannot render console from 106.180.147.162! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255
 Processing by Public::HomesController#top as HTML
   Rendering public/items/index.html.erb within layouts/application
   (0.2ms)  SELECT COUNT(*) FROM "items"
  ↳ app/views/public/items/index.html.erb:4
```

見て欲しいところはここです。

```terminal:(item.allの場合)
   (0.2ms)  SELECT COUNT(*) FROM "items"
  ↳ app/views/public/items/index.html.erb:4
```

(0.2ms)、と書いてあります。

**この数値が低ければ低いほど応答速度が速い（タイムラグが少ない）と言われています。**

もしかしたら、不要なデータを取得してきているから
0.2なのか？書き方でより少なくできるのでは？と気になったところでチームメンバーで解決策を探しました。

#実際に調べて試しました

###selectで試した


```rb:items_controller.erb
  def index
    @items_all = Item.select(:id)
  end
```

```terminal:(Item.selectの場合)
Started GET "/items" for 106.180.147.162 at 2021-03-25 12:13:24 +0000
Cannot render console from 106.180.147.162! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255
Processing by Public::ItemsController#index as HTML
  Rendering public/items/index.html.erb within layouts/application
   (0.1ms)  SELECT COUNT("items"."id") FROM "items"
  ↳ app/views/public/items/index.html.erb:4
```

**それでも0.2msで早くなっているのがわかります。**

###countで試した

```rb:items_controller.erb
class Public::ItemsController < ApplicationController
  def index
    @items_all = Item.count
  end
```

```terminal:(Item.count)
Started GET "/items" for 106.180.147.162 at 2021-03-25 12:22:09 +0000
Cannot render console from 106.180.147.162! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255
Processing by Public::ItemsController#index as HTML
   (0.1ms)  SELECT COUNT(*) FROM "items"
 ```

**こちらも、0.1msと早くなってるのかな？**

#結果としては、

| メソッド | 応答速度 |
|:-:|:-:|
|  all | 0.2ms  |
|  select |  0.1ms |
|  count |  0.1ms |

もし、違った方法、間違っているなどあれば教えていただけますと幸いです。

以上、たにーでした。

#参考文献

https://pikawaka.com/rails/select
PowerQueryでフォルダからデータの取得をした場合にヘルパークエリの生成を回避する（Excel/csv）

#フォルダからデータ接続　便利！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1120006/ae23ea4b-7ac8-bb62-3afb-860332f7957b.png)


たとえば、フォルダ内の複数ファイルを連結したり
たどえば、フォルダ内の一番新しいファイルを読み取るようにしたり…

かなり利用頻度は高いのですが、

◆取り込みたいフォルダを選んで（必要なら読みたいファイルだけを絞り込んで）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1120006/e2a8bef7-282a-ee39-bf09-80f35b83d987.png)

◆CONTENTの「↓↓」を押して
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1120006/2ef35a85-e890-19ed-b08d-6bafac38bede.png)

◆（Excelの時のみ）読み込みたいシートを選ぶと…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1120006/87d6e8df-193a-7a61-3f9b-38e710b5f8f8.png)
##ヘルパークエリめっちゃできるやん！

データは結合できるんですが、インポートするファイルの種類ごとにどんどんヘルパークエリが（しかも３つも！）生成されてしまって処理が分かりにくくなってしまうのが不満でした。
何種類か元データを使いたいときって、ヘルパークエリばっかりどんどん増えちゃうし。
　（Excelって、複数シートにデータが入ってて、それぞれくっつけたかったりするので）

# M関数で回避するよ（Excel版）

1.フォルダからデータ取得するため、フォルダを指定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1120006/854690ab-a988-722c-65de-19bf04e22aa4.png)


2．列の追加タブからカスタム列を追加を選択し、以下の式を入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1120006/4ac68a65-3c0c-3a3a-3582-763e4cc5d90f.png)

    Excel.Workbook([Content],true){[Item="Sheet1",Kind="Sheet"]}[Data]

　-Item=”Sheet1”部分：読み込む任意のシート名を記載
　‐Excel.Workbook([Content],true)：データ範囲の1行目をタイトルとして扱う場合
　 Excel.Workbook([Content])：データ範囲の1行目からデータとして扱う場合

3．ファイルのプロパティ部分を、いる列だけにする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1120006/ac8d846c-6f54-5faa-5692-d654b3b7341e.png)
　※今回はファイル名だけ残してみましたが、最終更新日時なんかを残すのも利用用途が多そうです。

4．展開する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1120006/48d3728b-19b2-add1-2bb7-6927d02b380e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1120006/b1ce0d5e-29e0-715f-dd87-681c18db3a0a.png)

5．ヘルパークエリなしで結合できた！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1120006/2451ed1f-a6c6-1ef3-214f-806642335a3a.png)

#CSVの場合

2．の部分の式をこちらにさしかえる

    Table.PromoteHeaders(Csv.Document([Content])

　なお、上の式は1行目がヘッダーの場合。
　1行目からデータとして扱いたい場合はPromoteHeadersの文が不要なので以下の式になる

    Csv.Document([Content]
モバイルの注意事項

#目次

[デバイスでの Analytics Cloud の制限](#Android デバイスでの Analytics Cloud の制限)

#デバイスでの Analytics Cloud の制限
###レイアウト
横モードはタブレットでのみサポートされています
###グラフ
コピーやフォーカスなどの複数選択アクションはサポートされていません。
評価グラフはサポートされていません。
###テーブル
集計行は表示されません。
ピボットテーブルはサポートされていません。
サンキーグラフはサポートされていません。

###ウィジェット	
画像ウィジェットでは、.svg ファイルはサポートされていません。
数値ウィジェットの探索はサポートされていません。
###クエリ	
その種類のグラフのサポート範囲を超える数の基準またはグループが追加されると、グラフは比較テーブルになります。
クエリによって返される最大結果数は、その種別によって異なります。たとえば、複数のグルーピングがある集計クエリのデフォルトのクエリ制限は 500 であるため、デフォルトでは最初の 500 件のレコードのみが表示されます。
Apex ステップ (ベータ) は、モバイルではサポートされていません。
###Tableau CRM Studio で設計されたダッシュボード	
Web の Salesforce 組織で設計された Analytics Cloud ダッシュボードは、ローカルデバイスの Analytics Cloud for Android で表示できます。一部のウィジェットはモバイルでは異なって表示されます。
ダッシュボードをモバイル用に最適化するには、ダッシュボードデザイナで携帯端末またはタブレット用のレイアウトを生成します。
余白の色オプションはサポートされていません。

#デバイスのレイアウトの選択におけるルール

ダッシュボードに複数のレイアウトが定義されている場合は、デバイスにダッシュボードを表示するときに Tableau CRM が最適なレイアウトを選択します。Tableau CRM は、各レイアウトに指定されているデバイスプロパティを使用して最適なレイアウトを決定します。

デバイスに使用するレイアウトを決定するとき、Tableau CRM では次のルールが使用されます。


- 複数のレイアウトが使用可能な場合は、最も多くのデバイスプロパティが設定されているレイアウトが使用されます。
- デバイスプロパティの設定数が同じレイアウトがある場合は、最後に定義されたレイアウトが使用されます。
- デバイスで使用できるレイアウトがない場合、最初に定義されたレイアウトが使用されます。

#参考文献
[iPhone® および iPad® での Analytics Cloud の制限](https://dreamevent.secure.force.com/articleView?id=bi_mobile_limits_android_help.htm&type=0)

[デバイスのレイアウトの選択におけるルール
](https://dreamevent.secure.force.com/articleView?id=sf.bi_dashboard_layout_rules.htm&type=5)
【Rails＆heroku】MySQLで出来てた「あいまい検索」がPostgreSQLで出来ない場合にやること

AWSでコード完成、いざherokuへデプロイ！･･･したけどエラー。
調べてみると、あいまい検索の部分がおかしいらしい。

####【ページ内リンク】
[０．環境](#０環境)
[１．ソースコード](#１ソースコード)
[２．そもそもあいまい検索部分が原因だと分かった経緯](#２そもそもあいまい検索部分が原因だと分かった経緯)
[３．解決策](#３解決策)

#０．環境
・AWS
・heroku/7.48.0 linux-x64 node-v12.16.2
・Rails 5.2.4.5
・ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-linux]
・MySQL 5.7.31
・PostgreSQL 9.2.24

#１．ソースコード
```rb:Example.rb
@teams = Team.where("#{key} like ?", "%#{value}%")
```
・いたって普通のあいまい検索。`key`がキー、`value`が値。
【例：`key = "id"`、`value = "(検索用に入力した値)"】
・MySQLだと上手くいったのに、PostgreSQLだとエラーが生じた。

※ちなみに、下記に2通り完全一致検索方法を書いたが、**方法１**はどちらでも作動し、**方法２**は`PostgreSQL`では作動しなかった。

```rb:Example2.rb
@teams = Team.where("#{key} = #{value}")   #方法１
@teams = Team.where("#{key} like ?", "#{value}")   #方法２
```
たぶん「`like`」が悪そう。

[ページ内リンクへ戻る](#ページ内リンク)


#２．そもそもあいまい検索部分が原因だと分かった経緯

```
$ heroku logs -t
```
`heroku logs --tail`の略。これを打てば、どこでエラーが出たか一発で分かる。

[ページ内リンクへ戻る](#ページ内リンク)


#３．解決策
調べてみると、`key`と`value`の型が違うのが原因らしい。

```rb:Example.rb
@teams = Team.where("cast(#{key} as text) like ?", "%#{value}%")
```
**PostgreSQL**なら、これで良い。`cast`、RubyやRailsというよりSQL寄り？
でも**MySQL**だとこれは**エラー**となった。絶対何か他にいい方法あるよなぁ。


[ページ内リンクへ戻る](#ページ内リンク)
THE文系の俺が機械学習コース無職転生 ~Part５ KPTを変えていこう！~

# 読者対象者
最近プロジェクトのリーダーになった方とか、オンラインになってKPTが少し停滞気味だなーと思っている方など！是非ご覧下さい！


# KPTってそもそも何？？
まず、下記に引用させていただいたのを記載します。

行ってきた仕事や活動を振り返る際に、「継続」「問題点」「挑戦」の3つの視点で整理するフレームワークのこと。
アジャイル開発や反復型開発ではイテレーション（繰り返しの単位）ごとに作業の振り返りが推奨されるが、そのためのチーム反省会などでよく用いられるフォーマットである。ミーティングでは、ホワイトボードなどに「K：keep＝今後も続けること」「P：problem＝問題なので、やめること」「T：try＝今後、試してみたいこと」の項目を用意し、メンバーが行ってきた活動報告の内容を「K」と「P」に振り分けていく。その後、「P」に対する解決策や新しいアイデアや企画を「T」欄に書く。もちろん、個人的な仕事の振り返りについても利用できる。

https://www.itmedia.co.jp/im/articles/0905/19/news143.html


今私はスクール通いながら２日に１回位行っておりますが、少し形骸化しているなと個人的には思っております(;_;)

# 記事を書こうと思ったきっかけ

先日こちらのセミナ＝に参加させて頂き、KPTの話があったため、共有させていただきました〜。

![スクリーンショット 2021-03-23 21.00.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1031281/c2cb5c2a-1de9-05dd-f86f-86db19493413.png)

それではどうぞ！ご覧ください！


# KPT時の空気が・・・微妙なんですが・・・
まずこの質問から始まり、下記の流れで講演者の方が様々回答されていらっしゃいました。


## ①目的を共有する

### 何を目的としてKPTを行うか共通認識を持つ

まず「KPT」って何？っていうのを説明されていることも少ないですし、あと正直説明されたの忘れてますよね！

説明されたのが昔過ぎて笑(watashioboetemasenn)

なので、なんとなくやり続けるのではなく、その回ごとに変えてもいいから、

**「ちゃんと何の為にやるかを共有する」**

ことが大切だそうです。

アタリマエのことですけど、部活の練習だって、大学の受験だって、「何のため」にやるのかは定めてやらないと後悔しますよね。モチベ下がりますし。(ちょっと思い出しちゃいますね・・・)

なので、

- 報告会にするのか
- チームについて話すのか
- 今日あったことなのか

しっかり共有してから行っていきましょう！

## ②場の空気を変えにいく
今はオンラインも多いので、少し難しいかもしれませんが、様々アイディアはひねり出そうと思えばありますよね！
例えば・・・
### 差し入れする
- オフラインだったら甘い食べ物とコーヒーを持ってくる

甘いの食べながら、コーヒー飲みながら、怖い顔は出来ません！！！(゜∀。)ﾜﾋｬﾋｬﾋｬﾋｬﾋｬﾋｬ

### やり方を変えてみる
同じこと繰り返してると流石に人間は飽きます。なので・・・

- 絵を使って表現させる
- 無言のままやらせる(面白そう！！！笑)

下記のサイトも参考になるそうなので、是非御覧ください！

### 参考サイト

https://qiita.com/viva_tweet_x/items/cc3bad3bd298406b6cc7

https://qiita.com/viva_tweet_x/items/4249d32931007dde1851

# 結論
KPTでも、KPTらしいものでも、やっていて何か「うっくつ」しているものを抱えている方は是非チャレンジしてみて下さい！
もし、何か変化などありましたら、コメントお待ちしてます〜。また、すこしでも為になったら「いいね」ボタンお待ちしてます(*^^*)

では！！
【Mac】誰でもできる！JIS→US配列に変更する方法【karabiner】

初めまして、今回はJIS配列で買ったMacBookをUS配列へ誰でも簡単にできる方法を紹介します。


今回は、以下の2つの設定方法を紹介します。
1. Mac標準の設定にしたがう方法（とても簡単）
2. 自分で多少細かい設定をする方法(karabinerというアプリを使う)

# 1,Macの環境設定で行う

まず、前提として以下のボタンが出ていればそれで簡単に設定できます。
**システム環境設定　→　キーボード　→　キーボードの種類の変更**

![スクリーンショット 2021-03-25 19.08.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/759659/97b79501-db39-defa-eabc-fcd15611f076.png)

しかし、この項目は今まで外部キーボードをつなげたことがない人には出てきません。

後述のkarabinerを使えば、変更できるのですが、お試しでUS配列を試してみる場合とかだとアプリをダウンロードしたくない人もいるかもしれません。

そういう人には、以下の手順で簡単に設定できます。

**システム環境設定　→　キーボード　→　入力ソース　→　「+」で新規追加　→　英語で「イギリス」を選択**

![スクリーンショット 2021-03-25 19.15.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/759659/f158ef8e-b8c7-7bcd-ab16-5317cb7bd0ea.png)

![スクリーンショット 2021-03-25 19.16.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/759659/8c2b7155-6ed3-4d30-2956-fb5583cafa12.png)

※英語の選択欄は実際の並び順だと下の方から選択します。

これだけです。このイギリスの入力ソースがほぼUS配列に近しいものになります。
あとは入力する際にこの「イギリス」入力ソースを選択すればオッケーです。
軽く触ってみたい人はこの方法で試してみてください。


# 2,karabinerを使って細かく設定

以下よりダウンロードを行ってください
https://karabiner-elements.pqrs.org/

そして、「karabiner-elements」というアプリを開きます
（初めはプライバシーの設定がいると思うので解除してください）

その際に以下のような画面が出てきます

![スクリーンショット 2021-03-25 20.35.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/759659/97b3879f-1cb8-d5f5-afeb-66982028558d.png)

そこから更に進むと、以下のような画面が出てくるので、「ANSI（米国その他）」を選びます。


![スクリーンショット 2021-03-25 20.36.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/759659/2beda1fd-06db-9380-9746-17e979dcdca7.png)


これで、先程と同等レベルの設定が可能です。

ただし、このままだといくつか問題があります。
最重要なものでいえば"~(チルダ)"や"`（バッククオート）"を入力するキーがないのです。
あと、「英数変換」や「かな変換」キーのせいでまだUS配列とは多少違う部分があります。
（JISとUSではキーの並びや数がそもそも違うから）

解決するために、karabiner-elementsで詳細設定を行います。
「Add rule」でルールを追加します。

![スクリーンショット 2021-03-25 20.41.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/759659/fd64369e-f5b1-ca2e-3c6b-eb7420515e51.png)

ルールをインターネットよりダウンロードしてきます。
（https://ke-complex-modifications.pqrs.org/）
![スクリーンショット 2021-03-25 20.46.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/759659/393b85d0-99c3-c09d-9adc-c6213dc5800c.png)

検索フォームで「japanese」と検索したあと、「For Japanese(日本語環境向けの設定)(rev6)」をインポートします。

![スクリーンショット 2021-03-25 20.49.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/759659/19d6d8b9-69aa-bbac-5004-78241ddc5a1a.png)

インポートが完了したら、再びkarabiner-elementsのAdd ruleに戻ると「バッククオートとチルダを割り当てる」という項目があるので、「Enable」ボタンを押すとバックスペースの左横がキーとしてあてはまるようになります。

それ以外も一つ一つ適応させることができるので、気になる人は試してみてください。

以上です。わからないことがある人は是非コメントよりお願いします。
サクラエディタでマクロ置換をしてみた（js）

今回使用する言語は、Jscriptという太古のJavaScriptェ...
正規表現を使わず作った。
関数の詳細は調べてください。

```.js

//描画非表示
SetDrawSwitch(0);

//問題点：
//replaceAllでは、なぜかメタ文字を組み合わせるとエラー
//なので正規表現を使わない


//全ての「12」をXに置換
var a = '1';
var b = '2';

replaceAll(a+b,'X',26);


//全ての「field="list[__$(〇〇)__].a」をXに置換
var property = 'list';
var list = [
'a',
'b',
'c'];

for(var i = 0 ; i < list.length ; i++){
	replaceAll('field="'+ property + '[__$(' + list[i]+ ')__].a','X',26);
};


//画面表示
SetDrawSwitch(1);
//再描画
Redraw(0);
```
問題点：
replaceAllでは、なぜかメタ文字を組み合わせるとエラー
なので正規表現を使わなかった。

問題点詳細
replaceAllのオプションで26→30にして正規表現を有効化。
以下のようにエスケープ必要文字(メタ文字)をエスケープ処理しているのになぜか置換されない。（.*等の正規表現は問題なく使える）
`replaceAll(property + '¥{AB¥}','X',30);`
もちろん正規表現を無効で置換すればメタ文字として認識されないが、有効なままエスケープしたい。

**追記**
「¥」ではどうやらエスケープされないようだ。。どうすれば？
**追記**
角括弧で囲めば置換できた。
`replaceAll(property + '[{]AB[}]','X',30);`
注意点：角括弧内の文字どれかにでもマッチすれば置換されてしまうので角括弧内は1文字にする。
これでなぜ置換成功するかと言うと角括弧内ではエスケープ必要文字が減る。
少なくとも￥、[、]、＾はエスケープの必要がある。

**追記**
jsの置換関数の正規表現を使って解決する方法
`''`の代わりに`/〜/g`で囲むと正規表現が有効になり全置換される。
`.replace(/ここのメタ文字は¥でエスケープできる/g, "置換後");`
```サンプル.js
SetDrawSwitch(0);
GoFileTop();

//ヒットしなくなるまで繰り返す
while(true){
    SearchNext('^.*置換対象文字列.*$', 2068); //行単位で検索
    var searchWord =GetselectedString(0); // 選択値取得
    if(searchWord=='')break;

    // 行の指定箇所全てを置換する
    var covertedWord = searchWord.replace(/置換対象文字列/g, '置換後文字列');
    Delete();
    InsText(covertedWord); //挿入
};

SetDrawSwitch(1);
Redraw(0);
```

　　　
置換対象文字列を変数で置き換えたい場合はRegExpを使う。
```RegExp例.js
//定義
var befor = '置換対象文字列'
var after = '置換後文字列'

//検索部分
SearchNext('^.*'+ befor +'.*$', 2068);

//置換処理部分
var covertedWord = searchWord.replace(new RegExp(befor,'g'), after);
```

追記ここまで


---
あと、上記のコードのままだと置換したい単語が300にもなると10秒ほど掛かってしまう。
このマクロを複数ファイルで使用するつもりで使わない単語も書いてしまっている場合、
単語検索してヒットしなかったら次のindexへ移るようにしたらかなり早くなった。

```.js

//描画非表示
SetDrawSwitch(0);

var property = 'list';
var key = [
'n',
'n',
'n',
'n',
'n',
'a',
'a',
'a',
'b',
'n',
'n',
'n',
'n',
'n',
'n',
'n',
'n',
'n',
'c'];

//配列を繰り返す
for(var i = 0 ; i < key.length ; i++){

	//見つからなければ次のindexへの処理
	for(var h = i; h < key.length ; h++){
	SearchNext('list'+key[i], 2099);//第一引数に検索対象、正規表現無効
	var s = GetSelectedString(0);//値取得
	    if(s == ''){//なければnext index...
	    	i++;
	    }else{
	    	break;
	    };
	};

    ////全置換replaceAll（置換対象,置換後,オプション）
    replaceAll(property+key[i],i,26);//正規表現無効
};


//MessageBox();//ポップアップ表示用

//画面表示
SetDrawSwitch(1);
//再描画
Redraw(0);
```

```置換前.
listn
lista
listb
listc
lista
```
```置換後.
0
5
8
18
5
```

説明
画面上の「listn」は早々に全置換され存在しないわけだから
そのあと何回も置換しようとするとそりゃ遅いわけだ。
SearchNextで置換対象文字列がヒットすれば通常通り時間がかかるが
ヒットしなかったらほとんど0秒に近い速度で次のindexへ移る。
300単語追加して10秒かかっていた処理がこれで対象外が省かれた速度になる。
150/300単語が置換される予定なら単純に5秒程度になる。
【EPSON製 レシートプリンター】過剰なロール紙の頭出しをやめさせる方法

**これは「C#によるPOSレジ・サーマルプリンター開発入門」と称して連載している記事の1つです。他は[こちら](https://qiita.com/Automatic9045/items/0c8d05e1aa6255f7bd1c)**

EPSON製のTM-L90型レシートプリンターを何台かヤフオクで購入し使用しているのですが、
その中の1台だけ、電源を入れる度に

**「ピーーーーーーーーーー」**

という機械音と共に、ロール紙を<font color="red">**20cm**</font>ほど吐き出してくる個体がいました。
毎回毎回、起動する度に貴重なロール紙を20cmも無駄遣いしてくるのは、精神衛生上とても良くありません。

じゃあ直そうと思いEPSON Memory Switch Setting Utilityから頭出しの設定を変更してみるも、
**「ピーーーーーーーーーー」**
と無情にも20cmのロール紙を無駄遣いされてしまい……

それ以降はもう諦めていたのですが、
先日全く関係ない調べ物をしていたところ、偶然解決法が見つかったのでここにメモを残しておこうと思います。

## 用紙レイアウトを設定していないことが原因
EPSON Memory Switch Setting Utilityから「プリンタステータス」→「ステータス取得」とボタンを押し、
「用紙レイアウト」タブを確認してみて下さい。
下の画像のように**「用紙の種類：指定なし」**となっているのではないでしょうか。
![用紙レイアウトの設定：変更前](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677302/ec271078-bdc6-4a96-60eb-bc601c442569.png)

過剰な頭出しの原因は、<font color="red">**起動時、自動的に使用しているロール紙がレシート紙なのかラベル紙なのか判別しているから**</font>です。

## 解決法
以下の画像のように、用紙の種類を「指定なし」以外にして「ステータス更新」すればOKです。
![用紙レイアウトの設定：変更後](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677302/4a4168e9-5fdc-7e3d-6b2c-445abeec573c.png)

# 終わりに
この記事以外にもPOS開発関連の記事を投稿しています。もし良ければ[こちら](https://qiita.com/Automatic9045/items/0c8d05e1aa6255f7bd1c)からどうぞ。
JavaScriptの変数定義


Rubyでは定義したい変数名を記述するだけで変数定義が可能だが、JavaScriptでは変数定義の様式は、var、const、letと３つ存在する。

var
--
再定義、再代入可能

```JavaScript
var 変数名 = "値"

変数名 = "再代入する値"
```

const
--
再代入、再定義ともに不可
再代入、再定義を行うとエラーが起こる

```JavaScript
const 変数名 = "値"
```

let
--
再代入は可、再定義は不可
再定義を行うとエラーが起こる

```JavaScript
let 変数名 = "値"

変数名 = "再代入する値"
```

letとconstの使い分け
--
再代入する予定のある変数を定義する際はletを使用する
再定義する予定のない変数を定義する際はconstを使用
LabVIEWを使った時系列解析_季節調整

1. はじめに
時系列解析における季節調整処理を、LabVIEWを使って作成しました。
本記事は、Advanced Python 1 時系列解析 -自己回帰型モデル・状態空間モデル・異常検知- (https://www.kyoritsu-pub.co.jp/bookdetail/9784320125018) を参考にしています。

2. 処理の流れ
参考文献内で季節調整の例として詳解されていた、以下の処理をLabVIEWを使って作成します。
また、サンプルデータについても、参考文献と同様、アイスクリームの家庭平均消費額データを使用します。

 1. 中心化移動平均を求める：T系列の作成
 1. 原系列を中心化移動平均で除した値を求め100倍する：S×I系列の作成
 1. 手順2で求めた値から12カ月ごとの季節指数を求める。当該指数を求めるには、月ごとの平均値を求めた上でその和が1,200になるように調整する：S系列の作成
 1. 原系列を季節指数で割って100を掛け、季節調整済みの値とする：T×I系列の作成

1. プログラムの説明
ダイアグラムは以下のとおりです。
![sa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674241/c2d278db-08a7-4af9-0eea-a16a044282f9.png)

1. 結果
当然のことですが、下記のとおりLabVIEWでも参考文献と同様の結果を得ることができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674241/872048fd-f511-9c47-c32a-07c5ffe88704.png)
Linux ユーザ権限・アクセス権

#ユーザ権限とアクセス権
ファイルの作成者のユーザIDとグループIDがファイルの所有者と所有グループとなる。

##所有者の変更
chownコマンド

**chown ユーザ[.グループ]　ディレクトリorファイル**

ユーザとグループを変更するには、rootユーザである必要がある

##所有グループの変更

**chgrp グループ　ディレクトリorファイル**

#ファイルとアクセス権
ファイルの権限を設定できる３つのユーザ
**①ファイルを所有するユーザ
②ファイル所有グループからファイル所有者を除いたユーザ
③その他のユーザ**

ファイルの３つの権限
**読み(r)、書き(w)、実行(x)**

##アクセス権の変更

**chmod モード　ディレクトリorファイル
chmod　8進法表記モード　ディレクトリorファイル**

*モードの場合*
**u(所有ユーザ)、g(所有グループ)、o(その他のユーザ)に対して、r,w,xを設定したり(=)、加えたり(+)取り消したり(-)**できる。

*8進法表記モードの場合*
**読み(r)=4
書き(w)=2
実行(x)=1**
で表記する。

#パーミッションを指定してファイル作成
umaskコマンド使用で、指定したパーミッションでファイル作成できる

**umask [8進法のモードの値]**

unmaskコマンドに続けて値をしてしなかった場合現在の値を表示できる。
人はなぜダイエットに失敗するのか…

この動画で紹介されている「Set Point Theory」なるものが面白かったので少しまとめてみようと思います。世の中にはたくさん食べても太らない人もいれば、何度ダイエットしてもリバウンドしてしまう人がいるけど、なんでそんな不公平なのかという話。


<iframe width="560" height="315" src="https://www.youtube.com/embed/kNjdcqMaJMI" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

## あなたの体重は生まれつき決まっている

　人には体重を一定の状態に保つよう調整する機構が身体に備わっているのだけれど、その「ちょうどいい体重」というのは人それぞれ異なる（遺伝要因が大きい、と動画では説明している）らしい。で、「ちょうどいい体重」から増減があると、代謝が促進されたり、逆に抑制されたりして自然ともとにもどされてしまうのだ。それが Set Point Theory。

https://en.wikipedia.org/wiki/Set_point_theory_(body_weight)

https://www.healthline.com/health/set-point-theory

## じゃあダイエットは無理ゲーなのか

長期間での体重変化は、この「標準体重」を変化させうるらしい。
急激なダイエットよりも少しずつの体重変化がベター。この記事によると **6 ヶ月 で 10 % の減量** が良いらしい。(なにやらダイエット法についても細かく書いているが、気が向いたら読んでみるか。)

https://www.bidmc.org/about-bidmc/wellness-insights/nutrition/week-one-the-science-of-set-point

## おまけ

そういえばマッスルグリルトークでもゆっくり体重を落とすことの重要性話してたな。

<iframe width="560" height="315" src="https://www.youtube.com/embed/6wKniQmRDs4" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
Vue.jsのfilterを理解する！

#対象
Vue.jsでfilterとmixinを理解したい

## 前提知識
Vue.jsの基礎的な理解


## filterとは？
フィルターとはテキストにたいしてなにかフォーマットを変更したい時などに用いることが多いです。
やってみる方がわかると思います。
今回はVue CLIを使用していきます。

```Home.vue
<template>
<div>
  <h2>{{title}}</h2>
</div>
</template>

<script>
export default {
  data() {
    return {
      title: "welcom to tokyo",
    }
  },
}
</script>

```

このように記述します。
{{title}}の部分は全て小文字で表示されていますが、こちらを大文字にしていきたいとします。
こういった場合はcomputedで動的に変える方法とfilterを使う方法があります。

しかしcomputedを使って変える場合だと仮に{{subTitle}}のように値が増えるとそれごとに大文字にする処理を書かなければいけません

以下例です

```Home.vue
<template>
<div>
  <p v-border:dotted="{color: 'red', width: '300px'}">Home</p>
  <h2>{{titleUppterCase}}</h2>
  <h2>{{subTitleUpperCase}}</h2>
</div>
</template>

<script>
export default {
  data() {
    return {
      title: "welcom to tokyo",
      sibTitle: "sub title"
    }
  },
  computed: {
    titleUppterCase() {
     return this.title.toUpperCase();
    },
    subTitleUpperCase() {
     return this.subTitle.toUpperCase();
    }
  }
}
</script>

```

これでも大文字になるのですが

```
computed: {
    titleUppterCase() {
     return this.title.toUpperCase();
    },
    subTitleUpperCase() {
     return this.subTitle.toUpperCase();
    }
  }
```
この部分が非常に冗長ですね。
ここで使えるのがフィルターです。

使い方としてはvue cliのmain.jsに記述していきます。

```main.js
import Vue from 'vue'
import App from './App.vue'

Vue.config.productionTip = false
Vue.filter("upperCase", (value) => {
  return value.toUpperCase();
})

new Vue({
  render: h => h(App),
}).$mount('#app')

```

記述としてはこんな感じです。
まずfilterの第一引数に任意の名前をつけます。
第二引数は関数をとり、引数でvalueをとります。

これでフィルターの設定は完了です。
使いたい場合は

```Home.vue
 <h2>{{ title | upperCase }}</h2>
 <h2>{{ subTitle | upperCase }}</h2>
```

たったこれだけ全てが大文字に適用されるようになります。
ちなみにmain.jsで記述すると全てのcomponentで扱えるグローバルフィルターになります。

## ローカルフィルターを定義する

ローカルフィルターではそのcomponentないでだけ使用することができるようになります。

```Home.vue
<script>
export default {
  data() {
    return {
      title: "welcom to tokyo",
      subTitle: "sub title"
    }
  },
  filters: {
    upperCase(value) {
      return value.toUpperCase();
    }
  }
}
</script>

```

scriptタグ内をこちらに変更するだけです！
filtersを定義してあとはその中に好きな関数を指定するだけになります。

## 注意点
computedとfilterを使う例を紹介してきましたが基本的にはcomputedの方が処理的には早いです。
なぜかと言うとcomputedはキャッシュを効かせられるのに大してfilterはキャッシュを効かせることができないからです。

なので何度も描画されてレンダリングが多いような場面ではfilterは使うものではないです。
そういった場面ではなく尚且つ同じような処理がふえそうな場面でつかって見ましょう！

お疲れさまでした！
Ruby on Railsでポートフォリオ作成

## 記事の概要
私が作成したポートフォリオの作成背景です。
工夫したところ、ユーザーインタビューの詳細、苦労した点など、
GithubのREAD.MEに書ききれなかったことをまとめました。

## kakikukekoapp
簡単にプロフィールを作成できるサービスです。
TwitterやfacebookなどのSNSのリンクを、このアプリのプロフィールにお洒落にまとめることができ、このアプリのリンク一つでシェアできるようになります。

##　背景
現職ではVBA（マクロ作成言語）で業務で使用するマクロを作成しているのですが、実際に使用する方へのヒアリングを怠ってしまうと、後から修正が発生してしまうことが多くなり、完成が遅れてしまううえに無駄に作成の手間がかかってしまうことがあります。

反対に、実際に使用する方へのヒアリングをしっかりと行った場合は、修正が入ることも少なく、実際に使用する方の求めているマクロを作成することができました。
ポートフォリオの作成も同じように考え、ヒアリングを繰り返しながら作成することによってユーザーの求めてるアプリに近づくことができ、「ユーザー満足度の高いアプリ」を作れると考えました。

プロフィール作成サービスは、身近に既存のサービスを利用している方が3名おり、ヒアリングを繰り返しながら作成できるため、プロフィール作成サービスを選ぶことにしました。

## 工夫した点
### UI
UIには一番時間をかけました。恐らくCSSとHTMLに一番時間をかけています。
私自身はサーバーサイドエンジニアを目指しておりますので、本来時間をかけるべきなのはUIではないのは承知の上だったのですが、コンセプトが「ユーザー満足度の高いアプリ」である以上、使いやすく直感的に操作できるようにして、ユーザーにストレスを与えない作りにする必要があると考えました。

「javascriptを駆使した動的でお洒落なデザイン」というよりも、初めて使用する方でも直感的に操作が出来てストレスを与えない作りにしようと考えました。

又、ユーザーの作成したプロフィールのデザインを崩さないようにするため、ヘッダーやフッターに赤や青等のカラフルな色を使用するのは避けて、白と黒だけで統一しました。

## 続きの記事は後日作成します！！
【Laravel】formからPOSTすると「Mixed Content Error」となりSSLが無効になる

### HerokuにLaravelアプリをデプロイしてformからpostしたらいきなりSSLが無効になった。。。

検証ツールのconsoleでログを見てみると、、、

```console
' was loaded over a secure connection, but contains a form that targets an insecure endpoint '
```
「安全な接続を介してロードされましたが、安全でないエンドポイントを対象とするフォームが含まれています」と書いてある。

実際の挙動も、直前のページまではhttpsだったがformのsubmit実行をしたら急にhttpになりSSLが無効に。。
当然chromeから「安全な接続ではないが送信しますか？」と聞かれ、意図した遷移がされない

### 原因
```php
   <form method="post" action="{{ url('/if_stories') }}">
       @csrf
        ・
        ・
   </form>
```
urlヘルパーだと渡したパスがhttpで生成されてしまうらしい、、、なので



```php
   <form method="post" action="{{ secure_url('/if_stories') }}">
       @csrf
        ・
        ・
   </form>
```
「完全なHTTPS URLを生成する」secure_urlヘルパーに差し替えてデプロイしなおしたら直りました！


参考にさせていただいた記事：
https://readouble.com/laravel/5.5/ja/helpers.html
https://www.fixes.pub/program/28119.html
Linuxのシェルやコマンドでのバッククオートの意味

シングルクオートとバッククオートがごっちゃになったのでまとめます。

**シングルクオート**で囲ったものは、文字列として扱われる。

**バッククオート**で囲ったものは、コマンドとして実行してその結果を出力する。
例えば、vimでlocateで見つけたパスをvimで編集しようとした場合

```
vim `locate test/test.c`
```
とすることでtestディレクトリにあるtest.cがvimで編集できるようになります。

またバッククオート以外でも$(...)でも同じ動きをします。

```
vim $(locate test/test.c)
```
Vue.js~ToDoリスト④~

今秋は、前回つけた削除機能に完了したときに横線が入るように実装していきたいと思います。

HTMLでの実装は以下のようになります。

```index.html
<ul>
      <li v-for="(todo,index) in todos">
        <input type="checkbox" v-model="todo.isDone"> 
        <span v-bind:class="{done: todo.isDone}">{{index}}:{{ todo.title }}</span>
        <span class="delete-button" v-on:click="deleteItem(index)">✗</span>
      </li>
    </ul>
```
今回は完了チェックを付けやすいように、チェックボックスを付けたいと思います。
また、v-modelとtodo.isDoneを紐付けておきます。
今回はv-vindというディレクティブを使っていきます。
v-bind:classにオブジェクトを渡すことで、動きを付けてくれます。
今回は、データに応じて動きを変えたいので、spanタグを使いDoneのときの動きを付けていきます。

ここで、js側の実装をみていきます。

```index.js
newItem: '',
    todos:  [{
      title: 'title1',
      isDone:false},{
        title:'title2',
        isDone:false},{
          title:'title3',
          isDone:true
        }]
  },
  methods: {
    UPItem: function() {
      const item = {
        title:this.newItem,
        isDone:false
      };
      this.todos.push(item);
      this.newItem = '';
    },
```
既存のデータを作っていきます。
false▶正しくない true▶正しい　という値になります。
今回の記述内容は、タスク１，２は完了していない、タスク3は完了しているよって感じです。
ブラウザ上ではこのような感じになります。

![スクリーンショット 2021-03-25 20.05.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1033397/8b9b563d-7856-67d2-f970-954bf7bf3a3d.png)

メソッドの方をみていきましょう！！これは追加の場合の処理になります。
変数を宣言し、追加されても完了の状態では無いようにisDone:falseを追加します！！
これで、追加から完了までの機能実装することができました！！😊
GEEEK A50 MINI-ITX CASE 


# GEEEK A50 の電源パネルが割れたので、ホームセンタ売りの素材で何とかした話

まんまこのままなので写真をベースに乗せていく。
たんに私が使った素材とかを忘れてそうなのでメモです。

## というわけでA50紹介も兼ねて事の経緯

A50はこれ。当時90ドルくらいで日本までの送料が30ドル弱。円がアレでお得ではあった。
[GEEEK A50 ver1.2](https://www.geeekstore.com/?s=A50)	
2019年9-10月くらいに思い立って、GEEEK の A50 を購入。 
このケース電源の止め方がちょっと変わっている。

- 電源にアクリルっぽい成形パーツを止める。
- ケース天板からスペーサでぶら下げつつ、成形パーツをビスで固定する

`企業努力としていい感じのデザインにするにはこの方法しかないというのはすごいわかる、が…。`

- 2021年の夏くらいにあれこのパーツ割れてね？で気が付いた。
- まぁ廃熱GPUぶん回す使い方していたのがよくない。
 - Radeon RX Vega 64 Air Boost 8G OC 24H/365D
- 成形パーツは素材がアクリルっぽかったのでしゃーない。

## 割れ状況
- ビス穴割れ

<img width="480" alt="16131228599575031898969768333069.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/515336/bb883ad4-7f3f-1413-b47b-95c63869269a.jpeg">

- 天板自体の割れ

<img width="480" alt="16131228095736414235374202453856.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/515336/6a450f45-6059-f8bf-1d33-d8c2f9b16843.jpeg">

## 対策

~~そもそもこの天板から釣る構成が構造的欠陥では？？？？~~
~~トルクかけすぎじゃねーんか？~~
割れてるもんはしゃーない。このプレートがないと電源が固定できん。

1. 3Dプリンタで同じものを刷る
>3Dプリンタない。知り合いにいるがデータの準備と素材量と時間と受け渡しの総合コストがネガティブ方面なので却下

1. 金属でこの成形パーツと同じものを加工（つくる）
>ノギス計測で厚み4mmの加工？手で？！？！しかもそれを中肉抜きする、、、筋肉的に無理ゲーなので却下
>金具素材（L字金具）とかの組み合わせでこう、いい感じに、、、できませんでした
1. 木でこの成形パーツと（ry
>固定穴が近傍過ぎて強度的に無理っぽい。素材のポピュラーさ、入手性から採用候補はベニヤないし合板だがどちらも乾燥で死、運用中に割れて落ちたら死ぬ。
1. プラ系素材でこの成形パーツと（ry
>というわけで排他的にこの案しかない…。

## 採用
最終選考までに残ったのは低発泡塩ビ板とポリカーボネート板（カタくて強いプラ段ボールのイメージで合ってる）。
このうちポリカーボネート板は以下の理由で見送り。
・方向によって強度が違う
・ねじ止めの押さえつけに弱い

採用は「アクリサンデー 低発砲塩ビ板 5mm ¥929」結構高い。

| 1 | 2 |
|:-:|:-:|
|品番|E-7001白|
|サイズ|SS 200mm x 300mm|
|厚み|5mm|
|材質|低発泡塩ビ板|

色味的には黒が良かったけど、白しかなかったので…

<img width="480" alt="16131229037883698214062304516002.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/515336/c0a03c8d-3562-da4d-854c-c608ce6680da.jpeg">

## 加工(雑)
低発砲塩ビ板のいいところはカッターで加工できるところ。
5mmでもオラついて何度か切り込み入れればサクーよ。
そうやって調子乗って手を切るまでがテンプレ。
5mmは厚いのでてきとーにドリルで穴開け。元穴がM4とM3だったので、M4とM3.5で。
案の定ズレててM3.5じゃなきゃ死んでたわ。ちゃんと下書きをお勧めします…。
<img width="480" alt="16131937560979122344763144809170.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/515336/72ac2300-b7ee-84d2-1951-e6f5de4ca2ad.jpeg">

## 雑感
A50は当時は選択肢があまりなくてよかったんだけど、今なら1枚板から成形したアルミのケースが売っているので熱要素が高い運用するなら壊れにくさから言えばそっちがおすすめな気がする。
N + 1問題を解決する

はじめに仕込んでいたgem bulletが警告ログを発したので解決してみます。
![スクリーンショット 2021-03-25 19.32.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698694/f56e2289-e0a3-c077-c666-f8257ef6e957.png)

##N + 1問題とは？
データベースへのアクセス回数が必要以上に多くなってしまう現象の事。モデル間のアソシエーションで発生します。

##gem bulletとは？

N + 1問題が発生してる箇所を警告で教えてくれるgemです。

##現状

```
CareRecipitent Load (0.4ms)  SELECT "care_recipitents".* FROM "care_recipitents"
  ↳ app/views/caregiver/tops/index.html.erb:1
  Caregiver Load (0.5ms)  SELECT "caregivers".* FROM "caregivers" WHERE "caregivers"."id" = $1 LIMIT $2  [["id", 1], ["LIMIT", 1]]
  ↳ app/views/caregiver/tops/index.html.erb:37
  CACHE Caregiver Load (0.0ms)  SELECT "caregivers".* FROM "caregivers" WHERE "caregivers"."id" = $1 LIMIT $2  [["id", 1], ["LIMIT", 1]]
  ↳ app/views/caregiver/tops/index.html.erb:37
  CACHE Caregiver Load (0.0ms)  SELECT "caregivers".* FROM "caregivers" WHERE "caregivers"."id" = $1 LIMIT $2  [["id", 1], ["LIMIT", 1]]
  ↳ app/views/caregiver/tops/index.html.erb:37
  Rendered caregiver/tops/index.html.erb within layouts/caregiver (Duration: 16.2ms | Allocations: 6553)
  CACHE Caregiver Load (0.1ms)  SELECT "caregivers".* FROM "caregivers" WHERE "caregivers"."id" = $1 LIMIT $2  [["id", 1], ["LIMIT", 1]]
```
はじめに親モデルに検索がかけられ、その後に子モデルに４回クエリが発行されていることがわかります。


##解決策

子モデル.includes(:親モデル)

```
  def index
    #@caregiver = Caregiver.find(params[:staff_member_id])
  -  @care_recipitents = CareRecipitent.all
  +  @care_recipitents = CareRecipitent.includes(:caregiver)
  end
```
コントローラーのindexアクションを書き換えます。

```
CareRecipitent Load (1.2ms)  SELECT "care_recipitents".* FROM "care_recipitents"
  ↳ app/views/caregiver/tops/index.html.erb:1
  Caregiver Load (0.6ms)  SELECT "caregivers".* FROM "caregivers" WHERE "caregivers"."id" = $1  [["id", 1]]
  ↳ app/views/caregiver/tops/index.html.erb:1
  Rendered caregiver/tops/index.html.erb within layouts/caregiver (Duration: 75.3ms | Allocations: 19989)
  Caregiver Load (0.3ms)  SELECT "caregivers".* FROM "caregivers" WHERE "caregivers"."id" = $1 LIMIT $2  [["id", 1], ["LIMIT", 1]]
```

クエリの回数が減り、無事ログを消えました。
SQLite(データベース)のテーブルをCSVで保存

#目標：テーブル(persons)をdata.csvに保存
`>sqlite3 yourdb.db
sqlite> .headers on
sqlite> .mode csv
sqlite> .output data.csv
sqlite> SELECT * FROM persons;
sqlite> .quit`

#参考資料
https://www.sqlitetutorial.net/sqlite-tutorial/sqlite-export-csv/
ラズパイ4BでFlutterアプリを起動する！

# はじめに
ラズパイでFlutter使いたい人がどれくらいいるかわかりませんが（もしかして私だけ・・） UI付きのIOTがもしかして簡単に出来るのでは・・ということでやってみました。

使用したもの
・Raspberry Pi 4B メモリ4G
・キーボード・マウス
・M1 MacbookAir（OSインストール用）

# 目次
1. [ラズパイにOSをインストール](#Chapter1)
1. [GPIOを認識させる](#Chapter2)
1. [Flutterをインストール](#Chapter3)
1. [アプリを起動](#Chapter4)
1. [参考文献](#reference)

<!-- 各チャプター -->
<a id="#Chapter1"></a>
# ラズパイにOSをインストール
まずはラズパイにOSをインストールします。
Flutterは今のところ64bit linuxにしか対応していないので32bit RaspberryPiOSでは起動できませんでした。ubuntu20.10ではFlutterの起動ができましたがwiringpiが上手く動かなかったため（動かせる人いたら教えて下さい・・）今回は64bitRaspberryPiOSを使用しました。

下記記事を参考にRaspberry Pi imagerでmicroSDカードにOSを保存します。
https://note.com/ryoma_0923/n/nb7c26336a057
![スクリーンショット 2021-03-25 18.53.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1240182/5a2c6f40-da5f-9b45-5bac-cd0823328887.png)
OSのバージョンは添付の画像をご覧ください。
保存できたら、ラズパイに挿して起動して設定を済ませて、インターネット接続します。

<a id="#Chapter2"></a>
# GPIOを認識させる
最終目標はFlutterでGPIO制御なのでGPIO設定をします。
Flutter起動だけしたい方は飛ばして下さい。
ターミナルを開いて下記を入力します。

root権限を持ちます。

```
$ sudo su -
```
gpio制御用のライブラリを入れます。

```
$ wget http://project-downloads.drogon.net/wiringpi-latest.deb
```
```
$ sudo dpkg -i wiringpi-latest.deb
```
これでgpio接続が出来るようになっているはずです。下記コマンドでgpio一覧を確認してみましょう。

```
$ gpio readall
```



<a id="#Chapter3"></a>
# Flutterをインストール
いよいよFlutterをインストールします。公式の通りに進めていけば大丈夫です。
https://flutter.dev/desktop
https://snapcraft.io/install/flutter/raspbian

まず、snapdを使用できる様にします。

```
$ sudo apt update
$ sudo apt install snapd
$ sudo reboot
```
flutterをインストールします。

```
$ sudo snap install flutter --classic
```
下記も一緒にインストールします。

```
$ sudo apt-get install clang cmake ninja-build pkg-config libgtk-3-dev
```
FlutterでLinuxDesktopアプリが使える状態にします。

```
$ flutter config --enable-linux-desktop
```
<a id="#Chapter4"></a>
#アプリを起動
後はFlutterアプリを起動するだけ・・

Flutterアプリを作成し、ディレクトリを移動します

```
$ flutter create myapp
$ cd myapp
```

Flutterアプリを起動します。

```
flutter run -d linux
```
・・・がしかし、コンテキストが生成できないエラーが発生しストップ。
これが、ラズパイの限界か・・
試しにビルドして実行してみる。

```
$ flutter build linux
```
ビルドされたアプリはここにある。

```
/home/pi/myapp/build/linux/arm64/release/bundle
```

これを実行すると・・

![IMG_0779.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1240182/cd0d6526-f541-32d9-2ad0-9eea65cd83d4.jpeg)
行けたーーー！
お馴染みのカウントアップアプリが起動できました。

でも、デバックの度にビルドしたくないなぁ・・
何か良い方法をお持ちの方は是非是非コメント頂けると嬉しいです。

次回はFlutterでLチカに挑戦したいと思います。

<a id="#reference"></a>
# 参考文献
- [Flutter公式](https://flutter.dev/desktop)
- [snapcraft](https://snapcraft.io/install/flutter/raspbian)
- [RYoMa_0923さんのnote](https://note.com/ryoma_0923/n/nb7c26336a057)
- [wiringpi.com](http://wiringpi.com/)
azure-storage-blob のサンプルコード

azure-storage-blob のrubyのサンプルコード
https://github.com/Azure-Samples/storage-blobs-ruby-quickstart/blob/master/example.rb
がわかりにくかったので、サンプルを書き直した。本質的な部分だけ残す

## 改善点

exsample.rbでは、バケットを作るところからスタートして、最後にバケットを削除してる。それサンプルとしてはデータができるところとか確認できないのでつらい。このサンプルではあらかじめAzurePotal上でバケットの作成とファイルをすでにアップロードしているところから始める

## 設定ファイル

アクセスキーなどはソースに入れるべきではないので、外部から取り込む。環境変数という手もあるが、環境変数をセットするのも結局はどこかのファイルを読むことになる。だったら、ホームディレクトリにファイルを置くのが吉。このサンプルではこういうJSONファイルを、ホームディレクトリに置いておく。

```
$ cat ~/.az/account.json
{
"container_name":"コンテナ名（バケットに相当する）",
"account_name":"アカウント名",
"account_key":"アカウントキー"
}
```
アカウント名とアカウントキーは、Azureポータルの「アクセスキー」から取得できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53489/e2125565-8e67-a4d9-049c-de8def05ed64.png)


### サンプルコード

#### input/ディレクトリ配下の、ファイルの一覧を取得するサンプル。

```list_blob.rb
require 'azure/storage/blob'
require 'json'

# load blob_client
account = JSON.parse(File.read("#{Dir.home}/.az/account.json"))
container_name = account['container_name']
blob_client = Azure::Storage::Blob::BlobService.create(
  storage_account_name: account['account_name'],
  storage_access_key: account['account_key']
)

# list blob under input directory
next_marker = nil
loop do
  blobs = blob_client.list_blobs(container_name, { prefix: 'input/', marker: next_marker })
  blobs.each do |blob|
    puts "\tBlob name: #{blob.name}"
  end
  next_marker = blobs.continuation_token
  break unless next_marker && !next_marker.empty?
end
```

#### input.txt というオブジェクトの内容を取得するサンプル

```get_blob.rb
require 'azure/storage/blob'
require 'json'

# load blob_client
account = JSON.parse(File.read("#{Dir.home}/.az/account.json"))
container_name = account['container_name']
blob_client = Azure::Storage::Blob::BlobService.create(
  storage_account_name: account['account_name'],
  storage_access_key: account['account_key']
)

blob, content = blob_client.get_blob(container_name, 'input.txt')
p blob
puts content
```
### 最後に

クイックスタートのやってることがめちゃくちゃわかりにくいと思ったけど、ライブラリ本体のreadme.md
https://github.com/azure/azure-storage-ruby/tree/master/blob
をみると、本質的なコードだけで分かり易かった。

ライブラリ作る人はさすがにrubyに慣れていて、インデントはスペース２個。クイックスタートの人はインデントがスペース４個だったので、rubyへの慣れがだいぶ違うという感じ。

毎度のことながら、ライブラリ本体のリファレンスが一番分かり易いというオチでした。
動画ファイルを再生するReact-Player引っかかったところメモ

##自分用メモ

windows10
wsl2:ubuntu
node: v15.9.0
react: 17.0.1
react-player:2.9.0


create-react-appして動画ファイルを使いたいときインストールしたのがReact-Player。

```wsl2:ubuntu
npm i -s react-player
```

で、実装。

```react:App.js
import ReactPlayer from 'react-player'

function App() {
    return (
        <div>
           <ReactPlayer url='videos/〇〇.mp4' playing width="100%" loop/>
        </div>
    )
}
export default App
```

この時パスわかんなくなってハマりました。
react-playerではpublicフォルダの中を見ているようで、public以下のパスを記述して見れるようになりました。以上。
【Git】GitHubの芝に草を生やして意識高いアピールをしたい人のためのモンキーコマンド

<h2>芝に草を生やしたい……!！</h2>
Gitでファイルの更新すればするほど生える芝があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927880/156f08d1-d166-8482-ea10-77500d2d6117.png)


この芝が青々と茂っていることで「あ、この人毎日更新してるやん！！ 意識高！！」と見る人に思わせることができます(筆者の思い込み)

今回はこの芝を効率的に生やすためのコマンドを書いておきます。

※筆者環境はcloud9上ですが、ローカル環境でも行けるはず……？

<h2>実施コマンド</h2>

<b>1.ブランチを切る</b>
まずはブランチを切ります。
間違ってファイルを更新しても、元に戻せるようにしておきます。

```
git checkout -b new-branch
```

<b>2.ファイルを更新</b>
ファイルを更新します。
更新したファイル数が多ければ、色が濃くなるので多めに5個ぐらいファイルを更新しておきましょう。


<b>3.gitをローカルからリモートへpush</b>
gitをローカルからリモートにpushします。

```
#gitにファイルを対象にする
git add -A

#ファイルをローカルリポジトリにコミットします
git commit -m "kusa"

#マスターブランチに変更します。
git checkout master

#更新内容をmasterブランチにマージする
git merge new-branch

リモートリポジトリにpushします。
git push
```

これで草を生やすことができます。これを毎日繰り返すことで青々と萌える芝を生やすことができます！！

<h2>参考</h2>
Railsチュートリアル
https://railstutorial.jp/chapters/following_users?version=6.0#sec-following
jsファイル  デバックする方法(binding.pry)

## はじめに
railsではよく`binding.pry`を使用して値が入っているか確認する際によく使いますが、
jsはどうやって調べられるのか？
可能であれば動きをみた方が理解度も上がりますよね！
とても簡単です^^それでは行きましょう!


# 手順
1.検証ツールを開き。
`Sources`を選択します。![スクリーンショット 2021-03-25 18.54.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/859347/0f00b7dc-0964-dfb0-122f-d4362510f92f.png)

2.jsファイルを選択して開きます。
![スクリーンショット 2021-03-25 18.57.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/859347/05dd766f-5f98-9b12-8846-557ad607dd9e.png)

3.処理を止めたい行を選択します。
![スクリーンショット 2021-03-25 19.00.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/859347/25bef6cb-5126-7e70-6f4b-23b5b520a4f2.png)

あとはbinding.pryの時と同じようにブラウザで操作します。

選択した場所で処理が止まり、

その状態で、検証ツールのコンソールで変数の中身を確認することもできます！

 
誰かの参考に慣れば幸いです^^
Vue.js~ToDoリスト③~

今回はToDoリストの削除機能を作っていきます。

では、実装していきましょう！！

#削除機能

```index.html
<ul>
      <li v-for="(todo,index) in todos">
        No.{{index}}:{{ todo }}
        <span class="delete-button" v-on:click="deleteItem(index)">✗</span>
      </li>
</ul>
```
spanタグを追加して、✗を付けます。また、このspanタグをボタン化したいので、v-on:clickを使います。またここで、CSSを書くためのクラスも付与しておきます。
deleteItemと追加して、何番目のindexを削除するのかを指定します。

```index.js
methods: {
    UPItem: function(event) {
      this.todos.push(this.newItem)
    },
    deleteItem: function(index) {
      if (confirm('No.' + String(index) +'削除しますか?')) {
        this.todos.splice(index, 1);
      }
    }
  }
```
実行機能にdeleteItemを追加します。
今回、関数fanctionに引数としてindexが上がってきます。
そして、this.todos~...のspliceという新しいメゾットが出てきました。
これは、配列の要素を操作するメゾットになります。
①要素を取り除く
②置き換える
③追加する
ことができます。

#splice　使い方
これを使うときは、第1引数は必須となります。第2引数はオプションとなっています。
今回の場合はindexを引数として指定し、第2因数は1となります。これは、1個削除してねって指示になっています。

また削除する前に、削除しますか？？っというダイアログを追加したいと思います。
confirmというメゾットを使うことで、作成することができます。
配列からデータを１個ずつ改行するプログラム

配列からデータを１個ずつ改行するプログラムをJavaで2通り作りました。
1通り目

```java
//  配列課題2
//  新規作成  2021/03/23
//  作成者    坂道好きのITエンジニア
//  課題　配列を1行ずつ全ての要素を取り出してください


package paiza;

public class hairetsu1 {
	public static void main(String[] args) {
		int[] data = {3,2,10,2,3};
		for (int i:data) {
			System.out.println(i);
		}
	}

}
```

2通り目です

```java
//  配列課題2
//  新規作成  2021/03/23
//  作成者    坂道好きのITエンジニア
//  課題　配列を1行ずつ全ての要素を取り出してください


package paiza;

public class hairetsu1 {
	public static void main(String[] args) {
		int[] data = {3,2,10,2,3};
		for (int i:data) {
			System.out.println(i);
		}
	}

}
GNS3でリモート接続する方法

GNS3でリモート接続する方法について書こうと思います。
調べてみるとGNS3上のNW機器にリモート接続するには複数の方法があるようなのですが、わたしは仮想マシンを使った方法にしています。
初心者の方にも優しい方法だと思うので、ぜひ試してみてください！

##１．リモート接続用のPCを用意する
リモート接続を行うPCに仮想マシンを使います。
仮想マシンの作成方法については、今回割愛させていただきます。。ごめんなさい。
わたしが使用している仮想マシンのスペックは以下の通りです。
作業用なので低スペックで全然問題ないと思います！

| 項目            | 値                       |
|:--------------:|:-------------------------:|
|ソフト           |VirtualBox                 |
|OS              |Windows10(64-bit)          |
|メモリーサイズ   |2024MB                     |
|ハードディスク   |仮想ハードディスク作成する   |
|ファイルタイプ   |VDI                        |
|ストレージ       |可変タイプ                 |
|サイズ          |50GB                       |

仮想マシンを用意出来たら、Tera Termもインストールしておきましょう。

##２．GNS3に作成した仮想マシンを登録する
作成した仮想マシンは、GNS3に登録しないとネットワーク上に配置することができません。
手順は以下の通りです。

**➀Edit>Preferences...を開く**
![GNS3_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587633/6b3c17f1-5845-146c-17fe-e2f089a4acc8.png)

**➁[VirtualBox VMs]を選択し、[New]をクリック**
VMwareを使用している方は、[VMware VMs]を選択でOKかと思います！
![GNS3_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587633/2b7ec04d-6291-a3e4-3192-8bfcb142589c.png)

**➂VM listから作成した仮想マシンを選び、[Finish]をクリック**
![GNS3_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587633/7de13dbf-3244-dbbe-3c62-c1a1f7fcd0b8.png)

**➃[Apply]をクリックして、[OK]をクリック**
![GNS3_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587633/fac760c5-c9fe-276f-ecdb-69449fa038be.png)

**➄機器リストに仮想マシンがあるか確認**
![GNS3_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587633/5cfbb35c-431a-3d93-4737-3cd1ecd9d791.png)

##３．リモート接続する
**➀各NW機器にリモート接続できるように設定する**
必要な設定は[こちら][link-1]に書きました！
[link-1]:https://qiita.com/skr_0401/items/2fd95fd0f1a39d4a3439

**➁仮想マシンを開き、コマンドプロンプトでpingが通るか確認**
ちなみに、仮想マシンはGNS3上で起動することもできます。
![GNS3_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587633/0660c041-4a32-e05b-50d4-575046c866aa.png)

**➂Tera Termを開き、NW機器にログインする**
![GNS3_7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587633/1979fef0-fc33-cd13-df47-aaec93d688e3.png)

**➃ログインできたら完了**
![GNS3_8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587633/838239a1-fde4-c31a-012e-d27c6c8cd9a6.png)


以上の手順で、GNS3上のNW機器にリモート接続できるようになりました。
仮想マシンを使った方法のデメリットに、**同じ仮想マシンを複数配置できない**というのがあります。
別のプロジェクトにはもちろんのこと、同じプロジェクト内でも同じ仮想マシンを2台以上置こうとするとエラーの表示が出ます。
なので、わたしは面倒ですが使いまわしています。（仮想マシン1台のサイズがとても大きいので量産できない）
でも、仮想マシンを使うことでコンソールからリモートに切り替えてる感覚にはなれるかと思います。

では、最後までお読みいただきありがとうございました～！
Cloud9上へzipをアップロードして、ファイルを解凍して環境構築しなおしてみた

<h2>実施背景</h2>

「no space left on device」エラーが発生してしまい、ERBボリュームを増やそうとするも、重すぎてターミナルが動かなかったため、新たに環境を作り直すべく、今まで作っていたファイルをzipで移動させようと考えました。

本来であれば、gitからpullする方法が一般的かと思いますが、まだpushしていない資材があったため、今回はzipファイルをダウンロードしたのち、新たに構築したcloud9の環境にアップロードして解凍する手法を取りました。

<h2>実施</h2>
<b>1.Cloud9環境構築</b>
まず、cloud9上の環境を新たに構築します。
cloud9で環境構築した際の工程は下記に書きました。

Railsチュートリアル6.0に沿って、AWSのCloud9上でRailsの開発環境作ってみた
https://qiita.com/GalaxyNeko/items/c9521c57e03f63e14f89

<b>2.zipファイルをアップロード＆解凍</b>
cloud9上にzipファイルをアップロードします。
zupファイルのアップロード完了後に、下記のコマンドをターミナルに打ち込んで解凍します。

```解凍
unzip xxxx.zip
```

そのあと、筆者はRailsのファイルを上げていたので、bundle updateやdb:migrateなどを打ち込んで環境を整えて、cloud9上でzipファイルを解凍し、環境構築できました。



<h2>参考</h2>
[Linux]ファイルの圧縮、解凍方法
https://qiita.com/supersaiakujin/items/c6b54e9add21d375161f
Raspberry Pi を PC 経由でインターネットに接続する

Raspberry Pi を、インターネットに接続された Windows PC 経由でインターネットに接続する方法です。本質的には、Windows のネットワーク共有の話なので、Raspberry Pi 以外にも使えます。

# ネットワーク構成

Raspberry Pi と PC は有線 LAN で接続され、PC は Wi-Fi でインターネットに接続されているものとします。

# 設定手順

「Windows の 設定」を起動し、「ネットワークとインターネット」を開きます。
![image-20210304-094207.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63622/09859577-76aa-5405-63fd-b67ef59ae143.png)

「ネットワークとインターネット」から「ネットワークプロパティを表示」を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63622/02d2ce79-71db-ace2-8d39-7645fdbbfc23.png)

ネットワークに一覧が表示されるので、Raspberry Pi と接続されているネットワークを探します。手元の環境では「イーサネット9」でした。
![2021-03-25_18h17_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63622/de9be21c-1e5d-f937-bf2b-a431f5fc6a6f.png)

次に、「ネットワークとインターネット」に戻り、サイドメニューから「イーサネット」を選びます。
![2021-03-25_18h24_34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63622/7154dd80-66f1-56d9-fa5d-0c6f8626a4ec.png)

「ネットワークと共有センサー」を選びます。
![2021-03-25_18h27_54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63622/956fc881-17a7-5739-f5e8-50a8b68bb003.png)

インターネットに接続されている接続を選びます。
![2021-03-25_18h29_14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63622/82382dde-5141-eda6-8c38-526d9d691a65.png)

「プロパティ」をクリックします。
![2021-03-25_18h31_29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63622/18ea1611-9905-432d-1660-63c466cf0d2a.png)

タブ「共有」を開きます。
![image-20210304-094720.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63622/bb6bddc6-ce64-07d2-29c9-4d8572421653.png)

両方のチェックボックスにチェックを入れ、「ホームネットワーク接続」のプルダウンメニューから、先ほど調べたネットワーク（ここでは「ネットワーク9」）を選択します。
![2021-03-25_18h34_46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63622/f06c2881-33b8-065f-eab8-6ee21cc773f2.png)

最後に、「OK」をクリックして、設定を反映します。

# 動作確認

PC から SSH で Raspberry Pi にログインし、インターネットにアクセスできることを確認します。

```
$ wget -O - https://www.google.com/
```
自動化プログラムを作る中で気づいたこと【音楽制作視点】

こんにちは。
KHUFRUDAMO NOTESのYoshito Kimuraです。

最近、RPA（ロボティック・プロセス・オートメーション）が流行っているようですね。
いろいろ課題・問題もあるようですが。

https://togetter.com/li/1194490

https://officeforest.org/wp/2019/03/22/rpa%E5%B0%8E%E5%85%A5%E3%81%AB%E6%96%BC%E3%81%91%E3%82%8B%E6%B3%A8%E6%84%8F%E7%82%B9/

僕は、音楽制作の全工程（作曲から楽器演奏、アートワーク周りまで）を基本的に一人でやる人です。

そして、制作の効率化のためPython(PyAutoGuiなど)で自動化プログラムをしばしば自作しています。
今回は、創作活動に関係する作業の自動化プログラムを作る中での気付きをまとめてみました！

# "創造的"な時間か否か をより意識するようになった。

音楽をはじめとした"創造的"な分野は、自動化による業務効率とそこまで相性が良くないイメージがあるかもしれません。

しかし、実際は「ファイルの書き出し」や「音価の計算」など"創造的"ではない時間も多く存在します。
（むしろ、"創造的"ではない時間の方が多い気もします。）

したがって、芸術関係の分野で自動化プログラムを作るときは、<strong>"創造的"ではない時間</strong>を意識して見つけるのが大切だと感じています。

# 「自動化できそうか」考えるだけで意味があった。

「自動化できない作業」はあります。
自動化を阻む理由には、技術、費用、美学…などいろいろな<strong>"壁"</strong>があると思います。

ただ、その手前に<strong>「明確なワークフローが完成していない」壁</strong>があると気付きました。

自動化プログラムを作るためには、明確なワークフローの確立が必要です。

また、ワークフローを考える中で、そもそも自動化プログラムを作るよりも、ショートカットキーやテンプレートで対応した方が良いと気付くケースもあります。

https://khufrudamonotes.com/cubase-shortcut

https://khufrudamonotes.com/finale-script

そういった意味で「ワークフローを考える行為」自体が、制作の効率化に繋がると感じました。

ちなみに、芸術界隈では、ワークフローなど"型"に沿って作品を作るのを好まない風習もある気がします。
しかし、「"型"を持っているけど、あえて使わない」のと「"型"が無い」のには大きな差があると考えます。

個人的には、"型"は多い方が柔軟な創作ができると感じています。

# 手を付ける順番が分かりやくなった。

自分の作業を大まかに

①「自動化できる作業」
②「自動化できるけど、自分でやった方がクオリティが上がる作業」
③「（色んな意味で）自動化できない作業」

の3つに分けて考えるようになりました。

すると、「自動化できない作業」→「自動化できるけど、自分でやった方がクオリティが上がる作業」の順番で作業に取り組めば"締切までに作品が完成しない"などの事故が起こるリスクを減らせる気がしました。

結果的に、優先順位の把握はクオリティの安定に繋がるのではないかと感じます。

# さいごにちょこっと宣伝

前に音楽理論や音楽制作に役立つウェブアプリ「O-TO」↓を作りました。
音楽制作の効率化に使えるはずです。

https://o-to.khufrudamonotes.com/

KHUFRUDAMO NOTESのYouTubeチャンネル↓

https://www.youtube.com/channel/UCj1FMSo7yhgjLlCiMZG-cFw
「状態共有」と「状態管理ロジックの共通化」は違う

タイトルの通りなのですが、意外と混同されている気がするので軽く説明します。

状態共有とは、例えば複数コンポーネント間で**同じ状態を参照すること**です。

Reduxなどの状態管理ストアを利用します。VueだとVuexですね。

イメージとしてはシングルトンのインスタンスをみんなで共有している感覚です。

状態管理ロジックの共通化とは、例えば複数のコンポーネントが**それぞれに状態を持つ**のだけれども、状態Aから状態Bに変化するための変換ロジックのみを共通化して**再利用すること**です。

ReactだとHigh Order Component（HOC）やReact hooksを利用します。VueだとComposition APIやMixin（辛い）ですね。

状態共有でもロジックそのものが共通的に利用できるのは確かですが、同じ状態を参照しているので別のコンポーネントに切り替えるときに`initHoge()`という感じの初期化ロジックを入れないと状態（前のコンポーネントの”お古”を）を引き継いでしまうために意図しない挙動になって困惑したりします。

なので、今やりたいことが状態共有なのか状態管理ロジックの共通化なのかを切り分けて考える必要があります。
Microsoft Teamsにサインインできない（max_reload_exceeded）

<h2>Microsoft Teamsにサインインできない　max_reload_exceededエラー
</h2>
<p>Microsoft Teamsにmax_reload_exceededというエラーでログイン出来ない状態になった場合、<b>Microsoft Teamsのキャッシュデータを消去</b>するか<b>Microsoft Teamsの再インストール</b>する必要があります。最初に下記の手順にキャッシュデータを消去してもサインイン失敗するなら再インストールを実施しましょう。</p>
<p><b>注：下記の手順を実施する前にMicrosoft Teamsを終了してください。</b></p>

<h2>Microsoft Teamsのキャッシュデータを消去</h2>
<p><b>■キャッシュデータ削除</b></p>
<p>①<b> %appdata%\Microsoft\teams</b>フォルダを開き</p>
<p>②<b>Application Cache</b>フォルダ内の<b>Cache</b>フォルダ中身を削除</p>
<p>③<b>Blob_storage</b>フォルダ内の中身全て削除</p>
<p>④<b>Cache</b>フォルダ内の全てデータを削除</p>
<p>⑤<b>databases</b>フォルダ内の全てデータを削除</p>
<p>⑥<b>GPUCache</b>フォルダ内の全てデータを削除</p>
<p>⑦<b>IndexedDB</b>フォルダ内の拡張子が<b>.db</b>ファイル全て削除</p>
<p>⑧<b> Local Storage</b>フォルダ内の全てデータを削除</p>
<p>⑨<b>tmp</b>フォルダ内の全てデータを削除</p>

<p>PC環境により上記の存在しないフォルダがありますので、スキップしてください。
フォルダ内のデータを削除後に下記の手順で<b>Windows資格情報を削除</b>しましょう。</p>

<p><b>■Windows資格情報削除</b></p>
<p>①<b>コントロールパネル</b>を開き</p>
<p>②<b>ユーザーアカウント</b>を開き</p>
<p>③<b>資格情報の管理</b>を開き</p>
<p>④<b>Windows資格情報</b>を開き</p>
<p>⑤<b>汎用資格情報</b>の<b>msteams_</b>から始まる全ての資格情報を選択し削除</p>
<p>⑥パソコン再起動</p>
<p>⑦Microsoft Teams起動</p>


<p>上記の手順でMicrosoft Teamsにサインインできない場合は、Microsoft Teamsの再インストールが必要になりますので、下記の手順を参考してください。</p>


<h2>Microsoft Teamsの再インストール</h2>
<p>Microsoft Teamsを再インストール前にMicrosoft Teamsを終了してください。</p>

<p>①<b> %appdata%\Microsoft\</b>フォルダを開き</p>
<p>②<b>Teams</b>フォルダを削除</p>
<p>③<b>%LocalAppData%\Microsoft</b>フォルダを開き</p>
<p>④<b>Teams</b>フォルダを削除</p>
<p>⑤<b>Microsoft資格情報を削除　（上記のWindows資格情報削除手順を参考）</b></p>
<p>⑥パソコンを再起動</p>
<p>⑦下記のURLよりMicrosoft Teamsをダウンロードし、再インストールする</p>
<a>https://www.microsoft.com/ja-jp/microsoft-teams/download-app


<p>以上。</p>
RPA(Robotic Process Automation)についてまとめてみた

#プログラミング勉強日記
2021年3月25日
[昨日の記事](https://qiita.com/mzmz__02/items/1b5db0b090e5e2b0c98e)でPowerAutomateDesktopについてまとめたときに、RPAについて詳しく知りたいと思ったので調べてみた。

#RPAとは
　Robotic Process Automationの頭文字をとったもので、企業の変革に欠かせないツールとされていて、事業作業を担うホワイトワーカーがパソコンなどを用いて行う一連の作業を自動化できるソフトウェアロボットのことである。(参考：[「RPA」（ロボティックプロセスオートメーション）の定義は？](https://www.sbbit.jp/article/cont1/37189))
　簡単に言うと、人間が行う業務を自動化するツールのこと。

##RPAに向いている業務

- 定型業務
- パソコンのみで行う業務

　一斉メールの配信、勤怠データの入力業務、営業成績といったグラフや表の作成など、決められたルールを元に同じような作業を繰り返す単純な業務に向いている。人間が行うとパフォーマンスにムラが出たり、ミスが増えたりすることがあるが、ロボットが行うことで一定のペースで同じ作業をミスなく繰り返すことができる。
　RPAは、基本的にパソコンにソフトをインストールして行うので、パソコンのみで完結する作業に向いている。例えば、大量のデータを扱う作業などである。

　
#RPAの特徴

##1. 簡単に作成ができる
　RPAはシステム構築が不要で、ユーザが簡単にロボットの作成・削除を行うことができる。作成や修正が簡単であるので、作業においても効率よく行うことができる。

##2. 幅広く対応している
　RPAは、システムやWebサイトなどツールをまたがる業務にも幅広く対応している。例えば、ブラウザとExcelの連帯ができる。

##3. ずっと稼働する
　24時間365日休みなく稼働できる。手作業で毎日行うには大変な業務もこなすことができる。



#参考文献
[「RPA」（ロボティックプロセスオートメーション）の定義は？](https://www.sbbit.jp/article/cont1/37189)
[RPAとは？RPAを導入するメリットから導入方法までをわかりやすく解説！](https://rpa-technologies.com/insights/rpa-introduction-merit/)
[【超・初心者向け】RPAとは？図解でわかりやすく簡単に説明！](https://service.biztex.co.jp/knowledge/1583/)
orやandの処理順番

一つのif文に何個も条件を付けたときに、

```typescript
if (isHoge || ok || flg && hasFuga && (enabled || allowed)) {...
```
などと`||`と`&&`を使うと思いますが

こいつらの処理順番がどうなっているか知っていますでしょうか？

カッコ内が最速なのはご存じだと思いますが、
`&&`のほうが`||`より計算されるのが早いのです。

簡単な話、結局
`||`は足し算、
`&&`は掛け算なのです。

この話を先輩に聞いたときに なるほど！となったのでここに書き記してみました。