OmniAICreator/Qiita-1.07M huggingface dataset:
AWS SAAの次はAWS DVAを目指してみよう。

#【AWS SAAの次はAWS DVAを目指してみよう。】

入社以来、通勤時間を少しでも有効に使うために資格の勉強をしています。
今後は、AWS DVAの勉強をしようと思ったので自分のメモとして残します。
AWSの開発者としての知識を付けるためにも頑張ろう。

Udemy [AWS 認定デベロッパー アソシエイト模擬試験問題集（5回分325問）](https://www.udemy.com/course/aws-31955/)

##DVA合格に向けて、押さえておこうと思っているサービス

###AWS CodeBuild
フルマネージド型の継続的インテグレーションサービス
ソースコードをコンパイルし、テストを実行し、デプロイ可能なソフトウェアパッケージを作成可能。

###AWS CodeCommit
プライベートGitリポジトリとして、フルマネージドのソースコントロールサービス
Gitリポジトリを簡単にホスティングすることが可能。

###AWS CodeDeploy
インスタンスへのコードのデプロイを自動化することで、
デプロイにおけるダウンタイムを最小化するサービス

###AWS CodePipeline
アプリケーションの更新において、スピードと信頼性を維持する継続的デリバリーサービス

###Amazon Kinesis
動画やログデータなどのストリーミングデータを収集、処理、分析するためのプラットフォーム
ストリーミングデータの読み込みと分析を簡略化することが可能

###Amazon Kinesis Data Streams
大規模でスケーラブルなリアルタイムのデータストリーミングサービス
1時間に数十万のソースからの数テラバイトのデータを継続的にキャプチャや保存が可能

###Amazon Kinesis Data Firehose
ストリーミングデータの読み込み用のフルマネージドサービス
Amazon S3、Redshiftにストリーミングデータをキャプチャし、自動的に収集するETLサービス
既存のBIツールとダッシーボードでほぼリアルタイムに分析することが可能
データのスループットに合わせ自動的にスケールし、継続的な管理作業は不要

###Amazon Inspector
アプリケーションのセキュリティとコンプライアンスを向上させるために自動化されたセキュリティ評価サービス
自動的にアプリケーションを評価し、脆弱性やベストプラクティスからの逸脱を判定する。
修復に必要なステップを優先順位に従って、リスト化したものを含む詳細なレポートを作成する。

###Amazon GuardDuty
未然にセキュリティの脅威を検出し、継続的にモニタリングするセキュリティサービス
予期しないアクティビティや潜在的に不正なアクティビティなどの悪意のあるアクティビティを識別可能

###AWS Data Pipeline
AWSの異なるサービス間やオンプレミスのデータソース間でデータの移動を信頼性高く実行できるサービス

###AWS Glue
完全マネージド型の抽出、変換、ロード（ETL）サービス
データを検出し、ソースをターゲットに変換するためのスクリプトを開発する。
サーバーレス環境でETLジョブをスケジュールして実行可能

##おわりに。

AWS DVAを受験するにあたり、必要な知識のアドバイスなど頂けると嬉しいです。
今後、追記していこうと思います。
Iphone5/IphoneSE/Galaxy Foldのレスポンシブ対応でつまずかないためにheadに記載すること

#はじめに
web制作で、Iphone5・SE/Galaxy Foldといった機種へレスポンシブ対応することに悩んでいた。
Iphone5・SEなら画面幅が320px、Galaxy Foldなら280px。デバイス幅が狭く、どうしてもレイアウトが崩れてしまっていた。メディアクエリを用いてmax-widthで制御したり、mixinでIphone5用の関数を作成したりして対応していた。これらの問題を、head内にコードを書くことによって解決する方法を書きます。

#解決策
```
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="https://cdn.jsdelivr.net/npm/viewport-extra@1.0.3/dist/viewport-extra.min.js"></script>
<script>new ViewportExtra(任意)</script>
```
head内に上の3行を付け加える。各行について軽く説明をする。
###1行目
1行目は仮想的なviewportを作成してくれる。レスポンシブ対応させる時は書いておいた方がいい。
詳しく知りたい方はソースをコピペして検索すれば詳しい記事がたくさんでてくる。
###2行目
2行目はjsdelivrのCDNを用いてviewport-extra.min.jsを読み込む。これにより、3行目のViewExtra関数が使用できるようになる。
###3行目
3行目はjsdelivrのプラグインであるviewport-extraを用いる。
ViewportExtra(X)
Xには任意の数字を入れるだけ。

#例
IphoneXの横幅は375px。
Iphone5の横幅は320px。

ViewportExtra(375)とした場合、
375:320 = 1:x
という式になりx=0.85333333...
Iphone5ではIphoneXの約85%縮小されたコンテンツが表示される。
メディアクエリは必要なくなる。
スマホで要素がはみ出したせいで横スクロールしている、、、なんて事態も解消できる。

#結果
この三行を入れることで、デバイスの幅よりコンテンツ幅が広い場合にデバイスの幅を守ったまま、コンテンツの幅を縮小してデバイスに表示してくれる。メリットとして幅がX以下のデバイスでメディアクエリを使う必要がなくなる。また、スマホ閲覧時にコンテンツがbodyからはみ出して、横スクロールが発生することもなくなる。
ダメなことはないけど避けた方が楽になるCSSの書き方

## これはなに
- CSSでマージンをつける際、気をつけると後からちょっと楽になるかもしれないTips記事です
    - [記事を書くために使ったコードはここに置いてあります](https://github.com/xrxoxcxox/qiita-css-tips)

## このスタイルを組むとする

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214677/fa8b89e4-b82d-e266-62ec-28a46521d0f2.png" alt=""/>


## ありそうなマークアップの例（若干はしょってる）

### 例1：各要素をフラットに書いている

```html
<h1>このページのタイトル</h1>

<h2>ちょっと強調したテキスト</h2>
<p>なにかしら文章が書いてある。以下はダミーテキスト。</p>
<p>吾輩は猫である。名前はまだ無い。どこで生れたかとんと見当がつかぬ。何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。</p>
<p>吾輩はここで始めて人間というものを見た。しかもあとで聞くとそれは書生という人間中で一番獰悪な種族であったそうだ。</p>
<p>この書生というのは時々我々を捕えて煮て食うという話である。しかしその当時は何という考もなかったから別段恐しいとも思わなかった。</p>

<h2>またもや強調したテキスト</h2>
<p>ただ彼の掌に載せられてスーと持ち上げられた時何だかフワフワした感じがあったばかりである。</p>
<p>掌の上で少し落ちついて書生の顔を見たのがいわゆる人間というものの見始であろう。この時妙なものだと思った感じが今でも残っている。</p>
<p>第一毛をもって装飾されべきはずの顔がつるつるしてまるで薬缶だ。その後猫にもだいぶ逢ったがこんな片輪には一度も出会わした事がない。のみならず顔の真中があまりに突起している。</p>
```

### 例2：タイトル以下のコンテンツを`div`でwrapしている

```html
<h1>このページのタイトル</h1>

<div>
  <h2>ちょっと強調したテキスト</h2>
  <p>なにかしら文章が書いてある。以下はダミーテキスト。</p>
  <p>吾輩は猫である。名前はまだ無い。どこで生れたかとんと見当がつかぬ。何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。</p>
  <p>吾輩はここで始めて人間というものを見た。しかもあとで聞くとそれは書生という人間中で一番獰悪な種族であったそうだ。</p>
  <p>この書生というのは時々我々を捕えて煮て食うという話である。しかしその当時は何という考もなかったから別段恐しいとも思わなかった。</p>

  <h2>またもや強調したテキスト</h2>
  <p>ただ彼の掌に載せられてスーと持ち上げられた時何だかフワフワした感じがあったばかりである。</p>
  <p>掌の上で少し落ちついて書生の顔を見たのがいわゆる人間というものの見始であろう。この時妙なものだと思った感じが今でも残っている。</p>
  <p>第一毛をもって装飾されべきはずの顔がつるつるしてまるで薬缶だ。その後猫にもだいぶ逢ったがこんな片輪には一度も出会わした事がない。のみならず顔の真中があまりに突起している。</p>
</div>
```

- 2つの例の違いは、タイトル以下の文章を`div`でwrapしているかそうでないかだけ
- 実際はループ処理やレスポンシブの都合などでもwrapする・しないは変わると思うので、どちらが良い悪いの話はしない

## 例1では問題ないけど、例2では避けた方が良いCSS

※記事を書く都合上タグセレクタで説明していますが、良い感じのクラスが定義されているつもりで読んでください

```css:bad.css
h2 {
  margin-top: 32px;
}
```

- 「2つの強調されているテキストの上には同じだけの余白があるから、それぞれにマージンをつけた」状態

## 逆に、例2において良いCSS

```css:good.css
div {
  margin-top: 32px;
}

h2:not(:first-of-type) {
  margin-top: 32px;
}
```

- 「wrapしているdivにmargin-topをつけたのと、2番目以降のh2にmargin-topをつけた」状態

## 違いは？

例2をdevツールで見てみましょう

| | bad.css | good.css |
| --- | --- | --- |
| sectionを選択している状態 | ![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214677/4e5b0637-6f31-aed0-daf0-a3b297988fe5.png) | ![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214677/9ca16e79-2283-f198-a7ef-25b5c1a9a088.png) |
| h2を選択している状態 | ![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214677/2083fd99-b5c5-17dc-7b19-c05eb6dd9079.png) | ![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214677/0238905c-0d4e-1d6c-1642-aa2dc77b37c6.png) |


- `bad.css`で起こっていること
    - `h2`と、wrapした`div`の間には間違いなく余白が存在する
    - しかし、`div`は**何も余白を示さない**
    - 1つ下の階層にある`h2`が、wrapした`div`を**突き抜けて**余白を生み出している
- `good.css`で起こっていること
    - `h2`と、wrapした`div`の間には`margin`が示されている
    - 1つ下の階層にある`h2`は`margin`をもたない

## つまり？

- 1箇所存在するくらいなら別に問題ない
    - レイアウト自体は正しくできる
- 複数箇所になると「何故か想定しているより余白が広い」とかが起きがち
    - そしてdevツールで発見しづらい
    - なぜなら、入れ子になっている要素まで見ていかないと視覚的に示されないから
- こういう要素に対してpositionで配置したりし始めると、色々なことが分かりづらくなる

## まとめ

- wrapした要素を突き抜けてしまうmargin指定は避けておきましょう
- 今はレイアウト上問題なくても、積もり積もった後にリファクタリングしないといけない場面が来ると大変になりがちです
【2021年版】App Storeに登録するスクリーンショットを無料で良い感じに作成する方法

App Storeのプレビューに表示される、いわばそのアプリの顔ともなる重要な部分です！
私が作成した[外国語単語帳アプリ](https://apps.apple.com/jp/app/lankiage/id1556840677)のスクリーンショットはこんな感じです。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1204474/62fd1ae5-77e2-361f-3a8a-68650d5bffd7.png" width="600">

画面のスクリーンショットを全面にしても申請は通りますが、そのアプリでできることやメリット・特徴などをできるだけ一目でわかるように工夫すべきだと思います。

2021年3月現在、iPhone 6.5インチ、iPhone 5.5インチ、iPad 12.9インチの３サイズのスクリーンショットをそれぞれ３つ登録する必要があるので、厄介ですが丁寧にやりましょう！

- [AppStoreに登録すべきスクリーンショットサイズ](https://qiita.com/toshi586014/items/70c9f2106df8789dc821)
- [iPhone/iPad/Apple Watch解像度(画面サイズ)早見表](https://qiita.com/tomohisaota/items/f8857d01f328e34fb551)

では、どのように良い感じのスクリーンショットを作るかですが、、無料でやるのにあまり参考にできるサイトがなかったので、簡単に私が行ったやり方を共有します。

##1. iOSシミュレータ上でスクリーンショットを撮影
シミュレータを起動する必要があるのは、iPhone 8 Plus・iPhone 11 Pro Max・iPad Pro (12.9-inch) (4th generation)の３つ。
React Nativeの場合は、以下のコマンドでシミュレータを起動し、素材として使いたいスクリーンショットを撮ります。

```
npx react-native run-ios --simulator="iPhone 8 Plus" // iPhone 5.5インチ用
npx react-native run-ios --simulator="iPhone 11 Pro Max" // iPhone 6.5インチ用
npx react-native run-ios --simulator="iPad Pro (12.9-inch) (4th generation)" // iPad 12.9インチ用
```
##2. [AppLauchPad](https://theapplaunchpad.com/)でスマホフレームを作成
アプリストア用のスクシーンショットをWeb上で作成できるサイトとして[AppLauchPad](https://theapplaunchpad.com/)というのがあり、無料でも使えますが、良い感じのデザインにする場合は、有料になります。月額$29、、さすがに高い、、、
ということで、今回はAppLauchPadの無料版とKeynoteを組み合わせて作ります！

1. まずはプロジェクトを作成
2. Layoutタブから左上のレイアウトを選択
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1204474/33032240-73dc-8f8f-cdbe-2215473b8418.png" width="400">

3. DeviceタブからiPhoneブラックを選択（これはお好みで）
3. Backgroundタブから背景色を白色（#ffffff）に変更（後でフレームを切り出すので。）
4. Screenshotタブからフレームサイズを選択し、スクリーンショットファイルをアップロード
（なぜかiPhone5.5インチに対応するiPhone 8 Plusのスクリーンショットがアップロードできなかったので、Globalボタンからアップロードしました。このとき、プレビューに余白がありますが、無視して大丈夫です。）
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1204474/e2df8b93-8def-c72d-43aa-646427d7dbfb.png" width="400">
5. 画面右上のダウンロードボタンから、ダウンロード画面を開き、エクスポートしたいサイズのスクリーンを右クリックで「画像をコピー」
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1204474/acd99db8-d485-e61c-8440-683fa881777c.png" width="400">

##3. Keynoteで編集
まず、スライドサイズをスクリーンショットのサイズに合わせてカスタマイズします。やり方は[こちら](https://bamka.info/keynote-slide-size)をご参考ください。
登録するサイズは以下の通り。

- iPhone 5.5インチでは、~~1080x1920~~1242x2208（2021/12/26修正）
- iPhone 6.5インチでは、1242x2688
- iPad  12.9インチでは、2048x2732

サイズ変更ができたら、AppLauchPadからコピーした画像を貼り付けます。
貼り付けると、画像の背景の白地がかかってしまいますが、Keynoteの[インスタントアルファ機能](https://note.com/kntkg0914/n/nd3fa3b7e2440)を使うと、背景の白地がなくなり、綺麗にフレームだけを切り出せます！

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1204474/2ef1597c-66dc-251e-6b11-a62b7cb519fd.png" width="300">
【Kotlin】標準入力が閉じられるまで入力を1行ずつ取得して処理する

標準入力が閉じられるまで
入力を1行ずつ取得して処理し、
閉じられたらその処理を終わりたい場合には、
`generateSequence { readLine() }` を使うとよい。

例えば入力をそのまま標準出力するのであれば次のようになる。

```Kotlin
fun main() {
    generateSequence {
        readLine()
    }.forEach {
        println(it);
    }
}
```

[`readLine`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.io/read-line.html) は呼び出すたびに標準入力から1行取得して返し、標準入力が閉じられたら `null` を返す。
[`generateSequence`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.sequences/generate-sequence.html) は `Sequence` を生成する。その `Sequence` は、引数として受け取った関数が返した値を要素とし、その関数が `null` を返せば終端する。
従って `generateSequence { readLine() }` は標準入力が閉じられるまで入力を1行ずつ取得して要素とする `Sequence` を生成する。

／以上
#railsバージョンの確認方法

アプリ作成中、railsのバージョン確認する為、バージョンの確認方法を調べました。

```
1. OSとバージョンを確認する cat /etc/issue
「Ubuntu 14.04.2 LTS \n \l」から「Ubuntu」がOS、バージョン「14.04.2」であると認識
2. Rubyバージョンを確認 ruby -v
「ruby 2.1.5p273 (2014-11-13 revision 48405) [x86_64-linux]」から、「2.1.5p273」がバージョンであると認識
3. RubyGemsのバージョンを確認する gem -v
4. Railsのバージョンを確認する rails -v
5. PostgreSQLのバージョンを確認する psql -v
6. Heroku Toolbeltのバージョンを確認する heroku --version 「heroku-toolbelt/3.41.3 (x86_64-linux) ruby/2.1.5」から、3.41.3がバージョンであると認識する
7. Gitのバージョンを確認する git --version
```
GASでスプレッドシート名を取得して、セルに設定する

# やりたいこと
![Screenshot from 2021-03-19 21-46-50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133206/2db85000-a4c6-55c5-0a28-ab4903170bcc.png)
赤枠の名前をセルに設定したい
エクセルなら
`=MID(CELL("filename"),FIND("[",CELL("filename"))+1,FIND("]",CELL("filename"))-FIND("[",CELL("filename"))-1)`
見たいな関数で取れるみたいですが、スプレッドシートは上手いことできないので、GASで入力します

# GAS

```javascript

function myFunction() {
  var ss = SpreadsheetApp.getActiveSpreadsheet()
  var name =  ss.getName();
  var sheet = ss.getSheetByName('summary');
  sheet.getRange(2,1).setValue(name);
};
```

summaryと言う名前のシートのA2(2,1)セルにスプレッドシート名を設定するスクリプト

# 実行結果
![Screenshot from 2021-03-19 22-03-32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133206/a3239eed-7dfa-d39e-da77-80c3a6060a64.png)
Creat React App ありがとう

先日Qiitaでみた下記の記事をみてフロントエンドエンジニアになりたい欲がより強くなり、VScode上でhtmlとscssとjsを用意してブラウザに表示させようと思ったら、少しつまずき、思いがけずCreateReactAppに感謝しました。その時の記録を残しておきます。

https://qiita.com/baby-degu/items/e720c2007716811c8b30

## babelに感謝

htmlを作成し、下記のようにscriptタグでreactとreact-domを読み込み、type属性に`text/javascript`を指定したscriptタグ用意し、その中に上記記事の1選目のコードをcodepenからコピペしてはりつけるとエラーが出て早速つまずきました。

```html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <link rel="stylesheet" href="./style.css">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script src="https://unpkg.com/react@17/umd/react.development.js" crossorigin></script>
    <script src="https://unpkg.com/react-dom@17/umd/react-dom.development.js" crossorigin></script>
    <title>Document</title>
</head>
<body>
    <div id="app"></div>
    <script type="text/javascript">
        //ここにcodepenのコードをコピペ　長いので省略
    </script>    
</body>
</html>
```

htmlを表示させているブラウザのコンソールには`Uncaught SyntaxError: Unexpected token '<'`とエラーがでている。どの行にエラーが出ているか確認すると、JSXを書き恥じた部分の行を示している。これは明らかにJSXが悪さをしているとにらみ、ぐぐるとJSXを使うにはbabelが必要という初歩的な事実を忘れていたことに気づきました。

だって、いっつも、Create React Appでやりよったもん....と伊予弁で本音がポロリしました。
babelにもCreate React Appにも感謝しました。

headタグ内に、下記のコードを追加しbabelを読み込み、

```html
<script  src="https://unpkg.com/babel-standalone@6/babel.min.js"></script> 
```
`text/javascript`だったところを下記のように、`text/babel`に書き換えると、

```html
    <script type="text/babel">
```

下記のように正しく表示されました。

![スクリーンショット 2021-03-19 21.51.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603163/20ea12a5-4bfa-9cd4-7eb5-81891d795a38.png)


# ちなみに、JSX
ReactでUIを作成する時に多用されているJSXですが,JSXがなくてもReactでUIを作ることはできます。
JSXでコードを書いているということは、知らず知らずのうちに`React.createElement(component, props, ...children)`を呼び出しているのです。babelがJSXで書かれたコードを見て、React.createElementに変換してくれてるんですね。ありがとう。


https://ja.reactjs.org/docs/react-without-jsx.html


# おわりに
CreateReactAppを開発したFacebookに感謝と同時に、頼り過ぎもだめだなと感じました。
初歩的なことでしたが、誰かの役に立てれば幸いです。
さて、1選目のコードいじってみよう。
Vueの省略記法


・v-bind（：で省略）

```
<a v-bind:href="url">
<a :href="url">
```
・v-on（@で省略）

```
<a v-on:click="doSomething">
<a @click="doSomething">
```
・v-slot（#で省略）

```
<template v-slot:header>
<template #header>
```
・@エイリアス（`<project.Root/src>`）

```
../../../Component.vue
@/Component.vue
```

学習中のvueの省略記法をまとめました。
デバッグ署名のAPKファイルに署名したら警告が出た

デバッグ署名のAPKファイルに本番用の署名をしようとしたところ、結構な数の警告が出た

```
apksigner sign --ks release.jks app.apk

Verifies
Verified using v1 scheme (JAR signing): true
Verified using v2 scheme (APK Signature Scheme v2): true
Number of signers: 1

WARNING: META-INF/android.support.design_material.version not protected by signature. Unauthorized modifications to this JAR entry will not be detected. Delete or move the entry outside of META-INF/.
WARNING: META-INF/androidx.appcompat_appcompat.version not protected by signature. Unauthorized modifications to this JAR entry will not be detected. Delete or move the entry outside of META-INF/.
WARNING: META-INF/androidx.arch.core_core-runtime.version not protected by signature. Unauthorized modifications to this JAR entry will not be detected. Delete or move the entry outside of META-INF/.
WARNING: META-INF/androidx.asynclayoutinflater_asynclayoutinflater.version not protected by signature. Unauthorized modifications to this JAR entry will not be detected. Delete or move the entry outside of META-INF/.
...

```

警告文を読んでみると
"当該のファイルは署名で保護されない、もし改ざんされても不正は検出されない、ファイルを削除するかMETA-INFの外に移動せよ"
とある


META-INFはその名の通り、メタ情報を扱うディレクトリで
署名情報もここに収納されるようだ
https://docs.oracle.com/javase/jp/1.5.0/guide/jar/jar.html

警告が出ているファイルを見てみると、ほとんどが追加したライブラリのバージョン情報だった
どうやらAndroidStudioがビルド時に各ライブラリのバージョン情報をMETA-INFの中に入れているようだ

これらのバージョン情報が改ざんされた場合、アプリの動作に与える影響は不明だが
ソースコードで参照していないバージョン情報ファイルなので影響は無いと思われる

なので、この警告については無視するか
（自分のアプリでは）削除しても問題なく動くので、気になるようならMETA-INFの署名情報を削除してから署名することにする

```
zip -d $APK_SRC 'META-INF*'
```

参考
https://stackoverflow.com/questions/52122546/apk-metainfo-warning/52132597
Python web3 で Pancakeswap で流動性ペアの残高を取得するメモ

BSC(Binance Smart Chain): 基本 ethereum のクローン
Pancakeswap: 基本 uniswap のクローン

のため,

Python web3 で Uniswap の流動性ペアの残高を取得するメモ
https://qiita.com/syoyo/items/d4db214903bd0105247c

のやり方を周到できます.

pancakeswap API もあるようですが, どうもうまく動いていなかったりしてメンテされていない雰囲気あります.

https://github.com/pancakeswap/pancake-info-api


## ブロックチェーンノードの用意

BSC の場合は RPC endpoint が用意されています. ありがとうございます.

https://docs.binance.org/smart-chain/developer/rpc.html

ただ, クエリできるのは 1 時間前くらいまでの block のようです.

## 調べる

```py
import json

from web3 import Web3,HTTPProvider

web3 = Web3(HTTPProvider('https://bsc-dataseed.binance.org/'))
blockNumber=web3.eth.blockNumber
print(blockNumber)

addr_wbnb_usdt = Web3.toChecksumAddress('0x20bcc3b8a0091ddac2d0bc30f68e6cbb97de59cd') # Pancakeswap WBNB/USDT pair

abi_wbnb_usdt = json.loads(open('abi.json').read())

contract = web3.eth.contract(address=addr_wbnb_usdt, abi=abi_wbnb_usdt)
print("decimals", contract.functions.decimals().call())
print("totalSupply", contract.functions.totalSupply().call())
print("token0 addr", contract.functions.token0().call())
print("token1 addr", contract.functions.token1().call())
print("reserves(token0, token1, blocktime): ", contract.functions.getReserves().call())
```

でいけました.

## TODO

* [ ] ローカルで geth(BSC node)ノードを建てて特定のブロックのときの情報を取得できるか調べる
gitlab-ceでインストールしたingress-controllerのレスポンスヘッダからServerのヘッダを削除する

オンプレ + gitlab-ceの環境使ってる人なんてほとんどいないと思うけど。
絶対忘れるのでメモ。


gitlabでインストールするingressの設定は以下のパスにある。

`/opt/gitlab/embedded/service/gitlab-rails/vendor/ingress/`

ここにある `values.yaml` を修正する

```values.yaml
controller:
  image:
    repository: "quay.io/kubernetes-ingress-controller/nginx-ingress-controller"
  stats:
    enabled: true
  podAnnotations:
    prometheus.io/scrape: "true"
    prometheus.io/port: "10254"
  service:
    clusterIP: "-"
  config:
    hide-headers: Server
    server-tokens: "False"
defaultBackend:
  service:
    clusterIP: "-"
```

```
  config:
    hide-headers: Server
    server-tokens: "False"
```

を追記すると、Serverヘッダを消せる。

configで設定できる内容は[こちら](https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/configmap/) を参照
M5StickC＋UIFlowで振動モーターを動かしてみる

#概要
UIFlowを使ってM5StickCで振動モーターを動かしてみました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181708/b48bb7ab-e1cd-6c3c-d292-7a211f60b184.jpeg" width="300">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181708/af8498d8-4c2f-782a-dbb7-2c2cc7af4570.jpeg" width="300">

#接続方法
振動モータを下記に接続
- GND
- 26ピン

#コード
```ruby:qiita.py
from m5stack import *
from m5ui import *
from uiflow import *
from easyIO import *
import time

setScreenColor(0x111111)

def buttonA_wasPressed():
  # global params
  digitalWrite(26, 1)
  wait(5)
  digitalWrite(26, 0)
  pass
btnA.wasPressed(buttonA_wasPressed)

digitalWrite(26, 0)
```

#試してみて思ったこと
配線がごちゃごちゃしてしまうので、最終的にはHatを活用してすっきりさせたいです。
[M5StickC用 Vibrator Hat](https://www.switch-science.com/catalog/6127/)




#参考にしたサイト
[M5StickCでLEDを点滅させてみる！汎用ポートGPIOやPWM制御って何？](https://burariweb.info/electronic-work/m5stickc-led-light-up.html)
ディレクトリの中身を表示(Python)

pythonでディレクトリの中身を表示させる方法を紹介します
(環境はLinux)
また、ファイル構成はこのようにします

```python:/test
test1 #ディレクトリ
test2.txt #ファイル
test3.txt #ファイル
```

```python:/test/test1
test4.mp3 #ファイル
test5.mp3 #ファイル
```

#ディレクトリの中身を表示させるには
```python:ソースコード
import os
print(os.listdir("/test"))
```

```python:実行結果
['test1','test2.txt','test3.txt']
```

pythonでディレクトリの中身を取得するにはos.listdir()を使います
os.listdir()では、中身をリスト化してくれるので、for文を使うと表示させるのが楽です

```python:ソースコード
import os
a = os.listdir("/test")
for p in a:
 print(p)
```

```:実行結果
test1
test2
test3
```

さらにディレクトリかファイルかを分かるように

```python:ソースコード
import os
a = os.listdir("/test")
for p in a:
 if os.path.isdir("/test" + "/" + p) == True:
  d = "ディレクトリ"
 else:
  d = "ファイル"
 print(p + " " + d)
```

```python:実行結果
test1 ディレクトリ
test2 ファイル
test3 ファイル 
```

#応用

pygameを以下のコマンドでインストール

```shell
$ pip install pygame
```

```python:ソースコード
import os
import pygame
import os
import subprocess
txt = ""
def fileread(file):
 while os.path.isdir(file) == True:
  a = os.listdir(file)
  b = 1
  for p in a:
   if os.path.isdir(file + "/" + p) == True:
    d = "ディレクトリ"
   else:
    d = "ファイル"
   txt = txt + str(b) + " " + p + " " + d + "\n"
   b += 1
  subprocess.call(['cls'])
  print(txt)
  num = input()
  if str(num).isnumeric() == True:
   c = num - 1
   file = file + "/" + a[c]
   continue
  elif num == 0:
   f = file.rfind("/")
   file = file[:f]
   continue
 return file
file = "/test"
filepass = fileread(file)
try:
 pygame.mixer.init()
 pygame.mixer.music.load(filepass)
 pygame.mixer.music.play(1)
except:
 pass
```

```python:実行結果
1 test1 ディレクトリ
2 test2 ファイル
3 test3 ファイル
       #ここでキーボード入力待ち
```

subprocess.call(['cls'])を入れてターミナル画面をクリアするかは好みによりますが、自分は嫌いなのでクリアしときます。

ここでは以下の機能を追加しました

- 中身表示後、ファイル名の横の数字を選択することで、そのファイル(ディレクトリ)に対して操作ができるようにした(この場合はディレクトリを選んだ場合、その中身を表示し、再びキーボード入力待ち。音声ファイルを選んだ場合、それを再生。それ以外の場合は終了)

- 0と入力することで階層を1つ上がる

なので、このキーボード入力待ちの部分に1と入力すると、

```python:/test/test1
1 test4.mp3 ファイル
2 test5.mp3 ファイル
       #ここでキーボード入力待ち
```

と表示されます
ここで更に1又は2と入力すると音声ファイルが再生されます

#終わり
実用化させるにはもう少し機能を加える必要がありますが、ただ表示させる分には十分だと思います
カスタム要素を使ってみる(カスタマイズされた組み込み要素)(Web Components)

#概要
紹介ページのSampleに従って、カスタム要素を使ってみる。

今回は、カウントした文字数を表示するカスタマイズされた組み込み要素。(`is`属性を用いる)
#内容
##環境
macOS Catalina
Firefox 86.0
##全体像
```html:wordcount.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Simple word count web component</title>
  </head>
  <body>
    <h1>Word count rating widget</h1>
    <article contenteditable="">
      <h2>Sample heading</h2>

      <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
      <p>Pellentesque ornare tellus sit amet massa tincidunt congue.</p>
      <p is="word-count"></p>
    </article>

    <script src="main.js"></script>
  </body>
</html>
```

```javascript:main.js
// Create a class for the element
class WordCount extends HTMLParagraphElement {
  constructor() {
    super();

    function countWords(node){
      const text = node.innerText || node.textContent;
      return text.split(/\s+/g).length;
    }

    const wcParent = this.parentNode;
    const count = `Words: ${countWords(wcParent)}`;
    const text = document.createElement('span');
    text.textContent = count;

    // Create a shadow root
    const shadow = this.attachShadow({mode: 'open'});
    shadow.appendChild(text);

    // Update count when element content changes
    setInterval(function() {
      const count = `Words: ${countWords(wcParent)}`;
      text.textContent = count;
    }, 200);
  }
}

// Define the new element
customElements.define('word-count', WordCount, { extends: 'p' });
```
(少しソースは個人的に見やすく変更した。)

|![スクリーンショット 2021-03-08 18.15.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1166238/db456d87-3347-afcd-fd62-d28f4e921ad4.png)|
|:-:|
##前提として2種類
前提としてカスタム要素には、2種類ある。
- 自律カスタム要素：標準のHTML要素を継承しない。例：`<popup-info>`
- **カスタマイズされた組み込み要素** ：標準のHTML要素を継承する。例：`<p is="word-count">`(`is`属性を使う)
##カスタム要素を記載する
```html
      <p is="word-count"></p>
```
##カスタム要素を定義する
`CustomElementRegistry.define()`を用いて、カスタム要素を登録する。

```javascript
customElements.define('word-count', WordCount, { extends: 'p' });
```
- `'word-count'`: カスタム要素の名前。1つ以上の`-`が必要。
- `WordCount`: カスタム要素の振る舞いを定めるclass。
- `{extends: 'p'}`: built-in要素で性質を引き継ぐもの。(なくても良い)

##カスタム要素のクラスを定義する。(`WordCount`)
`HTMLParagraphElement`を拡張して、`WordCount`を定義する。

```javascript
class WordCount extends HTMLParagraphElement {
  constructor() {
    // Always call super first in constructor
    super();

    // Element functionality written in here
    ...
  }
}
```

##蛇足
これだけならカスタム要素を使うまでないが、

- ドキュメント接続要素にカスタム要素が追加されるたびに実行
- カスタム要素に属性が追加、削除、変更されるたびに実行

などのこともできるとのこと。
#参考にさせていただいた本・頁
- https://developer.mozilla.org/en-US/docs/Web/Web_Components/Using_custom_elements
- https://developer.mozilla.org/ja/docs/Web/Web_Components/Using_custom_elements

#感想
たまに見かけた`is`属性の使われ方の意味がわかって良かった。

#今後
自律カスタム要素の方も確認したい。
opencv current frame　備忘録

## 概要

opencv でいつも調べるのでここに備忘録として残しておきます。


```
CV_CAP_PROP_POS_MSEC 0

CV_CAP_PROP_POS_FRAME 1

CV_CAP_PROP_POS_AVI_RATIO 2

CV_CAP_PROP_FRAME_WIDTH 3

CV_CAP_PROP_FRAME_HEIGHT 4

CV_CAP_PROP_FPS 5

CV_CAP_PROP_FOURCC 6

CV_CAP_PROP_FRAME_COUNT 7

POS_MSEC is the current position in a video file, measured in milliseconds.
POS_FRAME is the position of current frame in video (like 55th frame of video).
POS_AVI_RATIO is the current position given as a number between 0 and 1 (this is actually quite useful when you want to position a trackbar to allow folks to navigate around your video).
FRAME_WIDTH and FRAME_HEIGHT are the dimensions of the individual frames of the video to be read (or to be captured at the camera’s current settings).
FPS is specific to video files and indicates the number of frames per second at which the video was captured. You will need to know this if you want to play back your video and have it come out at the right speed.
FOURCC is the four-character code for the compression codec to be used for the video you are currently reading.
FRAME_COUNT should be the total number of frames in video, but this figure is not entirely reliable.
```
【初心者】Swift UIを勉強する その⑥ ーーーtransitionsとanimations

# はじめに

今日からはアニメーションの部分に入っていきます。
宣言型シンタックスの強さはアニメーションの実装に十分伝わってくれました。


# 目次
<!-- タイトルとアンカー名を編集 -->
1. [Viewの切り替え](#Viewの切り替え)
2. [まとめ](#まとめ)
3. [参考文献](#reference)

<!-- 各チャプター -->
<a id="#Viewの切り替え"></a>
# Viewの切り替え
・`CourseItem()`は`ZStack`に囲まれたことによって、複数のカードがある場合は重なっていくことになります。
・２枚目のカードがデフォルトの状態で表示させたくないため、状態を管理できるように`@State`を足します。

```swift:CoursesView.swift
struct CoursesView: View {
    @State var show = false
    var body: some View {
        ZStack {
            CourseItem()
                .frame(width: 335, height: 250)
            if show {
                CourseItem()
            }
        }
    }
}
```
・`onTapGesture`を使って、Viewがtapされたら必要な処理を追加できます。ここはtureとfalseとの入れ替えを行います。

```swift:CoursesView.swift
.onTapGesture {
      show.toggle()
 }
```
・以下のようにanimationはあんまりも突然現るので、`animation`が持つ`easeIn`を使えばスムーズになります。

```swift:CoursesView.swift
.onTapGesture {
      show.toggle()
 }
.animation(.easeIn)
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1065841/5032dfef-f507-17c0-4adf-90500e40db64.gif" width=30%>　　<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1065841/7fb201ea-c4e4-f5f5-cab4-78187c481685.gif" width=30%>

・もちろんanimationはカスタムができます。`transiton()`には`move`や`slide`などを持ています。
・また、すでに違和感を感じているかもしれないが、もとのカードが消えるタイミングはちょっと遅れています。`zIndex()`を使えば、重複するビューの表示順序を制御できます。
・animationはSafeAreaに含まれないため、全画面にしたいであれば`edgesIgnoringSafeArea(.all)`を使えます。

```swift:CoursesView.swift
if show {
     CourseItem()
   // .transition(.slide)
      .transition(.move(edge: .top))
      .zIndex(1)
      .edgesIgnoringSafeArea(.all)
}
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1065841/211806f6-3cfb-4b56-bf5b-167d9b894ab8.gif" width=30%>　　<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1065841/e763b4eb-84e8-9030-89c9-2ae686dee758.gif" width=30%>　




<a id="#まとめ"></a>
# まとめ
・コーディングよりも、Adobe XDを使ってデザインをやっている気分のようです。

**ソースコード[Github](https://github.com/wsimple1028/swiftUI_ios14)**

<a id="#reference"></a>
# 参考文献
- [Design Code --- SwiftUI for iOS 14](https://designcode.io/swiftui-ios14)
Dockerエラー

##Docker環境構築中にエラー発生

dockerfile,docker-compose.ymlを作成し

```
docker-compose run web rails new . --force --database=mysql --:clap:skip-bundle
```
コマンドを打つと以下のエラーが発生。

```
ERROR: Encountered errors while bringing up the project.
```


前にdockerを使用して他のアプリを作成した時に、docker-compose upの状態のままにしてたのが原因っぽいので、前のアプリをdocker-compose downして、現在取り組んでるアプリに移動して再度チャレンジ！

すると、、いけました！！:clap::clap:

　　

　
あと全然関係ないのですが、qiitaに上げてる他の記事のほとんどがview300超えで嬉しいです:relaxed:
ストックも２件あってにやけました。
でも、まだLGTM貰えてないから頑張るぞー:punch:
[Java]インナークラスのstatic修飾子の動作

# インナークラスのstatic修飾子
クラス内で定義されたクラスがインナークラス。
それにstatic修飾子があるかないかで振る舞いが異なる。

```java
class Fruits {
  static ArrayList<String> fruits = new ArrayList<String>(
    Arrays.asList("Apple", "Banana")
  );
  // appleをstatic有りで、bananaをstatic無しで定義
  static String apple = "Apple";
  String banana = "Banana";

  // Appleというインナークラスをstatic有りで定義
  static class Apple {
    void eat() {
      // りんごを食べる
      fruits.remove(apple);
    }
  }

  // Bananaというインナークラスをstatic無しで定義
  class Banana {
    void eat() {
      // ばななを食べる
      fruits.remove(banana);
    }
  }
}

class Main {
    public static void main(String[] args) {
        Fruits.Apple apple = new Fruits.Apple();
        apple.eat();

        Fruits.Banana banana = new Fruits().new Banana();
        banana.eat();
    }
}
```

#### static有り（Apple）
外部クラス(Fruits)との関係性が弱く、通常のクラスのように宣言が可能。 `Fruits.Apple()` と直接呼び出しが可能です。

また、外部クラスとの関係性が弱いためstatic無しの変数を呼び出すことができません。
Appleクラスから、bananaを呼び出そうとするとエラーになります。

![スクリーンショット 2021-01-29 15.27.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855610/93892c3b-007b-3ae1-bd04-f5288c408562.png)

#### static無し（Banana)
外部クラス(Fruits)との関係性が強く、Fruitsをインスタンス化してからでないと呼び出しが不可能です。

```java
  Fruits.Banana banana = new Fruits().new Banana();
  banana.eat();
```

直接呼び出すとエラーになります。

![スクリーンショット 2021-01-29 15.38.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855610/cc4f4676-2ec2-79bc-92d1-bcc3b1333ec0.png)

また、外部クラスのstaticでないメンバにアクセスが可能です。
static無しで宣言されているbananaにアクセスできます。
[Java]ListとSetの違い

#### List
https://docs.oracle.com/javase/jp/8/docs/api/java/util/ArrayList.html
順序つきの配列で、値の重複が可能。

```java
ArrayList<String> fruits = new ArrayList<>();
fruits.add("りんご");
fruits.add("ばなな");
fruits.add("ぶどう");
fruits.add("りんご"); // りんごを複数登録する

for (String f : fruits) {
  System.out.println(f);
}

-> りんご
-> ばなな
-> ぶどう
-> りんご
```

格納した順序で、かつ重複登録したりんごが格納できています。
順序を保持するため、2番目のりんごと4番目のりんごをそれぞれ別に扱えるようになっています。

#### Set
https://docs.oracle.com/javase/jp/8/docs/api/java/util/HashSet.html
要素の順番を保証しない配列で、値の重複が不可能。

```java
Set<String> fruits = new HashSet<String>;
fruits.add("りんご");
fruits.add("ばなな");
fruits.add("ぶどう");
fruits.add("りんご"); // りんごを複数登録する

for (String f : fruits) {
  System.out.println(f);
}

-> ばなな
-> ぶどう
-> りんご
```

順不同で、かつ重複登録したりんごが無視されました。

#### 使い分け
順序を意識せず、重複登録させないプログラムであれば高速なSetの方が良いです。
マイグレーションファイルの基本

## マイグレーションとは？
マイグレーション(migration)とは辞書では「移行」の意味を持つ
ざっくりいうと「SQLなしでデータベースにテーブルを作成する機能」のこと。

## 作り方
ターミナルでコマンドを打つと作成できる


```:ターミナル
# モデルと同時に生成
$ rails g model User
```
モデルと同時に生成される複数ファイルのうちのひとつにマイグレーションが入っている。


```:ターミナル
# 単体で生成
$rails g migration create_user name:string email:string gender:integer
```
マイグレーションのみを生成する際には、ファイル名の後ろに[カラム名:データ型]を指定することで生成前に
テーブルを指定しておくことが可能。


## 基本の形
```Ruby:db/migrate/[timestamp]_ファイル名.rb

class CreateUsers < ActiveRecord::Migration[6.1]
  def change
    create_table :users do |t|
      t.string :name
      t.string :email 
      t.integer :gender
      t.timestamps
    end
  end
end

```

<b>解説</b>
"t.データ型 :カラム名"という形で記述していく。

<b>実行方法</b>
以下のコマンドをターミナルで実行することで、テーブルが生成される。

```:ターミナル
$ rails db:migrate
```
また、実行時に自動で3つのカラム(id, created_at, updated_at)も生成される。
マイグレーションファイルは一度実行すると次回の<b>rails db:migrate</b>では実行されなくなる。
なので実行後に追加でカラムが必要になった場合は、加筆するのではなく新しくマイグレーションファイルを作るのが有効。
＊もちろん加筆した上で"rails db:migrate:reset"をやるのもOKだが、注意は必要。

マイグレーション名は以下の形式にすることで、適切な記述のマイグレーションが作成される。
・マイグレーション名を"AddColumnToTable"や"RemoveColumnFromTabel"である
・後ろにカラム名やデータ型が続く

```:追加例
$ rails g migration AddAgeToUsers age:integer
```
```Ruby:カラム追加のマイグレーションファイル
class AddAgesToUsers < ActiveRecord::Migration[6.1]
  def change
    add_column :users, :age, :integer
  end
end
```
上記マイグレーションファイルを作成したあとにrails db:migrateでageカラムを追加してくれる


```:削除例
$ rails g migration RemoveGenderFromUsers gender:integer
```
```Ruby:カラム削除のマイグレーション

class AddColumnGenders < ActiveRecord::Migration[6.1]
  def change
    remove_column :users, :gender, :integer
  end
end
```
上記マイグレーションファイルを作成したあとにrails db:migrateでgenderカラムを削除してくれる



<b>rails db:migrate:reset</b>でテーブルを再作成することもできるが、
チーム開発等では変更が加えられていないか十分に注意が必要。


## その他
◯<b>マイグレーションファイルを１つのバージョンだけ実行したい場合</b>

１．以下でmigrationのステータスを確認

```:ターミナル
$ bundle exec rake db:migrate:status
```
２．表示されるMigration IDをコピー
3.以下のコマンドでバージョンを指定して実行

```:ターミナル
$ rails db:migrate VERSION=[Migration ID]
```

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
◯changeメソッドの代わりに使うup/downや外部キーadd_foreign_keyもアウトプットしたかったが後日更新予定。


## 参考
>・Railsガイド

https://railsguides.jp/active_record_migrations.html

>・Rails初心者がつまずきやすい「マイグレーション」

https://www.transnet.ne.jp/2015/12/29/rails%E5%88%9D%E5%BF%83%E8%80%85%E3%81%8C%E3%81%A4%E3%81%BE%E3%81%9A%E3%81%8D%E3%82%84%E3%81%99%E3%81%84%E3%80%8C%E3%83%9E%E3%82%A4%E3%82%B0%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%80%8Dcolnr/
[Java]ArrayListとLinkedListの違い

### LinkedList
https://docs.oracle.com/javase/jp/8/docs/api/java/util/LinkedList.html
ArrayListと対になる存在で、連結リストと呼ばれる。
構造が違うためパフォーマンスが異なる。

|クラス名|要素の検索速度|要素の追加削除速度|
|:--:|:--:|:--:|
|ArrayList|高速|低速|
|LinkedList|低速|高速|

##### ArrayList
<img width="300px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855610/f2bc5f7c-eb2b-6c5c-f447-fffdcb408bb3.png">
連続して要素を並べることで順序を保持しています。
そのため、要素の追加や削除が行われると後ろの要素を1つずつ玉突き方式で移動させていきます。
この処理が遅く、ArrayListの要素の追加削除速度が遅い原因になります。

A,B,C,D の4つの要素からBを消した場合、CとDは一つ前に移動する処理が発生します。

##### LinkedList
<img width="300px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855610/590c0879-5c65-69de-a96f-0a3c720bb1f4.png">

次はどの要素かという情報を持つことで順序を保持しています。
そのため、要素の追加や削除が起きても「次はこの要素だ」という情報を書き換えるだけでよくなり高速です。
その一方、「○番目」という情報を持っていないためデータの取得時には先頭から対象まで全て数える必要があります。
この処理が遅く、LinkedListの要素の検索速度が遅い原因になります。

A,B,C,D の4つの要素からBを消した場合、Aの次の要素情報をCに書き換える処理が発生します。

#### 使い分け
一度データを登録して、あとは読み取るだけであれば `ArrayList`
何度もデータの書き換えが発生するならば `LinkedList` と使い分けすればよりよりプログラムになりそうです。
Unknown (FileSystemError): Error: EROFS: read-only file system, open

# ある日

VScodeを操作していたら、
PCが固まって保存すらできなくなり、
何もできなくなりました。
ロックがかかってしまいました。



```
Failed
 to save 'index.js': Unable to write file 
'/home/.../index.js' 

(Unknown (FileSystemError): Error: EROFS: read-only file system, open 
'/home/.../index.js')

 git fatal unble to create index.lock read-only file system

It seems your filesystem has just damaged for some reason, and the OS remounted with read-only. You may try to reboot your system.
```

動くまで待って、再起動したら直りました(´；ω；`)


# 参考様
https://stackoverflow.com/questions/55115588/unable-to-create-var-www-html-myproject-git-index-lock-read-only-file-system
配列の要素をまとめて更新する方法(Swift)

## はじめに

以下の構造体があります。

```swift:Manga.swift
struct Manga {
    let title: String
    let volume: Int
    var selected: Bool
}
```

こちらの構造体を格納した配列があり、全要素の `selected` プロパティを `false` にするにはどうすればいいでしょうか？

```swift
var mangas: [Manga] = [
    Manga(title: "進撃の巨人", volume: 34, selected: false),
    Manga(title: "ワンパンマン", volume: 23, selected: true),
    Manga(title: "プラチナエンド", volume: 14, selected: true)
]

func deselectMangas() {
    // TODO: `mangas` 内の漫画をすべて選択解除する
}
```

ぱっと思いつくのは `forEach()` メソッドで全要素をループし、 `selected` プロパティに `false` を代入する方法です。

```swift:×ビルドエラー
func deselectMangas() {
    mangas.forEach { $0.selected = false } // FIXME: Build error
}
```

残念ながら `Cannot assign to property: '$0' is immutable` エラーが発生してビルドできません。
![スクリーンショット 2021-03-19 19.55.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138245/84371554-2ad0-9a96-b801-9f4fe263fdca.png)

`forEach()` では要素が不変のため、変更しようとするとビルドエラーになります。

解決する方法はいくつかあり、代表して3つほど紹介します。

## 環境

- OS：macOS Big Sur 11.1
- Xcode：12.4 (12D4e)
- Swift：5.3.2

## 配列の要素をまとめて更新する方法

### ①配列をインデックスでアクセスする

配列をインデックスでアクセスすると要素が可変のため、プロパティを変更できます。
数字を配列の要素数だけループすることでスッキリ書けます。

```swift:○
func deselectMangas() {
    (0..<mangas.count).forEach { mangas[$0].selected = false }
}
```

`indices` プロパティを使うとよりスマートかもしれません。

```swift:○
func deselectMangas() {
    mangas.indices.forEach { mangas[$0].selected = false }
}
```

### ②配列を再生成する

配列の要素を `map()` などのメソッドで変換し、配列を再生成します。

```swift:○
func deselectMangas() {
    mangas = mangas.map {
        var manga = $0
        manga.selected = false
        return manga
    }
}
```

インスタンスを再生成するため、①に比べるとパフォーマンスが落ちるのがデメリットです。
ただしほとんどの場合では気になりません。

要素を更新するだけでなく追加や削除まで行うときは、②のほうが関数型チックに書けるためスッキリすることが多いです。

### ③ポインタを使う

TBD

## おわりに

みなさんは配列の要素をまとめて更新する場合、どのような方法を使っているでしょうか？
教えていただけると嬉しいです :relaxed: 

## 参考リンク

- [arrays - forEach results in $0 is immutable error - Stack Overflow](https://stackoverflow.com/questions/39330920/foreach-results-in-0-is-immutable-error)
- https://twitter.com/the_uhooi/status/1372803472836366338?s=20
PowerBIでメール通知(メール送信)


## できること

PowerBIは標準機能でメール送信をサポートしています。
メール通知(メール送信)といっても、PowerBIでは２つの機能があります。

### **1. レポートを定期に送付する**

単純なメール送信で本記事の内容です。
一定周期やデータ更新時にメールでレポートの内容やリンクを送付します。
※『PowerBI メール通知』でググるとデータアラートに関する記述が目立つため本記事書いています。

以下のようなメールが送付されます。

公式ドキュメントより抜粋
![image.png](https://docs.microsoft.com/ja-jp/power-bi/consumer/media/end-user-subscribe/power-bi-subscriptions-email.png)
※メールでレポートの内容をPDFで添付するこの可能なようですが、Power BI Premiumライセンスが必要です。
　公式ドキュメントより抜粋
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206716/61435ea8-5bb5-1454-e813-c2a4415ea7aa.png)




### **2. レポート内のデータが閾値になったらメール通知する(データアラート)**

本記事の対象外です。以下に参考記事を貼っておきます。

公式ドキュメント

https://docs.microsoft.com/ja-jp/power-bi/create-reports/service-set-data-alerts

Power BI で閾値を設定して、通知を受けるには？～Data alerts in Power BI Service ⇒ Microsoft Flow との連携～

https://qiita.com/yugoes1021/items/3887bf3f42c0353fe2f2




## 設定方法

UI上、受信登録とかサブスクライブという単語で表現されており一見わかりませんが、受信登録＝メール通知とわかってしまえばあとは感覚的に使えます。
いわゆる「サブスク」をイメージして、別途料金がかかるようなイメージをうけますが、英語の「サブスクリプション」（英語: subscription、英語: subscribeの名詞形）には雑誌の「予約購読」「年間購読」の意味があるそうです。


#### 1.上部のメニュー バーで [受信登録する] または封筒アイコン [受信登録する] アイコン を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206716/2392a23f-aeb0-9996-e36e-045cb20c039b.png)

#### 2.[新しいサブスクリプションの追加]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206716/31bb175b-4596-804c-8311-9ece994b522f.png)

#### 3.設定内容を入力します。

- 受信登録する : 送信先メールアドレス
- サブジェクト : メールの件名
- サブジェクト(2) : メール本文
- レポート : リンク、プレビュー画像、添付する対象のレポート
- 開始日/終了日 : メール通知(メール送信)を実行する開始日/終了日

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206716/cdb346eb-28d4-a842-170e-e4d9d66ff40a.png)

ざっとこんな感じで設定できます。
詳細は公式ドキュメントをご覧ください。

公式ドキュメント

https://docs.microsoft.com/ja-jp/power-bi/consumer/end-user-subscribe
【SPA】ルート以外にアクセスすると404エラーとなる

# 前提
- ルートは `/`
- ルーティング設定に `react-router` を使用している

# 事象
- ルート以外で下記の操作を行うと404エラーとなる
  - リロード
  - URLに直接アクセスする
  - リンクを右クリック > 新しいタブで開く

# 原因
- SPAは複数ページ存在する場合でも `html` は `index.html` の1ファイルのみ  
そのため、 `/hoge` に直接アクセスしてもファイルが存在しないためエラーとなる

### 具体的には
#### ルートからページを辿って `/hoge` に遷移した場合の動作
1. `/` にアクセス
2. `/index.html` をブラウザが読み込む
3. `/hoge` にアクセス  
-> `react-router` によって対応するコンポーネントが表示される

#### `/hoge` に直接アクセスした場合の動作
 1. `/hoge` にアクセス  
 -> `index.html` が存在しないため404エラーとなる

# 対応策
- ルート以外のURLにアクセスした時も `index.html` の内容を表示する様にする

### 具体的には
#### webpack-dev-serverを使用している場合
- 下記の設定を追加する

```webpack.config.js
devServer: {
  historyApiFallback: true
}
Python web3 で Uniswap の流動性ペアの残高を取得するメモ(最新ブロックのみ)

## 背景

Uniswap での流動性ペアの各トークン量をスクリプトで取得したい.
税金の損益計算で必要だったり, 価格の歪みが生じていて裁定の機会がないかチェックしたい, など.

etherscan で調べるのはできるが, API 叩いて取得などは PRO 版でないと無理っぽい.

Python web3 で取得してみます.

https://web3py.readthedocs.io/en/stable/

## ブロックチェーンノードを用意する

* geth を自分で立てる
* infra などのサービスを使う

今回は infra 使います. アカウント登録して project id を取得しておきます.

chainlink が public なノード建ててくれていました. こちらも使えます.
 
https://medium.com/linkpool/release-of-public-ethereum-rpcs-f5dd57455d2e

ただ, 最新ブロックのみ取得できました.
過去のデータにアクセスするには archive node を建てるか(`geth --syncmode full --gcmode archive`), archive node へのアクセスを提供しているサービス使う必要あります(後述)


## コード

WETH/USDT の残高を調べます.

https://etherscan.io/address/0x0d4a11d5eeaac28ec3f61d100daf4d40471f1852

```
import json

from web3 import Web3,HTTPProvider

web3 = Web3(HTTPProvider('https://mainnet.infura.io/v3/<project_id>'))
blockNumber=web3.eth.blockNumber
print(blockNumber)

addr_weth_usdt = '0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852' # Uniswap WETH/USDT pair

abi_weth_usdt = json.loads(open('abi.json').read())
contract = web3.eth.contract(address=addr_weth_usdt, abi=abi_weth_usdt)
print("decimals", contract.functions.decimals().call())
print("totalSupply", contract.functions.totalSupply().call())
print("token0 addr", contract.functions.token0().call())
print("token1 addr", contract.functions.token1().call())
print("reserves(token0, token1, blocktime): ", contract.functions.getReserves().call())

```

abi JSON 情報はとりあえず etherscan から取得しました.

python web3 ですと ABI で定義された関数を取り込むと, `contract.functions.****().call()` でメソッドとして呼び出せます. メソッドパラメータは etherscan 上でのコントラクトソースコードを参照ください.

```
12068697
decimals 18
totalSupply 2237106473773835710
token0 addr 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
token1 addr 0xdAC17F958D2ee523a2206206994597C13D831ec7
reserves(token0, token1, blocktime):  [77593590686712646780933, 139661541958582, 1616150417]
```

Voila!

token0 が WETH, token1 が USDT ですね.

![Screenshot from 2021-03-19 19-46-31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36275/0547d6dc-6403-b01d-2d8b-4fb5fe06c003.png)

https://etherscan.io/address/0x0d4a11d5eeaac28ec3f61d100daf4d40471f1852

etherscan での残高と見比べて同じであるのが確認できました.

## 特定のブロックのときの残高を調べる


https://web3py.readthedocs.io/en/stable/contracts.html#web3.contract.ContractFunction.call

```
print("reserves(token0, token1, blocktime): ", contract.functions.getReserves().call(block_identifier=12068708))
```

のようにしてブロック番号やブロックハッシュ指定でいけるようですが... 少し古いブロック番号を指定するとエラーになります(403 forbidden). linkpool のも timeout error.

infra だと履歴にアクセスするには data archive アドオン課金($250/month)しないとダメでした.

https://infura.io/pricing


呼び出し数すくなければ quicknode がよさそうです.
 
https://www.quiknode.io/

## TODO

* [ ] geth だと archive node には 7TB くらい必要(2021/03 時点)なので, 1.5 TB くらいで収まるっぽい TurboGeth で archive node を建てる.
* [ ] GraphQL で取得できないか試す. bitQuery で試せます: https://graphql.bitquery.io/ide
【SpringBoot】ログイン機能でに詰まった話

はじめてのSpringBootでログイン機能を作りたく、TechShareさんのYoutubeを参考に実装を進めました。

【SpringBoot VOL001】〜【SpringBoot VOL00３】を参考にしています。

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

## 環境
SpringBoot
SpringSecurity
Gradle
MySQL
MyBatis

## 状況
ログイン画面でDBに入ってる正しいデータを入力しているにlogin?errorに飛ばされてしまう:baby_tone1:

## 原因
DB情報を入力する`application.properties`クラスの設定に問題がありました。

データベース名の後に`characterEncoding=UTF-8`を書いていなかったことが原因でした。

```
#DB接続情報
spring.datasource.url=jdbc:mysql://localhost:3306/[databasename]?characterEncoding=UTF-8
spring.datasource.username=[username]
spring.datasource.password=[password]
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.database=mysql
```

## まとめ
Timezoneの指定が必要っていう記事はあったけど、まさかUTFのせいだったとは、、衝撃でした。苦戦したので備忘録。
Ruby ハッシュ 基礎

# ハッシュ 基礎知識
ハッシュとは、
「データ」とそれに対応する「名前」のセットを要素として持つ値のこと。
複数のデータを持つことのできる値という点は、配列と同じである。

データをバリュー、それに対応する名前をキーと呼ぶ。

ハッシュは順番ではなく、キーで管理する。
キーとバリューで管理する方式をキーバリューストアと呼ぶ。

# キーバリューストア

```rb:キーバリューストア例
Key: User1 ⇢ Value: Hoge
Key: User2 ⇢ Value: Fuga
```

ハッシュを用いれば、別々の意味を持つ値を1つにまとめられるため、値同士の関連を示すことができる。

# ハッシュ生成方法
ハッシュは、波括弧{}を使って生成する。

```rb:ハッシュの宣言
変数 = {}
```
ハッシュは、はじめから要素を持った上で生成できる。

```rb:=>を用いてキーとバリューをセットにして記述
変数 = { キー1 => バリュー1, キー2 => バリュー2, キー3 => バリュー3 }
```

```rb:シンボルを用いてキーとバリューをセットにして記述
hash = { :name => "Hoge" }
hash = { name: "Hoge" }  # こっちがよく使われる
```

# シンボル
シンボルは、見た目は文字列のように見えるが、実際の中身は数値になっている値のこと。
シンボルの宣言は、文字列の先頭にコロン「:」をつける。

```rb:シンボルの宣言
:"文字列"
:文字列  # こっちがよく使われる
```
コンピューターにとって、
文字列を扱うよりも、数値を扱うほうが処理速度は速い。
処理速度を速くすることと、文字列としての役割も果たせることから、ハッシュのキーには、文字列よりもシンボルを用いることが多い。

# ハッシュ生成まとめ

```rb:ハッシュ使い方３選
① human1 = { "user1" => "Hoge" }
② human2 = { :user1 => "Hoge" }
③ human3 = { user1: "Hoge" }
```
③のシンボルを使った記述方法がシンプルで使いやすい。

# ハッシュに値を追加
ハッシュは、定義した後から要素を追加することができる。
ハッシュへの要素の追加には、配列で添字を指定するように角括弧[]の中にキーを記述し、値（バリュー）を代入する。

```rb:要素を追加
ハッシュ[:追加するキー] = 値
```

# ハッシュの値を取得
ハッシュの持っている値を取得する時は、
対応するキーを角括弧[]の中に記述する

```rb:要素を取得
ハッシュ[:取得したい値のキー]
```

# ハッシュの値を変更
要素を追加するときと同様に、
取得の記述に代入演算子で値を代入するように記述する。

```rb:要素を変更
ハッシュ[：変更したい値のキー] = 値
```
指定するキーがハッシュに含まれていれば、そのキーに対応する値を変更できる。
存在しないキーの場合、そのキーと値が新しい要素として追加する。

# ハッシュの基礎問題
下記のメソッドを実行した時

```
puts hash.keys
puts hash.values
```
ターミナルの出力結果を以下のように表示させる

```
one
two
three
1
2
3
```

変数hashを作成するためのコードをシンボルを使って記述する

```
hash = { one: 1, two: 2, three: 3 }
```

シンボルを使ったキーの記述方法は、キーの後にコロン:をつけて定義します。

```
hash = { キー: 値}
```

ハッシュのキーを取得するにはkeysメソッド、
値を取得するにはvaluesメソッドを使用し取得する。

オブジェクト.keysで、ハッシュに含まれるキーを取得する。

```
hash = { one: 1, two: 2, three: 3 }

puts hash.keys
one
two
three
```

オブジェクト.valuesで、ハッシュに含まれる値を取得する。

```
hash = { one: 1, two: 2, three: 3 }

puts hash.values
1
2
3
```

# まとめ

・ハッシュは、複数のデータを持つことができる。
・「データ」とそれに対応する「名前」のセットを要素として持つことができる。
・宣言は波括弧{}を使う。
・シンボルを使うことが多い。文字列の先頭にコロン「:」をつける。
・データの追加と取得、変更ができる。
・ハッシュのキーを取得するにはkeysメソッド、
値を取得するにはvaluesメソッドを使用し取得することができる。
VSCodeからAnaconda Powershell Promptを利用する

# 経緯
Windows環境でAnaconda Power ShellをVSCodeのターミナルとして設定する記事がないのでメモとして書いておきます．

[Anaconda Promptを設定する記事](https://qiita.com/_meki/items/5b4f06318f1a0986c55c)はたくさんあったのですが，Unixコマンドが使えないのがストレスだったので慣れているPower Shellを利用したいと思ったのがきっかけです．

# settings.jsonの編集
下記手順に従う
1. Anaconda Powershell Promptを検索
2. 右クリックして「ファイルの場所を開く」
3. Anaconda Powershell Promptのプロパティからリンク先の文字列をコピー
4. コピーした文字列のPowershellのパスを指定するコマンド部分をVSCodeのsettings.jsonでterminal.integrated.shell.windowsに指定する
5. 引数部分をterminal.integrated.shellArgs.windowsに列挙する



```json:settings.json
{
    "terminal.integrated.shell.windows": "[Powershellのパス]",
        "terminal.integrated.shellArgs.windows": [
            "[コマンドの引数1]",
            "[コマンドの引数2]"
        ]
}
```

コマンドの書き方が若干わかりにくいので例↓

```json:settings.json
{
    "terminal.integrated.shell.windows": "C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe",
    "terminal.integrated.shellArgs.windows": [
        "-ExecutionPolicy",
        "ByPass",
        "-NoExit",
        "-Command", 
        "C:\\ProgramData\\Anaconda3\\shell\\condabin\\conda-hook.ps1",
        "; conda activate 'C:\\ProgramData\\Anaconda3'"
    ]
}
```

# 参考文献
- [Visual Studio Code のターミナルから Anaconda Prompt を開くようにする (Windows)](https://qiita.com/_meki/items/5b4f06318f1a0986c55c)
- https://stackoverflow.com/questions/54828713/working-with-anaconda-in-visual-studio-code
ラズパイに USB 接続した同一デバイスを判別できるようにする【その２ーポート】

# はじめに
今回はラズベリーパイの **USBポート番号** をキーにしてルールを作成します。

【[その1](https://qiita.com/kiyonaga/items/182db6b8fc9afb33751c)】でデバイスのシリアルナンバーをキーにして任意の名称を設定しました。
しかしながら、USB ポートの増設等で配線が複雑になると、デバイスの入れ替わりやルール記述量の多さで作業が阻害される可能性があります。
そこで今回は、どのポートに何のデバイスが接続されているのかわかるようにして、**接続間違いを防ぎやすく** します。


# 作業環境
・Raspberry Pi 3B
・Raspberry Pi OS Lite Legacy (Buster)
・USBカードリーダー（カードリーダー2口）

基本的なセットアップは完了しているものとします。
下記記事もご覧いただくとスムーズに作業できます。
https://qiita.com/kiyonaga/items/182db6b8fc9afb33751c

# [手順1] 追加されたデバイスファイルを確認
USB 挿抜時の dev ディレクトリの差分を確認します。
![sd*.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1174732/101a4d29-1e61-b61b-aab0-31e04d06dab5.png)
今回は sda、sdb が追加されました。

# [手順2] カードリーダーの固有情報を確認

```bash
udevadm info -q all -n /dev/sd*
```

" * " を a または b に読み替えて実行してください。
今回は SUBSYSTEM , ID_BUS , ID_PATH_TAG の3つをキーとして使用するのでメモしておいてください。

接続しているラズベリーパイの**ポート番号**をキーにするので、 udevadm コマンドで参照するのは sda、sdb どちらでも構いません。

# [手順3] 接続時ルールの作成
下記コマンドでルールファイルを作成します。
```bash
sudo nano /etc/udev/rules.d/99-usb-port.rules
```
下記のように記述します。
```
SUBSYSTEM=="block",ENV{ID_BUS}=="usb",ENV{ID_PATH_TAG}=="platform-3f98000_usb-usb-0_1_4*",SYMLINK+="USB-cardreader",MODE="0666"
```
ENV に設定するデバイスの固有情報がわからない場合は [【その1】](https://qiita.com/kiyonaga/items/182db6b8fc9afb33751c#%E6%89%8B%E9%A0%862-%E6%8E%A5%E7%B6%9A%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9%E3%81%AE%E5%9B%BA%E6%9C%89%E6%83%85%E5%A0%B1%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B)をご参照ください。

今回はカードリーダーをラズベリーパイの **ポート4** に接続したので `ENV{ID_PATH_TAG}=="platform-3f98000_usb-usb-0_1_4*"` としています。
usb-0_1_ に続く、" 4 " がラズベリーパイのポート番号を示しています。
また、ポート番号以降は" * "（ワイルドカード）で一致するようにします。

ラズベリーパイ上の各 USB ポート番号の位置関係は以下の通りです。
```:Raspberry Pi 3B
 ----- ----- -----
|     |  2  |  4  |
| LAN |----- -----
|     |  3  |  5  |
 ----- ----- -----
```
```:Raspberry Pi 4B
 ----- ----- ----- 
|  3  |  1  |     |
 ----- -----| LAN |
|  4  |  2  |     |
 ----- ----- ----- 
 ```
 ※4B の場合、ID_PATH_TAG が `platform-fd500000_pcie-pci-0000_01_00_0-usb-0_1_...` のように 3B と異なるので注意してください

# [手順4] ルールが適用されているか確認
以下コマンドで udev にルールファイルを再読み込みします。
```bash
sudo udevadm trigger
または
sudo /etc/init.d/udev reload
```
dev ディレクトリを確認します。
USB-cardreader ファイルが作成されたのが確認できました。
![sd*.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1174732/bfa72c50-a02c-c19a-ca7e-de70f10e8033.png)

# [まとめ]
今回は特定のポートに接続されるデバイス名を固定して、デバイスを判別しやすくしました。
ポートに接続されたデバイス名と実際に接続したデバイスを確認することで入れ替わりを防げます。
同一のデバイスを複数接続するのであれば、併せてシリアルナンバーもキーにすると良いかと思われます。
Git~ブランチ~

GitのPushまでの方法を学習したので、次にpushするブランチについて学習していきます。

#ブランチとは
まず、1つのプロジェクトがあると仮定します。
mainブランチというのが、幹です。プロジェクトの心臓の部分です。ここを傷つけないようにプロジェクトをすめていきます。
それが、いろんなブランチです。これを使うことで、プロジェクトの幹を傷つけることなくすすめることができます。
先程プッシュしたときも最後にメインブランチを設定したと思います。このとき、指定したのが、mainブランチだった場合、めちゃくちゃ怒られるので注意してください。

では、ブランチを使うことでどんなメリットがあるのか。
①プロジェクト本体を傷つけることなく作業を行うことができる。
②途中で変更が生じた場合、目的別に対応することができる。
③ブランチから分岐させることにより、それぞれ目的別に同時進行で作業を行う事ができる。

では、早速ターミナルで使うブランチのコマンドをみていきます。

#ブランチを作る

```
% git branch test
```
ブランチが作成されました。

#ブランチを切り替える

今いるブランチから離れたいとします。

```
% git checkout test
```

#ブランチ一覧

```
% git branch 
```
で一覧を見ることができます。

#ブランチ削除

```
git branch -d test
```
このブランチいらんなって思ったら-dを追加することで削除することができます。

#ブランチ名称変更

```
%  git branch -m original_branchi
```

となります。