OmniAICreator/Qiita-1.07M huggingface dataset:
CakePHPで複数DBから 同時にデータを取得するとき

いっつもいっつもいっつもx100
やり方を忘れるので、自分のためにメモ

環境：CakePHP3.8

# 前置き・やりたいこと
購入履歴テーブルと、商品テーブルが それぞれ別のDBに存在するとする
購入履歴をとってくるときに、同時に購入した商品情報もとってくる
購入履歴.item_id で、 商品.product_id のデータを取ってくる

## DBの定義 app.php
当然 2種類の Datasourcesの定義をしておく
'default'が、履歴があるDB（MySQL）
'product_db'が商品データのDB（ポスグレ）

```
    'Datasources' => [
        'default' => [
            'className' => Connection::class,
            'driver' => Mysql::class,
              :
        ],
        'product_db' => [
            'className' => Connection::class,
            'driver' => Postgres::class,
              :
```

## 購入履歴テーブル - HistoryTableClass
商品テーブルとのアソシエーションの定義を書く
紐づくテーブルのFieldが PRIMARY KEY なら'bindingKey'は指定しなくていい（…と思ったけど。それって、テーブルのPKが `Model名_id` ってなってる場合だけだっけ？？忘れた。まあ、だめだったら'bindingKey'指定すればいい） 
`'strategy' => 'select',` ←これが大事（これを指定しないと、商品テーブルに joinしてとってこようとする。同じDB内にtableが無いのでエラーになる）

```php

/**                                                        
 * Initialize method                                       
 *                                                         
 * @param array $config The configuration for the Table.   
 * @return void                                            
 */                                                        
public function initialize(array $config)                  
{                                                          
    :
    :
                                                           
    //product_db                                             
    $this->belongsTo('Product', [              
        'foreignKey' => 'item_id', ←自分のテーブルでkeyになるField                  
        'bindingKey' => 'product_id', ←joinするテーブルのkeyになるField        
         'strategy' => 'select',      
    ]);                                                    
}                                                          
```

## 商品テーブル - ProductTableClass
defaultじゃなくて、'product_db'のコネクション定義を使ってることを書いておく→ 大事

```php
/**                                                        
 * Returns the database connection name to use by default. 
 *                                                         
 * @return string                                          
 */                                                        
public static function defaultConnectionName()             
{                                                          
    return 'product_db';                                        
}  

```

追記：2020/06/04
そういえば、コネクション指定は、bakeコマンドで モデル作成すれば自動で入れてくれる `-c` オプション
> $ bin/cake bake model -c [connection_name] [Model_name]

> $ bin/cake bake model -c product_db Product

# Controllerで呼び出してみる - HistoryController

```php
$result = $this->History
  ->find()
  ->contain(['Product'])
  ->toArray();
```
取得した履歴データは ↓ こんな感じになってる
商品テーブルのデータが、配列でぶら下がってくる感じ

```php

$result（履歴） = [
  0 => [
    'id' => 1,
    'item_id' => 11001,
    'buy_date' => '2020/05/05',
    'product' => [
      'id' => 100,
      'product_id' => 11001,
      'product_name' => '梅干し',
      'price' => 398,
    ],
  ],
  1 => [],
  2 => [],
  :

];
```
外部テナントのAzure Synapse AnalyticsでPower BI連携をする方法


## はじめに

以下の記事でPower BI の利用について記載しましたが、Office 365 AADテナントとAzure 開発用のAADテナントが分かれている環境で少し詰まったので共有します。

[AzureSynapseAnalyticsのPowerBI連携を試してみる](https://qiita.com/ryoma-nagata/items/202841f72be8622d16a3)

## 再現状況

hoge.com　= Office365テナント
fuga.com = Azure Synapse Analyticsのデプロイされたテナント
A@hoge.comさん = 普段はhoge.com内で、Outlookやteamsを利用しており、開発時にfuga.comで契約したAzure環境を利用しています。
B@fuga.comさん = この作業のために使用するユーザです。

この状況で、A@hoge.comさんがPower BI Linked Serviceを作成しようとするとこのような問題が発生します。

### Linked Service 作成時にOffice 365テナントで作成されたPower BI Workspaceは表示されません

<img width="475" alt="001.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/012aa703-0145-3975-3f31-d40c37205ea4.png">



## 考察

Azure Synapse AnalyticsをデプロイしたAADテナントが普段利用するOffice365用のテナントとは異なる場合、Linked Serviceを構成できません。
これは選択対象のPower BI WorkspaceがAzure Synapse Analyticsの属するAADテナントでの検索結果からになるためと考えられます。


## 回避手順

1. Azure Synapse Analyticsをデプロイしたテナントに所属するユーザ(B@fuga.com)でPower BI Workspaceを作成します。
2. コンテンツの作成を許可したいユーザ(A@hoge.com)を招待し、権限を設定します。
3. Azure Synapse Analytics Studioから表示されるようになります。


## 参考

[Azure AD B2B で外部ゲスト ユーザーに Power BI コンテンツを配布する](https://docs.microsoft.com/ja-jp/power-bi/admin/service-admin-azure-ad-b2b)
LaravelプロジェクトからFirebaseAPIを利用する前準備

環境について
OS:AmazonLinux2

#### 1.サービスアカウントキーを作成する

GoogleCloudPlatformの認証サービス画面より
 「サービスアカウントキー」を作成する
※APIキーではない

サービスアカウント
 「firebase-adminsdk」を選択

キータイプ
   「JSON」
を選択して、作成する

#### 2.環境変数を設定する

1.で取得したJSONファイルをLaravelプロジェクトのディレクトリに配置し
環境変数(GOOGLE_APPLICATION_CREDENTIALS)にファイルパスをセットする

```
export GOOGLE_APPLICATION_CREDENTIALS="Laravelプロジェクトのディレクトリ/*****.json"
```

#### 3.gRPC For PHPのインストール

こちらのGoogleのガイドを参考にgrpcをインストール

https://cloud.google.com/php/grpc?hl=ja

```
# pecl install grpc

Build complete.
Don't forget to run 'make test'.

running: make INSTALL_ROOT="/var/tmp/pear-build-rootyXfFt6/install-grpc-1.26.0" install
Installing shared extensions:     /var/tmp/pear-build-rootyXfFt6/install-grpc-1.26.0/usr/lib64/php/modules/
running: find "/var/tmp/pear-build-rootyXfFt6/install-grpc-1.26.0" | xargs ls -dils
 9083594     0 drwxr-xr-x 3 root root       17 12月 23 20:06 /var/tmp/pear-build-rootyXfFt6/install-grpc-1.26.0
11304125     0 drwxr-xr-x 3 root root       19 12月 23 20:06 /var/tmp/pear-build-rootyXfFt6/install-grpc-1.26.0/usr
19801702     0 drwxr-xr-x 3 root root       17 12月 23 20:06 /var/tmp/pear-build-rootyXfFt6/install-grpc-1.26.0/usr/lib64
27955984     0 drwxr-xr-x 3 root root       21 12月 23 20:06 /var/tmp/pear-build-rootyXfFt6/install-grpc-1.26.0/usr/lib64/php
 3604422     0 drwxr-xr-x 2 root root       21 12月 23 20:06 /var/tmp/pear-build-rootyXfFt6/install-grpc-1.26.0/usr/lib64/php/modules
 3604421 35144 -rwxr-xr-x 1 root root 35985152 12月 23 20:06 /var/tmp/pear-build-rootyXfFt6/install-grpc-1.26.0/usr/lib64/php/modules/grpc.so

Build process completed successfully
Installing '/usr/lib64/php/modules/grpc.so'
install ok: channel://pecl.php.net/grpc-1.26.0
configuration option "php_ini" is not set to php.ini location
You should add "extension=grpc.so" to php.ini
```

PHPのgrpc拡張機能を有効にする。

```
# vi /etc/php.d/20-grpc.ini
; Enable gRPC extension module
extension=grpc.so

# systemctl restart httpd
```

#### 4.FirebaseAPIライブラリを追加

LaravelプロジェクトにFirebaseAPIライブラリを追加します。

```
#composer require "grpc/grpc:^v1.1.0"
#composer require "google/protobuf:^v3.3.0"
#composer require google/cloud-firestore
```
参考資料
https://qiita.com/nirastamo/items/391d4a002dfb2901b268
MinGW gcc cross では -fuse-ld=lld では lld は使ってくれない?  

最近の gcc(少なくとも 7.3)では `-fuse-ld=lld` のようにしてカスタムリンカを使うことができます.

ただ, mingw gcc cross(e.g. Ubuntu apt で入る mingw gcc)では, この flag は無視されて通常の bfd linker が呼ばれます.

mingw native or msys だと考慮されるかもです.

https://packages.msys2.org/package/mingw-w64-x86_64-lld?repo=mingw64

また, LLD が MinGW 環境でまともに使えるのは 8.0 からになります(2020/06/02 執筆時では 10.0 が最新)

https://stackoverflow.com/questions/54382944/unable-to-run-windows-binary-compiled-with-clang-lld-mingw

いずれ mingw パッケージにも lld が取り込まれ拡充されるでしょうか?
現状熟成待ちですかね.
(より詳細に linker を指定するオプションがあるかも?)


とりあえず LLD を使いたくて, clang コンパイラでもよければ, llvm-mingw(clang + LLD)を使うのがよさそうです.

https://github.com/mstorsjo/llvm-mingw
Excelの条件付き書式をPowershellで制御する

#はじめに
Excelの条件付き書式コピペしたときにカオスに増殖するのツライ
ファイルにマクロをつけたくない
PowerShellでやってみよう

#やりたいこと
* カオスになった条件付き書式をとりあえず一掃する(消すのすらExcelが固まる場合があるので)
* 新しい条件付き書式を追加する
* 保存

#0.前提
* PowerShellが動く環境であること
* 編集したいファイルを配置しておくこと
* 初めてするときは、一行ずつ流して挙動を確認しながらすることをおすすめします

#１.PowershellからExcelを起動
```powershell
# Excelを操作する為のComオブジェクトの宣言
$excel = New-Object -ComObject Excel.Application

# 編集したいファイルのパス(適宜置き換えてください)
$path = "C:¥Users¥test"

#Excel可視化
$Excel.Visible = $TRUE

#Excelファイル開く
$Book = $Excel.Workbooks.Open($path)

#編集するシートを指定(適宜置き換えてください)
$Sheet = $Book.worksheets.Item("シート名")
```
これで、PowerShellから対象のExcelファイルを編集できるようになりました。

#２.条件付き書式の削除
条件付き書式を消したいセルの範囲を指定してから消します。
A1からA20のセルを指定した場合は以下のように記述します。
例)Sheet.Range("A1:A20")

```powershell
#既存の条件付き書式のクリア
$Sheet.Range("消去したいセルを指定").FormatConditions.Delete()
```
ここでExcelの条件付き書式を開き、全て消えていることを確認することをおすすめします。

#3.条件付き書式の条件の追加
Powershellで追加する際はGUIの操作と異なり、条件を追加→その条件を適用させたセルのアクションの追加の２工程が必要になります。

今回は土、日、祝に一致したセルをそれぞれ指定した色に変えるという想定で書いていきます。

```powershell
#条件の追加
$Test1 = A1:A10
$Sheet.Range($Test1).FormatConditions.Add(1,3,"土")
$Sheet.Range($Test1).FormatConditions.Add(1,3,"日")
$Sheet.Range($Test1).FormatConditions.Add(1,3,"祝")
```
この時点では、色が変わるといったことはなくただ、判定条件を入れただけです。
GUIと異なり「FormatConditions」を機能を使って条件を設定します。
詳細は以下のサイトを見ていただくのがわかりやすいかと思います。

http://excel.style-mods.net/tips_vba/tips_vba_2_25.htm

(例)
FormatConditions.Add(1,3,"祝")→(セルの値,次の値に等しい,"値")


#4.条件付き書式のアクションの追加
3.で追加した条件分に対して、起こしたいアクションを追加します。
$test1のセルの範囲に対してに対して条件が3つ登録されていますので、
その登録した順にアクションを追加する必要があります。


#土日祝のセルへのアクション
```powershell
$Sheet.Range($Test1).FormatConditions(1).Interior.ColorIndex = 45 #セルの色を黄色
$Sheet.Range($Test1).FormatConditions(2).Interior.ColorIndex = 6 #セルの色を黄色
$Sheet.Range($Test1).FormatConditions(3).Interior.ColorIndex = 23 #セルの色を黄色

```

5.ファイルの保存
編集したものを保存します。
上書きの場合は、EXCEL側に上書きするかのダイアログボックスが表示されるので、よしなにクリックしてください。

```powershell
$Book.SaveAs(’保存したいファイル名のフルパス’)
```

6.EXCELを閉じる&ゴミ掃除
EXCELを閉じただけでは、バックグラウンドでプロセスが動いているのでそれらを閉じます。

```powershell
#EXCELを閉じる
$Book.Close()


#COMオブジェクトの開放
$excel.Quit()

#ごみそうじ
[void][System.Runtime.InteropServices.Marshal]::FinalReleaseComObject($Sheet)
[void][System.Runtime.InteropServices.Marshal]::FinalReleaseComObject($excel)

# プロセスを解放する
$excel = $null
[GC]::Collect()
```
#最後に
最後のゴミ掃除だけ、きっちり説明ができないのですが調べると皆さんこうされているのと
やらないとやっぱりプロセスが死ななかたのでおまじないのようにしています。
[react]任意個数のサブコンポーネントの値をuseStateで管理する方法

「データベースから取得したレコードをもとにinputを複数配置する」など
あらかじめ数が決められない可変個数のinputを配置した際に、
それぞれのinputの入力値の処理がなかなか難しかったので、備忘録を兼ねて記事を書きました。

結論から書くと
コンポーネントの入力値をまとめてJSONオブジェクトで管理するとよいです。

ポイントはsetXxxにて
```let newdata = Object.assign({}, datas)```
として常に新しいオブジェクトを生成すること。

まるっとコードを置いておきます。

```javascript
import React, { useState } from 'react'

const ArrayInput = () => {
  const [datas, setDatas] = useState({});

  const change = (e) => {
    const key   = e.target.name;
    const value = e.target.value;
    console.log(key + "/" + value);
    datas[key] = value;
    let newdata = Object.assign({}, datas); // important point!
    console.log(newdata);
    setDatas(newdata);
  }

  const inputs = ["a", "b", "c"].map((n, i) => {
    return <input key={i} name={n} value={datas[n]} onChange={change} />;
  });

  return (
    <div>
      {inputs}
    </div>
  );
}

export default ArrayInput;
```

### 参考資料(Qiita記事)

[[react]子要素に複数配置したinputのvalueを取得する)](https://qiita.com/HHFactory/items/62af6977cd60e6b5007d)

[[React]useStateで定義したstateを更新したのに再レンダーされない件(object / 配列)](https://qiita.com/morry_48/items/c2bb549df42afa15b31e)
あともう少し。MySQLサービス起動後、Railsサーバが起動しない３


###  <font color='lightblue'>発生した背景</font>
MySQLサービスが復旧したところで、Railsを起動すると以下のエラーが発生した。

```
/Users/ichikawadaisuke/projects/krown/vendor/ruby/2.5.0/gems/bootsnap-1.4.6/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:23:in `require': dlopen(/Users/ichikawadaisuke/projects/krown/vendor/ruby/2.5.0/gems/mysql2-0.5.2/lib/mysql2/mysql2.bundle, 9): Library not loaded: /usr/local/opt/mysql/lib/libmysqlclient.21.dylib (LoadError)
  Referenced from: /Users/ichikawadaisuke/projects/krown/vendor/ruby/2.5.0/gems/mysql2-0.5.2/lib/mysql2/mysql2.bundle
  Reason: image not found - /Users/ichikawadaisuke/projects/krown/vendor/ruby/2.5.0/gems/mysql2-0.5.2/lib/mysql2/mysql2.bundle
```

###  <font color='lightblue'>対応手順</font>
MySQLサービスを再インストールしたため、既存のGemが動作しなくなったと判断。
Gemの再セッティングを実施する。
①以下コマンドにて原因を多角的に調査する

```
$ bundle update
$ rails s
（これで復旧するかを試してみるも、Railsサーバは起動しなかった）
$ bundle doctor
（MySQLに紐つくような目立ったエラーは発生していない）
```

②以下のコマンドでGemを入れ替える

```
$ bundle exec gem uninstall mysql2
Successfully uninstalled mysql2-0.5.2
$ bundle install --path vendor
（同コマンドで改めてGemを入れなおす）
```

③やっと…Railsが起動した…

```
Use Ctrl-C to stop
Started GET "/" for ::1 at 2020-06-02 18:46:42 +0900
ActiveRecord::NoDatabaseError (Unknown database 'krown_development'):
```
④あとはお決まりのコマンドを実行して、無事終了しました😆

```
$ bundle exec rake db:create
$ bundle exec rake db:migrate
```
Android studioでよく使う検索ショートカット

#検索でよく使うショートカットキー

### 全体から検索する場合
|    Mac    |
|:------------------:|
|        Shift × ２回        |

クラス、ファイルなどを全体から検索できます。



### ファイル内検索する場合
|    Mac    |
|:------------------:|
|        cmd + shift + F        |

開いたファイル内で指定した単語を検索したい時に使います。

###その他の便利なショートカット

参照元URL
https://qiita.com/arai-wa/items/b0957d042c479577e8e3
vmstatの実行結果をmac版エクセルでグラフ化してみる

## はじめに
職場でシステムテストをしてくれと言われ、初めて**vmstatコマンド**を使って、サーバのCPUやらメモリやらをとったのでその時に覚えたことを備忘録的に残しておく。

## やったこと
システムテストの一環で、サーバーの性能がどれくらいなのかを見るためにvmstatを使用した。
またエクセルでログをグラフ化した。
## vmstatとは
vmstat」は仮想メモリやCPU、ディスクI/Oの統計情報を表示するコマンドです。
実行するとこんな感じでログをとってくれる。
```$vmstat
```
<img width="826" alt="スクリーンショット 2020-04-30 23.28.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520693/a03c6ed1-c30f-b1b2-4d61-dc06f905b1a5.png">
## vmstatの見方
以下引用です。引用元は[こちら](https://qiita.com/s_suzaku/items/1d4dd297c454f0483c9b
)

| 表示項目 | 説明 |
|:--|:--|
| r | 実行待ちプロセス数 |
| b | スリープ（割り込み可能）のプロセス数 |
| swpd | スワップサイズ（KB） |
| free | 空きメモリ（KB） |
| buff | バッファメモリサイズ（KB） |
| cache | キャッシュメモリサイズ（KB） |
| si | ディスクからスワップインされているメモリサイズ（KB/秒） |
| so | ディスクへスワップアウトされているメモリサイズ（KB/秒） |
| bi | ブロックデバイスから受け取ったブロック数（ブロック/秒） |
| bo | ブロックデバイスに送られたブロック数（ブロック/秒） |
| in | 割り込み回数/秒 |
| cs | コンテキストスイッチ回数/秒 |
| us | ユーザプロセスのCPU使用時間割合 |
| sy | カーネルの　　〃 |
| id | CPUがアイドル状態の時間割合 |
| wa | CPUがI/O待ちの〃 |
| st | ゲストOSがCPUを割り当てられなかった時間の割合 |

## ログをとってみる
以下をシェルスクリプトに記載してバックグラウンド実行した。
とりあえず３秒間隔で、ログをとる様に設定。コマンドの意味は後日追加する

```:shell
vmstat 3 | awk '{ print strftime("%Y/%m/%d %H:%M:%S"), $0 } {system("")}' >> $(date +%Y%m%d)_load_test_vm1.log
```

## 取得したログをグラフ化する
**手順**
- 取得したログをCSV形式に変換
- excelでグラフ化

### 取得したログをCSV形式に変換
エクセルを使って簡単に作れます。
１.見づらいですが、データがA列に入っているので選択
<img width="375" alt="スクリーンショット 2020-05-01 8.46.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520693/52d7b532-cbec-5bb7-9631-e95671d213dd.png">

2.データテブを選択し、区切り位置のタブを選択
<img width="575" alt="スクリーンショット 2020-05-01 8.58.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520693/159a22b0-0f20-9519-9681-f79d77618f35.png">

３.フィールドの区切り文字をスペースに変更する。
<img width="587" alt="スクリーンショット 2020-05-01 8.58.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520693/5dd1c973-27a7-6f38-de9e-52e44dc5e7ad.png">
4.ファイルの保存をする際に、CSV形式を選択し保存

### エクセルでグラフ化
1.CSV形式のデータを範囲選択
![スクリーンショット 2020-05-07 6.49.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520693/90e9d013-3cac-517d-474c-3fbcf2cbf107.png)

２.グラフ作成ボタンの押下
挿入タブの、グラフボタンを押下して作成したいグラフの形式を選択
![スクリーンショット 2020-05-07 6.50.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520693/9e885d90-2a09-af2b-a8cc-5bb68b2d074e.png)

3.グラフの軸を決定
横の軸、縦の軸を範囲選択する
![スクリーンショット 2020-05-07 6.55.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520693/394cf21f-d8de-c612-b91a-f4b6d0c22223.png)


作成した**結果**
![スクリーンショット 2020-05-07 6.40.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520693/cd1eb27c-66aa-751a-3b4a-9c2af80d6cc5.png)




## 参考資料
https://qiita.com/s_suzaku/items/1d4dd297c454f0483c9b
【Swift】UIRefreshControlを使ってTableViewを下に引っ張ったときに読み込まれるやつを作りたい

# TableViewを下に引っ張ったときに読み込まれるやつ
twitterとかにあるやつのこと！
tableviewを下に引っ張るとクルクルが出てきて再度読み込まれるっていうアレです
<img width="375" alt="IMG_1544F97FE10F-1.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540178/4a3b70b2-44ed-8039-5a5a-5f9b8435dd21.jpeg">

qiitaとかネットでいろいろ調べたんだけど、それだとちゃんと動かなかったのでここに書いときます
この記事ではTableViewで使う時のことを書きますが、iOS10からスクロールするViewならなんでもつけることができるようになったみたいです！
## TableViewにUIRefreshControlを追加して、AddTargetする
```swift
tableView.refreshControl = UIRefreshControl()
tableView.refreshControl?.addTarget(self, action: #selector(refresh), for: .valueChanged)
```
これでもうTableViewにくるくるが追加されました
## くるくるした時の処理を書く
```swift
@objc func refresh() {
    /*
        ここに処理を書く
    */
    tableView.refreshControl?.endRefreshing()    //これを呼び出すとくるくるが止まる
}
```
refreshControl.endRefreshing()を呼んであげないと、永遠にくるくるし続けるので注意！
呼び出すタイミングは処理が終わったタイミングがいいですね！

```
DispatchQueue
```

とか

```
Timer.scheduledTimer
```

とかを使ってあげるのがいいと思う

# よきくるくるライフを！
結構簡単に実装できて嬉しいですね！

# 環境
Xcode 11.5

# 参考
https://developer.apple.com/documentation/uikit/uirefreshcontrol
Wordpress エラーの解決方法　「HTTPのリダイレクトステータスは 3xx のリダイレクトコードでなければいけません。」

Wordpressの管理画面にアクセスしたら以下のようなエラーが。

>HTTPのリダイレクトステータスは 3xx のリダイレクトコードでなければいけません。

原因となっていたのは「Slimstat Analytics」。

プラグイン削除して解決。
HTML基本構造



##HTMLの基本構造を解説します。
基本的には以下のような構造になっているはずです。

```html:sample.html
<!DOCTYPE html>
<html lang="ja">
    <head>
        <meta charset="UTF-8">
        <title>HTML基本構造</title>
    </head>
    <body>
        文章の内容
    </body>
</html>
```

##<!DOCTYPE html>


<!DOCTYPE html>は、文書がHTML5で作成されたものであることを宣言しています。これは要素ではありません。

##html要素
HTML文書のルートを表します。全ての要素はhtml要素の中に記述します。

lang属性は要素内で使用されている言語(英語、日本語など)を指定します。
「ja」は日本語を意味する値で、html要素内で使われている言語が日本語という意味になります。
ちなみに英語なら「en」ドイツ語なら「de」というように何語かによって決められています。

##head要素

HTML文書自体の情報(ヘッダ)を表し、html要素の最初の要素として使用します。

例えば、head要素の中にtitle要素を記述することで、HTML文章のタイトルを設定できます。その他にmeta要素などをヘッダ情報として記述でき、詳細は後述いたします。

##meta要素
文章に関する情報(メタデータ)を表します。メタデータとは「情報についての情報」で、例えば文章のタイトルもメタデータの1つです。

meta要素を理解するには様々な知識が必要であり、おそらく現時点では理解が難しいと思いますので、<meta charset="UTF-8">はHTML文章に必要なおまじないぐらいに、現時点では覚えておいてください。

##title要素
HTML文書の表題を表します。head要素の中でしか使用できず、HTML文書の中に1つしか入れてはいけません。

title要素の内容は、ブラウザのタイトルバーに表示されます。

##body要素
文章の内容を記述する領域を表します。body要素の中は、見出し・段落・ハイパーリンクなど、文章の中身を記述します。

##HTMLの基本構造まとめ

**DOCTYPE宣言**
HTMLのバージョン情報を宣言する。

**html要素**
HTML文書のルートを表す。全ての要素はhtml要素の中に記述する。

**head要素**
HTML文書自体の情報(ヘッダ)を表す。html要素の最初の要素として記述する。

**meta要素**
文章に関する情報(メタデータ)を表す。

**title要素**
HTML文書の表題を表す。ブラウザのタイトルバーに要素の内容が表示される。

**body要素**
文章の内容を記述する領域を表す。
has_oneについてメモ

#has_oneとbelongs_toの関係について

一対一の関係において外部キーを記述する方にはbelongs_toを用い、
外部キーを置かない方にはhas_oneとして関係性を構築する。

```ruby:user.rb
has_one :destination
```

```ruby:destinaton.rb
belongs_to :user
```
Githubのプルリクコメントでよく使うものメモ

#プルリクの概要にチェックボックスをつける
```
- [x] タイトル
```

これで✅マークが付けられる
xはバツではなくエックスを入れる

#スクショをいい感じにbefore&afterで横並びにする方法


```
## Title
before | after
---- | ----
<img src="スクショドラッグ" width="320"/> | <img src="スクショドラッグ" width="320"/>
```

 **【注意点】** 
画像をドラッグして入れると勝手にURL生成が始まり、マークダウンのタグが入ってしまうのでURL以外は削除すること
HerokuにBugsnagを導入

Heroku × Railsです。

## アドオンを追加→APIキーを取得
ダッシュボードから操作する方法と、コマンドラインから操作する方法があります。
### ダッシュボードから操作する場合
- Herokuのダッシュボードにアクセス
- Resourcesタブを開く
- Add-onsの下の検索窓に'Bugsnag'と入力
- Provisionをクリック
- Settingsタブを開く
- Reveal Config Varsをクリックし、BugsnagのAPIキーを確認する

### コマンドラインから操作
Heroku CLIがインストールされている状態で以下のコマンドを叩く

```zsh
$ heroku addons:create bugsnag
$ heroku config:get BUGSNAG_API_KEY
70d9b0852a968b1d0d0e329b5507f287 #APIキー
```

## アプリケーション側の設定
```rb:Gemfile
gem 'bugsnag'
```
```zsh
$ bundle install
$ rails generate bugsnag 70d9b0852a968b1d0d0e329b5507f287 # APIキー
```
`config/initializers/bugsnag.rb`が生成される。デフォルトではAPIキーがベタ書きされているので、環境変数にしまう。`dotenv`というgemを使って以下のように記述しました。

```config/initializers/bugsnag.rb
Bugsnag.configure do |config|
  config.api_key = ENV['BUGSNAG_API_KEY'] #修正
end
```
production環境でのみ動くように修正

```config/initializers/bugsnag.rb
Bugsnag.configure do |config|
  config.api_key = ENV['BUGSNAG_API_KEY']
  config.notify_release_stages = ['production'] #追加
end
```

## その他
`raise`等を使って自分で発生させている例外を捕捉したい場合、`Bugsnag.notify(exception)`を使う。

```rb
begin
  raise 'Something went wrong!'
rescue => exception
  Bugsnag.notify(exception)
end
```


## 参考
- [Bugsnag docs > Platforms > Ruby > Rails](https://docs.bugsnag.com/platforms/ruby/rails/)
- [Bugsnag | Heroku Dev Center](https://devcenter.heroku.com/articles/bugsnag)
- [Rails版 bugsnagの飼い方 - Qiita](https://qiita.com/luigiii/items/68ea928331d7dec5a35f)
マインドマップを使ったフロントエンドの設計

# はじめに

フロントエンドアプリケーションを実装するとき、みなさんは設計していますか？
ワイヤーフレームがあって、それを見ながらいきなり実装していませんか？
チーム開発する上では、やはり設計書があった方がいいですよね？
この記事は、マインドマップを使ってフロントエンドアプリケーションを設計するための方法を書いたものになります。

マインドマップは [MindMup 2](https://drive.mindmup.com/) という無料で使えるツールを使っていきます。

# ページ一覧

まず、フロントエンドアプリケーションを実装する上で、1番大きな単位となるページから設計を説明します。

ワイヤーフレームでは URL に関しての情報を含んでいないことが多いと思います。
それは、クエリパラメータなど実装に関わってくる情報があるからではないでしょうか？

マインドマップは、階層構造を表すことが得意なので、 階層構造を持つ URL を表すことができます。

Qiita のページ一覧を部分的にですが、マインドマップで表してみました。

<img width="908" alt="スクリーンショット 2020-06-02 18.13.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244226/82a252aa-9d4d-70e7-ef6a-1b928fccc56d.png">

図より、URLの構造が明らかなのが分かると思います。
記事は「/ユーザー名/アイテム/記事」という URL の階層で成り立っていることが分かると思います。
また、アカウントは「/設定/アカウント」という URL の階層で成り立っていることが分かります。

ただ、マインドマップは、複雑な画面遷移を表すことは向いていません。
ですが、画面遷移は、ワイヤーフレームの段階で決まってくることが多いのではないでしょうか？

ワイヤーフレームでは画面遷移以外の情報も含んでいるので、見づらいことがあるかもしれません。
その場合は、 [Draw.io](https://app.diagrams.net/) などで画面遷移図を作成するとよいかもしれませんね。

# コンポーネント一覧

コンポーネント一覧は、コンポーネント設計にあたる部分です。
再利用できそうなパーツや、役割が明確なパーツは、コンポーネントとして切り出すことが多いと思います。

Qiita のトップページのコンポーネントを部分的にですが、マインドマップで表してみました。

<img width="877" alt="スクリーンショット 2020-06-02 18.28.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244226/0d19ad4f-844f-ca86-28b5-aeb4d380cdd4.png">

前述した通り、マインドマップは階層構造を表すことが得意です。
図の階層構造より、コンポーネントの依存関係が明らかだと思います。

# 状態管理

執筆中です。
初心者向けRailsでブログを作ってみるチュートリアルその1

# これはなに？
[初心者向けRailsでブログを作ってみるチュートリアルその0](https://qiita.com/zako-pro/items/f03de3b0f463cc5b7ea3) の続きです。

今回はブログサービスを作ります。
では、ブログサービスの機能を分解して考えてみましょう
実際のブログサービスにはいくつか機能がありますが、今回はブログサービスと呼ぶために必要なミニマムの機能を開発しましょう。

# 機能一覧

## 訪問者用機能
- 記事閲覧機能
- コメント機能

## 管理機能
- 管理者ログイン機能
- 記事投稿機能

この中で、次のステップから最初に最低限ブログらしいものに必要な「記事閲覧機能」を作っていこうと思います。

# サイトマップ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645608/55585e0c-6866-9307-d440-c360a43b8290.png)

# ワイヤーフレーム
今回は最初に作る記事閲覧機能に含まれる2画面についてのワイヤーフレームを draw.io で作ってみました。
今回は、全体の機能がコンパクトなためワイヤーフレームと次回以降でやるモデリングにとどめて細かい仕様設計などはしません(実際開発者が1-3名程度のスタートアップや新規事業だともっと大雑把なワイヤーフレームしかない状態で進めてもまあまあうまくいったりします)

## 記事一覧画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645608/2a669df1-b436-c5f7-ba3d-b8e82bc4efe8.png)

## 記事詳細画面

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645608/4ae09558-386d-5f02-2918-5ea18e645cf9.png)

完成版にはコメント機能をつけますが、最初の時点では省略します

# チュートリアルその1まとめ
今回は、開発に移る前の設計の初期段階として何を作るのか、というところを大まかに定義しました。
次回はプロジェクトのセットアップを行います。
docker registoryアクセス時にhttp: server gave HTTP response to HTTPS clientエラーが出た場合の対策方法

docker registoryアクセス時にエラー

```
Error response from daemon: Get http myreg.example.com:5000 http: server gave HTTP response to HTTPS client
```

Dockerデーモンの設定が足りていないので、
dockerの--insecure-registryに追記して設定を変更

```/etc/systemd/system/docker.service.d/docker.conf
[Service]
ExecStart=
ExecStart=/usr/bin/docker daemon -H fd:// --insecure-registry=myreg.example.com:5000
```

その後、Dockerデーモンを再起動して解決

```
sudo systemctl daemon-reload
sudo systemctl restart docker 
```

# 参考
[systemd と Docker の管理・設定](http://docs.docker.jp/engine/articles/systemd.html)
[[SOLVED] ERROR: Error response from daemon: Get https://myregistry:5000: http: server gave HTTP response to HTTPS client](https://www.yuribacciarini.com/solved-error-error-response-from-daemon-get-https-myregistry-5000-http-server-gave-http-response-to-https-client/)
[Dockerの設定ファイルはどこ！！](https://qiita.com/haniokasai/items/c61d4102d41501db424b)
[最近のUbuntu（15.04以降）でDockerの--insecure-registryの設定](https://qiita.com/kichiki/items/c09eb74d5e2e5764d8dc)
[「server gave HTTP response to HTTPS client」と言われてDocker Private registoryのpushやpullができなかったときの対処](https://qiita.com/nkmry/items/e2ce67dd66be1f347b67)
[プライベートDocker-Registryにhttpで接続 [Docker-ce Linux]](https://qiita.com/Ikumi/items/cf5f813764810f81d5ff)
【Golang】ゴルーチン④range,close

#【Golang】ゴルーチン④range,close
Golangの基礎学習〜Webアプリケーション作成までの学習を終えたので、復習を兼ねてまとめていく。 基礎〜応用まで。

```
package main

//channelのrangeとclose
//結果を随時出力

import (
	"fmt"
)

func goroutin2(s []int, c chan int) {
	sum := 0
	for _, v := range s {
		//全部足す
		sum += v
		//すぐに送る
		c <- sum
	}
	//終わったらchannelを閉じる
	//これ以上ない時は閉じる
	//閉じないと、中身以上取り出そうとしエラーになる
	close(c)
}

func main() {
	s := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
	//実質1つしか入らないので、バッファは１でもいい
	c := make(chan int, len(s))

	goroutin2(s, c)

	//go goroutine1(s, c)の結果をforで回す
	//channelの場合、インデックスは無く、値を出力
	//並列処理なので、値が入る度に出力される
	//回数分i変数に入力
	for i := range c {
		fmt.Println(i)
	}

	//中は０になる
	fmt.Println(len(c))

	/*
		1
		3
		6
		10
		15
		21
		28
		36
		45
		55
		0
	*/
}

/*
別パターンが本にはある。スターティングGo言語　P191~P192
*/

```
ターミナルでよく使うコマンド集(Rails編)


#バージョンを確認するコマンド
```:ターミナル
#Rubyのバージョンを確認するコマンド
ruby --version

#Railsのバージョンを確認するコマンド
rails --version

#RubyGemsのバージョンを確認するコマンド
gem -v
```

#rails関連で使うコマンド

```:ターミナル
#railsのサーバの起動
rails s

#railsサーバの終了
control + C

#コントローラの作成
rails g controller name[option]

#railsアプリの作成
rails new アプリケーション名

#DBとmodelの作成
rails g model テーブル名 カラム：データ型 カラム：データ型

#railsに直接値を代入したり操作する際に使用
rails console

#railsコンソールの起動
rails c

#railsコンソールの終了
exit
```

#bundle関連
```:ターミナル
#gemfileを元にgemのinstallを行う
bundle install

#gemのバージョンアップ
bundle update
```
MacでLaravel開発環境構築

##概要
- [Homebrew](https://brew.sh/index_ja)の導入
- [Composer](https://getcomposer.org/)の導入
    - 上記のパッケージ管理システムを利用してPHP＆Laravelのインストール

##環境
macOS Mojave 10.14.6

##Homebrewのインストール
[Homebrew](https://brew.sh/index_ja)とはパッケージのインストールやアンインストールを簡単に行うことのできるパッケージ管理システムのひとつです。

[Homebrew](https://brew.sh/index_ja)ページに移動し、インストールコマンドをターミナルで実行します。

![スクリーンショット.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565827/06ccb0ef-58bd-ba17-80d4-0f0b561123fc.png)


```sh
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
```

インストールできたか確認

```sh
$ brew -v
Homebrew 2.2.15
Homebrew/homebrew-core (git revision 5385; last commit 2020-05-05)
```

##HomebrewでPHPをインストールする
以下のコマンドでインストールするPHPパッケージを確認する。

```sh
$ brew search php
==> Formulae
brew-php-switcher  php-code-sniffer   php@7.2 ✔          phplint            phpmyadmin         phpunit
php                php-cs-fixer       php@7.3 ✔          phpmd              phpstan
==> Casks
homebrew/cask/eclipse-php 
```

導入したいバージョンのPHPをインストールする。

```sh
$ brew install php@7.3
```

インストールできたか確認

```sh
$ php -v
```

##Composerをインストールする
[Composer](https://getcomposer.org/)とは、PHP向けのパッケージ管理システムです。

Homebrewでインストールする

```sh
$ brew install composer
```

インストールできたか確認

```sh
$ composer -V
```

##※直接Composerをインストールする方法

Homebrewを利用せず[こちら](https://getcomposer.org/download/)でComposerファイルを直接ダウンロードして配置する方法もあります。
![スクリーンショット 2020-06-02 17.20.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565827/e3a01a09-479a-91dd-46c0-cdaaaa0e0d6c.png)

ここから、最新バージョンのリンクをクリックしてください。
composer.pharというファイルがダウンロードフォルダにダウンロードされます。
続いて以下のコマンドを実行します。

```sh
$ cd ~/Download/
$ sudo mv composer.phar /usr/local/bin/composer
```
これでいつでもcomposerが呼び出せるようになりました。

配置したcomposerのパーミッション（アクセス権）を変更します。

```sh
$ chmod a+x /usr/local/bin/composer
```
これでcomposerが実行できるようになりました。

Homebrewでインストールした時と同様に、
「composer -V」
で正常にインストールできているか確認しましょう。

##Laravelのインストール
Composerを用いてLaravelをインストールします。

```sh
#Laravelインストール
$ composer global require "laravel/installer"
```

環境変数PATHの設定

```sh
$ echo "export PATH=~/.composer/vendor/bin:$PATH" >> ~/.bash_profile source ~/.bash_profile
```

laravelのバージョン確認

```sh
$ php artisan -V
```

以上で、Laravel開発環境の構築は終了です。
お疲れ様でした。
MAC よく使うショートカット一覧(随時更新)


```
#アプリの切り替え
Command + Tab

#ウィンドウズの最小
option+com+M

#ウィンドウの最大化
com+control+F

#検索窓
command + スペース

#アプリの終了
com+Q

#ウィンドウズを閉じる
com+W

#新しいフォルダを作る
shift+N

```
macOSをバージョンアップしたらrails s出来なくなった

#問題

①　macOS Catalina のバージョンを10.15.4にアップデートする

②　現在制作途中のアプリケーションのディレクトリにてrails sする

③　以下のようなエラーが出る

```terminal
Could not find a JavaScript runtime. See https://github.com/rails/execjs for a list of available runtimes. (ExecJS::RuntimeUnavailable)
```

#解決

https://nodejs.org/ja/download/current/

上記のサイトにて、最新版のNode.jsをインストールするか

ターミナルで、homebrewを用いてインストールを行う

```terminal
% brew install nodejs　　　　　
```

すると、無事rails sでローカルサーバーを起動できた。
Rspecでwebmockを使う

## 概要
外部APIなどにアクセスする機能をテストする際に、APIレスポンスのMockを定義できるgem。

## Gemfileにwebmockを追加

```rb
group :test do
  gem 'webmock'
end
```

```shell-session
$ bundle install --path vendor/bundle
```

## テスト対象のmodel

```rb:model/sample.rb
require 'net/https'
require 'uri'

class Sample
  include ActiveModel::Model

  def request_api(api_url, params)
    uri = URI(api_url)
    uri.query = params
    request(uri)
  end
end
```

## rspecを作る
前述のrequest_apiメソッドを実行すると、WebMockで定義したstubの内容が返る。

```rb
require 'rails_helper'
require 'webmock/rspec'

RSpec.describe Sample, type: :model do
  describe 'request_api', type: :request_api do
    before do
      WebMock.enable!
      WebMock.stub_request(:any, "www.example.com").to_return(
        body: "This is a mock",
        status: 200,
        headers: { 'Content-Length' => 7 }
      )
    end
    subject { Sample.new }
    it 'returns body' do
      res = subject.send(:request_api, 'http://www.example.com', '')
      expect(res.body).to eq('This is a mock')
    end
  end
end
```

## 参考
- [Rails開発でWebMockを使ってAPIアクセスをスタブ化する](https://dev.classmethod.jp/articles/rails-development-with-webmock/)
BOOTH から出力された csv ファイルをクリックポスト用に変換するプログラム作った

# きっかけ

BOOTH の csv をクリックポスト用に変換するの面倒だなーと思ったので

# プログラム

ソースコードと exe ファイルはここに置いてあります
https://github.com/koktoh/booth_csv_converter

.Net Core 3.1 で作ってるので、マルチプラットフォームで動くはず（未検証）

# 使い方

BOOTH から出力した csv を `Source Path` にドラッグ&ドロップして `Run` をポチるだけ

# 雑記

* 無駄に拡張性を意識したクラス構成 ~~（KISSの原則？ なにそれ美味しいの？）~~
* [CsvHelper][ch] は偉大
* [GongSolutions.WPF.DragDrop][gwd] 便利

[GongSolutions.WPF.DragDrop][gwd] についてはこちらを参考にさせていただきました
ありがとうございます:pray:

https://qiita.com/tomboyboy/items/cf58a1d5cbe6cd5b3155

無駄に拡張性を意識しているので、他に変換先追加したいなと思ったら追加するかもしれないし、しないかもしれません
また、リクエストがあったら対応するかもしれません

[ch]:https://github.com/JoshClose/CsvHelper
[gwd]:https://github.com/punker76/gong-wpf-dragdrop
WordPressで今までプラグインで解決してきたことを、block editorでもしたい

## 管理画面でカテゴリーやカスタムタクソノミーを必須にする
### [WP Required Taxonomies – Categories and Tags Mandatory – WordPress plugin \| WordPress\.org](https://wordpress.org/plugins/required-taxonomies/)
- 管理画面から設置可能
- 投稿タイプごとに個別の設定ができなさそう

### [Require Post Category – WordPress plugin \| WordPress\.org](https://wordpress.org/plugins/require-post-category/)
- カスタムタクソノミーの場合は、functions.phpにフィルターフックを記述する必要があるがちゃんと動いた
- 日本語化はされていないが、フィルターフックにメッセージを書けるので翻訳までする必要もあんまりない
- 投稿タイプごとに個別の設定ができる

## 管理画面でカテゴリーやカスタムタクソノミーを択一にする
### [Radio Buttons for Taxonomies – WordPress プラグイン \| WordPress\.org 日本語](https://ja.wordpress.org/plugins/radio-buttons-for-taxonomies/)
- 見た目もラジオにできる
- 管理画面から設定化
設定したフォントが実機で変わってしまう

#現象
XibでSystemフォントを設定しているのに、
実機で動かすと別のフォントで表示されている。
そんなこと変えた覚えないんだが…

#環境
Xcode 11.5
Objective-C
iOS 13.5

#調査
フォントが変わってしまっているのは、
UITextViewを使っている所だった。

#対応
フォントが変わっていないUITextViewもあったので違いを確認したら、
コード上でフォントサイズを指定していたので、
フォントが変わってしまった所も指定する様に変更したらSystemフォントで表示された！！

修正例：```textView.font = [UIFont systemFontOfSize:16]```


#あとがき
よくよく調べてみとiOS13のバグらしい…
今回は簡単に自己解決出来たから良かったけど、
こっそり変わってるから半年ほど気づかなかったよ…
WSL2でpipenv installができないときのメモ

# 概要
- WSL2でPythonを使っている
- WindowsではPythonを使っていない
- pipenvがうまく動かない


# 詳細
WSL2でpipenv installをつかうと以下の様なエラーがでた。

```
~/d/jupyter ❯❯❯ pipenv install 
['Traceback (most recent call last):\n', '  File "/home/xxxx/.pyenv/versions/3.8.1/lib/python3.8/site-packages/pipenv/vendor/vistir/misc.py", line 159, in _create_subprocess\n    c = _spawn_subprocess(cmd, env=env, block=block, cwd=cwd,\n', '  File "/home/xxxx/.pyenv/versions/3.8.1/lib/python3.8/site-packages/pipenv/vendor/vistir/misc.py", line 134, in _spawn_subprocess\n    return subprocess.Popen(cmd, **options)\n', '  File "/home/xxxx/.pyenv/versions/3.8.1/lib/python3.8/subprocess.py", line 854, in __init__\n    self._execute_child(args, executable, preexec_fn, close_fds,\n', '  File "/home/xxxx/.pyenv/versions/3.8.1/lib/python3.8/subprocess.py", line 1702, in _execute_child\n    raise child_exception_type(errno_num, err_msg, err_filename)\n', "OSError: [Errno 8] Exec format error: '/c/Users/xxxx/AppData/Local/Microsoft/WindowsApps/python.exe'\n", '\nDuring handling of the above exception, another exception occurred:\n\n', 'Traceback (most recent call last):\n', '  File "/home/xxxx/.pyenv/versions/3.8.1/lib/python3.8/site-packages/pipenv/vendor/vistir/contextmanagers.py", line 150, in spinner\n    yield _spinner\n', '  File "/home/xxxx/.pyenv/versions/3.8.1/lib/python3.8/site-packages/pipenv/vendor/vistir/misc.py", line 304, in run\n    return _create_subprocess(\n', '  File "/home/xxxx/.pyenv/versions/3.8.1/lib/python3.8/site-packages/pipenv/vendor/vistir/misc.py", line 162, in _create_subprocess\n    sys.stderr.write("Error %s while executing command %s", exc, " ".join(cmd._parts))\n', 'TypeError: write() takes exactly one argument (3 given)\n']
Traceback (most recent call last):
  File "/home/xxxx/.pyenv/versions/3.8.1/lib/python3.8/site-packages/pipenv/vendor/vistir/misc.py", line 159, in _create_subprocess
    c = _spawn_subprocess(cmd, env=env, block=block, cwd=cwd,
  File "/home/xxxx/.pyenv/versions/3.8.1/lib/python3.8/site-packages/pipenv/vendor/vistir/misc.py", line 134, in _spawn_subprocess
    return subprocess.Popen(cmd, **options)
  File "/home/xxxx/.pyenv/versions/3.8.1/lib/python3.8/subprocess.py", line 854, in __init__
    self._execute_child(args, executable, preexec_fn, close_fds,
  File "/home/xxxx/.pyenv/versions/3.8.1/lib/python3.8/subprocess.py", line 1702, in _execute_child
    raise child_exception_type(errno_num, err_msg, err_filename)
OSError: [Errno 8] Exec format error: '/c/Users/xxxx/AppData/Local/Microsoft/WindowsApps/python.exe'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
```

Windows側にPythonを入れていないのにPythonのパスがある。
これはWindowsStore用のPythonリンクに繋がっている。

どうもWSL内からコマンドを叩いてもWindows側のコマンドが優先される様子。

# 対応方法
python.exeを削除する。
しかしエクスプローラーからだとエラーが出て削除できないので、管理者権限のプロンプトから削除を行う。

```cmd:管理者権限cmd
cd C:\Users\xxxx\AppData\Local\Microsoft\WindowsApps
del python.exe
del python3.exe
```

# 参考

[https://github.com/pypa/pipenv/issues/3488](https://github.com/pypa/pipenv/issues/3488)
【AWS SAP】Amazon Kinesis StreamsとAmazon Kinesis Firehoseの違い【頻出】

##AWS SAP取得に向けて勉強する中で覚えてよかったもの 第2弾
以下用語の違いについては押さえておいて損はありません。

・Amazon Kinesis Data Streams (KDS)
・Amazon Kinesis Data Firehose

##Amazon Kinesis Data Streamsとは
（公式サイトより引用）
>Amazon Kinesis Data Streams (KDS) は、大規模にスケーラブルで持続的なリアルタイムのデータストリーミングサービスです。KDS はウエブサイトクリックストリームやデータべースイベントストリームや金融取引、ソーシャルメディアフィード、ITロゴ、ロケーション追跡イベントなど何十万ものソースから毎秒ギガバイトのデータを継続してキャプチャできます。収集データはミリ秒で入手でき、リアルタイム分析をリアルタイムダッシュボードやリアルタイム異常検知、ダイナミックな価格設定などの事例に利用可能です。

#Amazon Kinesis Data Firehoseとは
（公式サイトにより引用）
>Amazon Kinesis Data Firehose は、ストリーミングデータをデータレイクやデータストア、分析ツールに確実にロードする最も簡単な方法です。ストリーミングデータをキャプチャして変換し、Amazon S3、Amazon Redshift、Amazon Elasticsearch Service、Splunk にロードして、現在お使いのビジネスインテリジェンスツールやダッシュボードでほぼリアルタイムに分析できます。完全マネージド型サービスのため、データスループットに応じて自動的にスケールされ、継続的な管理は不要です。ロード前にデータのバッチ処理、圧縮、変換、暗号化が行われるため、送信先でのストレージ量を最小化し、セキュリティを強化できます。

##Amazon Kinesis StreamsとAmazon Kinesis Firehoseの違い
どちらも大量のデータを高速に別のサービスに転送するためのサービス。
違いについては、以下サイトがとても分かりやすかったです。
https://dev.classmethod.jp/articles/difference-between-kinesis-streams-and-kinesis-firehose/
シェルスクリプトでファイルの中身を順に取得

[1.やりたいこと](#やりたいこと)
[2.コード紹介](#コード紹介)
[3.実行例](#実行例)

#やりたいこと
ファイルの中身を取得して上から順番に処理していきます。
本記事ではファイル内の名前データ(name.txt)の中身を上から取得して、通し番号をつけてcsv(name.csv)に変換するループ文のシェルスクリプトを紹介します。

#コード紹介
**現在のフォルダの状況**

```bash:実行前の状態
$ cat name.txt
Taro Suzuki
Jiro Suzuki
Noriko Yamada
Junko Nishida
```

```shell:main.sh
#!/bin/sh
cnt=1

cat name.txt | while read data
do
	echo ${cnt},${data} >> name.csv
	#cnt変数のインクリメント
	cnt=`expr ${cnt} + 1`
done
```

#実行例
```bash:main.shの実行
sh main.sh
```

```bash:実行後の状況
$ cat name.csv
1,Taro Suzuki
2,Jiro Suzuki
3,Noriko Yamada
4,Junko Nishida
```
Androidの実機テストで、AdMobの広告が表示されない

# 事象

AdMobを利用していて、Googleの用意するテスト用の広告ユニットIDでビルドすると表示される。
なのに本番用では表示されない…

~~~
I/Ads: Ad failed to load : 3
（中略）
I/Ads: Use RequestConfiguration.Builder().setTestDeviceIds(Arrays.asList("XXXXXXXXX") to get test ads on this device.
~~~

といったエラーがでる…

# 解決方法
エラーメッセージにある通りですが、

~~~
RequestConfiguration.Builder().setTestDeviceIds
~~~

をアプリコード中に記述します。
というか、AdMobのドキュメントにも書いてあります……
https://developers.google.com/admob/android/test-ads?hl=ja#add_your_test_device

どこにこのコードを書くべきか？というところですが、広告表示前に一度呼び出されれば良いようなので、メインのビューに書いておけばよいかと思います。
LambdaからEC2を起動しようとしてハマった話

AWS公式ページにこちらの手順に従って、LambdaからEC2を停止＆起動させようとしたところ、停止はできるが起動はなぜかうまくいかない。。。

[Lambda を使用して、Amazon EC2 インスタンスを一定の間隔で停止および起動するにはどうすればよいですか?](https://aws.amazon.com/jp/premiumsupport/knowledge-center/start-stop-lambda-cloudwatch/)

色々試したり、サポートに問い合わせしたりした結果、原因が判明。

KMS関連の権限が不足していたためでした。
起動しようとしていたEC2にアタッチされているEBSがKMSで暗号化されていたため、kms:CreateGrant 権限が必要だったようです。。。
R.swiftのスクリプトが意外に遅かったので使用箇所を1モジュールにすることでビルド速度改善

# 概要

R.swiftを複数のモジュールで使用していたのですが、差分ビルドの遅い箇所を分析するとR.swiftの毎回走るコード生成のスクリプトがリソースの量に関わらず

**1箇所毎8秒程**  ※差分ビルド・フルビルド関係なく 

掛かっていて、何も修正していなくてもビルドする度に時間が掛かっていたのをリソースを1つのモジュールにまとめて、R.swiftのスクリプト実行を1回にすることでビルド速度改善しました。 

26秒(3箇所) -> 9秒(1箇所) (-17秒)

【R.swift】
https://github.com/mac-cain13/R.swift

# 環境

* R.swiftバージョン:5.1.0
* Xcode 11.x
* iMac (Quad-Core Intel Core i7 4.2 GHz, メモリ32 GB)

# 実施した施策

R.swiftを使用するリソースを1つの共通モジュールに集めそこでR.swiftを使用する

 他のモジュールでも使用する場合は　[こちら](https://github.com/mac-cain13/R.swift/blob/master/Documentation/QandA.md#can-i-use-rswift-in-a-library) のように ```--accessLevel public``` をスクリプトに付けることで ```public``` でアクセスできます。
【AWS SAP】AWS KMS と CloudHSMの違い【頻出】

##AWS SAP取得に向けて勉強する中で覚えてよかったもの
以下用語の違いについては押さえておいて損はありません。

・AWS KMS
・CloudHSM



##AWS KMSとは
AWS Key Management Serviceの略称。
（公式サイトにより引用）
>AWS Key Management Service (KMS) を使用することで、暗号化キーを簡単に作成して管理し、幅広い AWS のサービスやアプリケーションでの使用を制御できるようになります。AWS KMS はセキュアで弾力性の高いサービスで、キーを保護するために FIPS 140-2 の検証済みまたは検証段階のハードウェアセキュリティモジュールを使用します。AWS KMS は AWS CloudTrail と統合されており、すべてのキーの使用ログを表示できるため、規制およびコンプライアンスの要求に応えるために役立ちます。

##CloudHSMとは
AWS Cloud でのマネージド型ハードウェアセキュリティモジュール (HSM) のことを指します。
（公式サイトより引用）
>AWS CloudHSM は、クラウドベースのハードウェアセキュリティモジュール (HSM) です。これにより、AWS クラウドで暗号化キーを簡単に生成して使用できるようになります。CloudHSM で、FIPS 140-2 のレベル 3 認証済みの HSM を使用して、暗号化キーを管理できます。CloudHSM によって、PKCS#11、Java Cryptography Extensions (JCE)、Microsoft CryptoNG (CNG) ライブラリといった業界標準の API を使用して、アプリケーションを柔軟に統合できます。

##AWS KMSとCloudHSMの違いは？
■AWS KMS
AWS管理のサーバを共有で利用し、そこで暗号化キーを管理します。
システム的に他の組織へのアクセス制限はされていますが、物理的には同じサーバ上に存在します。
CloudHSMに比べると安価に利用することができます。

■CloudHSM
専用のハードウェアで暗号化キーを保管します。
CloudHSMの方がより安心してキーを管理することが可能です。
KMSに比べると高価です。

参考）
Q: AWS KMS と AWS CloudHSM にはどのような違いがありますか?
https://aws.amazon.com/jp/kms/faqs/
複数のAVPlayerが起動してしまう問題を解決



##AVPlayerを終了する時にplayer.replaceCurrentItem(with: nil)を設定する


```
import UIKit
import AVKit

class PlayerLayerVC: UIViewController {

    var playerLayer = AVPlayerLayer()
    var player : AVPlayer! = AVPlayer()

    override func viewDidDisappear(_ animated: Bool) {
        super.viewDidDisappear(animated)
        
        player.replaceCurrentItem(with: nil)
    }
}
```
ゼロから始めるLeetCode Day44「543. Diameter of Binary Tree」

#概要
海外ではエンジニアの面接においてコーディングテストというものが行われるらしく、多くの場合、特定の関数やクラスをお題に沿って実装するという物がメインである。

その対策としてLeetCodeなるサイトで対策を行うようだ。

早い話が本場でも行われているようなコーディングテストに耐えうるようなアルゴリズム力を鍛えるサイト。

せっかくだし人並みのアルゴリズム力くらいは持っておいた方がいいだろうということで不定期に問題を解いてその時に考えたやり方をメモ的に書いていこうかと思います。

[Leetcode](https://leetcode.com/)

[ゼロから始めるLeetCode 目次](https://qiita.com/KueharX/items/6ee2502c3b620c795b70)

前回
[ゼロから始めるLeetCode Day43「5. Longest Palindromic Substring」](https://qiita.com/KueharX/items/33f03dec9919b71ef3c0)

今はTop 100 Liked QuestionsのMediumを解いています。
Easyは全て解いたので気になる方は目次の方へどうぞ。

[Twitter](https://twitter.com/kueharx)やってます。


# 問題
[543. Diameter of Binary Tree](https://leetcode.com/problems/diameter-of-binary-tree/)

難易度はeasy。
Top 100 Liked Questionsからの抜粋です。

解いていたのに記事を書くのを忘れていたのを見つけたので書きます！

問題としては、二分木が与えられます。
その木の直径を調べ、二点間のノードの最も長い経路の長さを返すようなアルゴリズムを設計する、というものです。

```
          1
         / \
        2   3
       / \     
      4   5   
```
>Return 3, which is the length of the path [4,2,1,3] or [5,2,1,3].

この場合は3が返されるとなっていますね。

# 解説

```Python
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def diameterOfBinaryTree(self, root: TreeNode) -> int:
        self.ans = 0
        
        def dfs(node):
            if not node:
                return 0
            right = dfs(node.right)
            left = dfs(node.left)
            self.ans = max(self.ans,left+right)
            return max(left,right) + 1
    
        dfs(root)
        return self.ans
# Runtime: 40 ms, faster than 89.86% of Python3 online submissions for Diameter of Binary Tree.
# Memory Usage: 16 MB, less than 34.48% of Python3 online submissions for Diameter of Binary Tree.
```

深さ優先探索で深さを測り、直径なので最終的に親を経由するので+1をすれば解けます。

木の構造を理解できてれば比較的すんなり実装できるかと思います。

~~地味にてこずったとはいえない・・・~~

今回はここまで。お疲れ様でした！
LaravelでどうしてもSESSIONが追加できないときにすること

# こんなにもシンプルなSESSIONが追加できない

```php:app/Http/Controllers/HogeController.php
  public function show()
  {
    if (!Session::has('token')) {
      Session::put('token', 'token!');
      var_dump('saved!');
    }
    var_dump(Session::get('token'));
    return view('welcome');
  }
```

初回のみ「saved!token!」と表示され、2回目以降は「token!」となってほしい。
しかし、何度試しても「saved!token!」が表示される。

## 不用意にダンプしたらダメなんだってさ

[https://laracasts.com/discuss/channels/laravel/sessions-are-not-saving?page=1](https://laracasts.com/discuss/channels/laravel/sessions-are-not-saving?page=1)
> sessions work fine, but only if your code exits normally and runs the terminable middleware. If you dd() in your code then the session is not saved
>
>https://laravel.com/docs/5.5/middleware#terminable-middleware
>
>you should also run php artisan route:list and check that you have web against each route, once only per route

テストコードのvar_dumpを削除したらセッションにちゃんと保存できた。

```php:app/Http/Controllers/HogeController.php
  public function show()
  {
    if (!Session::has('token')) {
      Session::put('token', ’token!’);
    }
    return view('welcome');
  }
```
Netlifyでsubmoduleのgit cloneに失敗する

## 背景
privateリポジトリをsubmoduleとしてaddした状態で、Netlifyに連携している場合のお話です。

submoduleを追加したリポジトリがNetlify上でcloneに失敗する現象が発生しました。

```
Error checking out submodules: Submodule <Repository名> ...
...
Host key verification failed.
```

どうやらアクセス権が無いようです。
そりゃそうですよね。Netlifyに紐づけているリポジトリは1つのみなので、他のprivateリポジトリを除くことはできないのです。

## 解決方法
submodule対象のGitHubリポジトリの 
`https://github.com/<owner name>/<repository name>/settings/keys` に 
Netlifyのダッシュボードで出力したDeploy Keyを登録すればOKです。

NetlifyのダッシュボードのDeploy Keyが発行できる画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32950/ed2d4042-78b6-204c-9cef-a1605e5412ac.png)


## その他

Netlifyのsubmoduleに失敗する件を調査している時にこの記事を見かけましたが、
このURLに変更しているとうまくクローンできなかったので念の為記載しておきます。
https://qiita.com/naokazuterada/items/7ecf8a3dcaa6c4b5313c
【Laravel】Laravel上でスーパーグローバル「$_SERVER」を参照する。

メモとして残します。

`$_SERVER`でも普通に参照できますが、フレームワークを使っている以上、スーパーグローバル変数を直接参照するのはどうかということで、一応、お作法にのっとって、Laravel上でスマートに参照する方法を紹介。

下記の例ではLaravelのヘルパ`request`を使用して、帰ってきたオブジェクトの`server`プロパティを参照しています。

#■確認方法
##$_SERVER要素全て
```php

request()->server;
//↓実行結果

// "MIBDIRS" => "C:/hoge/php/extras/mibs"
// "MYSQL_HOME" => "\xampp\mysql\bin"
// "OPENSSL_CONF" => "C:/hoge/apache/bin/openssl.cnf"
// "PHP_PEAR_SYSCONF_DIR" => "\xampp\php"
// "PHPRC" => "\xampp\php"
// "TMP" => "\xampp\tmp"
// "HTTP_HOST" => "hoge.www.com"
// "HTTP_CONNECTION" => "keep-alive"
// "HTTP_PRAGMA" => "no-cache"
// "HTTP_CACHE_CONTROL" => "no-cache"
// "HTTP_UPGRADE_INSECURE_REQUESTS" => "1"
// "HTTP_USER_AGENT" => "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36"
// "HTTP_ACCEPT" => "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9"
// "HTTP_REFERER" => "http://hoge.www.com/"
// "HTTP_ACCEPT_ENCODING" => "gzip, deflate"
// "HTTP_ACCEPT_LANGUAGE" => "ja,en-US;q=0.9,en;q=0.8"
// "HTTP_COOKIE" => "remember_web_59ba36addc2b2f9401580f014c7f58ea4e30989d=eyJpdiI6IjBIU1JxWVFCeG96T1RWeDFBcUtrVVE9PSIsInZhbHVlIjoieU5pRnVudTJub1wvTzJpUndLZlQ4MzNlaVlqdEZqK24xUTlQNX ▶"
// "PATH" => "hoge"
// "SystemRoot" => "C:\WINDOWS"
// "COMSPEC" => "C:\WINDOWS\system32\cmd.exe"
// "PATHEXT" => ".COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC"
// "WINDIR" => "C:\WINDOWS"
// "SERVER_SIGNATURE" => "<address>Apache/2.4.39 (Win64) OpenSSL/1.1.1c PHP/7.3.8 Server at hoge.www.com Port 80</address>"
// "SERVER_SOFTWARE" => "Apache/2.4.39 (Win64) OpenSSL/1.1.1c PHP/7.3.8"
// "SERVER_NAME" => "hoge.www.com"
// "SERVER_ADDR" => "127.0.0.1"
// "SERVER_PORT" => "80"
// "REMOTE_ADDR" => "127.0.0.1"
// "DOCUMENT_ROOT" => "C:/Develop/hogeproject/public"
// "REQUEST_SCHEME" => "http"
// "CONTEXT_PREFIX" => ""
// "CONTEXT_DOCUMENT_ROOT" => "C:/Develop/hogeproject/public"
// "SERVER_ADMIN" => "hoge@hoge.test.com"
// "SCRIPT_FILENAME" => "C:/Develop/hogeproject/public/index.php"
// "REMOTE_PORT" => "59332"
// "GATEWAY_INTERFACE" => "CGI/1.1"
// "SERVER_PROTOCOL" => "HTTP/1.1"
// "REQUEST_METHOD" => "GET"
// "QUERY_STRING" => ""
// "REQUEST_URI" => "/"
// "SCRIPT_NAME" => "/index.php"
// "PHP_SELF" => "/index.php"
// "REQUEST_TIME_FLOAT" => 1591082776.119
// "REQUEST_TIME" => 1591082776

```

##要素を指定して参照
```php

//request()->server->get('要素名');//SERVER_NAMEなど
request()->server->get('SERVER_NAME');
//↓実行結果
//localhost.hoge.com

```
Random Dot Stereogram

ランダムドット・ステレオグラムを描画するプログラムをpythonで書きました。
とは言っても、ランダムな点でステレオの図を描画するだけのジョークプログラムですので、
真面目な人は怒らないで下さい。ランダムな点で構成された途中画像をいくら見ても、３D画像は浮き上がりません。
ubuntu20.04では、pip3でpygameがインストールできなかったので、`sudo apt-get install python3-pygame python3-numpy`として、pygameをインストールしました。以下のコードを、コピー＆ペーストして、適当なディレクトリに置き、実行権限を付けて、同じディレクトリに<a href="https://github.com/fygar256/randomdotstereogram/blob/master/stereogram.jpg">＊ここ＊</a>にある画像ファイルを置いて、実行して下さい。
種明かしをすると、ファイルネームにどんな画像を指定しても、ランダムドットで表示されます。詳細は、コードを参照して下さい。
僕のpythonで初めてのグラフィック処理のため、初学者覚書を兼ねてです。

```rdsg.py
#!/usr/bin/python3
from pygame.locals import * # pygameイベント処理のため
import pygame               # pygame
import time                 # sleepのため
import random               # シャッフルのため

pygame.init()                #pygameを使う際には必ず最初にinit()を呼びます

filename = 'stereogram.jpg'  #画像のファイルネーム

dummyscreen=pygame.display.set_mode((1,1),0,32) #image.load().convertを先に呼ぶとエラーが出るので、ダミーの呼び出しをします。

img=pygame.image.load(filename).convert() #ファイルの読み込み

xsize = img.get_width() # 画像の幅の取得
ysize = img.get_height() # 画像の高さの取得 

screen=pygame.display.set_mode((xsize,ysize),0,32) # ディスプレイをするスクリーンを、画像の幅、高さで再設定

surface=pygame.Surface((xsize,ysize)) # 元画像を描くサーフェスを設定
surface.blit(img,(0,0)) # 元画像を描く

# 元画像のサーフェスと、ディスプレイするスクリーンのサイズは一致していて、
# それぞれ全ての点が1対1対応します

ns = [i for i in range(xsize*ysize)] # 画面上の全ての点に順番を付けます
random.shuffle(ns) # 点の順番をシャッフルします これで、重複しない乱数列が出来ます

for cnt in range(xsize*ysize): # 画面の点の個数ループ。全部点を打ったら抜けます

    for event in pygame.event.get(): # pygame QUITイベントが出たら、終了
        if event.type == QUIT:
            exit()

    pos=divmod(ns.pop(0),ysize) # 打つ点の座標を、乱数から求めます
    # 幅掛ける高さなので、高さで割り、商と余りをそれぞれ、x,y座標とします

    col=surface.get_at(pos) # 元画像のサーフェスから、(x,y)における色を取得します。ピクセルの色の取得は、surface.get_at()でやります。
    screen.set_at(pos,col) # スクリーンに、位置pos、色colで点を打ちます

    pygame.display.update() # スクリーンをアップデートします

time.sleep( 20 ) # ループを抜けたら、20秒間ウエイトをします

# 終わり

```
jQuery Dragg&Drop テンパズル

<p class="codepen" data-height="265" data-theme-id="light" data-default-tab="js,result" data-user="brbhdnra" data-slug-hash="zYrOMRa" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="zYrOMRa">
  <span>See the Pen <a href="https://codepen.io/brbhdnra/pen/zYrOMRa">
  zYrOMRa</a> by 岩崎麻美 (<a href="https://codepen.io/brbhdnra">@brbhdnra</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>