OmniAICreator/Qiita-1.07M huggingface dataset:
Oculus Link が使用できない時に試すこと

# はじめに

2020/06/07 時点で手元にてある程度動作確認できた方法になります。
※以降「Oculus アプリ」とは、PC側のアプリケーションのことを指します。

# 問題

PC 側は「Oculus Quest」を認識するが、PCの「Oculus アプリ」が「Oculus Quest」を認識せず、「Oculus Link」が使用できない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252342/4335ca82-7f4b-56e6-b423-1697958ef6cb.png)


# 環境
OS: **Windows 10 HOME**
Oculusアプリバージョン: **17.0.0.183.462 (17.0.0.183.462)**
OculusQuestバージョン: **17.0.0.267.462.21448356**
使用ケーブル: **Oculus Quest 購入時に付属していたケーブル**

# 手順

1. PC と Oculus をケーブルで接続する
PC が Oculus を認識できていることを確認する。
※「音声の出力先として Oculus が選択できるようになっている」等で確認することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252342/9a2dc21e-4f72-7d3b-e0f0-f7862eb7ad24.png)

2. ケーブルを繋いだまま Oculus を再起動する

3. PC が Oculus を再度認識できたことを確認する

4. 「Oculus アプリ」を起動する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252342/68ebe560-606b-4e93-8fe3-06b052419c8b.png)


5. oculus-driver.exe を起動する
`c:\Program Files\Oculus\Support\oculus-drivers\oculus-driver.exe.` を起動することで、「Oculu アプリ」が再起動する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252342/73dc27cb-bca9-7263-662f-8795cb46143d.png)


6. 「Oculus アプリ」が Oculus を認識できていることを確認する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252342/a2edfbdd-3358-c6bc-2088-527440711200.png)


# 参考
> My computer won't recognize Oculus Link when it's connected.
-> If your 're having trouble getting your computer to see or recognize Oculus Link: try reinstalling the update on your computer. You can do this with the Oculus driver file, which can be found using the following path: c:\Program Files\Oculus\Support\oculus-drivers\oculus-driver.exe.
https://support.oculus.com/572216283519517/

# さいごに
結構悩みました。
いずれサッと指したらサッと繋がるようになるって信じてます。

自環境でしか検証できていないため、各環境で試した結果をここのコメント欄か [Twitter](https://twitter.com/tktcorporation) にコメントいただけるとありがたいです。
タイトル不明（自分用用語）


**カプセル化**
オブジェクトの情報を隠蔽することによって、不整合を引き起こすような操作をできなくされる仕組み。
**カプセル化のイメージ**
元々の意味は、オブジェクトやデータをカプセルのように保護するということらしい。
**カプセル化のメリット**
・オブジェクトのデータが外からチョア苦節変更されることを禁止
・アクセス指定子によってカプセル化するかしないか決められる
・カプセル化されているデータはクラス内の関数によって変更できる
そもそもカプセル化の狙いは・・・**「データの保護」**
※データの変更をオブジェクト自身に任せることによって、バグ（不整合）を引きお起こさせないようにする。

**継承**
あるクラスを引継ぎ、新たなクラスを作成できる機能。
※一度使ったオブジェクトの要素と操作を引き継げること

###ポリモーフィズム(多態性）

(ポリ(多くの)、モーフィズム(変化))⇒直訳で多くの変化が可能になる⇒多様性

モノがそのモノらしく振舞うこと
例：
？は「？？」と鳴く。
(犬、猫、カラスがいたとします)
この3匹はどのように鳴くでしょう？

・犬は「わん」
・猫は「にゃー」
・カラスは「カー」
と鳴く。
これをプログラミングに置き換えると・・・
クラス　犬　｛鳴く()｛ "わん" ｝｝;
クラス　猫　｛鳴く()｛ "にゃー" ｝｝;
クラス　カラス　｛鳴く()｛ "かー" ｝｝;
それぞれの鳴き声をこのように表してみた。

そして上にある「？は？？と鳴く」という風に表すための関数に直す
犬.鳴く()；
猫.鳴く()；
カラス.鳴く()；
と書くことが出来る筈。
それを・・・実行すると
犬.鳴く()⇒”わん”
猫.鳴く()⇒”にゃー”
カラス.鳴く()⇒”かー”
と実行されるはず・・・

その際にポリモーフィズムを利用した書き方
動物 = { 犬,猫,カラス};
for (動物) { 動物.鳴く(); }
かな。

動物に犬、猫、カラスが入って、鳴き声という関数を呼ぶ。

ここで、考えるにあたって、どの動物に対しても鳴くという処理が
同じ動作しかできないのであれば、この構文は使えないということ。

その為、「中に入るものによって同じ関数でも違う処理を行える」
という特徴があるそういう多様性が求められる。
ポリモーフィズムのメリット
・コードがきれいになる(場合によっては記述量が減る)
・プログラムの変更に強くなる柔軟性


###クラス
オブジェクトを作るための設計図のようなもの。

インスタンス：設計図に求められた実体

###インターフェース(何かと何かの間をつなぐ部分)
アプリを使うときの操作画面は、アプリと人を繋ぐ部分なので「ユーザーインターフェース」と呼ばれている。
なので、何かと何かの橋渡しをしてくれる仲介役と理解しよう。
インターフェースでは実装が良く書かれている・・・「機能とかを新しく追加する」でＯＫ！！

・インターフェースを使えばメソッドの実装を強制できる！！
Ｃ＃でのインターフェースは「クラスを作った人」と「そのクラスを使う人」の間で、使い方の
約束事を決めることができる仕組みの事を言います。

では、抽象クラスとの違い
「抽象クラス」は「抽象メソッド」を1つ以上含むクラスです。
そして、「抽象メソッド」は継承先でのオーバーライドを強制する仕組み。

インターフェースの作り方のルール
・名前の先頭に「Ｉ」をつける
・メソッドの中身は何も書いてはいけない。
※返り血の型や、引数は指定しても大丈夫。

**メンバ変数**
クラスの中で宣言されている変数

**メンバ関数**
メンバ変数と同様クラスの中で宣言されるメソッド。


**コンストラクタ**
初期化を行う為の関数またはメソッドの事。
・コンストラクタ名はクラス名と同じにする必要がある。
・コンストラクタに引数を渡すときは、インスタンスを生成する際に値を指定。


**静的クラス（static）**
インスタンス化できないクラスで、静的メンバーのみを含めることができる。

**部分クラス(partial)**
１つのクラス定義を複数個所に分けて記述できる仕組み。
クラス定義の一部を自動生成する場合などに、自動生成部分をpartialで分離
することにより、自動生成を再実行しやすくするといった使い方。

**ジェネリクス型の型パラメーター**
型パラメーターを利用することで、クラスを定義する際にプレースホルダー型を提供し、
そのクラスを利用する際位に実際の型を指定できる。
汎用的に使えるクラス・インターフェース・メソッ度などを定義できるのでジェネリクスと呼ばれ
基本クラスライブラリでもList<T>ｋるあすなど主にコレクションで多用されている。

型パラメーターはwhereキーワードで制約を課すことが出来る。classもしくはstructで参照型もしくは
構造体である成約を課したり、指定したクラスを継承したクラスという制約を課したりできる。
また、new()制約により「publicな引数なしのコンストラクターを持つ」という制約を課すことで、
型パラメーターに指定したクラスをコンストラクターで呼び出しでインスタンス化することもできる。
Eclipse（Java）のダウンロードとインストール(Mac版)


最初に、Pleiades-Eclipse,IntelliJなどの日本語化プラグインのサイトをクリックします。

<img width="1241" alt="スクリーンショット 2020-06-07 22.22.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/451004/15a3122b-b822-bf3d-d8de-938300b36967.png">


クリックしたら、この画面に行きます。最新のEclipse2020をクリックします。

<img width="1249" alt="スクリーンショット 2020-06-07 22.22.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/451004/bb62b17f-c34b-e75b-1aa1-11423a341e5a.png">

その次に、Mac 64bit, full Editionをクリックします。

<img width="1271" alt="スクリーンショット 2020-06-07 22.23.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/451004/80c896a8-2dcb-71f8-9bec-bff4afbb6e98.png">

ダウンロードが完了すると、pleiades-e4.4-java-64bit-jre_2020-03.zipというファイルがダウンロードフォルダにできています。

インストール
pleiades-e4.4-java-64bit-jre_2020-03.zipを展開する事で、インストールを行えます。

ショートカットは作成できないので、「インストールしたフォルダ¥pleiades¥ecripse¥ecripse.exe」のショートカットをデスクトップに作成します。
【SQL】最初に覚えるSQLの話


# はじめに

この記事では
SQLを学習する上で最初に学ぶべきことを
まとめた記事です。

--------------------------------
# キッカケ
先日、新卒が入社されまして
業務説明をしたのですが

思ったよりSQLを知らないという人が
多いことに驚きました。

サーバやネットワークを
学習されていたそうなんですが  

データベースは必要にならないと
学習しないということに気づきました。

--------------------------------
# SQLとは

Structured Query Languageの略
よくプログラミング言語と勘違いされるが
厳密には**問い合わせ言語**の一種である。

ちなみにwikiでは
> 国際標準の規格票内では「SQLは何かの略語ではない」と言明がある  

と書かれている。

--------------------------------
# 何から覚えるか
内部結合や外部結合、グループ化、case文 ...etc

色々あるけれどまずは一つのテーブルから
条件絞って選択するところからだと思う。

--------------------------------
# 例題

例えば、こんなテーブルが存在するとき

メニュー表

|メニューID|メニュー名|値段|
|:---|:--|:--|
|001|カレーライス|350|
|002|ラーメン|450|
|003|餃子|120|

メニューIDを条件にしてメニュー表テーブルから
カレーライスを取り出すSQLを書いてください。

--------------------------------
# 回答例
こういった感じにパッと答えられると
教える側としては回答者の実力にとても可能性を感じます。

```
  SELECT  
    メニューID,  
    メニュー名  
  FROM メニュー表  
  WHERE メニューID='001';
```

ここでさらに踏み込んで
・文は大文字書くべきか
・出力するカラムは取得したいカラムだけで良いか

などそういう細かいところまで議論できるようになると
「あ、この人お願いしたらできそうだな」って
教える側はそう思います。

--------------------------------
# どう学んだら良いか
実をいうと私は仕事で  
AccessDBやPostgresを使うようになってから
SQLを使うようになり  
それで覚えるようになりました。

そんな私からオススメしたいのは
**Progate**のSQLコース
これの第二章まで普通にクリアできれば
正直なところ準備完了って感じはする。

他にも[「スッキリわかるSQL」](https://www.amazon.co.jp/スッキリわかるSQL入門-第2版-ドリル222問付き-スッキリシリーズ-中山清喬/dp/4295005096)
などが読みやすくてオススメです。


--------------------------------
# さいごに

人に教えるためにもっと真剣に
SQLとDB技術に対して勉強しようと思いました。

そろそろデータベースを業務で
扱って３年になるので
スペシャリストになるついでに
たっぷり復習しようかしら。

--------------------------------

# おわり
C++ ATL 14.00 CComHeapPtr<T>は譲渡非対応→対処クラス

**ATL (Active Template Library) version 14.00の`ATL::CComHeapPtr<T>`は譲渡非対応**です。関数の戻り値に指定すると通常はコピーコンストラクタが存在しないのでコンパイルエラーが発生しますが、なぜかエラーが発生せずに保持するメモリを解放してダングリングポインタを持つコピーを返すことがありました。

同じATLクラス、それも`ATL::CComHeapPtr<T>`の基底クラスである`ATL::CHeapPtr<T>`は非const参照のコピーコンストラクタによる譲渡を実装しているため気づくまで時間がかかりました。

現状の`ATL::CComHeapPtr<T>`はバグの原因となるため、非const参照のコピーコンストラクタおよびムーブコンストラクタを実装した次の`CComHeapPtr2<T>`の使用を推奨します。

```cpp
#include <atlbase.h>

using namespace ATL;

// CComHeapPtrに非const参照のコピーコンストラクタとムーブコンストラクタを追加したクラス
template <typename T>
class CComHeapPtr2 :
    public CHeapPtr<T, CComAllocator>
{
public:
    CComHeapPtr2() throw()
    {
    }

    explicit CComHeapPtr2(T* pData) throw()
        : CHeapPtr<T, CComAllocator>(pData)
    {
    }

    CComHeapPtr2(CComHeapPtr2& p)
        : CHeapPtr<T, CComAllocator>(p)
    {
    }

    CComHeapPtr2(CComHeapPtr2&& p)
        : CHeapPtr<T, CComAllocator>(p)
    {
    }
};
```

- ムーブコンストラクタがない場合、STLコンテナクラス（`std::vector`や`std::list`）の`push_back`でconst参照のコピーコンストラクタが見つからずに想定外の動作が発生します（ないはずのconst参照のコピーコンストラクタが呼び出されてダングリングポインタが発生します）。`push_back`はムーブコンストラクタに対応しているため、ムーブコンストラクタを定義すれば`std::move`でそちらを呼び出せます。
  - `IShellFolder`の`EnumObjects`で取得した`LPITEMIDLIST`を管理するときに上記のバグが起こると大惨事です。
Live2DモデルのリップシンクでGainが小さすぎる問題への対応

# TL;DR
Live2DをUnityに入れて口パクを適用してみたら、意外と口の動きが小さくて困っている…というケースへの処方箋について書きます。
Live2D SDKに変更を加え、リップシンクのGainの最大値を100にあげることで解決します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196069/9c07f65f-27de-3cab-8c70-438298ef7d58.png)

# 環境
- Unity 2019.1.1f
- Live2D Cubism 3.x系
- Live2D SDK 4-beta.2
- Mac OS Catalina

# 対処法
1. Cubism SDK内部の`CubismAudioMouseInput.cs`を開きます。

```C#:CubismAudioMouseInput.cs
namespace Live2D.Cubism.Framework.MouthMovement
{
    /* 中略 */

    /// <summary>
    /// Audio gain.
    /// </summary>
    [Range(1.0f, 10.0f)]
    public float Gain = 1.0f;

    /* 中略 */
    // Compute root mean square over samples.
    var rms = Mathf.Sqrt(total / Samples.Length) * Gain;
```

2.上記の`[Range(1.0f, 10.0f)]`を変更し、`[Range(1.0f, 100.0f)]`とします。
Inspector上で下記のようになればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196069/9c07f65f-27de-3cab-8c70-438298ef7d58.png)
3.Inspector上からGainの値を色々いじって100などに変更し、LipSyncがどう動くか確認してください。`AudioInput`の音量に対して、口パクがより鋭敏に反応するようになったことが確認できればOKです。
Swiftの返り値ありの関数で処理が1行だけならreturnは要らないらしい

# はじめに

最近Swiftを始めたが、関数の返り値で納得がいかないところが有ったので
少し検証してみました。
間違っていたら教えてください。

## 疑問に思ったこと

前提として
Swiftの入門で関数の返り値がありの時はreturnを書かないとエラーが出ると教わった

しかし、swiftUIのチュートリアル中に下記の記載が有った。

~~~swift
func makeUIView(context: Context) -> MKMapView {
    MKMapView(frame: .zero)
}
~~~

あれ？　おかしいな。返り値が指定されているのにreturnで返してないぞ？

私の思う正しい記載方法はこちらです

~~~swift
func makeUIView(context: Context) -> MKMapView {
    return MKMapView(frame: .zero)
}
~~~

## 最初に思ったこと

ハハーン、これはRubyでやったことあるぞ！
最後の処理の結果を返すやつだな！

## ということで検証してみた

### 1. 関数内に処理なし

~~~swift
func test(str: String) -> String {

}

var str = test(str: "test")
print(str)
~~~

結果：エラーが出力された
> Missing return in a function expected to return 'String'

### 2. 関数内に1行だけ処理を書いてみる

~~~swift
func test(str: String) -> String {
    str + "です。"
}

var str = test(str: "test")
print(str)
~~~

結果：処理の結果を取得した。
> testです。


### 3. 関数内に２行分処理を書いてみる

~~~swift
func test(str: String) -> String {
    let ret: String
    str + "です。"
}

var str = test(str: "test")
print(str)
~~~

結果：エラーが出力された
> Missing return in a function expected to return 'String'; did you mean to return the last expression?


### 4. 関数の最後に値を返したい変数のみ書いてみる

~~~swift
func test(str: String) -> String {
    let ret = str + "です。"
    ret
}

var str = test(str: "test")
print(str)
~~~

結果：エラーが出力された
> Missing return in a function expected to return 'String'; did you mean to return the last expression?


## 検証結果から推測

1. 処理が1行しかない場合は処理結果を返してくれる。
2. 処理が2行以上ならreturnを付けないとエラーが出る。
3. rubyとは違い、処理の最後を返してくれるわけではない。


# 最後に

まだ公式リファレンスにも目を通していないにわかswift使いなんで
先輩方はxxx見たら一発でわかるだろボケ! 
と罵ってください。
P5.js 日本語リファレンス(loadImage)

このページでは[「P5.js 日本語リファレンス」] (https://qiita.com/bit0101/items/91818244dc26c767a0fe) の loadImage関数を説明します。

## loadImage() 

### 説明文

パスから画像を読み込み、そこからp5.Imageを作成します。

画像をすぐにレンダリングできない場合があります。画像を処理する前に画像の準備が整っていることを確認するには、loadImage() の呼び出しを preload() に配置します。画像の準備ができたときに画像を処理するためのコールバック関数を提供することもできます。

画像へのパスは、スケッチでリンクするHTMLファイルからの相対パスである必要があります。ブラウザの組み込みセキュリティにより、URLまたはその他のリモートロケーションからの画像のロードがブロックされる場合があります。

### 構文

loadImage(path, [successCallback], [failureCallback])

### パラメタ

- path  
String：ロードする画像のパス

- successCallback  
Function(p5.Image)：画像が読み込まれた後に呼び出される関数。 p5.Imageが渡されます。 (オプション)

- failureCallback  
Function(Event)：画像の読み込みに失敗した場合、イベントエラーで呼び出されます。 (オプション)

### 戻り値

p5.Image：p5.Imageオブジェクト


### 例1

```javascript
let img;
function preload() {
  // URLでパスを指定
  img1 = loadImage('https://dl.dropbox.com/s/w17l97yl5jrcelh/mountain.png?dl=0');

  // 相対パスを指定
  img2 = loadImage('./assets/mountain.png');
}

function setup() {
  createCanvas(500, 500);
  
  image(img1, 0, 0);
  image(img2, 0, 200);
}
```

### 実行結果
https://editor.p5js.org/bit0101/sketches/SHw3cbfVE


### 例2

```javascript
let img;
function setup() {
  createCanvas(400, 400);

  // コールバック関数を指定します。(画像ロード後に callBackFunc() を呼びます)
  img = loadImage('./assets/mountain.png', callBackFunc );
}

function callBackFunc() {
  image(img, 0, 0);
}
```

### 実行結果
https://editor.p5js.org/bit0101/sketches/75q65UKRj


### 著作権

p5.js was created by Lauren McCarthy and is developed by a community of collaborators, with support from the Processing Foundation and NYU ITP. Identity and graphic design by Jerel Johnson.

### ライセンス

Creative Commons(CC BY-NC-SA 4.0) に従います。
【AWS EC2】ログイン用の秘密鍵を無くした場合の対処法〜スクリーンショット付きバージョン〜

#はじめに
AWSのEC2ログイン用の秘密鍵をなくしてしまい、ログインできなくなってしまった。
[AWS EC2ログイン用の秘密鍵を無くした](https://qiita.com/nntsugu/items/1bcb9810c8a2cc6985b3)をもとに、何とかログインできた。しかし説明が文字だけであったり、一部おそらく貼り付けミスで重複している箇所があったため、本稿でスクリーンショットを載せつつ改めて説明したいと思う。

#概要
[AWS EC2ログイン用の秘密鍵を無くした](https://qiita.com/nntsugu/items/1bcb9810c8a2cc6985b3)内で
①新しいKey Pairを作り
②秘密鍵を無くしたEC2インスタンスのAMIを作って
③AMIからEC2インスタンスを作成する際に、新しいKey Pairを適用する

とあるがもう少し噛み砕きつつ、理由を説明すると
①秘密鍵は復元できないため、新しい秘密鍵を作る必要がある。
②AMIとは「Amazonマシンイメージ」の略。同じ設定で複数のインスタンスが必要な場合は、1つのAMIから複数のインスタンスを起動できる。既存のEC2インスタンスを別の秘密鍵をつけることができないため、同じ設定のEC2インスタンスのAMIを新たに作成する。
③取得したAMIから新しいEC2インスタンスを作成し、新しい秘密鍵に適用する。

#①新しい鍵の作成

サービスを押し、EC2を選ぶ。<img width="1212" alt="スクリーンショット 2020-06-14 15.08.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/6ea6c4c6-ffd2-d34e-4a57-a47be8e3b2da.png">


ネットワーク&セキュリティ内のキーペアを選択後、キーペアを作成をクリック。
<img width="1221" alt="スクリーンショット 2020-06-14 15.08.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/bfdfba0b-bf6f-7f77-5b37-012a128754c8.png">


名前を入力し、適切なファイル形式を選択し、キーペアを作成する。
<img width="1206" alt="スクリーンショット 2020-06-14 15.09.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/97cd5e11-6060-473c-c0b4-baf2a908b021.png">


#②無くした鍵を使用しているEC2インスタンスのAMIを作成
EC2のインスタンス内のインスタンスをクリック。
<img width="1154" alt="スクリーンショット 2020-06-14 15.09.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/7cd8603c-3ee0-57a8-8ca0-26ca03254fa2.png">


対象のEC2インスタンスを右クリックし、イメージ内のイメージの作成をクリック。
<img width="1177" alt="スクリーンショット 2020-06-14 15.09.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/e2b39ce9-5e7b-dc88-2e57-11936086aaf5.png">



適切な内容を選択し、イメージの作成を行う。
<img width="1211" alt="スクリーンショット 2020-06-14 15.10.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/c016415a-cbcd-4624-351b-8e03cbaae627.png">


#③取得したAMIから新しいEC2インスタンスを作成し、新しい鍵を適用
EC2のイメージ内のAMIをクリック。そして対象のAMIを選択し、起動をクリック。あとはEC2を作成した時と同じように適切な設定をした上で、EC2インスタンスを作成する。その際、新しい秘密鍵を適用する。
<img width="1216" alt="スクリーンショット 2020-06-14 15.10.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/41f09b7f-7f29-be1b-3bb8-4cfdb7218920.png">
【Rails・MySQL】データベース論理名の設定について

# データベース論理名の設定について
今回は（contacts[お問い合わせ]テーブルを例に説明）

### 目次
1. 物理名・論理名について
2. 論理名を設定するにあたって
3. 論理名の設定

## 1. 物理名・論理名について

#### 物理名
コンピュータが認識している実際の名前
例：[contacts]テーブル

#### 論理名
人間が認識できるように設定した名前（呼び名）
例：[お問い合わせ]テーブル


## 2. 論理名を設定するにあたって
大規模のプロジェクト開発では、テーブル数が100以上となったり、1テーブルにカラム数が数十個存在するという状況があります。これだけ数が多いとテーブル・カラムを探したり、他のメンバーについて説明を行うことが非常に手間となったりします。英語表記（**物理名**）だけであると、英語の意味を理解できていない場合、検索をしなければなりません。
日本語表記（**論理名**）があると少し楽なんだけど...（簡単に設定できました！）

## 3. 論理名の設定
contacts[お問い合わせ]テーブルを例に説明をしていきます。
以下コマンドでマイグレーションファイルを作成します。

```
rails g model contact
```

作成されたマイグレーションファイルにテーブル・カラム情報を記載していきます。

```db/migrate/xxx_create_contacts.rb
class CreateContacts < ActiveRecord::Migration[5.0]
  def change
    create_table :contacts do |t|
      t.string :name_sei,      null: false, default: ''
      t.string :name_mei,      null: false, default: ''
      t.string :name_sei_kana, null: false, default: ''
      t.string :name_mei_kana, null: false, default: ''
      t.string :sex,           null: false, default: ''
      t.string :age,           null: false, default: ''
      t.string :email,         null: false, default: ''
      t.string :introducer,    null: false, default: ''
      t.text   :content
      t.timestamps
    end
  end
end
```
このままマイグレーションファイルデータベースに反映させてしまうと論理名を設定することができません。

**論理名を設定していない場合**
![before.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617435/02df6e96-f8b6-c54e-ba60-9026fb7bbdd7.png)

マイグレーションファイルに論理名を設定し、テーブル・カラム情報を記載します。

```db/migrate/xxx_create_contacts.rb
class CreateContacts < ActiveRecord::Migration[5.0]
  def change
    create_table :contacts, comment: 'お問い合わせ' do |t|
      t.string :name_sei,      null: false, default: '', comment: '姓'
      t.string :name_mei,      null: false, default: '', comment: '名'
      t.string :name_sei_kana, null: false, default: '', comment: '姓カナ'
      t.string :name_mei_kana, null: false, default: '', comment: '名カナ'
      t.string :sex,           null: false, default: '', comment: '性別'
      t.string :age,           null: false, default: '', comment: '年齢'
      t.string :email,         null: false, default: '', comment: 'メールアドレス'
      t.string :introducer,    null: false, default: '', comment: '紹介者'
      t.text   :content                                , comment: '内容'
      t.timestamps
    end
  end
end
```
以下コマンドを実行し、マイグレーションファイルを反映させます。

```
rails db:migrate
```
すると以下のようにコメント部分に論理名が設定されます。

**論理名を設定した場合**

![after.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617435/b50206f4-350b-de1f-fa82-8e60b867ff3e.png)

論理名を設定することにより、データベースの閲覧・チームメンバーとの共有を効率的にすることができます。
以上でデータベース論理名の設定についてになります。
インクリメント演算子、デクリメント演算子

単体ではさほど難しくはないけど、束になってかかってくるとややこしいのでまとめです。

#インクリメント演算子、デクリメント演算子とは

- インクリメント「++」・・・変数の値に1を加算する
- デクリメント「--」・・・変数の値に1を減算する

#前置と後置

## 前置・・・先に演算してその結果の値を代入する

### 例
int a = 5
int b = ++a      
↑aに1を加算してからbに代入（b=6、a=6）

## 後置・・・値を代入してからあとで演算する

### 例
int a = 5
int b = a++      
↑bに代入してからaに1を加算（b=5、a=6）

#ややこしい計算の例

int a=5
int b = a++ + ++a + --a - a-- -a

とかやると
b = 5 + 7 + 6 - 6 - 5

となり、答えは7
Gmailの複数アカウント対策

# 概要

gmailの特殊な仕様と複数アカウント対策をまとめます。

# 前提知識

WEBメールの仕様として、メールアドレス以下のような構成になっています。

```
ユーザー名@ホスト名
```

# gmailの仕様

以下のメールアドレス送信したメールは、gmailの仕様により**`example@gamil.com`**に届きます。

- 1) ユーザー名の大文字小文字は区別されない

**`EXAMPLE@gmail.com`**

- 2) ユーザー名のエイリアスが使える(+から後ろ)

**`example+qiita@gmail.com`**

- 3) ドットは無視される

**`ex.am.ple@gamil.com`**

- 4) ホスト名は、"gmail.com" "googlemail.com"はどちらも使える

**`example@googlemail.com`**

- 要するに

こんなメールアドレスでも送信先は同じです

**`E.x.A.m.P.l.E+qiita@googlemail.com`**

# 問題点

どんなメールアドレスでも登録できてしまうサービスを作ってしまうと

1つのメールアドレスで複数のアカウントが作れてしまいます。

# 対策

ユニークなアドレスをチェックすることで対策します。
以下のコードは、gmailだけチェックするようになっています。

```python:python3
#!/usr/bin/env python3
# coding: utf-8
import re

# メールアドレスを指定
mail_address = 'E.x.A.m.P.l.E+qiita@googlemail.com'

# メールアドレスを分解
user_name,host_name = mail_address.split('@')

# メールアドレス変換処理
if host_name in ['gmail.com','googlemail.com']:
    user_name = user_name.lower() # 小文字に変換
    user_name = re.sub('\\.', '', user_name) # .を削除
    user_name = re.sub('\\+.*', '', user_name) # +エイリアスを削除 
    host_name = 'gmail.com' # gmail.comに統一

# ユニークなアドレスを特定
unique_gmail = user_name+'@'+host_name
print(unique_gmail) # example@gamil.com

# メールアドレスのチェック
# (ここに処理)
```

### 終わり
sort

brilliantのalgorithm, fundamental algorithm, data strucutureのざっくりまとめ
https://brilliant.org/daily-problems/

関数を作るときに、コードの書き方（データのしまい方、扱い方）によって早くなったり、
メモリ消費を抑えられたりできる。どうやってコンピューターに命令していくのか。
そもそもの仕組み・考え方

sort（insertion sort, merge sort, quicksort, radix sort)
dataのsortにはいくつかの方法がある。どんなデータを扱うかなどの状況に応じて使い分ける。

##insertion sort
https://brilliant.org/practice/insertion-sort-2/?p=2
ソートされてないところからソートされているところに挿入する。 0(n^2）)

##merge sort
https://brilliant.org/practice/mergesort-2/?p=5
二つに分けてソートしていく。O(nlogn) n回2つに分けて検索 (logn))

##quicksort
https://brilliant.org/practice/quicksort-2/?p=2
一個pivot pointを決める。その左側にあるpivotより大きな数字と、右側にある小さな数字を入れ替える
※ちょっとややこしいので割愛。
【AWS/Cloud9】Cloud9の環境が開かない場合の対処法

# 事象
Cloud9にて自身の環境を開こうとすると

>「This is taking longer than expected. If you think there might be an issue, contact AWS Support. It might be caused by VPC configuration issues. Please check documentation.」

上記のエラーメッセージがで、環境を開くことができなくなった。
同じエラーに遭遇した人はまず下記の記事を読むことをお勧めします。

https://qiita.com/Atsushi_/items/b38c18feac4708164696
https://qiita.com/somarihair/items/759d525153ae68ce4a7f

上記2記事のように再起動をしても解決しない場合、かつ**インターネットゲートウェイを消した覚えがある人**は
下記を見ていただくと解決する(かもしれません)。

## 原因
Cloud9が使用していたEC2サーバーの所属しているVPCのインターネットゲートウェイを削除してしまい、
ルートテーブルのルートのステータスが「blackhole」になっていたため。

# 対処法
https://go-journey.club/archives/12101
上記の記事を参考にし、下記を行なった。

1.ルートテーブルから既存の「0.0.0.0/0」のルート(ステータスがblackholeになっている。)を削除
2.新規ルートテーブルを作成する
3.2で作成したルートテーブルをメインにする
4.旧ルートテーブルを削除する
5.2で作成したルートテーブルをVPCにアタッチ
→アタッチする際は「EC2サーバーが所属しているVPC」にアタッチする。
6.EC2サーバーを停止させる
7.停止終了後、Cloud9に再度アクセス

以上です。
[光-Hikari-のPython]05章-06 制御構文（内包表記の基礎）

#[Python]05章-06 内包表記の基礎
まず、以下のプログラムを見てください（プログラムを作成する必要はありません）

```.py
L = []  #空リストLを作成する
print(L)  #Lの要素を出力

for i in range(10):
    L.append(i)  #appendメソッドで、リストLに要素を追加

print(L)
```
＜実行結果＞
><font color="#090" bgcolor="black">【実行結果】</font>
[]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

簡単に説明すると、空のリスト**L**を作成し、いったん空のリストの要素を**print関数**で出力しています。（もちろん空ですが）
そして、for文内に移動し、**appendメソッド**を用いて**L**の要素を1つずつ追加していきます。（appendメソッドは以前説明しました。）

最後にprint関数で要素の中身を出力しています。

しかし、この処理を1行で出力させることもできます。その方法として**内包表記**がありますので、説明していきます。

##内包表記によるリスト作成
内包表記にはいろいろあるのですが、おおよそ以下の記載方法で記載します。

```.py
[変数による計算結果 for 変数 in for 繰り返し対象]
```

「変数による計算結果」と記載しているのには理由はありますが、後ほど説明します。
まずは、実際に先ほどの上記のプログラムと同じ処理内容を、内包表記で記載してみましょう。今回は**Python Console**から以下のコードを入力してください。

```.py
>>> [i for i in range(10)]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
```

[　]で囲っているのがリスト表記を意味しています。こう記載することで、特にappendメソッドや変数を使わずに1行でリストを作成することが可能です。

「変数による計算結果」としている理由について説明します。
例えば、リストに0.5刻みの値を出力するときに、**range(0, 10, 0.5)**と記載することはできません。（stepに小数を指定できない）

そこで、内包表記を使用します。実際には以下の通りに記載します。**Python Console**から以下のコードを入力してください。

```.py
>>> [i * 0.5 for i in range(10)]
[0.0, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5]
```

なお、この内包表記の結果は変数に代入することもできます。

```.py
>>> ls = [i * 0.5 for i in range(10)]
>>> ls
[0.0, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5]
```

##内包表記によるディクショナリ作成
リストだけでなく、ディクショナリも作成できます。**Python Console**から以下のコードを入力してください。

```.py
>>> Countries = ['Japan', 'Canada', 'China', 'America']
>>> {n[0:2] : n for n in Countries}
{'Ja': 'Japan', 'Ca': 'Canada', 'Ch': 'China', 'Am': 'America'}
```
今回はディクショナリなので、[ ]でなく、{ }を使って表記します。
各要素の先頭の2文字をキーとしています。それと値を組み合わせて出力させています。

##演習問題
演習問題を用意しました。ぜひ解いてみてください。なお、**Python Console**を利用してください。
<font color="3333ff">
【1】1～9の整数の2乗をした結果を内包表記を利用してリストを作成してください。結果は以下の通りです。
[1, 4, 9, 16, 25, 36, 49, 64, 81]
</font>

##最後に
今回は内包表記について触れましたが、気づいたことがありましたでしょうか？実は今回、**Python Console**しか使用していません。ほかの言語にはまだあまりありません。内包表記はコマンドとして入力ができます。
簡易的な表記ができることもできるので、ぜひ利用してみてください。

###[【目次リンク】へ戻る](https://qiita.com/ko0821/items/379e8bd9e6ea01089419)
【Xcode】背景画像をダークモードに対応させる

##背景画像を変更したい！
iOS13からダークモードが搭載されましたね！
今更ですが、背景画像をダークモードと通常モード（ライトモード）で変更させてみました。

##１.まずはImage Viewを配置
Image Viewを配置して、各Contstrainsを設定します。

※ Constrainsは設定しなくても大丈夫ですが、設定しないとSimulator上で背景画像がずれてしまうので、一応設定しましょう！<img width="1560" alt="スクリーンショット 2020-06-07 20.52.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321820/49f9f469-2756-9044-dddb-4c8794a440bc.png">
<img width="1752" alt="スクリーンショット 2020-06-07 21.16.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321820/65f44fcb-6841-de40-763a-816a8f3090d8.png">

##２.Assets.xcassetsに背景にしたい画像を追加
Assets.xcassetsに背景にしたい画像を追加します。
今回はAdobe illustratorで作成したvectorイメージ画像を使用しているので、インスペクタのScalesを「Single」にしています。（デフォルトでは「Individual Scales」になっています）
<img width="1618" alt="スクリーンショット 2020-06-07 21.28.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321820/9347eca3-ad71-a34a-c01c-1cbd2ab00937.png">

##3.【重要】ダークモードに対応させる！
①インスペクタのAppearancesを「Any, Dark」に変更します
②Dark Appearanceにダークモードで使用した画像を追加します
<img width="1618" alt="スクリーンショット 2020-06-07 21.34.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321820/0c349475-8408-20e7-f95a-8ab0035a4e12.png">


※注意事項
青枠部分の「Preserve Vector Data」にチェックを入れると
2020.6.7時点ではXcode上でダークモードにしても、上手く背景画像が切り替わりません。
Stack Overflowなどで調べてみましたが、どうやらバグ？のようです、、、

##4.ダークモード対応完了！
Simulatorでダークモードに対応できていることが確認できます！

- ライトモード
 
<img width="375" alt="Simulator Screen Shot - iPhone SE (2nd generation) - 2020-06-07 at 21.43.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321820/f878fc46-c31c-4191-9906-67d436c7c643.png">

- ダークモード

<img width="375" alt="Simulator Screen Shot - iPhone SE (2nd generation) - 2020-06-07 at 21.43.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321820/1c8682c4-daa0-5ab8-388e-85fa6064eb82.png">
GitHubで作成から巻き戻しまで、厳選リンク集

GitHubを使って、Webページを作成するやり方から、Gitのバージョンを元に戻すやり方までを記述します。

GitHubを使っていて、いろいろ探したので、詰まったところを共有して、なくすために書いておきます。


# GitHubを初めて使う
1. [今日からはじめるGitHub 〜 初心者がGitをインストールして、プルリクできるようになるまでを解説](https://employment.en-japan.com/engineerhub/entry/2017/01/31/110000)

### １を読んでいて、困ったときに
2. [GitHubでssh接続する手順~公開鍵・秘密鍵の生成から~](https://qiita.com/shizuma/items/2b2f873a0034839e47ce)
3. [GithubのSSH通信設定](https://qiita.com/yysskk/items/974c9c55d66a26515651)

# GitHubを効率的に使う
1. [いよいよ登場！初心者こそ知っておきたいGitHub Desktopの使い方](https://ferret-plus.com/8498)

# GitHubのバージョンを戻す
#####（正確に言うと、ローカルのGitのバージョンを戻すやり方。）
前のファイル操作に戻したいときに、使うやり方。
1. [github desktopを使ってcommitを戻りたかった](https://papuwak.hatenablog.com/entry/2018/11/23/225731)
2. [【Git】特定のコミットまで戻したい](https://qiita.com/Yorinton/items/e0e969d961b17a359e19)
1. [[git] 戻したい時よく使っているコマンドまとめ](https://qiita.com/rch1223/items/9377446c3d010d91399b)

# GitHubで起こる不具合を解消する
#### コンフリクト
[コマンド ラインを使用してマージ コンフリクトを解決する](https://help.github.com/ja/github/collaborating-with-issues-and-pull-requests/resolving-a-merge-conflict-using-the-command-line)

# GitHubを応用する
1. [HTTPSが無料で使えるWebサーバーとしてGitHubを使う。](https://2ndart.hatenablog.com/entry/2018/08/05/232643)
2. [GitHubページサイトのカスタムドメインの構成](https://help.github.com/en/github/working-with-github-pages/configuring-a-custom-domain-for-your-github-pages-site)
1. [GitHub+CircleCI入門](https://qiita.com/tatane616/items/8624e61473a9957d9a81)
2. [PyCharmでGitHubにプッシュする方法](https://intellectual-curiosity.tokyo/2018/09/29/pycharm%E3%81%A7github%E3%81%AB%E3%83%97%E3%83%83%E3%82%B7%E3%83%A5%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/)


#今後の抱負
GitHub関連で困ったことが起きたときに、とりあえず、この記事を見れば、解決するというレベルまで育てたいと思います。
Vue.jsの単一ファイルコンポーネントでBootstrapを実行

<h2>やり方</h2>

コマンドで以下を実行

```
"npm install bootstrap
npm install bootstrap-vue"
```

SFC(単一ファイルコンポーネント)の`script部分`に以下を書きます

```
import Vue from 'vue'
import { BootstrapVue, IconsPlugin } from 'bootstrap-vue'

// Install BootstrapVue
Vue.use(BootstrapVue)
// Optionally install the BootstrapVue icon components plugin
Vue.use(IconsPlugin)
```


続いて以下をSFC(単一ファイルコンポーネント)の同じくscript部分に書き込みます

```
import 'bootstrap/dist/css/bootstrap.css'
import 'bootstrap-vue/dist/bootstrap-vue.css'
```

以上

<h2>参考</h2>

●BootstrapVue公式
https://bootstrap-vue.org/docs

●vue-cli を使って、コンポーネント間でデータの受け渡しをするアプリを作成してみる
https://www.techscore.com/blog/2017/06/12/vue-cli-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%80%81%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88%E9%96%93%E3%81%A7%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E5%8F%97%E3%81%91%E6%B8%A1/
Flutterの基本的なことをまとめる

# はじめに
Flutterの基本的なことをまとめていきます。

# Flutterとは
Flutterとは、Googleが提供しているUIツールキットです。
iOSとAndroidの両方のプラットフォームを、**１つのコードで作成出来るので
非常に生産性が高いです。**

他の特徴として、以下のものが挙げられます。

```
・Dart言語を使用している。
・アプリを一瞬でリロードできる。(ホットリロード)
・公式ライブラリのUIコンポーネントが豊富で、柔軟なデザインに対応できる。
```

# 環境構築について

公式サイトが分かりやすいです。

```terminal
$ flutter doctor
```
上記コマンドがいろいろ教えてくれるので
言われたとおりやれば、環境構築することが出来ます。

[公式サイト(Mac用)](https://flutter.dev/docs/get-started/install/macos)

# ウィジェットについて
FlutterのUIは**すべてウィジェットで構成されています。**

```
・アプリに表示される部品(ラベル、スクロールバーやボタン)
・レイアウトに関するもの(パディング、マージン)
```

以上のような、**画面のデザインに関わるもの全てがウィジェットです。**
このウィジェットを組み合わせ、**ツリー状に継承して**画面を構成します。
(これを**ウィジェットツリー**と呼びます。)

ウィジェットの種類は大きく分けて、２つあります。

### Stateless Widget
状態を持たないウィジェット。
一度インスタンスしたら、変わることがないです。
**build()** メソッドを実装する必要があります。

### Stateful Widget
状態を持つウィジェット。
**build()** メソッドが必要ないです。
**createState()** メソッドを実装して
状態を変更することが可能です。

基本的に、どちらかを継承してウィジェットを作成していくことになります。

# Hello World
Hello worldを出力してみましょう。
以下のコードでHello Worldが出力できます。

```main.dart
import 'package:flutter/material.dart';

void main() => runApp(new MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'Welcome to Flutter',
      home: new Scaffold(
        appBar: new AppBar(
          title: new Text('Welcome to Flutter'),
        ),
        body: new Center(
          child: new Text('Hello World'),
        ),
      ),
    );
  }
}
```

### 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456505/35779625-e107-ba29-f91f-14131117c60b.png)

### ロジック説明

最初に **main()** が呼ばれ、 **runApp()** にウィジェットを渡すことで画面を構築していきます。

**MyApp()** が **StatelessWidget** を継承しており、全体をbuildしています。

**MaterialApp**は、マテリアルデザインで実装しやすくした便利なウィジェットで
マテリアルデザインにするには、**Scaffold**とともに必ず使用します。

**Scaffold**は、マテリアルデザイン用のWidgetで
AppBar、title、およびホーム画面のウィジェットツリーを保持するbodyプロパティを渡しています。

# ちょっとカスタマイズ
一部分を変えて、テキストからボタンに変更してみます。

```main.dart
import 'package:flutter/material.dart';

void main() => runApp(new MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'Welcome to Flutter',
      home: new Scaffold(
        appBar: new AppBar(
          title: new Text('Welcome to Flutter'),
        ),
        body: new Center(
          /// 以下を変更
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              RaisedButton(
              child: Text("Button"),
              color: Colors.orange,
              textColor: Colors.white,
              onPressed: () {},
              ),
            ],
          ),
        ),
      ),
    );
  }
}
```

### 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456505/861ade16-c97c-f965-a7a3-07cef4118754.png)

このようにウィジェットを配置することで、簡単にUIを作成することが可能です。

# DartPadについて
Dartのコードを試せる、DartPadというサイトがあるのですが
Flutterのコードも簡単にテストすることが出来ます。
(上記コードも実行出来ます)

https://dartpad.dev/

# さいごに
Flutterは便利なライブラリやウィジェットが多数あるので
それらを使いこなせるよう、もっと理解を深めていきたいです。
【Linuxエラー】　ex4.sh: 44 行: [: 100: 単項演算子が予期されます

#【エラーメッセージ】単項演算子が予期されます

if文、while文用いた練習問題で起こったエラー
よく分からなかったので原因と解決を残しておきます。

#<結論>
・指摘された行　または　周辺に無駄なスペース（全角スペースの場合もある）が存在する可能性がある.
・空欄があることによって正常な処理が出来ないことでエラーメッセージをが出る場合もあります。
このエラーメッセージは要因が複数あるので解決できない場合は他の記事もご覧ください。

今回、原因を特定したコマンドを記事の下の方に記載しましたのでご確認ください。

#＜書いたコード＞

```Linux:ファイル

 　  1  #!/bin/bash
     2
     3  read -p 'ファイル名を入力してください' fh
     4  if [ -f $fh ];
     5  then
     6          read -p  'sum, avg, min, max, exit ' command
     7          if [ $command = 'sum' ];
     8          then
     9                  sum=0
    10                  while read p;
    11                  do
    12                    sum=$(( sum + p ))
    13                  done < $fh
    14                  echo SUM: $sum
    15                  exit 0
    16          elif [ $command = 'avg' ];
    17          then
    18                  sum=0
    19                  count=0
    20                  while read p;
    21                  do
    22                    sum=$(( sum + p ))
    23                    count=$(( count + 1 ))
    24                  done < $fh
    25                  echo AVG: $(( sum / count ))
    26                  exit 0
    27          elif [ $command = 'min' ];
    28          then
    29                  min=101
    30                  while read p;
    31                  do
    32                          if [ $min -gt $p ];
    33                          then
    34                                  min=$p
    35                          fi
    36                  done < $fh
    37                  echo MIN: $min
    38                  exit 0
    39          elif [ $command = 'max' ];
    40          then
    41                  max=0
    42                  while read p;
    43                  do
    44                          if [ $max -lt $p ];
    45                          then
    46                                  max=$p
    47                          fi
    48                  done < $fh
    49                  echo MAX: $max
    50                  exit 0
    51          elif [ $command = 'exit' ];
    52          then
    53              exit 0
    54          else
    55                  echo 'そのようなコマンドは存在しません'
    56                  exit 1
    57          fi
    58  else
    59      echo '入力したファイル名は存在しません'
    60      exit 1
    61  fi

```
#<エラーメッセージ>
ex4.sh: 44 行: [: 100: 単項演算子が予期されます

#<解決策>
呼び込んだファイルの一部に　「無駄なスペース」　があったので処理中にスペースも計算してしまい
エラーメッセージが出てしまった

以下のコマンドを実行して原因を特定しました。
こちらのコマンドは「どういうコマンドが実行されているか確認できる」ものになります。

```Linux:bashコマンド
bash -x ファイル名
```

#参考記事
・１．「単項演算子が予期されます」を抑制する
https://www.bee-planetz.com/blog/%E3%80%8C%E5%8D%98%E9%A0%85%E6%BC%94%E7%AE%97%E5%AD%90%E3%81%8C%E4%BA%88%E6%9C%9F%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%E3%80%8D%E3%82%92%E6%8A%91%E5%88%B6%E3%81%99%E3%82%8B/

・２.bashで配列の個数部分を変数で指定するとエラー
https://okwave.jp/qa/q8362685.html
【Swift5】キーワードの重複で「関連記事」を取得してみる

## はじめに

今回は、ニュースアプリの記事ページの一番下にある「関連記事」を選ぶ関数を作ったので共有したいと思います。

## 使用するクラス

```Swift
class Entry: NSObject, NSCoding {
    var title:String?
    //省略
}
```
自分のアプリでは、`title`の他にURLなどのプロパティも持たせています。

## 完成品

```Swift
func getRelatedArticle(entry:Entry, entries:[Entry]) -> [Entry] {
        
        let exempt = ["で","の","は","を","も","が","に","万","円"]
        var words:[String] = []
        var counts:Dictionary<Entry,Int> = [:]
        let checkEntries = entries.filter {$0 != entry}
        
        let wordTokenizer = NLTokenizer(unit: .word)
        wordTokenizer.string = entry.title
        wordTokenizer.enumerateTokens(in: entry.title!.startIndex..<entry.title!.endIndex) { tokenRange, _ in
            let word = String(entry.title![tokenRange]).localizedUppercase
            if !exempt.contains(word) {
                words.append(word)
                print(word)
            }
            return true
        }
        //print("contains:\(words)")
        
        for e in checkEntries {
            var count = 0
            let text = e.title!
            wordTokenizer.string = text
            wordTokenizer.enumerateTokens(in: text.startIndex..<text.endIndex) { tokenRange, _ in
                //print( text[tokenRange])
                if words.contains(String(text[tokenRange].localizedUppercase)) {
                    count += 1
                }
                return true
            }
            counts.updateValue(count, forKey: e)
        }
        let sorted = Array(counts).sorted {$0.1 > $1.1}.prefix(3)
        var related:[Entry] = []
        for (key,value) in (sorted) {
            //print("\(key.title!) 単語数:\(value)")
            related.append(key)
        }
        return related
}
```

全ての記事名を単語に分解して、重複する単語が多かった記事を関連記事として選んでいます。
分解には標準ライブラリの`NaturalLanguage`を使っているので忘れずにimportしてください。

```Swift
import NaturalLanguage
```

## 使用例

```Swift
//nowEntry -> 今見ている記事
//AllEntries -> 全ての記事の配列
let related = getRelatedArticle(entry: nowEntry, entries: AllEntries)
print(related.map({$0.title!}))
```

## 出力結果

[この記事](https://www.news24.jp/articles/2020/06/08/07658392.html)で実験してみました。
また、全記事のリストはいくつかニュースサイトのRSSから取得しています。

> 藤井七段「充実感が…」棋聖戦第一局に勝利

コメントアウトしてある`print`を使えばログで確認できます。
抽出した単語と、関連記事はこんな感じになりました。

```
contains:["藤井", "七", "段", "充実", "感", "棋聖", "戦", "第", "一", "局", "勝利", "6", "8", "21", "33", "更新"]
藤井七段、棋聖戦第一局で渡辺三冠に勝利　6/8 20:08更新 単語数:12
藤井七段が最年少で挑戦　「棋聖戦」始まる　6/8 12:05更新 単語数:8
経団連会長　第２次補正予算案を評価　6/8 21:48更新 単語数:5
```

藤井七段の他の記事は取得できているので、問題ありません。
ただ、やっぱり精度が微妙なので「この記事もオススメ」みたいな感じで表示させた方がいいかも。

## 補足、解説

```Swift
let exempt = ["で","の","は","を","も","が","に","万","円"]
```
ここで除外する単語を指定しています。
英語のサイトでは「a」「the」「in」などのワードが余計でした。
後々、ひらがな一文字とアルファベット一文字を自動で除外できるようにしたい。

```Swift
for (key,value) in (Array(counts).sorted {$0.1 > $1.1}.prefix(3)) {
    //print("\(key.title!) 単語数:\(value)")
    related.append(key)
}
```
ここの`prefix(3)`を変更することで取得する記事の数が変更できます。

### 課題
- この記事のタイトルのように括弧などの記号などが含まれていると単語が取得できない

### 参考
https://dev.classmethod.jp/articles/ios12-natural-language-tokenizing/
tcコマンドによるパケットロスおよび遅延

# tcコマンドによるパケットロスおよび遅延
Virtual Boxを用いて、tcコマンドによるパケットロスおよび遅延を実践する。
# 準備
## VMを３つ（Ethernet Bridge、PC1、PC2）用意
構成図は次のとおり。
![構成図.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/ca35db2d-f8a6-446d-ed16-c10f5ac0f2b4.png)

## Virtual Box設定
### Ethernet Bridge VM
![設定.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/36f6d712-4ca7-ed98-5f12-b98941957924.png)
ネットワークアダプタを２つ作る。１つは内部ネットワークintnet1、もう一つは内部ネットワークintnet2。プロミスキャスモードですべて許可。
### PC1 VM
ネットワークアダプタ、内部ネットワークintnet1。
### PC2 VM
ネットワークアダプタ、内部ネットワークintnet2。

## Ethernet Bridgeの設定
起動時にBridgeが自動的に作成されるよう、/etc/network/interfacesを次のように記述。

```
root@live:~# cat /etc/network/interfaces
auto eth0
iface eth0 inet static
  address 0.0.0.0
auto eth1
iface eth1 inet static
  address 0.0.0.0

auto br0
iface br0 inet static
  address 0.0.0.0
  bridge_ports eth0 eth1
  bridge_stp on
```

## PC1およびPC2の設定
ここでは、PC2に固定IPアドレスを割り当て、DHCPサーバーを起動。PC1はDHCPサーバーからIPアドレスを取得するように設定した。詳細略。

# 実験
設定前の状況は次のとおり。

```
root@live:~# tc qdisc show dev eth1
qdisc pfifo_fast 0: root refcnt 2 bands 3 priomap  1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
```
このときのpingの結果は次のとおり。
![正常.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/a24a58d3-f59b-0a8e-2f84-459187e8fef9.png)
正常。

## パケットロス
30%のパケットロスをBridgeのeth1に発生させる。

```
root@live:~# tc qdisc add dev eth1 root netem drop 30%
root@live:~# tc qdisc show dev eth1
qdisc netem 8002: root refcnt 2 limit 1000 loss 30%
```
このときのpingの結果は次のとおり。
![30%Loss.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/be34980d-29a4-9c64-12aa-9ba11f53e446.png)
24%ロス。回数を増やせば限りなく30%に近づくであろう。

## 遅延
50msの遅延をBridgeのeth1に発生させる。

```
root@live:~# tc qdisc add dev eth1 root netem delay 50ms
root@live:~# tc qdisc show dev eth1
qdisc netem 8005: root refcnt 2 limit 1000 delay 50.0ms
```
このときのpingの結果は次のとおり。
![50msDelay.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/972d5278-69ed-6ae8-1a00-9f817b8721c0.png)
正常時は約2msのターンアラウンドタイムであったが、この結果では約52msとなっている。

## 設定解除
次のコマンドにより設定を解除できる。

```
root@live:~# tc qdisc del dev eth1 root
root@live:~# tc qdisc show dev eth1
qdisc pfifo_fast 0: root refcnt 2 bands 3 priomap  1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
```

# 参考にしたサイト
[こちら](http://masaoo.blogspot.com/2013/10/linux-pc-bridge-tc.html)
ブラウザのみでいろいろ試せるサイト集

随時更新中。。。。。

#### Java 各バージョンの差分比較と Sandbox 実行環境（ページの一番下）
[https://javaalmanac.io/](https://javaalmanac.io/)
[https://javaalmanac.io/jdk/17/](https://javaalmanac.io/jdk/17/)
[https://javaalmanac.io/jdk/11/](https://javaalmanac.io/jdk/11/)

#### javascript のみ（シンプルではやい）
[https://js.do](https://js.do)

#### html, css, js 一式（機能豊富）
[https://codepen.io](https://codepen.io)
[https://jsfiddle.net](https://jsfiddle.net)
[https://jsbin.com](https://jsbin.com)
[https://playcode.io](https://playcode.io)
[https://liveweave.com](https://liveweave.com)

#### 万能
対応言語はJava、C、C++、C#、Ruby、PHP、Python、Perl、JavaScriptと言ったメジャーな言語からGo言語やScala、Haskellなど24言語以上に対応しています。
[https://paiza.io/ja](https://paiza.io/ja)

#### MySQL, Oracle, Postgres, SQLite
[http://sqlfiddle.com](http://sqlfiddle.com)

#### bash を試せるサイト
[https://www.shellcheck.net/](https://www.shellcheck.net/)

#### cron generator
https://crontab.guru/
[https://www.freeformatter.com/cron-expression-generator-quartz.html](https://www.freeformatter.com/cron-expression-generator-quartz.html)
[http://www.cronmaker.com/](http://www.cronmaker.com/)

#### json formatter
[https://jsonformatter.curiousconcept.com/](https://jsonformatter.curiousconcept.com/)

#### java (動きまで確認できる優れもの)
[http://www.pythontutor.com/java.html#mode=edit](http://www.pythontutor.com/java.html#mode=edit)

#### 正規表現可視化
https://jex.im/regulex/#!flags=&re=%5E(a%7Cb)*%3F%24
https://regexper.com/

#### 正規表現テスト
https://regex101.com/
Excelに限界を感じた人に向けたDB入門の入り口

# 対象読者
以下に当てはまる方へ、DB（データベース）というものを紹介します。

+ 仕事でExcelを使ってデータ[^1]を管理している
+ Excelに限界を感じている
    + ファイル数が増えすぎて困る。
    + ワークシート関数だけでは表現しきれなくて困る。
    + かといってマクロは意味不明で困る。
+ 手元のパソコンにAccess[^2]が **入っていない**
  + 入っている人はAccess[^2]を学びましょう。

# DBってなんだ

## データ[^1]管理に特化したソフトウェアです
+ データ管理に特化しすぎてて、慣れるまでシンドイです。
+ 無理だと思ったらAccess[^2]を使いましょう。

## Excelと結構似てます[^3]
+ Excelのように、表としてデータ[^1]を管理します。
+ Excelワークシートのように、いくつもの表を管理します。
+ Excelファイル（ブックといいます）のように、複数の表をまとめて1つのデータ群として管理します。

## Excelと似てないところもあります
+ マウスで操作することは考慮されてません。
    + そういうツールは別途インストールが必要です。
    + もしくはAccess[^2]を使います。
+ データ[^1]への操作（登録する、変更する、見る、削除する）はSQLという命令用の言語を使います。
    + これがツライ。。
    + 無理ならAccess[^2]を使いましょう。

# そんなにAccess[^2]がええんか？
+ はい。
+ Excelからのステップアップという意味では最強だと思います。
    + DB学ぶにしてもAccess[^2]からステップアップした方が良いと考えます。
+ ゼロからDBを習得するのはかなり大変です。
    + 日々の業務もあるでしょう（特に非エンジニアの方

# Access[^2]が手に入らない場合
2つの選択肢があります。

## LibreOffice Baseを使う
+ Access[^2]と同等のことができる無料ソフトです。
    + [Base | LibreOffice - オフィススイートのルネサンス](https://ja.libreoffice.org/discover/base/)
+ JA福岡がマニュアルを作成、公開してくださっています。
    + [LibreOffice | JA福岡市 福岡市農業協同組合](https://www.ja-fukuoka.or.jp/libre/)

## 思い切ってDBを学ぶ
+ ここでは書ききれません。。
    + 基礎知識が多すぎる
        + クライアント、サーバ、コンソール、環境変数、etc…。
+ 強いて紹介するならこの一冊かな。。
    + [おうちで学べるデータベースのきほん | ミック, 木村 明治 |本 | 通販 | Amazon](https://www.amazon.co.jp/dp/479813516X/)

# 最後に
+ ExcelからのステップアップとしてDBを学ぶならAccess[^2]が最強です。（2回目
+ Access[^2]がどうしても手に入らない場合は[LibreOffice Base](https://ja.libreoffice.org/discover/base/)を使いましょう。（これも2回目
+ 続きを書きました。
  + [Excelに限界を感じた人に向けたDB入門の第一歩](https://qiita.com/yamahei/items/918ae4a5d5785dc817fc)



[^1]: データとは金額や日付、名前、etc…仕事（等）で管理する様々な値の総称です。
[^2]: https://www.microsoft.com/ja-jp/microsoft-365/access
[^3]: 厳密にいうと似てません。Excelは本来、データベースから抜き出したデータを加工して分析・可視化するための表計算ツールです。
echoとprintについて

echoとprintの違いについての備忘録です。

#受け付ける引数の違い
echoは値を「,」で区切ることで、複数(1以上）の引数を受け付けます。

```php

echo 'こんにちは';
echo 'こんにちは','竈門さん';
```

対してprintは単一の引数のみ受け付けます。

```php

print 'こんにちは';
print 'こんにちは','竈門さん'; //引数が二つなのでエラー
```

printを用いて複数の文字列を出力したい場合は、文字列を「.」で連結して単一の文字列にすることで出力可能です。

```php

print 'こんにちは'.'竈門さん'; //
```
#戻り値の違い
またechoは戻り値がないのに対して、printは戻り値が常に１です。

```php

$hello = echo 'こんにちは';//エラー
$hello = print 'こんにちは';//文字列が出力され、$helloに1が代入される
```

#文と式の違い
echoは文ですが、printは式です。
式と文の違いついては後日改めてまとめます。
laravel vue.js でSPAを作る方法

#はじめに
備忘録のために簡単に流れをまとめたいと思う。
#フロー
１、vue.jsでルーティングを行うためのライブラリ（laravelでいうweb.php）を使うためにpackage.json内に下記のコードを記述する

```pacage.json
"vue-router": "^3.0.0"
```
２、フロントの変更を自動で検知させるコマンドを打つ。（webpackが起動しているらしい）
npm run dev をしないとresources/js/app.js内に記述した内容をpublic/app.jsに反映させることができなかった。

```
npm run watch
```

３、componentを作成
resource/js下にcomponentsディレクトリを作成し、その中にcomponentを作成する。


４、app.jsでVueRouterを使用し、ルーティングを作成する。

```app.js
Vue.use(VueRouter)

new VueRouter({
    mode: 'history',
    routes: [
        { path: '/', component: require('./components/app.vue').default },
    ]
})
```
defaultを入れないとエラーがでた。


５、bladeを作る。

```app.blade.php
<body>
    <div id="app">
        <div class="container">
            <router-view></router-view>
        </div>
    </div>
</body>
```
上記のコードの<router-view>内にapp.jsのpathで指定したファイルを表示させる。


これで/を叩いた場合に<router-view></router-view>にcomponentが埋め込まれたapp.blade.phpが表示される。
これを使用して他のページcomponentを呼び出せばspaができる。

#参考サイト
https://qiita.com/acro5piano/items/f33381fc60408abe9865
Python3 venvによる環境構築

venvによる環境構築メモ

## 環境を作成
```
python3 -m venv ./path/to/env
```

## Activate（環境を有効化）
```
source ./path/to/env/bin/activate
```
### pipのバージョンアップ
```
pip install --upgrade pip
```

## Deactivate（環境を無効化）
```
deactivate
```

## インストールされているパッケージを確認（pip）
```
pip freeze
```

## 環境を削除
```
python -m venv --clear ./path/to/env
```

## 環境を複製


1. 複製元のライブラリをファイル出力
2. 新しい環境で1で出力したファイルに記載されたライブラリをインストール 

### 1. 複製元の環境のライブラリを出力
```
pip freeze > requirements.txt
```

### 2. 新しい環境でライブラリをインストール
```
pip install -r requirements.txt
```
[AWS] CloudFormationの基本

#Cloud Formationとは
AWSリソース(EC2インスタンス、 RDS DBインスタンスなど)のモデル化およびセットアップに役立つサービス。テンプレートに設定を書けばその設定通りにCloudFormationがAWSリソースを作ってくれる。**無料サービス**。

#テンプレートってどうやって書くの？
JSONまたはyaml形式で次のような感じで書く。

**JSON形式**

```
{
  "AWSTemplateFormatVersion" : "2010-09-09",
  "Description" : "A simple EC2 instance",
  "Resources" : {
    "MyEC2Instance" : {
      "Type" : "AWS::EC2::Instance",
      "Properties" : {
        "ImageId" : "ami-0ff8a91507f77f867",
        "InstanceType" : "t1.micro"
      }
    }
  }
}
```


**yaml形式**

```
AWSTemplateFormatVersion: '2010-09-09'
Description: A simple EC2 instance
Resources:
  MyEC2Instance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: ami-0ff8a91507f77f867
      InstanceType: t1.micro
```
詳しく説明すると時間がかかりすぎるので他の記事にまかせます。
https://dev.classmethod.jp/articles/cloudformation-beginner01

その他の選択肢としてデザイナーツールを使って構築するというものがある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605944/ab0cad61-2054-05a1-430e-6d8e12d94290.png)
視覚的でわかりやすく、JSONやyamlでの書き方がわからなくても使えるのが利点。

#CloudFormationを使用する利点
主に3つ利点がある。

**AWSでのインフラ構築の手間が省ける**
テンプレートを利用することで、それぞれのAWSリソースのコンソールに移動してあれやこれや設定することをしなくてよくなる。
慣れてくると時間も短縮されそう。


**インフラの複製が簡単にできる**
可用性(=ユーザーがサービスが使える時間の割合の大きさ)を高くしたい時、別のリージョンに同じインフラを構築したくなる。その時にテンプレートをコピーするだけで同じインフラが構築できる。


**インフラの変更点を追いやすい**
例えば、予想されていたよりもアクセスが多くてサーバーを強化したあとに問題が何か起こったとする。CloudFormationを使っていない場合は強化する前のインフラ構成を覚えておいて変更前後でどのような違いがあったかを確認する必要がある。しかし、CloudFormationを使っていれば、インフラの構成はテンプレートに残っているので現在との差分がわかりやすくなる。
nanote で Ubuntu20.04 を正しい画面位置で使う

# TL;DR

* nanote に Ubuntu20.04 LTS をインストールすると画面が逆さまになっちゃうのでそれを解消します。

# 手順

### 設定

* `$ sudo nano /etc/udev/hwdb.d/61-sensor-local.hwdb`

``` bash:61-sensor-local.hwdb
sensor:modalias:acpi:BOSC0200*:dmi:*:svnRWCCO.,LTD:pnUMPC-01:*
 ACCEL_MOUNT_MATRIX=-1,0,0;0,1,0;0,0,1
```
* `$ sudo udevadm hwdb --update`
* `$ sudo udevadm trigger`

### 確認

* `$ sudo udevadm info --export-db | grep ACCEL_MOUNT_MATRIX` で設定が反映できているかを確認する
* 2行目が出ればOK

```
$ sudo udevadm info --export-db | grep ACCEL_MOUNT_MATRIX
E: ACCEL_MOUNT_MATRIX=-1,0,0;0,1,0;0,0,1
```
### 再起動

* `$ sudo reboot`

これで正しい位置で起動してくると思います。
Golang ポインタを用いることのメリット

## そもそも

Goなどのような値渡し言語では呼び出された関数はもとの引数への参照ではなく、引数のコピーだけを受け取るので、関数が引数を変更する必要がある場合、ポインタを渡すことは必須である。

## ポインタを用いることのメリット

* 上記の通り、ポインタを引数に渡すことで複数の関数間で同じオブジェクトを扱うことができ、そのオブジェクトに対して操作を行うことができる（というより、オブジェクトに変更を加える際は、ポインタ渡しが必須である）。
* ポインタは比較的に軽く（8byte=64bit）ただのメモリアドレスのため、ポインタを使って大きな構造体を引数に渡すことも可能になる。もし値渡しを行っていると、相対的にさらに大きなシステムリソース（メモリや時間）を毎回のコピーで消費することになる。そのためGolangでは構造体を渡す際はポインタを使うことが推奨されている。

### channel, slice, map について

Go言語のchannel、slice、mapの３つの型はメカニズムを実現するポインタのようなものであるため、直接渡すことができ、アドレスを取得してポインタを渡す必要はない。しかし、もし関数がsliceの長さを変更する場合はアドレスを取得し、ポインタを渡す必要がある。
IntelliJで簡単なREST APIを作ります

前回IntelliJで[HelloWorld](https://qiita.com/Hakata2002/items/a8bb1b3ff0897d4cfdb8)しました。

今回は簡単なREST APIを作ります。

[ここ](https://spring.io/guides/gs/rest-service/)を参考しました。

# プロジェクトを作成
[Spring initializr](https://start.spring.io/)でプロジェクトのひな型を作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399736/21e9f9e2-2c22-7c5b-32e5-dfd21b38bf97.png)

Artifact: restservice
Name: restservice
Package name: restservice
Dependenciesで[Spring Web]のみ選択します。
[Generate]を押下します。

restservice.zipを解凍し、解凍されたフォルダにあるpom.xmlを右クリックします。
IntelliJで開きます。

#　プロジェクトをインポート
restserviceプロジェクトはインポートされました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399736/39249203-4499-7f11-616e-e765e031a709.png)


# モデルファイルを作成
```java:Greeting.java
package com.example.restservice;

public class Greeting {

	private final long id;
	private final String content;

	public Greeting(long id, String content) {
		this.id = id;
		this.content = content;
	}

	public long getId() {
		return id;
	}

	public String getContent() {
		return content;
	}
}
```

# コントローラファイルを作成
```GreetingController.java
package com.example.restservice;

import java.util.concurrent.atomic.AtomicLong;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class GreetingController {

	private static final String template = "Hello, %s!";
	private final AtomicLong counter = new AtomicLong();

	@GetMapping("/greeting")
	public Greeting greeting(@RequestParam(value = "name", defaultValue = "World") String name) {
		return new Greeting(counter.incrementAndGet(), String.format(template, name));
	}
}
```
Requestに/greetingのみであれば、defaultValue = "World"になります。

# プロジェクトのビルドと実行
mainメソッドのあるDemoApplication.javaを右クリックし、Run DemoApplication mainをクリックします。

# アクセスしてみる
下記のリンクをアクセスすると、
http://localhost:8080/greeting

ちゃんとレスポンスが返ってきました。

```json

{"id":1,"content":"Hello, World!"}
```

下記のリンクをアクセスすると、Hello, User!が戻ってきます。
http://localhost:8080/greeting?name=User

```json

{"id":2,"content":"Hello, User!"}
```