OmniAICreator/Qiita-1.07M huggingface dataset:
ubuntu20.04LTSでのwsgi設定方法 with Apache2.4

# この記事を書くにあたっての経緯
ubuntu20.04、apache2.4環境でwsgiを使おうといくつかのサイトを参考にしましたが、これだ！という記事が見つからず、試行錯誤してたらできたのでそれを共有しようと思います。
# 本編
### 1. 必要なもののインストール
必要なものはapache2とmod_wsgiです。まずはこれらをインストールします。

```shell
$ sudo apt install apche2
$ sudo apt install libapache2-mod-wsgi-py3
$ pip3 install mod_wsgi flask
```

今回は**python3**を使うので`libapache2-mod-wsgi-py3`を使います、**python2**を使う場合は`libapache2-mod-wsgi`を使ってください。間違えると動作しません。
### 2. プログラムを書こう！
pythonでプログラムを書いていきます。今回はflaskを使います。

```sample.py
# -*- coding: utf-8 -*-
from flask import Flask

app = Flask(__name__)

@app.route('/')
def get():
    return "Hello wsgi!"

if __name__ == '__main__':
    app.debug = True
    app.run()
```

これともう一つpythonプログラムを書きます。

```wsgi.py
import sys,site
site.addsitedir('/home/user/.local/lib/python3.8/site-packages')
sys.path.insert(0,'/home/user/sample')
sys.path.append('/home/user/sample')
from sample import app as application
```

`site.addsitedir()`にはpythonのsite-packagesの絶対パスを入れてください。分からない場合はターミナルで`pip3 show mod_wsgi`と打つと調べられます。

プログラムの書き方についてはこの記事では割愛させていただきます。

### 3. apache2の設定ファイルを書こう！
次はapache2上でwsgiを使うための設定ファイルを書いていきます。

```wsgi.conf
<VirtualHost *:80>
        ServerName sample.com
        ServerAlias www.sample.com
        WSGIDaemonProcess root
        WSGIScriptAlias /  /home/user/sample/wsgi.py

        <Directory /home/user/sample>
                WSGIProcessGroup root
                WSGIScriptReloading On

                Require all granted
        </Directory>
</VirtualHost>
```
`sample.com`や各種パス、ユーザー(rootのところ)は適当なものに変更してください。
### 4. アクセスできることを確認して完了！
webブラウザで`sample.com`にアクセスして確認しましょう。

# 最後に
この記事に書いてある内容は最低限動けばいいやというレベルです。もしかしたらいろいろとまずいことがあるかもしれません。
機械学習勉強記録 データの標準化

# 1 標準化
標準化を行うことにより、単位や平均値などが異なるデータ同士を単純に比較できるようになります。
標準化した後の数値が高いほど、偏差値が高いということで、
異なる基準のデータ同士を比較することができるようになります。
（例）国語のテストと数学のテストの結果を比べて、自分がどっちの教科が得意なのかを知ることができる。

以下の式で、標準化できます。

```math
\hat{x}=\frac{x-\bar{x}}{\sigma}
```
$\sigma$ : 標準偏差
$\bar{x}$ : 平均

## 1.1 Scikit-learnを用いて実装

```python
# StandardScalerをインポート
from sklearn.preprocessing import StandardScaler
# モデルをstd_scalerに代入
std_scaler = StandardScaler()
# x_trainに適用　平均と標準偏差を算出
std_scaler.fit(x_train)

# データセットの値を変換する
x_train_std = std_scaler.transform(x_train)
x_test_std = std_scaler.transform(x_test)
```
【Bot Framework SDK】'turn' does not match memory scopes というエラーになる

対象バージョン：
Bot Framework SDK v4.13.0以降 (v4.13.3でも再現)

現象：
特定の機能を使うとエラーが起きる。
エラーメッセージ↓

    System.ArgumentOutOfRangeException: 'turn' does not match memory scopes:[] (Parameter 'key')
       at Microsoft.Bot.Builder.Dialogs.Memory.DialogStateManager.set_Item(String key, Object value)
       at Microsoft.Bot.Builder.Dialogs.ObjectPath.SetObjectSegment(Object obj, Object segment, Object value, Boolean json)
       at Microsoft.Bot.Builder.Dialogs.ObjectPath.SetPathValue(Object obj, String path, Object value, Boolean json)
       at Microsoft.Bot.Builder.Dialogs.Memory.DialogStateManager.SetValue(String path, Object value)
    :

エラーが起きた時に使った機能は以下2パターン

* AdaptiveDialogを使う
* QnAMakerDialogでマルチターンもしくはアクティブラーニングを使う

DialogStateまわりの不具合っぽい。

解決策：
SDKのバージョンを v4.12.2 に下げると解消する。

GitHubにissueが作られているので、いずれ修正されると思われる。
https://github.com/microsoft/BotBuilder-Samples/issues/3194

参考：
[c# - How to close the Qnamker dialog while using multiturn qna kb and LUIS with the help of orchestrator - Stack Overflow](https://stackoverflow.com/questions/67816160/how-to-close-the-qnamker-dialog-while-using-multiturn-qna-kb-and-luis-with-the-h)
pixe.laの草グラフをNotionに貼り付ける方法

### はじめに
[pixela](https://pixe.la/ja  "Pixela")のグラフ作成・可視化サービス、大変素晴らしいですね。

https://pixe.la/ja

上記ページあるいはネット等でも、グラフを作成する(更新する)方法は色々共有されているのですが、一方で、作成されたグラフを**見る方法**についてはあまり触れられていません。

pixelaのグラフを見るためには、pixelaが用意してくれるグラフのページか、もしくはグラフを埋め込んだなんらかのwebページを、ブラウザで開いて見なければなりません。pixelaの草グラフはその性質上そう頻繁に見るものでもなく、わざわざwebページを開くのはちょっと面倒だなと思っていました。

### Notionに貼り付けて見たい
私は最近、日常生活をNotion(とSlack)上で過ごしているため、Notion上で草グラフが眺められればいいなと思いました。ところが、pixelaのグラフのURLをNotion上でただ貼り付ける(/embedで)だけだと、貼り付けた時点のグラフが絵として張り付くだけになってしまい、草グラフが更新されてもNotionの画面上では反映されないのです。

![スクリーンショット 2021-06-17 17.17.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172921/705a1206-17ff-2d3f-9cda-106329ddcfa0.png)

### 任意ページのNotion Widget化
動的なページ内容をNotion上に貼り付ける方法はないものか？と思っていたのですが、最近になって、NotionのWidgetというものを知りました。Widgetであれば中身が更新されるのです。

[Apption.co](https://apption.co/ "Apption.co") というサービスがありまして、ここで様々なNotion Widgetが公開されています。

https://apption.co/

この中に **DIY Embed URL**というものがあって、これを使えば任意の内容を埋め込みページ化できます。

### pixe.laのグラフをWidget化する

Apption.coには無料枠があるので、アカウント登録して、DIY Embed URLを選択して、こんな感じでpixe.laのURL(iframeで括ったもの)を貼り付けて埋め込みページ化します。

![スクリーンショット 2021-06-17 17.27.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172921/033e212f-a5da-4607-3169-52d470423b87.png)

できたらURLが発行されますので(https://apption.co/embeds/xxxx 、みたいなの)、それをNotion側で/embedで貼り付けると、絵ではなくウィジット的に貼り付けられます。

![スクリーンショット 2021-06-17 17.34.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172921/60522aa0-fa89-ba67-6f04-491a5c72e51b.png)

ちょっとわかりにくいですが、下の方は動的なページです。ツールチップが出ているのがおわかりいただけますでしょうか。

ぜひやってみて下さい。

(なお私はnotionともapption.coともなんの関係もありません。アカウント登録が増えてもお金もらえたりしませんw。)
OpenShift 4.7 で Using non-groupfied API resources is deprecated and will be removed in a future release

# 現象
既存のyamlをOpenShift4.7で利用したところ、
>Using non-groupfied API resources is deprecated and will be removed in a future release, update apiVersion to "xxx/v1" for your resource

というWarning。リソースは問題なく作成されますが。
以下はImageStreamの例ですが、BuildConfig、DeploymentConfigも同様に。

```
$ oc create -f lab02-is.yaml
W0524 02:13:07.418890     744 shim_kubectl.go:55] Using non-groupfied API resources is deprecated and will be removed in a future release, update apiVersion to "image.openshift.io/v1" for your resource
imagestream.image.openshift.io/ocsample-lab02-is created
$ 
```

# OCP 4.7 Deprecated features
リリースノートにありました
https://docs.openshift.com/container-platform/4.7/release_notes/ocp-4-7-release-notes.html#ocp-4-7-apiversion-v1
>Currently, `oc` fixes `apiVersion` in YAML or JSON resource files OpenShift Container Platform resources from `v1` to the correct value for the object. For example, `v1` is corrected to `apps.openshift.io/v1` for `DeploymentConfig` objects. This behavior is deprecated and is planned for removal in a future release, and every resource that includes `*.openshift.io` must match the `apiVersion` value found in the [API index](https://docs.openshift.com/container-platform/4.7/rest_api/index.html).

#修正
各yamlで以下のように修正することで、Warningなくなりました

|                 | 修正前         | 修正後                            |
|:----------------|:---------------|:----------------------------------|
| ImageStream     | apiVersion: v1 | apiVersion: image.openshift.io/v1 |
| BuildConfig     | apiVersion: v1 | apiVersion: build.openshift.io/v1 |
| DeploymentConfig| apiVersion: v1 | apiVersion: apps.openshift.io/v1  |

現状`oc`コマンドが`apiVersion: v1`を`apiVersion: image.openshift.io/v1`などに適宜変換してくれますが、将来的に変換機能はなくなりますよ、ということで、前述 [API index](https://docs.openshift.com/container-platform/4.7/rest_api/index.html
) にある「API group」の値を指定してやりましょう、ということでした。
【WordPress】特定のプラグインの更新通知をオフにする

##フック使用の経緯
先日、「Contact Form 7」と「Contact Form 7 add confirm」プラグインでフォームに確認画面を追加しているサイトで、
「Contact Form 7」をアップデートしたら確認画面に遷移しなくなったという相談があり、
調べてみると「Contact Form 7 add confirm」は開発が3年以上停止しているプラグインで、「Contact Form 7」を5.4にアップデートすると「Contact Form 7 add confirm」の方が動かなくなってしまうバグがあるようでした。
（参考）[Contact Form 7アップデートでContact Form 7 add confirmが効かない](https://ja.wordpress.org/support/topic/contact-form-7%E3%82%A2%E3%83%83%E3%83%97%E3%83%87%E3%83%BC%E3%83%88%E3%81%A7contact-form-7-add-confirm%E3%81%8C%E5%8A%B9%E3%81%8B%E3%81%AA%E3%81%84/)

対処として、「Contact Form 7」のバージョンを5.3.2に戻した上、**今後他のプラグインと一緒に更新されてしまわないように「Contact Form 7」の更新通知を非表示**にしました。

このように、WordPressのプラグインはアップデートバージョンがあると管理画面に赤丸で更新通知が出ますが、
更新してしまうと、開発が止まっている古いプラグインなどに不具合が起こるなどの理由で更新したくない場合があります。

##更新通知が表示される場所
####[ダッシュボード > WordPressの更新]画面の更新表示
![WordPressの更新画面の更新表示](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253923/201d7430-9824-159a-d837-fc6f5631af11.png "WordPressの更新画面の更新表示")

####[プラグイン]画面の更新表示**
![プラグイン画面の更新表示](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253923/5a279430-46ce-d11c-4fbd-865ebb626c3f.png "プラグイン画面の更新表示")

##サンプルコード
以下のコードをfunctions.phpに追加すると特定のプラグインのみ、これらの画面に表示される更新表示がオフになるので、誤って更新してしまうことを防止できます。

```functions.php
add_filter('site_option__site_transient_update_plugins', 'hide_update_plugin_notice');
function hide_update_plugin_notice($data) {
    $plugin_file = 'プラグインのメインプログラムファイル'; // (※)
    if (isset($data->response[$plugin_file])) {
        unset($data->response[$plugin_file]);
    }
    return $data;
}
```

####※プラグインのメインプログラムファイル
WordPressインストールディレクトリから`wp-content/plugins/`以下の、更新通知を非表示にしたいプラグインフォルダ内のメインプログラムファイルを指定します。
例えば、「Contact Form 7」の場合、

```functions.php
$plugin_file = 'contact-form-7/wp-contact-form-7.php';
```
となります。
GoLandでGinkgoを利用する - External Tools利用編

# はじめに

GoLandには指定したtest funcのみテストをGUI上から選んで実行するような素晴らしい機能が存在しますが、Ginkgo等のgolang標準のtestingの仕組みから外れたライブラリを使用するとそれらを利用できなくなります。

```bash
go test -ginkgo.v -ginkgo.focus "test case"
```

のようにコマンドラインで実行したいテストケースを指定することは可能ですが
せっかくGoLandを利用しているのですからGUIから `Describe("test case")` もしくは `Context("sub test case")` 
を実行するためにGolandのExternal Toolsから呼び出せるように設定していきます。

# GoLand の External Tools で Ginkgo を呼び出す

## External Tools作成

- `GoLand` -> `Preferences` -> `Tools` -> `External Tools` を選択
- `+` ボタンを押下して Create Toolを開き以下のToolを作成

```
Name             : Ginkgo 
Description      : run Ginkgo test selected test case
Program          : $GoExecPath$
Arguments        : test -ginkgo.v -ginkgo.focus "$SelectedText$"
Working directory: $FileDir$
```

`$SelectedText$` のマクロで選択した文字列を拾ってきています。

## 使い方

- テストケースのテキストを選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536869/abb06335-43c5-614c-0ee0-db0fca439ed2.png)

- 右クリックメニューから `External Tools` -> `Ginkgo` を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536869/888aa500-75b5-0197-f459-91ffeb6784e3.png)
AWS SOA-C01 試験問題サンプル

#【AWS SOA-C01 試験問題サンプル】

最初、AWSの実務は運用になることが一般的だと思います。
そのために基礎を学んで今後に繋げていきます。


[AWS Certified SysOps Administrator–Associate (SOA-C01)
試験問題サンプル](https://d1.awsstatic.com/training-and-certification/docs-sysops-associate/AWS%20Certified%20SysOps%20Administrator%20-%20Associate%20_Sample%20Questions_JPN.pdf)の全10問解いてみました。

**間違えた問題のみを備忘録として残します。**

##問題と解答

Q、運用チームは、毎週　AWS Personal Healthダッシュボードで、次のAWSハードウェアメンテナンスイベントをチェックしています。最近、一人のスタッフが休暇中であったためチームはメンテナンスの予定を見落とし、その結果サービスが停止しました。
　チームはダッシュボードの確認を一人のスタッフに頼るのではなく、全員が次のメンテナンスを周知できるような簡単な方法を求めています。 

A、AWS Health サービスに基づいて Amazon CloudWatch Events イベントを作成し、チームで監視する Amazon SNS トピックに通知を送信する。

---
Q、AWS　共有責任モデルによると、次のAmazon EC2アクティビティのうち、AWSが責任を負うのはどれですか?

A、ネットワークインフラストラクチャのメンテナンス, ハイパーバイザーへのパッチ適用

---
Q、SysOps Administrator は AWS 上で運用されているウェブアプリケーションのセキュリティグループポリシーを設定しています。Elastic Load Balancer は Amazon EC2 インスタンスのフリートに接続します。各Amazon　EC2インスタンスはポート1521を通じてAmazon RDSデータベースに接続します。セキュリティグループの名称はそれぞれ elbSG、ec2SG、rdsSGです。
これらのセキュリティグループをどのように設定すべきでしょうか?

A、elbSG: 0.0.0.0/0 からポート 80 および 443 を許可する。
ec2SG: elbSG からポート 443 を許可する。
rdsSG: ec2SG からポート 1521 を許可する。
Ruby 2.5.1で作成したアプリがHeroku-20へ対応しておらず、デプロイできない。

Ruby on Railsを勉強し始めて約3ヶ月。
先日やっと、就活に使うポートフォリオが完成。。。
ひと段落したので、Qiita投稿デビューも兼ねて、最も頭を抱えたデプロイ過程でのエラーについて記録を残しておく。

#発生したエラー
<font color="Red">
「The Ruby version you are trying to install does not exist on this stack.」
「You are trying to install ruby-2.5.1 on heroku-20.」
</font>
ざっくり翻訳してみると、
<font color="Red">
「あなたがインストールしようとしているRubyのバージョンはこのstackに存在しないよ。」
「あなたはruby-2.5.1をheroku-20にインストールしようとしているよ。」
</font>

どうやら、Ruby2.5.1はHeroku-20には対応していないバージョンらしい...。

#対応するRubyバージョンの確認


https://devcenter.heroku.com/articles/ruby-support

↑HerokuのHPで、Heroku-20に対応するRubyバージョンを調べてみたところ、
<font color="Gray">
MRI:
2.6.7, Rubygems: 3.0.3.1
2.7.3, Rubygems: 3.1.6
3.0.1, Rubygems: 3.2.15
</font>

このように表記されている。(2021年6月17日時点)

#解決方法
確認したいずれかのRubyバージョンにアップデートする必要がある。

```
$ rbenv install --list    //インストール可能なrubyのバーションを確認
$ rbenv install 2.7.3    //2.7.3がインストール可能だったので、バージョン指定してインストール
$ rbenv versions　　//インストールできたか確認
$ rbenv global 2.7.3   //2.7.3をデフォルトに適用
```
一応、Ruby2.7.3へアップデートできたが、このままでは対応するRailsのgemが入っていないため、Railsコマンドが使えない。

Railsのgemをインストールする。

```
$ gem update --system  //gemのアップデート
$ gem install bundler　　//bundlerのインストール
$ gem install rails   //Railsのインストール
$ rails --version   //バージョンを確認
Rails 5.2.6
```

最後にGemfileの編集&bundleのアップデートも忘れずに。

```
ruby '2.7.3'  //アップデートしたバージョンに書き換える
```

```
$bundle update  //bundleをアップデート
```

これで完了!

#参考
・https://qiita.com/___xxx_/items/12c8ab953bc6aaeb8c24
・https://qiita.com/kamillle/items/5a7befd0ebad47378832
・https://mophie-blog.com/2020/08/29/the-rails-command-exists-in-these-ruby-versions/
plunkerでjexcel その2

#概要

plunkerでjexcelやってみた。
json読み込んでみた。

#サンプルコード

```

jexcel(document.getElementById('spreadsheet'), {
    url: 'test.json',
    columns: [{ 
        type: 'text', 
        width: 300 
    }, { 
        type: 'text', 
        width: 100 
    }, ]
});


```

#成果物

https://embed.plnkr.co/plunk/yFhUDeA0xoLMK1Mm

以上。
plunkerでjexcel

#概要

plunkerでjexcelやってみた。

#サンプルコード

```
jexcel(document.getElementById('spreadsheet'), {
    data: [
        ['Mazda', 2001, 2000],
        ['Pegeout', 2010, 5000],
        ['Honda Fit', 2009, 3000],
        ['Honda CRV', 2010, 6000],
    ],
    columns: [{ 
        title: 'Model',
        width: 300 
    }, { 
        title: 'Price', 
        width: 80
    }, { 
        title: 'Model', 
        width: 100 
    }],
    minDimensions : [5, 10],
});


```

#成果物

https://embed.plnkr.co/plunk/s0Th6lf4e0J77vns

以上。
SQLのLIKEとILIKE

- LIKEは、case sensitive
- ILIKEは case insensitive


## その他

patternがパーセント記号もしくはアンダースコアを含んでいない場合patternは自身の文字列そのものです。この場合LIKE式は等号演算子のように振舞います。patternの中にあるアンダースコア（_）は任意の一文字とのマッチを意味し、パーセント記号（%）は0文字以上の文字列とのマッチを意味します。(From https://www.postgresql.jp/document/8.2/html/functions-matching.html)


## Ref

https://docs.snowflake.com/ja/sql-reference/functions/ilike.html
［postgreSQL］DDL作成

##概要
CREATE TABLE文を使ってテーブルを作成するために知っておきたいDDLについて記載しています。



##はじめに
　　[本シリーズの目次はこちら](https://qiita.com/miyamura-figeo/items/57246bc5d32bd91af5ed)

##前提
・Windows
・テーブル定義書が作成されていること
##DDLとは
#####DDL（ディーディーエル）とはデータ定義言語。※Data Definition Language（データ・デフィニション・ランゲージ）の略
データベース（データを入れておく箱）に対して、あれこれ命令するときに使います。
　　例えば、
　　「このデータを入れて」
　　「このデータを削除して」
　　「このデータの値をこっちに変えて」などなど。

##CREATE TABLE文の書き方

必要な列の数だけ「列名 データ型 [列制約]」を「,」で区切りながら繰り返し記述し、テーブルを作成します。同時に、列やテーブルの制約も作成します。

```sql
CREATE TABLE テーブル名
　　　　　(列名 データ型 (データ長) [列制約],
　　　　　　･･･,
　　　　　　･･･,
　　　　　　[テーブル制約])
```

データ型は種類によって構文の書き方が異なるので以下例をあげてみます。
[例]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1185012/4bba7b3e-4558-1418-5de4-ce691813ee9b.png)




####実際にテーブル定義書の記載情報を元に構文を書いてみよう。

　定義書のNN欄に〇がついている場合notnull、ついていない場合はnullと入力
　定義書のPK欄に〇がついている場合⇒PrimaryKeyと設定


①下の定義書の№１～№９までの列名を記述していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1185012/a80b5784-0304-0e5b-c31b-8b482988a994.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1185012/3a66da54-5fa1-a9bc-c645-4c6d7f5776d7.png)


②このような構文ができます。

```sql
CREATE TABLE USER (
	ID int4 NOT NULL,
	NAME1 varchar(20) NULL,
	NAME2 varchar(20) NULL,
	PASSWORD bytea NULL,
	AUTHORITY_LV int NULL,
	MAIL varchar(200) NULL,
	UPDATE_U_ID int NULL,
	UPDATE_DATE timestamp NULL,
	DELFLG boolean NULL,
	CONSTRAINT USER_pkey PRIMARY KEY (ID)
);	

```


###参考
（https://www.atmarkit.co.jp/ait/articles/1703/01/news189.html#16b）
AWS各サービスの勉強の仕方について（初・中級者向け）

# これは何？

AWS強い先輩にAWSサービスの使い方の勉強について、共有いただきました。
その時にした質問が4OI、3OIからの脱却について相談したので、その内容となります。

### 備考

この資料では4OIや3OIという表現を使います。
それはこちらの[質問は恥ではないし役に立つ](https://qiita.com/seki_uk/items/4001423b3cd3db0dada7)記事より引用している内容です。
以下Qiita記事より引用です。

### Five Orders of Ignorance
Five orders of Ignoranceというペーパーで、無知のレベルには５つのレベルがあるとされています。

:laughing: 0OI: 全部分かっている
「答え」を持っている。あとは書き写すだけで完成する。
:smile: 1OI: 分からないことが分かっている
答えを得るための「質問」を持っている。
:worried: 2OI: 分からないことが分からない
「質問」を持たない状態。決定的な答えを引き出すための「質問」ができない。
:weary: 3OI: 分からないことが分からない状況を何とかする術を知らない
2OI→1OI→0OIと進んでいくためのプロセスがない状態です。
:astonished: 4OI: 無知にレベルがあることを知らない

Qiita記事の引用ここまで。

## AWS ブラックベルト

[AWSブラックベルト](https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-service-cut/)

```text
公式より引用：

サービス別の詳細情報を知りたい方はこのページより閲覧いただけます。
```

4OI→3OI→2OIと成長するための公式資料です。

初めて使うサービスは、まず上のリンクから、サービス別の資料を学ぶと良いそうです。
ハンズオンもあるため、やりながら学べます。


## QWIK LABS

[QWIK LAB](https://www.qwiklabs.com/?locale=ja)

```text
公式より引用：

Google Cloud Platform と アマゾン ウェブ サービス への一時的な認証情報が提供されるので、実際にサービスを使いながらクラウドについて学ぶことができます。
クラスルーム型とセルフペース型に分かれており、入門レベルから専門家レベルまで、また 30 分間のラボから数日間にわたるコースまで、幅広い選択肢が用意されています。
トピックは機械学習、セキュリティ、インフラストラクチャ、アプリケーション開発など多岐にわたり、あらゆるニーズにお応えします。
```

2OI→1OI→0OIと成長するためのサイトです。
Google Cloud Platformも合わせて使うことができます。

実際にサービスを手順書を読みつつ、手を動かしながら、実際に環境構築できるサービスです。
メリットとしては、手順書があるため次に何をすれば良いのがわかるほか、既存環境を汚さなくて済むし、organizationなどの管理者権限でないとできないような使う機会の限られるサービスも実際に手を動かして利用することができます。
¥5,000/月アカウントです。
テスト計画

非機能テストにおける観点

編集中
リクエストはご遠慮ください！

```
・性能テスト
処理速度や処理が正常に行われるために行うソフト

・ロードテスト
様々な状況で動作させて、期待どおりの結果を返すか確かめるテスト。
→注意※イレギュラー過ぎるテスト=現時点では物理的に動かせない環境ではしなくてもいいです。

・ストレステスト
要件で定義される限界、もしくはそれ以上の負荷を与えて動作を確かめるテスト。

・ユーザビリティテスト
実際にユーザーにとって理解されやすく、使いやすく、魅力的であるかどうかを確かめるためのテスト。

・保守性テスト
欠陥（バグ）があった場合の修正のしやすさ、もしくは新しい機能の追加のやりやすさなどを確かめるテスト。要注意→フォルダ構成が複雑すぎると保守性の難易度が上がります。

・信頼性テスト
要件で決めた回数、期間、条件で稼動できるかを確かめるテスト。
→実際に思うのは、これどちらかといえば・・・機能要件では？


・移植性
将来的に、ソフトウェアを別のハードウェアや、環境（クラウド環境や別のOS等）に移すことになった際の移植のしやすさを確かめるテスト。

　
```
ドメイン


```

ドメイン
インターネット上に存在するコンピューターやネットワーク識別するための名前

ドメイン名はピリオドで区切られた構造をしている
例：www.example.co.jp

jp　→　トップレベルドメイン
co　→　第2レベルドメイン
example　→　第3トップレベルドメイン
www　→　第4トップレベルドメイン

ドメイン名全体はICANNが管理していて、
さらにレジストリがトップレベルドメインをそれぞれ管理している。

DNS(Domain Name System)
ドメイン名の管理システム
ドメイン名をIPアドレスに変換する
ネームサーバーとフルリゾルバの2つから構成されている
ドメイン名でWebサイトを見るためには、
ドメインとサーバーのIPアドレスをDNSで紐付ける必要がある

ネームサーバー
ドメイン名とそれに紐づくIPアドレスが登録されているサーバー(電話帳のイメージ)
ドメイン名の階層ごとにネームサーバーが配置され、
そのネームサーバーが配置された階層のドメインに関する情報を管理する
フルリゾルバドメインに紐づくIPアドレスを問い合わせると、各ネームサーバーに確認し、問い合わせたIPアドレスを返すサーバーです。


リソースレコード
DNSのドメイン名とIPアドレスの紐付け1つ1つ（データ）のこと

リソースレコードのタイプ    内容
Aレコード   ドメインに紐づくIPアドレス
NSレコード  ドメインのゾーンを管理するネームサーバー
MXレコード  ドメインに紐づくメール受信サーバー
CNAMEレコード   ドメインの別名でリソースレコードの参照先
SOAレコード ドメインのゾーンの管理情報

```
「debug.test: no such file or directory」エラー時対処方法

`Visual Studio Code`でデバッグする際に、たまに出るエラーで悩まされていました。

```
could not launch process: open /Users/{user}/git/dgpwva/debug.test: no such file or directory
could not remove /Users/{user}/git/dgpwva/debug.test: remove /Users/{user}/git/dgpwva/debug.test: no such file or directory
Process exiting with code: 1
```

`debug.test`ファイルが見つからないよーというエラーです。
どうやらデバッグする際に自動で作成されたり、消えたりするファイルのようですが、原因は不明のままです。
ですので、根本解決ではありませんが、一旦エラーを回避できる方法を記載しておきます。

## 解決方法
`debug.test`がないと言われているので、作ってあげたらいいじゃんと思いました。
ですので、エラーのパスにファイルを作成してみたら、見事にエラーは出なくなりました。

## 根本解決に向けて
この件に関して知見を持っている方がいらっしゃったら、コメントで教えていただけると幸いです。
windows10でdocker環境構築

<h1>インストール</h1>
スタートメニューから「Windowsの機能の有効化または無効化」を検索。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630191/b7bc3b81-2bbb-5b00-1a71-763b4d289808.png)
<hr>
windowsハイパーバイザープラットフォームをチェック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630191/540134bd-d9e4-387a-5f64-40379640d7ab.png)
<hr>
DockerのホームページからGetting started→Docker DesktopのDownloadボタン押下。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630191/156ba35b-37fc-a151-40a4-9ba74c7b5cc0.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630191/71a27929-a305-59d3-3b74-9b2f35d5bf42.png)
<hr>

インストールはデフォルトで進めて完了する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630191/69ccbb67-d732-3a3f-ca5b-acc6d7a9daf3.png)
<hr>
<h1>windowsのセキュリティ編集</h1>
スタートメニューから設定→Windowsセキュリティ→アプリとブラウザーコントロール→Exploit protectionの設定→プログラム設定タブ押下→C:\WINDOWS\SYSTEM32\vmcompute.exeの編集ボタン押下→制御フローガード(CFG)のチェックをOffにし適用ボタン押下。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630191/03ac5f90-c7eb-41b0-2d6a-db5b2c1082bf.png)
<hr>
<h1>dockerコマンドでバージョン確認</h1>
スタートメニューから「Windows PowerShell」を検索。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630191/15db5348-a5b3-60cd-626d-189fbb4775ec.png)
<hr>
docker -vでバージョンを確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630191/1d68fb5a-2cde-38c5-197f-8c73abd51db2.png)
【kotlin】第一級オブジェクトとは ラムダ式

#■第一級オブジェクトとは
●変数や定数に代入できる。
●名前がなくてもかまわない
●関数のパラメータとして使える。
●関数の戻り値として使える。

例：Int型の1は第一級オブジェクトです。

``` kotlin
//変数に代入できる。
var a = 1
//関数の引数として使える。
fun hoge(num: Int): Int {
//関数の戻り値として使える。
 return num
}

println(hoge(x))
//結果: 1
```
変数xに代入できhogeメソッドの引数として1を代入した変数xを渡せる。
そのxを戻り値として指定できる。
こういったものを第一級オブジェクトと呼ぶ。

#■関数も第一級オブジェクト！！
1と同じように関数も代入できる。

``` kotlin
fun hoge(name: String): String {
   return "この人の名前は${name}です。"
}

//関数を変数に代入
val mi = ::hoge
println(mi("マイケル"))
//結果：この人の名前はマイケルです。
```

変数miは処理はhogeメソッドと同じです。

####■上記の変数miの型はどうなっているか？
関数の引数の型と戻り値の型を指定します。

``` kotlin

fun hoge(name: String): String {
   return "この人の名前は${name}です。"
}
//例：
val mi: (関数の引数の型) -> 関数の戻り値の型 = ::hoge

//実際
val mi: (String) -> String = ::hoge
```

#■ラムダ式で匿名関数の定義
どうせ変数に関数を入れるなら直接変数の中に関数を入れてしまえばいいのではないか方式

値を返すと言う意味でのreturnは不要
引数の型はどこかには入れる。

``` kotlin
//ラムダ式で直接関数を入れてる。
val mi: (String) -> String = {name -> "この人の名前は${name}です。"}
println(mi("マイケル"))

//結果：この人の名前はマイケルです。
```
■引数不要のラムダ式

``` kotlin
val mi = {"この人の名前はマイケルです。"}

//型の明記をすると
val mi: () -> String = {"この人の名前はマイケルです。"}
```
機械学習勉強記録 決定木

# 1　決定木
木のような構造を用いて、回帰、分類に用いるアルゴリズムです。
回帰に使用するものを特に回帰木と言います。
一つ一つの条件に対して、True,Falseで条件分けをしていきます。

標準化や外れ値除去は特に必要ありません。
ただし、用意に過学習に陥りやすく、ハイパーパラメータの調整が肝心です。

決定木は図によって可視化しやすいので、解釈性が高いモデルと言われます。

## 1.1 決定木の実装
決定木の実装は、以下のように行います。

```python
from sklearn.tree import DecisionTreeClassifier

dtree = DecisionTreeClassifier(random_state=0)
dtree.fit(x_train, t_train)

print('train score : ', dtree.score(x_train, t_train))
print('test score : ', dtree.score(x_test, t_test))
```

## 1.2 木構造の書き出し

```python
import graphviz
from sklearn.tree import export_graphviz

dot_data = export_graphviz(dtree)
graph_tree = graphviz.Source(dot_data)

graph_tree
```
今回は、`from sklearn.datasets import load_iris`のアヤメの花の種類の分類のためのデータを使っています。
出力結果はこのようになります。
![スクリーンショット 2021-06-17 15.52.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1456950/2a45296d-46ce-d776-f9fa-5419f92c25ec.png)
このように条件分岐を繰り返すことで分類を行なっています。
構造の上のほうにある条件ほど、分類に強い影響を与えるということがわかります。

## 1.3 それぞれの入力変数の影響度を確認する
`dtree.feature_importances`の属性を把握します。
これを可視化すると、

```python
feature_importance = dtree.feature_importances_
y = feature_names
width = feature_importance

plt.barh(y=y, width=width)
```
このような図が現れます。
![スクリーンショット 2021-06-17 15.57.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1456950/372325ec-0bce-8853-4d58-4b5afad0210e.png)
`petal width(cm)`が種類を識別する時にもっとも影響を与えているということがわかりますね。
（ちなみにpetalは花弁という意味です。）
【LeetCode】就活に向けたコーディングテスト対策 #07

#はじめに
こんばんは．
M1就活生が[LeetCode](https://leetcode.com/)から，easy問題を中心に**Python**を用いて解いていきます．

https://leetcode.com/

↓では，解いた問題のまとめを随時更新しています．
[まとめ記事](https://qiita.com/halpi/items/43761b89a1873dcc9a5c)

https://qiita.com/halpi/items/43761b89a1873dcc9a5c

#問題
今回解いたのは，難易度easyから [問題21のMerge Two Sorted Lists](https://leetcode.com/problems/merge-two-sorted-lists/) です．
問題としては，ソートされた`l1`，`l2`をマージして，それらをソートしたリストとして返すというもの．この際，`l1`，`l2`と返却値であるソートしたリストには，次のようなクラス指定があります．

```python
class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next
```

入力例と出力例は以下の通りです．

Example 1:

```python
Input: l1 = [1,2,4], l2 = [1,3,4]
Output: [1,1,2,3,4,4]
```

Example 2:

```python
Input: l1 = [], l2 = []
Output: []
```

Example 3:

```python
Input: l1 = [], l2 = [0]
Output: [0]
```

#書いたコード
今回の問題では，再帰を使って書いてみました．
まずはじめに，片方のリストが空であれば，もう片方を返します．このとき，入力される`l1`，`l2`はもともとソートされているので，今回の問題ではこのまま返すことができます．
次に，`l1`と`l2`の先頭要素を比較します．`l1`の方が小さければ，`l1.next`と`l2`を入力として再帰呼び出しすることで，`l1`を前進させます．同様に，`l2`の方が小さければ，`l1`と`l2.next`を入力として再帰呼び出しすることで，`l2`を前進させます．このとき，最終的には小さい値を最初の要素とするため，再帰呼び出し後，小さい方のリストを返します．

```python
class Solution:
    def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
        if not l1:
            return l2
        if not l2:
            return l1
        if l1.val < l2.val:
            l1.next = self.mergeTwoLists(l1.next, l2)
            return l1
        else:
            l2.next = self.mergeTwoLists(l1, l2.next)
            return l2
```

再帰を使わない方法での解法があったので，参考に書いてみました．
まず，マージするリストの先頭である`dummy`と，どの値を`dummy`に追加すべきかを探すための`tmp`を初期化します．
`l1`と`l2`がどちらも空でない場合に，`l1`と`l2`の先頭要素を比較します．どちらか一方が空の場合は，もう片方を返すようにするためです．`l1`，`l2`，`tmp`を進めていくことで，マージしたリストを作っていきます．

```python
def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
    dummy = tmp = ListNode()
    while l1 and l2:
        if l1.val < l2.val:
            tmp.next = l1
            l1 = l1.next
        else:
            tmp.next = l2
            l2 = l2.next
        tmp = tmp.next
    tmp.next = l1 or l2
    return dummy.next
```

#おわりに
今回の問題は入力値，返却値の型指定など今までにないパターンだったので，色々と調べながら試行錯誤してみました．
pythonのコピーは癖があるものの，今回のような使い方もできるのかと勉強になりました．

今回書いたコードはGitHubにもあげておきます．

https://github.com/halpi17/LeetCodeStudy/blob/master/021/mergeTwoSortedLists.py

[前回](https://qiita.com/halpi/items/84f93e57d6742678dff4)　[次回](https://qiita.com/halpi/items/62fed7603931695f9574)
`docker-compose build` -> エラー`Can't find a suitable configuration file in this directory or any parent. Are you in the right directory?`

# TL;TR
- docker-composeを再インストールする
- または、環境変数$COMPOSE_FILEに`docker-compose.yml`を指定する。



# エラー文
```
        Can't find a suitable configuration file in this directory or any
        parent. Are you in the right directory?

        Supported filenames: docker-compose.yml, docker-compose.yaml, compose.yml, compose.yaml
```


# エラー文の内容
- コンフィグファイルないよ

# docker-composeを再インストールのはなぜか
stackoverflowにそういった解決法が多く乗っていたから。

しかし、私はmacだったからか、docker-composeはDockerアプリに内蔵されており、linuxと同じ感じでアンインストール、インストールしても解決しなかった。

# 環境変数$COMPOSE_FILEに`docker-compose.yml`を指定する。
私の場合、developブランチとdocker環境ブランチが異なっており、それでdocker-compose.ymlへパスが通っていない？スコープに入っていない？感じだったのが原因だと思われる。詳細がわかったら追記したい。

```
export COMPOSE_FILE=docker-compose.local.yml
echo $COMPOSE_FILE
```


# 参考
https://docs.docker.com/docker-for-mac/install/
https://suin.io/535
Windowsを買って最初にやった設定一覧


長年のMacユーザーだったが，事情あってWindowsを使うことになった．

Windowsを買って最初にやった設定を備忘録的にまとめておく



#一般的に役に立つと思われるもの
・AHKのインストール
Colemak Widemod化，Altキー一発押しでのかな英数切り替え（Mac風）
https://qiita.com/r-takahama/items/76d6319cf0665986467e

https://ja.stackoverflow.com/questions/25050/autohotkey%E3%81%A7googleime%E3%81%AE%E5%85%A5%E5%8A%9B%E3%82%92%E8%8B%B1%E6%95%B0%E5%85%A5%E5%8A%9B%E3%81%AB%E5%88%87%E3%82%8A%E6%9B%BF%E3%81%88%E3%82%8B%E6%96%B9%E6%B3%95

https://clrmemory.com/pc-mobile/windows/autohotkey-alt-eisuu-kana/

https://github.com/karakaram/alt-ime-ahk


・Zipファイルの解凍アプリ
最終的にPeaZipをインストールして，右クリックから「ここに解凍（Smart）と選択するのが一番Macとぴったいrな捜査官になることがわかった．無論，ダブルクリックでその操作ができるMacに対して，Windowsではそれを右クリックからゴニョゴニョやらなければいけないだけあって，Macのほうがさすがに利便性は高いなと思わされる．

・PDFビュワーは未だに難民．MacのPreviewを上回るソフトウェアにはなかなか巡り会えない．

・Quick Lookのインストール．これでスペースキー一つでMacと

・Google日本語入力のインストール．
→「zl」とかの，Macと同じようなコマンドが使える．





#個人的に今の自分が使うもの
・Track Pointに慣れる

・Python，VSCode，その他諸々の環境構築

・お役立ち系のGoogle Drive PCアプリ，Trello，Notionなどのインストール

・Autocad mechanical，Inventorのインストール
MLOpsとは

## MLOpsとは

MLOpsとはDevOpsの概念に機械学習のライフサイクルの管理を上乗せしたものであり、CI/CDに加えてCT(Continuous Training)も考慮します。
また、DevOpsがエンジニアと保守運用担当者のコラボレーションやコミュニケーションを対象にしているのに対し、MLOpsではそこにデータサイエンティストが加わります。

2012年からの機械学習のビックブームにより機械学習が「研究」から「実用」へと急激に広まっていきました。しかし、機械学習の実運用では、開発環境の再現、ライブラリのバージョン管理、時間の経過によるモデルの劣化など多くの課題があります。そこでそれらの課題に対するアプローチとして提案されたのがMLOpsです。

下の図Googleの研究者によって描かれた機械学習のエコシステムの図です。

![Google-research-ml-infrastructure.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407956/0f566a70-b3ef-47e6-5deb-a745a179738c.png)

見ての通り、本番運用する上で機械学習そのものはごく一部に過ぎません。
データ管理やモデルのバージョン、性能の管理など実際にはそのほか多くの要素が複雑に作用しあっています。

MLOpsではこれらの要素をML Piplineとして定義し、ツールを用いてパイプラインの管理を行います。

![c2707d30-ea7a-4228-9c58-ac6304c21276.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407956/33581bb5-5fe1-5ae3-78a2-4b5c3e8a4f77.png)


## ML Piplineとは

ML Piplineは基本的には以下の7つのステップに分けることができます。

1. Data ingestion
1. Data validation
1. Data processing
1. Model training
1. Model validation and tuning
1. Model deploy
1. Monitoring performance and capturing new data


ML Piplineではワークフローをパイプラインのコンポーネントとして定義することで以下のメリットを享受することができます。

 - 既存のモデルのメンテナンスから解放されて、新しいモデルの開発に専念できる
 - バグを未然に防ぎ、また、デバッグしやすくなる
 - プロダクションで用いているモデルの性能の監視をトラッキングして性能が悪くなった場合には自動で通知できる
 - コンポーネントをDockerやBeamを用いて標準化することにより開発環境の移行が簡単に行える
 - エンジニアからデータサイエンティストまでチームとしての生産性が向上する


## MLOpsツール

### Kubeflow

Kubeflowは機械学習パイプラインをK8s環境で実行するためのツールです。
元々はGoogle社内で使用されていたものを社外に向けて一般化してオープンにしたもの。
サンプルやチュートリアルも豊富です。

https://www.kubeflow.org/

公式サンプル

https://github.com/kubeflow/pipelines/tree/master/samples/tutorials

チュートリアル

https://www.kubeflow.org/docs/components/pipelines/

## TensorFlow Extend (TFX)

TFXはML Piplineをコンポーネントとして実装し、それらを管理、実行するためのライブラリー郡です。
公式では、

>TensorFlow Extended（TFX）は、本番環境用 ML パイプラインをデプロイするためのエンドツーエンドのプラットフォームです

と説明されています。

TFXでは以下のように、それぞれベースとなるパイプラインコンポーネントがAPIとして提供されていてそれらを使って（またはカスタマイズして）、ML Piplineを実装することができます。

![0*4wQdCndV1ame3Bpm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407956/9d31fbdf-3f32-b822-1e4f-7cbaf82cfd6a.png)


Tensorflowと名前についていますが、TensorFlowに限らず他のモデルにも対応しています。（親和性は劣りそうです）
TFXで定義したパイプラインはBeamをベースとしており、KubeflowやAirflow、Dataflowなど環境に依存せずに使うことができます。
また、TFX自体、TF servingやTF Data validator, TF Model analysisなど多くのライブラリーからなっており、そのほかにもTF RecordやgRPCなどについての知識も必要となります。

https://www.tensorflow.org/tfx
instanceofについてメモ（処理の切り替え）[JavaScript]

instanceofについてのメモ。

##instanceof
>instanceof 演算子は、オブジェクトが自身のプロトタイプにコンストラクタの prototype プロパティを持っているかを確認します。戻り値はブール値です。

どのコンストラクターから生成されたオブジェクトかを確認することができる。

##構文
>object instanceof constructor

##使用例
オブジェクトによって処理を切り替えたいとき

```JavaScript
function fn(arg) {
    // 配列とオブジェクトでは値の設定の仕方が変わる
    // 渡ってきたインスタンスの種類によって処理を切り替える
    if(arg instanceof Array) {
        arg.push('value');
    } else {
    arg['key'] = 'value';
    }
    console.log(arg);
}

fn({});
```

##参考・引用
[instanceof - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/instanceof)
PATHを通すって結局何をしているの？

<b>PATHを通すって結局どういうこと？</b>
なんとなくでしか理解していなかったので改めて調べてみた。

# PATHを通すとは
一言でいうと<b>「どこからコマンドを打っても実行できるようにする」</b>ということ。
誰もがお世話になっている「pwd」「cd」「ls」などのコマンドはどのディレクトリにいても使うことができるが、これはPATHが通っているから。<font color="OrangeRed">※1</font>

勘違いしていたのは、全てのコマンドはいわゆる呪文のようなものではないということ。
打ち込んだコマンドは<b>全てファイルの名前を指し、あくまでそのファイルの中身を実行している</b>ということ。
つまり、「pwd」「cd」「ls」もPC内のとあるファイル名であり、そこにPATHを通して実行しているに過ぎない。

例えば「cd」というファイルの中身を確認すると以下の内容となる。
正直意味はわからないが、このファイルの中身が実行されることでディレクトリの移動ができている。

```
#!/bin/sh
# $FreeBSD: src/usr.bin/alias/generic.sh,v 1.2 2005/10/24 22:32:19 cperciva Exp $
# This file is in the public domain.
builtin `echo ${0##*/} | tr \[:upper:] \[:lower:]` ${1+"$@"}
```
<b>※cdファイル内容の確認法※</b>
ターミナルで「where cd」と打ち込み「cd」ファイルの場所を確認すると「/usr/bin/cd」と出る。
「cat /usr/bin/cd」コマンドを叩くか、Finder上で「command + shift + G」で「/usr/bin/cd」を検索し、「cd」ファイルをエディタに投げる。

# PATHを通すとは具体的に何をしているのか

ターミナルで「echo $PATH」と打ってみると、現在自分が通しているPATH一覧が出てくる。
コロンで区切られてたくさんのPATHが出てくるはず。
以下は見やすいように縦に記載した一部抜粋の一例。

```
/usr/local/opt/php¾7.4/bin
/usr/bin 
/bin 
/usr/sbin 
/sbin
```

これはどういうことなのか。

何かしらのコマンドを実行した際、まずこのPATHに登録されたディレクトリ配下のファイルを探しに行く。<font color="OrangeRed">※2</font>
例えば「ls」コマンドを実行すると、「/usr/local/opt/php¾7.4/bin」配下に「ls」ファイルがないかを探し、もしなければ次のPATHへと上から順々に探しに行く。
「ls」は「/bin」配下に位置するので、上から3番目の「/bin」が読み込まれた時点で処理（「/bin/ls」）を実行する。
（「ls」がどこに位置するかは「where ls」で調べられる。）

改めてなぜPATHを通すのか考えてみる。
本来であれば全てフルパスで実行するものだが、毎度使うコマンドのフルパスをいちいち打つのは面倒だよね、ということでPATHを通すのである。
よって、当然ながら「/bin/ls」と打ち込めば「ls」コマンドと同様の結果が得られる。

ここまで理解してみると、「なるほど、PATHはたくさん通しておけば便利なのか」という思考になるが、ここで注意したいのは<b>PATHは上から順番に読み込まれる</b>ということ。

例えば、phpファイルを異なるバージョンで所持しており、それぞれにPATHを通している場合。
phpコマンドを実行した際に行われるのは、上に位置するphpファイルのみである。
phpの7.4と8.0のどちらにもPATHを通していたとしても、上に位置するPATHがphpの7.4であれば、php8.0は常に読み込まれないことになる。


<br>
とまあここまで書いてPATHを通すということの概念的なところは理解できたつもりだ。
肝心のPATHの通し方は以下の記事に詳細が書かれているので参照。

https://qiita.com/soarflat/items/d5015bec37f8a8254380

# 補足
補足というか完全に別の話にはなるが、 PATHについて調べていくうちに腹落ちしたことがあったので記載。
ブラウザ上でぽちぽちしてダウンロードするときと、コマンドを叩いて「〇〇〇〇 install」みたいにするのって何が違うの？と常日頃感じていた。（composerを想定）

結論、ブラウザ上のぽちぽちでPC内にダウンロードして、そのファイル内に用意された「〇〇〇〇 install」というコマンドでカレントディレクトリで使用可能にしている、という理解に至る。

つまり、PC内にツールをダウンロードして、それをいわば供給源として各プロジェクトごとに必要に応じてインストールしているということだろう。

間違ってたらご指摘お願いします。

# 注釈
<font color="OrangeRed">※1</font>
正確には「pwd」や「cd」で実行されているのはビルトインコマンドというものであり、いわばシェルに備え付けのコマンドである。
そのためどこから打っても実行できるようになっている。

とはいえ「where pwd」や「where cd」でファイルの場所を探せば実際にあるし、確かにPATHも通っている。
ただし処理優先順位としてビルトインコマンドのほうが上位にあるため、実際に実行されているのはビルトインコマンドである。
つまり、どこからでも「cd」や「pwd」が使えるのは、「PATHが通っているから」ではなく「ビルドインコマンドだから」というのが正しい。

ちなみに「which where」で叩けばわかるが、「where」コマンドもビルトインコマンドである。
わかりやすい記事があったので以下に記載する。


https://wa3.i-3-i.info/word11741.html


https://www.atmarkit.co.jp/ait/articles/1710/19/news031.html


<font color="OrangeRed">※2</font>
上記と同じだが、コマンドが打ち込まれた際にまず探しに行くのはビルトインコマンド。
Android 外部SDKを使用した場合にreleaseビルドで動作しないとき

トラブルシューティング with @Umibows 

# 背景
- Flutter
- nativeモジュールは外部のSDKを使用
- debugビルドだと動く
- releaseビルドだと動かない

# 問題
ハード機器との接続において使用した外部SDKが、releaseビルドだと動かない問題に直面。 

# Solution
https://github.com/flutter/flutter/issues/42320#issuecomment-540490103

```
buildTypes {
        release {
            signingConfig signingConfigs.release

            shrinkResources false
            minifyEnabled false

            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
```
HTML&CSSとWebデザイン入門講座本をやってみた結果

# HTML&CSSとWebデザイン入門講座本 やってみた結果

数日前、こんな本を書店で見つけた。

https://www.amazon.co.jp/1%E5%86%8A%E3%81%A7%E3%81%99%E3%81%B9%E3%81%A6%E8%BA%AB%E3%81%AB%E3%81%A4%E3%81%8FHTML-CSS%E3%81%A8Web%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E5%85%A5%E9%96%80%E8%AC%9B%E5%BA%A7-Mana/dp/4797398892

pythonでwebアプリを作ったことがあったので初心者ではないが、webページを作ってみたくて買ってみた。

完成形は載せれないので、
写真の全てをペンギンに変えてみた。

# ペンギンホームページ作ってみた。
それがこちらです。

https://nishi3607.github.io/WCBCafe/

本の名残が残るペンギンホームページとなりました。

# やってみた感想
- 飽き性で参考書を１冊読み終えたことがない私でも最後までできた
 
- その上、自分なりに変えてみて、尚更理解が深まった。

- デザインって楽しいと思えた。
コンストラクター内の記述によるnew演算子の挙動の違い


コンストラクター内の記述によってnew演算子の挙動が変わることについてまとめました。

##new演算子とは
コンストラクター関数からインスタンスを生成するために使用する演算子


##コンストラクター関数の戻り値がオブジェクトの場合

```JavaScript:
function F(a, b) {
  this.a = a;
  this.b = b;
  // 戻り値がオブジェクト
  return {a : 1};
}

// prototypeに無名関数を追加
F.prototype.c = function() {}

// インスタンス化
const instance = new F(1, 2);
console.log(instance);
```

![スクリーンショット (269).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1092461/63b4a336-b51b-00ee-9b89-8e7983402eb5.png)


returnオブジェクトを__新しいインスタンスオブジェクト__として呼び出し元に返す
→prototypeにメソッドcは存在しない

##コンストラクター関数の戻り値がオブジェクト以外の場合、または、returnが定義されていない場合

```JavaScript:
function F(a, b) {
  this.a = a;
  this.b = b;
}

// prototypeに無名関数を追加
F.prototype.c = function() {}

// インスタンス化
const instance = new F(1, 2);
console.log(instance);
```

![スクリーンショット (270).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1092461/c5d98298-f868-0d3b-376b-b2464792a6ab.png)


コンストラクターの__prototypeのプロパティを＿proto＿にコピー__し、コンストラクター関数で使用しているthisを呼び出し元に返却する
→thisに格納されたa, bを持ったオブジェクトが生成される
→prototypeにメソッドcが格納される
YouTubeの動画を途中から再生するURLを作る方法をシンプルに解説

メインブログのユニコブログ&reg;では、YouTubeのタイムスタンプを活用した収益化の方法を解説している記事などがあります。

<a href="https://unicorn-blog.jp/archives/5611" target="_blank" rel="noopener">● YouTubeの動画にタイムスタンプでチャプターを追加して区切りや目次を設定する</a>

このQiitaの記事では、タイムスタンプを活用した収益化方法をサポートするために、タイトル通り<b>YouTubeの動画を途中から再生するURLを作る方法</b>をシンプルに解説します。

##YouTubeの動画を途中再生したい場所で指定してサイトに埋め込む方法
まず、結論としてのURLの組み込み方法は

hxxps://youtu.be/1qJXlEFz5JI?t=400s

です。

ポイントは

YouTubeのURLの1番後ろに

<b>?t=400s</b>

が付いているところです。

通常は

hxxps://youtu.be/1qJXlEFz5JI?t
だけを埋め込めば、頭出しで再生されます。

通常使用するURLの後ろに
?t=400s
というURLの追加をすると、途中から再生します。
 
##途中再生の指定の仕方
途中再生の指定の仕方はとても簡単です。

?t=400s

というのは、「400秒目から再生してください」という指示のURLです。

なので動画の始まりから2分進んだところで再生してほしかったら
?t=120s
と、URLに追加します。

##事例紹介
下記のリンクをクリックすると、指定したYouTubeの動画に飛ぶようになっています。
<a href="https://www.youtube.com/watch?v=1qJXlEFz5JI&t=400s" target="_blank" rel="noopener">【LINEメッセージスタンプの作り方】みずにゃメイキング映像 | タイムラプス #5の06:39あたり 窓から空を眺めるみずにゃに飛びます。</a>

リンク先のURLを確認してください。
再生動画のURLにプラスされて<b>「?t=400s」</b>が追加されています。

それでは^ ^
sonyNNCのpython環境でjupyter notebookを立ち上げる

sony NNC210で物体検出のチュートリアルを試してみた。
学習後のバウンディングボックス描画はNNC本体でやってくれないので手動で行う必要がある。
ここでは、NNCのpython環境の流用について記載する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1520250/f906dac6-6938-63d2-f315-4043c4d2813a.png)

https://support.dl.sony.com/wp-content/uploads/sites/2/2020/07/06100430/starter_guide_object_detection.pdf

描画にはいくつか方法があるが、チュートリアルからpythonを利用した方法を採用した。環境構築を１から行う方法もあるが、
＞Windows版Neural Network Consoleをご利用の場合、同梱のPython環境がそのまま利用可能です。
と記載を発見したため、jupyter notebookかvs-codeで実行したいと考えた。
##jupyter notebookのNNC環境へのインストール
NNCのプロジェクト画面などを右クリックして more toolsからコマンドプロンプトを起動。このコマンドプロンプトがNNCのpython環境であるため、
pip install jupyter を実行。
データ等がある上位のフォルダ位置で
jupyter notebook　でノートブック環境が起動する。
NNC環境のコマンドプロンプトを残せば、GUIのNNCは終了しても大丈夫。

##バウンディングボックスの表示
あとは、チュートリアルのコマンドをコピーして実行可能。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1520250/798965fa-f9f3-03f0-f020-f7b2abfc3a7b.png)
チュートリアルはPDFなのでちょっと再利用しづらい。４５ページのbottomの右のシングルクォーテーションが全角なので半角に修正しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1520250/30cdcf4c-1aa0-427e-7be8-b56c1046497e.png)

##vscodeでの利用
エクスプローラから、任意のpythonファイルを開く。左下のインタプリターの選択でNNC解凍ファイル内のpython.exeを指定。右上の実行ボタン。
ターミナルに下記エラーが出るが、正常に実行される。
＞PS D:\neural_network_console> conda activate Python
＞ません。名前が正しく記述されていることを確認し、パスが含まれている場合はそのパスが正しいことを確認してから、再試行してください。

ターミナルでpythonと打ち込んで実行されるpythonと実行ボタンからのpythonは異なる模様。実行ボタンでのpythonをフルパスで指定して
neural_network_console/libs/Python/python.exe -m pip list
としてやると、ライブラリ一覧を所得し、nnablaも使えることが分かる。

こちらは、GUIのNNCを実行しなくても利用できる。
TailWindCSSのクラス名を考えなくていいというのはデメリットだと思う

Tailwindcssを軽く触ってみてclassが長くなって可読性低そうとか色々思うところがあったんですが、なによりも最悪なのは、class名を考えないことをメリットとしてあげていることだと思います。

コンポーネント設計やドメイン設計、命名規則などを整備していれば、基本的にクラスの命名で悩むことはあまりありません。
むしろHTML要素に名前がないことで、その要素がなにを現しているかがソースコードからはわかりにくく、メンバーのアサイン時やソースコードを見返した際に手間がかかります。

例えば`Card`というコンポーネントがあった時、Tailwindの場合HTMLを見ただけでは、なんのコンポーネントか把握することができません。

```HTML
// 生CSS
<div class="card">
  <img class="thumbnail" src="hoge">
  <p class="summary">hogehogehogehogehogehogehogehoge<p>
</div>

// Tailwind
<div class="p-8">
  <img class="..." src="hoge">
  <p class="...">hogehogehogehogehogehogehogehoge<p>
</div>

// styled-component
<Card>
  <thumbnail src="hoge">
  <summary>hogehogehogehogehogehogehogehoge</summary>
</Card>
```

デモサイトなどの設計や可読性・保守性をあまり気にせずに速度重視でなにか作りたい場合は良さそうですが、プロジェクトで採用することは現状なさそうです。
db driver 作成方法

# Overview
- 作り方確認


# sample
- とりあえずコード

```go
package stubs

import (
	"context"
	"database/sql"
	"database/sql/driver"
	"fmt"
)

func init() {
	sql.Register("stubs", &stubDriver{})
}

type Rows struct{}

func (r *Rows) Columns() []string {
	return []string{}
}

func (r *Rows) Close() error {
	return nil
}

func (r *Rows) Next(_ []driver.Value) error {
	return nil
}

type Conn struct{}

func (dc *Conn) Query(_ string, _ []driver.Value) (driver.Rows, error) {
	return nil, nil
}

func (dc *Conn) QueryContext(ctx context.Context, _ string, _ []driver.NamedValue) (driver.Rows, error) {
	return nil, fmt.Errorf("test")
}

func (dc *Conn) Prepare(_ string) (driver.Stmt, error) {
	return nil, nil
}

func (dc *Conn) Begin() (driver.Tx, error) {
	return nil, nil
}

func (dc *Conn) Close() error {
	return nil
}

type stubDriver struct {
}

func (d *stubDriver) Open(_ string) (driver.Conn, error) {
	return &Conn{}, nil
}
```

# refernece
https://notes.eatonphil.com/database-basics-a-database-sql-driver.html

https://github.com/eatonphil/gosql/commit/0d0aa61a74580a6aef11296741abfba4e1d4ae5c#diff-749da71b40f8ff06fc9e78ce917b0cce
【mysql】ユーザー作成・DB作成・権限付与

# ユーザーの一覧を確認

```
select host, user from mysql.user;
```

# ユーザーの作成

```
create user 'user_name'@'%' identified by 'user_password';
```

# データベースの確認

```
SHOW DATABASES;
```

# データベースの作成

```
CREATE DATABASE `user_database`;
```

# ユーザーの権限の確認

```
SHOW GRANTS FOR user_name;
```

# ユーザーの権限の付与

ユーザーに作成したデータベースの権限を付与します。

```
GRANT ALL PRIVILEGES ON `user_database`.* TO 'user_name'@'%'
```
[MacBook]コメダ喫茶店にてwifiがつながらない時の対処法

#はじめに
地味にあるあるなので、まとめました笑

#起きていること

Komeda_Wi-Fiに接続はできているのにネット接続できない！！
![スクリーンショット 2021-06-17 14.21.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1128031/5df405b4-b37d-ce90-34d9-9fac9a5c2361.png)


#対処法
DNSが、「8.8.8.8」で固定されてしまっていることが問題なので、これを消してしまって以下のようにします。
そのあと,[jwifi.jp](jwifi.jp)に接続して確認します。

![スクリーンショット 2021-06-17 14.23.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1128031/4e875259-8b28-e03c-b4a0-1cde579f1d73.png)

#おわりに
意外と困っている人がいるとのことでしたのでまとめましたが、、、簡単すぎかな？？？
[Vagrant]`Could not rename the directory`エラーの対応

Vagrant起動しっぱなしでPC再起動してしまって、エラーが出るようになってしまった。
ボックス消して起動し直すコマンドをメモしておきます。

# エラー詳細

```shell:エラー詳細
Stderr: VBoxManage: error: Could not rename the directory '/Users/yamada/VirtualBox VMs/xxxxxxxxxxx' to '/Users/yamada/VirtualBox VMs/MY_BOX_NAME' to save the settings file (VERR_FILE_NOT_FOUND)
```

# 対応方法

```shell:コマンド
vagrant destroy

rm -rf /Users/yamada/VirtualBox\ VMs/MY_BOX_NAME
```
コマンド実行後、`vagrant up`したらちゃんと起動するようになりました。
git　コマンド集


#gitのコマンド

##・git　バージョン管理
現在のバージョンを確認できる！

```
$ git --version 
```

##・git　バージョンの更新
```
$ brew update
```
上記の作業が終わってから、下記も行う！！！

```
$ brew install git
```

##git 名前・メール・atom 設定
```
・githubのユーザー名
$ git config --global user.name"github user name"
・メールアドレス
$ git config --global user.email 登録したメールアドレス
・atomの設定
$ git config --global core.editor "atom --wait"

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
設定した内容の確認
$ git config --list 
```

##git ファイルの内容を確認
```
cat ~/.gitconfig
```

##git　よく使用するコマンド
**・cdコマンド**
ディレクトリを移動します。

**・lsコマンド**
ディレクトリの内容を表示します。 ls -a コマンドで、隠しファイルを含めたディレクトリ全内容を表示します。

**・mkdirコマンド**
ディレクトリを新規作成します。

**・rmコマンド**
ファイルを削除します。

**・cpコマンド**
ファイルをコピーします。

**・mvコマンド**
ファイルの移動とファイル名の変更を行います。

**・catコマンド**
ファイルの中身を表示します。


##Mac/ターミナル/ローカルリポジトリを行う
```
どこでフォルダーを作成するか確認すること！！！
フォルダーの場所まで移動して下記を行う！！！

・フォルダーを作成
$ mkdir フォルダー名

・作成したフォルダーに移動
＄　cd 　フォルダー名

・フォルダー内にgitに必要なファイルを作成
＄　git init 　　　　　　//.git/が作成されその中にファイルが作成される！

・フォルダーに中身の確認
＄　ls -a

・gitの中身を確認
＄　ls .git/
→HEAD	config	hooks	objects	refs　　

```

##リポジトリのコピーを行う 開発で参加する際に
```
GithubからCodeのコピーを行い、下記に貼り付ける！

$ git clone https://github.com/___________.git
```

##gitステージの変更
```
＄ git add ファイル名
$ git add フォルダー名
$ git add .
```


##gitのコミット　コマンド
```
$ git commit
$ git commit -m "<メッセージ>"  //エディターを立ち上げずに行える
$ git commit -v　　　//変更内容を確認ができる
```

##変更されたファイルの状況の確認
```
$ git status
```

##git　変更差分を確認する
```
・git addする前の変更の確認ができる！！
$ git diff
$ git diff ファイうめい

・git addした後の変更に確認ができる！！
$ git diff --staged
```

##git 変更履歴を確認する
```
・変更全てを確認
$ git log

・１行で表示する
$ git log --oneline

・特定ファイルの変更履歴を確認
$ git log -p ファイル名

・最近の変更履歴を確認できる
$ git log -n 数字　　　　//最近のコミットが　【記述した数字分】　確認できる！！
```

##git ファイルの削除を記録する
```
・ファイルごと削除
$ git rm ファイル名
$ git rm -r ディレクトリ名

・ファイルを残したとき　　　　　　　　//リポジトリ側だけ削除
$ git rm --cached ファイル名

------------------------------------------------
・ファイルを復活させるには、下記２つのコマンドを行う！！！
$ git reset HEAD ファイル名
$ git checkout ファイル名
```

##git ファイルの移動を記録する
```
・ファイル名を変更
$ git mv 旧ファイル　新ファイル

・以下も同じコマンド
$ mv　旧ファイル　新ファイル
$ git rm 旧ファイル
$ git add 新ファイル
```

##リモートリポジトリを新規追加/githubへ送信
```
$ git remote add origin https://github.com/_____________/repo.git

.githubへ送信
$ git push リモート名　ブランチ名
$ git push origin master 
↓
$ git push -u origin master  
//-uオプションを使用すると、次回以降git pushのみで使用可能
```

##git コマンドにエイリヤスをつける
```
・入力が楽になる！！！ コマンドが長いものに対して使用しやすい！！！
--globalを付けることで、【PC全体の設定】になる！！！

$ git config --global alias.ci commit  //commitは、git ciのみでできるようになる
$ git config --global alias.st status  
$ git config --global alias.br branch
$ git config --global alias.co checkout
→$ git ci  (git commit)
→$ git st  (git status)
→$ git br  (git branch)
→$ git co  (git checkout)

```

##gitの管理から外す/ファイルを管理しない/ファイルを見せない
```
パスワードなど、gitに載せたくないファイルに対して行う！！！
.gitignoreファイルに指定する。

$ vim .gitignore  //ファイルを作成

設定ができるようになるので、iコマンドを押して、insertに変更し隠したい拡張子を設定
*.拡張子
*.php
*.js　　　　など

最後にesc- :wqで終了する
$ git status で確認すること

```
envoyでhttps対応

# 動機
ローカルで動かしているwebサービスをhttps化したい。
nginx, haproxy使うのはよく見かけるけど、せっかくなのでenvoyで同じことをしてみたい。

# 設定
v3書式対応。
ローカルの10001で立っているサービスを10000でhttps化する。

```envoy.yaml
static_resources:
  listeners:
  - address:
      socket_address:
        address: 0.0.0.0
        port_value: 10000
    filter_chains:
    - filters:
      - name: envoy.filters.network.http_connection_manager
        typed_config:
          "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
          access_log:
            name: back
            typed_config:
              "@type": type.googleapis.com/envoy.extensions.access_loggers.stream.v3.StdoutAccessLog
          codec_type: AUTO
          stat_prefix: back
          route_config:
            name: back
            virtual_hosts:
            - name: back
              domains:
              - "*"
              routes:
              - match:
                  prefix: "/"
                route:
                  cluster: back
          http_filters:
          - name: envoy.filters.http.router
      transport_socket:
        name: envoy.transport_sockets.tls
        typed_config:
          "@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.DownstreamTlsContext
          common_tls_context:
            tls_certificates:
            - certificate_chain: {filename: "/etc/ssl/envoy/crt"}
              private_key: {filename: "/etc/ssl/envoy/key"}
  clusters:
  - name: back
    connect_timeout: 0.5s
    type: STATIC
    lb_policy: ROUND_ROBIN
    load_assignment:
      cluster_name: back
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: 1270.0.01
                port_value: 10001
```

# 起動
dockerで。
事前に証明書と鍵をカレントのkey/{crt,key}に置いておく

```bash
$ docker run -v `pwd`/envoy.yaml:/etc/envoy/envoy.yaml -v `pwd`/key:/etc/ssl/envoy -p 10000:10000 -d --rm --name envoy envoyproxy/envoy:v1.18-latest
```
動画で学ぶJHipster (1) JHipster紹介

必要になったので、JHipsterの入門的勉強を動画でしていきます。
使う動画は、JHipsterの[公式サイト](https://www.jhipster.tech/)のトップページある動画です。

https://www.youtube.com/watch?v=6lf64CctDAQ

# JHipster って何？
まず、JHipsterとは何ぞや？という話なんですけど、バックエンドがSpring Bootで、フロントエンドはReactやAngular、Vueなどから選べて、それらのコードを自動生成してくれるウェブアプリケーションフレームワークのようです。
[公式サイト](https://www.jhipster.tech/)によると、
![5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1284134/5c8824f7-399e-da90-d859-05c1ee6a9b1e.png)
>（グーグル翻訳）
JHipsterとは何ですか？
JHipsterは、最新のWebアプリケーションとマイクロサービスアーキテクチャを迅速に生成、開発、およびデプロイするための開発プラットフォームです。Angular、React、Vueなどの多くのフロントエンドテクノロジーをサポートしています。IonicとReactNativeのモバイルアプリもサポートしています！バックエンドでは、Spring Boot（JavaまたはKotlinを使用）、Micronaut、Quarkus、Node.js、および.NETをサポートしています。デプロイでは、DockerとKubernetesでクラウドネイティブの原則を採用しています。AWS、Azure、Cloud Foundry、Google Cloud Platform、Heroku、OpenShiftのデプロイサポートがあります。

下図がJHipsterを端的に現した図っぽいです。
![6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1284134/2fd40c54-1c29-c082-6766-36f7e5d56b41.png)
__Spring Boot + Angular / React / Vue = JHipster__ という事みたいですね。

## Hipsterってどういう意味？
どうでもいいことですが、JHipsterのJがJavaを表しているのは分かるのですが、hipsterってどういう意味なのか単語の意味を知らなかったので調べました。

hipsterのwikipediaの記事です。歴史とか書いてあって長い笑

https://en.wikipedia.org/wiki/Hipster_(contemporary_subculture)

[英語辞書](https://dictionary.cambridge.org/ja/dictionary/english/hipster
)では、
> someone who is very influenced by the most recent ideas and fashions

[英和辞典](https://ejje.weblio.jp/content/hipster
)では、
> 通(つう)、ジャズ通、ジャズファン、流行の先端を行く人、新しがり屋

hipster で google画像検索すると、サングラスを掛けて髭を生やしたおじさんが沢山でてきます（笑）
![7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1284134/e538ac00-40d7-03fe-43bd-6af68ebcd177.png)

だから、さっきのJHipsterのアイコンはこんな感じなのか（笑）似てる（笑）
![8.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1284134/0f37a33b-02eb-e2db-3a2b-7500cdc42bab.png)

hipsterについて解説してる記事です。

http://creatorjapan.asia/hipster-meaning/

>日本人のイメージで言うならば、意識が高いオシャレなサブカル好きの若者といった感じですね。
Hipsterが好きなものをいくつかご紹介します。
・MacBook Air
・American ApparelやMarc Jacobs
・コーヒー

日本で言うと、スタバにいそうな若者なのかな？

紹介だけで長くなったので次回インストールとプロジェクト生成やろうかと。

# URL
JHipsterの公式サイト https://www.jhipster.tech/
入門動画 https://www.youtube.com/watch?v=6lf64CctDAQ
入門動画のテキスト https://github.com/mraible/jhipster7-demo