OmniAICreator/Qiita-1.07M huggingface dataset:
Rでデータテーブル上にプロットを作る方法

# はじめに
Rで、テーブル内にプロット（エクセルの条件付き書式のような）を作りたいという要求があった。いくつか方法があるのだが、`DT`パッケージ+`formatStyle`を用いた方法を紹介したいと思う。

また本記事で使用したデータセットは「[Rでの性別、身長、体重、血液型データの作成方法](https://qiita.com/ryamamoto0406/items/489e00fe693b688a4a5e)」で作成したものを「[R shiny でデータの基礎分析用アプリの作成①](https://qiita.com/ryamamoto0406/items/ece1a064f85e7c0466aa)」で csv に保存したので、それを用いて行った。

# サンプルコード
データセットの項目は性別、身長、体重、血液型の４つ。このうち、身長と体重でテーブル内プロットを作る。`datatable()`を`%>%`で`formatStyle`に渡し、そこで項目名や`styleColorBar`の指定を行う。Rのサンプルコードを以下に示す。

```R
library(DT)
library(dplyr)

df <- read.csv("data.csv", row.names = 1)

df %>% 
  datatable() %>%
  formatStyle("HEIGHT",
              background = styleColorBar(
                df$HEIGHT, "steelblue", -90),
              backgroundPosition = "left") %>%
  formatStyle("WEIGHT",
              background = styleColorBar(
                df$WEIGHT, "steelblue", -90),
              backgroundPosition = "left")
```

実行結果は以下の様になる。

![DT_colorbar.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1077734/4e9a85dd-bd75-a4f2-3b74-6676d0f8a619.png)

テーブル内にカラーバーが表示された。

# おわりに
`DT`パッケージを使えばRでもエクセルのようなインタラクティブな表を実現することができる。もし機会があればこれ以外に`formattable`などを使う方法も記事にしたいと思う。
form_withでのformで枠線を消したい時

##form_withでのformで枠線を消す
・どうやるか
結論：border:noneとoutline:noneをcssにつけるだけ。
セレクター名はinput[type="text"]のようにする。"text"の部分をemailとかpasswordとかに変更することでemail_fieldでpassword_fieldにも適応することが可能です！
初期値にうんざりしている人ぜひお試しください！！
rxjs mergeMap  concatMap   switchMap exhaustMap 

if we need to do things in sequence while waiting for completion, then concatMap is the right choice

for doing things in parallel, mergeMap is the best option

in case we need cancellation logic, switchMap is the way to go

for ignoring new Observables while the current one is still ongoing, exhaustMap does just that



```
    const subject = new Subject<{ url: string; delay: number; }>();

    subject
      .pipe(
        //mergeMap(concurrent?: number)  concatMap   switchMap exhaustMap
        exhaustMap( httpGet
        ),
        map((res: string) => JSON.parse(res).ResultData)
      )
      .subscribe((value) => {
        let dateTime = new Date();
        console.log(value + "  " + dateTime.toLocaleTimeString());
      });

    let dateTime = new Date();
    console.log(dateTime.toLocaleTimeString());
    console.log("start http://foo ");
    subject.next({ url: 'http://foo', delay: 5000 });
    console.log("start http://bar ");
    subject.next({ url: 'http://bar', delay: 5000 });
    console.log("start http://baz ");
    subject.next({ url: 'http://baz', delay: 5000 });

    function httpGet(pram :{url: string, delay: number}) {
      return interval(1000).pipe(delay(pram.delay),take(4), map(val => {
        const obj = { ResultData: pram.url + ' -> ' + val };
        //console.log(JSON.stringify(obj));
        return JSON.stringify(obj);
      }))
    }
59日後にITパスポートを受けるFラン私大文系既卒(23日目)

# LAN(Local Area Network)
* LANとは？
 * 狭い範囲のコンピュータで構成される小規模なネットワーク

# WAN(Wide Area Network)
* WANとは？
 * 大規模なネットワーク
 * 電気通信事業者が設置した通信回線

# ハブ
* ハブとは?
 * 複数のコンピュータをネットワークに接続する機器
 * 複数のコンピュータ同士を繋ぐ機器

# ルータ
* ルータとは?
 * ネットワークとネットワークを繋ぐ機器
 * LANやWANを相互にs接続する機器

# デフォルトゲートウェイ
* デフォルトゲートウェイとは?
 * 他のネットワークへの出入り口の役割を担っているルータ

# SDN(Software Defined Network)
* SDNとは?
 * ネットワークを構成する通信機器を、ソフトウェアで制御する技術

# 有線LAN
* 有線LANとは?
 * ケーブルでコンピュータ同士を繋ぐLAN
 * 代表的な規格にイーサネットがある

# イーサネット
* イーサネットとは?
 * IEEE(米国電気電子学会)の有線LANの規格の一つ

# 無線LAN
* 無線LANとは?
 * 無線でコンピュータ同士を繋ぐLAN

# アクセスポイント
* アクセスポイントとは?
 * コンピュータを無線LANに接続するための機器

# ESSID(Extended Service Set IDentifier)
* ESSIDとは?
 * 無線LANにおけるネットワークの名前
 * 無線LANのネットワークを識別する文字列

# ESSIDステルス
* ESSIDステレスとは?
 * ESSIDが見えないようにする機能

# PoE(Power over Ethernet)
* PoEとは?
 * イーサネットのケーブルを用いて電力を補給する技術

# PLC(Power Line Communication)
* PLCとは?
 * 屋内の電力線を通信回線としても利用する技術

# 伝送効率
* 伝送効率とは?
 * 回線速度に対する伝送速度の割合
* 式

```math
伝送効率 = \frac{伝送速度}{回線速度}
```

# 伝送時間
* 伝送時間どは?
 * あるデータ量を伝送するのにかかる時間
* 式


```math
伝送時間 = \frac{データ量}{伝送速度}
```

# 通信プロトコル
* 通信プロトコルとは?
 * コンピュータ同士が通信するときに守るべき約束事

# SMTP(Simple Mail Transfer Protocol)
* SMTPとは?
 * 電子メールをサーバに送るためのプロトコル

# POP(Post Office Protocol)
* 電子メールをメールサーバから受け取るためのプロトコル

# IMAP(Internet Message Access Protocol)
* IMAPとは?
 * 電子メールをダウンロードせずに、メールサーバ上メールを閲覧するためのプロトコル

# FTP(File Transfer Protocol)
* FTPとは? 
 * ファイルを転送するためのプロトコル
 * 欠陥あり
 * 現在は他のプロトコルを使うことが推奨されている

# NTP(Network Time Protocol)
* NTPとは?
 * コンピュータの時刻を合わせるためのプロトコル

# IPアドレス(Internet Protocol Adress) 
* IPアドレスとは?
 * ネットワークに接続しているコンピュータを識別するための番号
 * ICANNという管理団体が管理している

# ポート番号
* ポート番号とは?
 * アプリケーションソフトウェアに割り当てられる情報の出入り口を示す値

# MACアドレス
* MACアドレスとは?
 * コンピュータに割り当てられるアドレス
 * 次の通信相手を特定するアドレス

# ドメイン名
* ドメイン名とは?
 * 人間がわかりやすいように、IPアドレスを変換したもの
 * ICANNが管理している

# DNS(Domain Name System)
* DNSとは?
 * ドメイン名をIPアドレスに変換するための仕組み

# IPv6
* IPv6とは?
 * 128ビットで構成されるアドレス
 * IPアドレスの枯渇を回避するために作られた

# グローバルIPアドレス
* グローバルIPアドレスとは?
 * インターネットに直接接続するコンピュータに割り当てられる世界で唯一のIPアドレス

# プライベートIPアドレス
* プライベートIPアドレスとは?
 * インターネットに直接接続しないコンピュータに割り当てられるアドレス
 * LAN内だけで使うアドレス

# NAT(Network Address Translation)
* NATとは?
 * プライベートIPアドレスをグローバルIPアドレスに変換する技術

# DHCP(Dynamic Host Configuration Protocol)
* DHCPとは?
 * プラ一ベートIPアドレスを自動で割り当てるプロトコル

# 電子メール
* Toとは?
 * 記入されている宛先は、全員確認できる
* Ccとは?
 * 記入されている宛先は、全員確認できる
* Bcc
 * 記入されている宛先は、送信者以外確認できない

# RSS
* RSSとは?
 * Webサイトの見出しや要約などを記述するフォーマット

# cookie
* cookieとは?
 * ユーザのブラウザに、Webサーバからの情報を一時的に保存する仕組み

# MVNO(Mobile Virtual Network Operator)
* MVNOとは?
 * 他の会社の無線通信インフラを使って、顧客にSIMカードを提供し、通信サービスを行う事業者

# FTTH(Fiber To The Home)
* FTTHとは?
 * 光ファイバを使った家庭向けの通信サービス 

# LPWA(Low Power Wide Area)
* LPWAとは?
 * 省電力で広範囲の通信ができる

# エッジコンピューティング
* エッジコンピューティングとは?
 * IoT機器の近くにサーバを配置することで応答速度を高める技術
ansibleエラー：ERROR! 'sudo' is not a valid attribute for a Play

# はじめに

久しぶにdotfileの調整をしていたら至る所でエラーが、vimrcやzshrc...etc
ローカルにライブラリをまとめて入れるときにansibleを使っています。
ansibleを久しぶりに実行したところエラーが出たのでメモ

# エラー

こんな感じで実行

```
ansible-playbook -i hosts -vv playbook.yml
```

結果

```
ERROR! 'sudo' is not a valid attribute for a Play

The error appears to be in 'dotfiles/playbook.yml': line 1, column 3, but may
be elsewhere in the file depending on the exact syntax problem.

The offending line appears to be:


- hosts: localhost
  ^ here
```

playbook.ymlはこんな感じ

```
- hosts: localhost
  connection: local
  gather_facts: no
  sudo: no
  vars:
    homebrew_taps:
      - homebrew/cask
      - sanemat/font
    homebrew_packages:
略
```

エラー的にはhostsの最初の一行目かと思った。。

# 対応

エラーに書いてる通りsudoが現在は使えず、becomeにするそうです

```
ERROR! 'sudo' is not a valid attribute for a Play
```

```
- hosts: localhost
  connection: local
  gather_facts: no
  become: no
  vars:
    homebrew_taps:
      - homebrew/cask
      - sanemat/font
    homebrew_packages:
略
```

以上

# 終わりに
dotfile系は久しぶりに環境構築で実行すると必ずエラーが起きるので切ない。
本当は簡単に同じ環境を持ってきたいって目的なのに、毎回エラーで時間を食う

５年ぶりぐらいにdotfileをまとめて整理したのでしばらくは大丈夫そう
kintone プラグイン開発メモ 丸ごとファイルコピー

kintone プラグインの開発で、一つのプラグイン毎に製品版、試用版等全部で４つを作成している。
試用版は、製品版とほとんど同じで manifest.json など一部異なっているので、manifest.json を除き製品版ソースを試用版ディレクトリに丸ごとコピーして、プラグインにパッケージする。
node の fs-extra を使って、処理を作成したので、メモしておきます。

# 概要

manifest.json 以外のソースファイルを製品版から試用版にコピーするしくみを作成

- 製品版、試用版等で、少しづつ構成が異なり、manifest.json が４つある
- manifest.json 以外の製品版ソースファイルは、試用版にすべて必要
- 試用版にのみにあるソースファイルがある
- ファイル削除は、行わない
    - 不要ファイルが生じたときは、マニュアル作業

# fs-extra とは

- [fs-extra](https://www.npmjs.com/package/fs-extra)
- node.js において、標準で利用できるァイル操作のライブラリ fs の機能拡張版
- manifest.json をコピー対象外にするのに、fs-extra の filter 機能を利用

# ファイル丸ごとコピー処理

fs-extra の filter で、ファイル名が manifest.json を除外

- Usage:
    - node dcody.js prod trial
        - prod: 製品版ディレクトリ
        - trial: 試用版ディレクトリ

```dcopy.js
var fs = require('fs-extra');

function showUsageAndExit() {
    const path = require('path');
    const basename = path.basename(process.argv[1]);
    console.error(`Usage: node ${basename} <sorce> <target>`);
    process.exit(1);
}

const args = process.argv.slice(2);
if (args.length !== 2) {
    showUsageAndExit();
}

const filterFunc = (src, dest) => {
    return src.split('\\').pop() !== 'manifest.json'
}

fs.copy(args[0], args[1], { filter: filterFunc }, err => {
    if (err) return console.error(err)
    console.log('dcopy success!');
})
```

# プラグインパッケージ処理に組み込み

- 製品版ソースを試用版にコピー
- 試用版プラグインをパッケージ
- 試用版プラグインをkinatone 環境にアップロード

```npm-start-trial.js
const runAll = require("npm-run-all");

runAll(["copy-trial", "develop-trial", "upload-trial"], {
  parallel: true,
  stdout: process.stdout,
  stdin: process.stdin
}).catch(({results}) => {
  results
    .filter(({code}) => code)
    .forEach(({name}) => {
      console.log(`"npm run ${name}" was failed`);
    })
  ;
});
```

# npm コマンドで実行 試用版プラグインの作成

- usage:
    - npm run trial

```package.json
  "scripts": {
    "copy-trial": "node scripts/dcopy.js prod trial",
    "trial": "node scripts/npm-start-trial.js",
    ...
  }
```
tflite_flutterの'sh install.sh -d'時のエラー

# tflite_flutterをプロジェクトにinstallして、プロジェクトのルートパスに`install.sh`を設置したものの`sh install.sh -d`がうまく実行できない

##解決策
Macのterminalを開いて、
`cd .pub-cache/hosted/pub.dartlang.org`
`install -d tflite_flutter-最新バージョン`

最新バージョンは
https://pub.dev/packages/tflite_flutter
をチェックしてください。

僕の場合は0.9.0でした。

では、良いflutterライフを！
EC2のインスタンスタイプについて

<h1>はじめに</h1>
今まで意識してこなかったEC2のインスタンスタイプの種類や特徴、インスタンスタイプの選び方についてまとめてみた。

<h1>インスタンスタイプについて</h1>
<h4>そもそも</h4>
インスタンスタイプとはユースケースごとに選択できるCPUやメモリなどの組み合わせのこと。
EC2インスタンスはCPUやメモリ、ストレージの組み合わせなどによってさまざまなタイプがあり、現在のインスタンスタイプは約300ほどもある。

<h4>ネーミングポリシー</h4>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1881328/1de6eeda-76fe-698b-55a2-edbdc57d98c6.png)

<ol>
<li>インスタンスファミリー</li>
インスタンスタイプを用途別に分類したもの。
グループとしては大きく「汎用」「コンピューティング最適化」「メモリー最適化」「Accelerated Computing」「ストレージ最適化」に分かれる。
<li>インスタンス世代</li>
そのインスタンスファイミリーの世代番号で、新しくなるごとに数が増えていく。
<li>インスタンスサイズ</li>
文字通りインスタンスタイプのスペックを示すもの。メモリに応じて「nano」「micro」「small」「medium」「large」「xlarge」「2xlarge」などが用意されている。
</ol>

<h4>各インスタンスファミリーごとの特徴</h4>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1881328/5d24813d-1578-726b-60b7-1fd371d49e12.png)

<h1>インスタンスの選び方</h1>
EC2は、利用するアプリケーションやワークロードに応じて、最適なコンピューティング環境（プロセッサとアーキテクチャ）を選ぶことが正である。
ただその際に基本的な汎用型をベースに、どの種類を選ぶか考えるのが効率的だと思う。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1881328/755acbed-d5bb-a0c0-07d7-55eab1a755ee.png)

<h1>備考</h1>
ここまで各インスタンスタイプの概要や特徴について記載してきたが、最近では、AWSが新しく作ったAWS Gravitonというプロセッサが搭載されているインスタンスが使われるようになってきている。
AWS GravitonはAWSにより64-bitのArmNeoverseコアを使用してカスタム構成されたプロセッサで、EC2で実行するクラウドワークロードに、最良の料金とパフォーマンスを提供してくれるもの。

<table>
<thead>
  <tr>
    <th>プロセッサ</th>
    <th>Intel Xeon processor</th>
    <th>AMD EPYC processor</th>
    <th>AWS Graviton Processor</th>
  </tr>
</thead>
<tbody>
  <tr>
    <td>アーキテクチャ</td>
    <td>x86_64 architecture</td>
    <td>x86_64 architecture</td>
    <td>64-bit Arm architecture</td>
  </tr>
</tbody>
<tbody>
  <tr>
    <td>コスト効果</td>
    <td></td>
    <td>Intelより10%コスト削減</td>
    <td>Intelより最大45%コスト削減</td>
  </tr>
</tbody>
</table>

上記の図からも分かる通り、Amazon EC2 汎用 (M6g、M6gd、T4g)のさまざまなワークロード向けのインスタンスでは、比較し得る現行世代の現行世代のx86ベースインスタンスより最大で45%向上したコストパフォーマンスを発揮できる。
※もともとx86_64アーキテクチャのインスタンスから移行する場合は、OSが異なるため、新しくAMIから作る必要がある。

x86ベースの代表的なT3系インスタンスのスペックと、Armベースの代表的なT4g系インスタンスのスペックを記載しておく。

<h4>T3系インスタンスについて</h4>
x86ベースの汎用型で現時点で、テスト向きである。
画像は[AWS公式サイト](https://aws.amazon.com/jp/ec2/instance-types/)から抜粋
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1881328/274ff239-bc7f-7e5a-6820-8ad270fd73bd.png)


<h4>T4g系インスタンスについて</h4>
Armベースの AWS Graviton2 プロセッサを搭載している。
画像は[AWS公式サイト](https://aws.amazon.com/jp/ec2/instance-types/)から抜粋
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1881328/e0645c15-9a64-cddb-079d-06c2ce6cec42.png)

<h1>その他</h1>
参考にしたのは以下
①インスタンスタイプの選び方（armについては32分頃〜）
<iframe width="560" height="315" src="https://www.youtube.com/embed/Q1LUX8WMjHY" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

②AWS Gravitation2について（armへの移行の注意点は22分頃〜）
<iframe width="560" height="315" src="https://www.youtube.com/embed/2XY3-e4eKAk" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
EC2の暗号化について②

#はじめに
前回の記事(https://qiita.com/chanmuuuu20/items/7f78e1002a53b936f135)
で稼働中のEC2の暗号化の設定方法について書きました。
前回は、EC2のAMIを取り直して新たにEC2を作成するやり方でしたが、
今回は、稼働中のEC2の再作成ではなく、暗号化したEBSに付け替えるやり方でやってみます。

#設定方法
基本的な考え方は前回と同じです。
今回はEBSのsnapshotを取得して、取得したsnapshotのコピー時に暗号化、
暗号化されたsnapshotからEBSを復元して、EBSを付け替えるというもの。

（１）対象のEC2の確認
・対象のEBSが暗号化されていないことを確認
・あとでデバイス名が必要になるので確認しておく
![スクリーンショット 2021-08-20 11.12.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575134/e40073a1-3d61-2fc2-134c-d6dac098452e.png)
（２）該当EBSのsnapshotを取得する
![スクリーンショット 2021-08-20 11.13.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575134/28bc8d82-7d2e-3ffd-d42b-ca930c02a708.png)
（３）取得したsnapshotをさらにコピーし、コピーする際に暗号化にチェックを入れる
![スクリーンショット 2021-08-20 11.13.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575134/9516b2fa-760c-6797-3857-b513d11379c4.png)
![スクリーンショット 2021-08-20 11.14.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575134/59127a42-a6a5-6060-c383-3b4a8694dc52.png)
（４）コピーしたsnapshot（暗号化済み）からEBSを作成する
![スクリーンショット 2021-08-20 11.17.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575134/46fd9809-7a30-9c41-0200-b24bf35d8147.png)
snapshotが暗号化されているため、チェックが入った状態になっている。
![スクリーンショット 2021-08-20 11.18.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575134/cd4edcb7-1048-53fb-c911-c1d71bf8784c.png)
（５）暗号化されたEBSが作成される。
![スクリーンショット 2021-08-20 11.19.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575134/08b26856-30fa-9f7b-4960-a593bc8865eb.png)
（６）EBSを入れ替えるため、EC2から最初のEBSをデタッチする。
（※OS情報とかがあるルートボリュームをデタッチするため停止状態で行う。
というかsnapshotの取得時点で停止した方が安全）
![スクリーンショット 2021-08-20 11.36.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575134/ff0f2cc1-cfa2-5f0c-bee7-a1bccc9f996d.png)
（７）さきほど作成した暗号化されたEBSをアタッチする。
![スクリーンショット 2021-08-20 11.42.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575134/4e7bf026-4dfd-d29e-8bd6-46814a6615b5.png)
デバイス名のところに（１）で確認したデバイス名を入れる。
（ルートボリュームなので、適当なデバイス名を入れてしまうとEC2が起動しなくなる）
![スクリーンショット 2021-08-20 11.37.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575134/907aa8d0-49ad-3b0f-4e25-fec1d4a68149.png)
（８）対象のEC2にアタッチされているEBSが暗号化されていることを確認する
![スクリーンショット 2021-08-20 11.37.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575134/ebe3a084-28d0-6c8b-5544-8d43c8b6b483.png)

#注意点
前回同様にKMSキーがデフォルトの場合、アカウントをまたいでのsnapshot共有が
できないことに注意する。

#引用
https://dev.classmethod.jp/articles/encryption-ebs-for-running-ec2-instance/

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/EBSEncryption.html
lwc js里面打开标准的新规画面，并且提前设置相关值

                         let para = '';
                        let retype = '';
                        if(this.displayDiv=='取引先'){ 
                            para = 'Account__c='+this.recordId;
                            retype = data;//'0121s0000001FdXAAU'
                        }else{ 
                            para = 'Opportunity__c='+this.recordId;
                            retype = data;//'0121s0000001FdYAAU'
                        }
            
                        this[NavigationMixin.Navigate]({
                            type: 'standard__objectPage',
                            attributes: {
                                objectApiName: objKind,
                                //objectApiName: 'Account',
                                actionName: 'new',
                            },
                            state : {
                                nooverride: '1',
                                defaultFieldValues: para,
                                recordTypeId:retype
                            }
                        });
【エラー解決】Terminalをよく確認することを学んだときの話


#結論

* ストロングパラメーターに新しく追加したカラムを設定してなかった


#このエラーから学んだこと

*　エラーが出なかった場合はTerminalをよく確認すること
 

#解決前の状況

###前提

読んだ本の感想を投稿するアプリを作成していました。

星レビューを実装中にレビュー付きの投稿はできたものの、
Viewに反映されず、アクションで保存がされていなかったのか、
それともView側の原因で反映されていないだけなのかわかりませんでした。

### 発生していた問題

エラーメッセージはなかったが、
Terminalをよく確認したら、下記のような文字を発見

```
Started POST "/books" for 114.162.142.130 at 2021-07-30 02:58:47 +0000
Cannot render console from 114.162.142.130! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255
Processing by BooksController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"JrdZ35IWoeOtDNyS/qXQ9dM/EA4s2ykS6dUGQy4oYvDp6ztegXlzwwOG2iNQQubij+1Kiae7DgIwK9ntuSq2mA==", "book"=>{"title"=>"君の膵臓を食べたい", "body"=>"真実か挑戦か", "rate"=>"5"}, "commit"=>"Create Book"}
  User Load (0.1ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ? ORDER BY "users"."id" ASC LIMIT ?  [["id", 1], ["LIMIT", 1]]
  ↳ /home/ec2-user/.rvm/gems/ruby-2.6.3/gems/activerecord-5.2.6/lib/active_record/log_subscriber.rb:98

******Unpermitted parameter: :rate　******

   (0.0ms)  begin transaction
  ↳ app/controllers/books_controller.rb:8
  Book Create (1.5ms)  INSERT INTO "books" ("title", "body", "user_id", "created_at", "updated_at") VALUES (?, ?, ?, ?, ?)  [["title", "君の膵臓を食べたい"], ["body", "真実か挑戦か"], ["user_id", 1], ["created_at", "2021-07-30 02:58:47.155136"], ["updated_at", "2021-07-30 02:58:47.155136"]]
  ↳ app/controllers/books_controller.rb:8
   (4.7ms)  commit transaction
  ↳ app/controllers/books_controller.rb:8
Redirected to https://2e29f99427b54011942ab140f9396b25.vfs.cloud9.us-east-1.amazonaws.com/books/18
Completed 302 Found in 41ms (ActiveRecord: 7.6ms)
```

Unpermitted parameter: :rate？？？？
もしかして、、、と思って、
Controllerのストロングパラメータを確認したところ、
:rateの記述をわすれてました。。。。。


####投稿者コメント
単なる凡ミスですが、Terminalをよく確認するのって大事だなと気付きました。
解決できた喜びで思わずQiitaを投稿しました。
こういった投稿は初ですが、エラーを解決した件もどんどんアウトプットできればと考えています。


####My Profile
プログラミング学習歴３ヶ月目のアカウントです！
プログラミングスクールで学んだ内容や自分が躓いた箇所等のアウトプットの為に発信しています。
また、プログラミング初学者の方にわかりやすく、簡潔にまとめて情報共有できればと考えています。
もし、投稿した記事の中に誤り等ございましたら、コメント欄でご教授いただけると幸いです。
ACMで「*.*.example.com」のような2階層サブドメインのワイルドカードSSL証明書を作りたかった

:::note warn
更新情報(2022/7/25)
コメントで別の方法を教えて頂いたため、解決方法を1と2に分けました（2が追加した解決法）。
それぞれにメリットがあると思うのでお好きな方を選んでください。
:::

# 環境
- 取得ドメイン元: お名前.com
- DNS: Route53
- サブドメイン: 元ドメインのホストゾーンにサブドメイン用のAレコードを追加

# やりたかったこと

- 以下のような2階層のサブドメインに対応したSSL証明書を1枚で発行したかった。
   - `example.com`
   - `api.example.com`
   - `stage.example.com`
   - `api.stage.example.com`

上記を達成するために`*.*.exmaple.com`をACMに登録しようとしましたが、AWSさんに怒られます。
<img width="500" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434874/eb93870e-bf26-1911-7280-15b8d1890f54.png">

公式ドキュメントにもこのような要件への対応は不可能みたいなことが書かれていますね。

https://docs.aws.amazon.com/ja_jp/acm/latest/userguide/gs-acm-request-public.html

残念ですが、ACMでは「SSLに対してアスタリスクを２つ付けるのは**不可能**」のようです。
ただし、「**１階層目のサブドメインを個別で指定してあげる方法**」であれば解決できます。
そこで以下に２つの解決方法を掲載します。

# 解決法1: `exmaple.com`と`stage.example.com`の２つの証明書をそれぞれ取得
元ドメインの`exmaple.com`とサブドメインの`stage.example.com`の２つの証明書を別個で取得する方法です。
<img width="750" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434874/5e1dd40c-62e3-fa6c-56cd-be355ace62b5.png">

上記写真のように、証明書ごとに元ドメイン`exmaple.com`とワイルドカード`*.example.com`の２つを追加して上げてください。
これで最初に上げた４つのドメインに対応できるようになります！

ただし、この方法は以下のようにRoute 53ホストゾーンをそれぞれ用意してあげる必要があります。
- `exmaple.com`のホストゾーン
- `stage.expamle.com`のホストゾーン

仮にサブドメインのホストゾーンが存在しない状態でサブドメイン用の証明書をACMで登録しようとしても、ドメイン状態が一生`検証保留中`になって**証明書が作れません**。
そこで、Route 53で`サブドメイン用のホストゾーンを作成`して権限を委任します。

https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/dns-routing-traffic-for-subdomains.html

https://dev.classmethod.jp/articles/regions-accessed-subdomain-route53/

やり方は上記のクラスメソッドさんの記事がわかりやすくておすすめです。

これで問題なく最初の４つのドメインに対応できると思います。

:::note warn
元ドメインのホストゾーンにサブドメインのAレコードを作っていた場合は削除を忘れないようにしてください！
:::

この方法のデメリットは、サブドメインが増えるごとにホストゾーンを追加する必要があるので、そのたびにコストがかかります(1ホストゾーン/0.5ドル)
そこで本来やりたかった１枚で済ませる方法を次に紹介します。

# 解決法2: １つのACM証明書内に必要なサブドメインをすべて記述する
こちらはコメントで教えていただいた方法です。
**必要とされるサブドメインをACM作成時にすべて登録する**、これだけです。
今回網羅したいドメインであれば以下のようにドメイン名を登録します。
- `expamle.com`
- `*.example.com`
- `*.stage.example.com`
<img width="750" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434874/91d4b165-7224-2fd5-27da-59a31b0e9b35.png">

この方法ならホストゾーンは元ドメイン(`example.com`)の一つだけでOKです（サブドメイン含めた4つのCNAMEが１つのホストゾーンに集約されます）。


これなら費用も全くかからないですし何よりシンプルでわかりやすいですね。
デメリットは「**後からACM証明書にドメインを追加できない**」ので、サブドメインを追加したい場合は**ACM証明書を作り直す必要がある**ことです。

# まとめ
「サブドメイン追加のたびに証明書を作り直したくない、サブドメインごとに証明書を管理したい場合」は**解決法1**を、
「コストを極限まで抑えたい、証明書を一つにまとめて管理を楽にしたい場合」は**解決法2**を選ぶといいと思います。
特徴量エンジニアリングとは？

Jason Brownlee博士は、機械学習のスペシャリストであり、[Machine Learning Mastery](https://machinelearningmastery.com/)を創設した研究者でもあります。Brownlee博士によると、"[特徴量エンジニアリング](https://machinelearningmastery.com/discover-feature-engineering-how-to-engineer-features-and-how-to-get-good-at-it/)とは、背景にある問題を予測モデルに効果的に反映させることを目的に行う、生データから特徴量に変換するプロセスのことをいう。その結果、見たことのないデータに対するモデルの精度が向上する。"とのことです。予測モデル作成のポイントは、データを最大限活用することに尽きるとのことです。

別の言い方をすると、特徴量エンジニアリングとは、ドメイン知識を使って、モデルの精度を向上させるために、より良いもしくはより新しい情報を提供するように、生データを変換するプロセスです。このプロセスでは、モデルのパフォーマンスを向上させるために、データセットに変数（特徴量と呼ばれる）を作成、追加します。これは、重要な考え方です。なぜなら、入力データセットには機械学習アルゴリズムに必要な情報を含む必要があり、最終的には機械学習のプロセス全体を促進するのに役立つからです。

![feature engineering (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1196881/12878174-d9ae-2cc2-aa4a-666d3d047a38.png)


##特徴量エンジニアリングを分解する

機械学習のワークフローには、データの収集、データのクリーニング、特徴量エンジニアリング、モデルの定義、モデルの学習/テスト、予測結果の出力などのステップが含まれます。業界では「アート」とも呼ばれる特徴量エンジニアリングは、良いモデルとそうでないモデルの違いを生み出す要因となります。特徴量エンジニアリングは、機械学習のプロセスには不可欠ですが、万能ではなく、ビジネス上の問題、モデルの種類、業界などによって、必要なステップは異なります。しかし、特徴量エンジニアリングのステップには、以下のようなものがあります。

-	特徴量エンジニアリング前に実施する、データ準備と探索的データ分析
-	特徴量のブレインストーミング/テストと、作成する特徴量の選定
-	特徴量の作成
-	特徴量がモデルでどのように機能するかの確認（影響度合いのテスト）
-	必要に応じて特徴量を最適化し、効果的に機能するまで繰り返し


##特徴量エンジニアリングとDataiku

一般的に手動で行われる特徴量エンジニアリングのプロセスをサポートするために、Dataikuでは、数式、コード、ビジュアルレシピを使用して新しい特徴量を変換・生成できます。モデルを作る際、[DataikuのAutoML](https://www.dataiku.com/learn/webinars/automl-with-dataiku-an-end-to-end-demo/)は、自動的に欠損値を補い、エンコーディング技術を使用して非数値データを数値に変換し、特徴量の前処理と処理を加速します。

さらに、特徴量生成機能では、モデルに追加でデータを提供するために特徴量の新しいペアワイズの組み合わせをプログラムで作成できますし、一般的な特徴量の削減手法を用いることもできます。それらを一旦実行すると、Dataikuは設定を文書化したり、スコアリングやモデルの再学習に再利用できるように、特徴量エンジニアリングのステップをレシピに保存したりします。


##特徴量エンジニアリングについてさらに知りたい方はこちら（英語）

次の記事では、ユーザーの知識を活用して意味のある特徴量を生成する自動特徴量エンジニアリングの枠組みを、Dataikuの研究者がどのように構築したかご紹介します。

https://medium.com/data-from-the-trenches/automatic-feature-engineering-an-event-driven-approach-b2ca09d166f


原文:　*[What Is Feature Engineering?](https://blog.dataiku.com/what-is-feature-engineering)*
Webページコーディング 対策デッキ

## 背景
- 案件数獲得のために広告LPを作成することになった。そこでコーディングを担当した
- LPコーディングで意識すべきことを備忘録として残すためこの記事を書くことに。
- 将来ポートフォリオサイトを作成する予定がある人の役にたちたい。

## 事前準備
### ◆ CSS設計完全ガイドを深く読み込んでおく
無秩序にクラス名をつけてしまうと，数日経った後にCSSを見返す時に困るし，
どのクラスがどこに属しているのかを明確に把握できなくなる。
命名規則はBEMが個人的にオススメ。基本的に以下の規則を守っておけば迷うことはないはず…！

```html
(セクション)--(セクション部品名)--（各パーツ名）
```

https://gihyo.jp/book/2020/978-4-297-11173-1

### ◆ CSSで迷子にならないようにSASSをマスターしておく
SASSはスタイルシートのネストができるので，
何がどのクラスに含まれるのかを構造的に把握することが可能である。
**おまけにコードの量も3割程削減できるので，CSSよりも生産性がグンとアップする。**

### ◆ リセットCSSは必須
意外にも見落とされがち。
ブラウザによって異なるデフォルトのCSSを打ち消し、ブラウザ間の表示のズレを未然に防ぐことができる。

こんな感じで自作のCSSファイルとリセットCSSファイルを併用すればOK。

```html
<head>
    <link rel="stylesheet" href="path/to/normalize.css">
    <link rel="stylesheet" href="path/to/style.css">
</head>
```

https://github.com/necolas/normalize.css/blob/master/normalize.css

### ◆ BootStrapに頼りすぎない
HTML,CSSをある程度学習すると「BootStrap便利やん！」と思うことが多い。
一見効率的に見えるが、思わぬところでpaddingが活性化しレイアウトのズレが発生することがある。
なので極力BootStrapを避けflex-boxを使うのが望ましい。

https://www.webcreatorbox.com/tech/css-flexbox-cheat-sheet

## LPコーディング頻出パターン
### チェックボックスをタップしたとき、ボタンのdisable属性を切り替える
https://webjin.work/toggle-disabled-attribute-with-jquery/

### ボタンを押すと特定の位置までスクロール
https://hacknote.jp/archives/3385/

### カルーセルスライダー
https://gimmicklog.com/jquery/549/

### フレームアウトするとふんわりと表示される
これもLPでよくあるギミック。
https://natsukimemo.com/jquery-scroll-fadein

## 最終チェック
### どの端末から閲覧しても綺麗に表示されるかをチェック
複数の検証端末を用意する。（iPad, iPhone, etc）
サーバーに作ったLPをアップロードし、公開したページのQRコードを発行する。
各検証端末をQRコードにかざし、LPの置かれているURLにアクセスする。

https://chrome.google.com/webstore/detail/the-qr-code-extension/oijdcdmnjjgnnhgljmhkjlablaejfeeb?hl=ja

## まとめ
この記事が誰かの役に立てばめちゃくちゃ嬉しいです。
”ケツカンマ” 問題について思うこと。

（これは少数派であるからゆえに肩身の狭い思いをしている人が他にもいるのではないかと思いつつもただ自己主張したいだけの記事になります）

## みなさん、ケツカンマ、書いてますか？

配列や引数を定義する時等、様々な部分で出現する「,（カンマ）」。このカンマの扱いについて私の主張を書きたいと思います。

## 個人的主張 『カンマは頭につけたい！』

### 私が理想としている書き方は以下です。

```php
$hoge = [
    'apple' => 'リンゴ'
    , 'lemon' => 'レモン'
];
```

```sql
SELECT hoge
  , fuga
  , piyo
FROM ...
```

### しかし、実際に仕事で書いているコードは以下です。
こう書かないと大抵コードレビューで弾かれます。

```php
$hoge = [
    'apple' => 'リンゴ',
    'lemon' => 'レモン',
];
```

```sql
SELECT hoge,
  fuga,
  piyo
FROM ...
```

ケツにあると見落とさない？
上記の例のようなPHPでの配列定義の場合はこの'レモン'の後ろのカンマはエラーになりませんが、PHPでも関数の**引数定義**やSQL、JSONではエラーになりますよね。なんだか悪習な気がするところですが、この'レモン'の後のケツカンマは 『優しさ』 だと言われました。何が優しいのかわかりゃしない。優しさで言ったら頭カンマなのでは？ と思うのは少数派なのでしょうか？

### 頭カンマのメリット

* 保守性
    * 行の追加や削除を考えると頭にカンマが付いている方がカンマを忘れなくない？
* 可読性
    * カンマがどこにあるのかわかりやすくない？
* （リーダブルコードに載ってた気がするけど手元に本がなく未確認）

### 頭カンマのデメリット

* 認知度の低さ
    * 頭カンマのソースコードが皆無（少なくともエンジニア歴20年の中で推奨している現場はなかった）
    * 頭カンマのメリットがあまり知られていない

デメリット少ないよ。

いや、だってさ、長いif文を改行する時、前に条件持って来ない？？

```php
if ($nankanagaihennsuumeiA === 'hoge'
  && nankanagaihennsuumeiB === 'fuga') {
```

的な？

## 現実は 『郷に入れば郷に従え』
いくらメリデリを語ったところで、所詮多数決で負けるのが関の山だし、そんな細かいことで、と言われてしまうのが現実です。

### 最後に
他にも頭カンマのメリット、ケツカンマのメリットがあったら教えてください！
kintoneの標準機能で対数を求める #4

kintoneで対数を求めるシリーズ完結編です👀
↓前回までの記事はコチラです。

* [kintoneの標準機能で対数を求める #1](https://qiita.com/juri_don/items/0531ff025b57cca95cb8)
* [kintoneの標準機能で対数を求める #2](https://qiita.com/juri_don/private/fe26dd14a89e79f650da)
* [kintoneの標準機能で対数を求める #3](https://qiita.com/juri_don/private/d69e76dda0c80e7550d5)

第1回ではテイラー展開で近似して **lnX(0<X≦2)を求めるアプリ** を作りました。
第2回、第3回では↓の計算方針を示して、それぞれアプリを作り

1.　Xのn乗根（$ X $ の $ \frac{1}{n} $ 乗)を求めるアプリ（第2回 **Xのn乗根を求めるアプリ**）
2.　真数 $ X>2 $ の自然対数 $ lnX $  を求めるアプリ（第3回 **真数 $ X>2 $ の自然対数 $ lnX $  を求めるアプリ**）
3.　$ log_aX $ を求めるアプリ（今回）

今回は底がネイピア数 $ e $じゃない値でも大丈夫な$ log_aX $ を求めるアプリを作ります。

# 計算方法
前回、自然対数 $ lnX $ を求めるアプリが出来ているのであとは底を好きな値$ a $に変換して、$ log_aX $ を求めるだけです。
※以下の公式で計算できます。

```math
log_aX = \frac{log_eX}{log_ea}
```

# アプリの準備

$ log_eX $ と $ log_ea$ を**lnX(自然対数)を求めるアプリ**からルックアップで引っ張ってきます。

| フィールド種類 |フィールド名| フィールドコード |備考（計算式など） |
|:-:|:-:|:-:|:-:|
|ルックアップ   |a(底)   |  a |設定詳細は後述|
|ルックアップ   | X |X   |設定詳細は後述|
| 計算  |計算値   |log_a_X   |lnX/ln_a|
| 数値  | lna  | lna  |ルックアップほかのフィールドのコピーで設定する|
| 数値  | lnX  | lnX  |ルックアップほかのフィールドのコピーで設定する|
| 文字列(1行)  |対数   |対数   |"log " & a & " " & X|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/3749ca46-3c18-966f-d016-51ebee55ce88.png)

**ルックアップa(底)の設定**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/b33e04eb-ffa0-f244-340b-03686a34cd36.png)

**ルックアップXの設定**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/c19f05f7-69c4-9ceb-99df-dc4d67ff2770.png)

# アプリの使い方

動画を準備しましたのでそちらをみてね👀
使い勝手は、もっと工夫すれば良くなるかも？

試しに $ log_540 $ を計算してみました。
電卓で計算した値：  2.2920296742202
アプリで計算した値：2.2920296733
※動画では小数点以下8桁になってますが10桁に直したものと比較してみました。

だいたい良さそうです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/7b091b0e-748e-4ba5-4013-7a20968d4207.png)

↓使い方動画↓
<iframe width="480" height="360" src="https://www.youtube.com/embed/qkkVfP_qarA" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
osを作る その4

#概要

osを作る。
os作るには、インラインアセンブラを極めないと無理。
アセンブラから、ｃの関数へジャンプの実験。

#サンプルコード

```

void hello(void) {
    asm("HELLO:");
	Serial.println("hello");
}

//extern void hello(void) asm("HELLO");

void test(void) {
	asm("jmp   HELLO");
}

void setup(void) {
	Serial.begin(9600);
	Serial.println("ok0");
	test();
    Serial.println("ok1");
    hello();
    Serial.println("ok2");
}

void loop(void) {
}


```

#結果

```
ok0
hello
ok2

```
以上。
AWSのエンコードされたエラーメッセージをデコードして読みやすくするメモ

毎度調べてるので、自分のためのメモ

# エンコードされたAPIエラー
コンソールやCLIでの操作時やCloudTrailなんかで見かけるこいつ。

```
 "errorMessage": "You are not authorized to perform this operation. Encoded authorization failure message: むにゃむにゃむにゃ",
```

# どうしてエンコードしちゃうのさ
余計なことを・・・！と思っていた時期が私にもありました。

ドキュメントに書いてあった
https://docs.aws.amazon.com/STS/latest/APIReference/API_DecodeAuthorizationMessage.html
> The message is encoded because the details of the authorization status can contain privileged information that the user who requested the operation should not see. To decode an authorization status message, a user must be granted permissions through an IAM policy to request the DecodeAuthorizationMessage (sts:DecodeAuthorizationMessage) action.

オペレーションをリクエストしたユーザーが見るべきではない特権情報が含まれている可能性があるから、ってことですね。
具体的にどんなシチュエーションなのかは思いつかないけど、気を遣ってもらってると捉えておきます。


# CloudShellでやってみる
aws cliはもちろんjqも入ってたので話が早いです。

```
$ aws sts decode-authorization-message --encoded-message デコードしたい文字列 | jq .DecodedMessage --raw-output | jq .
```
こんな感じで読める状態になります。
![sts-decode_cloudshell.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99398/3ebce01d-9abf-dd67-5f00-6b4b1a940a58.png)

# 感想
いまのところCloudShellって、こういう本当にちょっとした時に一番使い道を感じますね。


# 参考
https://docs.aws.amazon.com/STS/latest/APIReference/API_DecodeAuthorizationMessage.html
https://aws.amazon.com/jp/premiumsupport/knowledge-center/ec2-not-auth-launch/
https://qiita.com/YumaInaura/items/153b7f80c00fa199a0a8
【PHP学習_備忘録】 配列とは？

# はじめに
今日は配列について勉強しようと思います。

#PHP勉強していて思ったこと
Rubyを学習していたので、phpの理解が追いつきます。
書き方の違いがあるだけなので、内容理解がはやい。

# 配列とは？
変数は、１つの箱にデータをいれるイメージ。
配列は、変数を複数くっつけて並べるイメージ。
もともと配列は `「配列変数」`を略した言い方で、変数と同じにようにデータを入れてつかうものです。

#### 配列の命名規則
・$(ダラー）から始まります。
・半角英数字と_(アンダーバー）が使える。ただし数字が先頭文字には使えない。
・英字の大文字、小文字は区別されます。

#### 配列を作るには
.
①１つずつ代入
②array関数を使う
２つのやり方があります。

# 代入によって配列をつくる方法

書き方

```
書き方① $配列名[キー] = データ;
書き方② $配列名[] = データ;
```
②は、キーを省略できる書き方


実際に書いてみた

<!-- 代入によって配列をつくる(キーを省略) -->
```php
<?php
$days[] = "朝";
$days[] = "昼";
$days[] = "晩";

echo $days[0], 'になりました<br>';
echo $days[1], 'になりました<br>';
echo $days[2], 'になりました<br>';

?>

<!-- 代入によって連想配列を作る -->
<?php
$days["morning"] = "朝";
$days["afternoon"] = "昼";
$days["night"] = "夜";

echo $days["morning"],"になります。<br>";
echo $days["afternoon"],"になります。<br>";
echo $days["night"],"になります。<br>";

?>

```

# 次にarray関数によって配列をつくる方法

array関数によって配列をつくる方法は２つあります。

書き方

```
１つ目 $配列名 = array(データ1,データ２,データ3);

２つ目 $配列名 ＝ array("キー名１" => データ１,"キー名2" => データ2);
```

１つ目では、配列に入れるでデータを区切って並べて書いてます。
２つ目の書き方では、連想配列を作る時によく使われる構文らしいです。

実際に書いてみた

```php
<!-- 連想配列 array関数を使って -->
<!-- ====書き方1==== -->

<?php

$bstone = array("ガーネット","アメシスト","アクアマリン",
"ダイヤモンド","エメラルド","パール",
"ルビー","ペリドット","サファイア",
"オバール","トパーズ","ターコイズ");

$birth = 3;

echo "私は",$birth,"月生まれです。<br>";
echo "誕生石は",$bstone[$birth -1],"です";
?>


<!-- ====書き方2==== -->
<?php
  $days = array("morning" =>  "朝",
                "afternoon" => "昼",
                "night" => "夜");

  echo $days["morning"], "になりました<br>";
  echo $days["afternoon"],"になりました<br>";
  echo $days["night"],"になりました<br>";
?>
```

出力結果


```
私は3月生まれです。
誕生石はアクアマリンです 朝になりました
昼になりました
夜になりました
```


#配列に関する便利な処理

#### 配列に入っているデータの数を求める

```
count関数
要素の数 = count(配列名);
````

以下のコードは、配列を作った後.count関数を呼び出しています。

```php

$days[] = "朝";
$days[] = "昼";
$days[] = "夜";

echo count( $ days );

```
```
出力結果は 3

```


#### 各要素を同じデータで埋める

配列をつくると同時にすべての要素に同じデータを入れることができる

```
array_fill関数

配列 = array_fill(開始キー,要素数,要素に入れる値);
```

```php
$arr = array_fill(0, ３, "おやすみ");

echo "要素数は",count($arr),"<br>";
echo $arr[0],"<br>";
echo $arr[1],"<br>";
echo $arr[2],"<br>";

```

```
出力結果

要素数は3
おやすみ
おやすみ
おやすみ
```

array_fill関数によって、キーが[0]から始まる配列が作られる。
作られた配列の要素数は３で、すべての要素に「おやすみ」の文字列がはいる。


#まとめ
① 配列を使うと、複数の値をまとめられる
② 配列の各データを要素
③ 配列の要素を識別するにはキーを使う。
④ 配列作成には代入法とarray関数の２つがある。
➩ ちなみに自分は、array関数つかったほうが書きやすいと感じました。
[Rails]もっと見るボタンの実装（JavaScriptのみ、jQueryなし）

### 完成イメージ

![スクリーンショット 2021-08-20 10.48.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1912656/43b5fd13-e5f8-81bd-056d-d5da8682701e.png)

合計のレコード数が9件だった場合、

最初は、6件だけ表示。
これを押すと、残りの3件が表示されるという仕組みを作る。

### 前提
マークアップコードはHamlで実装。

// Haml側でのデータの扱い
- ＠sections = 複数のセクション
- section: アプリケーション内で表示する後述の「contents」を格納するセクション
- contents: 「section」と1対多の関連がある、アプリケーション内で表示する複数のレコード


### JS側

```haml
:javascript
  // もっと見る表示
  function SeeMore(contentsId, minimumContentsId, button) {
    const contents = document.getElementById(contentsId);
    const minimumContents = document.getElementById(minimumContentsId);
    const seeMoreButton = document.getElementById(button);

    minimumContents.style.display = "none";
    seeMoreButton.style.display = "none";

    if(contents.style.display == "flex") {
      contents.style.display = "none";
    } else {
      contents.style.display = "flex";
    }
  }
```

#### 引数の説明

「contentsId」には、「全件表示」が格納されているidが入る。
「minimumContentsId」には、「制限表示」が格納されているidが入る。
「button」には、「もっと見るボタン」のidが入る（押下時にボタンも非表示にするため）


### Haml

```haml
// section内の初期表示は6件にする
- content_max_display_count = 6

  - @sections.each do |section|
    .section_contents{id: "d#{section.id}" style: "display: none;"}
      - section.contents.limit(6).each do |content|
        // ここに制限表示の内容が入る
    .section_cotnents{id: "p#{sectioon.id}"}
      - section.contents.each do |content|
        // ここに全件表示の内容が入る

      // もっと見るボタン
      = link_to "もっと見る　(他#{section.contents.count - content_max_display_count}件)", "#", remote: true, onclick: "SeeMore('p#{section.id}', 'd#{section.id}', 'see-more-button#{section.id}')"
```

link_toの第４引数、ここが肝。

```
onclick: "SeeMore('p#{section.id}', 'd#{section.id}', 'see-more-button#{section.id}')"
```

onclick時に、js側で設定したSeeMore()を発動する。
この際にSeeMore()に引数の設定を忘れずに行う。



### まとめ

JSすごい。
ロ－カルよりgithubにpushする手順

1. githubにて個人アカウントのページではnew repositoryを起こし、urlを取得
2. ロ－カルでのフォルダにてWindowsコマンドプロンプト環境でgit initを実行
3. git add .を実行
4. git commit -m "first commit"を実行
5. git remote add origin <url>を実行
6. git branch -M mainを実行
7. git push -u origin mainを実行
8. push完了
Vue.js HTMLの属性(attribute)の中で文字列内変数展開をする

ES2015(ES6)の`(バッククォート)を使った展開方法が使える

```javascript
new Vue({
    el: .app
    data: { key: 'sample' }
})
```

```html
<div class=".app">
  <input type="text" name="`array[${key}]`">
</div>
```

IEはこのTemplate literals (Template strings)を対応してない。

## 参考
https://chaika.hatenablog.com/entry/2018/10/02/090000

https://www.yoheim.net/blog.php?q=20170602
読み物としてのタイムゾーンの設定

## タイムゾーンの設定

タイムゾーンを変更するには、２つのやり方があります。１つ目は、`export TZ="Asia/Tokyo"`コマンドをうって、`TZ`環境変数に日本標準時の設定を行う方法です。

ただし、このコマンドをうつだけでは、一時的な設定になるだけであるため、毎回、このコマンドが流れるようにするため、`.profile`の中にコマンドを記述することになります。`.bashrc`に記述しても悪くはありませんが、環境変数系の設定は慣用的に`.profile`の方に書かれることが多いようです。（チームで同じ環境を触っているのであれば、他人が見て分かり易いように記述するべきですが、全く個人の環境であれば、それ程、意識する必要はないかと思います。）Ubuntuの場合は`.profile`ですが、RedHat系のOSの場合は、`.bash_profile`となります。微妙にファイル名が異なります。

環境変数でタイムゾーンを設定すると、設定したユーザーにしか反映されないことになります。別のユーザーでログインした場合は反映されません。特別な理由がない限り、環境変数で設定する機会はほぼないと思われます。環境変数でタイムゾーンの設定ができるやり方はあまり知らなくてもいいんじゃないかと思います。しかし、LPICとか資格を取りたい人は、問題で問われるようなので、試験対策のために、しっかりと知っておいて下さい。

どのユーザーでログインしても、OS共通で設定したタイムゾーンが反映されるようにするには、環境変数で設定するのではなく、`/etc/localtime`ファイルに設定を組み込むことになります。これが２つ目の方法です。

`/etc/localtime`を`cat`で表示すると分かりますがバイナリファイルです。`file --mime /etc/localtime`で確認すると、 確かに`charset=binary`となっています。つまり、エディタを使って設定ファイルを触って、タイムゾーンの設定をするような方法で設定する方法ではないということが想像できます。更に、`/etc/localtime`を`ls -l`で表示すると分かりますが、`/usr/share/zoneinfo`配下に沢山存在する、タイムゾーン関連の設定ファイルのシンボリックリンクになっています。つまり、例えば、タイムゾーンを東京にしたい場合、`/etc/localtime`のシンボリックリンク先を、`/usr/share/zoneinfo/Asia/Tokyo`に変更してやればいいということになります。それか、シンボリックリンクを張らずに、`/usr/share/zoneinfo/Asia/Tokyo`を、`/etc/localtime`にリネームしてコピーしても同じことになります。ただし、シンボリックリンクを張って設定しておいた方が、後々、確認した時に何をやっているのか分かり易くなるためベターです。海外に引っ越しをすることでもない限り、タイムゾーンを変更する事は、ほぼほぼないとは思いますが。

タイムゾーンを設定する方法で２通りのやり方を紹介しました。タイムゾーン関連のファイルで、`Debian系`Linuxには存在していて、`RedHat系`Linuxには存在していないファイルがあります。それが、`/etc/timezone`です。`/etc/timezone`は、`/etc/localtime`ファイルと異なりテキスト形式のファイルです。つまり、`Debian系`Linuxには、`/etc/localtime`を使う代わりに、エティタで`/etc/timezone`を直接編集して、タイムゾーンを変更する方法も用意されているということです。`/etc/timezone`を使う場合は注意が必要になります。`Debian系`Linuxで、`/etc/localtime`と`/etc/timezone`の２つのファイルが混在している場合は、`/etc/localtime`で設定した内容の方が有効となり、`/etc/timezone`の方は無効となります。

同じ設定ができるファイルが、２種類存在していること自体混乱の元ですが、基本的には、`/etc/localtime`の方を使って、`/etc/timezone`は使わないと考えておいていいかと思います。そもそも、`/etc/timezone`は、詳しくは分かりませんが、特別な用途でしか使われないようです。

タイムゾーンの設定をしようとして、`/etc/localtime`のシンボリックリンクを変更する場合、`ln -s`コマンドを使って編集してもいいが、そんなことはしないで、タイムゾーンを変更するための専用コマンドが用意されています。しかも２つあります。それが、`timedatectl`コマンドと`tzselect`コマンドです。どちらを使って設定してもOKです。`tzselect`は対話的に設定できるインターフェースが用意されているコマンドであるのに対し、`timedatectl`は対話的でないコマンドとなります。

## 参考URL

https://eng-entrance.com/linux-time-timezone
【Go】Echoで特定のpathへのリクエストだけログを出力しないようにする 

# 概要
例えば、ヘルスチェックのログを出力しているとログが見にくくなるし容量を圧迫するしみたいな状況に陥るので、アプリケーション側ではヘルスチェックのログを出力させないようにする。

# 解決法

以下のようにSkipper optionを使用する。

```golang
	e := echo.New()
	e.Use(middleware.LoggerWithConfig(middleware.LoggerConfig{
		Skipper: func(c echo.Context) bool {
			return c.Path() == "/path/to/health_check"
		},
	}))
```

もちろんpath以外、例えばリクエストヘッダーなんかで出力するかどうか決めることもできる。
詳細は以下。

https://github.com/labstack/echo/blob/master/context.go

# 参考

https://echo.labstack.com/middleware/#skipping-middleware
R/Shiny でテーブルから選択、制御する方法

# はじめに
R/Shiny でインタラクティブにテーブルを操作したいという要求があった。例えばテーブルの選択したデータをプロット上で強調させたり、その数値を表示させたりしたい場合がある。これを可能にするのが`DT`パッケージと、`_rows_selected`コマンドである。

また本記事で使用したデータセットは「[Rでの性別、身長、体重、血液型データの作成方法](https://qiita.com/ryamamoto0406/items/489e00fe693b688a4a5e)」で作成したものを「[R shiny でデータの基礎分析用アプリの作成①](https://qiita.com/ryamamoto0406/items/ece1a064f85e7c0466aa)」で csv に保存したので、それを用いて行った。

# テーブルから選択した行の情報を表示する Shiny アプリケーション
`DT`パッケージの選択の制御を行うのは、`DT::renderDataTable`の`selection`オプションで制御する。`selection=list()`の中身で、`mode`で単数選択か複数選択かを選び、`target`で選択する対象（行、列、セル）を決め、`selected`で初期に選択済みの行（列、セル）を指定する。例えば`target`を行（`row`）にした場合、選択したテーブルの`id`を用いて、サーバー側で`input${id}_row_selected`で、何行目を選択しているかの情報を得ることができる。

以下、Rのサンプルコードを示す。

```R:
library(shiny)
library(DT)

df <- read.csv("data.csv")

ui <- fluidPage(
  titlePanel("DT test"),
  mainPanel(
    dataTableOutput("data"),
    br(),
    h4("選択した行："),
    verbatimTextOutput("row"),
    h4("選択した性別："),
    verbatimTextOutput("sex"),
    h4("選択した身長："),
    verbatimTextOutput("height"),
    h4("選択した体重："),
    verbatimTextOutput("weight")
  )
)

server <- function(input, output) {
  output$data <- DT::renderDataTable({
    df
  }, 
  extensions = c('Buttons'), 
  selection = list(mode = 'single', selected = c(1), target ='row'),
  options = list(dom = 'Blfrtip', buttons = c('csv', 'excel', 'pdf'), lengthMenu = c(5, 10, 20), pageLength = 5)
  )
  
  output$row <- renderText({ input$data_rows_selected })
  output$sex <- renderText({ df$SEX[input$data_rows_selected] })
  output$height <- renderText({ df$HEIGHT[input$data_rows_selected] })
  output$weight <- renderText({ df$WEIGHT[input$data_rows_selected] })
}

shinyApp(ui = ui, server = server)
```

アプリ画面は以下の様になる。

![DT_selected.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1077734/f75e392d-94f7-b160-5974-b96e3e32edab.png)

3行目が選択されていて、下部にそのデータフレームの中身が表示されているのが分かる。

# おわりに
これを応用して、プロットなどと組み合わせれば、選択した行のデータのみマークを変更するようなアプリケーションも実装可能である。`DT`パッケージはインタラクティブに使えるオプションが多数あるので、それも記事にしていけたらと思う。
自然言語をAIが認識しコードを書いてくれる機能「Power Apps Ideas」の試し方

向井です。

Microsoft Build で発表されたGTP-3を使った自然言語→Power Fxへの変換機能を試してみる方法をまとめてみます。
この機能については[Power Apps Ideas – AIが勝手にコードを書いてくれる新機能を発表](https://memo.tyoshida.me/en/power-platform/powerapps/power-apps-gpt3-automatic-coding/)で詳しく紹介されています。

2021年8月現在この機能はプレビューで米国リージョンかつ言語は英語しか対応していません。
こちらの記事はこの機能を早く試してみたい日本在住の日本人のみなさんに向けとなっています。

#①米国リージョンの環境を作成する
Power Platform 管理センターから米国リージョンの環境を作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004488/9b44515d-4ba4-f7f4-11a3-c37b07caa7b0.png)

地域で「米国」を選んでください。
環境のデータベースは作成してみました。※関係あるかは謎
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004488/42294939-2582-266b-8adf-4676d2d7de9d.png)


一応言語はEnglish、通貨はUSDにしてみました。
※関係あるかは謎
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004488/4e66f6a9-b0ac-7580-2101-cea4f5e7515b.png)

サンプルデータの作成はオンにしておいた方がすぐに機能を試せていいと思います！
※私はオフで進めてしまったため環境を作成し直しました・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004488/1b941672-20ef-008a-4a20-fd055bd21790.png)


環境が用意出来たら②に進みます。

#②ブラウザの優先言語を英語に設定する
私の使用しているMicrosoft Edgeの場合は以下の手順でできました。

設定を開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004488/a053318c-7aac-e053-f8c4-b866ad1164cc.png)

画像は既に英語になってしまっていますが、
左のメニューの言語を選択し、英語表示に切り替えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004488/71696430-da1d-cf46-62b0-0b34e31df617.png)

③Power Appsでプレビューの機能をオンにする
①で作成した環境で適当にキャンバスアプリを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004488/d6aaa64b-9700-b056-d7ce-cee2c0201de2.png)

Setting > Upcoming features > Enable Ideas panel をオンにします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004488/a4756a77-ac92-9888-ea91-63b5d33a878d.png)

これで自然言語→Power Fxへの変換機能を試すことができるようになりました！

#動作確認
ギャラリーを挿入します。
パネルにIdeasというタブが追加されていることが確認できました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004488/3d7c438c-79eb-375e-7641-a669f315bc0f.png)

環境を作成するときにサンプルデータの作成をオンにしていると、アカウントなどのデータが入っているのですぐに機能を試してみることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004488/afaca61f-7bc0-7cf1-8fa3-458cb1567cc8.png)

今回は住所がRedmondのものだけを表示させてみたいと思います。

自然言語入力中にも、関数を書く時と同じように候補が出てくれました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004488/2e2c63c8-3851-c139-b0ef-252ceca9b321.png)

Show records of Accounts 'Address 1: City' "Redmond"
と入力すると関数のアイデアが表示されました！
合ってそう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004488/5130ceff-0ea0-67b9-213d-17b5fc5b4780.png)

↑の赤枠をクリックすると、無事Redmondにある取引先企業のみが表示されるようになりました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004488/150e09ec-43b5-b4f4-7330-cb9643cf0f3b.png)


#感想
自然言語の書き方にも少し癖があって（アドレスの指定の仕方や、""でRedmondを囲うことなど）すぐにはうまくいきませんでしたが、慣れれば楽なのかなと思います。
まだ英語のみ、アイデアで出せる関数も一部のみですが、これから他の言語や他の関数にも対応していくのかなと思うので楽しみに待ってようと思います！
osを作る その3

#概要

osを作る。
os作るには、インラインアセンブラを極めないと無理。
アセンブラから、ｃの変数へアクセスの実験。

#サンプルコード

```
volatile byte c_val = 88;

void setup() {
	Serial.begin(9600);
	asm (
		"ldi 	r23, 55		\n"
		"sts 	(c_val), r23 	\n"
	);
	Serial.print("c_val = "); 
	Serial.println(c_val);
}

void loop() {

}


```

#結果

```
c_val = 55

```

以上。
kintone プラグイン開発メモ バージョンの書換え

kintone プラグインの開発で、一つのプラグイン毎に製品版、試用版等全部で４つを作成している。
バージョンを管理している manifest.json も４つあり、バージョンアップの際にまとめて書き換える処理を作ったのでメモしてきます。

# 概要

プラグインファイルで、バージョンに関係しているものが下記で、バージョンアップ時にいちいち変更が必要。たまに忘れたり、間違えたりもする。
面倒なので、shelljs の sed を使って、書き換える。

- 製品版、試用版等で、少しづつ構成が異なり、manifest.json が４つある
- package.json で、プラグインをパッケージする kintone-plugin-packer の出力先のプラグインファイル名にバージョンを付与している。

# sed とは

unix コマンドで、テキストファイルの文字列を正規表現で書き換える定番のツール。
node で使える sed を調べたら、[shelljs](https://github.com/shelljs/shelljs/blob/master/README.md) があったので試してみたところ、問題なく使えた。

# manifest.json のバージョンの書き換え

「"version": 9, 」の部分がプラグインのバージョン

```manifest.json
{
  "manifest_version": 1,
  "version": 9,
  "type": "APP",
...
}
```

shelljs で、書き換えるのは、簡単。とりあえず、"10" で書き換える例

```.js
var shell = require('shelljs');
const vno = '10';
shell.sed('-i', '(^.*"version": *)([0-9]+)', '$1'+vno, 'manifest.json');
```

- '-i': ファイルを直接書き換えるオプション
- '(^ *"version": *)([0-9]+)': 「"version": 12」の文字列にマッチする正規表現
- '$1'+vno: バージョンvno で変換する文字列
- 'manifest.json': 書き換えるファイル名
    - 各ディレクトリの manifest.json を書き換えるのは、'./*/manifest.json'
    - ディレクトリにワイルドカードで簡単指定

# バージョンをオプション指定にして、チェック
使いやすいように、バージョンチェックを入れて、実行ログ表示。
あと、package.json のファイル名変更を追加。
バージョンチェックの処理がほとんどですね。

コマンド内で他の処理と組み合わせるなら、終了時に process.exit(0); を入れて終了ステータスをセットする必要がありますが、単独で使うだけなので、そのまま終了してます。
※オプション指定のエラー時に、process.exit(1); にするといらないメッセージがいっぱいになり、かえってわかりにくい。

```pver.js
const shell = require('shelljs');
console.log('plugin version set start.');

function errMessage(pmsg) {
    const path = require('path');
    const basename = path.basename(process.argv[1]);
    console.error(pmsg);
    console.error(`Usage: node ${basename} version\n`);
}

if (process.argv.length < 3) {
    errMessage('ver option need error!\n');
    return 1;
}
const vno = process.argv[2];  // plugin version number
if (isNaN(Number(vno))) {
    errMessage('ver option:"' + vno + '" is not numeric error!\n');
    return 1;
}
console.log('plugin version set: '+vno);

shell.sed('-i', '(^ *"version": *)([0-9]+)', '$1'+vno, './*/manifest.json');
shell.sed('-i', '(-plugin)([0-9]+)', '$1'+vno, 'package.json');

console.log('plugin version set end.\n');
return 0;
```

- Usage:
    - node pver.js version

# npm コマンドで実行

```package.json
  "scripts": {
    "pver": "node scripts/pver.js",
    ...
  }
```

- Usage:
    - npm run pver version

# 実行例

```.log
> npm run pver 10 
...
plugin version set start.
plugin version set: 10
plugin version set end.
```

# vscode でのバージョン変更の確認

バージョン変更後は、vscode の変更ファイルをみると、簡単に変更ファイルと変更内容を確認できます。

![2021-08-20_10h47_57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/cb524c24-36c8-c3b6-69f0-571bcfc6ef17.png)

# 最後に

mac だと標準で sed が使えますが、Windows だとwsl などを入れる必要があります。
node でしくみを作っておけば、どのOSでもそのまま使えて便利です。
paizaテスト環境（Java編）

paiza( https://paiza.jp/ )で問題を解いていると、「自分の好きな値で試したい」となるときがありませんか？
そんな時にはpaiza.IOがあるじゃないか、と言われるかもしれませんが、自分の開発環境で作ってる場合修正の度いったりきたりで煩わしいと思います（思いました）。
そこで私は自分のローカル環境でテキストファイルを標準入力にもってきて、対象ファイル（クラス）のmainメソッドを呼び出す、簡単な処理を一つ作りました。

それがこれです↓

```java

package skillCheck;

import java.io.FileInputStream;
import java.io.InputStream;

import skillCheck.rankS.S002;

public class CallMethod {

    public static void main(String[] args) throws Exception {

        InputStream fileStream = new FileInputStream(
                        "src/skillCheck/data");
        System.setIn(fileStream);

        System.out.println("==============start==============");

        long startTime = System.currentTimeMillis();
        S002.main(null);
        long endTime = System.currentTimeMillis();

        System.out.println("===============end===============");


        System.out.println("実行時間：" +
                        (endTime - startTime) + " ms");
    }

}

```

わかる人は見たまんまなのですが、一応説明します。まんまです。
開発環境はWindows10/Eclipse2019/Java11です。

①フォルダ構成

```
test                          #プロジェクトROOT
  └─src                       #srcフォルダ
      └─skillCheck
          ├─CallMethod.java   #javaファイル
          ├─data              #データファイル（テキスト）
          └─rankS             #package（動かしたいjavaなど）
              └─S002.java
```

②ソースコード
説明する場所ほぼないですが、まぁ。

```java
import skillCheck.rankS.S002;
```

動かしたい対象をimportしてください。
対象を変える度書き換えは必要ですが、Eclipseなら実行部分の方を書き換えれば自動でやってくれると思います。

```java
        InputStream fileStream = new FileInputStream(
                        "src/skillCheck/data");
        System.setIn(fileStream);
```

一番大事なところです。
入力ファイルをInputStreamに変換して標準入力に渡しています。
System.setIn()がそれですね。

```java
        S002.main(null);
```

おまけ程度のmain呼び出しです。
System.setIn()の状態が引き継がれ、呼び出し側で参照できます。
引数は何でもいのでnullでOKです。

時間計測やその他表示は、好みで付けたり外したり編集したりして、
自分に合ったように構成するといいと思います。

実行すると下記のようにコンソールに結果が出ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605465/3e94d442-c10f-8df0-a01c-220c70d15afa.png)


以上となります。

想定出力結果を作って比較することや、それらを複数つくりまとめて動かすなどもできるでしょうが、そこまでは（自分は）いいかなと思い作成してません。

また、この他にjavascript/Python/Goで同様のテキストファイルを標準入力に指定ファイルを実行するという環境を作りました。（js/GoはVSCodeですが。）
そちらの方はまた気が向いたときに。

皆様、良きpaizaライフを。