OmniAICreator/Qiita-1.07M huggingface dataset:
before_actionの使い方

プログラミングスクールの最終課題フリマアプリの開発において
コードレビューの際に指摘をもらった箇所を復習用に記録しておきます。

マイページ実装の際にrailsでcredit_card_controller.rbに
コードを記載しました。
重複しているコードを別で定義して書き変え、before_actionにて呼び出すようにとのこと。

```
@card = CreditCard.find_by(user_id: current_user.id)
```
このコードを下記のように定義し、before_actionで呼び出しました。

```
  def find_card
    @card = CreditCard.find_by(user_id: current_user.id)
  end
```

今回はcreate意外でbefore_actionが実行されれば良いので
下記のようにnew,show,destroyと指定しております。

```
class CreditCardsController < ApplicationController
  require "payjp" 
  before_action :find_card, only:[:new, :show, :destroy]

```

コードを書く際には、重複するコードは極力まとめることが
スッキリしたコードを書くポイントのようなので
次回以降の実装においても、このポイントを意識して行います。
シェルスクリプトによる超簡易テンプレートエンジン

# 説明

たった4行のシェルスクリプトである。

```sh:render_template.sh
#!/bin/sh
sh <<__EOT1__
cat <<__EOT2__
cat "$@"
```

何一つインストールされていなくて、sh コマンドと cat コマンドだけは動く、そんな環境で使う。
例えば Docker に最適。
コマンドライン引数で指定されたファイル群をヒアドキュメントとして解釈させる。
シェルスクリプトのヒアドキュメントとして展開できるものがすべて通用する。

- 環境変数展開 (`$環境変数名`、または`${環境変数名}`)
- コマンド展開 (`$(コマンド)`、または`` `コマンド` ``)

シェル変数は子プロセスに伝播しないので使えない。export で環境変数にしなければならない。

ヒアドキュメントのため、実行制御機能は持たない。つまり、条件判断、繰り返しなどは行わない。
(コマンド展開による簡易的な条件判断と繰り返しは可能。)

テンプレート側では、ヒアドキュメントで展開対象となる以下の文字群はあらかじめ `\`(U+005c バックスラッシュ)でエスケープしておく。

- `$` (U+0024)
- `\` (U+005c)
- `` ` ``  (U+0060)

ヒアドキュメントの終端に `__EOT1__`, `__EOT2__` が使われているが、確実にファイル内容や変数と衝突しないような文字列を入れればよい。例えば UUID あたりの方がよい。
ファイル終端がヒアドキュメントの終端として扱われるので、実は終端は書かなくてよい。(ここがミソ)

なお、コマンドがネストするのでパフォーマンスはよくない。

本来は `#!/bin/sh` は要らないはずだが、外すと bash が sh をエミュレートしている環境でヒアドキュメントの終端不足の警告が出てくるので付けている。

```
./render_template.sh: line 4: warning: here-document at line 2 delimited by end-of-file (wanted `__EOT1__')
```

# 仕組み

テンプレートファイル

```sh:hello.tmpl
$HELLO
```

実行

```console
$ HELLO="Hello, world!" ./render_template.sh hello.tmpl
```

最初の sh に対するヒアドキュメントとして以下が展開される。

```sh:before_eval_at_sh
cat <<__EOT2__
`cat "$@"`
```

```sh:after_eval_at_sh
cat <<__EOT2__
$HELLO
```

次に cat に対するヒアドキュメントとして以下が展開される。

```sh:before_eval_at_cat
$HELLO
```

```sh:after_eval_at_cat
Hello, world!
```

つまり二重にヒアドキュメントを解釈させるところがミソ。

# テスト

テンプレートファイル

```test.tmpl
Hello, world!
"Hello, world!"
$HELLO
\$HELLO
\\$HELLO
$(echo "Hello, world!")
\$(echo "Hello, world!")
`echo "Hello, world!"`
\`echo "Hello, world!"\`
\\\`echo "Hello, world!"\\\`
```

実行

```console
$ HELLO="Hello, env!" ./render_template.sh test.tmpl
Hello, world!
"Hello, world!"
Hello, env!
$HELLO
\Hello, env!
Hello, world!
$(echo "Hello, world!")
Hello, world!
`echo "Hello, world!"`
\`echo "Hello, world!"\`
```

# 参考

- 簡易テンプレートエンジン extcat coneta #1 https://qiita.com/EjiriAkira/items/30bfb2520744094a3679
- Shellでファイルテンプレート的な機能を実現 https://qiita.com/jerrywdlee/items/e99c519ae2af96d89985
- 低機能でポータブルなテンプレートエンジンが欲しい→そこでenvsubstですよhttps://qiita.com/hnw/items/3d8bad7852510c3a84d7
form通用、jquery.validate.min.jsで項目の入力チェック仕組み

```sample.html
<link href="css/custom.min.css" rel="stylesheet" /><!--.my-error{color:red}-->
xxx
<input name="XXX" type="text" class="form-control" />
xxx
<script src="js/jquery.validate.min.js" type="text/javascript"></script>
<script src="js/formValidator.js" type="text/javascript"></script>

```
```formValidator.js
// JavaScript Document
// 各画面入力の共通チェックなど
// 効率的に共通化観点で、なるべく以下の観点で設計しましょう：
//     ① 各画面に同じ項目であれば、該当項目の「name」属性を同様に設定する。
//     ② 

(function () {
    //標準エラーメッセージの変更
    $.extend($.validator.messages, {
        email: '*正しいメールアドレスの形式で入力して下さい',
        required: '*入力必須です',
        phone: '*正しい電話番号の形式で入力して下さい',
        hankaku: '*半角0-9,a-z,A-Zで入力して下さい',
        hankakuNumOnly: '*半角0-9で入力して下さい',
        hankakuEngOnly: '*半角a-z,A-Zで入力して下さい'
    });

    //追加ルールの定義
    var methods = {
        phone: function (value, element) {
            return this.optional(element) || /^\d{11}$|^\d{3}-\d{4}-\d{4}$/.test(value);
        },
        hankaku: function (value, element) {
            return this.optional(element) || /^[0-9a-zA-Z]*$/.test(value);
        },
        hankakuNumOnly: function (value, element) {
            return this.optional(element) || /^[0-9]+$/.test(value);
        },
        hankakuEngOnly: function (value, element) {
            return this.optional(element) || /^[a-zA-Z]+$/.test(value);
        }
    };

    //入力項目の検証ルール定義
    var rules = {
        XXX: {
            required: true
        },
        name2: {
            required: true
        },
        name3: {
            hankakuNumOnly: true
        },
    };

    //入力項目ごとのエラーメッセージカスタマイズ
    var messages = {
        name2: {
            required: '*選択して下さい'
        }
    };

    //メソッドの追加
    $.each(methods, function (key) {
        $.validator.addMethod(key, this);
    });

    $('form').each(function () {
        $(this).validate({
            rules: rules,
            messages: messages,

            errorClass: 'my-error',
            errorPlacement: function (error, element) {
                error.insertAfter(element);
            }
        });
    });
})();
Java スレッド処理

#【Java スレッド処理編】

業務内で使用する Javaのスレッド処理のメモです。
開発時に使用しているのでまとめました。

##スレッドとは。


スレッド(thread)とは、プログラム上で複数の処理を同時に動かす仕組みである。

Javaには、複数の処理を同時に実行するAPIが備わっている。
→threadクラスを利用（スレッド生成）

・コンビニのレジを例に考えます。
昼休憩などで人がいっぱいで混雑時に、レジが1ヵ所だけだと時間がかかるし、不便。
レジが2ヵ所、3ヵ所と機能していれば短時間で人を捌けるし効率が良い。

プログラムも同じで処理を複数同時に動かせば、短時間で効率よく処理が可能になる。
その仕組みがスレッドです。スレッドは日常でもよく使われている。

##スレッド処理

###１、threadクラスを継承し、run( )メソッドをオーバーライドする。
run( )には、スレッドで処理したい内容を書き込む。

（オーバーライドとは、親クラスを継承して、子クラスを宣言時に親クラスのメンバを子クラス側で上書きすること）

###２、別スレッドの実行を開始したい場所で、①のクラスをインスタンス化して、start( )メソッドを呼ぶ。

（メソッドとは、複数の文をまとめて1つの処理として、名前を付けたもの。部品の最小単位）

```java
//Threadを継承したクラスでは、スレッドで実行したい処理をrunメソッドの中に書く。

class Sample extends Thread {
  public void run() {
    System.out.println("スレッド");
  }
}
```
```java
//Threadを継承したクラスのインスタンスを生成し、startメソッドを呼び出し、スレッドを動かす。

class SampleSample {
  public static void main(String[] args) {
    ThreadSample t = new ThreadSample();
      t.start();
  }
}

//実行結果:スレッド
```
##run( )が作られ、start( )で新しいスレッドが実行される。

stop( )などは、致命的な障害に繋がることもあるものは基本的に使用しないのが賢明である。

###Thread.sleepの使い方

Javaプログラムの動作をスレッドの処理を一時停止したい時や何らかの処理待ちをしたい場合などに使用できる。
sleepはtry-catchとセットになるのが一般的。
ただ、sleep中に例外が発生しても何もすることはないのが普通なので、catchが空なのもごく普通である。

####※スレッドは、正しく恐れる必要がある。
なるべくスレッドを使わずに済む方法を考える。
マルチスレッドプログラムは、プログラム全体を設計段階から検討する必要がある。
やむを得ずスレッドを使う場合、大きなリスクを背負う覚悟をする。

開発期間や体制には、十分に余裕を持たせる。
→テストや問題の判別が難しい。開発工程全体に影響を与える事がある。
　テストの同時実行が難しいために、厳密なテストが出来ずに本番稼働になることもある。

もしエラーが出たとしても、再現性がなく、原因の特定や不具合修正が難しい。

同一変数やメソッドを複数のスレッドから同時に利用すると、データ破壊の恐れがある。

```java
//データ破壊を回避するために、synchronized で排他制御処理をする。
//実行できるのは、1スレッドのみ。

synchronized(対象インスタンス){
  //複数スレッドから同時実行されないように保護したいコード
}
```
ロングテール（Long Tail）、アフィリエイト（Affiliate）、オプトイン（Opt In）、ドロップシッピング（Drop Shipping）

応用情報技術者平成30年春期 午前問73



インターネットショッピングで売上の全体に対して，あまり売れない商品の売上合計の占める割合が無視できない割合になっていることを指すものはどれか。


１、ロングテールは、　（the long tail）
膨大な商品を低コストで扱うことができるインターネットを使った商品販売において、実店舗では陳列されにくい販売機会の少ない商品でも、それらを数多く取りそろえることによって十分な売上を確保できることを説明した経済理論です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/e7f64839-9621-db91-cb6f-2513b8b57ccb.png)


ロングテール理論：
・一般に商品の売上は「全体の2割の優良顧客が全体の売上の8割を占め，全商品の上位2割が8割の売上を占める。」というパレートの法則に従うので、実店舗では売場面積や物流などの問題から上位20%の商品を優先的に販売することになります。

・インターネット販売では従来の小売店販売面積の制約に縛られず、商品をデータベースに登録するだけで膨大な商品点数を揃えられます。この商品点数の多さを活かし、小さいけれども確かにある販売機会を大量に集めることで、実店舗では実現不可能部分で大きな売上が生じるという現象が起こります。



２、アフィリエイトは、affiliate 
企業の広告を個人(企業)の所有するホームページに掲載し、そのリンクをたどって企業の商品やサービスが売れた場合に、広告を載せているホームページの主に報酬を支払うという仕組みです。

アフィリエイトとは一言で説明すると成果報酬型の広告のことです。主に以下のような仕組みです。
　・自身のホームページやブログ記事に企業や特定の商品・サービスの広告を掲載
　・訪問者がその広告をクリックして商品やサービスを買ったりして広告主の利益になる
　・成果報酬が収入として手に入る


・affiliate 【他動】 〔人や団体を〕会員［仲間・支部］にする、傘下に置く


３、オプトインとは、Opt In
「承諾」のことで一般的にはユーザが広告メールの受け取りを承諾することを指します。
このようにユーザの承諾を経て送信されるメール広告をオプトインメール広告といいます。

逆に、オプトアウトOpt Outとは、
ユーザーに許可を取ることなく、宣伝広告をメールなどの方法で送りつけること。
また、宣伝広告の受け取りを、ユーザーが拒否する意思を示すこと。
メーリングリストから除外する事やメールマガジンの配信停止もオプトアウトという。
英語での表記はOpt Outと表記し、「会員からの脱退」を意味する。


４、ドロップシッピングは、（Drop Shipping）
ネットショップ側で在庫を持たず、注文が入った時点で、商品をメーカーや卸売り業者から直送させるネットショップの運営方法の一形態です。


参照：
https://www.fe-siken.com/kakomon/24_aki/q74.html


【入門】アフィリエイトとは？仕組み、始め方を図解でわかりやすく
https://www.kagoya.jp/howto/webhomepage/affiliate/

オプトイン、オプトアウト
https://www.synergy-marketing.co.jp/glossary/optin/#:~:text=%E3%82%AA%E3%83%97%E3%83%88%E3%82%A4%E3%83%B3%E3%81%A8%E3%81%AF%E3%80%81%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%AB,%EF%BC%88%E3%82%AA%E3%83%97%E3%83%88%E3%82%A2%E3%82%A6%E3%83%88%EF%BC%89%E3%81%8C%E3%81%82%E3%82%8B%E3%80%82
https://www.synergy-marketing.co.jp/glossary/optout/
A failure occurred while executing org.jetbrains.kotlin.gradle.internal.KaptExecution

[A failure occurred while executing org.jetbrains.kotlin.gradle.internal.KaptExecution](https://stackoverflow.com/questions/62131564/a-failure-occurred-while-executing-org-jetbrains-kotlin-gradle-internal-kaptexec)

1.AnalyzeからInspect Codeを選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700171/d6f7767b-a0d9-7c9d-3d14-188416dea859.png)


2.whole projectを選択してOKを押す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700171/dac76117-cb9c-1bd6-08de-3e2e688a0e31.png)

3.下部に詳しいエラーが現れる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700171/5480e386-3b90-cf17-4827-e5d6fbde647f.png)
csvファイルの列を連結して1列にする

↓こんなcsvがあった時、

```
a,1,あ
b,2,い
c,3,う
```

↓こんな感じで列単位で垂直に連結したい時があった。

```shell
a
b
c
1
2
3
あ
い
う
```

その方法を調べても出てこなかったので、下記のように実現した。


```shell
# 使い方は $ concat_csv_columns_vertically /path/to/your/csvfile

concat_csv_columns_vertically () {
    for i in `seq 1 $(awk -F, '{ print NF; exit }' $1)`; 
        do cut -d, -f$i $1; 
    done
}
```

処理の内容としては、csvの列数を取得した上でcutコマンドで列を左から順に抽出しているだけ。

これの1行版は↓

```shell
$ csvfile=/path/to/your/csvfile &&  for i in `seq 1 $(awk -F, '{ print NF; exit }' ${csvfile})`; do cut -d, -f$i $csvfile; done
```
日本語ロケール（ja_JP.UTF-8）をインストールする

# 日本語ロケール（ja_JP.UTF-8）をインストールする

## 環境

```bash
$ cat /etc/redhat-release
CentOS Linux release 8.1.1911 (Core)
```

## インストール手順

デフォルトのロケールリストを確認する。

```bash
$ localectl list-locales | grep -i ja
ja_JP.SJIS
```

ja_JP.UTF-8がそもそも入っていなかったため、日本語の言語パッケージをインストールする。

```bash
$ yum install glibc-langpack-ja
```

ロケールリストにja_JP.utf8が追加されていることを確認する。

```bash
$ localectl list-locales | grep -i ja
ja_JP.SJIS
ja_JP.eucjp
ja_JP.utf8
```

追加されていることが確認できたため、ロケール設定を書き換える。

```bash
$ localectl set-locale LANG=ja_JP.UTF-8
$ cat /etc/locale.conf
LANG=ja_JP.UTF-8
```

以上
超スマート社会（Society5.0）、ダイバーシティ社会（diversity）


応用情報技術者平成30年秋期 午前問71

政府は，IoTを始めとする様々なICTが最大限に活用され，サイバー空間とフィジカル空間とが融合された"超スマート社会"の実現を推進している。必要なものやサービスが人々に過不足なく提供され，年齢や性別などの違いにかかわらず，誰もが快適に生活することができるとされる"超スマート社会"実現への取組みは何と呼ばれているか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/9f7a7228-d18b-01a8-5b2c-f956b0a4a347.png)


１、Society5.0は、
　狩猟社会、
　農耕社会、
　工業社会、
　情報社会に続く、
5番目の新たな社会を指し、日本が目指すべき未来社会の姿として政府で提唱されています。

Society5.0は、サイバー空間（仮想空間）とフィジカル空間（現実空間）を高度に融合させたシステムにより、経済発展と社会的課題の解決を両立する、人間中心の社会です。IoT(Internet of Things)で全ての人とモノがつながり、様々な知識や情報が共有され、今までにない新たな価値を生み出すことで、様々な課題や困難を克服します。社会の変革(イノベーション)を通じて、これまでの閉塞感を打破し、希望の持てる社会、世代を超えて互いに尊重し合あえる社会、一人一人が快適で活躍できる社会になると述べられています。


２、e-Gov
e-Govは、各府省がインターネットを通じて提供する行政情報の総合的な検索・案内サービスの提供、各府省に対するオンライン申請・届出等の手続の窓口サービスの提供を行う政府のポータルサイトです。


３、Web2.0
Web2.0は、2000年代中頃以降に起こったWebの利用形態の変容を表す言葉です。
従来は情報の送り手と受け手が固定され、送り手から受け手への一方的な流れでしたが、
　巨大掲示板、
　SNS、
　ブログなどの登場により、
インターネットは誰もが自由に情報を発信できる新たなフェーズに移行しました。


４、ダイバーシティ社会
ダイバーシティ社会は、性別、国籍、年齢、障害の有無、性的指向等の属性の違いを超え、多様な立場や価値観を認め合って、各々が生き生きと働き、活躍し、生活する社会です。

・ダイバーシティ（diversity）は日本語に訳すと多様性ですが、一人ひとりが尊重され、多様性が受容されることで、個人の生きがいや学び、社会の発展や新たな価値創出などにつながります。


参考：

https://www.ap-siken.com/kakomon/30_haru/q71.html

内閣府 Society 5.0
http://www8.cao.go.jp/cstp/society5_0/index.html
WSL2のターミナルとしてRLoginを使用する

# WSL2のターミナルとしてRLoginを使用する

## WSL2のSSHパスワード認証を許可する

WSL2のデフォルト設定では、sshのパスワード認証が許可されていないため、sshのパスワード認証を有効にする。また、ローカル環境なのであまり必要はないと思ったが、念のためポート番号を変更する。

```bash
$ cd /etc/ssh/
$ sudo cp -pi sshd_config sshd_config.org
$ diff sshd_config sshd_config.org
15c15
< Port 20022
---
> #Port 22
58c58
< PasswordAuthentication yes
---
> PasswordAuthentication no
$ sudo ssh-keygen -A
ssh-keygen: generating new host keys: RSA DSA ECDSA ED25519
$ sudo service ssh restart
 * Restarting OpenBSD Secure Shell server sshd
```

## Windows起動時にWSL2のSSH自動起動を設定する

Windowsを再起動してしまうと、WSL2のSSHサービスがダウン状態であるため、Windows起動時のスタートアップ時に、WLS2のSSHを自動起動するように設定する。

「Windows＋R」を同時に押下し、「shell:startup」を入力してEnterをクリックする。Windows起動時の自動起動用のファイルを格納するフォルダが表示されるため、以下のスクリプトを作成し配置する。

![shell_startup.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266508/50a71045-cff2-0314-8b6f-d70dcc2402ac.png)

```bat:Wsl2AutoStartSSH.bat
@echo off
wsl -u root -- service ssh start
```

## RLoginへWSL2への接続設定をする

RLoginを起動し、以下のように接続設定を追加する。

![rlogin_setting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266508/197e96ae-735c-399e-48b2-1c106907f041.png)

追加した接続設定で、WSL2へ接続する。

![RLogin_Success.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266508/85f8013e-8a93-45ad-e5d9-19a419c2c0b8.png)

接続成功！
価格設定ーターゲットリターン価格、実勢価格、差別価格、知覚価値価格

応用情報技術者平成30年秋期 午前問69

ターゲットリターン価格設定の説明はどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/d6c9ffc6-0d92-6bbc-c267-a65a10c1786b.png)


１、ターゲットリターン価格とは、 Target return pricing
コスト志向型の価格設定法で、目標とする投資収益率(ROI)を達成するために得るべき金額を計算し、それを原価に加えて販売価格とする方法です。目標収益法ともいいます。

　ターゲットリターン価格＝原価＋{(投下資本×目標収益率)÷販売数量}


２、実勢価格
競合の価格を十分に考慮した上で価格を決定する。


３、差別価格
顧客層，時間帯，場所など市場セグメントごとに異なった価格を決定する。

・セグメント（segment)とは、直訳すると、「一つのものを分割した一部分」を言います。例えば、数学でセグメントと言えば、円の一部分の円弧や弓形、線分などを指して言います


４、知覚価値価格
リサーチなどによる消費者の値頃感に基づいて価格を決定する。


参照：
https://www.ap-siken.com/kakomon/30_haru/q69.html#:~:text=%E3%82%BF%E3%83%BC%E3%82%B2%E3%83%83%E3%83%88%E3%83%AA%E3%82%BF%E3%83%BC%E3%83%B3%E4%BE%A1%E6%A0%BC%E3%81%A8%E3%81%AF,%E5%8F%8E%E7%9B%8A%E6%B3%95%E3%81%A8%E3%82%82%E3%81%84%E3%81%84%E3%81%BE%E3%81%99%E3%80%82&text=%C3%B7%E8%B2%A9%E5%A3%B2%E6%95%B0%E9%87%8F%7D-,%E7%AB%B6%E5%90%88%E3%81%AE%E4%BE%A1%E6%A0%BC%E3%82%92%E5%8D%81%E5%88%86%E3%81%AB%E8%80%83%E6%85%AE,%E3%81%A7%E4%BE%A1%E6%A0%BC%E3%82%92%E6%B1%BA%E5%AE%9A%E3%81%99%E3%82%8B%E3%80%82
puttyでSSH鍵認証@heteml

#1,SSHアカウント確認
hetemlコントロールパネルでSSHアカウントを確認。

#2,puttyGenで公開鍵、秘密鍵作成
generate
->Save public key->authorized_keys[公開鍵]
->Save private key->id_rsa.ppk

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703926/1426398e-5cdb-7e3d-44ec-0110478be15d.png)

#3,サーバーに公開鍵設置
1.WIN SCP等でログイン
2.usernameフォルダに.sshフォルダを作成し、作成したauthorized_keysを設置。

#4,puttyで接続
host,portを設定し、秘密鍵を設定。
(SSH->AUTH->private key file for authenticationにid_rsa.ppk)

#5,パスワードを求められる場合
server refused our keyと表示される場合、authorized_keysの内容を以下の部分に置き換え、再度アップロード。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703926/1963ad46-59f1-c335-a21a-50d946b29905.png)
Nuxt.jsでKeycloakと連携した際のアクセストークンの有効期限切れに対応

# 背景

前回の記事でNuxt.jsでKeycloakと連携したログイン機能を実装してみて、一通り動作するところまでは確認できたけど、一部動作に問題があったので対応してみる。

https://qiita.com/yusuke-ka/items/1beef8d9e0bbeb052e5a


# 問題の動作について

問題の動作は、ブラウザが保持しているトークンの有効期限が切れてもkeycloak側にアクセスしにいかないこと。

keycloakのデフォルトでは、セッションのタイムアウトは30分に設定されていて、トークンの有効期限は15分に設定されているっぽい。

ここで、Implicitフローの場合、アクセストークンの有効期限が切れて新しいトークンが必要になった場合、リフレッシュトークンで新しいアクセストークンを取得するのではなく、再度サーバー側にAuthorizationリクエストを送信する方法が普通らしいけど、nuxtのauth-moduleがトークンが切れても、サーバー側にリクエストを投げてくれないので、セッションタイムアウトしてもアクセスできてしまう。

下記のauth-moduleのmiddlewareの実装を見ると、下記のようになっている。
(nuxt.config.jsでmiddlewareにauthを指定することで呼び出されるコード)

https://github.com/nuxt-community/auth-module/blob/dev/src/core/middleware.ts

```middleware.ts 
    ...
    // Perform scheme checks.
    const { tokenExpired, refreshTokenExpired, isRefreshable } = ctx.$auth.check(true)

    // Refresh token has expired. There is no way to refresh. Force reset.
    if (refreshTokenExpired) {
      ctx.$auth.reset()
    } else if (tokenExpired) {
      // Token has expired. Check if refresh token is available.
      if (isRefreshable) {
        // Refresh token is available. Attempt refresh.
        await ctx.$auth.refreshTokens()
      } else {
        // Refresh token is not available. Force reset.
        ctx.$auth.reset()
      }
    }
    ...
```

nuxt.config.jsでストラテジーのschemeに'oauth2'を指定すると、
最初のctx.$auth.check(true)で取得されるisRefreshableは(現時点のコードでは)常にtrueを返す実装になっていて、
アクセストークンの有効期限が切れていれば、tokenExpiredがtrueのときのif文の中には入るけど、
isRefreshableがfalseのときのelseに入らないので、トークンの有効期限が切れていても保持しているトークンがリセットされない模様。


リフレッシュトークンが利用されない場合の実装が漏れているのか、開発者の意図通りなのか分からないけど(そもそも、schemeに'oauth2'を指定するやり方自体、間違っている可能性もある)、なんとか対応したい。

# 対応

方針としては、できる限りauth-moduleの実装を利用しつつ、問題の部分にだけ対応したい。

ということで、auth-moduleの実装を見ながら、なるべくロジックが崩れないように有効期限切れチェック用のmiddlewareを追加してみた。

middleware/の下にtoken-check.tsというファイルを追加して下記のように実装する。

```token-check.ts
export default function(store: any) {
  const tokenExpireAt =
    store.$auth.$storage._state["_token_expiration.keycloak"];
  if (isExpired(tokenExpireAt)) {
    store.$auth.reset();
  }
}

function isExpired(tokenExpireAt: number) {
  const now = Date.now();
  if (!tokenExpireAt) {
    return true;
  }
  const timeSlackMillis = 500;
  tokenExpireAt -= timeSlackMillis;
  if (now < tokenExpireAt) {
    return false;
  }
  return true;
}
```

トークンの有効期限は、storeを探っていたら、
**store.\$auth.\$storage._state["_token_expiration.keycloak"]**
に入っていたので、ここから取得(もっと良い取り出し方があるかも)。

有効期限切れの判定は、auth-moduleのロジックに合わせつつ、isExpiredというfunctionで実装。

期限が切れていたら、トークンをリセットするようにしてみた。

このmiddlewareがauth-moduleのデフォルトのmiddlewareの前に実行されるように、
下記のようにnuxt.config.jsに設定。

```nuxt.config.js
export default {
  ...
  
  router: {
    middleware: ["token-check", "auth"]
  },
  
  ...

```

一応、これでトークンの有効期限が切れると、keycloakサーバー側にアクセスしてトークンが更新されるようになり、
keycloak側のセッションタイムアウト後にアクセスすると、ログイン画面が再表示されるようになった。


2020/09/07追記

期限切れチェックには**$auth.check(true)**をそのまま使っても大丈夫なようなので、token-check.tsはもっとシンプルに書ける模様。

```token-check.ts
export default function(store: any) {
  const { tokenExpired } = store.$auth.check(true);
  if (tokenExpired) {
    store.$auth.reset();
  }
}
```
プロダクトポートフォリオマネジメント(PPM)ー投資用の資金源

応用情報技術者平成30年春期 午前問67

プロダクトポートフォリオマネジメント(PPM)において，投資用の資金源と位置付けられる事業はどれか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/18cdc4ce-51cf-eeda-9bcc-5cecb6bdf313.png)


１、プロダクトポートフォリオマネジメント(PPM)は、縦軸と横軸に「市場成長率」と「市場占有率」を設定したマトリックス図を4つの象限に区分し，製品や事業の市場における位置付けを分析して資源配分を検討する手法です。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/b5b4bc78-3c7c-2d3f-2f30-51fe8c4df591.png)


4つの象限は、市場内の位置付けから以下のような名称で呼ばれています。

** ・花形(star) … [成長率：高、占有率：高]**
  　　・占有率・成長率ともに高く、
  　　・資金の流入も大きいが、
  　　・成長に伴い占有率の維持には多額の資金の投入を必要とする分野

** ・金のなる木(cash cow) … [成長率：低、占有率：高]**
  　　・市場の成長がないため追加の投資が必要ではなく、
  　　・市場占有率の高さから安定した資金・利益の流入が見込める分野

** ・問題児(problem child) … [成長率：高、占有率：低]**
  　　・成長率は高いが占有率は低いので、
  　　・花形製品とするためには多額の投資が必要になる。
  　　・投資が失敗し、そのまま成長率が下がれば負け犬になってしまうため、慎重な対応を必要とする分野

** ・負け犬(dog) … [成長率：低、占有率：低]**
  　　・成長率・占有率がともに低く、
  　　・新たな投資による利益の増加も見込めないため市場からの撤退を検討するべき分野


概念は、いいですけれども、問題点としては、
質問に「投資用の資金源と位置付けられる事業」とは、いったい何のいみですかね。

資金源だから、資金の流入とのことですね。　金のなる木　は資金・利益の流入が見込める分野ですね。
他のは、資金の流出や撤退分野でしょう。


参照：
https://www.ap-siken.com/kakomon/25_haru/q67.html
GASでタイムゾーンを変更できなくて困った話

GAS(Google Apps Script)で new Date() したら変な時間になってる！なんでやねん！となったので調べたことを備忘録としてまとめました。

# 事象

new Date() で現在日時をログに出力してみたらタイムトラベルしていた。
ただ今、日本時刻2020年9月5日 01:40ぐらい。
下記GASを実行すると…

``` java
    function log() {
      var dt = new Date();
      console.log(dt);
    }
```

![そこはアメリカだった。](https://paper-attachments.dropbox.com/s_5B66DA96F3E59AE0021543E46329BA3614C7E3FA6085B40822C319D6B4488753_1599237636743_+2020-09-05+1.40.27.png)


なんでやねん！

調べてみるとタイムゾーンがずれているとのこと。


# タイムゾーンの変更方法

GASの編集画面の ファイル > プロジェクトのプロパティ から変更できるらしい。

![変更できる人はここで変更して保存したらおしまいです。](https://paper-attachments.dropbox.com/s_5B66DA96F3E59AE0021543E46329BA3614C7E3FA6085B40822C319D6B4488753_1599238974138_+2020-09-05+1.44.26.png)


変更できないじゃん…。
本来はタイムゾーンの東部時間と表示されている部分がプルダウンになっていて選択できるらしい。

これは困った…。

さらに調べているとプロジェクトのプロパティの中身を直接編集できるらしい。


# appsscript.jsonを直接編集する

スクリプトエディタの 表示 > マニュフェスト ファイルを表示 を押下するとappsscript.jsonフェイルが表示される。

``` json
    {
      "timeZone": "America/New_York",
      "dependencies": {
      },
      "exceptionLogging": "STACKDRIVER",
      "runtimeVersion": "V8",
      "sheets": {
        "macros": [{
          "menuName": "log",
          "functionName": "log"
        }]
      }
    }
```

TimeZoneの部分を「Asia/Tokyo」に変更して保存すると…

```json
     "timeZone": "Asia/Tokyo",
```


![](https://paper-attachments.dropbox.com/s_5B66DA96F3E59AE0021543E46329BA3614C7E3FA6085B40822C319D6B4488753_1599238986553_+2020-09-05+1.55.00.png)


タイムゾーンが東京に変わってますね！

先程のGASを実行すると…

![](https://paper-attachments.dropbox.com/s_5B66DA96F3E59AE0021543E46329BA3614C7E3FA6085B40822C319D6B4488753_1599239336177_+2020-09-05+2.07.17.png)


無事、日本に帰ってくることができました。
めでたし、めでたし。
【Laravel】PostgreSQLのスキーマを切り替える

# はじめに
PostgreSQLには、DBとテーブルの間にスキーマという概念があります。
今回、同じDB内でスキーマを切り替える処理を学んだので、残しておきます。

# 結論

database.phpに、スキーマ名だけを変えたDB設定を違う名前で書いておいて、
DB::connectionであたかもDBを切り替えるようにして、スキーマだけを切り替える。

# 初期状態

初期状態はpublicスキーマが指定されてます。

```php:database.php

'pgsql' => [
            'driver' => 'pgsql',
            'url' => env('DATABASE_URL'),
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '5432'),
            'database' => env('DB_DATABASE', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            'charset' => 'utf8',
            'prefix' => '',
            'prefix_indexes' => true,
            'schema' => 'public',
            'sslmode' => 'prefer',
        ],
```

# 実装

通常の設定の下にスキーマのところだけtestに変えた、
別名の設定（ここではpgsqltest）を書いておく。
（実際の実装では、スキーマの指定はenvヘルパで指定しました。）


```php:database.php

'pgsql' => [
            'driver' => 'pgsql',
            'url' => env('DATABASE_URL'),
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '5432'),
            'database' => env('DB_DATABASE', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            'charset' => 'utf8',
            'prefix' => '',
            'prefix_indexes' => true,
            'schema' => 'public',
            'sslmode' => 'prefer',
        ],

'pgsqltest' => [
            'driver' => 'pgsql',
            'url' => env('DATABASE_URL'),
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '5432'),
            'database' => env('DB_DATABASE', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            'charset' => 'utf8',
            'prefix' => '',
            'prefix_indexes' => true,
            'schema' => 'test',
            'sslmode' => 'prefer',
        ],
```

# 利用
以上で設定は完了です。
あとは下記のように通常でない方を利用するときのみ、
DB::connectionで切り替えるだけです。



```php:TestController.php

$accounts = \DB::connection('pgsqltest')
    ->table('account')
    ->get();
```

# まとめ
今までMySQLばかり使っていたので、あまり馴染みがないやり方でした。
正直他にも良い方法があったら知りたいです。

スキーマに関して調べて見ると、スキーママネージャー（下記）のようなものがあったので、
こういうのを追加しないと、スキーマを操作するのは難しいのかなという印象です。

https://github.com/racklin/pgschema#switch-schema
LaravelのMigrationファイルを既存のDBから自動生成する方法


## oscarafdev/migrations-generator
* https://github.com/oscarafdev/migrations-generator
* 検索してみると[barryvdh](https://github.com/barryvdh/laravel-migration-generator)や[Xethron](https://github.com/Xethron/migrations-generator)のものが出てくるが、どれもoscarafdevをお勧めします、になっていっている様子。

### 導入
* composer実行

	```
	composer require "oscarafdev/migrations-generator" --dev
	```

### 使い方

* 全テーブルのmigration定義を作成する。
	
	```
	APP_ENV=development php artisan migrate:generate
	```

* テーブルを指定して作成する。
	
	```
	APP_ENV=development php artisan migrate:generate --tables="user,password_resets"
	```


* 指定したテーブルを除外して作成する。

	```
	APP_ENV=development php artisan migrate:generate --ignore="users,password_resets"
	```
情報システムの調達ーRFI(Request for Information，情報提供依頼書)


応用情報技術者平成30年春期 午前問66


情報システムの調達の際に作成されるRFIの説明はどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/59da32bb-8e0a-46b2-b297-a8430bfa4e5b.png)


**システム調達や業務委託は、下記の流れと思います。**
  　①調達者からシステム化の目的や業務内容を候補者に示して、候補者にRFI提供を依頼する
→　②候補者から、RFIを提供します
→　③RFIにより、候補者を選定して、RFP提供を依頼する
→　④RFPにより、発注先を選定します。
→　。。。


**１、RFI(Request for Information，情報提供依頼書)は、**
企業・組織がシステム調達や業務委託をする場合や、初めての取引となるベンダ企業に対して情報の提供を依頼すること、またはその際に提出される文書のことをいいます。

RFIを発行することによって
　・相手方が保有する技術・経験や、
　・情報技術動向、及び
　・導入予定のシステムが技術的に実現可能であるかなど
を確認することができます。

この情報は要件定義や発注先候補の選定に利用できます。その後、自社の要求を取りまとめたRFP(Request for Proposal，提案依頼書)が発注先候補に対して発行されることになります。


**２、RFP(Request for Proposal，提案依頼書)の説明**
調達者から供給者候補に対して，対象システムや調達条件などを示し，提案書の提出を依頼すること


**３、RFC(Request for Change，変更要求書)の説明**
調達者から供給者に対して，契約内容で取り決めた内容に関して，変更を要請すること


**４、SOW(Statement of Work，作業範囲記述書)の説明**
調達者から供給者に対して，双方の役割分担などを確認し，契約の締結を要請すること


参照：
https://www.ap-siken.com/kakomon/25_haru/q66.html
ajaxで論理値をポストしたい

ajaxを使って非同期でデータをポストするさい、その値を論理値（TRUE/FALSE）としてポストしたいというとき。
普通に書いても`string`型として扱われてしまう。
ポストするときにわざわざ`boolean(true)`などと書いても論理値としてはポストしてくれない。
なので、どこかで一度データを成型しないといけない。
今回はFuelPHPでの場合を記述する。

```view/example.php
<script>
$('#send_button').on('click', function() {//ボタンが押されたとき
  var formdata = new FormData($('#main_form').get(0));//フォームタグからデータを取得
  function() {
    $.ajax({
      type: 'POST',//メソッド指定
      url: '<?php echo $url; ?>',//ポスト先URL
      dataType: 'json',
      data: formdata,
      cache       : false,
      contentType : false,
      processData : false
    });
  }
});
</script>
```

```controller/rest/examplecontroller.php
$data = \Input::post();//ポストするデータの取得
if($data['true_or_false'] == 'true'){
  $data['true_or_false'] = true;//論理値で上書き
}elseif($data['true_or_false'] == 'false'){
  $data['true_or_false'] = false;//論理値で上書き
}
//$dataを行いたい処理に投げる
```


ちなみに今回は外部のAPIに投げる処理を書いていて、viewの方で頑張ってポストするデータの形を整えていたのだが、結局コントローラでいじることになってしまったのでコントローラやモデルでできることはそちらでやろうとすごく感じた。
Visual Studio Codeを使ったC言語リモートコンパイルからリモートデバッグまで

最近になってRaspberry Piを購入することになったのだが、それにあたってプログラミング環境を整備する予行演習を行うことにした。
ラズベリーパイを模した環境としてHyper-V上でUbuntu(本当はDebianにしたほうがよかったと思う)を動作させている。
今回のテキストの中ではリモート - VSCodeを動作させるWindows端末、ホスト - Raspberry Piという意味で言葉を使っていく。

## 参考にした解説
Visual Studio CodeでLinux ホストリモート開発
https://qiita.com/whim0321/items/ae72b2dd5fd41beaef04


# 拡張機能のインストール
今回は私はWindows端末にてこの実験を行った。
VSCodeが事前にインストールされているのはもちろんWindowsのオプション機能でOpenSSHが選択されているか確認しておく。

次にVSCode内の拡張機能で*Remote Development*を検索し、インストールしておく。

![スクショ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703910/8685b613-d0c4-547b-9759-49d715f13504.png)
上の写真はインストール直後の様子。


# sshで接続してみよう！
ホストのIPアドレスを調べよう。適当にホスト側で`ip a`でも打っておく。

1. ホストのIPアドレスを調べる。
2. 左端にあるリモートエクスプローラボタンを押して＋ボタンを押すか、コマンドパレット→`Add New SSH Host...`を選択する。
3. 下の画像のように入力欄が出てくるので`ssh ホストのユーザ名@調べたIP`でenter。
![スクリーンショット (35).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703910/98d06864-7734-d3c0-c55a-cd162058b3cf.png)

# ホスト側にgcc, gdbのインストール
私の環境には最初から各種ツールが入っていなかったのでインストールする。

1. apt install build-essentialを実行。これでgdbが入った場合はここで終了。
2. 入らなかった場合はapt install gdbを実行する。

以下、デバッグやコンパイルはリモート接続したVSCode上で行える。細かいところはほかの方の記事を参照していただきたい。

# 完成
これでいつでもデバッグができるようになった。あとはLinuxのPCでいつもやっているようにデバッグの構成をしていけばよい。SSHが動けばRaspberry Pi以外の、たとえばBeagleBoneなんかでも動くのではないだろうか。また、あと何日かで本物のラズパイが届くので今回の結果をもとに実証してみたいと思う。

# 追記(2020年10月15日)
Raspberry Pi4 2GBにRaspberry Pi OS (32-bit) with desktopに対して上記の手順でデバッグすることができました。
Beagle Bone Blackに対してもデバッグできるのか試してみた記事も公開予定。
コマンドを駆使してファイルをプログラム内に埋め込むための準備

# Unixコマンドを使ってファイルをプログラム内に埋め込むための準備
File I/Oを使えないケースの対応。もっと賢い方法があるかもしれないが。

## 方法
下記例はテキストファイル（a.c）なので、実際のケースではありえないかもしれないが、これをプログラム内に埋め込みたいとしよう。

### odコマンドでバイナリ化
```
~/proj$ od -t x1 -v a.c
0000000 69 6e 74 20 66 75 6e 63 30 31 20 28 69 6e 74 20
0000020 69 29 0a 7b 0a 09 73 6c 65 65 70 28 31 29 3b 0a
0000040 09 72 65 74 75 72 6e 20 28 69 2b 31 29 3b 0a 7d
0000060 0a
```

### パイプで渡してawkコマンドで整形
```
~/proj$ od -t x1 -v a.c | awk '{for (i = 2; i <= NF; i++) {printf "0x" $i ", "; if (i == NF) printf "\n" }}'
0x69, 0x6e, 0x74, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x30, 0x31, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x20, 
0x69, 0x29, 0x0a, 0x7b, 0x0a, 0x09, 0x73, 0x6c, 0x65, 0x65, 0x70, 0x28, 0x31, 0x29, 0x3b, 0x0a, 
0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x69, 0x2b, 0x31, 0x29, 0x3b, 0x0a, 0x7d, 
0x0a, 
```

この結果をエディタにコピーする。char型に展開すればよし！

## ですが
ファイルサイズが大きくなれば、それだけメモリなどを消費するので、File I/Oがないと辛いのは事実。

## 参考サイト
awkについて[こちら](https://qiita.com/hirohiro77/items/713d5bcf60fef7e88dfa)を参考にしました。

（後記）ご指摘を頂いて、odコマンドに"-v"オプションを追加しました。
ランダムな整数値を生成する


## ランダムな整数値を生成しよう。

| 0 | 1 | 2 | 3 | 4 |
|:-----------|------------:|:------------:|:------------:|:------------:|
| 0.00... | 0.99... | 1.99... | 2.99... | 3.99... |

```javascript

Math.random() 
//0.00...~0.99...1未満の数値をランダムで生成　
```
**注意！１を含まない**

###０から2までのランダムな整数を生成する。

```javascript
Math.random * 3
//0.00...~2.99...までのランダムな整数を生成する。
```
整数値だけが欲しいので小数点以下を切ります。

```javascript
Math.floor(Math.randomu() * 3)
```
###０からnと決まった範囲ではない場合
```javascript
Math.floor(Math.random() * (n+1)

//応用　min ~ Max
min + Math.floor(Math.random() * (max + 1 - min))
```
Yay! I'm on Heroku!

# はじめに
[前回の記事 - Qiita](https://qiita.com/superrino130/items/7b574df107251914cc55)に味を占めたので、外部公開にそなえ`Heroku`に簡単なアプリを登録してみました。

アプリの内容は、@EightTreesCoffee さんの[この記事 - Qiita](https://qiita.com/EightTreesCoffee/items/d9bc07316e5b2f6900c2)を~~パクリ~~参照させていただきました。

# 完成画面
![20200905b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538241/db9a789e-03b8-463e-56e0-4a8459cd9f48.png)
[heroku アプリ](https://vast-bastion-88155.herokuapp.com/)
# heroku インストール
```
C:\Users\user>npm install -g heroku

C:\Users\user>heroku --version
heroku/7.42.6 win32-x64 node-v12.18.2
```
# sinatra
基本的には、[こちらの記事 - Qiita](https://qiita.com/HEP/items/74002f0ab95d82713be0)を参照させてもらいました
# heroku open
![20200905a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538241/f4317e1a-80f9-2771-a91c-42a814bd5c6c.png)
ぐぬぬ
# WARNING:
```warn.ing
Removing `Gemfile.lock` because it was generated on Windows.

Removing `vendor/bundle`.

You have not declared a Ruby version in your Gemfile.
```
`WARNING`はほっておこう
# heroku logs --tail
```err.or
app.rb:2:in `require': cannot load such file -- sinatra/reloader (LoadError)
```
とりあえずコメントアウトで対応
# まとめ
+ 初アプリ完成
+ @HEP さんありがとうございました
+ @EightTreesCoffee さんありがとうございました

参照したサイト
*[SinatraアプリをHerokuへデプロイする手順 - Qiita](https://qiita.com/HEP/items/74002f0ab95d82713be0)*
*[【初学者向け】Ruby 遅延鉄道路線名の入手方法 - Qiita](https://qiita.com/EightTreesCoffee/items/d9bc07316e5b2f6900c2)*
scikit-learn の使い方 (その3)

こちらで行ったことを Kaggle で行いました。スコアは、0.77511 でした。
[scikit-learn の使い方 (その2)](https://qiita.com/ekzemplaro/items/301bbf2dc90ddfdeed19)

```py:[1]
import numpy as np
import pandas as pd

from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
```

```py:[2]
train_df = pd.read_csv("../input/titanic/train.csv", header=0)
test_df = pd.read_csv("../input/titanic/test.csv", header=0)
ids = test_df["PassengerId"].values


train_df = train_df[['Survived', 'Pclass', 'Sex', 'Fare']]
train_df['Fare'] = train_df['Fare'].fillna(train_df['Fare'].median())




encoder_sex = LabelEncoder()
train_df['Sex'] = encoder_sex.fit_transform(train_df['Sex'].values)
standard = StandardScaler()
train_df_std = pd.DataFrame(standard.fit_transform(train_df[['Pclass', 'Fare']]), columns=['Pclass', 'Fare'])

train_df['Pclass'] = train_df_std['Pclass']
train_df['Fare'] = train_df_std['Fare']

train_x = train_df.drop('Survived',axis = 1)
train_y = train_df.Survived
```

```py:[3]
test_df = test_df[['Pclass', 'Sex', 'Fare']]
test_df['Fare'] = test_df['Fare'].fillna(test_df['Fare'].median())
encoder_sex = LabelEncoder()
test_df['Sex'] = encoder_sex.fit_transform(test_df['Sex'].values)
standard = StandardScaler()
test_df_std = pd.DataFrame(standard.fit_transform(test_df[['Pclass', 'Fare']]), columns=['Pclass', 'Fare'])

test_df['Pclass'] = test_df_std['Pclass']
test_df['Fare'] = test_df_std['Fare']
test_x = test_df
```

```py:[4]
model = SVC(random_state=1,max_iter=5000)
model.fit(train_x, train_y)

pred = model.predict(test_x)
```

```py:[5]
file_submit = "titanic_logistic_regression.csv"
#
dft = pd.DataFrame({'PassengerId': ids, 'Survived': pred})
dft.to_csv(file_submit,index=False)
dft.head()
```
オフラインでchocolatey をインストールする  (ウィルス対策ソフト対策)

# オフラインでchocolatey をインストールする

※ https://qiita.com/m-tmatma/items/1c0565fd5a963ab6f93d で必要だったので書いた記事です。

nuget 用の chocolatey の package を利用してオフラインでchocolatey をインストールします。

## セキュリティソフトがインストール環境でchocolatey をインストールするとエラー

McAfee がインストールされている環境でchocolatey をインストールするために、 https://qiita.com/kangetsu121/items/b6352b547cd32e71bc65 などに書かれている以下コマンドを実行しようとすると

```
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))" && SET "PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin"
```

以下のようなエラーになるので、オフラインでインストールする方法を説明します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500246/ed6948ce-7c13-8004-9dcc-61e19d34a6cd.png)

↓ こんなダイアログが出る。(このスクリーンショットはキャプチャするためにリトライしたので、`再度` となっている)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500246/dd0850c7-1d4d-85c0-c1af-83502e84e6b6.png)

## 他のインストール方法

https://chocolatey.org/docs/installation にいろんなインストール方法が説明されています。

## オフラインのインストール

以下で説明されているオフラインのインストールを行います。

https://chocolatey.org/docs/installation#install-downloaded-nuget-package-from-powershell

1. https://chocolatey.org/api/v2/package/chocolatey/ から nuget 用の chocolatey の package をダウンロードします。
2. ダウンロードした `chocolatey.0.10.15.nupkg` を 7zip など zip を解凍できるソフトで解凍します。
3. 管理者権限でコマンドプロンプトを開きます。
4. 解凍してできた `chocolatey.0.10.15\tools` のフォルダに移動します。
5. 以下を実行します。

```
@powershell -NoProfile -ExecutionPolicy Bypass -Command  .\chocolateyInstall.ps1
```

→ `C:\ProgramData\chocolatey\bin` にインストールされます。
jQuery　イベント発火

買い物リストアプリに非同期ツールを導入するため、カリキュラムの復習をしました。

非同期通信　（Ajax）エイジャックスと呼ばれる。
非同期通信とは
リクエスト後にレスポンスを返す際、ブラウザーに再読込されることなく通信が行われる通信法。
"Asynchronous JavaScript + XML"と表現される。
Ajaxでは、レスポンスのデータにJSONという形式が使われることが多い。

JSON
Java Script Object Notationの略で、データ交換を行うためのデータ記述形式の一種。
Rubyのハッシュと同様、キーとバリューの組み合わせでデータを表現する形式。

同期通信
デフォルトアクション
HTMLの要素を操作した際に定められている挙動
追加ボタンを押すとリクエストがおくれる。
リクエストに対してのレスポンスはJSON形式で返してほしい旨をリクエストに含めます。
フォーム要素のデフォルトアクションを無効にする。

非同期通信をする際は、リクエストにJSON形式で返してほしい旨の情報が含まれているため、その場合の対処をコントローラのアクションに明記する必要がある。
同期通信の際と同様viewsフォルダの中にJSON形式のファイルを準備することもできます。この時のファイル名は、○○.json.jbuilderという形式になる。
非同期通信では、ページがリロードされることはない。代わりに、レスポンスとして帰ってきたJSONのデータを利用してHTMLを操作する。

JavaScriptとjQueryを使用するための準備
gemfileに以下を記入
gem 'jquery-rails'
bundle install 

Javascriptを記述するディレクトリを作成
Assetsディレクトリ内に、javascriptsというディレクトリを追加

javacscriptsディレクトリ内に
application.jsを追加

作成したjavascriptを読み込み記述
Application.html.hamlに
= javascript_include_tag 'application'
manifest.js
//= link_directory ../javascripts .jsを追記

jQueryを使えるようにする。
application.js内に
//= require jquery←jQueryを読み込む
//= require rails-ujs←RailsでJavaScriptを使用するためのもの
//= require_tree .　←application.jsが存在するディレクトリのjavascriptファイルが全てよみこむ
を追記

$(function(){
JavaScriptで関数を定義するにはfunction文を使う
  $('.form').on('submit', function(e){
    e.preventDefault()　←ディフォルトのイベントを止める
    console.log("ヤッター")　
console.log() ブラウザーのコンソールにテキストを表示させるメソッド
  }); 
});

$("セレクタ")
＄の後にセレクタと呼ばれるHTMLの指定方法を記述することで、HTMLが習得される。
今回の$('.form').on('submit', function(e){
記述はクラスセレクタを使っている。
入力ファイル毎に処理

###仕様
・入力ファイルが複数存在し、それぞれ同じ処理を実施したい場合。

###実行環境
PipelinePilot2018

###実装
・フォルダ内のファイルに対して同一操作を実施するため、入力にList Filesコンポーネントを使用。
・実行したい処理をサブプロトコル化する。
　サブプロトコルはRuntime>RunToCompletion>True-For Each Data Recordに設定する。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335742/4ecc561c-1362-7b19-79a6-0253ab76bdce.png)
図1.プロトコル全体像

・サブプロトコル内でファイルの入出力に関わるコンポーネントのパラメータをPromoteし、パラメータ化する。
・各パラメータを右クリックし、Initialize Using>Data Property。
　List Filesから来たPathのパラメータをReinitializeするかどうか聞かれる。
　「Reinitialize for each data」にチェックを入れてOK（図2）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335742/9c65a23a-2874-bffd-b457-17e8e9093a0a.png)
図.2 Initialize Parameter Using Data Propertyの設定

###使用法
・List Filesに繰り返し処理したいファイルを格納したフォルダを指定する。
#nethack　のメッセージ履歴を自動的に表示する方法

本内容を利用した場合の一切の責任を私は負いません。

# 概要  
roguelikeは、見せる側はわかっているが、見る側は操作が早くて何をしてるかわからないことがある。
ゲーム内のメッセージ履歴がずっと表示できれば見る側もわかりやすいんじゃないかと思った。
nethackの大元や日本語版は、メッセージ履歴をファイルに出力する機能は無いっぽい。
日本語版はビルドすることができるため、その機能を実装し、リアルタイムでファイルを表示することで実現させる。
リアルタイムのファイル表示はcygwinのtail -fを使用する。
OBS等の配信ソフトでcygwinのウィンドウをリソースにする。

# 準備
下記で日本語版のビルド環境を作る。
https://ja.osdn.net/projects/jnethack/
私の場合はVisual Studioが2015であることもあり、ソースは下記のコミットのものを使用した。
https://ja.osdn.net/projects/jnethack/scm/git/source/commits/f900338b39536d25ed69c5056de87fba76b2d03b

# 実装
下記の変更を行ってビルドする。

↓↓↓↓↓↓↓ あなたの記事の内容
```diff

───────
```diff
↑↑↑↑↑↑↑ 編集リクエストの内容
diff --git a/include/config.h b/include/config.h
index 2985755..6ebbbf0 100644
--- a/include/config.h
+++ b/include/config.h
@@ -207,6 +207,7 @@
 #define XLOGFILE "xlogfile" /* even larger logfile */
 #define NEWS     "news"     /* the file containing the latest hack news */
 #define PANICLOG "paniclog" /* log of panic and impossible events */
+#define MSGHISTORYFILE "msghistory"
 
 /* alternative paniclog format, better suited for public servers with
    many players, as it saves the player name and the game start time */
diff --git a/src/pline.c b/src/pline.c
index b57e7db..3ba5d3a 100644
--- a/src/pline.c
+++ b/src/pline.c
@@ -107,6 +107,7 @@ VA_DECL(const char *, line)
     int ln;
     int msgtyp;
     boolean no_repeat;
+	FILE *msghistory_file;
     /* Do NOT use VA_START and VA_END in here... see above */
 
     if (!line || !*line)
@@ -185,6 +186,15 @@ VA_DECL(const char *, line)
     /* this gets cleared after every pline message */
     iflags.last_msg = PLNMSG_UNKNOWN;
     (void) strncpy(prevmsg, line, BUFSZ), prevmsg[BUFSZ - 1] = '\0';
+	msghistory_file = fopen(MSGHISTORYFILE, "a");
+
+	if (msghistory_file != NULL)
+	{
+		fputs(line, msghistory_file);
+		fputs("\n", msghistory_file);
+		fclose(msghistory_file);
+	}
+
     if (msgtyp == MSGTYP_STOP)
         display_nhwindow(WIN_MESSAGE, TRUE); /* --more-- */
 
diff --git a/sys/share/pcmain.c b/sys/share/pcmain.c
index e700afb..215081e 100644
--- a/sys/share/pcmain.c
+++ b/sys/share/pcmain.c
@@ -92,6 +92,14 @@ int argc;
 char *argv[];
 {
     boolean resuming;
+	int rtn;
+
+	rtn = _unlink(MSGHISTORYFILE);
+
+	if ((rtn != 0) && (errno != ENOENT))
+	{
+		return errno;
+	}
 
     sys_early_init();
 #ifdef WIN32
```

# 使用
exeのある場所の「msghistory」ファイルにメッセージ履歴が出力されるため、cygwinのtail -fでリアルタイム表示する。

# 例
https://www.twitch.tv/cyacya_1451/videos?category=130&filter=all

# 備考
私が使うため、細かいことは行っていない。
同時に複数人でexeを使用する場合は当然ごちゃ混ぜになる。
対策はプロセスIDを使って分けるといいかもしれない。
当然、ファイルが複数になるため、ファイルのライフサイクルも考える必要がある。
Vuexで状態管理を行うサンプルコード

Vuexを学んだけど実際にどうやって使えば良いのか分からない、という方の参考になれば幸いです。

今回紹介するVuexの流れとしては、

①ActionsでAPIを実行してデータを取得して、Mutationsにcommitする
②MutationsでActionsから受け取った値を、Stateにセットする
③StateにMutationsからセットされた値を格納しておく

です。

```index.js
export const state = () => ({
  data: null
})

export const mutations = {
  setData: (state, value) => {
    state.Data = value
  }
}

export const actions = {
  async fetchData({ commit, state }) {
    try {
      const resp = await this.$axios.$get('//ここはAPIを書く//')
      commit('setData', resp)
    } catch (error) {
      console.log(error)
    }
  }
}
```

ActionsにfetchDataという関数を作成し、
その中でAPIの実行、値をrespに格納しています。
その次の行でcommitを使ってsetDataにrespのデータをコミットしています。

Mutationsではvalueに先ほどコミットしたrespの値が入ってきており、
Stateのdataに値をセットしています。
Windowsの外部モニタを着脱すると暫く操作できなくなる問題をWindows Performance Recorderで追ったメモ

最近モニタの接続や接続解除を行うとWindowsのエクスプローラが暫く操作できなくなって困っていた。職業柄HDMIデバイスの抜き差しがかなり多くてクッソ不便なので真面目に追ってみた。

# tl;dr

- デスクトップに大量に画像・動画を置いてると、モニタのつけはずし操作が遅くなる
- → デスクトップを綺麗にしよう (**デスクトップアイコンを非表示にしていても**)

1000 個くらいあったファイルを一掃したら相当に高速になった。Windowsデスクトップのアイコンは普通のエクスプローラWindowの一種として実装されているが、デスクトップ全体を占める巨大なWindowをリサイズすることになるので、そのリサイズに時間が掛かっていたのではないかと予想している。

# データの採取

WindowsにはEvent Tracing for Windows(ETW)という、macで言うところのDTraceのようなカーネルトレース機構があり、これをいわゆるサンプリングプロファイラとして使って **応答するまでに実行していたプログラムとその実行箇所** を調べる。

## ツールのインストール

プロファイラ等のツールはWindows ADK( https://docs.microsoft.com/ja-jp/windows-hardware/get-started/adk-install )の一部として提供されているので、一式インストールする。

次に、GoogleUIforETW( https://github.com/google/UIforETW/releases )がWrapperとして著名なので、これを展開して `bin/UIforETW.exe` を実行する。UIforETWは、Windows Performace Analyzerで便利な分析手法をいくつか自動的にセットアップしてくれる。

## プロファイルの採取

Windows Performance Recorder を立ち上げて、適当にプロファイルを採取する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67446/c107e861-77ed-083a-e72f-013e0a2d0ce8.png)

Start をクリックしたら、重そうな操作を実行し、トレースを取得する。

# 解析

... 解析については、数をこなして慣れるしかない面がある。

## 前処理

トレース( `*.etl` )を取得したら、Windows Performance Analyzerを開いて、Window → Load Symbols でシンボルをロードする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67446/1cdf49e7-4bc6-e435-1437-d4694728b381.png)

次に、"Randomascii wait analysis"(UIforETW が自動的にセットアップする)から、重い処理であろう箇所を探し、範囲選択する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67446/60bd3c8b-f545-c69b-321b-b5e5fa7bda05.png)

今回は、このエクスプローラのアクティビティが怪しいので、この部分を選択し、ズームする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67446/2caaebe0-ef03-9e84-bfc8-1535d378aa73.png)


## 重い処理の特定

"Randomascii inclusive stack" から、 `Count` の大きいところを次々と開けていく。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67446/7e0515aa-5ed6-2e82-9437-23a77b134e30.png)

すると、  `windows.storage.dll!FireOnCollectionChanged<CEventSinkContainer>` → `shell32.dll!CCollectionSink::OnCollectionChanged` → `shell32.dll!CListViewHost::OnCollectionChanged` ... の呼び出しで大半の時間を消費していることがわかる。

## 推理

関数名から、おそらくWindowsエクスプローラ(shell32)の表示ロジックとみられる
↓
エクスプローラのWindowを全て閉じた状態でも再現する
↓
常に表示されているのはデスクトップなのでデスクトップが怪しい
↓
普段デスクトップは非表示で使っているけど、内部的には表示 & リサイズしているのではないか？
↓
とりあえずデスクトップを掃除してみる → **当たり** 。モニタを抜き差ししても、すぐ操作できるようになった

# かんそう

デスクトップアイコンを非表示にしてもデスクトップフォルダの内容が性能に影響するのはマジで釈然としない。
[Vuex]Actionsでasync/awaitを使う

今回はActions内でAPIを実行してデータを取得し、
Mutationsにcommitする場合を考えてみます。

```index.js
export const actions = {
  async fetchData({ commit, state }) {
    try {
      const resp = await this.$axios.$get('//ここはAPIを書く//')
      commit('setData', resp)
    } catch (error) {
      console.log(error)
    }
  }
}
```

fetchDataという関数を作成し、
その中でAPIの実行、値をrespに格納しています。
その次の行でcommitを使ってsetData（Mutationsに定義している関数とする）にrespのデータをコミットしています。
SvelteのAwait blocksを使ってみる

# はじめに
Web APIでデータを取得する際にfetch APIだけを使っていたのですが、
`.then`が何回も出て見通しが悪くなったので、async/awaitとSvelteのAwaite blocksで見通しをよくする。

# 元のコード

```javascript
<script>
  let items;
	
  $: fetch('https:...')
    .then(res => res.json())
    .then(data => {
      items = data;
    });
</script>

{#if items}
  {#each items as item}
    <p>{item.name}</p>

  {/each}
{:else}
  <p>ロード中</p>
{/if}
```

# async/await Await blocks

```javascript
<script>	
  const fetchItems = async function() {
    const items = await fetch('https:...');
    return await items.json();
  }
</script>

{#await fetchItems()}
  <p>ロード中</p>
{:then items}
  {#each items as item}
    <p>{item.name}</p>
  {/each}
{/await}
```

async/awaitの方が見易くていいですね。
それにAwait blocksに`{:catch error}`を使うとエラー時の分岐も簡単に使えるのでこっちを普段から使う方がよさそう。

# 参考記事
[Logic / Await blocks • Svelte Tutorial](https://svelte.dev/tutorial/await-blocks)
ばねモデルで簡単にリアルタイム周波数解析

## 概要

FFTなど難しいことなしにばねモデルの共振を利用してリアルタイム周波数解析ができないだろうか？
60FPSで毎フレーム。

## 方法

対応する音階を固有振動数として共振を再現するクラスResonatorを作成して、
80個のインスタンスを生成する。

```
  class Resonator {
    constructor(parentElm, sampleRate, scale) {
      this.y = 0;
      this.v = 0;
      const f = Math.pow(2, (scale / 12) - 3) * 440 / sampleRate;
      const omega = 2 * Math.PI * f;
      this.k = 0.5;
      this.m = this.k / Math.pow(omega, 2);
      this.b = 0.5;
```

毎サンプルごとに以下を実行する。
元信号を基準位置としたダンパー付きのばねモデルを再現しているだけ。
これにより、サンプルが特定の周波数で変化している場合、対応する固有振動数のResonatorが共振する。

```
        const sample = audioData[index + i];
        const f = this.k * (sample - this.y) - this.b * this.v;
        const a = f / this.m;
        this.v += a;
        this.y += this.v;
```

60FPSとして、1フレームでは以下になる。48000サンプルとしたら毎フレーム800サンプルを処理する。
描画するために最大振幅を計算している。

```
    update(audioData, index, count) {
      let yMax = 0;
      for (let i = 0; i < count; ++i) {
        const sample = audioData[index + i];
        const f = this.k * (sample - this.y) - this.b * this.v;
        const a = f / this.m;
        this.v += a;
        this.y += this.v;
        yMax = Math.max(yMax, this.y);
      }
      this.elm.style.height = `${16 + 32 * yMax}px`;
```

## 全コード

https://github.com/htsnul/spring_coord_detection

## デモ

ドミソの和音が検出できているところ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136875/ceb82534-1be6-5252-452a-a66a12d8b9e0.png)

https://htsnul.github.io/spring_coord_detection/index.html

## まとめ

このような簡単な処理でもリアルタイム周波数解析が一応できる。

## 余談

共振した結果を実際にWeb Audioで80個のサイン波を鳴らして、毎フレーム音量を更新すると元の音楽に聞こえる。

```
        this.gainNode = audioCtx.createGain();
        this.gainNode.value = 0;
        this.gainNode.connect(audioCtx.destination);
        this.oscillatorNode = audioCtx.createOscillator();
        this.oscillatorNode.frequency.value = Math.pow(2, (scale / 12) - 3) * 440;
        this.oscillatorNode.connect(this.gainNode);
        this.oscillatorNode.start();
...
        this.gainNode.gain.value = yMax / 16;
```
vue.js+firebaseでアドレス帳アプリを作成してみた。(初級者向け)

## はじめに
22卒で就活しています。vue.jsの復習としてfirebaseと組み合わせて簡単なwebアプリ作りました。


## つくったもの

簡単なアドレス帳管理アプリです。
[アドレス帳管理アプリ（youtube動画リンク）](https://youtu.be/3arp522UWpY)
[firebaseHostingによってデプロイしたもの](https://my-address-pj-practice.web.app/)

## 主な機能
- googleアカウント認証によるログイン、ログアウト
- 連絡先の追加、変更、削除

## 環境
- npm 6.14.5
- node v12.18.2
- @vue/cli 4.2.3

## 手順
①viewの作成（vuefifyの導入）
②vuexによる状態管理（メニューバー開閉状態、ログイン状態）
③firebase authenticationによるgoogleログイン実装（意外と簡単😍）
④cloud firestoreへのデータベース設定
⑤firebase hostingでデプロイ



## 感想
vuexの恩恵を実感しました。バックエンドはほとんど書かずに実装できました。firebase神です。今回は、google認証のみでしたが、その他の認証や負荷を考慮した開発をして行きたいです。
UbuntuでQEMUを使ってYoctoを動かす。

# ■ やること

UbuntuにYoctoの開発環境を入れます。

他の機器にYoctoを入れる予定ですが、そもそもYoctoについて知らないことが多いので、
QEMUを使って仮想的なYoctoを実行したいと思います。

# ■　試した環境
2020/09/04
Intel® Core™ i5-4570 CPU @ 3.20GHz × 4 
メモリ　32GB 
Ubuntu 20.04.1 LTS　(64bit)

# ■　注意点
仮想環境上のUbuntuでは動かない場合があります。
実環境を推奨します。

# ■やり方

## ● 環境のインストール

```
sudo apt‑get install sed wget subversion git‑core coreutils \
     unzip texi2html texinfo libsdl1.2‑dev docbook‑utils fop gawk \
     python‑pysqlite2 diffstat make gcc build‑essential xsltproc \
     g++ desktop‑file‑utils chrpath libgl1‑mesa‑dev libglu1‑mesa‑dev \
     autoconf automake groff libtool xterm libxml‑parser‑perl
```
## ● pokyをクローン

```
git clone https://git.yoctoproject.org/git/poky
```

バージョンを指定する際は・・・・

```
git checkout -b yocto-3.1 yocto-3.1
```

## ● ビルド環境の初期化

```
source poky/oe-init-build-env
```

## ●　Yoctoコアのコンパイル

```
bitbake core-image-minimal
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12499/290e9675-ebe1-34f3-5884-108945b67de3.png)

CPU４コアを100%使用してコンパイルします。仮想環境でコンパイルするには厳しすぎると思われます。

コンパイルに２時間かかりました。

## ● QEMUで起動する

```
runqemu tmp/deploy/images/qemux86-64/
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12499/b8b3c4ad-5681-ceee-eae7-7101d34e3059.png)

ターミナルが起動しました。
なるほど、これがYoctoですか。

## ● ログインしてみる

デフォルトが何か調べてみた。

User: root
Pass: なし

へぇ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12499/fa68a8dd-fe03-3ba1-297e-ae7d35e1f34b.png)

へぇ。

# ■ 他のコアをコンパイルしてみる。

```
bitbake core-image-sato
```

satoはGUI機能を含んだ最小構成（なのかな）なので、コンパイルしてみる。

```
runqemu tmp/deploy/images/qemux86-64/
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12499/53d53031-02aa-6ba1-2b16-53ba143f0646.png)


コンパイルは・・・１時間・・・・え？
core-image-minimalより、core-image-satoのほうが早いの？なんで？？

という事で、Ubuntu上でQEMU使ってYoctoが立ち上がりました。
チャンチャン！

# ■ まとめ

ひとまず、デフォルトの設定でYoctoをビルド出来、更にそれQEMUでを実行することが出来た。
コンパイル時間を把握することで、何かを修正もしくは変更を行う際に、
どれくらい待てばよいかわかる。

が、何故minimalが遅い（もしくはsotaが早い)のか不明。何が違うんだろう。

さて、とりあえず環境は整った。使い方を学んでいくか。ではでは。