OmniAICreator/Qiita-1.07M huggingface dataset:
EC2インスタンスのキーペアを紛失した際の対処法

##　対処法概要

1. 新しいキーペアを作成
2. キーペアを無くしたEC2インスタンスのAMIを作成
3. 作成したAMIからEC2インスタンスを作成(この時に新しいキーペアに変更)


## 1. 新しいキーペアを作成

- キーペアの画面に移動

![キーペア - EC2 Management Console 2020-10-24 14-17-11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/340c5b36-b3e9-089f-f348-20ad8638dbed.png)

- 新しいEC2インスタンス用のキーペアを作成

![キーペアを作成 - EC2 Management Console 2020-10-24 14-18-48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/c901dc51-5cca-8200-9d2a-116b0ae87731.png)

- 新しいキーペアが出来ました

![キーペア - EC2 Management Console 2020-10-24 14-19-45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/3f4084be-6574-f8a1-51ce-635a588bacc4.png)


## 2. キーペアを無くしたEC2インスタンスのAMIを作成

- キーペアを無くしたインスタンスのイメージを作成します

![スクリーンショット 2020-10-24 14.22.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/a4f98e6e-15e5-0ab9-505b-2665b0d1cfb5.png)

- イメージ名を入れて進めます

![イメージを作成 - EC2 Management Console 2020-10-24 14-26-12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/f58b9fd9-2307-6d33-511b-5116edb77282.png)

- AMIの一覧に、新しくAMIが追加されました

![AMI - EC2 Management Console 2020-10-24 14-31-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/0ccd6b40-9ef2-0190-b8ea-6e0b9a840a4f.png)


## 3. 作成したAMIからEC2インスタンスを作成(この時に新しいキーペアに変更)

- AMIを `起動` させてEC2インスタンスを作ります

![AMI - EC2 Management Console 2020-10-24 14-32-31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/1efb578c-eff2-5c0b-fd84-d45da338a1fb.png)

- 設定をしていきます

![インスタンスウィザードを起動 - EC2 Management Console 2020-10-24 14-33-48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/dcd570ce-8c77-b294-8c9f-6ab332bba26c.png)

- 最後のキーペアの設定の際に、新しく作成したキーペアを設定します

![インスタンスウィザードを起動 - EC2 Management Console 2020-10-24 14-34-47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/78f36c0f-fcb2-1229-26e7-b0b4c35b0bf7.png)

- インスタンス一覧に、新しいキーペアのインスタンスが出来ました。

![EC2 Management Console 2020-10-24 14-36-11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/56a1b004-4c1c-3585-0274-86f7df8c84c8.png)

- 新しいインスタンスにログインできることを確認して、古いインスタンスは終了(削除)を行います。

![インスタンス - EC2 Management Console 2020-10-24 14-41-34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/4ee5f751-8850-7f62-7648-ad1ae481f4a3.png)


## 参考

- [AWS EC2ログイン用の秘密鍵を無くした](https://qiita.com/nntsugu/items/1bcb9810c8a2cc6985b3)
SQLServerのデータ型をC#のデータ型に変換する(データ型のマッピング)


SQLServerのデータ型をC#のデータ型に変換する
（SQL Server データ型のマッピング）

対応表

|SQL  |C#  |キャスト方法  |
|---|---|---|
|bigint  |long  |ToInt64  |
|int  |long  |ToInt32  |
|smallint  |long  |ToInt16  |
|tinyint  |long  |ToByte  |
|real  |float  |ToSingle  |
|float  |double  |ToDouble  |


例）
　SQLServerではint型で格納されているデータAを
　VS側で変数に格納したい場合、"ToInt32"を使用する
　　int a = Convert.ToInt32(A);


参考資料
『SQL Server データ型のマッピング』
　https://docs.microsoft.com/ja-jp/dotnet/framework/data/adonet/sql-server-data-type-mappings

『C#とSQLServerを繋いでデータを操作する4つの方法【前編】DataTable，SqlDataReader編』
　https://www.udemy.com/course/cs_sqlserver1/
OpenFOAM8でcodedFixedValueを使ったケースにdecomposeParをするとcodeOptionsが反映されない問題への対処 

#対処方法
OpenFOAM8 の finiteVolume ライブラリ部分のソースと設定を一部を修正し、コンパイルします。
全体を再コンパイルする訳ではなのでそんなに時間は掛かりません（Core i7 の 8 並列で 5 分くらい）。
#原因について → Github に Issue が上がっていました
[こちら](https://github.com/OpenFOAM/OpenFOAM-8/issues/2)です。
この記事のタイトルにある問題の原因をズバリ書いてくれています。
OpenFOAM は dictionary 形式の設定ファイルに対して、そのエントリが文法的には正しいけれども不要なものであると判断した場合には無視するという挙動をする様です。
`codedFixedValue` 及び `codedMixedValue` の設定に使う dictionary の、必要とされうるエントリのリスト的なものが設定されている部分が有ります。どうやらそこに`"codeOptions"`が抜けていることが原因とのこと。
#対処方法の詳細
### 1. ソースの修正
問題のソースは、
/opt/openfoam8/src/finiteVolume/fields/fvPatchFields/derived/codedFixedValue/codedFixedValueFvPatchFields.C
及び、
/opt/openfoam8/src/finiteVolume/fields/fvPatchFields/derived/codedMixedValue/codedMixedValueFvPatchFields.C
になります。

2021/02/06 追記
これらは大本のソースコードなので、編集用にコピーしてきます。
修正したいファイルは一部なのですが、関連するライブラリをまるごと（Makeフォルダがあるディレクトリまで遡って）コピーします。
この場合は、finiteVolume ライブラリをコンパイルすることになります。

```
cp -r /opt/openfoam8/src/finiteVolume （お好きなディレクトリ）
```


コピーした方のソースコード内に含まれるリスト中に、`"codeOptions"`を追加します。

```cpp:codedFixedValueFvPatchFields.C
//
// 一部抜粋、codedMixedValue側も同様
//
template<>
const Foam::wordList
Foam::CodedBase<Foam::codedFixedValueFvPatchFieldBase>::codeKeys_ =
{
    "code",
    "codeInclude",
    "codeOptions",　// ← これを追加
    "localCode"
};
```
### 2. finiteVolume ライブラリの再コンパイル
万が一、自分でコンパイルしたライブラリに問題が起こった場合には finiteVolume ライブラリに依存する全てのソルバー類が使えなくなったら嫌だなあと思います（そんなことはまず無いかもですが）。
OpenFOAMには、ソルバー等がライブラリを検索するときに、`FOAM_LIBBIN` よりも `FOAM_USER_LIBBIN` に置いてあるライブラリを優先して使用する仕組みが有るそうです[(いつも参考にさせて頂いているサイトの記事)](http://penguinitis.g1.xrea.com/study/OpenFOAM/development_pattern.html)。
自分で修正・コンパイルした finiteVolume ライブラリをそこに設置する様に設定します。次のファイルの末尾を次のように修正します。

```:（コピー先ディレクトリ）/finiteVolume/Make/files&nbsp;
options
←2021/02/06ファイル名修正

LIB = $(FOAM_USER_LIBBIN)/libfiniteVolume

```

`export WM_NCOMPPROCS=8` 等、並列数を指定してから /opt/openfoam8/src/finiteVolume フォルダで `wmake` を実行します。
多分ファイルの書き込み権限に関するエラーが出るので、エラーメッセージから必要そうなディレクトリを予め作成したり、書き込み権限を与えておいたりしておくとビルドが通ります。

手順は以上です。これで安心して、位置と時間に依存する境界条件を codedFixedValue で設定して decomposePar して並列計算出来るようになります……　それでは皆様、良い CFD を。
【Unity C#】Color32はstruct！！｜すずとも初耳学#1

# すずとも初耳学とは
すずともが、プログラミングをするにあたって

- 知らなかったこと
- これ便利だなぁーって思ったこと
- 覚えておきたいこと

などを、「すずとも初耳学」としていろいろ記事書けたらな―と思います。

# Color32 は Struct！

\#1として取り上げるのは、Unityにある「Color32」という型。

[UnityEngine.Color32 - Unity スクリプトリファレンス](https://docs.unity3d.com/ja/current/ScriptReference/Color32.html)

最近Textureなどを触る機会があって、少し気になったので調べてみたのですが、

__Color32型はStruct!__
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255360/64d4e36f-83e1-8997-6172-2d6ed1090e3a.png)


はい。それだけです笑

# Structだから何って？
C#で構造体を扱おうと思うと、StructとClassがあります。
書き方も似てるしできることも似てるので、初心者は「あれ？同じじゃね？」と思いがちです。（少なくとも僕は）

しかし、StructとClassには明確な違いがあります。それは、

- Structは値渡し
- Classは参照渡し

という点です。いやぁこれ結構重要だし、知らなかったら混乱するよね…

Unityでよく使うものを分けてみるとこんな感じ。

- Struct
    - int型、float型などよく使う基本型
    - Color32
    - Vector2、Vector3
- Class
    - gameobject
    - transform
    - texture

intとかは何気なく代入してるけど、Structだったからできたのか！
gameobjectのtransformとか参照渡しだから変数で持ってこれたのか！

などなど、個人的には大発見(o^―^o)

というわけで、「Color32はStruct！」w
いいね機能 非同期にする上で詰まった部分

##対象者
いいね機能を実装している方で同期処理はできており、非同期処理の挙動とならない方
リロードしないと「いいねしている状態といいねしていない状態の切り替え」ができない方
Rails6におけるjQuery導入方法（①参照）やデバッグがうまくできていない（②参照）方

##環境
Rails6 環境
Turbolinks導入済み

## 記事の目的
いいね機能において同期処理は実現できたが、非同期にする上で詰まった部分を記しておきたいと思います。

いいね機能の記事は良質なものがあるので（ただRails5の環境が多いかも？）そちらを基本にして頂き、本記事では初学者が詰まった時に参考になる部分があればいいなという思いで記事にしました。

また、初学者の為、間違いがあれば、ご指摘頂けると幸いです。

##①Rails5とRails6におけるJQuery導入方法の違いを理解していなかった（環境設定ミス）

現在出ている記事ではRails5環境のものが多いのですが、Rails6環境での設定方法と異なることに注意しましょう。

###Rails5の場合
Rails5系までは、「アセットパイプライン」を使用して、JavaScriptを管理します。

```Gemfile
gem 'jquery-rails'
```

```application.js
//= require jquery
//= require rails-ujs
```

以上のようにjquery-railsを導入することでRailsアプリケーション開発にJQueryを用いることができます。
その後、app/assets/javasctipts/application.jsなどのマニフェストファイル上でJQueryをrequireします。
私は、Rails6を導入していたのにも関わらず、このRails５の方法で記述してしまいました。
この部分に限らず、Railsのバージョンに気をつけて記事を参照して下さい。

###Rails6の場合
Rails6以降では「Webpacker」という機能で管理します。
私の場合、application.jsの配置場所はapp/javascript/packs/application.jsとなっていました。

```application.js
require("@rails/ujs").start()
require("turbolinks").start()
require('jquery')
```
導入に関しては以下の記事を参考にしました。
https://techtechmedia.com/jquery-webpacker-rails/
加えてenvironment.jsの編集、jQuery導入の確認方法についてもこちらの記事で触れています。
jQuery導入の確認方法については、以下で少し触れます。

###jQuery導入の確認方法

application.jsに以下のコードを入れ、

```application.js
require("@rails/ujs").start()
require("turbolinks").start()
require('jquery')
document.addEventListener("turbolinks:load", () => {
   console.log($.fn.jquery)
})
```

remote:trueの記述によるJavascriptのリクエストによって呼び出されるjs.erbファイルにconsole.log($.fn.jquery)を追加。

```create.js.erb
console.log($.fn.jquery)
$("#like_<%= @review.id%>").html("<%= j(render partial: "reviews/likes", locals: { review: @review, book: @book, likes: @likes })%>");
```

そうすると、デベロッパーツールのconsoleの部分でJQueryのバージョンが表示されます。
JavaScriptで非同期処理を実装する際に確認する場所となるので覚えておきましょう。
consoleの部分に「3.5.1」のようにバージョンが表示されていれば、導入ができてるということになります。

![スクリーンショット 2020-10-25 0.06.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613599/4140e4bf-8b31-0c96-708c-e84108e39191.png)

##②変数定義のエラーに気づかなかった（rails sによるエラーのログを確認しなかった）

```create.js.erb
$("#like_<%= @review.id%>").html("<%= j(render partial: "reviews/likes", locals: { review: @review, book: @book, likes: @likes })%>");
```
エラー出ていないと勘違いしていたのですが、rails sで出力されるログを確認しておりませんでした。
いいねボタンを押すとrails sのログが出力され、一番最後にidが未定義ですとエラーが出ていました。
rails sのログは、以下の通りです。

```
Started POST "/books/2/reviews/3/likes" for ::1 at 2020-10-24 09:41:59 +0900
Processing by LikesController#create as JS
・
.

（省略）
・
.
ActionView::Template::Error (undefined method `id' for nil:NilClass):
    1: $("#like_<%= @review.id %>").html("<%= j(render partial: "reviews/likes", locals: { review: @review, book: @book, likes: @likes })%>");
```
一番下にエラーがでています。
私の場合は、コントローラ内の@reviewの定義方法の誤りで値が入っていないのが理由で、@reviewを含むcreate.js.erbが動作せず、非同期の挙動になりませんでした。
このエラーに対する適切なデバック（変数の正しい定義）を行ったら、リロードしないと「いいねしている状態といいねしていない状態の切り替え」ができなかった問題が解決され、非同期処理の挙動を実現することができました。

同じような環境・部分で詰まっている方の参考になれば幸いです。
簡単にプログラミングができる方法を教えます！【Processsing#1】

#今回の目標
```GOAL.pde
開発環境を構築して簡単なプログラムを実行してみよう！
```



#目次
[1. Processingをダウンロード](#1-Processingをダウンロード)
[2. 開発環境を理解しよう](#2-開発環境を理解しよう)
[3. 実行してプログラミングを体験しよう](#3-実行してプログラミングを体験しよう)
[4. 最後に](#4-最後に)



#1. Processingをダウンロード
※2020/10/24 現在
##ステップ1
以下のURLよりダウンロード。
[ProcessingのダウンロードはこちらのURLから](https://processing.org/)
##ステップ2
サイトにいくことができたら、下図の「Download Processing」よりダウンロード。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637147/a470aa2b-9e5c-be4c-57b9-18ad37911e97.png)
##ステップ3
ご自身のOSに合わせてダウンロードしてください。
Windows,MacOS,Linuxがあります。
Windowsのbitの確認は「スタート→設定→システム→バージョン情報→システムの種類」で確認してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637147/c6c70473-f26f-1b0a-621e-e1c027cbd23d.png)
##ステップ4
zipファイルができた方は解凍作業に入ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637147/1ffebb27-a5c2-b872-2335-c6bf7d407d0c.png)
エクスプローラー（Windows）やFinder（MacOS）のダウンロード欄より先程のzipファイルを右クリック等して任意の場所に展開します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637147/58197397-98db-d854-6250-da3c4d82c0ca.png)
展開できたらフォルダの中に入り「prosessing.exe」を確認できたらダウンロード完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637147/41a99233-ca7c-ddd4-b9de-e52d2cb99dd2.png)



#2. 開発環境を理解しよう
##確認しよう
上記で確認した「processing.exe」をダブルクリックして実行してください。
↓このような画面が出てきたら成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637147/41418218-83fa-278d-d6ae-1af48a67b1d5.png)
▶：実行ボタン
■：実行停止ボタン
白い欄：プログラムコード欄
下の黒いコンソール欄：実行結果欄

コードを打って実行ボタンを押すだけです。



#3. 実行してプログラミングを体験しよう
##サンプルコードをコピペして実行しよう
```sample.pde
void setup() {
  size(500, 500);
}

void draw() {
  strokeWeight(10);
  stroke(0);
  line(mouseX, mouseY, pmouseX, pmouseY);
}
```
上記のコードを下記のようにコピペして▶実行しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637147/702c892f-a344-02c4-fdde-2c40a40d6897.png)
すると、新しいウィンドウが出てくると思います。
ウィンドウが出てくれば成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637147/b9d5aba7-13b9-0c2f-1ea7-676c9d15c2df.png)
マウスをウィンドウ内に入れてみてください。
すると、このように黒線を描くことができます。
このプログラムは黒い線を描くコードだったというわけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637147/9bf567b9-1256-2fbf-67f4-2124f84a07ef.png)
##実行して終わりではない
プログラミングしてみてどう思いましたか？
つまらないと思いましたか？
もっといろいろなプログラムを実行してみたいと思いましたか？
いずれにせよ、上記のコードを実行して「なるほど」と思うだけでは成長しません。

・stroke(0)をstroke(100)にしたらどうなる？
・線じゃなくて点線とかできないの？
・黒い線じゃなくて赤い線にはできない？

このように疑問を抱き、実際に進んで改変することが成長の近道です。
スポーツや勉強でもそうですよね。



#4. 最後に
私がC言語の次に知った言語が、このProcessingでした。
Processingを使うと描写できるので、やってて楽しいですよね。
この記事でもしかしたら偉そうなことを書いていたかもしてませんが、まだまだ初心者です。
今回は復習も兼ねて開発環境の構築から実行までをやりました。
次回からは「こんなの作りたい！」というのを決めてからプログラミングしていきたいと思います。
最後まで読んでいただき、ありがとうございました。
Laravel で DROP TABLE したテーブルを再び migrate する方法

### 一度 DROP TABLE したテーブルを再び migrate する

DROP TABLE は表構造ごと完全削除します。そのため，再びテーブルが必要になった場合はもう一度 migrate を実行する必要があります。

しかし，そのままでは migrate できないので以下に対処法を紹介します。

---
試しに DROP TABLE してみる。

```
mysql> USE mydb;
mysql> DROP TABLE my_table;
```

テーブルが消えた状態で migrate を実行しようとすると，migrate するものがないと言われてしまいます。

```
> php artisan migrate
Nothing to migrate.
```
migrations テーブルから， DROP したテーブルの id を確認します。

```
mysql> SELECT * FROM migrations;
```

該当するレコードを削除します。
Laravelでは migrations テーブルでマイグレーションの実行履歴を管理しています。
既にテーブルを削除していても，この履歴を消さない限り migrate は実行されません。

```
mysql> DELETE FROM migrations WHERE id='20';
```

履歴を削除したので migrate を実行します。

```
> php artisan migrate
```

無事にテーブルが作成されました。
【Cyberduck】VirtualBoxで起動したLinux(CentOS7)上のファイルをGUIでmacと相互にやり取りする方法

【VirtualBoxのCentOS7にDockerコンテナでJenkinsサーバーを構築し、ローカルPCからJenkinsサーバーにアクセスする方法】
https://qiita.com/JUN_WEB_FREE/items/b1a817c03cdb19487a44

上記記事で作成したLinuxのデータとmacのデータをGUIでやり取りしたかったので、本記事を作成しました。

WindowsにはFTPツールとしてWinSCPがあり、このツールを用いることでLinux上のデータとWindows上のデータをGUIでやり取りできます。

macにはそういったツールは無いのでしょうか？<font color="red">もちろんあります。</font>

それがCyberduckです。

インストールはこちらから
https://cyberduck.io/

![スクリーンショット 2020-10-25 0.00.41.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646483/f62e7f0d-dbb7-fc3f-f1a6-05334e76620e.jpeg)

インストールしたらさっそく使い方に移ります。

VirtualBox上のLinuxを起動した状態で、cyberduckを起動します。

![スクリーンショット 2020-10-25 0.04.13.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646483/53092253-5b32-bf42-4cad-320b5ac199f3.jpeg)

左上の新規接続をクリックし、下記の設定にします。
プロトコル:SFTP
サーバ:192.168.56.101(ここは接続するマシンのIPアドレスに合わせる)
ポート:22(SSH接続するから)
ユーザ名:root(だいたいそう)
パスワード:123456(ここは接続するマシンのパスワードに合わせる)
SSH Private Key:なし(ssh鍵を作成したかどうかによる)
キーチェーンに追加する:なし(お好みで)

![スクリーンショット 2020-10-25 0.08.43.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646483/5f031080-b022-732b-75d6-9aec0498a63a.jpeg)

接続をクリックします。

![スクリーンショット 2020-10-25 0.09.15.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646483/be87d52a-a694-a63b-7301-b891c1960f97.jpeg)

これで接続完了です。Linux上のデータをmacに移動する場合は2本指タップでダウンロードを選択します。
逆にmac上のデータをLinux上に移動する場合は2本指タップでアップロードを選択します。
GitHub Actionsでブランチ名やコミットSHA等のプロパティーを取得、表示する方法

# Example

手動で実行していくつかのプロパティーをechoで表示する例

`${{ プロパティー名 }}`と書くとその部分を置き換えてくれる

```show-properties.yml
name: Show Properties

on: 
  workflow_dispatch:
    inputs:
      comment:
        description: "コメント"
        required: false
        default: "手動ビルド"

jobs:
  show-properties:
    runs-on: ubuntu-latest
    steps:
      - name: Show github properties
        run: | 
          echo ${{ github.workflow }}
          echo ${{ github.ref }}
          echo ${{ github.sha }}
      - name: Show secret properties
        run: | 
          echo ${{ secrets.SAMPLE }}
      - name: Show inputs properties
        run: |
          echo ${{ github.event.inputs.comment }}
```

# secrets
アクセストークンやメールアドレス等隠したい情報は以下でsecretsとして登録する。
![スクリーンショット_2020-10-24_23_56_40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113504/57ee35eb-e76d-33d2-ad08-09efb011c120.png)

今回はSAMPLEという名前で登録してある

# 結果
![スクリーンショット 2020-10-24 23.53.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113504/aa468908-1201-f490-258b-7c7449464ad4.png)

![スクリーンショット 2020-10-24 23.58.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113504/d4f76fc0-21cd-cd72-d11f-ee852afa8a50.png)

このように情報がとってこれておりechoによって出力できている。
ただし、secretsに関してはログにも表示されないようになっている。

プロパティーの詳細や、他のプロパティー、使える関数について知りたい場合には下記参考のリンクを参照。

# 参考
[GitHub Actions のコンテキストおよび式の構文
](https://docs.github.com/ja/free-pro-team@latest/actions/reference/context-and-expression-syntax-for-github-actions)
ここに他のプロパティーや使える関数も記載されている
Bootstrap(Bootstrap-vue)のNavBarの色を変えてみる


Nuxt.jsの練習がてらwebページを作っているのですが、
デザインはbootstrapでなんとかしようと使ってみています。
（いままで全然使ってこなかった....）

Bootstrap-vue の公式リファレンス？からコピペしてみたのですが、
（画像はちょっと要素消したりしてます。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/719555/3cfbee3e-e929-1ca6-29b7-37fe5712b43a.png)



デフォルトの色を変えたいと思いつつ、どこをいじればいいのかサッパリ...という感じでした。（どこかで「class="blue"」みたいになっているのかと思ってた....）


公式リファレンスをよくよく読んで見ると、普通に下の方に書いてありましたね...。（[こちら](https://bootstrap-vue.org/docs/components/navbar#color-schemes)）


<br>
どうやら以下の感じのようです。

- 文字の色は`type`で指定
- 背景色は`variant`で指定

```html
<!-- 一番上のところ -->
<div>
  <b-navbar toggleable="lg" type="dark" variant="info">
    <b-navbar-brand href="#">NavBar</b-navbar-brand>

```

<br>
<br>

いくつかイメージ載せておきます。
（バージョンは`"bootstrap-vue": "^2.17.3"`）

1.`type="dark" variant="primary"`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/719555/41950939-2c78-4834-b7c3-b8234cf0e603.png)

2.`type="dark" variant="success"`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/719555/d10bb23e-f8b7-ad14-df83-3392b10ffcdd.png)

3.`type="dark" variant="info"`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/719555/d42121ac-2a98-4d72-7a17-d96dddc95584.png)

4.`type="dark" variant="warning"`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/719555/355bbba5-5520-9c55-e75e-d79834a5f888.png)

5.`type="dark" variant="danger"`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/719555/f0273120-a2cc-f6a2-f3c6-24e5aa595e2c.png)

6.`type="dark" variant="dark"`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/719555/39c789c9-aeb7-dbf8-3b87-d576ea72f7a6.png)

7.`type="light" variant="light"`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/719555/d4d1f0d1-4ce5-1b11-95af-eca07391366c.png)



<br>
<br>


ちょっとずつBootstrapの使い方に慣れていこうと思います。


## 参考文献
https://bootstrap-vue.org/docs/components/navbar
[day: 7]Notionに入門しました

# Notionに入門しました

## Notionとは

公式サイト：[Notion](https://www.notion.so/Npedia-9851b488b96846c3b04c691cd3419326)
超簡単に説明するとクラウドメモアプリケーションです。
メモをクラウド管理できるので、ログインさえすれば自分のメモにすぐにどこからでもアクセスできます。
最近日本でも人気が出てきている注目のサービスです。

## ただのメモアプリ？

クラウドでメモを管理できるだけならever noteでもgoogleのメモでもできるので、別に今までのアプリで十分なのでは？と感じると思います。
しかし、NotionはTodoリストやカレンダー、メモ、読んだ本のリストなどをディレクトリ構造で管理でき
その中に子のページを埋め込むことも可能です。
また、データベースを作成することで必要な情報のみを表示するようにしたり、データを指定してソートしたりとエンジニアにとって扱いやすく、表現の自由度も非常に高いことが特徴です。

## 私の使い方

本日入門したばかりでまだ、使いこなせてはいないのですが、
これからやりたいこととしては以下があります。

- 学習時間の管理
- 本の管理
- 家計簿
- カレンダー
- アイデアメモ
- KPT管理
- 学習の進捗管理
- Todoリストの管理
- ポートフォリオ
- ホームページとしての利用

まだまだ増えるかもしれませんがざっとこれくらい浮かんでいます。
ページの表現度が非常に高いため、今まで複数のアプリで管理していた事柄をこのアプリ一つにまとめることができると感じています。
私はできることなら複数のアプリを開くよりも一つで完結させたいと考えているのでまさにぴったりのサービスだと感じています。

まだ本のページを試しに作ってみただけなのですが、これから作り込んでいこうと思います。

私のNotion：[Notion](https://www.notion.so/Home-673ebc786b5042c0a586806214fe8686)

## 毎日投稿について
アウトプットの毎日継続をしています。
すでに毎日ではなくなってしまいましたが、改善して続けていきます。
[Ruby] each_with_index と each.with_indexの違いを考えた

この記事ではmacOS Catalina10.15.6にインストールしたRuby 2.6.5を使っています。
2つの違いを区別するためにまとめてみました。

# each_with_index
- each_with_indexと__２つの値__をブロック変数に渡すことで、__配列の要素の数だけ繰り返し処理__と__その要素が何番目のものか表す__ことができます。

```ruby
fruits = ["apple", "banana", "peach"]

fruits.each_with_index do |fruit, index|
  puts "#{index}番目のフルーツは#{fruit}です。"
end
```

# 結果
ただ、このままだと「０番目のフルーツはappleです。」となってしまいますね。

```
0番目のフルーツはappleです。
1番目のフルーツはbananaです。
2番目のフルーツはpeachです。
```
# each.with_index
- __indexの引数に1__を入れました。
- すると、要素に割り振られる番号が1からスタートになります。

```ruby
fruits.each.with_index(1) do |fruit, index|
  puts "#{index}番目のフルーツは#{fruit}です。"
end
```
# 結果
この通り、きれいに1から順番が始まっていますね。

```
1番目のフルーツはappleです。
2番目のフルーツはbananaです。
3番目のフルーツはpeachです。
```
【python】for文エラー

TypeError: 'int' object is not iterable
のエラーが生じたときの対処法

#for文の使い方
以下のように　in　の後には範囲を指定する。

```py
for i in range(0, 4):
    print(i)
```

```text:実行結果
0
1
2
3
```

上の例では　in　の後に0から3を指定している。

#エラーが出る使い方
以下のように　in　の後に数字のみを入れるとエラーが起きる。

```py
for i in 4:
    print(i)
#TypeError: 'int' object is not iterable
```

以上の例は in　の後に数字が入っているため、for文を何回したらよいかわからないというエラーが出ている。
データベースに登録するときにエラーメッセージを表示させたい

#はじめに
　テストコードを書いていて、エラーメッセージを表示させるようにしたときに、わからなかったことなので、記録として残しておく。

##エラーメッセージの表示方法

viewディレクトリに

```ruby:_error_messages.html.erb
<% if model.errors.any? %>
  <div id="error_explanation" class="alert alert-danger">
    <ul>
      <% model.errors.full_messages.each do |message| %>
        <li><%= message %></li>
      <% end %>
    </ul>
  </div>
<% end %>
```

を作成し、`renderメソッド`で呼び出すようにする。
１行目のmodelは、今回データベースに何かを登録する場面を想定しているため。


呼び出す側のコード

```ruby
<%= render 'error_messages', model: f.object %>
```

ファイルの位置によって、`shared/error_messages`のように指定してあげる必要がある。
【Auth0】ログイン画面のログインIDを初期表示する

# はじめに
Auth0のUniversal Loginを呼び出す際に`login_hint`パラメーターを設定し、ログインIDを初期表示するようにしてみました。

# login_hint
Auth0のUniversal Loginを利用している場合、`/authorize`エンドポイントにアクセスするときにURLのクエリパラメーターに`login_hint`を利用すると、設定した値がそのままログインIDのフォームに表示されます。

Universal LoginはClassicとNewの2種類がありますが、`login_hint`はどちらでも利用可能なようです。

# Universal Loginの表示

`/authorize`にアクセスするときは以下のようなパラメーターを使用すると思います。
（Auth0の[API仕様](https://auth0.com/docs/api/authentication#authorization-code-flow)から転載）

```
GET https://YOUR_DOMAIN/authorize?
  audience=API_IDENTIFIER&
  scope=SCOPE&
  response_type=code&
  client_id=YOUR_CLIENT_ID&
  redirect_uri=https://YOUR_APP/callback&
  state=STATE
```

このときに設定するパラメータに`login_hint`を以下のような形で追加します。

```
login_hint=example@example.com
```

上記のパラメーターをそのまま利用すると、ログインID（メールアドレス）の入力フォームに`example@example.com`が初期表示されます。

![スクリーンショット 2020-10-24 23.36.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653972/e581c60b-5884-3527-3e8a-6d51d1e91374.png)



# おわりに
ログイン画面を表示する前にユーザー（ログインID）が特定できている場合に`login_hint`パラメーターを利用するとユーザーがログインIDを入力する手間が省略することができます。
初期表示しているだけでログインIDを入力し直すこともできるので、必ずログインIDを固定できるわけではないという点には注意してください。
Dockerを組み込むために参考にした記事

##参考にした記事

DockerをMacにインストールする
https://qiita.com/kurkuru/items/127fa99ef5b2f0288b81

はじめてのDocker 導入から開発の流れまで
https://qiita.com/m-dove/items/173d08a5d8d910e10283

###最初はわからなさすぎたのでYouTubeなども見ましたー。
もう環境構築で悩まない！Dockerを使ってRails環境構築！
https://www.youtube.com/watch?v=BZS8AHF3TTo&t=503s
Haskell ArrowApplyからMonadを導出する

ArrowApplyはMonadと等価だという話を聞いたので、実際にArrowApplyからMonadを導出してみました。

標準ライブラリ中には[ArrowMonad](https://hackage.haskell.org/package/base-4.14.0.0/docs/Control-Arrow.html#t:ArrowMonad)という型が定義されていますが、Arrow型の第一型引数が`()`に束縛されています。

```haskell:ArrowMonad
newtype ArrowMonad a b = ArrowMonad (a () b)
forall a. Arrow a => instance Functor (ArrowMonad a)
forall a. Arrow a => instance Applicative (ArrowMonad a)
forall a. ArrowApply a => instance Monad (ArrowMonad a)
```

今回はこの束縛をなくし、多相性を完全に保ったままMonadを導出します。
すなわち、

```haskell:ArrowMonadExt
newtype ArrowMonadExt a b c =
    ArrowMonadExt { runArrowMonadExt :: (a b c) }
forall a b. Arrow a => instance Functor (ArrowMonadExt a b)
forall a b. Arrow a => instance Applicative (ArrowMonadExt a b)
forall a b. ArrowApply a => instance Monad (ArrowMonadExt a b)
```

を定義します。ArrowMonadの時はインスタンス宣言の型変数が一つだった(`forall a.`)のに対し、ArrowMonadExtの定義では型変数が二つになっている(`forall a b.`)点がミソです。

また、クラス制約で示されているように、ArrowApplyが必要になるのはMonadの実装だけです。なので、普通のArrowもFunctorやApplicativeとしては扱えます。

## 共通ヘッダー

この記事のソースコードをコンパイルするには、各ソースコードの冒頭に以下を追加してください。

```haskell
{-# LANGUAGE Arrows #-}
import Control.Arrow
```

## ArrowMonadExtの定義

```haskell
newtype ArrowMonadExt a b c =
    ArrowMonadExt { runArrowMonadExt :: (a b c) }
```

## Functorの定義

```haskell
instance (Arrow a) => Functor (ArrowMonadExt a b) where
    fmap f (ArrowMonadExt m) = ArrowMonadExt $
        proc b -> do
            c <- m -< b
            returnA -< f c
```

## Applicativeの定義

```haskell
instance (Arrow a) => Applicative (ArrowMonadExt a b) where
    pure x = ArrowMonadExt $
        proc _ -> returnA -< x

    (ArrowMonadExt l) <*> (ArrowMonadExt m) = ArrowMonadExt $
        proc b -> do
            f <- l -< b
            c <- m -< b
            returnA -< f c
```

## Monadの定義

```haskell
instance (ArrowApply a) => Monad (ArrowMonadExt a b) where
    (ArrowMonadExt m) >>= k = ArrowMonadExt $
        proc b -> do
            c <- m -< b
            d <- runArrowMonadExt $ k c -<< b
            returnA -< d
```

## P.S

> 多相性を完全に保ったままMonadを導出します。

と書きましたが、結局`ArrowMonadExt a b`をMonadとして定義しているので、今回の定義とArrowMonadは本質的に同じです。つまり、事前にArrowの入力を`()`として固定しているか、インスタンス定義時に型変数として固定するかの違いがあるだけで、やっていることは変わりません。
RubyのDateクラスを使った曜日の出力

##Dateクラスとは
Rubyの標準ライブラリの機能です。

Dateクラスを使うには以下一文を記述します。

```ruby
require "date"
```


次に、Dateクラスを用いて

「今日の曜日」を取得する場合は以下のように記述します。

```ruby
day = Date.today.wday
```

wdayは曜日を0(日曜日)から6(土曜日)の整数で取得することができるDateクラスに用意されているメソッドです。

例えば、木曜日なら　4 が出力されるわけですね！

どうすれば、「今日は木曜日です」と出力されるか考えてみました。



```ruby

require "date"

day = Date.today.wday

if day == 0
  puts "今日は日曜日"
elsif day == 1
  puts "今日は月曜日"
elsif day == 2
  puts "今日は火曜日"
elsif day == 3
  puts "今日は水曜日"
elsif day == 4
  puts "今日は木曜日"
elsif day == 5
  puts "今日は金曜だ！！！"
else
  puts "今日は土曜日"
end

```


If文が長いので、リファクタリングできそうですね。

出力されるのが数字というのがポイントで、

配列を使用して出力される数字を添字に代入すれば上記と同じ結果が得られそうです。





```ruby

require "date"

day = Date.today.wday
days = ["日曜日", "月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日"]


  puts "今日は#{days[day]}"


```


コンパクトにまとまりました。

If文を使うなら、特定の曜日でコメントを変える時に使うという方がいいですね。


まだまだ、コードを短くする記述ができないのでやりながら覚えていきたいと思います！
即時に更新されるチャット機能(Action Cableの実装)

#即時に更新されるチャットアプリ
* Action Cableを用いた、リアルタイムチャットアプリを作成する

#まとめてコードずらりします⬇︎
```java:ターミナル
% cd projects
% rails _6.0.0_ new mini_talk_app -d mysql
% cd mini_talk_app
% rails db:create
```
```java:ターミナル
% rails g controller messages new
% rails g model message text:text
% rails db:migrate
```
```java:app/config/routes.rb
Rails.application.routes.draw do
  root 'messages#new'
  resources :messages, only: [:create]
end
```
```java:app/controllers/messages_controller.rb
class MessagesController < ApplicationController
  def new
    @messages = Message.all
    @message = Message.new
  end

  def create
    @message = Message.new(text: params[:message][:text])
  end
end
```
```java:app/views/messages/new.html.erb
<h3>mini_talk_app</h3>
<%= form_with model: @message do |f| %>
  <%= f.text_field :text %>
  <%= f.submit '送信' %>
<% end %>
<div id='messages'>
  <% @messages.reverse_each do |message| %>
    <p><%= message.text %></p>
  <% end %>
</div>
```
#この時点で下記のようになっているはず
![d6806db02ad04b485928bbd124c73f1a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/725167/f81fe7d7-2fa0-f446-951d-cdf357ba1a21.png)

#Action Cableの実装(先ほどの続き)
```java:ターミナル
% rails g channel message
```
```java:app/channel/message_channel.rb
class MessageChannel < ApplicationCable::Channel
  def subscribed
    stream_from "message_channel"
  end

  def unsubscribed
    # Any cleanup needed when channel is unsubscribed
  end
end
```
```java:app/controller/messages_controller.rb
class MessagesController < ApplicationController
  def new
    @messages = Message.all
    @message = Message.new
  end

  def create
    @message = Message.new(text: params[:message][:text])
    if @message.save
      ActionCable.server.broadcast 'message_channel', content: @message
    end
  end
end
```
```java:app/javascript/channels/message_channel.js
import consumer from "./consumer"

consumer.subscriptions.create("MessageChannel", {
  connected() {
    // Called when the subscription is ready for use on the server
  },

  disconnected() {
    // Called when the subscription has been terminated by the server
  },

  received(data) {
    const html = `<p>${data.content.text}</p>`;
    const messages = document.getElementById('messages');
    const newMessage = document.getElementById('message_text');
    messages.insertAdjacentHTML('afterbegin', html);
    newMessage.value='';
  }
});
```
#現場からは以上です！
配列の掛け算について

rubyの問題でつまづいた箇所があるので記録として残しておきます。

問題内容をざっくり説明すると以下のとおりです。
・２つの数字が文字列として入力される("a b")・
最終的それぞれを２倍した数字を出したい

```:誤答
num = gets.split.map(&:to_i)
puts num * 2
```

1.``split``メソッドで値を分割して配列に文字列の値を入れます。
2.```map(&:to_i)```で配列の値を数字に変換して配列を作成する。(```map(&:to_i)```に関しては以下の記事が大変わかりやすく、参考にさせていただきました。)
https://a-records.info/ruby-map-ampersand-colon-to_i/

3.配列の要素に対して*2を行う。

結果は以下のとおりになりました。

```
num = gets.split.map(&:to_i)　// 5 10と入力する
puts num * 2
出力結果　=>　5 10 5 10
```
なぜ``@map(&:to_i)``で数値に変換しているのに5 10が２回繰り返されているのかわからずにいました。


## 結論
・配列に対して掛け算を行うと同じ要素を繰り返した新しい配列が作られる。
各要素に対してではなく配列自体に*2を行っていたため要素が繰り返されていました。(わかってから見直すとそりゃそうだと思いますね...)

```
num = gets.split.map(&:to_i)
num.each {|n| puts n * 2}
```

``each``で各要素に処理を行うことで解決しました。
Nib（.xib）ファイルからViewControllerを初期化

簡単に呼べます。
NibViewController.swift
NibViewController.xib
をつくったとします。

```swift

let nvc = NibViewController.init(nibName: "NibViewController", bundle: nil)
self.navigationController?.show(nvc, sender: nil)
```

🐣
****
お仕事のご相談こちらまで
rockyshikoku@gmail.com

Core MLを使ったアプリを作っています。
機械学習関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
MinIOを使ったAWS S3利用アプリのテストバケット・オブジェクトの準備

追記: 空のバケットの事やゴミのことポリシー設定の事を考えると、やりたいことは、[Minio (S3互換) で バージョン管理したデータを含めて永続化する](https://qiita.com/daisukeArk/items/ac97665e5de7b726fa67)でした（後で見つけた）。

## 目的

AWS S3を利用したアプリのローカルのデバッグのモックやユニットテストなどで、

- バケットはすでにインフラ側の設定として準備されている
- バケット内のオブジェクト/データは別処理が作成している

の様な構成の場合、MinIOのDockerコンテナーを使うのが良さそう。クライアント側からバケットを作り必要なデータをputするというのもあるかと思うが、コンテンテナー立上たら必要がデータが入っていてるのが便利かなぁと。

こちらのQiita記事 [docker-composeでMinio起動時にデフォルトのbucketを作成する](https://qiita.com/terukizm/items/6850aa316de425e3e3b4) を参考にバケットの用意はできたが、テスト用のデータも仕込んでみた。

## ディレクトリ構成

```
.
├── docker-compose.yml
├── entrypoint.sh
└── test_data
    ├── README.md             # テストデータの説明などを書いておく
    ├── foobucket             # テストデータ入りバケット
    |   ├── myobject1.csv
    |   └── myobject2.json
    └── barbucket             # 空バケットの準備はディレクトリだけ掘っておく
```

## Docker Compose

### エントリーポイントの差替え

参考にした記事の様に`docker-compose.yml`に展開して書いても良いのでしょうが、長くなるので別ファイルにした。この中で事前データを準備する。

内容的にはホスト側の`./test_data`をさらってコンテナ側の`/data`にMinIOが認識できる形にコピーしMinIO serverを立ち上げる。

```sh
#!/bin/sh

SRC=/test_data
DATA=/data

files=$SRC/*

for file in ${files}; do
  if [ -d ${file} ] ; then
    bucket=$(basename ${file})
    mkdir -p ${DATA}/${bucket}
    mkdir -p ${DATA}/.minio.sys/buckets/${bucket}
    cp -pr ${SRC}/${bucket}/ ${DATA}/
  fi
done

minio server /data
```

カスタムポリシーとかは不要だったので準備してませんが、リンク先の記事のように`policy.json`って用意したほうが良いのかなぁ？

### docker-compose.yml

```yml
version: "3"

services:
  minio:
    image: minio/minio:latest
    ports:
      - "9000:9000"
    volumes:
      # - ./srv/data:/data
      - ./test_data:/test_data:ro
      - ./entrypoint.sh:/entrypoint.sh
    entrypoint: sh
    command: /entrypoint.sh
    environment:
      MINIO_ACCESS_KEY: AKIAIOSFODNN7EXAMPLE
      MINIO_SECRET_KEY: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
```

Dockerホスト側にデータを残すならコメントアウトを削除。

### 起動

```sh
$ docker-compose up -d && docker-compose logs -f
```

## テスト

```sh
# 事前にAWS_PROFILEとか設定済みで
$ aws --endpoint-url http://localhost:9000 s3 ls
2020-10-24 20:28:10 barbucket
2020-10-24 20:28:10 foobucket
$ aws  --endpoint-url http://localhost:9000 s3 ls s3://foobucket
2020-10-24 20:21:30         11 myobject1.csv
2020-10-24 20:22:28         12 myobject2.json
$ aws s3 ls s3://barbucket --endpoint-url http://localhost:9000
$
```

実はまだ現物とは組み合わせてないですがデバッグ・テストに使用する予定。
日本人とITは相性が悪いのではないか?

※この記事は[個人ブログの記事](https://blog.monarchs.name/html/v1/post/0e45786a-6529-40ae-bc59-449f86312efa)を加筆して掲載したものです

# 日本人の「人間味」を大事にする習性

日本人には「人間味」というものを異常に信用しているところがあって、数行のコードを書けば数分で終わるような作業でも、なぜか何人月もかけて手作業で実施させた方が安心だと言ったりします

これは考えてみると不思議なことです。確かにコードによる自動化は、誤ったコードを実行するリスクはあるものの、一回うまく動いてしまえば後は絶対に間違いは起きません。一方、人の手で作業をするかぎり、ヒューマンエラーのリスクは恒久的に残りつづけます。でも日本のITの現場では、手作業の方が安心・安全だと信じて疑わない人がいます(私も実はその1人だったりします)

政治の世界でも似たようなことが起こります。法律を作って禁止すればいいものを、「お願い」とか「要請」という言葉を使って、あくまで最終的に従うかどうかの判断は、人に委ねるのです。にもかかわらず、要請に従わない人を犯罪者のように扱ったりもしますが

# 欧米圏でも「人間らしさ」を大事にする動きはある

欧米圏でも、産業革命初期の工場労働者の過酷な労働条件や、生産効率を重視するあまり粗悪品が大量に出回ったことに対して、「人間らしさ」を取り戻そうとする運動が起こりました(アーツアンドクラフツ運動など)。しかし現代日本のIT企業の場合は、むしろ非人間的で意義を見出せないような、それこそ機械にやらせればいいような単純作業に「人間らしさ」を投入して、満足している経営者がいます。公的機関の紙文化やハンコ文化なども、その一例です

# 日本人とITは相性が悪い?

日本人は「人間味」に取り憑かれた、いわば人間信者なのです(参考文献に、このことが詳しく書かれています)。この絶対的人間信者の世界に、欧米圏で発展してきた非人間的で機械的なITの仕組みを、そのまま導入しようとしても、必ずこの「人間信仰」に阻まれて失敗します

この人間信仰とITの折り合いをつけて、新たな道を切り開かなければ、日本のIT業界に未来はないのかもしれません。では現時点で希望が全くないかというと、そんなことはないです。日本人が「人間味」に取り憑かれているなら、ITの世界でも徹底的にこの人間について突き詰めればよいのです

# ITの世界で活きる「人間味」

絵文字という機能は、日本から生まれました。当時テキストか軽めの画像くらいしか転送できなかったe-mailで、とても人間らしい感情を伝える一つの発明でした。残念ながら、これを規格化して標準化したのはGoogleやFacebookでしたが、この絵文字というのは日本人的「人間らしさ」がITの世界で大成功した一例だと思います

動画の画面上にコメントを流せるようにしたのも日本人だし、151匹ものキャラクターを1つのゲームに同時に登場させたのも日本人くらいなものでしょう。日本人は、人の感情の細やかな表現とか、キャラクターの描き分けとか、そういったものをITの世界でも突き詰めて行けばよいのです



# 参考文献

* イザヤ・ベンダサン (1971) 「日本人とユダヤ人」 角川ソフィア文庫
MonacaでiOSリリースビルドを実行するまで

[MonacaでiOSデバッグビルドを実行するまで](https://qiita.com/danishi/items/f0d3329a57aa677fdc39)の記事の続きです。

基本的にデバッグビルドと手順はほぼ一緒で、App IDsはデバッグビルドのものをそのまま使います。

## 秘密鍵とCSRの生成
デバッグビルドのときと同じくMonaca IDEの「iOSビルド設定」から「秘密鍵とCSRの生成」を行います。

## CSRをApple Developer Programに登録してCER証明書を発行
Apple Developer Programから「Certificates, IDs & Profiles」を選択、プラスマークを押してCertificatesを追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96507/bcc845ab-3e50-3db2-7f7d-66ab33b947ad.png)

リリースビルドなので「iOS Distribution (App Store and Ad Hoc)」を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96507/f779313e-3376-5e2d-d275-dcf45ea9ccd4.png)

先ほど作成したCSRをアップロード

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96507/aa215d1d-b0aa-9d6a-25a8-e06c74b1a08a.png)

CER証明書が発行されるのでダウンロードします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96507/dae7bf9d-9c31-88ac-dbda-a1f320217277.png)

## プロビジョニング・プロファイルの作成
リリース用のプロビジョニング・プロファイル（Provisioning Profile）を作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96507/be9a5ce2-f445-9ae4-ab75-3208e628c180.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96507/0f462648-c549-ea68-3294-773e7482d965.png)

紐づけるBundle IDを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96507/e208c4a0-c0e1-7c95-f028-44c8cc596469.png)

紐づけるCER証明書を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96507/ce20056b-51f5-0db5-a779-a458ee6d60e9.png)

名前を付けてプロビジョニング・プロファイルを生成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96507/c11d5cdc-c170-3e91-da10-bdee73522e10.png)

生成したファイルをダウンロード。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96507/cf116d6a-eed0-9ceb-8db8-8491422421ff.png)

## ビルド・ストア提出

CER証明書とプロビジョニング・プロファイルをMonacaにアップロードします。
「証明書のアップロード」⇒「プロファイルのアップロード」の順でアップロードします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96507/c9839c39-eb78-bd3f-b050-d04c598fb0c2.png)

成功すればリリース証明書がMonacaに登録されます。

設定した証明書を選択してリリースビルドを開始します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96507/0028fa0c-8c45-cc60-383f-bdef4d88339b.png)

しばらく待ってアプリのビルドエラーがなければ、ビルド結果が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96507/6e2efa0f-7af0-2370-e664-aed91a12bf64.png)

出来上がったIPAファイルはダウンロードしてApp Store Connectの申請に使います。

---
ストア提出の流れは下記記事が分かりやすかったです。

[monacaでのiPhoneアプリのビルドとリリース 後編 2020年版](https://apps.jp.net/introduction/how-to-relase-ios-app/)
ログ解析者がAkkaをかじった結果。。。

まぢかくは、Akkaといふものをよく聞く。。。

アクターモデルを使った並行・分散システムの開発につかうらしい。

困った点
■ ScalaはJava/C++より、開発スピードが速いので、書籍のコードが動かないことがある　(*´Д｀)
■ そもそもsbtがなんのことかわからない　(*´Д｀)

akka/HelloActorというディレクトリを作る。

<pre>
$ mkdir akka
$ cd akka
$ mkdir HelloActor
$ cd HelloActor/
</pre>

sbtというコマンドを打つと、projectやらtargetのディレクトリをいろいろ生成してくれる

<pre>
$ sbt
[info] Updated file /home/flare/akka/HelloActor/project/build.properties: set sbt.version to 1.4.1
[info] welcome to sbt 1.4.1 (Private Build Java 1.8.0_265)
[info] loading project definition from /home/flare/akka/HelloActor/project
[info] set current project to helloactor (in build file:/home/flare/akka/HelloActor/)
[info] sbt server started at local:///root/.sbt/1.0/server/3d33f439f46d9c5a7961/sock
$ ls
project  target
</pre>

scalaとsbtのバージョンを調べる

<pre>
$ scala -version
Scala code runner version 2.11.12 -- Copyright 2002-2017, LAMP/EPFL
$ sbt --version
sbt script version: 1.4.1
</pre>

下記のbuild.sbtというファイルをつくる。私の環境の場合、"2.3.9"とかだと動かない。　(´Д｀)

<pre>
$ cat build.sbt 
libraryDependencies += "com.typesafe.akka" %% "akka-actor" % "2.5.23"
</pre>

コードを書く。。。

     1import akka.actor.Actor
     2import akka.actor.{ActorSystem,Props}
     3
     4class HelloActor extends Actor{
     5  def receive = {
     6    case "Hello" => println("World")
     7  }
     8}
     9
    10object HelloActor {
    11  def main(args: Array[String]): Unit = {
    12    println("Hello World!")
    13
    14    val system = ActorSystem("system")
    15    val actor = system.actorOf(Props[HelloActor])
    16
    17    actor ! "Hello"
    18  }
    19}

https://github.com/RuoAndo/qiita/blob/master/akka/HelloActor/HelloActor.scala

sbt runと入力して実行する。

<pre>
$ ls
build.sbt  HelloActor.scala  project  target
$ sbt run
[info] welcome to sbt 1.4.1 (Private Build Java 1.8.0_265)
[info] loading project definition from /home/flare/akka/HelloActor/project
[info] loading settings for project helloactor from build.sbt ...
[info] set current project to helloactor (in build file:/home/flare/akka/HelloActor/)
[info] compiling 1 Scala source to /home/flare/akka/HelloActor/target/scala-2.12/classes ...
[info] running HelloActor 
Hello World!
World
</pre>

（｀ー´）b

これで書籍のサンプルコードを参照することができるのではないだろうか。
『できるAccess2019』基本編

#はじめに
データベースの学習をスタートさせて早1ヶ月。データベース基礎、SQL基礎、と学んできて、次はAccessに入りました。インプレスさんの『できるAccess2019』に沿って学習を進めています。

本書は基本編5章、活用編5章、そして付録で構成されていました。
基本編を終えたので、気づきをまとめておきます。

基本編
第1章：Accessを使い始める
第2章：データを入力するテーブルを作成する
第3章：クエリで情報を抽出する
第4章：フォームからデータを入力する
第5章：レポートで情報をまとめる

#今年の年賀状はAccessで宛名印刷してみよう
『できる～』を読んで、まず最初に「めっちゃいいやん！」と思ったのは、この部分です。
>パソコンを使ってあて名書きや財務会計処理、販売管理などの処理をしたいときは、専用のソフトウェアやクラウドサービスを使うのが一般的です。Accessには、さまざまなデータを扱う機能があるため、専用のソフトウェアやクラウドサービスを購入しなくても、いろいろな業務に対応できます。（p22）

年賀状の宛名印刷は、6年間「筆まめ」を使っていました。送受信の履歴を残せるし、転居の履歴や家族情報等をメモできて便利だなと思っていたのですが、ソフトのバージョンが古くなってきたため、PCを買い替えたのを機に、昨年から筆まめをやめてExcelとWordで管理&印刷することにしました。
ですがその方法だと、印刷時に必要な宛名をピックアップするのに手間取ったり、情報を加工する必要があったりして、使い勝手が悪いと感じる点が多々ありました。（私のExcel＆Wordの使い方がなっていないだけかもしれませんが…。）その点をAccessだと改善できる気がします。今年は宛名印刷にAccessを利用してみようと思います。また実際に実行してみたら、Qiitaにまとめます。

#データベースファイル
p26
データベースファイルには、データの蓄積だけでなく、検索や抽出などの機能も含まれている。
データを蓄える「テーブル」
データを入力するための「フォーム」
データを抽出するための「クエリ」
データを印刷するための「レポート」
の4つがデータベースファイルの最も基本的な機能。

Accessでは、データベースファイルに含まれている機能を「データベースオブジェクト」または「オブジェクト」と呼ぶ。

#疑問：レポートはテーブルから直接作れるのか？
5章のレポート作成で、素直に本の指示に従い次々にレポートを作成していたのですが、
p173で「レポートはクエリから作る」という一言に出会いました。
ここでふと、デザインビューでは様々な指定ができるようだし、テーブルから必要な情報を直接引き出せば、クエリをわざわざ仲介させなくても良いのでは？という疑問が生まれました。
「Access テーブル　直接　レポート」等でググってみたのですが、目ぼしい答えを得ることはできませんでした。クエリで一度必要な情報をピックアップしてから、それをレポートに出力することの利便性もわかるのですが、方法として、クエリを介さずにレポート出力することができるのか？レポート作成の画面で直接テーブルから必要な情報をピックアップして配置していくことはできるのか？

「顧客テーブル」を開いた状態で「作成→レポート」とクリックしてみました。すると、レポートが作成されました。そのままだと顧客テーブルにあるフィールドとレコード全てが記載されているので、任意のフィールド/レコードを削除してみようと試してみました。

・フィールドは「選択→Delete」で削除できました。
・レコードは、「行の選択」自体ができませんでした。どこかのマス目で右クリックをすれば「行全体の選択」「行の削除」という選択肢は出てくるのですが、実際に行(レコード)を一列だけ選択したいと思っても、それはできませんでした。クリックすると、全ての行(レコード)がオレンジ色になって選択されてしまいます。選択肢にあるということは、実行できそうな気がするのですが…。

結論。テーブルから直接レポートを作成することは可能。データ全ての一覧をレポート出力したいのであればこの方法で問題ない。しかし、データを加工してからレポート出力したい場合は、一度クエリでデータを加工してからそれをレポート出力したほうが、操作がシンプル、且つ、より複雑な加工ができる。

#おわりに
基本編はAccessの操作についての説明でした。Word、Excelの操作と似た部分も多いので、Access特有のファイルの作り方や編集方法等に慣れさえすれば、扱いやすいソフトだと感じました。活用編ではリレーショナルデータベースの話も出てくるようです。『マンガでわかるデータベース』『スッキリわかるSQL入門』でこれまで学んできたことがつながっていくのだろうなとワクワクします。


#参考
・『できるAccess2019』インプレス（書籍）

#進捗記録
2020/9/15：データベースの学習スタート
2020/9/15～9/21：『マンガでわかるデータベース』オーム社 6章中1～4章（Qiita記事2本）
2020/9/22～10/9：『スッキリわかるSQL入門第2版ドリル222問付き！』インプレス 12章中1～9章（Qiita記事3本）
2020/10/19～：『できるAccess2019』インプレス
【Swift】NavigationBarの色が指定した色と違う（薄くなる）

ナビゲーションバーの色を`navigationController?.navigationBar.barTintColor`で設定した際に、設定した色と違う色になって困りました。

## 問題
#### 完成イメージ
ナビゲーションの色をメインの背景の色と同様にデザインしました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305854/6455c2b8-2059-95a3-d2ff-21961e4004a1.png" width=30%>
しかし`navigationController?.navigationBar.barTintColor`にメインの背景と同じ色を設定したところ、実際に表示されたナビゲーションは少し薄い色になってしまっていました。
#### 問題のイメージ
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305854/a51c2f5c-b5f6-a715-aac6-7e86c9d8bae6.png" width=30%>

## 解決
[NavigationBar.isTranslucent](https://developer.apple.com/documentation/uikit/uinavigationbar/1624928-istranslucent)が原因でした。
`NavigationBar.isTranslucent`はナビゲーションバーの透明度を指定する値です。ナビゲーションバーに画像を設定していない場合はデフォルトは`true`が設定されており半透明になっています。半透明にしたくない場合はこの値を`false`にすれば解決です。

**抜粋**
> If the navigation bar doesn't have a custom background image, or if any pixel of the background image has an alpha value of less than 1.0, the default value of this property is true. If the background image is completely opaque, the default value of this property is false. If you set this property to true and the custom background image is completely opaque, UIKit applies a system-defined opacity of less than 1.0 to the image. If you set this property to false and the background image is not opaque, UIKit adds an opaque backdrop.

```AppDelegate.swift
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    UINavigationBar.appearance().isTranslucent = false
    return true
}
```

## isTranslucent=falseにするとUISearchControllerが影響をうける
`NavigationBar.isTranslucent`に`false`を設定すると、ナビゲーションバーに設定した`UISearchController`にフォーカスした際に検索バーが下にズレる現象が起きます。
その際は以下の実装をControllerに記載すれば解決します。

```Controller.swift
extendedLayoutIncludesOpaqueBars = true
```
AWS CloudFormation StackSetsのセルフマネージド型を試してみた。

CloudFormationには複数のアカウントおよびリージョンのスタックを 1 度のオペレーションで、作成、更新、削除できるようにする、StackSetsという機能があります。
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/what-is-cfnstacksets.html

AWS OrganizationsでOUをきちんと組んでいる場合は、
"AWS Organizations で信頼されたアクセス"を利用できますが、
OUでなくアカウント毎にIAMロールを設定することでStackSetsを利用できる
セルフマネージド型のアクセスを試してみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257241/8fa34d62-7572-58ec-3710-cd787485ab75.png)


以下マネジメントコンソールで実行したときのメモです。（基本はドキュメント通りで動きます）
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/stacksets-getting-started.html

#①管理者アカウント(CFnスタックセットの実行元)で
AWSCloudFormationStackSetAdministrationRole
という名前のIAMロールを公式ドキュメント記載のテンプレートで作成する。

#②ターゲットアカウント(CFnスタックセットの実行先)側で
AWSCloudFormationStackSetExecutionRole 
という名前のIAMロールを公式ドキュメント記載のテンプレートで作成する。
※テンプレート作成時に”AdministratorAccountId”というパラメータの入力が求められるので
　管理者アカウントのIDを入力する

①と②で作られるロールはAdministratorAccess権限なので権限を絞りたい場合は、
IAMポリシーを作成して権限を編集する。


※管理者アカウント内のIAMユーザ毎に特定のターゲットアカウント群にアクセスさせたい場合は
　上記の名前ではないロールで作成が必要
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/stacksets-prereqs-self-managed.html
の”ターゲットアカウントへのアクセスを制御するアクセス許可を設定する”以下を参照


#③AWSマネジメントコンソールから、
”CloudFormation”を選択し、StackSetsを選択する。
ここでCloudforomationのテンプレート（Stack）を指定します。

#④StackSetオプションの設定では、
アクセス許可でセルフサービスのアクセス許可を選択し、

①で作成した、AWSCloudFormationStackSetAdministrationRoleを
IAM管理ロールに指定します。

②で作成した、AWSCloudFormationStackSetExecutionRoleを
IAM実行ロール名に指定します。

#⑤デプロイオプションの設定では

デプロイ先に
スタックをアカウントにデプロイ
を選択しアカウント番号にターゲットアカウントを指定します。

レビューで設定内容を確認後、送信を選択します。
上記でデプロイが完了します。
MMockでRESTfulなモックサーバーを作る

MMockの使用方法を簡単にご紹介
##MMockとは
**リポジトリ：https://github.com/jmartin82/mmock**

主にGo言語によって記述された、APIのmockサーバーです。

**「実際のAPIがまだ無いから、バックエンドの処理を作れない😫」**といった時に、`yml`や`json`を定義してあげることで簡単に仮のAPIを作成することができます。

##導入方法(docker-compose)
今回は環境に依存した導入方法ではなく、`docker`及び`docker compose`を使用して導入していきます。

**Dockerhub：https://hub.docker.com/r/jordimartin/mmock**

ディレクトリ構造

```
- app01/
  - mmock/
    - 200_get.yml (APIの仕様を定義したファイル)
  - docker-compose.yml
```
```docker-compose.yml
version: '3'
services:
  mmock:
    image: jordimartin/mmock:v3.0.0
    restart: 'always'
    volumes:
      - ./mmock:/config
    ports:
      - '8082:8082'
      - '8083:8083'
```
**解説**
*構造*
`config`ディレクトリ下に`yml`や`json`を保存することで、自動でサーバーに反映されていきます。今回はdocker環境で実行しているため、`./mmock`ディレクトリをマウントしています。


*ポート番号について*
MMockでは、デフォルトで8082はAPIサーバー、8083はコンソールにポート番号が割り当てられております。こちらも、ホストPCの同一ポートにポートフォワードしております。

###実際に使ってみる

`localhost:8082`でコンソールにアクセスするとこのような画面が表示され、リアルタイムでAPIへのアクセスを監視できるようになっております。
![qiita_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619992/1fcc65ab-7c98-5e59-4f07-25f8212290b1.png)


試しに以下のような`yml`ファイルを、`./mmock`下に定義してみましょう。

```200_get.yml
request:
  method: GET
  path: "/hello/*"
response:
  statusCode: 200
  headers:
    Content-Type:
    - application/json
  body: '{"hello": "{{request.query.name}}, my name is {{fake.FirstName}}"}'
```

<br>
この状態で、`localhost:8083/hello?name=john doe`を叩くと、
![qiita_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619992/d856633a-bd00-0349-582e-72edeb727094.png)
一般的なAPIと同様、リクエストに応じたレスポンスを返してくれます。

ちなみにコンソール側にはこのように表示されます。リクエスト、レスポンスの内容を詳細に確認出来ますね。
![qiita_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619992/34f61c87-33d4-daf5-31ab-cdee62ab640d.png)



基本的な機能は以上となります。
Node.js Express4 でエラー "request entity too large" 発生時の対応法

# 現象

Node.js + Express4 で Request body に JSON 形式の大量のデータ(100kb以上)を添付すると、
HTTP Response で 400 Bad Request , error: "request entity too large" が発生した。

発生時環境：
* Node.js 12.19.0
* TypeScript 4.0.3
* express 4.17.1

（プロジェクトは express-generator-typescript 1.7.1 で作成）


# 解決策

Express の初期設定時に、下記のように Request body size の上限を大きく設定する。

```typescript:Server.ts

app.use(express.json({ limit: '100mb' }));
```

# 原因

Express 4 の Request Body サイズ上限のデフォルト値が 100kb であるため。
（ [Express](https://expressjs.com/ja/api.html#express) の API リファレンスに記載されています。）


# 謝辞

こちらも参考にしました。（ですが、執筆時では middleware の body-parser の設定を変更する必要はありませんでした。）
* https://qiita.com/PianoScoreJP/items/3fbcebc43ebf821074d8
* https://qiita.com/Safire/items/dee77bf01fe35deb1535

# 補足

上記の解決策は、 Request body の Content-Type が JSON の場合の対応ですが、
raw データを受信する場合は、

```typescript
app.use(express.raw({ limit: '10gb' });
```

url-encoded データを受信する場合は、

```typescript
app.use(express.urlencoded({ limit: '100tb' });
```

のように設定すれば良いようです。（これらは未確認）
詳細は、[Express](https://expressjs.com/ja/api.html#express) の API リファレンスを参照してください。
また、指定可能な補助単位(k,g,t, etc.) は[bytes](https://www.npmjs.com/package/bytes)を参照してください。
TypeScript+Reactでモダンな環境に入門してみる

業務ではJava+SpringBoot、jQuery等しか使ったことがないエンジニアです。
TypeScript+Reactを学ぶ過程を記録として残していきます。
あとから来る人の参考の１つとしてハマったところも書いていければと。

## 概要

この記事では、TypeScript+Reactで開発するためのローカル環境を構築するところまでやります。
後々のことも考えて、anyenv+nodenvで環境をつくっていきます。
筆者の環境は以下に記載しておきます

- macOS Catalina 10.15.7
- node.js
- TypeScript
- React

## anyenvとnodenvのインストール
JavaScript(TypeScript)のパッケージ管理システムとしてyarnを使うためにNode.jsをインストールします。今後、場合によってはバージョンの違うNode.jsを使う可能性もあるため、バージョンマネージャを使います。
今回は他の言語(pyenvなど)のパッケージマネージャもまとめて管理できるanyenvを使って、Node.jsのバージョンマネージャであるnodenvを入れていきます。

```shell
// Homebrewを使ってanyenvをインストールする
brew install anyenv

// ご自身が使っているシェルに合わせて設定ファイルにanyenvの設定するコマンドを追記する
echo 'eval "$(anyenv init -)"' >> ~/.bash_profile

// 起動中のシェルに再ログインしてanyenvを有効化する
// exec・・・現在のプロセスを上書きしてコマンドを実行
// $SHELL・・・現在起動中のシェルのパス
// -l・・・bashのオプション。ログインを意味する
exec $SHELL -l

// anyenvコマンドでnodenvをインストールする
anyenv install nodenv

// シェルを再起動
exec $SHELL -l
```

## Reactプロジェクトを作成
プロジェクトを作成したいディレクトリにて下記コマンドを実行します。

```
// npx・・・npmパッケージで提供されているコマンドを実行するコマンド
// create-react-app・・・React用のテンプレートプロジェクトをいい感じにつくってくれるコマンド
// --template typescript・・・TypeScriptでReactのプロジェクトを作成するオプション
npx create-react-app <プロジェクト名> --template typescript
```

## Reactプロジェクトを起動

`create-react-app`で作成したプロジェクトを起動します。
コマンドが正常に完了すると以下のようなメッセージが表示されるのでそのとおりに実施すればOKです。

```
We suggest that you begin by typing:

 cd hello-world
 yarn start

Happy hacking!
```

以下のような画面が表示されれば成功！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63564/4ec896ac-2f8f-d5ea-0fca-088a41647ba6.png)



## 参考
- [りあクト！ TypeScriptで始めるつらくないReact開発 第3版【Ⅰ. 言語・環境編】](https://booth.pm/ja/items/2368045)
- [exec $SHELL -l でシェルが再読込されるしくみ](https://shinkufencer.hateblo.jp/entry/2018/11/22/233000)