OmniAICreator/Qiita-1.07M huggingface dataset:
ECR public repositories からイメージをpullできなくなったときの対応方法 ( pull access denied for public.ecr.aws )

Amazon ECRでパブリックリポジトリの提供が開始されました🎉
その名の通り、認証情報なしで`docker pull`が可能となるわけですが、状況によっては`pull access denied for public.ecr.aws`となってしまいます。
![スクリーンショット 2021-01-28 14.10.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68048/08608557-93fc-3a55-9069-ad1cb8ab3673.png)

## TL;DR
```shell
$ docker logout public.ecr.aws
```
でOK

## 状況
ECRパブリックリポジトリを使いたく、イメージを登録しました。その時のご案内がこちら。
![スクリーンショット 2021-01-28 14.15.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68048/fd4e1f82-f033-e070-58f0-7095541a4367.png)

```
aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws/xxxx
```

当然なのですが、プッシュする際は、`public.ecr.aws` に対して認証情報を生成する必要があります。

しばらくはこの状態で、パブリックリポジトリからpull出来ましたが突然`pull access denied for public.ecr.aws`という状況に。

![スクリーンショット 2021-01-28 14.10.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68048/4619ac5f-41b3-7d78-d4a8-8d45dd04c119.png)

エラーメッセージのとおりですが、認証期限があるので期限切れになってしまっています。
エラーメッセージに従うと`docker login`が必要ですが、何のためのパブリックリポジトリやねん、という感じなので認証情報を削除しましょう。

## 認証情報の削除方法
`docker logout`をするわけですが、デフォルトでは、`https://index.docker.io/v1/`に対してのログアウトとなってしまうので、 [link](https://docs.docker.jp/v17.06/engine/reference/commandline/logout.html)

```shell
$ docker logout public.ecr.aws
```

というように、サーバを指定しましょう。
Iphone カレンダーにスパムが表示＆通知される対処法

iPhoneのカレンダーにスパムが表示＆通知される。

その対処法を記載します。

■内容
・カレンダーに下記のようなスパムの表示＆通知が表示される
　→ウィルスに感染しているかもしれません。
　→すぐに対処してください！

・消そうと思ってもその予定/スケジュールは消せない
　→さらには過去のは消えて、新しい予定が毎日追加される。

■対処法
iPhoneの設定から

設定　＞　カレンダー　＞　アカウント　

アカウント内に登録してあれば、iCloud,Gmail,Yahoo!メール,ドコモメール,メッセージR/Sがありますが、
それ以外に　「Calendar Subscription」　など自身の知らないアカウントがあれば消してください。

以上

■原因
・フィッシングサイト、アダルトサイトなどでのポップアップで、「キャンセル」　を押さずに 「OK」　を押してしまった場合。
・調べた所Avgleなどのサイトでポップアップが頻繁に表示されるようです。

■備考
他のサイトで下記の対処法が記載ありますが、PCには表示されず、携帯だけ表示されるなど、
iCloudと連携していないこともあるようですので、スパムアカウントを消すことが優先だと思われます。　

　iPhoneでiCloudのカレンダー同期をオフにする
　iPhoneで「設定」＞「iCloud」＞ 「カレンダー」をオフにし、「iPhoneから削除」をタップ

以上

〜〜〜

FX取引ならこちら！！　世界最高水準　~ Axiory FX ~
https://portal.axiory.com/registration/?ib=19521
Java リフレクションでJAR実行

JavaでJARリフレクションを実行した際の備忘録
サンプルソースのみ

>		// JarFile のパス
		String strPathJar = "D:\\pleiades\\zz_orgBatch\\test\\testReflect.jar";
		// 実行するクラスとメソッド
		String strLoadClass = "src.batch.test.TestBatch";
		String strMethod = "startBatch";
		// 対象JARファイルを指定
		File jarFile = new File(strPathJar);
		URLClassLoader loader =
				URLClassLoader.newInstance(new URL[] {jarFile.toURI().toURL()});
		// クラスをロード
		Class<?> c = loader.loadClass(strLoadClass);
	    //インスタンス化
	    Object obj = c.getDeclaredConstructor().newInstance();
		// 実行するメソッドと引数を定義する
		Method m1 = c.getMethod(strMethod,String[].class);
	    //引数をオブジェクト化する必要がある
		String[] strParam = {};
	    Object[] objParam = new Object[] {strParam};
	    // 実行
	    m1.invoke(obj,objParam);
フルバックアップのサイズを確認するには

1日あたりのRMANフルバックアップのサイズを知りたいときがあるので方法をまとめます。

# どこを確認？

動的パフォーマンスビューの[v$rman_backup_job_details](https://docs.oracle.com/cd/E16338_01/server.112/b56311/dynviews_2142.htm#I1030391)に対するクエリ発行で確認できます。

# 確認方法

SQL*Plusでデータベースに接続して以下のSQLを実行します。

```sql
set pages 1000
set lines 300
col status format a9
select
  session_key,
  input_type,
  output_bytes/1024/1024 "size(MB)",
  to_char(start_time,'yyyy/mm/dd hh24:mi') start_time,
  to_char(end_time,'yyyy/mm/dd hh24:mi')   end_time,
  status
from
  v$rman_backup_job_details
where
  input_type='DB FULL'
order by session_key;
```

以上
【銀座Rails#26 LT登壇】江上「 大量データでもサクサク動くRailsになるために」

##【銀座Railsとは？】
リンクアンドモチベーションが支援をする技術コミュニティです。リンクアンドモチベーションでは、技術コミュニティの支援を通して、エンジニア同士のコミュニティ形成や活性化、Railsについての知識を交換することでエンジニアの技術の進歩に貢献したいと考えています。

今回は[銀座Rails#26](https://ginza-rails.connpass.com/event/189892/ "銀座Rails#26") に登壇をした弊社テックリード 江上のLTをレポートします！

### リンクアンドモチベーションのテックリード 江上について
2018年12月にベンチャー企業からリンクアンドモチベーションに転職。現在はテックリード兼エンジニアリングマネージャーとして活躍中。最近の趣味は、料理。新型ウィルスの影響で自宅で過ごす時間が増えたことをきっかけに、各国の料理に挑戦中。稀にピザがうまく膨らまなかったりと苦戦している。

👇 江上の関連記事
[__キャリアのスタートは、大手グルメサイトの「食べログ」。フルスタック、テックリードを経験してきた江上がLMの開発組織を語る__](https://www.wantedly.com/companies/lmi/post_articles/216724 "キャリアのスタートは、大手グルメサイトの「食べログ」。フルスタック、テックリードを経験してきた江上がLMの開発組織を語る")


##1.モチベーションクラウドによる大手顧客対応
リンクアンドモチベーションでは、これまでの組織人事コンサルティングのノウハウをもとに開発した、「モチベーションクラウド」というサービスを提供しています。

__「モチベーションクラウド」は、6,620社、157万人のデータベースから組織状態を診断し、組織改善に活用できる国内初の組織改善クラウド__です。こちらのサービスのエンタープライズ顧客対応において、Railsアプリの性能改善を実施しましたのでレポートします。

今回は、主にエンタープライズ顧客対応の概要と、銀座Railsという場なので、その際にRailsの書き方の工夫で対応した箇所をみなさんにご紹介したいと思います。

私たちは、主に3つの施策を試みました。まず初めに行なったのは__「UXの変更」__です。これまでベンチャー企業のお客様を中心に展開していたことから、お客様から求められるポイントとして「簡単に使える」「見た目がかっこいい」という点がありました。しかし、お客様が大企業や公的機関のようなエンタープライズになると、デザイン性よりも操作ミスが起きにくいという点が重視されるようになりました。そのため操作ミスが起こりづらいデザインや機能の開発に重点を置いてプロダクトを改修していきました。

次に__「セキュリティレベルの向上」__に取り組みました。ベンチャー企業を対象にした時、セキュリティとして問題がなければ導入を決定してくれる企業も多かったのですが、エンタープライズなどの大手企業様の基準では、Excelファイル数十枚におよぶセキュリティチェックシートが用意されています。それらの項目に全てチェックが入らないと導入ができない場合が多いので、大手企業様の基準に沿った、ハイレベルなセキュリティを実現させる必要がありました。


最後は__「パフォーマンス向上への取り組み」__です。これまでは、一企業あたり数百人規模のユーザーが利用することを目安に開発をしてきましたが、数万人のユーザーが利用してもスムーズに動くことが必須のため、早急にパフォーマンスの向上を図る必要がありました。

▼お話しした内容の詳細はQiitaにまとめましたのでそちらをご参照ください！
[__SaaSでRails使うなら知らないとまずい！！Railsで一括処理するときに遅いコードと対策5選__](https://qiita.com/vankobe/items/5d65268a6d570f2acc3b)

パフォーマンスの向上と言っても、その課題は様々です。アーキテクチャの変更などで対応したケースもありますが、__今回はRailsのコード部分である「非効率な書き方」__についてお話しします。

## 2.パフォーマンス改善を実際に試行しての所感と今後の課題感

今回、パフォーマンス改善にかけた期間はおよそ9ヶ月間ですが、__数千人が使用すると遅いと感じるアプリケーションだった状態から、5万人の顧客までスムーズに処理できるように改善__することができました。

APIに関しては、改善前は11個ほど動きませんでしたが、改修後はそれらが問題なく動くようになりました。また、改修後のAPIは平均で20倍ほど速くなりました。

また、非動機のバッチは3つ動かないものがありましたが、それも無事に可動し改修後のバッチは平均で11倍速ぐらいになりました。それぞれのパフォーマンスをさらに局所的に見てみると、100倍速くなったというものもいくつかありました。

9ヶ月間のパフォーマンス改善で感じたことは、__結局コードの部分だけで解決できる問題は少ない__ということでした。__「Railsのコードを変える」ということ以外にも、仕様や設計を変えるなどの対応が必要になる__といった課題が浮き彫りになりました。

例えば、__性能を改善する前はN＋1の問題が大量__に出ていたので、それが原因だと思い改修のための工数を甘めに見積もっていたところがありました。しかし、__結果的にはDB設計の変更をしなければならないケースが3割ほどあり、全体の工数としての5割以上を占めていたため、目に見えるものだけが、全てではないなと感じました。__

こうした経験を踏まえても、コードだけで解決できるケースは稀なのかなと今では思っています。また、設計を変えるよりも、仕様を変える方が大変だと感じています。SaaSということもあり、仕様変更をするとなると、各所への連携やお客さんへの伝達が多くなるので、その点はかなり大変でした。開発初期からpagingをしっかり設計するといったような、想定できることは早期に対応することがとても大事だと実感しています。

さて、最後になりますが、モチベーションクラウドは日々アップデート中です。現在、1万人以上規模の大企業のお客様への導入が加速しています。ベンチャー企業を中心にサービスを展開してきましたが、エンタープライズ領域に進出しておりプロダクトの成長フェーズです。

##3.最後に「私たちは最近こんなことやっています！」
>・パフォーマンス劣化が起こらないようにdetadogでRUMでの監視
・pdfの生成処理をlambdaに移設
・マイクロサービス化したりなどデータレイク構築
・非同期処理をバッチサーバーからworkerに移行
・アーキテクチャの見直し
・ElasticSeachの使用やデータマート構築の検討

少しでもご興味がありましたら、ぜひカジュアルに情報交換をさせてください！
ブロック要素、インライン要素

# ブロック要素とは
ブロックレベル要素とは、コンテンツをまとめる箱のような使い方をする要素。このブロックレベル要素によってWebサイトの大枠を形作ることができる。
例）`<address>`、`<blockquote>`、`<center>`、`<div>`、`<dl>`、`<fieldset>`、`<form>`、`<h1>-<h6>`、
`<hr>`、`<noframes>`、`<noscript>`、`<ol>`、`<p>`、`<pre>`、`<table>`、`<ul>`
<br><br>
# インライン要素とは
インライン要素とは、文章の一部として扱われる要素です。基本的にブロックレベル要素の中で使用され、ブロックレベル要素の内容に効果をもたらす要素が多く含まれています。
例）`<a>`、`<abbr>`、`<acronym>`、`<b>`、`<basefont>`、`<bdo>`、`<big>`、`<br>`、`<cite>`、`<code>`、`<dfn>`、
`<em>`、`<font>`、`<i>`、`<img>`、`<input>`、`<kbd>`、`<label>`、`<q>`、`
`、`<samp>`、`<select>`、
`<small>`、`<span>`、`<strike>`、`<strong>`、`<sub>`、`<sup>`、`<textarea>`、`<tt>`、`<u>`、`<var>`

<br><br>
#### 配置ルール
ブロックレベル要素の中には、他のブロックレベル要素やインライン要素を配置することができます。 一方、インライン要素の中には、文字データや他のインライン要素を配置することができますが、 インライン要素の中にブロックレベル要素を配置することはできません。
<br><br>
#### ブロックレベル要素とインライン要素の違い
| 横幅と高さの指定 | 横幅の初期値 | 高さの初期値 | 他の要素との並び方 | 余白のつき方 |
| :-- | :-: | :-: | :-: | :-: | --: |
| ブロックレベル要素 | 可能 | 親要素の横幅と同じ値になる | 内容で決まる | 改行が入る | デフォルトで付く場合がある |
| インライン要素 | 不可能 | 内容で決まる | 内容で決まる | 改行が入らない | 上下に特殊な付き方をする |

<br><br>
#### まとめ
ぱっと見て自分がわかり安いようにまとめました！
少しでも皆さんのお役に立てると幸いです。

参考文献
[【基礎知識】ブロックレベル要素・インライン要素の性質と違い](URL)
WebSphereでハングの可能性のあるスレッドが通知されたとき(WSVR0605W)

# 概要

- WebSphere Application Server(WAS)には、ハングの可能性を検知してログに出力する機能がある
- しきい値に設定した時間を超える処理時間がかかっている場合に、SystemOut.logにログが出力される
    - 通常の処理完了時間の範囲を見積もり、そこからしきい値を設定すべき
    - あくまでも検知するのは「ハングの可能性」である。実際にハングが発生しているとは限らない

# ハングとは？

下記のような原因で発生する、システムの機能低下の状態。
自然解消せず、利用者や監視ツールにより発見されるまで、そのままの状態が継続してしまうこともある。

- 無限ループなどの単純なソフトウェアの障害
- リソース・デッドロックやリソースの取得待ちなどの外部リソースとの接続上の障害

# 検出時の SystemOut.log のメッセージの例

```
[11/08/10 15:55:33:746 JST] 890e8c75 ThreadMonitor W WSVR0605W: スレッド "Servlet.Engine.Transports : 1293" (2ca38c77) が 612,791 ミリ秒間アクティブで、ハングしている可能性があります。サーバー内には、ハングの可能性のあるスレッドが合計 1 本あります
```
引用元: [WebSphere Application Server構築・運用バイブル【WAS8.5／8.0／7.0対応】 409ページ](https://books.google.co.jp/books?id=8sWg9O8cgtcC&lpg=PA410&ots=W4FPqjid_j&hl=ja&pg=PA409)

# どのように対処すべきか

利用しているアプリケーションにおいて、該当の処理が通常の処理時間内なのか、異常な処理時間と言えるのかを確認する。

## 通常の処理時間である場合

[ハング検出ポリシーの構成](https://www.ibm.com/support/knowledgecenter/ja/SSEQTP_9.0.5/com.ibm.websphere.base.doc/ae/ttrb_confighangdet.html) (English: [Configuring the hang detection policy](https://www.ibm.com/support/knowledgecenter/en/SSAW57_9.0.5/com.ibm.websphere.nd.multiplatform.doc/ae/ttrb_confighangdet.html)) を見直し、誤検知されないように設定値を修正する。

## 異常な処理時間である場合

外部リソースとの接続(コネクションプールなど)の設定値の見直しをしたり、アプリケーションの改修を検討する。
|| のあとに ! を入れた方がいいよ。

最初に書いておきますが、すべての場合に!を入れたほうがいいと言っているわけではありません。 エラーハンドリングの場合に通用します。
なぜこれを書いたのかというと、GitHubを見ていたら、エラーハンドリング時に真で返してしまっているものが多く見受けられたからです。

ではなぜ！を入れたほうがいいのか、

```shell
false || echo '1が出るよ:' $?
echo '0が出るよ:' $?
```

これを見ると、エラーハンドリングしても真値で返ってきています。

---

```shell
false || ! echo '1が出るよ:' $?
echo '1が出るよ:' $?
```

こうすることで偽値で返すことができます。
もし気になったらシェルで実行してみてください。

---

```shell
false ||:
```
逆にこれはすべてを0で返せます。

---

```shell
cat user.conf || cat default.conf
```

勿論こういうのは例外です。

---

> ###### 三か月前に書き終えたまま放置してた。
私が陥ったRPGのエラー解決方法　→ちゃんとエラーメッセージにQRGと付けてググって解決。

一ヶ月ほど前から社内で動作しているRPGの働きを確認したいため勉強しております。

それでネット上のRPGソースをAS400（PUB400.com）にてコンパイルして動作させようとしております。

昔は通って安心していたのですがしばらく他の業務をやっていて少々時間を置いてコンパイルしようとしたら通らなくなったので解決への軌跡として記事をあげさせていただきます。

と途中まで書いたのですがコンパイル出来たのでその解決方法をメモらせて頂きます。

```
https://as400-howto.xyz/begin/hello-world/
にて

STRSEU SRCFILE(MOITARO1/QRPGSRC) SRCMBR(SMPL01M) TYPE(RPG)
================================
     FSMPL01FMCF  E                    WORKSTN         
     C                     EXFMTWSFMT01                
     C                     SETON                     LR
================================
と画面ファイルを作成して

CRTDSPF FILE(MOITARO1/SMPL01FM) SRCFILE(MOITARO1/QDDSSRC)
    > CRTDSPF FILE(MOITARO1/SMPL01FM) SRCFILE(MOITARO1/QDDSSRC)                 
      File SMPL01FM created in library MOITARO1.
```
と解決出来ました。
もしかしてAS400だとコンパイルしたら画面ファイルはなくなるのだろうか……

もしくは
https://as400-howto.xyz/begin/hello-world/
に＞スプールファイルの削除
で削除した気がしますが解決しましたので表記失礼します。
超簡単 macからEC2にSSHで接続する方法

#１、キーペアの取得
AWSのコンソールからEC２を選択し、メニューからキーペアを選択。
キーペアの作成をしてダウンロード。

##### 参考サイト
https://dx.nissho-ele.co.jp/blog/aws-beginner-ec2_20190328.html
記事の途中にキーペア作成の説明があります。

#２、取得したキーペアの移動と権限の設定

##### ダウンロードしたファイルを移動
※.sshフォルダは隠しフォルダなので見えませんのがフォルダがなくても心配ないです。
ちなみに隠しフォルダを表示するためのショートカットは 「command + shift + . 」です。
※ここではキーペア名をkeypear.penとします。

```
mv /Users/ユーザー名/Downloads/ダウンロードしたキーペア.pem  ~/.ssh
mv /Users/username/Downloads/keypear.pem  ~/.ssh
```

#####権限の設定

```
chmod 600 /Users/username/.ssh/keypear.pem
```

#３、ターミナルからSSH接続をする
※カスタムユーザー名を使用して接続するか、インスタンスの起動に使用される AMI のデフォルトユーザー名 ec2-user を使用します。
※今回はデフォルトのec2-userを使用します。

```
ssh -i /Users/username/.ssh/keypear.pem パブリックIPアドレス(パブリックIPv4アドレス)
```

下のように表示されれば接続完了です！！

```
  __|  __|_  )
  _|  (     /   Amazon Linux 2 AMI
  ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
[ec2-user@ip-xxx-xx-xx-xxx ~]$ 
```
お疲れ様でした！
validateに条件分岐を設定する

## validateに条件分岐を設定する
　validateにifやunlessの条件分岐を設定する際の書き方。

## 例
```ruby
validate :判定に使用するメソッド, if: -> { 条件 }
# 具体例
validate :hoge, if: -> { Rails.env.production? }
```

## 動作確認
　以下で選択したレコードに対してバリデーションの判定を行う。

```ruby
バリデーションを設定したクラス.find(動作確認に使用するレコード).valid?
```
[小ネタ]Dockerのnginxコンテナ内で設定更新する

# 背景

docker-compose でローカル開発している中で、nginxの設定（nginx.conf）を変更した後にコンテナ内部で

```bash:コンテナ内部
service nginx restart
```

したらコンテナが終了してしまった。

# 結論

```bash:コンテナ内部
service nginx reload
```

で対応すると終了しない。restart だとnginxのプロセスが終わるので処理が終わったとみなされるという事かな。
もちろんDockerコンテナ再起動するのが王道。


```bash:ホスト
# 最後のnginxはコンテナ名でなく、サービス名
docker-compose restart nginx
```

でも細かくいろいろやりたい時とかにコンテナ再起動までしたくないケースで使えるかと。

# 再現テスト

```yml:docker-compose.yml
version: '3.7'
services:
  nginx:
    image: nginx
    restart: always
    ports:
      - 8880:80
    container_name: nginx-test
```

```bash:起動
sudo docker-compose up
```

```bash:コンテナログイン
sudo docker exec -it nginx-test bash
```

```bash:コンテナ内部
service nginx restart
```

上記docker-compose.ymlではrestartつけてるのですぐ起動しますが、一旦は終了してコンテナからはログアウトされます。再度コンテナログインが必要です。

```bash:コンテナ内部
service nginx reload
```

今度はコンテナ終了しません。
Pythonの型について演習したい？スターいっぱいのGitHubレポにcontributeしたい？デザインパターンも学びたい？それならこれだ

一発ネタ。誰かがやっちゃうともうこの記事の価値は無くなります。早いもの勝ち。


## まとめ
この GitHub Issue 解決して。
https://github.com/faif/python-patterns/issues/373

- 型のない簡単なPythonプログラムに型をつけるだけ。
- 複雑な機能を持った実用のプログラムではなく、学習用のサンプルコード集。
- スターが2.7万とかある。

## やったらどんないいことあるの？
- Pythonの型についてのいい演習になる。
- デザインパターンについて詳しくもなる。
- スターいっぱいのレポジトリにコントリビュートできる。
  - こんな感じで一覧に表示される。今回行数が多いので一気にメインコントリビュータになれるかも。https://github.com/faif/python-patterns/graphs/contributors
  - フォークしたレポを自分のGitHubアカウントページに飾れるよ。
  - こういうのを評価してくれる採用先なども時々あったりする。
  - 少なくともgit/GitHubの操作は慣れてる人だなとは思われる。
  - よく見ない人だと「有名OSSコントリビュータじゃん！」となる、、、ことはないか。
- 特に「GitHubの使い方に慣れたい」くらいの感じの人におすすめできる

## デザインパターンって何？

1994年に「[オブジェクト指向における再利用のためのデザインパターン](https://www.amazon.co.jp/dp/4797311126)」という超有名な書籍が出た。
この書籍では、オブジェクト指向でデカいプログラム書いてると、こういうパターンにするとうまくいくこと多いよね、というようなパターンが紹介されている。
それでこの書籍で紹介されたパターンのことを、デザインパターンとかあるいは著者たちの愛称であるGoF（ギャングオブフォー）とか呼ばれたりしている。
またそこから転じて、ソフトウェアにおいて頻出の良いパターンのこともデザインパターンと呼ばれることがある。 
~~"デザイン"部分が何を指してるのかは知らない。僕は勝手にそういう固有名詞なのだと思っている。~~ 
英語Wiki　https://en.wikipedia.org/wiki/Design_Patterns
Qiita内の参考になる記事 https://qiita.com/i-tanaka730/items/c63c6c22abd1477e0ba0

## python-patterns についてもう少し詳しく

- https://github.com/faif という人が作った python のデザインパターン・イディオム集。
- 読んだりすることで学びを得てもらうことを目的としている。
- 最初はGoFのデザインパターンのPythonでの実装例を示そうとした。
- そしたらGoFは古い機能の少ない言語だからこういうパターンが示されているだけで、pythonなら標準パッケージのこれで実現すべきじゃねみたいな議論が起きて
- GoFのと一対一対応もしてないし、追加で世の中にあるGoF以外のパターンも追加されたりしている。
- ただGoFベースではあって、正直僕もこれPythonでこういう書き方するのアンチパターンだよな、、、とか思うのもある。
- でも古典としてGoFを学ぶのはPythonエンジニアにとっても無価値ではように思うので、これはこれで良いと思う。


ということでした。
もしPR投げるの不安とか、PR前に見て欲しいとかあればコメントくれれば対応します。
https://github.com/yhay81/python-patterns
このフォークにPR投げたりしてもらっても大丈夫。

（ソフトウェア界隈における日本人の存在感のなさはなんとかできるし、したい、することで未来変わるよという気持ちがいつもあるので、こういう記事書きました。）
[SwiftUI]List化したCoreDataを横スワイプで行削除する方法 

結構調べたけど、日本語の資料がなかったので備忘録として残しておく。

# やりたかったこと

以下のようにCoreDataを参照したリストを横スワイプで削除したかった。
UIの要素だけでなく、元データごと削除する。

![tobe.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178837/52a4baba-c427-e697-f469-e1d8c3f10a62.gif)

よく他のページで見かける以下のような実装だとCoreDataの型が合わず処理がうまくいかない。

```
struct ContentView: View {
    @State private var data = ["one", "two", "three"]
 
    var body: some View {
        List {
            ForEach(data, id: \.self) { data in
                Text(data)
            }
            /// 行削除操作時に呼び出す処理の指定
            .onDelete(perform: rowRemove)
        }
    }
    
    /// 行削除処理
    func rowRemove(offsets: IndexSet) {
        data.remove(atOffsets: offsets)
    }
}
```


# やったこと

## 1.CoreDataが使えるようになっているか以下の設定を確認する。

```
@Environment(\.managedObjectContext) var managedObjectContext
@FetchRequest(
    entity: TestCoreData.entity(),
    sortDescriptors: [
        NSSortDescriptor(keyPath: \TestCoreData.name, ascending: true),
    ]
) var testCoreData: FetchedResults<TestCoreData>
```

## 2.以下のようなリストに対して.onDelete(perform：〜）を追加。

```
List {
    ForEach(testCoreData, id: \.self) { testCoreData in
        Text("Creator: \(testCoreData.creator ?? "Anonymous")")
    }.onDelete(perform: removeCoreData)
}
```

## 3.リストの番号を保持したoffsetsを使って、削除するCoreDataの要素を指定。

```
func removeCoreData(at offsets: IndexSet) {
    for index in offsets {
        let putTestCoreData = testCoreData[index]
        managedObjectContext.delete(putTestCoreData)
    }
}
```


以上！！
CognitoのJWTをNode.js(Typescript)で検証する方法

# JWT検証の実装
```bash
npm i jsonwebtoken jwks-rsa
npm i -D @types/jsonwebtoken
```

```typescript:index.ts
import jwt, { JwtHeader, SigningKeyCallback } from "jsonwebtoken";
import jwksClient from "jwks-rsa";
var client = jwksClient({
  jwksUri:
    "https://cognito-idp.{region}.amazonaws.com/{userPoolId}/.well-known/jwks.json",
});

function getKey(header: JwtHeader, callback: SigningKeyCallback) {
  if (!header.kid) throw new Error("not found kid!");
  client.getSigningKey(header.kid, function (err, key) {
    if (err) throw err;
    callback(null, key.getPublicKey());
  });
}

const token = "{jwtToken}";

jwt.verify(token, getKey, function (err, decoded) {
  if (err) throw err;
  console.log(decoded);
});
```

```bash
npx ts-node index.ts
```

# キャッシュについて
毎回Cognitoのjwksにアクセスしなくて良いように、デフォルトでキャッシュ有効になってます。便利！
https://github.com/auth0/node-jwks-rsa#caching

# AmplifyでのJWTの取り方
```typescript
import { Auth } from "aws-amplify";
.....
const session = await Auth.currentSession()
const jwt = session.getAccessToken().getJwtToken()
console.log(jwt);
```

JWTって`JSON Web Token`の略だから、このメソッド名`Token`被ってない！？
assetsディレクトリの役割

#前提
rubyのバージョン　 ruby　2.6.5
Railsのバージョン Rails　6.0.0

#結論（内容）
複数のディレクトリやファイルに分かれたassetsディレクトリ内のファイルを１つに連結圧縮する機能

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1052793/55b88848-7276-e5c4-e9a9-fcc0813f319d.png)



Ruby on Rails内で使用するファイル、CSSや（Javascript）、画像ファイルを開発作業がしやすいようにファイル分割してコーディングができるようにしつつ、最終的に１つのファイルに連結・圧縮する仕組み

assets内では内容の種類ごとにディレクトリ、ファイルに分割されている理由は開発者にとって何がどこに記載されているか認識させるため


※(JavaScript)
Rails5前とRails6を境にjavascriptのディレクトリの位置が変更

Rails6 app直下
Rails5 assets直下
[GitLab]管理者エリアでの設定

GitLab（オンプレ版）の管理者エリアで設定／変更した箇所の備忘録です。
（随時追加修正予定）

## ラベル

グループやプロジェクト作成時に自動的に追加されるラベルをあらかじめ設定しておきます。

| ラベル名 | 説明 | 色 |
|:-----------|:------------|:------------:|
| bug | 不具合を報告する場合に設定する | <font color="#FF0000">#FF0000</font> |
| close::duplicate | 重複しているためクローズした場合に設定する | <font color="#7F8C8D">#7F8C8D</font> |
| close::invalid | 間違った課題でクローズした場合に設定する | <font color="#7F8C8D">#7F8C8D</font> |
| close::wontfix | 対応しない、却下してクローズした場合に設定する | <font color="#7F8C8D">#7F8C8D</font> |
| discussion | メンバーと話し合いが必要な場合に設定する | <font color="#428BCA">#428BCA</font> |
| documentation | 資料の修正に関する場合に設定する | <font color="#428BCA">#428BCA</font> |
| feature request | 新機能についての提案を行う場合に設定する | <font color="#69D100">#69D100</font> |
| improvement | 機能改善／追加に関する場合に設定する | <font color="#69D100">#69D100</font> |
| priority::high | 優先度が高い場合に設定する | <font color="#EE7800">#EE7800</font> |
| priority::low | 優先度が低い場合に設定する | <font color="#AAFFFF">#AAFFFF</font> |
| question | 質問がある場合に設定する | <font color="#8E44AD">#8E44AD</font> |

## 外観

### Navigation bar

画面上部のナビゲーションバーの一番左端に表示するアイコンの設定です。
会社のロゴを設定します。

### Favicon

ブラウザのタブに表示される小さいアイコンの設定です。
会社のロゴを設定します。

### Sign in/Sign up pages

SSOを設定している場合は一見するとサインインページが無くなるように見えますが、何かしらのエラー等でログインに失敗すると見える事があるので、適宜設定します。

Logoには会社のロゴ（大きいサイズ）を設定します。

## 設定 → 一般

### 可視性とアクセス制御

#### Default branch protection

デフォルトブランチへのPushやMergeの制限を設定します。（グループ単位でも設定できる）
「Fully Protected」を設定します。
→Developer権限の人はデフォルトブランチへのPushができなくなります。

#### Default project(,snippet,group) visibility

新規作成時の可視性の初期設定値です。
全て「内部」を設定します。

#### Restricted visibility levels

新規作成時に使用できない可視性を設定します。
「パブリック」にチェックを付けます。

### サインアップの制限

SSOを利用するので、「Sign-up enabled」のチェックを外します。

### サインインの制限

SSOを利用するので、「Password authentication enabled for web interface」のチェックを外します。

「Enabled OAuth sign-in sources」でSSOのプロバイダにチェックを付けます。

#### After sign-out path

サインアウト先に自社ポータルサイトを設定します。

## 設定 → CI/CD

### 継続的インテグレーションとデプロイ

#### アーティファクトサイズの上限 (MB)

「200」を設定します。（プロジェクト単位でも設定できるので適当で）

#### デフォルトのアーティファクトの有効期限

「1 week」を設定します。
**注意：出荷物やエビデンス（テスト結果）など消えると困る情報は`artifacts: expire_in: never`を忘れずに設定する**

## 設定 → 基本設定

### Pages

「Pages サイトへの公開アクセスを無効にする」にチェックを付けます。

#### Let's Encryptを設定

メールアドレスを設定して、規約に同意します。
zsh: command not found: conda

ターミナルでアナコンダを使用した時に、「zsh: command not found: conda」と言われたので、その対処法を載せておきます。

# 結論

```terminal
/opt/anaconda3/bin/conda init zsh
```

これを打って、バージョンを確認してみてください。

```console
conda --version
```

これでエラーがでなけ出なければターミナルでアナコンダを使うことができます。

もう少し丁寧に知りたい方は、下記の記事を参考にしてください。

[zsh: command not found: conda　エラー](http://www.cardenema.com/?p=68)
学び直し rubyがミニツク編 Part2

今日の教科書
[Rubyがミニツク基礎知識](http://www.minituku.net/courses/566428009/contents/369770655.html)

#基礎知識
##メモ
[変数](http://www.minituku.net/courses/566428009/contents/56900725.html)

 - 変数は宣言なしでも定義できる
 - ローカル変数は小文字のアルファベットか"_"が最初に来る

[ifによる分岐](http://www.minituku.net/courses/566428009/contents/878906600.html)

```
if ＜条件式＞ then
  ＜文＞
end
```
>elsifはそれまでの＜条件式＞の結果が偽であり、そのelsifに指定された＜条件式＞の結果が真の時に処理を実行します。elseはすべての＜条件式＞が偽の時に処理を実行します。

 - Rubyにおける真の値は、「false」と「nil」以外のすべてになる、「0」は真
 - ＜条件式＞がfalseやnilの時は＜文＞は実行されない
 - 他のプログラミング言語と違い、elsifと書く
 - elsifやelseはなくても構わない。また、ifのthenは省略して書くこともできる
 - ifは入れ子にすることもできる

疑似変数：https://docs.ruby-lang.org/ja/latest/doc/spec=2fvariables.html#pseudo

[whileでの繰り返し](http://www.minituku.net/courses/566428009/contents/705141063.html)

```
while ＜条件式＞　do
  ＜文＞
end
```

[メソッド定義](http://www.minituku.net/courses/566428009/contents/486582736.html)

```
def ＜メソッド名＞
  ＜文＞
end
```

 - ＜メソッド名＞には小文字のアルファベットと"_"が使える,メソッド名だけで呼び出せる
 - return文でメソッドの実行を中断して途中で戻り値を返す

```
def example
  val = 1
  while val < 10
    if val == 5
      puts("valが5になった")
    end
    val += 1
  end
end
```

[コマンドラインオプションでの文字コード指定](http://www.minituku.net/courses/566428009/contents/67762284.html)
・プログラムテキストで使っている文字コードとRubyが解釈しようとしている文字コードが対応していないことがある

 - UTF-8のときは-Ku
 - Shift_JISのときは-Ks
 - EUC-JPのときは-Ke
 - NONE（ASCII）のときは-Kn 無指定時はこちら

[演算子・計算順序](http://www.minituku.net/courses/566428009/contents/443379145.html)

 - ==演算子は比較しているオブジェクトが同じであるかを判定してから、結果をtrueもしくはfalseで返す
 - 文字列オブジェクトの「＊」演算子は数値の引数を取ることができる。*演算子を使用すると、文字列オブジェクトの内容を数値オブジェクトの回数だけ繰り返した新しい文字列オブジェクトを作成して返す
JavaScriptのディレクトリ　packsとchannelsの役割

#前提
rubyのバージョン　ruby-2.6.5
Railsのバージョン Rails:6.0.0

#結論（内容）
packs
js全体に指示をかけるディレクトリ
読んで字のごとくパッケージのように全体に指示

channels
特定のjsファイルにおける指示
細かい指示

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1052793/c0f6d498-e495-e373-5a15-a3175d3daefc.png)
セキュリティイベントログで前日のログオン失敗を抽出する(powershell)

### 目的
実行日の前日でイベントID:4625かつキーワードが「失敗の監査」をセキュリティのイベントログから抽出してファイルに書き込む。
セキュリティのイベントログを検索するには実行時に管理者権限が必要。

### コード
```powershell
#当日 0時
$today = ([Datetime](get-date -format "yyyy/MM/dd"))

#前日 0時
$yesterday = $today.adddays(-1)

#日付からファイル名作成
$yesterdaystr = $yesterday.ToString("yyyyMMdd")
$filename = "security-"+$yesterdaystr+".log"

#イベントログ検索
get-eventlog Security -InstanceId 4625 -EntryType FailureAudit -After $yesterday -Before $today | Format-List > $filename
```
【Ruby初学者】日付/曜日をたった４行で出す方法

##某スクールのRuby問題を解いた備忘録。


```Ruby:test.rb
now = Time.new
puts "現在は西暦#{now.year}年#{now.month}月#{now.day}日"
week = ["日","月","火","水","木","金","土"]
puts week[now.wday] + '曜日です' 
```

と、記述しLinuxで実行すると

```Ruby:test.rb
% ruby test.rb
現在は西暦2021年1月28日
木曜日です
```
となる。

ちなみに、railsのアプリケーションで表示するときには、
コントーラーファイルで、インスタンス変数を定義して、

```Ruby:controller.rb
def index
   wd = ["日", "月", "火", "水", "木", "金", "土"]
   time = Time.now
   @date = time.strftime("%Y/%m/%d(#{wd[time.wday]})")
   ampm = time.hour < 12 ? "AM" : "PM"
   @time =time.strftime("#{ampm} %I:%M")
end
```

ビューファイルに、コードを埋め込む。

```Ruby:view.rb
  <div class = "date"><%= @date %></div>
  <div class = "time"><%= @time %></div>
```

ブラウザで表示されるのは、こんな感じ。

 ![Qiita](https://user-images.githubusercontent.com/70472160/106084423-b1582d00-6161-11eb-8c11-690d928cb686.png "Qiita")


##参考記事

[Ruby入門] 14. 日付と時刻を扱う（全パターン網羅）/@prgseekさま
https://qiita.com/prgseek/items/c0fc2ffc8e1736348486
【Node.js】Lambdaでタイムアウト指定できるfetch

## request-promiseは非推奨ですよって話
`request-promise`に依存している`request`パッケージが非推奨になったことから芋づる式に影響するみたいです。
https://github.com/request/request/issues/3142



## fetch使おう
以下のパッケージで`fetch`を使います
https://www.npmjs.com/package/node-fetch

## タイムアウトするためのざっくりとした流れ
`AbortController`という非同期処理を中断させるインターフェースを使用します。

タイムアウトさせたい非同期処理に`AbortController`インスタンスの`signal`を渡して、`setTimeout()`で指定時間に`abort()`を外から呼ぶことで中断させるといった感じです。（Goの`context`と似てますね）


## サンプルうまくいかない問題
[README](https://github.com/node-fetch/node-fetch#request-cancellation-with-abortsignal)の通りLambdaで動かしてみましたが、うまく`abort()`が動きませんでした。

npmのサイトには以下のようにバージョンは`>= v8.0.0`とあったので、Lambda(`nodejs12.x`)でもいけると思ったんですが、、

> NOTE: You may cancel streamed requests only on Node >= v8.0.0


```javascript
const AbortController = require('abort-controller');
const controller = new AbortController();
const timeout = setTimeout(() => {
	controller.abort(); // ここが空になる
}, 150);


try {
	const response = await fetch('https://example.com', {signal: controller.signal});
	const data = await response.json();
} catch (error) {
    // errorが空で返るのでAbortErrorを判定できない
	if (error instanceof fetch.AbortError) {
		console.log('request was aborted');
	}
} finally {
	clearTimeout(timeout);
}
```

## 最終的にLambdaで動いたタイムアウト指定できるfetch
以下のパッケージで生成した`AbortController`が動きました
https://www.npmjs.com/package/node-abort-controller

```javascript
async function postWithTimeout(url, body, ms) {
  const fetch = require("node-fetch");
  const AbortController = require("node-abort-controller");

  const controller = new AbortController();
  const timeout = setTimeout(() => {
    controller.abort();
  }, ms);

  const options = {
    method: "post",
    headers: {
      "Content-Type": "application/json",
    },
    body: JSON.stringify(body),
    signal: controller.signal, // シグナルを渡しておく
  };

  try {
    const response = await fetch(url, options);
    const body = await response.json();
    return JSON.stringify(body);
  } catch (error) {
    if (error.type == "aborted") {
      console.log("the user aborted a request");
      throw new Error(JSON.stringify({ type: "abort" }));
    }

    throw new Error(JSON.stringify({ type: "other" }));
  } finally {
    clearTimeout(timeout);
  }
}

```

## まとめ
`request-promise`からの切り替えをお考えのあなたに向けたfetchな記事になれば幸いです
「is not defined」　jQuery導入時のエラーの解消例

#前提
・jQueryをインストールしていること
（インストールついての詳細はjQueryの公式ページにて確認。）

・筆者が使用しているバージョンの詳細
jQueryのバージョン　"jquery": "^3.5.1"
  rubyのバージョン　ruby-2.6.5
 Railsのバージョン  Rails:6.0.0

・表題のエラーが起きる理由はケースバイケースで、今回のケースはあくまでも例の１つ。

「is not defined」のエラー例とその解消の詳細がわかりやすく書いてあるサイト↓
https://for-someone.com/blog/4792/



#結論
自身の記述内容のjQueryのバージョンと、インストールしていたjQueryのバージョンに差異が、「is not defined」のエラーの原因。
→インストールしたバージョンのjQueryのscriptをviewのhead内にコピペで置き換えることでエラー解消できる。

#エラー画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1052793/103c8292-6ee5-a643-fdcb-0dd9cc89dce2.png)



#エラーが起こるまでの経緯
フォロー機能を実装するにあたり、jQueryを使用するため公式ページに沿ってjQueryをインストールした。
↓
コーディング完了し、挙動確認する際、フォーローのカウントが実装できていることを確認
↓
しかし、フォローボタンをクリックするタイミングで色が変色するよう発火の記述をしていたが変色しない。
↓
ブラウザを更新するとボタンの色が変色する
↓
コンソールを開き、挙動確認すると、「is not defined」のエラーが起こる


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1052793/4b42ed9e-8ef2-33de-5f46-622e3d2e66de.png)
↓（ブラウザ更新しないと変色できない）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1052793/b168fd9e-b7cf-a539-f599-6c94b0dca533.png)





#エラー解消方法
①jQueryのバージョンの確認はpackage.jsonで確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1052793/8f56bbe2-aedc-d3de-118d-a5b29d862ecf.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1052793/1efbc23b-4480-9944-d475-2a9d3ec444fd.png)


②「jQueryのバージョン script」ブラウザ上で検索

③サイト内の適したjQueryのバージョンのscriptをコピー

④自身のviewのhead内にペースト
（筆者はapp/view/layouts/application.html.erbのhead内に記述）

⑤挙動確認→OK

#まとめ
インストールしたバージョンのjQueryのscriptをviewのhead内にコピペで置き換えることでエラー解消
Bash で set -u しているときに変数が定義されているかどうかをチェックする

Bash で変数が定義されているかどうかを確認するときは `-n` や `-z` を使う。

``` sh
if [ -z "${FOO}" ]; then
  # FOO が未定義時の処理
fi
```

しかし `set -u` しているときは使えない。

``` sh
set -u

if [ -z "${FOO}" ]; then
  # FOO が未定義時の処理
fi
```

```
FOO: unbound variable
```

Bash v4 以上であれば `-v` が使えるらしい。
参考： [set \-uしてるときに変数が定義されてるかチェックする \- Qiita](https://qiita.com/tadsan/items/0109d651780844acce09)

``` sh
if [[ ! -v FOO ]]; then
  # FOO が未定義時の処理
fi
```

しかし macOS (Bug Sur 時点) に入っている Bash は v3 なので、この方法は使えない。

Bash v3 以下では、デフォルト値を使って工夫すれば以下のように書くことで実現できる。
参考: [Bash v3 以下でも set \-u 時に変数が定義されてるか確認する方法 / マスタカの ChangeLog メモ](https://masutaka.net/chalow/2018-10-15-1.html)

``` sh
if [ -z "${FOO:-}" ]; then
  # FOO が未定義時の処理
fi
```
spring-bootのDynamicPropertyRegistryでtest時に動的にプロパティ変更


```properties:src/main/resources/application.properties
sample.value=sample
```

```java
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.DynamicPropertyRegistry;
import org.springframework.test.context.DynamicPropertySource;

@SpringBootTest
class DynamicPropertySourceTest {
	
    @DynamicPropertySource
    static void registerProperties(DynamicPropertyRegistry registry) {
    	registry.add("sample.value", () -> "dynamic sample value.");
    }

    @Value("${sample.value}")
    String value;
    
	@Test
	void test() {
		System.out.println(value); //dynamic sample value.と表示
	}

}

```

これの主な使いどころは、ユニットテストの外部で起動するものに依存する場合に使用する。たとえば、 https://www.baeldung.com/spring-dynamicpropertysource にあるとおり[Testcontainers](https://www.testcontainers.org/)との組み合わせで用いる。dockerで起動したコンテナからポートとかJDBC URLとかを取得してspring-bootのプロパティとして指定する。
Swiftのジェネリクス関数について

# はじめに
可読性を意識し始めるとまず一つの階層にコードを少なく書くように意識し始めると思います。
そうなると必然的に関数を使ってコードをきれいに書こうという思考になります。（きっと多分みんなそう...だよね？）
次に出てくるのが同じような関数めちゃくちゃあるやんわかりずらってなると思います。
そんな時に登場するのが**ジェネリクス**だと思います。
今回はそのジェネリクスについてお話ししていきたいと思います。
余談ですが最初私はジェネリックっと行ってました。薬かよってな。😅

## ジェネリクスとは何か
ジェネリクスとは、型をパラメータとしてプログラムを記述する為の機能です。
しっくり来ないと思います。多分私もこれだけ見るとわからん。
多分コード見たほうが早いと思います**汎用的に扱えるようにする物**って認識で大丈夫です。


## 利用シーン
利用シーンとしてはよく汎用的な関数を定義したりします。
それではコードを見てみましょう。

### これまでのコード

```swift:hoge.swift
//これまではこのように　同じようなメソッドで型だけ違う場合下記のように書いていた
func hoge(a:Int, b: Int)->(a1:Int,b1:Int){
    return (a,b)
}
func huga(a:String, b: String)->(a1:String,b1:String){
    return (a,b)
}
print(hoge(a: 1, b: 2)) // (a1: 1, b1: 2)
print(huga(a: "1", b: "2")) // (a1: "1", b1: "2")
```

### ジェネリクスのコード
```swift:hoge.swift
//上記のように同じようなメソッドを書くのはクラスの肥大化に繋がる為同じような物はジェネリクスを使って一まとめにしちゃおうという話が下記
//ジェネリックを使った型推論の関数
func hogehoge<T>(a: T, b: T) -> (a1:T, b1:T){
    return (a,b)
}
//型推論してるんで複数の型で指定できないことが注意
//例:hogehoge(a: 1, b: "2") <- これはダメ
print(hogehoge(a: 1, b: 2)) // (a1: 1, b1: 2)
print(hogehoge(a: "1", b: "2")) // (a1: "1", b1: "2")
```
## コード説明
まず右記`<T>`のこれ。え？なにこれって感じですよね。
これは正式には**型パラメータ**っていう物です。
`<>`この中ですが今回は`T`ですがこれはみんなとりあえずこれ書いてるだけでこれじゃないとダメなわけではないです。
その為`<TOTORO>`だったり`<hogeeeee>`でもなんでも良いということです。
型パラメータの文字はなんでも良いと言いましたが型パラメータを決めたら下記のようにその文字をちゃんと型推論するところに使ってください。

```swift:hoge.swift
//ジェネリックを使った型推論の関数
func hogehoge<hogeeeee>(a: hogeeeee, b: hogeeeee) -> (a1:hogeeeee, b1:hogeeeee){
    return (a,b)
}
```

型パラメータくらいしか説明するのないですね...
# 終わりに
今回はジェネリクスのなかの**ジェネリクス関数**についての説明になりました。
今回は説明しなかった型パラメータの制約などまだまだ話すことはたくさんありますが一旦はここまでで。
ここまでご視聴いただきありがとうございます。
Date Range Picker の月タイトルが月年になっているのを年月にしたい

#背景
javascript で日付の期間を選択できる良いライブラリが無いか探していたところ、Date Range Picker がとても優れていた。日本語化もできるが、一点だけできなかったのが月ヘッダーの年月が月年になっていたところ。そこで、無理やり年月に変更する。

変更後画像
![スクリーンショット 2021-01-28 11.48.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55137/59bcfbae-3b4d-15d1-ddc8-075dcb45bce1.png)



```javascript
$('.daterange').on('showCalendar.daterangepicker', function(ev, picker) {
  $('.daterangepicker .month').each(function() {
    var month_year;
    month_year = $(this).text().split(' ');
    $(this).text(month_year[1] + '年 ' + month_year[0]);
  });
});



```
jupyterでpythonの配列をprintしたときにカンマがないことがある理由

jupyterでpythonの配列をprintしたとき、ndarray型はカンマ区切りが無く、list型はカンマ区切りで表示されます。
![Screenshot from 2021-01-28 11-45-56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700770/397d40ee-2c26-c9b2-3bc8-2a8619f5e79d.png)
Raspberry Pi 4B にWindows10ARMを入れて SSDからブート

いつもお世話になっています

Raspberry Pi 4B に Windows 10 arm64 をインストールする記事はいろいろあるのですが
USB経由のSSDから起動することに成功しましたので、ポイントだけ紹介したいと思います

１．SATAーUSB変換には 玄人志向GW2.5CR-U3 [HDDケース 2.5型SATA] を使いました

２．インストールに使用する　UUP dump　のバージョンは
　　Feature update to Windows 10, version 20H2 (19042.330) arm64
　　を使いました

この２点です

２月９日追記です
Raspberry Pi OS で、ファームウェアを最新にすると Logitec LMD-SPA240U3 から
ブートできました
只今、CPUクロックを１８００MHｚに設定し、メモリー制限無しでインストール中ですが
何回か再起動しながらログインするところまでいけました
新しいファームウェアでCPUクロックをMAXに設定すると２２００MHｚになってしまいます

２月１０日追記です
昨日 Logitec LMD-SPA240U3 でのインストールを失敗したのですが
ラズパイのUSB2.0 に Logitec LMD-SPA240U3 を接続すると
３０分くらいかかりましたが、簡単にセットアップができました
セットアップ終了後、CPUクロックを１８００MHｚに設定し、メモリー制限無しで
遅いなりにも待てば動いています

SSDでも遅いです
実用的ではありません
Windowsのライセンスが必要です

それでもWindows １０ arm64を使いたい人は、自己責任でお願いします


 Feature update to Windows 10, version 20H2 (19042.330) arm64　のダウンロードは
https://uupdump.ml/ から
![無題13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1061326/cdab9e4c-8848-7d28-e666-299f80b7dd4d.png)

「20H2」を選択します
![無題14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1061326/6b577e18-7c58-83d8-8aa7-d9a7f600a97b.png)

下までスクロールすると
![無題15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1061326/c08bbde8-9312-c771-bdb7-4e069c57a142.png)

Feature update to Windows 10, version 20H2 (19042.330) arm64　がありますので
選択してください

あとの手順は　https://qiita.com/mkht/items/9d173334dc5b26bfef46　を参考にしてください



ISOファイルができたら　Windows on Raspberry　を使ってSSDに書き込むのですが
失敗することがあります

![無題9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1061326/2b8ce91d-e36d-b1e3-d1c7-f66dc3e5405a.png)
その場合、以下のようなことを試してみました

１．Windows on Raspberryを実行するとき「管理者として実行」を試してみてください
![無題12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1061326/6ad57765-c538-5ebf-aca9-4613e499bb9c.png)
背後のエクスプローラーはインストールが成功するまで終了しないでください
インストール作業中にWoRが、SSDのパーティション作成とフォーマットを行うのでWindowsというドライブとBOOTというドライブが作成され、そのドライブにインストールファイルが書き込まれていきます

２．WoRの設定タブでパーティション構成のところを　Master　Boot　Record（MBR)　を選択してください
初期値はMBRです
USBブート、SSDを使用する場合GPTを選択ような説明がありますが
私はMBRを選択しました
![無題6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1061326/632b6efa-5706-9576-ca10-bdb6f1e508fa.png)

ちなみに　Feature update to Windows 10, version 20H2 (19042.746) arm64　ではブートしますが、ガードがかかっているようでセットアップできませんでした

以上です

この続きは　https://qiita.com/jibri/items/73afe1f3bf75fcb9d163

参考サイト：
https://qiita.com/mkht/items/9d173334dc5b26bfef46
http://www.jk1ewy.sakura.ne.jp/raspberrypi/win10/raspberrypi4win10-0.htm
【Azure Cognitive Searchで始めるTwitter分析】Part3. Power BI レポートの作成

#はじめに

この記事は[Part1. 検索インデックスの作成](https://qiita.com/omiyu/private/7fa6cf49652a894cedb8)、[Part2. デモアプリの作成](https://qiita.com/omiyu/private/0605942b1cde1adb7481) の続きです。
まだ見ていない方は、遡って見ていただければと思います。

↓ 今回は下図のようなPower BI レポートの作成手順についてまとめていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/8048072a-a022-cd18-940d-9705c34b7ab2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/2ea2e255-9538-8113-479a-f14706de048c.png)
#手順

「スキルセット」を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/7087c01d-7027-5acf-f7d4-373a5f1957b0.png)


「ナレッジストア」タブを開きます。
「Power BIテンプレートを取得する」からテンプレートをダウンロードすることができます。
「Power BIパラメーターのコピー」の情報は、後ほどテンプレートに接続する際に使用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/b5a58a76-93ae-531d-3f86-a67b3634e7f7.png)

Power BI Desktopを開きます。
「ファイル」→「インポート」→「Power BI テンプレート」をクリックし、ダウンロードしたテンプレートを選択し開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/3776ef3d-5e27-ed8c-7d98-8c4525b28a12.png)

先程ポータル上で確認した「Power BIパラメーターのコピー」の情報を入力後、「作成」を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/87854cfa-04f1-c613-d7ce-54e9f59842ad.png)


アクセスキーを要求された場合は以下の手順でキーを取得し、入力します。
[ストレージアカウント](https://portal.azure.com/#blade/HubsExtension/BrowseResource/resourceType/Microsoft.Storage%2FStorageAccounts)を開き、使っているストレージアカウントに移動→「アクセスキー」→「キーの表示」で表示されたkey1を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/ef62cfb3-d7a7-9e45-930e-329e12ed74f5.png)


しばらく待つとレポートが表示されます！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/814abeec-03b0-9db3-4fc6-e67374c5392a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/db70dd75-ed8d-5ca0-828c-07437cc5bf1f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/4d8e1be2-ee0b-45ee-01eb-a433c0450535.png)

#おわりに
今回はPower BIテンプレートをナレッジストアに接続し、ツイートの分析結果を可視化しました。
[Part1. 検索インデックスの作成](https://qiita.com/omiyu/private/7fa6cf49652a894cedb8) で分析した結果が、多種多様なビジュアルで見られて面白かったです。
これを [Part2. デモアプリの作成](https://qiita.com/omiyu/private/0605942b1cde1adb7481) で作成したアプリと組み合わせるなどすると、より高度な検索アプリが出来そうです。
#参考リンク
https://docs.microsoft.com/ja-jp/azure/search/knowledge-store-connect-power-bi
【Azure Cognitive Searchで始めるTwitter分析】Part2. デモアプリの作成

#はじめに
この記事は[Part1. 検索インデックスの作成](https://qiita.com/omiyu/private/7fa6cf49652a894cedb8) の続きです。

今回は下図のようなデモアプリの作成手順についてまとめていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/eef3ac9c-9844-6ccf-7444-0e76b2b72f01.png)

#手順

Azure Portalにログインし [Search Service](https://portal.azure.com/#blade/HubsExtension/BrowseResource/resourceType/Microsoft.Search%2FsearchServices) を開いたら、「インデックス」に移動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/43679bce-cf8a-eef7-0524-43b7cfa85d33.png)

「デモアプリの作成」を押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/0830762a-7311-b21a-1cc7-44329d6c4f49.png)

「CORSを有効にする」にチェックを入れ、「デモアプリの作成」を押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/a39714ec-bb9f-8d4e-6dcb-9ee32a78cd42.png)




検索結果の表示をカスタマイズします。

「縮小版」：サムネイル画像を選択します。今回は画像データを使用していないため無視します。
「タイトル」：タイトルを選択します。今回はユーザーネームを使用します。
「説明」：タイトルの下に表示するものを選択します。今回はツイート本文を使用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/63fcffef-8d98-a650-ab5e-d9ae15494cd3.png)


インデックス作成時、「フィルター可能」「ファセット可能」の両方にチェックを入れた項目がデフォルトでサイドバーに構成されます。
「デモアプリの作成」をクリックすると、HTMLファイルが生成されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/9d9f3be1-6ca9-ef25-51fa-850d96060f75.png)

HTMLファイルを開くとデモアプリの初期画面が表示されます。
上部の検索ボタンをクリックするとサイドバーと一覧が表示されます。

サイドバーで絞り込み検索ができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/eef3ac9c-9844-6ccf-7444-0e76b2b72f01.png)


次に、「緊急事態宣言」で検索してみます。
検索するキーワードを上部の検索ボックスに入力し、検索ボタンをクリックします。
下図のように、表示される結果が変わります。
512ツイート中18個に「緊急事態宣言」というキーワードが含まれていることが分かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/be94d2a2-aa9d-2491-6f80-cd1b6ca80425.png)




#おわりに


今回はAzure Cognitive Search を使用して、デモアプリを作ってみました。
[次回](https://qiita.com/omiyu/private/e32b50ee2f5f944c0ded)はPower BI テンプレートを使用し、ナレッジストアを接続して感情分析・キーフレーズ抽出などの分析結果を可視化していきます。
数ステップでとてもグラフィカルなレポートが作成できますので、宜しければそちらも併せてご覧ください。

次回：[Part3. Power BI レポートの作成](https://qiita.com/omiyu/private/e32b50ee2f5f944c0ded)

#参考リンク
https://docs.microsoft.com/ja-jp/azure/search/search-create-app-portal
【Windows】Nodeインストール手順の備忘録

#はじめに
- Windows環境上で、Nodeの開発環境を構築する機会があったので、その備忘録です。
- Nodeの管理ツールとして、nvm for windowsを使用しました。

# nvm for windowsのインストール
- nvm for windowsのインストーラを[ダウンロード](https://github.com/coreybutler/nvm-windows/releases)し、インストールします（全てデフォルト設定でOK）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477950/a607eb60-7014-7025-2b6c-190272c3e1a6.png)

# Node.jsのインストール
- コマンドプロンプトを起動し、インストール可能なバージョンを確認します。

```sh:cmd
# インストール可能なバージョンを表示
$ nvm list available
```
![WS000000.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477950/19b06a0d-e314-a376-b48e-d1451213d322.jpeg)

- バージョンを指定して、インストールします。

```sh:cmd
# v10.16.2をインストール
$ nvm install 10.16.2
$ node --vesion
# v10.16.2
```

- 使用中のバージョンを確認します。

```sh:cmd
$ nvm list
# *10.16.2
```

- 別バージョンをインストールします。

```sh:cmd
# v12.13.1をインストール
$ nvm install 12.13.1
```

- インストール済みバージョンを確認します。

```sh:cmd
$ nvm list
#   12.13.1
#  *10.16.2
# ⇒ v10.16.2を使用中
```

- バージョンを切り替えます。

```sh:cmd
# バージョン指定
$ nvm use 12.13.1
$ nvm list
#  *12.13.1
#   10.16.2
$ node  --version
# v12.13.1
```
【iOS】AppStoreアプリ申請したらReject(リジェクト)された話【Metadata Rejected】


#はじめに
今回Flutterで開発し、すでにGoogle Playでリリースした情報処理試験問題集アプリをAppStoreでもリリース申請をした所
リジェクトされてしまったので、その対処法を記載していきたいと思います。

#Apple様からのRejectメール
>Your app subtitle to be displayed on the App Store include references to the price of your app or the service it provides, which is not considered a part of these metadata items.

>- 無料の情報処理試験問題集アプリ

>Next Steps

>To resolve this issue, please remove any references to pricing from your app’s subtitle, including any references to your app or service being free or discounted. If you would like to advertise changes to your app’s price, consider including this information in the app description. Changes to your app’s price can be made in the Pricing and Availability section of App Store Connect.

>Resources

>For information on how to revise your app name, please review Renaming a Project or App.

>For resources on metadata best practices, you may want to review the App Store Product Page information available on the Apple Developer website.

>For information on scheduling price tier changes, please review the Schedule price changes section of App Store Connect Developer Help.



>Since your App Store Connect status is Metadata Rejected, we do NOT require a new binary. To revise the metadata, visit App Store Connect to select your app and revise the desired metadata values. Once you’ve completed all changes, reply to this message in Resolution Center and we will continue the review.

朝起きてメールチェックしたら上記のようなメールが届いていました。
その後App Store Connectに移動してアプリの状況を見てみると下記のような感じになってます。![スクリーンショット 2021-01-28 11.03.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329865/9d35ad78-69c0-3c7e-6048-d36ff3221ec7.png)

#リジェクト指摘内容

>Your app subtitle to be displayed on the App Store include references to the price of your app or the service it provides, which is not considered a part of these metadata items.

>- 無料の情報処理試験問題集アプリ

どうやらサブタイトルにアプリの価格に関する言及がされていた所が問題になったようです。
今回はサブタイトルだけ修正したら、再度レビューをしてくれるようですね。

#修正後の手順について
調べてみるとリジェクトの内容にはバイナリ却下とメタデータ却下があるようで、バイナリ却下の場合、再度ipaファイル等上げ直さないといけないようです。

>Since your App Store Connect status is Metadata Rejected, we do NOT require a new binary. To revise the metadata, visit App Store Connect to select your app and revise the desired metadata values. Once you’ve completed all changes, reply to this message in Resolution Center and we will continue the review.

今回私が却下されたのは、上記の通りメタデータリジェクトだったので、上げ直す必要はないようです。
また、変更が完了したらメールで変更完了の旨お伝えすれば審査を再開してくれるとのことで**再審査に提出ボタン**を押す必要はないみたいですね！

#おわりに
Android版でGoogle Playにリリースした時は申請してから２〜３日でステータスが審査完了に変わってました。
iOSのほうが審査がいくらか厳しいとは聞いていましたが、前日の夕方に申請してから翌日朝には修正依頼のメールが来るスピード感はすごいなと思いました。
Ubuntu18.04とRTX3090搭載のマシンにpyenvをインストールし、pytorchを動かす方法

# 環境
OS : Ubuntu 18.04
GPU : RTX3090
CUDA : 11.1
cuDNN :  8.04

# 含まれる内容
- 起こったこと
- 順次インストールと対応方法の記録

# 起こったこと
以下の2点でつまづいた。

- pyenvへのpythonのインストール時のbuildエラー
- pytorch実行時のエラー

# 順次インストールと対応方法の記録

pyenvのインストールや上記それぞれのエラー対応方法は以下の通り。

###pyenv のインストール
```bash
$ git clone https://github.com/yyuu/pyenv.git ~/.pyenv
```
vimを使ってbash_profileを編集する
bash_profileが何か、については以下を参照
[.bash_profile ? .bashrc ? いろいろあるけどこいつらなにもの？](https://qiita.com/hirokishirai/items/5a529c8395c4b336bf31)

```bash
$ vim ~/.bash_profile
```
以下を追記

```bash
export PYENV_ROOT=$HOME/.pyenv
export PATH=$PYENV_ROOT/bin:$PATH
eval "$(pyenv init -)"
```

以下でbash_profileの保存

```bash
$ source ~/.bash_profile
```
正しくをインストールされているかを確認するには

```bash
$ which pyenv
```
を実行し、

```bash
/home/{USERNAME}/.pyenv/bin/pyenv
```
のようにかえってくれば正しくインストールされている

###pyenv-virtualenv のインストール

```bash
$ git clone https://github.com/yyuu/pyenv-virtualenv.git ~/.pyenv/plugins/pyenv-virtualenv
```

vimを使ってbash_profileを編集する

```bash
$ vim ~/.bash_profile
```
以下を追記

```bash
eval "$(pyenv virtualenv-init -)"
```

以下でbash_profileの保存

```bash
$ source ~/.bash_profile
```

###pyenvへのpythonのインストール

以下のようにインストール可能なpythonのリストを確認し、

```bash
$ pyenv install --list
```

以下でインストールしようとした。

```bash
$ pyenv install 3.9.1
```

BUILD FAILEDのエラーが確認された。
以下のようにいくつかのライブラリを追加。

```bash
$ sudo apt install -y build-essential libbz2-dev libdb-dev \
  libreadline-dev libffi-dev libgdbm-dev liblzma-dev \
  libncursesw5-dev libsqlite3-dev libssl-dev \
  zlib1g-dev uuid-dev tk-dev
```

上記追加後、再実行

```bash
$ pyenv install 3.9.1
```

解決した。

###pytorch実行時のエラー

以下で新しい環境```newenv```の作成

```bash
$ pyenv virtualenv 3.9.1 newenv
```

以下で```newenv```の有効化

```bash
$ pyenv local newenv
```

以下のようにtorchとtorchvisionのインストールを行なった

```bash
$ pip install torch==1.7.1
$ pip install torchvision=0.8.2
```

インストール後、GPUを使った学習を行おうとしたところ、以下のようなエラーメッセージが出現した。

```bash
GeForce RTX 3090 with CUDA capability sm_86 is not compatible with the current PyTorch installation.
The current PyTorch install supports CUDA capabilities sm_37 sm_50 sm_60 sm_70 sm_75.
```

以下のようにいくつかのライブラリを追加し解決した。
追加するライブラリについては[pytorchの公式サイト](https://pytorch.org/get-started/locally/)で環境を選択し、取得する

```bash
$ pip uninstall torch
$ pip uninstall torchvision
$ pip install torch==1.7.1+cu110 torchvision==0.8.2+cu110 torchaudio===0.7.2 -f https://download.pytorch.org/whl/torch_stable.html
```

ちなみに上記をrequirements.txtに加える場合は以下の通り

```requirements.txt
-f https://download.pytorch.org/whl/torch_stable.html
torch==1.7.1+cu110
-f https://download.pytorch.org/whl/torch_stable.html
torchvision==0.8.2+cu110
-f https://download.pytorch.org/whl/torch_stable.html
torchaudio===0.7.2
```
LaravelのFormRequestでJsonStringをValidateする

# 前提

Form の submit で POST を投げるのと同時に付加情報として Form データ以外の情報を JsonString の形でを追加して送る必要があったので、調べました。

Postするときの`Content-type`が`application/x-www-form-urlencoded`でそこにJsonStringを付加する場合なので、最初から`Content-type`が`application/json`で送信する場合は、この対応は不要でふつうにドット記法でバリデーションできると思います。

# 実装

## Blade側
Javascriptで送信前にObjというデータをJSON化して、hiddenパラメータのjsonとして付加してSubmitします。

```javascript

    <form action="{{ route('hoge.store') }}" method="post" id="form-hoge">
        {{ Form::hidden('json', null) }} // 追加
        ...
        {{ Form::text('id', null, ['class' => 'form-control']) }}
        ...
    </form>
```


```javascript
@section('script')
<script type="module">

    ...

    // submit 前に json にデータを突っ込んで送信する
    $('#form-hoge').submit(function() {
        // 送りたいデータ
        const obj = {
            'hoge1': [
                 { 'key': 'hoge1-1', 'value': 'hoge1-1-1' },
                 { 'key': 'hoge1-2', 'value': 'hoge1-2-1' },
            ],
            'hoge2': 'hoge2-2',
            ...
        };
        $('input[name=json]').val(JSON.stringify(obj));
        return true;
    })

    ...

</script>
@endsection
```



## FormRequest側
キモは`getValidatorInstance`で、ここで JsonString を配列化し、`data_array`という名前で FormRequest にセットします。`rules`での判定実装はセットした`data_array`に対しておこないます。

```php
<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Contracts\Validation\Validator;
use Illuminate\Validation\Rule;

class HogePost extends FormRequest
{
    ...

    // この getValidatorInstance を override する
    protected function getValidatorInstance(): Validator
    {
        $json = $this->request->get('json');
        $this->merge(['data_array' => $json_decode($json, true)]);

        return parent::getValidatorInstance();
    }

    ...

    public function rules()
    {
        return [
            'id' => ['required', 'integer'],
            //　json に Json が入ってくるかの Validation も必要
            'json' => ['required', 'json' ],
            // こういう感じで Jsonの 中身も Validate が簡単にかける
            'data_array.hoge1.*.key' => ['required', 'string', 'max:50'],
            'data_array.hoge1.*.value' => ['required', 'string', 'max:256'],
            'data_array.hoge2' => ['required', 'string', 'max:10'],
            ...
        ];
    }

    ...
```

## Controller側
最後に引数にFormRequestを渡し、バリデーションの実行を行います。

```php
    public function store(HogePost $request)
    {
        // バリデーションの実行
        $validated = $request->validated();

        return ...
    }
```

#参考
https://laracasts.com/discuss/channels/laravel/form-request-validation-for-json-parameter