OmniAICreator/Qiita-1.07M huggingface dataset:
信濃一国、Raspberry Pi 4B で２時間３０分

国連ベクトルタイルツールキットの一つとして、国土地理院の基盤地図情報をベクトルタイルに変換するものを作っています。

http://github.com/unvt/fgd

長野県全域を含む基盤地図情報を、Raspberry Pi 4B 一台でベクトルタイルに変換したところ、かかった時間は次の通りでした。

```
real    149m18.849s
user    355m17.867s
sys     77m39.435s
```

上記の計測値を得るために実行したコマンドは `time rake produce` です。

今回の実装のために新しく加えた工夫は、データソースから地物を取り出してフィルターをかけて Tippecanoe に流し込めるようにするパートを、GNU parallel を使って、平行化したことです。要所は、次の通りです。

```
  cmd = "parallel --line-buffer 'ogr2ogr -lco RS=YES -f GeoJSONSeq /vsistdout/ {1} | FGD_LAYER={2} node filter.js' :::: w1.txt ::::+ w2.txt"
```

この平行化の結果、実時間１49分に対して、ユーザー時間355分、システム時間78分を使っているという計測になりました。(355+78)/149=2.9ですから、変換処理だけで3コア程度フルに利用できたような感じになっています。割と効率よくCPUを使い切れていると私は思います。

なお、Raspberry Pi 4B は CPU 負荷が上がって機械の温度が上がると、自動的にクロック周波数を調整して温度が下がるのを待ってくれます。今回の信濃一国変換テストでも、ハングアップすることなく安定して動いてくれました。

また、Tippecanoe によると、信濃一国基盤地図情報ベクトルタイルの分量の諸元は、次の通りでした。

```
9922053 features, 798006848 bytes of geometry, 18220 bytes of separate metadata, 319908150 bytes of s
tring pool
```

もう少しで一千万地物、というデータ規模ですね。
[iOS] [Swift] dismissの仕様を勘違いしていた件

# 前提環境

- iOS 14.4
- Xcode 12.1 / Swift 5.3

# 疑問

私は、UIViewControllerの`dismiss(:animated)`はシンプルに「自身を閉じる」メソッドだと思い込んでいたのですが、どうやら勘違いでした。
同じ勘違いをされている方も案外多いのでは？と考えてこの記事を書きました。

子で`dismiss`を実行すると、子自身が閉じます。
これは直感通りの挙動です。
<img alt="図1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122917/aa1d3502-48c9-5ecf-8d03-23a19be52d39.png" width=40%>

一方、Notificationやdelegateなどを介して**親で親自身のViewControllerに対して`dismiss`を実行すると、子が閉じて親は閉じません。**
この挙動が私には意味不明でした。
<img alt="図1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122917/85479d1c-df1a-db91-54b6-fdc6dc3e9433.png" width=40%>

# わかったこと

公式リファレンスより：

> calling this method on a view controller lower in the stack dismisses its immediate child view controller and all view controllers above that child on the stack. When this happens, only the top-most view is dismissed in an animated fashion

訳：スタックの下位のView Controllerでこのメソッドを呼び出すと、**その直接の子ViewControllerとスタック上のその子の上のすべてのViewControllerが閉じられます。**これが発生すると、最上部のビューのみがアニメーション化されて閉じられます。

子で`dismiss`を実行すると子自身が閉じることも、
親で`dismiss`を実行すると子が閉じて親が閉じないことも、
`dismiss`の仕様なんですね。
if文なしでじゃんけん Rust編

[if文なしでじゃんけん](https://qiita.com/tadsan/items/65d91ba6b50535fc8815) を見て [コメント](https://qiita.com/tadsan/items/65d91ba6b50535fc8815#comment-13a3a469426774600673) にもあるようにむしろifよりmatchの方が表現力が高いのでは！？と感じたのでmatchも抜いてRustで作ってみました。
※ ちなみにタイトルは元記事に合わせただけでRustではif式とmatch式になります。

### コード

```rust:main.rs
use std::collections::HashMap;

#[derive(Clone, Copy, PartialEq, Eq, Hash)]
enum RPS {
    Rock,
    Paper,
    Scissors,
}

use RPS::*;

fn main() {

    let emoji_lut = vec![
        (Rock, '✊'),
        (Paper, '🖐'),
        (Scissors, '✌'),
    ].into_iter().collect::<HashMap<RPS, char>>();

    let text_lut = vec![
        ([Rock, Paper], "あなたの負け"),
        ([Rock, Scissors], "あなたの勝ち"),
        ([Paper, Rock], "あなたの勝ち"),
        ([Paper, Scissors], "あなたの負け"),
        ([Scissors, Paper], "あなたの勝ち"),
        ([Scissors, Rock], "あなたの負け"),
    ].into_iter().collect::<HashMap<[RPS; 2], &str>>();

    let hands = &[Rock, Scissors, Paper];
    for me in hands {
        for you in hands {
            println!(
                "[{} vs {}] {}",
                emoji_lut[me],
                emoji_lut[you],
                (me == you).then(|| &"あいこ").or_else(|| text_lut.get(&[*me, *you])).unwrap()
            );
        }
    }
}
```
[Rust Playground](https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=ccd3d8005909499f55f05b146a327f1d)
![Screenshot_2021-02-26 Rust Playground.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17651/3c172246-98e1-195b-75e3-2739709a6e1f.png)

あいこのパターンを3つ減らすために事前に精査しています。
Rustは型システムが堅実で柔軟なので、条件文なしで綺麗に書けました。

### まとめ
他にも初めからじゃんけんを数値として扱ったり `enum RPS` を数値に変換して計算すれば、今回書いた `text_lut` のように網羅的にパターンを書く必要がなくなります。
ですが、今回のenumでは型が付いてくるので元記事の文字列で扱ったり、前述した方法より個人的に好きです。


知識や記述の間違いがあればご指摘いただけれると嬉しいです。
Playwright for PythonをWindows10で動かす

#環境
Windows 10
Python3.9

# インストール
とりあえずPlaywrightをpipでインストール

```
pip install playwright
```

一回Playwrightを実行

```
playwright codegen https://ja.wikipedia.org/
```

こんな感じでエラーになる。

```
(node:20312) UnhandledPromiseRejectionWarning: browserType.launch: Failed to launch chromium because executable doesn't exist at C:\Users\<username>\AppData\Local\ms-
playwright\chromium-854489\chrome-win\chrome.exe
Try re-installing playwright with "npm install playwright"Error
```

npmでplaywrightをインストールしろとか言われてるので、[ここ](https://nodejs.org/ja/)からNodejsのインストーラーをダウンロードしてインストールしてnpmでplaywrightをインストール。
ちなみにnodeのバージョンはv14.16.0。

```
npm install playwright
```

もう一回Playwrightを実行

```
playwright codegen https://ja.wikipedia.org/
```

やっぱり同じエラーが出る・・・

```
(node:20312) UnhandledPromiseRejectionWarning: browserType.launch: Failed to launch chromium because executable doesn't exist at C:\Users\<username>\AppData\Local\ms-
playwright\chromium-854489\chrome-win\chrome.exe
Try re-installing playwright with "npm install playwright"Error
```

`C:\Users\<username>\AppData\Local\ms-playwright\chromium-851527`以下にchrome.exeがインストールされてた。どうも`chromium-851527`の部分が合わないらしい・・・
仕方ないので、`chromium-851527`をコピッて複製して、ディレクトリ名をエラーが出ていた`chromium-854489`に変更。

で、Playwrightを実行

```
playwright codegen https://ja.wikipedia.org/
```

今度は動作した。

ひょっとしたらc++のコンパイラとか必要かもしれないけど、自分は別件でインストールしてたから問題なかったけど、なんか言われたらVisualStudioをインストールする。
【SwiftがWindows10に正式対応】WindowsでiOSアプリ開発を始めたかった

業務ではJavaばかり書いているバックエンド開発者で、Swift初心者です。
今はWindowsが愛機なので先日のニュースを見て、手を出したいなと思っていたiPhoneアプリ開発。

https://www.publickey1.jp/blog/20/swiftwindowswindows.html

Windows × iPhoneアプリ開発の入門記事はXamarinでやっていた時代のものばかりだったので、メモを残しておきます。

## 用意するもの

- Window10のPC
- Visual Studio 2019
- Swift


#### Swiftインストール
https://swift.org/download/
swift toolchainをインストールします。

#### Visual Studio 2019 インストール
https://visualstudio.microsoft.com/
こちらより、(ライセンスを持っていないので)Community版をダウンロードします。
インストールの際は、以下のコンポーネントを入れます。

- 必須
    - Windows 10 SDK (10.0.17763.0以上)
    - Windows Universal CRT SDK
    - MSVC v142 - VS 2019 C++ x64/x86 ビルド ツール (v14.25以上)

- 推奨
    - Python 3 64 ビット (3.7.8) 　…入ってるかつパス通せる人は不要
    - Git for Windows
    - Windows 用 C++ CMake ツール
    - JSON エディター


#### 設定
Windows10だとPythonのパスを通してあげないと、swiftコマンドは何やってもエラーになるので以下をコマンドプロンプトから実行します。


```
path %ProgramFiles(x86)%\Microsoft Visual Studio\Shared\Python37_64;%PATH%
```

さらに、REPL（対話型のSwift実行環境）を使うためには、Swift toolchain→Windows SDKのアクセスを許可する必要があります。

```
set SWIFTFLAGS=-sdk %SDKROOT% -I %SDKROOT%/usr/lib/swift -L SDKROOT%/usr/lib/swift/windows
swift repl -target x86_64-unknown-windows-msvc %SWIFTFLAGS%
```

## 動いた！
これで動作確認をしてみます。

``` 
$> swift
Welcome to compnerd.org Swift version 5.3.3-dev (LLVM 3093af41dd, Swift 266905108e).
Type :help for assistance.
1> 1 + 2
$R2: Int = 3
```

Windows10でSwiftが動いたようです。やったね。

さて、Swift package managerを動かしてみるぞ！と思った矢先

```
swift package init
error: unable to invoke subcommand: C:\Library\Developer\Toolchains\unknown-Asserts-development.xctoolchain\usr\bin\swift-package ()
```

2021年2月27日現在、できないようです。非常に残念。
Swift Package Managerのサポートは近日中に、とのこと。待ちます。
できるようになったら記事更新します。


--------

（2022年2月17日追記）
この記事、最新版一年も放置してしまいました。

2021年4月の以下リリースから、Swift Package Managerが対応したようです。
https://www.swift.org/blog/swift-5.4-released/

すばらしい！！！

実はこの記事書いたすぐあとにMac買っちゃったので自分は試しませんが、どなたか試した方はコメントしてくれると、ありがたいです。
Bashでよく使う記法集

#本記事の目的
作業自動化用のスクリプトを作成する際によく使う、Bash独自の記法についてまとめる。

#シェルスクリプト文法

###パラメータ

|  項目 |  機能  |
| ---- | ---- |
|  $?  |  直前のコマンドの終了ステータスを参照する。0であればTrue、0以外であればFalseの値を意味する。 |
|  $#  |  シェルスクリプトやシェル関数の引数の個数を参照する。 |
|  $0  |  起動されたシェルスクリプト名を参照する。 |
|  "$@"  |  全ての位置パラメータをそれぞれダブルクォートで囲んだ状態で展開する。 |
|  shift  |  位置パラメータをシフトする。 |


###リダイレクト
|  項目 |  機能  |
| ---- | ---- |
|  >&2  |  標準エラー出力にリダイレクトする。 |
|  &>/dev/null  |  標準出力と標準エラー出力を両方破棄する。 |

###評価
|  項目 |  機能  |
| ---- | ---- |
|  [[ ]]  |  条件式を評価し、その結果によって終了ステータスを返す。test[ ]コマンドと比較して、正規表現や拡張正規表現を使用できる点がメリットである。逆に、shを用いるOS上では使用できないため、互換性に劣る点がデメリットとなる。 |
|  (( ))  |  算術演算を行い、その結果によって終了ステータスを返す。 |


#シェルスクリプト用コマンド

###組み込みコマンド
|  項目 |  機能  |
| ---- | ---- |
|  exit  |  シェルスクリプトを終了する。コマンドの後に0を指定すると正常終了、0以外を指定するとエラー終了を意味する。 |
|  read -p  |  プロンプトを表示する。 |
|  usage() { }  |  コマンドの扱い方を出力する関数。シェルスクリプトでは最初に記載されている事が多い。 |
|  getopt  |  位置パラメータにセットされている、-で始まる1文字オプションを解釈し、最初に見つかったオプション文字の1文字を指定したシェル変数に代入する。この時、シェル変数`OPTIND`には、次に`getopts`が実行されたときに解釈するべき位置パラメータの番号が代入される。オプション文字の直後に`：`がある場合は、そのオプションが引数を必要とするものと解釈され、その引数はシェル変数`OPTARG`に代入される。 |



###外部コマンド
|  項目 |  機能  |
| ---- | ---- |
|  awk '{print $1}'  |  1列目のフィールドを抽出して表示する。 |
|  awk -F  |  区切り文字を指定する。 |
|  NF  |  awkコマンドにおける列数を指定する。 |


#感想
BashはUnix系のPC/サーバであれば、自宅/会社/客先問わず様々な環境で共通して使えるため、非常に便利に感じる。今はBashを用いて作業を自動化する事が多いが、Pythonではさらに複雑な処理を自動化できるようになるため、時間ができたらPythonを学習してみたい。


#参考文献
- Udemy講座：[Linux Shell Scripting: A Project-Based Approach to Learning](https://www.udemy.com/course/linux-shell-scripting-projects/learn/lecture/9558390#overview)
- 書籍：[シェルスクリプト基本リファレンス](https://www.amazon.co.jp/%E6%94%B9%E8%A8%82%E7%AC%AC3%E7%89%88-%E3%82%B7%E3%82%A7%E3%83%AB%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E5%9F%BA%E6%9C%AC%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9-sh%E3%81%A7%E3%80%81%E3%81%93%E3%81%93%E3%81%BE%E3%81%A7%E3%81%A7%E3%81%8D%E3%82%8B-PRESS-plus/dp/4774186945/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=2ZH3Y53K7G54V&dchild=1&keywords=%E3%82%B7%E3%82%A7%E3%83%AB%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E5%9F%BA%E6%9C%AC%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9&qid=1609406284&sprefix=%E3%82%B7%E3%82%A7%E3%83%AB%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88+%2Caps%2C233&sr=8-1)
Tailwindで「親要素に特定のクラスがあるときのみ適用される」ユーティリティクラスをつくる

# 実現したいこと
`warm-theme:bg-red-400`のように書くことで、親要素に`.warm-theme`があるときのみ`bg-red-400`が適用されるようにしたい。こうすると、同じマークアップでスタイルのみを切り替えることができたりする。

```html:例
<!-- 親要素にwarm-themeがある場合 -->
<div class="warm-theme">
  <div class="bg-blue-300 warm-theme:bg-red-400 w-20 h-20">A</div>
</div>

<!-- 親要素にwarm-themeがない場合 -->
<div>
  <div class="bg-blue-300 warm-theme:bg-red-400 w-20 h-20">B</div>
</div>

```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297745/c99e4825-a40c-b9be-a7a8-99d87802263b.png)


# 環境
- Tailwind 2.0.2
- Tailwind プレイグラウンド (https://play.tailwindcss.com/)

# TL;DL
```js:tailwind.config.js
const plugin = require('tailwindcss/plugin')

module.exports = {
  variants: {
    extend: {
      backgroundColor: ['warm-theme'],
    },
  },
  plugins: [
    plugin(({ addVariant }) => {
      addVariant('warm-theme', ({ modifySelectors, separator }) => {
        modifySelectors(({ className }) => {
          return `.warm-theme .warm-theme${separator}${className}`
        })
      })
    }),
  ],
}
```

# 解説
Tailwindでは`horver:bg-red-400`とすることで、hover時にのみbg-red-400が適用される。この`hover:`の部分を**variant** と呼ぶ。(参考： https://tailwindcss.com/docs/configuring-variants )
標準では、hoverの他にfocus, activeなどがある。
variantは自分で独自のものを作ることができる。
公式ドキュメントの[Creating your configuration file](https://tailwindcss.com/docs/configuration#creating-your-configuration-file)を参考にすると以下のようにかける

```js:tailwind.config.js
// ...略..
plugin(({ addVariant }) => {
  addVariant('warm-theme', ({ modifySelectors, separator }) => {
    modifySelectors(({ className }) => {
      return `.warm-theme .warm-theme${separator}${className}`
    })
  })
}),
```
- classNameは`warm-theme:bg-red-400`と書いた場合は、bg-red-400のことを指す。
- separatorは`:`のこと。
- modifySelectorsの部分は`warm-theme:bg-red-400`というクラスから`.warm-theme .warm-theme:bg-red-400`というCSSセレクタを生成する。

上記のconfigにより、一例として以下のようなCSSが生成される。

```css
.warm-theme .warm-theme:bg-red-400 {
  --tw-bg-opacity: 1;
  background-color: rgba(248, 113, 113, var(--tw-bg-opacity));
}
```

なお、自作したvariantを適用するためには、以下のように`variants.extend`に追加する。

```js:tailwind.config.js
// ...略..
variants: {
  extend: {
    backgroundColor: ['warm-theme'],
  },
},
```
ちなみにこの状態だと、`bg-*`のユーティリティクラスにしか使えない。テキストの色でも使いたい場合は、`textColor: ['warm-theme']`を追加する必要がある。適当にすべてのユーティリティクラスを対象にしてしまうと生成されるCSS量が多くなりすぎるので注意。

# 最後に
Tailwindプレイグラウンドは、VSCodeライクなエディタで、tailwind.config.jsをいじりながら試せるため非常に便利。
お試しあれ。
初学者がPHPを学び始める



##PHPとは
HTMLでは決められたテキストしか表示することができないのに対してPHPを使うと、見る人や状況に応じて、表示するテキストを変えることができます。
PHPはHTMLに埋め込んで使うことができる。
その際に<?php 〜 ?>の部分がHTMLに変換された上で表示される。

##文字列を出力する。（echoを使う）
「echo」は文字列などを出力するための命令です。文字列を出力する場合はシングルクォーテーション「'」かダブルクォーテーション「"」で囲みます。
ちなみに計算のしたい場合はダブルコーテーションで囲まない。囲ってしまうと囲った部分が文字列として扱われるため計算できない。

例えば、「こんにちは！！」と表示したいときは以下のようになる。

```php
  <?php
    echo "こんにちは！！"；
  ?>
```

##変数の書き方
「$変数名 = 値;」のように記述する。
よってfruitという変数を作成しりんごという値を代入し出力する場合は以下のようになる。

```php
  <?php
    $fruit = "りんご";
    echo $fruit;
  ?>
```

##文字列の連結
ドット「.」記号を用いると文字列を連結することが出来ます。文字列同士の連結、変数と文字列の連結、変数同士の連結をすることができます。
例えば下記の場合は果物はりんごというように出力できます。

```php
  <?php
    $fruit = "りんご";
    echo "果物は".$fruit;
  ?>
```

##if文
if文を使うと、条件に応じて処理を分岐することができます。
条件が成り立つ場合、｛｝の中の処理が実行されます。
条件が成り立たない場合は処理が実行されません。

下記の場合は条件が成り立つため
$xは50より大きいです。と出力されます。

```php
  <?php
    $x = 100;
    if($x > 50){
      echo "$xは50より大きいです。";
    }
  ?>
```

##else文
ifと組み合わせてelseを使うと、「もしも〜だったら・・・、そうでなければ・・・」といった条件分岐が可能になります。if文の条件が「false」であった場合、elseの中の処理が実行されます。
下記の場合は年齢が30歳以上ではないためelse文の処理が行われます。
すなわちあなたは30歳未満です。が出力されます。


```php
 <?php
    $age = 26;
    
    if($age >= 30){
      echo "あなたは30歳以上です。";
    }else{
      echo "あなたは30歳未満です。";
    }
  ?>
```
【Rails】deviseで実装したパスワードリセット機能を使って本番環境でメール送信してみた

# 環境
macOS: Big Sur Ver11.2.1
Rails: 6.1.1
Ruby: 2.6.5
本番環境: Heroku

# 記事の目的
Herokuにデプロイしたアプリケーションでパスワードリセットが正しく動作すること。
パスワードリセット機能はdeviseで導入済み、開発環境で動作確認済みです。
詳しくは、[こちらの記事をどうぞ！](https://qiita.com/4ma9147/items/fc3f9fcf36572596fdf1)

# 実装
今回はアプリケーションがHerokuにデプロイされているからHerokuのアドオンであるMailgunを利用して本番環境でのメール送信を試みます。

### 手順①：アプリの環境設定
[Mailgunの公式ドキュメント](https://devcenter.heroku.com/articles/mailgun)を参考に、以下のようにファイルを編集。
どちらかというと[Railsチュートリアルの11章](https://railstutorial.jp/chapters/account_activation?version=6.0#sec-activation_email_in_production)を参考にしたほうがわかりやすい。

```ruby:config/environmemts/production.rb
Rails.application.configure do

(中略)

  config.action_mailer.raise_delivery_errors = true

  config.action_mailer.delivery_method = :smtp
  host = 'https://furima-34501.herokuapp.com/'
  config.action_mailer.default_url_options = { host: host }
  ActionMailer::Base.smtp_settings = {
    :port           => ENV['MAILGUN_SMTP_PORT'],
    :address        => ENV['MAILGUN_SMTP_SERVER'],
    :user_name      => ENV['MAILGUN_SMTP_LOGIN'],
    :password       => ENV['MAILGUN_SMTP_PASSWORD'],
    :domain         => host,
    :authentication => :plain,
  }

（略）
```

ここで環境変数をいきなり使っていますが、この後にherokuコマンドを打つと自動的にHerokuの本番環境でも環境変数が設定されるようです。なので、あらかじめ先に決められた環境変数名で記述しているだけ。


### 手順②:Herokuのアドオンを追加
まずはアプリケーションをHerokuにデプロイしましょう。

```ruby
% git push heroku master
% heroku run rails db:migrate
```

デプロイできたら以下のコマンドを実行。

```ruby
% heroku addons:create mailgun:starter
```
最後のstarterとは、アドオンのプラン名です。今回は無料プランにしています。

ここで、さっきconfig/environmemts/production.rbに記載した環境変数が設定された確認できます。

```ruby
% heroku config:get MAILGUN_SMTP_LOGIN
% heroku config:get MAILGUN_SMTP_PASSWORD
```

実行すると、ちゃんと環境変数が結果に返ってくるはず！

### 手順③:受信メールの認証
無料プランを利用している場合は、承認された受信者にのみ送信するように制限がかかっているため、本番環境でメールを送るアドレスを認証する作業が必要となる。
以下のコマンドを実行。

```ruby
% heroku addons:open mailgun
```

すると、MailgunダッシュボードのURLが表示され、勝手にブラウザが起動します。

[MailGun公式ドキュメント](https://help.mailgun.com/hc/en-us/articles/217531258)に従い、受信するメールアドレスを認証します。画面左側の「Sending」→「Domains」のリストにある「sandbox」で始まるサンドボックスドメインを選択します。
画面右側の「Authorized Recipients」にメールを送信するアドレス（とりあえず自分の個人アドレスとか）を入力し、認証します。

# 最後に
今回は無料プランかつHerokuにデプロイしたアプリケーションでの実装でした。
Railsチュートリアル様、ありがとうございました！
【TypeScript】TypeScript の static プロパティ/メソッド

# TypeScript の static プロパティ/メソッド
* static プロパティ/メソッドを使うと、newしてクラスのインスタンスを作らずとも、クラスのプロパティ、メソッドを使えます
    * クラスに utilityメソッド(複数箇所で使う便利ツール) を用意して、外部で使う場合などに便利です(^o^)
* staticプロパティは、インスタンスからアクセスできないので、コンストラクタや、static以外のメソッドから、アクセスできないです
    * 例えば Mathクラスのメソッドも、Mathクラスをnewしなくても使えますね〜

```tsx
//staticメソッドの例
Math.pow();
```

#staticプロパティを作成する
* staticプロパティには、`this.(プロパティ)` のようにアクセスできません
    * thisはクラスを元に作られたインスタンスを指すからです
* クラス名を指定したら、staticプロパティにアクセス可能になります

```ts
 class Department {
  static fiscalYear = 2021; //staticプロパティ
  protected employees: string[] = [];

  constructor(protected readonly id: string, public name: string) {
    //console.log(this.fiscalYear); //NG
    console.log(Department.fiscalYear); //OK
  }
}
```

#staticメソッドを作成する
* メソッド名にstaticをつけると、newしなくても、外部で利用可能になります

```ts
 class Department {
  static fiscalYear = 2021; //staticプロパティ
  protected employees: string[] = [];

  constructor(protected readonly id: string, public name: string) {
    //console.log(this.fiscalYear); //NG
    console.log(Department.fiscalYear); //OK
  }

  static createEmployee(name: string) { //staticメソッド
    return { name: name };
  }
}


const employee1 = Department.createEmployee('NEKO'); //newしなくてOK
console.log(employee1, Department.fiscalYear);

```
はい、CodePipelineのビルドで「An error occurred (AccessDeniedException) ～」と怒られた人集合

DockerのコンテナをいちいちビルドしてECRにプッシュするの面倒くさいなと思い、CodePipelineというサービスを使ったのですが、何回ビルドしても以下のようなエラーが起きるんです。

```
An error occurred (AccessDeniedException) when calling the GetAuthorizationToken operation: User: arn:aws:sts::***:assumed-role/zaemonia/AWSCodeBuild-*** is not authorized to perform: ecr:GetAuthorizationToken on resource: *
Error: Cannot perform an interactive login from a non TTY device

[Container] 2021/02/27 06:47:26 Command did not exit successfully aws ecr get-login --no-includeemail --region a--northeast-1 exit status 1
[Container] 2021/02/27 06:47:26 Phase complete: PRE_BUILD State: FAILED
```

要するにECRのリポジトリにアクセスする権限が無いんですね。

じゃあ追加してあげましょう！！

サービス検索欄で「CodePipeline」と検索。

「ビルド」→「ビルドプロジェクト」→任意のビルドプロジェクトをクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954754/fe24c255-5240-c0be-e892-26b21d10a0e6.png)

このような画面になると思います。

ここから「ビルドの詳細」タブから「環境」→「サービスロール」をクリック。

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954754/34d63af7-3543-ca9d-8a81-3ebac755fe23.png)

「ポリシーをアタッチします」→「AmazonEC2ContainerRegistryPowerUser」を追加してください！

これでビルド無事ビルドを行うことができます。

ちゃっかり時間かかったのでくれぐれもお気を付けください。

以上、「はい、CodePipelineのビルドで「An error occurred (AccessDeniedException) ～」と怒られた人集合」でした！

また、何か間違っていることがあればご指摘頂けると幸いです。

他にも初心者さん向けに記事を投稿しているので、時間があれば他の記事も見て下さい！！

あと、最近「ココナラ」で環境構築のお手伝いをするサービスを始めました。

気になる方はぜひ一度ご相談ください！

Thank you for reading
TabBarControllerのitem選択時にTableViewの一番上までスクロール

##はじめに
TwitterやInstagramのようなTabBarのitemを選択したら一番上までスクロールするあれを実装したかった。

古い記事が多かったので、書いてみました。

##実行環境
Swift5
Xcode 12.4


##コード

```
func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
        let tabBarIndex = tabBarController.selectedIndex
        if tabBarIndex == 0 && tabBarController.selectedViewController == tabBarController.viewControllers?[0] {

            let indexPath = NSIndexPath(row: 0, section: 0)
            let navVC = viewController as? UINavigationController
            let yourVC = navVC?.viewControllers[0] as? YourViewController
            yourVC?.tableView.scrollToRow(at: indexPath as IndexPath, at: .top, animated: true)

        }
        return true
    }
```
条件がtabBarIndexだけだと、画面の切替時にも一番上までスクロールしてしまうので、
選択されているVCを論理積で指定しました。

上のコードの問題点（追記）
・TabBarの切替時 layerにアニメーションを付けたとき、viewControllers[0]から遷移するときだけアニメーションがつかなくなってしまう。
・もっとシンプルに。
→内部パラメータviewControllerに変えました。

```
if tabBarIndex == 0 && tabBarController.selectedViewController == viewController
```
##おわりに
少し沼ったので共有させていただきました。
Raspberry Pi Compute Module 4にOSを書き込む（SDカード不要・SSHとUSB2.0の有効化）



#用意するもの

・Raspberry Pi Compute module 4
・IOボード
・ACアダプター（12V 0.5Aで動作確認済み）
・USBケーブル（microB）
・ジャンパー

＊SDカードは必要ありません．

#手順

##rpibootをインストールする

https://github.com/raspberrypi/usbboot/raw/master/win32/rpiboot_setup.exe

こちらのURLに飛び，rpiboot_setup.exeをダウンロード＆インストールします．
rpiboot_setupをインストールすることで，ラズパイ本体内蔵のメモリーをストレージとして認識してくれるようになります．

##Raspberry Pi imagerをインストールする

https://www.raspberrypi.org/software/

こちらのURLに飛び，環境に合わせてimagerをインストール．

![sdv.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519618/376eef74-4571-ff5d-71b4-89701d05a0c6.png)



##ボードの準備

＊まだ電源を投入しないこと．
IOボード上のJ4ピンヘッダの一番左にジャンパーを差し込みます．
こうすることで電源投入後にeMMCからのbootを拒絶することができます．

![kko.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519618/cc09f180-a29b-8393-1030-e9d5dc6fbc2b.jpeg)

拒絶を設定し，USBmicroB端子にケーブルを差し込み，PCと接続します．
最後にACアダプターの電源を入れます．

![kki.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519618/0546e7e7-7f94-5fa0-3eea-192eda552f53.jpeg)

ジャンパーを差し込み，rpibootのインストールに成功するとラズパイCM4はマスストレージとしてPCに認識されます．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519618/2e3db4d5-ac2b-277f-256c-e136af02e94f.png)

##Raspberry Pi imagerを開く

左から順に書き込むOSを選択します．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519618/e30a26b8-64c1-b658-4626-e92c326eed0c.png)


書き込む先はもちろんラズパイ本体内蔵のeMMcを選択します．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519618/ca3a5c7e-a2e4-cafb-4890-8fde9d40cf5f.png)

Writeを選択して，書き込みを開始します．
約10分程度で書き込みが完了します．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519618/5624c7fe-0709-0291-c4fa-79b1e5cc294b.png)


#USB2.0を有効化してマウスとキーボードを認識させる

ラズパイComputeModule4はデフォルトでSSHやUSB2.0が有効化になっていないため，
OSをインストールしても操作不可能な状況に陥ります．
なので，先ほどの「rpiboot」を使用してCM4のeMMCに保存されているconfigファイルを直接編集します．

##1.ラズパイの電源を切る
ラズパイは起動直後の状態を認識するので，一旦電源を落とします．
##2.eMMCブートを拒絶するために先ほど同様にジャンパーを接続する
PCから再度マスストレージとして認識させます．
##3.PCとUSBケーブルで接続して，ラズパイの電源を入れる
##4.rpibootを起動して，マスストレージとして認識させます．
認識後は直接ファイル内のconfig.txtを開き，
このように追記します．

```
dtoverlay=dwc2
dr_mode=host
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519618/3de1821a-8ad3-6130-d209-7fe79310b2eb.png)


保存したら電源を落としてジャンパーを外し，
電源を入れ直すことでUSB2.0が起動時に有効化されます．
この後にOS内でSSHを有効化します．

#参考

https://www.raspberrypi.org/documentation/hardware/computemodule/cm-emmc-flashing.md
https://www.jeffgeerling.com/blog/2020/usb-20-ports-not-working-on-compute-module-4-check-your-overlays
【自分用メモ】ghqについて

ghqというローカルリポジトリの一元管理みたいなものを教えてもらったので忘れない様にメモります。

使う理由
ローカルのどこにリポジトリを置いたか訳がわからなくなるので
ローカルのディレクトリにまとめて管理することで管理の簡易化をすることを目的とする。

ローカルのディレクトリの使い方に悩んでいたので解決しました。


手順については以下の記事を参考させていただきましたので省略
https://qiita.com/itkrt2y/items/0671d1f48e66f21241e2

エイリアスについてはバッシュのプロファイルに追記する必要があります。

gコマンド
エイリアスで設定したコマンドで一覧から選択したリポジトリのディレクトリに飛べる

gh
エイリアスで設定したコマンドで一覧から選択したローカルリポジトリのサイトに飛べる。


ghqのローカルリポジトリを更新したいなら、そのディレクトリで
git pullを行う。

ghqで修正したリポジトリをローカルリポジトリに渡したいのであれば
git add
git commit 
git push などを実施する。
生成したダイアログでRiverpodで提供しているStateの変更を反映させる

https://wally-ngm.hatenablog.com/entry/2021/02/27/163630

Riverpodの使っているFlutterのアプリケーションで，StateNotifierで提供しているオブジェクトをwatchし，それをダイアログに渡して表示させたり，stateを変更したい場合，ダイアログそのものでwatchする必要がありそうです(引数で渡すだけではNG)．


Dialog内でもStateNotifierから提供させるオブジェクトをwatchしてあげないと，stateの変更がUIに反映されませんでした．

もちろん，ダイアログも `ConsumerWidget`を継承させてあげる必要があります．

```
class Dialog extends ConsumerWidget {
  @override
  Widget build(BuildContext context, ScopedReader watch) {
    final viewModelState =
        watch(XXXNotifierProvider().state);
    final viewModel =
        watch(XXXNotifierProvider());
    return Dialog(．．．);
}

```


RiverpodのStateNotifierProviderが返すオブジェクトはシングルトンになっているので問題もないです．

Riverpod，便利ですね．．．
GraphQLのマネージド・サービス AWS AppSyncを軽く触ってみた

#はじめに
以前、<a href="https://qiita.com/suzuki0430/items/2d6e1fa59608144b402e">Node.js+MongoDB構成で簡単なGraphQLサーバをつくりました。</a>Schema, Query, Mutationの作成に意外と時間がかかったので、もっと簡単に構築できる方法がないか調べたところ、AWSにAppSyncというサービスがあることを知りました。AppSyncを使うと、Schemaを作成するだけでQueryとMutationの作成やDB接続を簡単にできるということだったので、学習のために触ってみることにしました。

#AWS AppSyncとは
AppSyncはGraphQLのマネージド・サービスです。
以下の特徴があり、このサービスを使うと拡張性高くセキュアなリアルタイムアプリケーションを簡単に作ることができます。

- Schemaを定義するだけでQueryとMutationとSubscriptionを自動作成
- DBとの自動接続
- 複数のDBの切り替え
- データへのセキュアなアクセス
- オフラインアクセス

＊Subscriptionというのは、リアルタイムでデータを取得するために使われるものです。これを使うと、例えばクライアントAがデータ登録を行ったときに、クライアントBの表示がデータ登録後の値にリアルタイムで切り替わります。

<a href="Black Beltの資料が非常に詳しいのでこちらを読むのが">Black Beltの資料</a>にもっと詳しい内容が載っています。

#API作成手順
AWSマネジメントコンソールでAWS AppSyncを検索し、``APIを作成``を選択すると以下の画面になります。
APIを作成する方法が6つあるのですが、今回は１からAPI構築する手順を学ぶのが目的なので、``ウィザードで作成``を選択します。
![スクリーンショット 2021-02-27 14.52.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/8efb793d-dee2-c37f-190e-ff12932c2592.png)
モデルを作成する画面になります。モデルはGraphQLのSchemaにあたるもので、ここで名前やフィールドの設定を行います。モデルテーブルは対応するDBのテーブルにあたります。
![スクリーンショット 2021-02-27 15.12.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/40e9d090-97bb-9c75-221d-b0cd9e337f3b.png)

API名を入力して``作成``を押します。
![スクリーンショット 2021-02-27 15.13.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/440ee8ad-9457-cb7f-3d36-db1b996680fa.png)

以下の画面になります。スキーマの画面にMutationとQueryが作成されていることを確認できます。
![スクリーンショット 2021-02-27 15.22.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/941f2dd0-dfd6-d1c9-01ba-1105f1aae950.png)

また、データソースをみるとDynamoDBにテーブルが自動で作成されていることも確認できます。
![スクリーンショット 2021-02-27 15.27.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/c89482c3-24e7-478e-f5ea-07a8210e5aee.png)

試しにクエリからMutation(CreatePracticeAppType)を実行すると、ちゃんとDBにデータが登録されています。
![スクリーンショット 2021-02-27 15.31.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/6f60d9e6-3259-81cd-3a7a-6d9753cc2cf8.png)
![スクリーンショット 2021-02-27 15.32.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/508cf4f1-9114-5cf7-6889-1cc0fd659f37.png)

**AWSコンソールにログインしてからここまでなんと3分しか経っていません。**すげー。

#resolverのカスタマイズ
Muttionを実行できたのでresolverも自動で設定されているわけですが、こちらのカスタマイズも自由に行うことができます。GraphQLリクエストをデータソースの命令に変換する側(リクエストマッピングテンプレート)と、データソースからの応答をGraphQLレスポンスの応答に変換する側(レスポンスマッピングテンプレート)の2つをVTLという言語で好きにカスタマイズすることができます。
![スクリーンショット 2021-02-27 16.00.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/870590c7-800d-6965-9746-5d16ee29eae5.png)

#クライアント(アプリ)との接続
amplifyというサーバレスなバックエンドを簡単に構築するためのJavaScriptライブラリを使うことで、AppSyncで作成したGraphQL APIを自分のアプリと接続することができるようになります。
![スクリーンショット 2021-02-27 16.08.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/f5949e70-7500-498e-3291-3aeb99fe17f1.png)

#おわりに
今度はAWS Amplifyを使って、APIを含めたバックエンドの構築をやってみたいと思います。
Ethereum: イーサリアムのトランザクションに署名付きデータを埋め込み、コントラクトでその署名を検証する方法 (ethers.js編)

以前詳しく書いたので、基本的には以下の記事を参照してもらいたい。

https://bit.ly/3b0JHyS

上記の記事ではWeb3.jsを使っていたので、ethers.jsでの書き換え方法をメモ。

### web.js
```javascript
// sign
let messageHash = web3.utils.soliditySha3(message.tokenId, message.value, message.expirationTime)
console.log(`messageHash: ${messageHash}`)
let signature = await web3.eth.sign(messageHash, web3.eth.accounts.wallet[0].address)
console.log(`signature: ${signature}`)
```

### ethers.js
```javascript
// sign
let messageHash = ethers.utils.solidityKeccak256(['uint256', 'string', 'bytes', 'uint256'], [tokenId, tokenURI, author, price]);
console.log(`messageHash: ${messageHash}`)
let messageHashBinary = ethers.utils.arrayify(messageHash);
let signature = await ownerAccount.signMessage(messageHashBinary);
console.log(`signature: ${signature}`)
```
オンプレ環境で使えるDiscordの読み上げBotを作りました

# 事の発端

知り合いとのDiscordサーバーでは土日に通話しながらゲームをするときに、テキストチャンネルで発言するのみで喋らない"聞き専"が結構います。
そこでチャットを読み上げてくれる「Shovel」というBotを導入しました。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206651/46d9d2eb-4c27-84d3-7427-3b2b0fb66c15.png)
しかし、土日の夜は非常に人が多いのか、ボイスチャットに呼ぼうとしても呼べない時が何度かあり、そこで自分たち専用のBot用サーバーを用意する案が上がります。

# Raspberry Piを入手
秋葉原に行って、Raspberry Pi4と電源などの一式を入手。
早速、以下の条件を満たす読み上げDiscord Botを探し始めます。

- ラズパイ上で動く
- Dockerでいける(環境を汚したくないため)
- オンプレ環境で使える
- 完結している、クラウドサービスを使っていない(Cloud Text-to-Speechなど)

しかし案外見つからず[^1]、結局自分で作る事にしました。

# 成果物

[よみのん](https://github.com/PenguinCabinet/yominon)
上の四つの条件を満たしたDiscord用読み上げBotです。
Discord.js+Open Jtalk+Dockerで作成しています。
[Discord用のBOT KEY](https://discord.com/developers)を発行した後に、適当にVPSや自前のラズパイによみのんをデプロイしてもらえば動きます。
詳しくはの[よみのん](https://github.com/pengincoalition/yominon)のReadme.mdを見て下さい。

Issue、Starは大歓迎です。

[^1]: 単純に僕の検索能力不足...？
初めてのRaspberry Pi Pico ㉗ C言語 PWM その3 

　PWMの周波数設定がわかりにくかったので、整理します。

```cpp 

// Output PWM signals on pins 2 and 3

#include "pico/stdlib.h"
#include "hardware/pwm.h"
#include <stdio.h>
#include "hardware/clocks.h"
#include <math.h>

int main() {
    stdio_init_all();  // need when UART 

    printf("\nstart GPIO 2,3\n");

    gpio_set_function(2, GPIO_FUNC_PWM);
    gpio_set_function(3, GPIO_FUNC_PWM);

    // Find out which PWM slice is connected to GPIO 2 (it's slice 0)
    uint slice_num = pwm_gpio_to_slice_num(2);

    // Set period
    pwm_set_wrap(slice_num, 99);

    // Set channel A output high for one cycle before dropping
    pwm_set_chan_level(slice_num, PWM_CHAN_A, 10);
    // Set initial B output high for three cycles before dropping
    pwm_set_chan_level(slice_num, PWM_CHAN_B, 50);
    // Set the PWM running
    pwm_set_enabled(slice_num, true);
}
```

　wrapを100回繰り返すと``125MHz　÷　100　= 1.25MHz``になります。では1.0MHzはどうやって作るのでしょうか。
　分周ユニットは8.4の固定小数点で表現されます。整数が8ビット、小数点が4ビットです。

```
    pwm_set_wrap(slice_num, 99);
```

の後ろに、

```
    uint8_t div = 1;
    uint8_t fract = 4;
    pwm_set_clkdiv_int_frac(slice_num, div, fract);
```

　整数1は、倍率1です。
　小数点部分は1/2^nの重み付けになります。4は2進数では
``0100 = 0 * 1/2^1 + 1 * 1/2^2 + 0 * 1/2^3 + 0 * 1/2^4``
``= 0.25``
合成すると1.25なので、1.25MHz/1.25=1MHzになります。
![Screen 0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/65c78e1c-7446-f001-43f1-e64daf1b9926.png)

もう一例。

```
    uint8_t div = 2;
    uint8_t fract = 8;
    pwm_set_clkdiv_int_frac(slice_num, div, fract);
```
　整数2は、倍率2です。
　小数点部分は1/2^nの重み付けになります。8は2進数では
``1000 = 1 * 1/2^1 + 0 * 1/2^2 + 0 * 1/2^3 + 0 * 1/2^4``
``= 0.5``
合成すると2.5なので、1.25MHz/2.5=500kHzになります。
![Screen 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/dff0c1fb-3769-41de-c436-16869e139819.png)

 最後に、980Hzが欲しいなら、

``1.25MHz/980=1275.5102``
整数部は2^8=256を超えているので設定できません。pwm_set_wrap(slice_num, 999);に設定し、基準となるクロックを125kHzまで落とします。
``125kHz/980=127.551``
　したがって、整数部を127に、小数点部分を8にしました。980.39Hzとほぼ近い周波数になりました。warpは16ビットなので、もっと基準となる周波数を下げれば、目的に周波数に近づけると思います。

![Screen 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/0b488896-6bde-e020-7f60-6a9e96f757d1.png)

```cpp
// Output PWM signals on pins 2 and 3

#include "pico/stdlib.h"
#include "hardware/pwm.h"
#include <stdio.h>
#include "hardware/clocks.h"
#include <math.h>

int main() {
    stdio_init_all();  // need when UART 

    printf("\nstart GPIO 2,3\n");

    gpio_set_function(2, GPIO_FUNC_PWM);
    gpio_set_function(3, GPIO_FUNC_PWM);

    // Find out which PWM slice is connected to GPIO 2 (it's slice 0)
    uint slice_num = pwm_gpio_to_slice_num(2);

    uint16_t divCounter = 1000; // max 2^16 = 65536
    pwm_set_wrap(slice_num, divCounter-1);

    uint8_t div = 127;
    uint8_t fract = 9;
    pwm_set_clkdiv_int_frac(slice_num, div, fract);


    // duty 10%
    pwm_set_chan_level(slice_num, PWM_CHAN_A, (int)divCounter*0.1);
    //  duty 50%
    pwm_set_chan_level(slice_num, PWM_CHAN_B, (int)divCounter*0.5);
    // Set the PWM running
    pwm_set_enabled(slice_num, true);
}

```
ruby on rails 非同期いいね（編集中）

# アプリケーションの立ち上げ
```ruby
% rails new favorite-app -d mysql
% cd favorite-app
```
# アプリ名/config/database.ymlの下部に以下を追記

```ruby
default: &default
  adapter: mysql2
------------この部分を追記-----------------
  # encoding: utf8mb4
  encoding: utf8
------------この部分を追記-----------------
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password:
  socket: /tmp/mysql.sock

development:
  <<: *default
  database: favorite_app_development
```


```ruby
% rails db:create
% rails g scaffold post title:string user_id:integer   #postコントローラ作成
% rails g controller likes                             #likesコントローラ作成
% rails g model Like user_id:integer post_id:integer
```

# Gemfileの下部に以下を追記
```ruby
gem 'devise'
gem 'font-awesome-sass'
```

# Gemfile編集後に実行
```ruby
% bundle install
% rails g devise:install
% rails g devise user
% rails db:migrate
```
#「application.css」を「application.scss」に変更
#その後以下のコードを追記。

// application.scssの下部に以下を追記(既存のコードは消さない)

```ruby
/*
 * This is a manifest file that'll be compiled into application.css
 * vendor/assets/stylesheets directory can be referenced here using a relative path.
 * 省略
 *= require_tree .
 *= require_self
 */

------------この部分を追記-----------------
@import "font-awesome-sprockets";
@import "font-awesome";
------------この部分----------------------
```
# favorite-app/app/javascript/packs/application.jsを編集
```ruby
require("@rails/ujs").start()
// require("turbolinks").start()   ⇐この行を削除
require("@rails/activestorage").start()
require("channels")
```
pythonでクレカの確定明細から確定金額をLINEに通知する

#目的
パートナーがいる方は共有でかかったお金をなんらかの形で管理しているかと思います。
今回はJCBのクレジットカード当月確定分の金額をLINEに送信するというプログラムを作成しました。

#環境構築
windows8
anacondaをインストール
python3.7.5

#ソース
ソースの説明をすると、
まずPhantomJSと呼ばれるプログラム上でブラウザの実行ができる環境を利用しています。
そしてブラウザの操作の部分はseleniumと呼ばれるライブラリを使用しています。

PhantomJSとseleniumでブラウザ操作してMYJCB画面の当月確定分の金額を取得して、
LINEのNotifyにリクエストを投げています。

これを毎月決まった日にいちいちログインせずとも自動実行させてかかった金額をパートナーに教えてあげられます。

```python:kurekameisai.py
# -*- coding: utf-8 -*-
import urllib.request
from selenium import webdriver
import time
from selenium.webdriver.common.keys import Keys
import json
import requests

def serch():

    browser  = webdriver.PhantomJS()
    loginURL = "https://my.jcb.co.jp/Login"
    browser.get(loginURL)
    time.sleep(3)

    #sign-in
    username     = "" # ユーザー名
    password     = "" # パスワード
    secretAnswer = "" # 秘密の答え

    browser.find_element_by_id("userId").send_keys(username)
    browser.find_element_by_id("password").send_keys(password)
    browser.find_element_by_id("loginButtonAD").click()
    browser.find_element_by_id("form1:answer_").send_keys(secretAnswer)
    browser.find_element_by_id("form1:j_idt65").click()

    URL = "https://my.jcb.co.jp/iss-pc/member/details_inquiry/detail.html?detailMonth=1&output=web"
    # なぜか2回同じURLを指定すると目的のページへ繊維できる
    browser.get(URL)
    browser.get(URL)
    time.sleep(3)

    # 今月分の確定金額を返す
    return browser.find_element_by_class_name('price-02').text

def main():
    # LINE Notify Token
    access_token = '' # LINEのアクセストークン
    url          = 'https://notify-api.line.me/api/notify'

    headers = {
        'Authorization': 'Bearer {}'.format(access_token),
    }

    # LINEに送るメッセージを指定
    payload = {
        'message': 'リクルート今月支払' + serch(),
    }

    # request Notify
    response = requests.post(url, headers=headers, params=payload)
    #res      = json.loads(response.text)
    #print(res)

    return True

if __name__ == '__main__':
    main()
```
コレログラム

・　自己相関係数
時系列データ$y_{t}$を$t$より$k$単位ずらした点での値$y_{t-k}$を考える。これはグラフをx軸に対してk平行移動したものになる。
その時、時間$t$のときの$y_t$と時間$t-k$のときの$y_{t-k}$との相関係数をとったものが自己相関係数になる。どれだけ自分自身との相関があるかを調べる。

```math
R_{t,k}=\frac{\sum_{t=k+1}(y_t-\bar{y})(y_{t-k}-\bar{y}) }{\sum_{t=1}(y_t-\bar{y})^2}
```

y軸に$R_{t,k}$、x軸に時系列をとったものがコレログラムです。
OctoberCMS 管理画面実装テク：テキストフィールドの文字数制限を変更する

OctoberCMSの自作プラグインで管理画面を実装する際のテクニックのお話。

管理画面フォームのtextタイプのフィールドはデフォルトで255文字の制限がある。
これは`attributes`プロパティを使えば属性を上書きできる。

```yaml
myfield:
    label: "My Field"
    type: text
    attributes:
        maxlength: '1000'
```

#### 参考

https://octobercms.com/forum/post/override-maxlength255-attribute-in-backend-on-input-fields
AWS Elastic Beanstalk とは？

## 勉強前イメージ

アプリをどうにかするやつ？
豆の木ってどういうことなんやろ

## 調査

### AWS Elastic Beanstalk とは

AWSで簡単にWebアプリが実行できるサービスになります。
通常であれば、EC2インスタンスを立ててapacheをインストールして、セキュリティグループを設定してオートスケールの設定を・・などありますが、
サーバを立てるところからすべてEC2でやってもらえるサービスになります。
アプリケーションを実行するミドルウェアやOSは準備されており、コードさえアップロードすればwebアプリケーションを動かすことができ、
webサーバのインストールもELBによる負荷分散なども不要です。

### イメージ

イメージとしては、
通常であれば用意しないといけないのは `サーバ、webサーバ、プログラム(青い箇所)` ですが、
Elastic Beanstalkであれば `プログラム(青い箇所)` のみでwebアプリケーションを動かすことが出来ます。

- 通常のイメージ

![1AWS Elastic Beanstalk とは？ - diagrams.net - Google.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/aacd814b-33ae-6d01-f906-f40fe4cc83fb.png)

- Elastic Beanstalk のイメージ

![2AWS Elastic Beanstalk とは？ - diagrams.net - Google.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/ed8a5c3e-941b-ff51-d7b6-dff44b05b4ac.png)

### マネジメントコンソールで確認

- マネジメントコンソールでアプリケーションを構築

![1Elastic Beanstalk マネジメントコンソール - Google Chrome 2021.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/b4a31db9-fb7d-c073-b073-1eb88f38f0e7.png)

- 設定を記載していく

アプリケーション名を記載し、
プラットフォームの設定も記載します。

![2Elastic Beanstalk マネジメントコンソール - Google Chrome 2021.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/d884db08-880a-5e18-fa37-91524b4543c6.png)

- 構築を開始

構築に進めれば、構築されていきます。

![3環境の作成 - Google Chrome 2021-02-27 15.28.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/35b370e1-e423-f031-7639-90e8081e5fab.png)

- 構築完了

構築ができればこちらで状態を見ることが出来ます。

![4Qiitatest-env - ダッシュボード - Google Chrome 2021-02-27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/306cea12-a4df-6fd9-9c9c-324550fe90c7.png)

### 費用

Elastic Beanstalk 自体の費用は無料だが、
それにかかるEC2インスタンスなどの費用が1時間毎につきかかってきます。

## 勉強後イメージ

こんな便利なのがあるのかーーすごいーー
いろいろEC2の設定してーいろいろーってちょっとめんどくさいときがあるから、
これだとパッとできるね！

## 参考

- [AWSでおてがる開発シリーズ！AWS Elastic Beanstalkでアプリデプロイ編](https://www.tdi.co.jp/miso/aws-elastic-beanstalk)
- [AWSの自由自在なPaaS「Elastic Beanstalk」とは](https://www.atmarkit.co.jp/ait/articles/1106/15/news128.html)
z/OSからRHELへ送信されてきたテキストファイルの中身を確認する

# 背景
HULFTを使用してIBMのメインフレームz/OSからRHELへデータ送受信をする際に、HULFTで文字コード変換はしないという要件だった。
z/OSとRHELでは文字コードが違う(z/OS: EBCDIC、RHEL: UTF-8)ため、普通に`cat`コマンドで中身を見ると文字化けしてしまう。
データが正常に受信できているかを確認するのに少し手間取ったため、対応内容のメモを残しておく。

# 対応内容
## iconvコマンドで変換
最終的にたどり着いたのは`iconv`コマンドで変換するやり方だった。
こっちの方が簡単に中身を確認できる。
入力のオプション`-f`には EBCDIC-IT を指定し、出力のオプション`-t`には UTF-8 を指定する。

```
[root@hogehoge ~]# ls -l /tmp/HULFT.TESTDATA*
-rw-rw---- 1 root root 80 12月 10 13:33 /tmp/HULFT.TESTDATA
[root@hogehoge ~]# 
[root@hogehoge ~]# iconv -f EBCDIC-IT -t UTF-8 /tmp/HULFT.TESTDATA -o /tmp/HULFT.TESTDATA.txt
[root@hogehoge ~]# 
[root@hogehoge ~]# ls -l /tmp/HULFT.TESTDATA*
-rw-rw---- 1 root root 80 12月 10 13:33 /tmp/HULFT.TESTDATA
-rw-r--r-- 1 root root 80 12月 10 13:35 /tmp/HULFT.TESTDATA.txt
[root@hogehoge ~]# 
[root@hogehoge ~]# cat /tmp/HULFT.TESTDATA.txt
HAISIN TEST                                                                     [root@hogehoge ~]# 
[root@hogehoge ~]# 
```

## odコマンドで変換
`od`コマンドで変換し、z/OS側で出してもらった文字コードと突き合わせ or [EBCDIC文字コード表](https://software.fujitsu.com/jp/manual/manualfiles/m130010/b1fw5992/01z200/b5992-c-00-00.html)と突き合わせする方法で確認できる。
1バイト単位16進数らしいので、オプション`-t x1`を指定する。
確認は手間だけれど、文字コードの仕組みが見れて個人的にはちょっと楽しかった。

```
[root@hogehoge ~]# ls -l /tmp/HULFT.TESTDATA
合計 4
-rw-rw---- 1 root root 80 12月 10 13:33 HULFT.TESTDATA
[root@hogehoge ~]# 
[root@hogehoge ~]# od -t x1 /tmp/HULFT.TESTDATA
0000000 c8 c1 c9 e2 c9 d5 40 e3 c5 e2 e3 40 40 40 40 40
0000020 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40
*
0000120
[root@hogehoge ~]# 
```
【heroku デプロイ】アプリ新規作成と更新のやり方

#【heroku デプロイ】新規と更新のやり方
herokuを使えば、コードを定期実行することができます。
無料なので、botとか作りたい時にオススメ。

###備忘録としてメモ書き。
筆者もちょいちょい忘れることが多いので、
折角なので新規と更新のやり方をまとめることにした。

なお、`更新は、たったの2行で済む`。

```:terminal
$heroku login
$git push heroku master
```

##デプロイ・新規
###まずはインストール済かどうか確認
```:terminal
$git --version
$heroku -v
```

###gitをインストール
https://git-scm.com/downloads

###herokuをインストール
```:terminal
$brew tap heroku/brew && brew install heroku
```

###herokuにログイン
```:terminal
$heroku login
```
ブラウザでherokuのログイン画面が自動で立ち上がるので
ユーザー名とパスワードを入力してログイン。

###herokuにアプリを作成
```:terminal
$heroku create アプリ名(重複作成できない)
```
ここで`出力される***.gitをメモしておく`こと。

###runtime.txtとrequirements.txtを作成
```:runtime.txt
python-3.9.1
```

```:requirements.txt
appnope==0.1.2
argon2-cffi==20.1.0
asgiref==3.3.1
async-generator==1.10
attrs==20.3.0
autopep8==1.5.4
backcall==0.2.0
beautifulsoup4==4.9.3
bleach==3.2.1
bs4==0.0.1
cachetools==4.1.1
certifi==2020.11.8
////(省略)
```

###herokuへアプリをデプロイ
```:terminal
$git init
$git remote add heroku (先程メモした***.git)
$git add .
$git commit -m "（メッセージ・コミット内容）"
$git push heroku master
```
これにてデプロイ完了。


###Heroku Schedulerの設定
定時実行のHeroku Schedulerの設定を行う。

```:terminal
$heroku addons:add scheduler:standard
$heroku addons:open scheduler
```
ブラウザが開かれて設定。
※UTCが基準になっているため設定する時間は、
実行したい時間-9時間となるように設定すること。


##デプロイ・更新
###変更分をGitHubデスクトップでcommit,push。
###herokuへログイン。
```:terminal
$heroku login
```

###herokuにデプロイ。
```:terminal
$git push heroku master
```
RDKit入門①：まずは環境構築

##はじめに

RDKitの使い方について、自分の興味のある範囲から少しずつまとめていきます。
使い方の学習にあたっては「化学の新しいカタチ」さんの記事を主に参考にしています。
https://future-chem.com/

まずは環境構築から（とりあえず動けばいいという方向けです）。
(以下の内容は主にWindows 10での使用を想定しています)

***

### Anacondaのインストール
まずはAnacondaをインストールします。
https://www.anaconda.com/products/individual
ページ下部にAnaconda Installerという部分があるので、お使いの環境に合わせてインストールを行います。

具体的な手順は以下のサイトを参考にしてください。
https://www.python.jp/install/anaconda/windows/install.html

***

### RDKitのインストール
デフォルトではRDKitがインストールされていないため、まずはRDKitのインストールを行います。
Anaconda Prompt (Anaconda3)を開き、黒い画面が出たら以下の呪文を打ち込みます。

```python
>conda config --add channels conda-forge
```
※RDKit を conda-forge 経由でインストールするためにチャンネルを追加

続いてRDKitのインストールを行います。

```python
>conda install -c conda-forge rdkit
```

途中で

```python
Proceed ([y]/n)?
```
と表示されることが何度かあると思いますが、`y`で続行します。

***

###インストールできたかどうかの確認
まずはお好みの開発環境を開きます。
AnacondaをインストールするとJupyter NotebookやSpyderが一緒にインストールされているので、どちらか好みのソフトを開きましょう。

続いて以下の通りに打ち込んで実行します。

```python
from rdkit import rdBase
print('rdkit version: ', rdBase.rdkitVersion)
```

エラーが出ずに以下のような表示があれば導入成功です。
（表示されるバージョンは導入時期等の環境によって異なります）

```python
rdkit version:  2020.09.4
```
Unreal Engine 4でcloneしてC++コードを開こうとするとslnが見つからないと言われVisual Studioで開けないとき

## 現象

git上にpushしてcloneしたUE4プロジェクトからC++コードをダブルクリックしてもcould not find ~~slnと言われてしまう

## 理由

UE4が自動で.gitignoreにslnを設定しているためなくなってしまう

## 対処

Unreal Engine上から新しいC++クラスを作成するとslnが作られて起動できるようになる

## 参考

[Example Project Doesn't Have Visual Studio Solution - Unreal Engine Forums](https://forums.unrealengine.com/development-discussion/c-gameplay-programming/815-example-project-doesn-t-have-visual-studio-solution)
OctoberCMS 管理画面実装テク：フォームに非表示フィールドを作る

OctoberCMSの自作プラグインで管理画面を実装する際のテクニックのお話。

fields.yamlでフィールドを定義して管理画面のフォームを実装する際、`<input type="hidden">`のようなフィールドが意外と直感的に作れない。

`hidden`プロパティでできそうだが、これだとPOSTデータに含まれなくなる。
`readOnly`や`disabled`だと変更不可にはなるがページに表示されてしまう。

そこで、`containerAttributes`プロパティを使用して`display: none`を当ててやる。

```yaml
containerAttributes:
    style: "display: none"
```

これで、POSTデータに含まれるが表示されないフィールドが実装できる。
chatwootをdockerで動かしてみる

# TL;DR
OSSのチャットツールである[chatwoot](https://github.com/chatwoot/chatwoot)をdockerを使って動かしてみます。
（内容は、ほぼほぼ備忘録です）

# リポジトリのクローン
GitHubにあるchatwootのリポジトリをクローンしてきます。

```
git clone https://github.com/chatwoot/chatwoot.git
```

# 設定ファイルの作成
リポジトリ内にある設定ファイルのサンプルをリネームします。

```
cp .env.example .env
```
リネームした上記設定ファイルを編集します。ここでは、redisとpostgresのパスワードを設定します。
（パスワードは任意のものでOK）

```:.env
REDIS_PASSWORD=password

POSTGRES_PASSWORD=postgres
```

# docker-composeの設定
リポジトリ内の`docker-compose.yaml`を編集します。Postgresのパスワードとタイムゾーンを設定します。

```yaml:docker-compose.yaml
# ...(省略)
postgres:
  image: postgres:12
  restart: always
  ports:
    - '5432:5432'
  volumes:
    - postgres:/data/postgres
  environment:
    - POSTGRES_DB=chatwoot
    - POSTGRES_USER=postgres
    - POSTGRES_PASSWORD=postgres # 追加
    - PGPASSWORD=postgres # 追加
    - TZ=Asia/Tokyo # 追加
# ...(省略)
```

# コンテナの作成＆実行
以下のコマンドを叩きます。
DBの初期化に失敗する場合、一度`docker-compose up`でコンテナを起動した後、再度DBを初期化すると、成功するかもしれません。

```
# コンテナをビルド
$ docker-compose build
# DBの初期化
$ docker-compose run --rm rails bundle exec rails db:reset
# コンテナの起動
$ docker-compose up
```

コンテナの停止は、Ctrl+Cで行います。

# chatwootへアクセス
コンテナ起動後、ブラウザから`http://(IPアドレス):3000`にアクセスします。
ログイン画面が表示されるので、john(atmark)acme.inc / 123456でログインします。
（atmarkは記号に置き換えてください）

# 参考サイト
- [dockerを使って「chatwoot」を構築するまでの手順](https://mebee.info/2020/12/11/post-25417/)
jupyter notebook使用時に「The kernel appears to have died. It will restart automatically.」というエラーが出た時の対処

# エラーが出た状況
### 環境
macOS Big Sur 11.2
Python 3.7.3
numpy-1.16.2
pandas-0.24.2
matplotlib-3.0.3 
Pillow-5.4.1
### ソースコード
Kaggleのコンペの問題に取り組む為にjupyter notebookを起動し、必要なライブラリのインポートのために以下のコードを実行しました。

```python
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
```

すると、以下のエラーが発生してしまいました。

```
The kernel appears to have died. It will restart automatically.
```

コードセルの `In[]` の部分は `In[*]` となっているため、正常に実行できていない様子。

# 対処
各ライブラリのバージョンをアップグレードすることで、エラーが解消しました。

numpyのアップグレード

```
pip install --upgrade numpy
```

pandasのアップグレード

```
pip install --upgrade pandas
```

matplotlibのアップグレード

```
pip install --upgrade matplotlib
```

### エラーが解消した時の各ライブラリのバージョン
numpy-1.20.1
pandas-1.2.2
matplotlib-3.3.4
Pillow-8.1.0
chromeでのネットサーフィンを強制終了するbatスクリプト

# 目的
スクリプトの目的はタイトルの通りです。執筆の目的は自分用の備忘録です。

# 環境(?)
Windows10

#スクリプト
```bat:a.bat
timeout 900 /nobreak
taskkill /F /IM chrome.exe
```

#解説
900秒(15分)後にchromeを強制終了するコードです。/F は強制終了に対応します。終了するプロセスをid で指定したい場合は/IMを/PIDで置換して ~.exe をプロセスIDで置き換えましょう。/nobreak は途中でタイマーを止めないためです。
[Windows10] クライアント証明書を生成

# はじめに
* ローカル コンピューターに自己署名入りのクライアント証明書を作成する。
* Azure PowerShell モジュールを備えた PowerShell と Windows 証明書マネージャー ユーティリティを使用

# 手順

## PowerShell: 自己署名入りのルート証明書を作成

```shell

$cert = New-SelfSignedCertificate -Type Custom -KeySpec Signature `
-Subject "CN=P2SRootCert" -KeyExportPolicy Exportable `
-HashAlgorithm sha256 -KeyLength 2048 `
-CertStoreLocation "Cert:\CurrentUser\My" -KeyUsageProperty Sign -KeyUsage CertSign
```

## PowerShell: 新しいルート証明書によって署名されたクライアント証明書を生成
```shell

New-SelfSignedCertificate -Type Custom -DnsName P2SChildCert -KeySpec Signature `
-Subject "CN=P2SChildCert" -KeyExportPolicy Exportable `
-HashAlgorithm sha256 -KeyLength 2048 `
-CertStoreLocation "Cert:\CurrentUser\My" `
-Signer $cert -TextExtension @("2.5.29.37={text}1.3.6.1.5.5.7.3.2")
```

## 証明書マネージャー: 証明書の公開キーをエクスポート

証明書マネージャーをPowerShellから開く

```
certmgr
```

証明書マネージャーで以下を実行

```
1. [個人] > [証明書] の順に移動します。
2. リスト内の P2SRootCert 証明書を右クリックし、[すべてのタスク] > [エクスポート] の順に選択します。
3. 証明書のエクスポート ウィザードで、[次へ] をクリックします。
4. [いいえ、秘密キーをエクスポートしません] が選択されていることを確認し、[次へ] をクリックします。
5. [エクスポート ファイルの形式] ページで [Base-64 encoded X.509 (.CER)] が選択されていることを確認し、[次へ] をクリックします。
6. [エクスポートするファイル] ページの [ファイル名] で、覚えやすい場所を参照して、P2SRootCert.cer としてファイルを保存してから、[次へ] をクリックします。
7. [証明書のエクスポート ウィザードの完了] ページで、[完了] をクリックします。
8. [認定資格証のエクスポート ウィザード] メッセージ ボックスで [OK] をクリックします。
```

# 参考

https://docs.microsoft.com/ja-jp/learn/modules/configure-network-for-azure-virtual-machines/5-exercise-create-azure-vpn-gateway
SourcetreeからGithubにSSH接続する

#はじめに
本記事は自分のための備忘録です。
接続するための最低限の情報のみしか記載していません。

#環境
mac OS BigSur 11.2.1
Sourcetree 4.1.0

```
$ cd ~/.ssh
$ ssh-keygen -t rsa
```

上記ディレクトリ配下にキーペア生成。
![スクリーンショット 2021-02-27 14.51.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262530/cac71ad2-db7a-53cc-d443-06cc8cb131d6.png)

#Githubでやること
###公開鍵を登録
https://github.com/
プロフィールアイコンをクリックしてsetting > SSH and GPG
と進み、SSH keysのNew SSH keyボタンをクリック。
上記で生成したid_rsa.pubの中身をコピペして登録。

#Sourcetreeでやること
環境設定を開いてアカウントタブを開く。
追加...ボタンをクリックしてウインドウを開く。

ホスト：Github
認証タイプ：SSH
アカウントを接続ボタンを押下してGithubアカウントで認証
SSHキー：上記で生成した公開鍵が表示されていることを確認
保存ボタンを押下して設定を保存する。
![スクリーンショット 2021-02-27 14.54.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262530/925282e2-7dea-a1f0-61ea-55b3e021b367.png)

#ハマった点
接続テストを行うことで、known_hostsにGithubが登録され、URLからクローンできるようになった。

```
$ ssh -T git@github.com
```