OmniAICreator/Qiita-1.07M huggingface dataset:
MySQL PDOに接続するときのメモ

# はじめに
はじめは勉強のためにMDB2を先にやろうかと思ったら、
いろいろと情報がないこともあり、時間もなく断念。
PDOならなんとかなるかと思うのと、PDOで試験出るならやっぱりやらないとあかんかなと
思ったので、つないでみることにした

# コマンドでMYSQLに入る
https://qiita.com/fuwamaki/items/194c2a82bd6865f26045
これを参考にしました。
なぜかというと、まずはMDB２から入ろうかと思ってここからやっていたのがきっかけ。

で、すでに入ったことがあるので、
コマンドラインから

```
mysql -u root -h localhost -p
```

ここでログイン

```
SHOW DATABASE
```
ここでデータベースを確認して、すでに作った「test」があるのを確認

```
SELECT User,Host FROM mysql.user;
```
次にユーザーについても確認
rootがあったので、パスワードを設定して退出

```
create user 'root' identified by '******';
quit;
```
※*はもちろんパスワードを入れる

```
create user 'pdouser' identified by '******';
SELECT user, host FROM mysql.user;
flush privileges;
```
あたらしくユーザーとパスを作って
ユーザー一覧にあるのを確認して
反映。
なぜかhostが％になってた。

```
GRANT ALL PRIVILEGES ON test.* to 'atsublue'@'localhost';
```
ここでなぜかERROR 1410 (42000)がでて、できない。
ちなみにこれはシンタックスエラーがあるんじゃないかと言われている。

MAMPのPHPは５．７．３２で、ERROR 1410 (42000)が出るはずはない。
MYSQL８ならば、下記の様な方法ができるが。
https://qiita.com/yamateion/items/5509484aaf1a02e9cc57

そこではたと気づいた。
MAMPからmyPHPAdominに行ってDBがあるのかどうか調べようと思った。

入り方は下記
https://qiita.com/mako0104/items/cb677d04922a3d9672ae

すると、
DBにtestはおろか、ユーザーにpdouserが入っていない。

ここでつまった。
でやっと気づいた。
冒頭で、なぜか、MAMP内にはいらず、MySQLに入っていたことに。
それだと、前にHomeblewで入れていたMYSQLに入ってしまうことに。
あわてて、mysqlのバージョンを確認した。
やはり、８．０だった笑
https://qiita.com/rokumura7/items/b270acb9550efddd5fe5

ということで、

```
cd /Applications/MAMP/Library/bin/
./mysql -u root -p
```
ここで、パスワード入力画面が出るのだが、
私はずっと勘違いしていたせいで、MAMPのMySQLには入っていないので
パスワードはrootのはずだ、と思ってこれを入れるとログインできた

さてデータベースを作り、`show databases`で作ったDBがあるのを確認。
下のpdotestdbはDB名で、好きなものを入れてOK

```
create database pdotestdb;
```
次に、ユーザーも作り、このユーザーでDBにアクセスできるように設定
pdouserがユーザー名で、
localhostはホスト名
pdotestdbは上記で設定したDB名

```
mysql> create user 'pdouser'@'localhost' identified by '(好きなパスワード)';
mysql> grant all privileges on pdotestdb.* to 'pdouser'@'localhost';

```
ここまでうまくいった。

さて、ここでphpからPDOでmySQLにつなぐ
下のポート番号はMAMPにあったポート番号。
charsetはこれしないと文字化けになるのであったほうがいい。

```index.php
<?php
$dsn = 'mysql:host=localhost;port:8889;dbname=pdotestdb;charset=utf8';
$DB_user = 'pdouser';
$DB_pass = '(上記で設定したパスワード)';
try{
  $db = new PDO($dsn,$DB_user,$DB_pass);
  echo "接続成功";
} catch(PDOException $e){
  echo "接続失敗" . $e->getMessage() ."<br>";
?>
```

接続成功　と書かれた画面が出力され、うまくいきました！

#追記
パスワードがrootのままだとセキュリティ上危ないので変更
下記のリンクを参考に

https://qiita.com/ksugawara61/items/d8d69b7d57a3afcef980

ただ、quitしたあとにもとに戻るのに、また、

```
cd /Applications/MAMP/Library/bin/
```
しないといけないので面倒だ。。。

そんなときには「パスを通す」ことをやればいいらしいです。（メモ）
https://webkaru.net/mysql/mamp-command-line/

今回はテストと勉強でつないでいるだけなので、今はいいかなと思ってやっていない。
必要であれば上記を参考に。

#さらに追記

上のようにやっても、接続はできても、それ以降のことができないことがあった。

そのときは、今使いたいDB を、useすれば使えるようになる。

```
$db=>exec('use テーブル名');
```
このあとに、SQL 文をつくって実行する感じ。
Electrician near Me: Quick Service of Expert Electricians

Get to know your nearest electrician. Call and get access in less than 30 minutes from an electrician near me. No tension, no hazel. No need to beg for local electricians now.



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1620201/7f756b0d-7fda-648c-d0d3-48ad984887fe.png)
https://www.gripelectric.net/electrician-near-me.html
FastAPI: 簡単な WebAPI を作成

こちらと同様の機能を FastAPI で実装します。
[Nest.js で簡単な WebAPI を作成](https://qiita.com/ekzemplaro/items/150dcb6f132ba7c05c45)

## サーバープログラム

```py:get02.py
# ------------------------------------------------------------------
#	get02.py
#
#					Jun/08/2021
# ------------------------------------------------------------------
from fastapi import FastAPI

data = [
	{'id': 't101', 'name': '草枕', 'author': '夏目漱石' },
	{'id': 't102',  'name': '走れメロス', 'author': '太宰治' },
	{'id': 't103', 'name': '千曲川のスケッチ', 'author': '島崎藤村' },
	{'id': 't104', 'name': '高瀬舟', 'author': '森鴎外' }
]

app = FastAPI()


@app.get("/")
def say_hello():
	return {"Hello": "World"}

@app.get("/test/")
def read_all():
	return data

@app.get("/test/{item_id}")
def read_item(item_id: str):
	unit_aa = [ss for ss in data if ss['id'] == item_id]
	return unit_aa


# ------------------------------------------------------------------
```

## サーバーの実行

```bash
uvicorn get02:app --reload
```

## クライアントからアクセス

```text
$ http http://127.0.0.1:8000
HTTP/1.1 200 OK
content-length: 17
content-type: application/json
date: Tue, 08 Jun 2021 05:01:39 GMT
server: uvicorn

{
    "Hello": "World"
}
```

全件取得

```text
$ http http://127.0.0.1:8000/test/
HTTP/1.1 200 OK
content-length: 241
content-type: application/json
date: Tue, 08 Jun 2021 05:02:05 GMT
server: uvicorn

[
    {
        "author": "夏目漱石",
        "id": "t101",
        "name": "草枕"
    },
    {
        "author": "太宰治",
        "id": "t102",
        "name": "走れメロス"
    },
    {
        "author": "島崎藤村",
        "id": "t103",
        "name": "千曲川のスケッチ"
    },
    {
        "author": "森鴎外",
        "id": "t104",
        "name": "高瀬舟"
    }
]
```

id を指定して取得

```text
$ http http://127.0.0.1:8000/test/t102
HTTP/1.1 200 OK
content-length: 61
content-type: application/json
date: Tue, 08 Jun 2021 05:02:37 GMT
server: uvicorn

[
    {
        "author": "太宰治",
        "id": "t102",
        "name": "走れメロス"
    }
]
```

## 確認したバージョン

```text
$ python
Python 3.12.7 (main, Feb  4 2025, 14:46:03) [GCC 14.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import fastapi
>>> fastapi.__version__
'0.110.3'
```
【備忘録】環境構築・エイリアス登録時のエラー /Users/username/.zshrc:~: unmatched "とは

## はじめに
タイトルの通り、Vimで.zshrcファイルにパスを通す記述を加えて
シェルを再起動 `exec $SHELL -l`したところ

```
/Users/username/.zshrc:~: unmatched "
```
というエラーが出ちゃいました。
はてさて、何が原因なのか・・・

## 原因と解決策

### 原因
この手の情報はありませんでしたが、oracleのドキュメントにちゃんと載っていました。

https://docs.oracle.com/cd/E19455-01/806-2720/msgs-851/index.html

"このメッセージは、終わりの逆引用符を付けずに、初めの逆引用符 (`) のみを付けたコマンドをユーザーが入力したことを示します。引用符 (') や二重引用符 (") を片方しか付けなかった場合も、同様のメッセージが表示されます。"

とのことです。
要するに、`.zshrc`ファイルの記述で、この場合、不要な「"」がどこかに隠れているわけですね。

### 解決策
`.zshrc`ファイル内を探してみましょう。
この時の注意点は、自分の記述した位置だけでなく、前に記述していた場所に原因が隠れている可能性があります。

ちょっと面倒かもしれませんが、念入りに探してみてください。
私の場合は、前に書いていたエイリアスの記述で不要な「"」があったことが原因でした。

このエラーに関して検索をかけた際に、このような場合もあるようなのでシェアしておきます。

https://github.com/ohmyzsh/ohmyzsh/issues/2981



微妙な違いですが、「"」を「”」にしちゃっていたのがこの方のミスなんですね。
（ちなみに、「”」をsmart quoteと言うらしいですね。余談でした。）

![スクリーンショット 2021-06-08 15.16.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/711874/02008c99-a46f-7aae-2461-8504368f8f81.png)


## 最後に
日本語では先程のOracleのページの情報とFIXES.PUBの情報しかなかったため、ここで記事化することにしました。
同じエラーが出た際は参考にしてみてください。

では！
R practice book

# Summer school for R


## Exercise 1: 
Practice R syntax. Practice with some elementary R functions: arithmetic and algebra, 2-dimensional array manipulation, producing multi-element lists. Write a brief program exercising program flow control (if, ifelse, when, repeat, break, stop, etc.)

## Answer 1:

```R
vec_a = c(1,2,3,4)
vec_b = c(7,8,9,10)

mat_ab <- array(c(vec_a,vec_b), dim=c(4,2) )

print(mat_ab)

mat_ab_T = t(mat_ab)

print(mat_ab_T)

print(mat_ab_T*10)


# loop
for(i in 1:10) {
  if (i<=5){
    print(c(i,mat_ab_T[i]))
  }
  else {
    print(i)
  }
  if (i==length(mat_ab_T)){
    break
  }
}

# repeat
ii <- 0
repeat {
  print(c('Hey!',ii))
  ii <- (ii+1)
  if (ii>=6){
    break
  }

}
```

```R
     [,1] [,2]
[1,]    1    7
[2,]    2    8
[3,]    3    9
[4,]    4   10
     [,1] [,2] [,3] [,4]
[1,]    1    2    3    4
[2,]    7    8    9   10
     [,1] [,2] [,3] [,4]
[1,]   10   20   30   40
[2,]   70   80   90  100
[1] 1 1
[1] 2 7
[1] 3 2
[1] 4 8
[1] 5 3
[1] 6
[1] 7
[1] 8
[1] "Hey!" "0"   
[1] "Hey!" "1"   
[1] "Hey!" "2"   
[1] "Hey!" "3"   
[1] "Hey!" "4"   
[1] "Hey!" "5"   
```

## Exercise 2.

Integrate an astrophysical function.  Estimate the age of the Universe as a function of redshift for a standard $\Lambda$CDM universe model: 
$$ t(z) = H_0^{-1} \int_{z}^{\infty}\frac{dz'}{(1+z')h(z')} $$ 
where $ h(z) = \sqrt{(1-\Omega_{total})(1+z)^2 + \Omega_m(1+z)^3 + \Omega_{\Lambda} } $, $\Omega_m$ is the matter density parameter, and $\Omega_{\Lambda}$ is the dark energy density parameter. Plot the age of the Universe vs. redshift ($z=0$ to 10) for three hypothetical universes: matter-dominated ($\Omega_m=1.0$ and $\Omega_{\Lambda}=0.0$), dark-energy-dominated ($\Omega_m=0.01$ and $\Omega_{\Lambda}=0.99$), and a realistic universe ($\Omega_m=0.31$ and $\Omega_{\Lambda}=0.69$).  This problem and solution is courtesy of graduate student Phoebe Sandhaus, Penn State.
Djangoのページネーションの高速化に取り組んだ

クエリの最適化を学習しようと思い簡単なwikiサイトの作成に取り組み10万件のデータを入れて色々試してみました。
Django Debug Toolbarを見てみると
ListViewでそのデータの件数を数えている部分が時間がかかっているようなので
なんらかの方法で短く出来ないか模索してみました。
そもそもカテゴリー分けしてカテゴリー一覧を表示させたほうがいいのかもしれませんが
あくまで学習として取り組んでみました。

こんなmodelがある前提で書いていきます。
本当はもっとフィールドや外部キーがあるのですが内容と直接関係ないので省略してます。

```py:models.py
class Wiki(models.Model):

    title = models.CharField(max_length=100, verbose_name="タイトル")
    created = models.DateTimeField(auto_now=True, verbose_name="作成日時")
    updated = models.DateTimeField(auto_now_add=True, verbose_name="更新日時")

    def __str__(self):
        return self.title
```

## やったこと

wikiの件数を数字で保存するmodelを作って
既存のPagenatorを継承したクラスを作って
単純にその数字を返すようにしました。
wikiを保存する毎に+1する感じです。

もともとデータを数える部分は40ms程かかっていたのですが
結果としては1.3ms程になりました。

## modelの作成

```py:models.py
class Count(models.Model):

    number = models.PositiveIntegerField(verbose_name="個数")
    created = models.DateTimeField(auto_now=True, verbose_name="作成日時")
    updated = models.DateTimeField(auto_now_add=True, verbose_name="更新日時")

    def __str__(self):
        return str(self.number)
```
こんなmodelを作ります。

## Pagenatorの作成

```bash
├── app
│   ├── __init__.py
│   ├── asgi.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── manage.py
├── requirements.txt
├── static
├── templates
│   ├── base.html
│   └── wiki
│       └── index.html
└── wiki
    ├── __init__.py
    ├── admin.py
    ├── apps.py
    ├── models.py
    ├── pagenators.py #ここ
    ├── tests.py
    ├── urls.py
    └── views.py
```
pagenators.pyを作成します。
上記のような構成です。

ファイルを編集していきます。

```py:paginators.py
from django.core.paginator import Paginator
from django.utils.functional import cached_property

from .models import Count


class WikiPaginator(Paginator):

    @cached_property
    def count(self):
        count = Count.objects.values_list('number', flat=True)[0]
        return count

```

Djangoのソースコードを見てPagenatorクラスのcount関数の返す値を
先ほど作ったmodelの値を返すようにしました。
@cached_property親クラスのcount関数でも使われていたのでそれにならってつけています。
まだよくわかってないのでそれについてはもうちょっと学習してみようと思います。

## view

```py:views.py
from django.views.generic import ListView

from .pagenators import WikiPaginator


class IndexView(LoginRequiredMixin, ListView):

    template_name = 'wiki/index.html'
    model = Wiki
    context_object_name = "wikis"
    paginate_by = 10
    paginator_class = WikiPaginator

```

paginator_classを指定出来るので先ほど作成したWikiPaginatorを指定します。
あとはWikiの作成時に例えばform_validを使ってCountのnumberに+1するようにすればオッケーです。


## 最後に

もっといい方法やご指摘があったら教えていただけたら幸いです。

参考URL
[https://github.com/django/django/blob/main/django/core/paginator.py](https://github.com/django/django/blob/main/django/core/paginator.py)
[https://github.com/django/django/blob/main/django/views/generic/list.py](https://github.com/django/django/blob/main/django/views/generic/list.py)
outlookVBAプロジェクトを配布（インストール）するvbs

## 概要
社内で使っているoutlookマクロを更新のたびに導入代行をしないといけないのが面倒なのでインストール方法とかないか調べてみた。

> Project1 は、次のフォルダーに VbaProject.otm としてハード ディスクに格納されます。
<Drive>:\Users \ <LogonName> \AppData\Roaming\Microsoft\Outlook
新しい VBA プロジェクトを開始する場合は、理論的には既存のすべてのモジュールとフォームをエクスポートできます。 しかし、これは通常、現実的なアプローチではありません。 代わりに、次の手順に従います。
1.Outlook を終了します。
2.指定されたパスで VbaProject.otm ファイルを探します。
3.VbaProject-testing.otm など、ファイルの名前をわかりやすい名前に変更します。
4.Outlook を再起動します。

https://docs.microsoft.com/ja-jp/outlook/troubleshoot/deployment/manage-distribute-outlook-vba-project

要は`<Drive>:\Users \ <LogonName> \AppData\Roaming\Microsoft\Outlook`にOTMファイルをコピペすればいいらしい。
あとはユーザー名を取得して`objFS.CopyFile`してやればいい。

## コード
2021/10/02 xml追加対応
イベント系を追加したらOTM以外にxmlが追加されたので

https://extan.jp/?p=476


``` vb:install.vbs
Call main

'-------------------------------------------------------------------------------

'-------------------------------------------------------------------------------
Sub main()
'  On Error GoTo Err
  '変数を宣言
  Dim str_from
  Dim str_to
  
  str_from = Array("VbaProject.OTM","Outlook.xml")
  Set objFS = CreateObject("Scripting.FileSystemObject")

  dim i
  For i = 0 to ubound(str_from)
    str_to = GetUserName & str_from(i)
  
    'ファイルを上書きコピーする
    Call objFS.CopyFile(".\" & str_from(i), str_to)
  Next

  MsgBox "complete"
  Exit Sub
'Err:
'  Select Case Err.Number
'    Case Is = "800A0046": MsgBox "Outlookを閉じて再度実行してください。"
'  End Select
End Sub
'-------------------------------------------------------------------------------
Private Function GetUserName()
'ユーザー名を取得する
  Dim x
  Set x = WScript.CreateObject("WScript.Network")
  'WScript.Echo "ユーザ名：" & x.UserName        'ユーザー名をポップアップ表示
  
  
  'パスをセット
  Dim Path
  Path = "C:\Users\" & x.UserName & "\AppData\Roaming\Microsoft\Outlook\"
  GetUserName = Path
End Function

```

## 余談
VBSは`On Error Goto`が使えないらしいの失敗時の対応が出力できない。

https://www.depthbomb.net/?p=1414#toc3
機械学習勉強記録 Pandasの基礎

# Pandasとは
機械学習のプログラミングでよく用いられるライブラリで、データ解析を容易にする機能を持っています。
データフレーム(DataFrame)などの独自のデータ構造によって様々な処理が可能になります。

##モジュール、パッケージ、ライブラリについて
- モジュール…関数を格納する部品のようなもの。「.py」というテキストファイル。例えるなら基盤。
- パッケージ…モジュールの集まり。例えるなら炊飯器。
- ライブラリ…パッケージをいくつかまとめてインストールできるようにしたもの。例えるならキッチン。

## Pandas基本操作

###Pandasのインストール
`import pandas as pd`と最初に入力しておけば、そのファイル内で`pd`と入力すればPandasのライブラリの中にある機能を使うことができるようになります。

### データの読み込み
csvファイルを読み込む時はこのようにします。

```.python
# CSVファイルの読み込み
pd.read_csv('sample.csv')
# 読み込んだCSVファイルをdfという変数に代入
df = pd.read_csv('sample.csv')
```

このような形で、読み込まれた時、データの型は、

```.python
type(df)
"""
出力結果 : pandas.core.frame.DataFrame
"""
```
となります。これはデータフレームと呼ばれる型であることを意味しています。

読み込んだデータを確認する方法として、
`df.shape`　データの形を表示（行数、列数を確認）
`df.head(3)`　データフレームの上から3行を表示
`df.tail(3)`　データフレームの下から3行を表示
などがあります。


### データの切り分け
`iloc`メソッドを使います。

```.python
# 1行目、1列目を切り出してtに代入
t = df.iloc[0, 0]
# 全ての行、1列目を切り出してtに代入
t = df.iloc[:, 0]
# 全ての行、2列目以降を切り出してtに代入
t = df.iloc[:, 1:]
# 列名（ラベル）を直接指定して切り出してtに代入
t = df['A']
t = df.loc[:, 'A']
# 複数の列名（ラベル）を指定して切り出してtに代入
t = df.loc[:, ['A', 'B']]
```

#### `iloc`と`loc`の違い
`loc` 行ラベル、 列ラベルを指定して切り出し
`iloc` 行の番号(0 ~ )、列の番号(0 ~ )を指定して切り出し

### データの並び替え
`sort_value`メソッドを使います。

```.python
# Aの列を昇順で並び替え
df.sort_values('A')
# Aの列を降順で並び替え
df.sort_values('A', ascending=False)
```

### 列の追加・削除
`drop`メソッドを使います。

```.python
#aという変数に3行1列のデータフレームを代入
a = pd.DataFrame([[1],[2],[3]])
# Aというラベル名の列にaを追加
df['A'] = a
# dfからAというラベル名の列の削除
df.drop(labels='A',axis=1)
```
追加の際は、追加する列の行数が追加するデータフレームの行数と一致していないとエラーが起こります。

`axis=1`は列方向に削除
`axis=0`は行方向に削除
するための引数です。


### データの絞り込み
A列の値が3のデータだけ表示させる時は、

```.python
# dfというデータフレームで、A列の値が3の行を表示
df[df['A'] == 3].head()
```
となります。
複数条件をつける時は、

```.python
# dfというデータフレームで、A列の値が3、かつBの値が4の行を表示
df[(df['A'] == 3) & (df['B'] == 4)].head()
# dfというデータフレームで、A列の値が3、またはBの値が4の行を表示
df[(df['A'] == 3) | (df['B'] == 4)].head()
```
となります。
AWS RDS なんとなく初見で使ってみた（やった事のまとめ）

<h4>動機</h4>
前回、下記の記事でざっくりとwebサーバを作ったので、
今度はRDSを利用して、DBサーバを立てることにした。
DB操作に関する知識はほぼなかったので、簡単にDBの作り方を備忘録的にまとめておく

https://qiita.com/pong109/items/3ee98e5576491d7f18c5

<h4>雑記/やったこと</h4>
<b>RDSについて</b>
●AWSのリレーショナルデータベースサービス
いくつかのDBエンジンの中から好きなものを選択可能。(馴染みのあるmysqlを選択)

●セキュリティグループを編集
defaultだと接続できない為、EC2のセキュリティグループに設定。
EC2のwebサーバとローカルPCからmysqlへの接続を許可するルールを追加（portはデフォルト3306）

●接続確認(変数内は可変値)

```shell
 mysql -h ${DB-Endpoint} -P 3306 -u ${username} -p
```

●mysql workbenchをインストール
<b>mysql workbench</b>
DBをGUIで操作できるツール。当初phpmyadminを入れるつもりだったが、
mysql v8だと動作するかわからなかったので、AWSのKCに記載があるこちらを選択。
→　ドキュメントがあまり見当たらなかったのと、DB構築の知識が足りない為、いったんCLIに慣れてから使うことにする。

<b>mysql コマンド(主要なもの)</b>

```shell
show databases;
→　データベースの一覧表示

create database ${DatabaseName}
→　データベース作成

use ${DatabaseName};
→　使用するデータベースの選択

show tables;
→　テーブルの一覧表示

create table ${tablename} (${column} ${datatype},${column} ${datatype}…)
→　テーブルの作成。データ列（カラム）とデータタイプ（文字列、数字など）

insert into ${tablename}(${column}) values (${data})
→　データの挿入

select ${column} from ${tablename} where ${column} (=/>/<…) 条件値;
→　データの検索

drop table ${tablename};
→　テーブルの削除

drop database ${DatabaseName};
→　データベースの削除
サーバの暗号通信の設定についてのメモ

# はじめに
サーバでTLS通信するための簡単なメモ

# 安全な通信とは
以下の3要件を満たした通信のこと

* 盗聴されないこと(暗号化)
* 改ざんされないこと(改ざん検知・ハッシュ)
* 通信相手が偽物でないこと(認証)
  - サーバ証明書によるサーバ認証

# 安全な通信を実現するためには
TLSプロトコルを用いる。TLSを用いれば上記3要件を満たした安全な通信を実現できる。

# TLSとは
https://ja.wikipedia.org/wiki/Transport_Layer_Security

# TLS対応環境

https://ja.wikipedia.org/wiki/Template:%E3%82%A6%E3%82%A7%E3%83%96%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8BTLS/SSL%E3%81%AE%E5%AF%BE%E5%BF%9C%E7%8A%B6%E6%B3%81%E3%81%AE%E5%A4%89%E5%8C%96

# TLS1.3
最新バージョンのTLS1.3で全ての通信が行われるのが望ましい。ただし、上記TLS対応環境にあるように、未対応の環境も多く、接続できないクライアントが一定数存在してしまう

# 暗号スイートとは
* **安全な通信を実現する暗号(鍵交換、署名、暗号化、ハッシュ関数)の組み合わせ。TLS通信をする場合、この暗号スイートを決定する必要がある**
* 鍵交換アルゴリズム・鍵認証方式・認証符号の組み合わせ
* TLSにおいてハンドシェイク時に暗号スイートが選択され、その選択された暗号スイートに記載の鍵交換、署名、暗号化、ハッシュ関数によりTLSにおける各種処理が行われる。

TLSは多くの暗号技術を組み合わせて実現している。ただし組み合わせが多く、よくわからない。そこで**「TLS暗号設定ガイドライン」**を参考にして設定する

# サーバの暗号通信に関わる設定
## SSL/TLS暗号設定ガイドライン
https://www.ipa.go.jp/security/vuln/ssl_crypt_config.html

「TLS暗号設定ガイドライン」は、TLSサーバの構築者や運営者が適切なセキュリティを考慮した暗号設定ができるようにするためのガイドライン


## 結局どれを設定すればよいのか
* 安全性もしくは相互接続性についての特段の要求がなければ**「推奨セキュリティ型」**の採用を推奨している

* 暗号スイート、サーバー設定
  - SSL/TLS暗号設定ガイドラインに暗号スイートの設定、各種サーバ設定が記載されているので参考にする
VSCode拡張機能を作ってみる1 - インストールとHelloWorld!

# はじめに

VSCodeの拡張機能を作ってみます。
今回は事前準備として、インストールとプロジェクト生成をおこない、テストを実行します。

# インストール

`Yeoman`と`VS Code Extension Generator`をインストールします。

``` sh
npm install -g yo generator-code
```

# 新規プロジェクト生成

`yo`コマンドで新しいプロジェクトを生成します。

`HelloWorld`という拡張機能を`TypeScript`で作成する場合↓

``` sh
yo code

# ? What type of extension do you want to create? New Extension (TypeScript)
# ? What's the name of your extension? HelloWorld
### Press <Enter> to choose default for all options below ###

# ? What's the identifier of your extension? helloworld
# ? What's the description of your extension? LEAVE BLANK
# ? Initialize a git repository? Yes
# ? Bundle the source code with webpack? No
# ? Which package manager to use? npm

code ./helloworld
```

# テスト実行

エディタを選択した状態で`F5` を押すと、拡張機能がコンパイルされ、開発ウィンドウが開きます。
新しいウィンドウでコマンドパレット( Ctrl+Shift+P )から`Hello World`コマンドを実行します。
`Hello World from HelloWorld!`の通知が表示されたら成功です！


# 拡張ファイルの構造

`extension.ts`にメインの処理、`package.json`に拡張機能の設定をおこないます。

```
.
├── .vscode
│   ├── launch.json     // 拡張機能を起動してデバッグするための設定
│   └── tasks.json      // TypeScriptをコンパイルするための設定
├── .gitignore
├── README.md
├── src
│   └── extension.ts    // メイン処理
├── package.json        // 拡張機能の設定
├── tsconfig.json       // TypeScriptの設定
```

# package.json

`activationEvents`に

# 公式サンプル

公式GitHubにVSCode APIを使ったサンプルがあるので、これを見て機能を学ぶことができます。

https://github.com/microsoft/vscode-extension-samples

いくつか使いそうなものをピックアップしてみたので、次回から詳細をまとめていこうと思います。

[VSCode拡張機能を作ってみる2 - 入力補完](https://qiita.com/qvtec/items/31d19dd8b86fcc19465a)
npm v7で`ERESOLVE unable to resolve dependency tree Could not resolve dependency:`

## はじめに

この記事はテスト中に遭遇した表題のエラーの、原因と解決方法を記録/するためのものです。

## 先に結論だけ

-   npm v7で破壊的な変更が導入されました。
-   `peerDependencies`のバージョン解決がより厳密になりました。
-   上流モジュールの`peerDependencies`を修正すると解決します。
-   上流モジュールの修正が出来ない場合、npm installに`--legacy-peer-deps`オプションをつけると解決します。

## 再現条件と手順

問題が発生する条件は以下の通りです。

-   テストにはTravis CIを利用している
-   環境はnode.js
-   node.jsバージョン16をテスト対象に加えた
-   バージョン16のテストのみ失敗する

並列でバージョン12と14のテストも行っていますが、そちらはエラーが発生しません。

### 環境

[Travis CI](https://travis-ci.org/getting_started)から出力される環境情報は以下の通りです。

```console
$ node --version
v16.3.0
$ npm --version
7.15.1
$ nvm --version
0.37.2
$ yarn --version
1.22.4
```

### エラーログ

出力されたエラーログは以下の通りです。

```console
npm install
npm ERR! code ERESOLVE
npm ERR! ERESOLVE unable to resolve dependency tree
npm ERR!
npm ERR! Found: jest@27.0.4
npm ERR! node_modules/jest
npm ERR!   dev jest@"^27.0.4" from the root project
npm ERR!   peer jest@"^27.0.0" from ts-jest@27.0.3
npm ERR!   node_modules/ts-jest
npm ERR!     dev ts-jest@"^27.0.3" from the root project
npm ERR!
npm ERR! Could not resolve dependency:
npm ERR! peer jest@"^26.4.2" from fake-mouse-event@0.0.4
npm ERR! node_modules/fake-mouse-event
npm ERR!   dev fake-mouse-event@"https://github.com/MasatoMakino/fake-mouse-event.git" from the root project
npm ERR!
npm ERR! Fix the upstream dependency conflict, or retry
npm ERR! this command with --force, or --legacy-peer-deps
npm ERR! to accept an incorrect (and potentially broken) dependency resolution.
```

## 原因

この問題の原因は、npm v7の変更です。

<https://github.com/npm/rfcs/blob/latest/implemented/0025-install-peer-deps.md>

npm v7では[peerDependencies](https://docs.npmjs.com/cli/v7/configuring-npm/package-json#peerdependencies)の挙動が変更されました。npm v6以前では、peerDependenciesはあくまでユーザーに対するヒントでしかありません。パッケージの依存関係を解決したり、インストールしたりという機能はありませんでした。v7から、peerDependenciesに指定したパッケージを自動でインストールするようになりました。

その結果、npm v7はpeerDependenciesの[セマンティックバージョニング](https://github.com/npm/node-semver)を厳密に解釈するようになりました。dependenciesやdevDependenciesに、peerDependenciesと矛盾するバージョンのパッケージがインストールされていると、npm v7は依存関係の解決に失敗したとしてインストール時にエラーを返します。

node.jsのv12やv14のテスト環境でこの問題が発生しなかったのは、npmのv6を使用しているためです。

## 解決方法

解決方法は以下の2つです。

### 上流モジュールの修正

もしあなたが上流モジュールを修正できる場合、上流モジュールのpeerDependenciesフィールドを修正しましょう。

今回のエラーは自作した上流モジュールに、以下のpeerDependenciesを設定していたため引き起こされました。

```json
"peerDependencies": {
  "jest": "^26.4.2",
}
```

この設定を残したまま、下流リポジトリのjestをv27に更新すると、依存関係の解決に失敗してエラーが返ります。

```json
"peerDependencies": {
  "jest": ">=26.4.2 <28.0.0"
}
```

上流モジュールがjest v27で正常に動作するかテストし、バージョンの範囲を広げます。

### `--legacy-peer-deps`オプション

上流モジュールの修正が不可能な場合、npm installコマンドに`--legacy-peer-deps`オプションをつけましょう。このオプションはpeerDependenciesの依存解決をv6以前と同じ処理にします。

Travis CIの場合、travis.ymlのinstallオプションを省略すると、[デフォルト](https://docs.travis-ci.com/user/languages/javascript-with-nodejs/)で`npm install`が挿入されます。オプションをつける場合は、installを明示的に指定する必要があります。

_▼travis.yml_

```yml
install:
    - npm install --legacy-peer-deps
```

以上、ありがとうございました。
Herokuデプロイ後に開発環境でミスがあったときの対処方法

Herokuにデプロイした後はアプリケーションのエラーは
![スクリーンショット 2021-06-08 12.46.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1603537/7bc6bc9d-4619-348f-afac-bf32ee8bdacf.png)
このように表示されるので、何が起きているのかわからない

ということで指示にある通り、logをみましょう。

ターミナルで

```
heroku logs --tail --app アプリケーション名
```

アプリ名がわからない場合は

```
heroku info
```

でわかります。

で、ログを見ると

```
NoMethodError (undefined method `id' for nil:NilClass):
```

ありました。
このエラーの原因はほんとクソみたいな原因なので、解消方法は割愛。

要するに、開発環境の時点でミスっていたわけです。
コードを修正した後は再度、Gitでプッシュして

```
git push heroku master
```

を実行。
要するに開発環境だけ修正してもHerokuにデプロイしたものが修正されるわけではないので、再度Herokuへのプッシュが必要だよということです。
[Rails] マイグレーションファイルの削除方法

#マイグレーションファイルの状態確認
ファイルのステータスがupだと適用されていて、downだと適用されていない状態。
upのままファイルを削除すると、ファイルは存在しないのに適用されているという変な状況になる。
そのため、ターミナル等で下記コマンドを実行し、状態を確認する。

```
rails db:migrate:status
```

#ステータスの変更
ステータスがdownになれば削除可能になるので、下記コマンドで変更する。

```
rails db:migrate:down VERSION=ファイル名.rb
```

#ファイルの削除
あとは消すだけなので、下記コマンドでファイルを削除。

```
rm -rf パス/ファイル名.rb
```

#終わりに
自分用のメモとして、また、Qiita投稿の練習として書きました。
もし誰かの役に立てば幸いです。
変数に複数行の文字列を代入

自分用の備忘録です。

# トリプルクウォート`"""`, `'''`を使う

シングルクウォート`'`またはダブルクウォート`"`を3つ連続させて、文字列を囲う。

```py:ipython
In [12]: s = ''' 
    ...: a b c d e 
    ...: f g h i j 
    ...: k l m n o 
    ...: '''                                                                                                                                                         
```

改行も反映される。
クリップボードからサクッと貼り付けたい場合に便利。

```py:ipython
In [13]: s                                                                                                                                                           
Out[13]: '\na b c d e\nf g h i j\nk l m n o\n'

In [14]: print(s)                                                                                                                                                    

a b c d e
f g h i j
k l m n o

```

注意点としては、プログラムが見にくくなるため推奨はされないらしい。
PHPで配列の中身を再帰的に処理するメモ

**引数で渡ってくる配列の深さ・要素数などが分からなくても、上層から下層まで全ての要素に対して処理をしたい！**と思った時のメモです。

結論から言えば```array_walk_recursive関数```で再帰処理が可能。

どんな処理を適用するかは**ユーザ定義関数**として自分で決められます。

そのユーザ定義関数を静的メソッドとして使う書き方は第二引数で指定しますが、ただの関数であれば関数名を渡してあげるだけでOKです。

```php:使用例
<?php
namespace App\Library;

use Illuminate\Support\Facades\Log;

class LogClass
{
    public static function walkLog($data)
    {
        if (!empty($data['results'])){
            array_walk_recursive($data['results'], ['self','maskLog']);
        }
    }

    public static function maskLog(&$item, $key)
    {
        if (!is_string($item) || mb_strlen($item) <= 8) return;
        $item = mb_substr($item, 0, 8);
        return;
    }
}
```

#### 参考URL
[array_walk_recursive — 配列の全ての要素に、ユーザー関数を再帰的に適用する](https://www.php.net/manual/ja/function.array-walk-recursive.php)
[PHPの多次元配列で、階層の深さやキー名が毎回異なる場合に、数値または文字列の値のときだけ操作を行うにはどうしたらよいか](https://ja.stackoverflow.com/questions/74135/php%e3%81%ae%e5%a4%9a%e6%ac%a1%e5%85%83%e9%85%8d%e5%88%97%e3%81%a7-%e9%9a%8e%e5%b1%a4%e3%81%ae%e6%b7%b1%e3%81%95%e3%82%84%e3%82%ad%e3%83%bc%e5%90%8d%e3%81%8c%e6%af%8e%e5%9b%9e%e7%95%b0%e3%81%aa%e3%82%8b%e5%a0%b4%e5%90%88%e3%81%ab-%e6%95%b0%e5%80%a4%e3%81%be%e3%81%9f%e3%81%af%e6%96%87%e5%ad%97%e5%88%97%e3%81%ae%e5%80%a4%e3%81%ae%e3%81%a8%e3%81%8d%e3%81%a0%e3%81%91%e6%93%8d%e4%bd%9c%e3%82%92%e8%a1%8c%e3%81%86%e3%81%ab%e3%81%af%e3%81%a9%e3%81%86%e3%81%97%e3%81%9f%e3%82%89%e3%82%88%e3%81%84%e3%81%8b)
heroku run db:migrateをしたらエラーが出た

heroku run db:migrateをしたらエラーが出た

```
Mysql2::Error::ConnectionError: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
```

エラー文を見ると、ローカルのMySQLに接続できませんでした、という感じみたい。

実際にMySQLの設定を確認する。
ターミナルで

```
heroku config
```
を実行

```
CLEARDB_DATABASE_URL:     mysql://******@us-cdbr-east-04.cleardb.com/heroku_********?reconnect=true
DATABASE_URL:             mysql2
LANG:                     en_US.UTF-8
RACK_ENV:                 production
RAILS_ENV:                production
RAILS_LOG_TO_STDOUT:      enabled
RAILS_MASTER_KEY:         ****************
RAILS_SERVE_STATIC_FILES: enabled
SECRET_KEY_BASE:*************
```

で今回問題になっているのが、

```
DATABASE_URL:             mysql2
```

ここが本来であれば、URLのようなものが記述されているはずだが、記述されていない。

ということで

```
heroku_cleardb=`heroku config:get CLEARDB_DATABASE_URL`
heroku config:set DATABASE_URL=mysql2${heroku_cleardb:5}
```

これをそれぞれ、ターミナルで実行。

再度、heroku configで確認すると

```
CLEARDB_DATABASE_URL:     mysql://******@us-cdbr-east-04.cleardb.com/heroku_********?reconnect=true
DATABASE_URL:             mysql2://******@us-cdbr-east-04.cleardb.com/heroku_********?reconnect=true
LANG:                     en_US.UTF-8
RACK_ENV:                 production
RAILS_ENV:                production
RAILS_LOG_TO_STDOUT:      enabled
RAILS_MASTER_KEY:         ****************
RAILS_SERVE_STATIC_FILES: enabled
SECRET_KEY_BASE:*************
```

となっており、この状態で

```
heroku run db:migrate
```

を実行、で解決。
NLB-EC2構成を取ったときにTCP443にてCONNECT_CR_SRVR_HELLO:wrong version number

###概要

AWSでクライアント証明書を使うために、NLB-EC2構成を取ったときに、Curlで叩くとよくわからないエラーCONNECT_CR_SRVR_HELLO:wrong version numberが発生

結論としてはTargetGroupのProxy2をONにしていたためチェックを外して解決した。

###現状

NLBはTCP80,443をそれぞれTargetGroupでそのままEC2に流している。

```
% curl -v --key private.pem --cert cert.crt -k "https://example.jp"
*   Trying xxx...
* TCP_NODELAY set
* Connected to example.jp (xxx) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*   CAfile: /etc/ssl/cert.pem
  CApath: none
* TLSv1.2 (OUT), TLS handshake, Client hello (1):
* error:1400410B:SSL routines:CONNECT_CR_SRVR_HELLO:wrong version number
* Closing connection 0
curl: (35) error:1400410B:SSL routines:CONNECT_CR_SRVR_HELLO:wrong version number
```

proxy関係で同様のエラーが発生する模様

https://stackoverflow.com/questions/62999335/git-clone-connect-cr-srvr-hellowrong-version-number



###TargetGroup修正

![スクリーンショット 2021-06-08 11.28.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56562/f1d816d2-4d03-3b96-4841-97540e509d5c.png)
なぜかProxy protocol v2が有効だったのでチェック外す。

```
% curl -v --key private.pem --cert cert.crt -k "https://example.jp"
*   Trying xxx...
* TCP_NODELAY set
* Connected to example.jp (xxx) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*   CAfile: /etc/ssl/cert.pem
  CApath: none
* TLSv1.2 (OUT), TLS handshake, Client hello (1):
* TLSv1.2 (IN), TLS handshake, Server hello (2):
* TLSv1.2 (IN), TLS handshake, Certificate (11):

略

< HTTP/1.1 404 Not Found
```

とりあえず正常に通過しました。
RHEL8のマイナーバージョン固定について

**Azure**上の**RHEL**のVMをマイナーバージョンに固定したいと**EUS**リポジトリを切り替える必要があります。詳しい手順には以下のリンクをご参照ください。
- [RHEL VM 8.x を EUS に切り替える](https://docs.microsoft.com/ja-jp/azure/virtual-machines/workloads/redhat/redhat-rhui#switch-a-rhel-vm-8x-to-eus-version-lock-to-a-specific-minor-version)
 
しかし、マイナーバージョンに固定できる**RHEL** のリリースはかぎられています。

**RHEL8**で**EUS**リポジトリリを使用できるリリースは、**RHEL 8.1**、**8.2**、**8.4**、**8.6**、および **8.8** で予定されています。

現在、EUSリポジトリを使用可能リリースはは以下の通りです。

リリース | 日終了予定
--- | ---
8.1 | 2021年11月30日
8.2 | 2022年04月30日
8.4 | 2023年05月30日

上記のリストに入ってないリリースは、**EUS**リポジトリの設定を行っても固定できません。例えば**RHEL 8.3**の場合はバージョンロックはできません。
インタープリタを作る その16

#概要

インタープリタを作ってみた。
avrインタープリター書いてみた。
インとアウトを取り付ける。

#方針

アウトは、レジスタ３１を監視する。
インは、内部表現に、合わせる。

#インの実装

レジスタの内部表現が
[false, false, false, false, false, false, false, false]
なので、変換する関数を書いた。

```

function hen(x) {	
	var a, b, c, d, e, f, g, h;
	x = x.charCodeAt(0);
	if ((x & 0x01) > 0)
	{
		a = true;
	}
	else
	{
		a = false;
	}
	if ((x & 0x02) > 0)
	{
		b = true;
	}
	else
	{
		b = false;
	}
	if ((x & 0x04) > 0)
	{
		c = true;
	}
	else
	{
		c = false;
	}
	if ((x & 0x08) > 0)
	{
		d = true;
	}
	else
	{
		d = false;
	}
	if ((x & 0x10) > 0)
	{
		e = true;
	}
	else
	{
		e = false;
	}
	if ((x & 0x20) > 0)
	{
		
		f = true;
	}
	else
	{
		f = false;
	}
	if ((x & 0x40) > 0)
	{
		g = true;
	}
	else
	{
		g = false;
	}
	if ((x & 0x80) > 0)
	{
		h = true;
	}
	else
	{
		h = false;
	}
	K = [a, b, c, d, e, f, g, h];
	return K;
}

```

#アウトの実装

レジスタ３１の変換関数、書いた。

```
function kan(K) {
	var x = 0;
	if (K[0]) x += 0x01;
	if (K[1]) x += 0x02;
	if (K[2]) x += 0x04;
	if (K[3]) x += 0x08;
	if (K[4]) x += 0x10;
	if (K[5]) x += 0x20;
	if (K[6]) x += 0x40;
	if (K[7]) x += 0x80;
  return String.fromCharCode(x);
}	

```

#投入したソース

```
avr.ldi(31, 'H')
avr.ldi(31, 'e')
avr.ldi(31, 'l')
avr.ldi(31, 'l')
avr.ldi(31, 'o')
avr.ldi(31, ' ')
avr.ldi(31, 'w')
avr.ldi(31, 'o')
avr.ldi(31, 'r')
avr.ldi(31, 'l')
avr.ldi(31, 'd')
avr.ldi(31, '!')
```

#結果

```
Hello world!
```

#成果物

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

以上。
MotionBoardの結合の方法を比較してみた

#最初に 

MotionBoardは綺麗でわかりやすいグラフや画面を作ることができます。 

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657414/04c48011-e65b-88dd-f666-a838819636e4.png" width=60%> 

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657414/e777e485-f3d0-3dc7-57e2-ddddd2df8860.png" width=60%> 

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657414/7bc601e7-ace8-cafa-2313-c2d66b9de500.gif" width=60%> 

綺麗な上に、動いたりもします。 

気になる人は下記リンクをクリックしてください。体験デモもできます。 

[MotionBoard　体験デモについて（公式HPより）](https://www.wingarc.com/product/motionboard/demo/index.html) 

 

<details><summary>【MotionBoardとは】</summary><div> 

様々なデータソースからデータをあつめ、１つの画面上で統合するMotionBoard。 

クラウドサービスとの接続もでき、チャットツール送信もできるのでとてもおもしろいです。 

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657180/877897e8-35d1-b055-a80c-b9051866bc38.png" width=60%> 

※キャプチャはウイングアーク1st社のホームページより抜粋 

[ウイングアーク１ｓｔ株式会社　MotionBoard](https://www.wingarc.com/product/motionboard/index.html) 

</div></details> 


#MBの結合を比較してみた
さて、今回は機能が豊富なMotionBoardの中で結合機能に絞った解説をします。
MotionBoardは複数データを結合させる機能がいろいろな場所で使えるのですが、それらの比較および各結合の詳細をまとめています。

下図のフローを見て、自分でつかいたい結合方法を試してみてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657414/8c786dd3-cd56-47fc-4d93-e6c04cdcf7b8.png)

それぞれの簡単な特長と詳細記事への案内はこちらです。
詳細記事では実際のつくり方など、だいぶボリューミーに記載しています。

|  |モデル  |MB View  |マスター項目  |結合DS  |
|---|---|---|---|---|
|範囲  |全体  |ボード  |チャート  |チャート |
|結合タイプ  |スタースキーマ  |スノーフレーク  |ー  |ー |
|リアルタイム  |×  |○  |○  |○ |
|集計スピード  |早い  |遅い  |まぁまぁ  |まぁまぁ |
|難易度  |中  |高  |低  |中 |
|オススメ  |○  |△  |△  |○ |
|詳細  |[モデル](https://qiita.com/Ryo---san/items/742efe103ea81ea12932)  |[MB View](https://qiita.com/Ryo---san/items/69fb7f3369b23e114571)  |[マスター項目](https://qiita.com/Ryo---san/items/2f6455d23d5cc24e4708)  |[結合DS](https://qiita.com/Ryo---san/items/252465fc8d833be1f3af) |


MotionBoard構築のベテランとしてオススメの運用をまとめますと、明細とマスタの結合については
**まずモデルをつかえるか検討する**ことが大事だと思います。
モデルはひとつつくるとテナント全体で使用ができますので、ボード間のデータの整合性が担保できたり、複雑な加工をしてしまえば、その後のボード作成が簡単になります。
最初のボードつくりでいきなりモデルを使いこなすのは難しいので、ざっくりとボードをひとつつくった段階でモデルでデータをまとめてみる、という使い方がよいでしょう。


データハンドリングはBIをつかいこなす上で、とても大事な考えになります。
ぜひデータをどのように取り扱うべきかを考えながら、ボード構築を進めてみてください。


念のため、下記にも詳細記事のリンクを貼っておきます。
[【４つの結合方法】MotionBoardのモデル機能を解説【難易度：中】](https://qiita.com/Ryo---san/items/742efe103ea81ea12932)
[【４つの結合方法】MotionBoard Viewを解説【難易度：高】](https://qiita.com/Ryo---san/items/69fb7f3369b23e114571)
[【４つの結合方法】MotionBoardのマスター項目を解説【難易度：低】](https://qiita.com/Ryo---san/items/2f6455d23d5cc24e4708)
[【４つの結合方法】結合データソースを解説【難易度：低】](https://qiita.com/Ryo---san/items/252465fc8d833be1f3af) |
heroku login --interactiveでHerokuにログインできないとき。

タイトルのコードでログインしようとすると

```
Error: Your account has MFA enabled; API requests using basic authentication with email and password are not supported. Please generate an authorization token for
 ›    API access.
```

お前のアカウントはMFAを使ってるからメールアドレスとパスワードだけじゃログイン出来んよ
認証アプリ使ってね

ってことみたいですね。
確かに私はそのようにログインしています。

なので

```
heroku login
```

とすると、

```
heroku: Press any key to open up the browser to login or q to exit:
```

とブラウザ経由でログインができるようになります。
【論文紹介】Augmented perception of satiety: controlling food consumption by changing apparent size of food with augmented reality

#論文紹介
論文：Augmented perception of satiety: controlling food consumption by changing apparent size of food with augmented reality
著者：Takuji Narumi, Yuki Ban, Takashi Kajinami, Tomohiro Tanikawa, Michitaka Hirose
https://dl.acm.org/doi/pdf/10.1145/2207676.2207693

#どんなもの
　HMDを使って食べ物の見かけの大きさを変えることで”満腹感”を変えて、食事の摂取量のコントロールをすることができる研究

→被験者は通常のクッキーよりも小さいクッキーを見たときのほうが消費量が多くなった。(視覚的に大きいクッキーと普通のクッキーでは消費量に有意差はなかった) 食べ物を小さく見せたときは食べる量が約15％増え、大きく見せたときは約10％減った。


#先行研究と比較してすごいところ
　食品の見かけの大きさは拡張現実技術を使って簡単に変更できるが、料理の背景には食器があるのでカメラでの認識は難しい。この論文では、リアルタイムの形状変形を用いたボリュームアップ手法を使っている。

#技術や手法のキモ
　食品の大きさを周囲の環境に合わせて変化させる拡張現実技術を構築。<font color="gray">(物体の大きさの比較は相対的な判断で、その相対性が食品の体積の変化を引き起こす。)</font>
　撮影された画像内の食品と被験者の手を抽出し、食品の面積の中心を維持したまま食品の見た目を拡大・縮小。3つの制御点を使って自然に手の形を変形させる。


#検証方法
　被験者は3種類の見かけの大きさ(縮小条件（×0.67，通常条件（×1.0，拡大条件（×1.5）)のクッキーを食べる。被験者はHMDを装着して、好きなだけクッキー・水を食べるように指示された。実験の直前と直後の空腹感と満腹感の評価をしてもらう。
 
 繰り返し測定のANOVAとWilcoxon signedrank検定にBonferroni-Holm補正を加えたものを用いて拡大条件と縮小条件で消費したクッキーの量に有意な差があるか調べた。


#議論
　見かけの大きさを変えることで、口に入れたときに違和感を覚えないのか。

#気になった論文
　クロスモーダル（視覚と嗅覚）な拡張現実感によって、食べ物の味の認識を変え、好みの味を提示する「疑似味覚」ディスプレイ
　ストロー型ユーザーインターフェース
NVIDIAのGPU(RTX)入りUbuntuのインストールでGUIが表示されないエラーの解決方法

## 症状

Ubuntu18.04のインストーラーを起動し「Install Ubuntu」を選択すると、GUI の代わりに「Couldn’t get size: 0x800000000000000e」のエラー文が表示され、そこから進まなくなった。(GPUはQuadro RTX 5000)


## 解決方法

1. インストーラー起動後、インストールメニューの「Install Ubuntu」にカーソルを合わせて「e」を入力する。
2. その後に表示される画面にて「linux...」から始まる行の末尾に「nomodeset」と入
   力する。これでGUIが表示されるようになる。

原因としてインストール時点でNVIDIAのGPUを動かすドライバが正常に動作していないことが関係しているらしい。無事インストールが済んだら再起動の前に[NVIDIA公式サイト](https://www.nvidia.co.jp/Download/index.aspx?lang=jp)から対応するGPUのドライバをインストールしておく。これで再起動後もGUIが表示される。



## 参考元
[NVIDIA GeForce 入り PC で Ubuntu インストーラ(GUI版)の表示が壊れてた場合 - Qiita](https://qiita.com/yoya/items/026317fe2ddb30ab411d)
IBM Cloud Cloud Foundryメモ - トークンが有効期限切れか、取り消されたか、あるいはトークン ID が誤りです。


`ibmcloud cf push`しようとしたところ、以下のエラーが発生しました。久々に触るツールあるあるですね。

> アプリ情報を取得しています... トークンが有効期限切れか、取り消されたか、あるいはトークン ID が誤りです。 ログインし直して再認証してください。 失敗

## 再ログインからのプッシュまで

bimcloudのcliは入ってる前提となりますが以下の流れです。

* あらためてログイン

```bash
$ ibmcloud login --sso
```

* 組織、スペースの設定

```bash
$ ibmcloud target --cf
```

* push （デプロイ）

```bash
$ ibmcloud cf push
```



## よもやま

ログインしたあとのtarget指定がけっこう忘れますね。。

まよったらここ（[IBM CloudでNode.jsアプリケーションをデプロイするまでの流れ](https://qiita.com/n0bisuke/items/4c29aad3696edcc627f2)）を見ながら振り返ると良さそうです。
link_toメソッドを使用して各記事へのリンクを作成する。

link toメソッドを使用して、パスを指定する際の方法。

①rails routesでパスを確認する

```ruby
Verb   URI Pattern  Controller#Action
GET    /prototypes/:id(.:format)  prototypes#show
```

省略していますが、今回はprototypeという記事の詳細ページへのリンクです。
記事はviewである分だけ表示するよう指定しています。

pathはPrefixで記述した方が良いらしいのですが、今回のprototypes#showにはPrefixがありませんので、URI Patternで記述します。

②実際の記述

```ruby
<%= link_to "#{prototype.title}", "/prototypes/#{prototype.id}", class: :card__title%>
```
"/prototypes/#{prototype.id}"の部分がパスですね。
実際のURLもこのようになっています。
http://localhost:3000/prototypes/2
　#{}で記述することで、取得した情報を文字列で表示してくれる。
※URLは文字列型

簡単ですが、link toメソッドを使用して各記事へのリンクの作成方法でした。
UnityでNuitrackのサンプルを動作させようとしたらエラーしたので解消メモ

UnityでNuitrackのサンプルを動作させようとしたらエラーしたので解消メモ

下記のコマンドみたいにdllを入れてあげたら解消できました

###dllをEditorへコピー

管理者で実行が必要でした

```
FORFILES /S /P "C:\Program Files\Unity\Hub\Editor" /M tbb.dll /C "cmd /c copy \"C:\Program Files\Nuitrack\nuitrack\nuitrack\bin\tbb.dll\" @path"
```


### エラー内容

![nuinui.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48015/b130a62a-8f42-02d6-b282-a5563cdc2388.png)


``` 
nuitrack.TerminateException: NuitrackException (TerminateException): WARNING: Cannot load library module: C:\Program Files\Nuitrack\nuitrack\nuitrack/middleware/NuitrackModule.dll
ERROR: TBB version mismatch: runtime library version is 9102, but the application was compiled with the 11102 version!
```

### 参考サイト

https://community.nuitrack.com/t/compatibility-of-the-latest-nuitrack-runtime-and-sdk-versions/2254
[備忘録]Docker for Mac(M1)で急にビルドできなくなった。

#ビルドできない

また，Dockerでビルドができなくなりました．
以前は，Docker for Windowsでビルドができなくなりました．
その際の記事は以下になります．

https://qiita.com/go_new_innov/items/9739892231fcdc77228f

今回は，Macでビルドできなくなりました．
新しいM1 Macなので仕方ないと思いますが，解決したので備忘録として残します．

#エラー
以下のようにビルドを実行すると...

```
docker build -f ./Dockerfile -t test .
```

このようなエラーが出ました．．．

```
failed to solve with frontend dockerfile.v0: failed to create LLB definition: failed to do request: Head https://registry-1.docker.io/v2/library/ubuntu/manifests/18.04: proxyconnect tcp: dial tcp 192.168.65.1:3128: i/o timeout
```

#解決方法
<font color="red">!本解決方法は，Factory reset(初期化)を行うので，自己責任で実行してください!</font>
<font color="red">コンテナやイメージが消去されます．</font>

1.右上のbugマークをクリックし，Troubleshootの設定に入ります．
2.Clean/Purge dataを行います．
3.Reset to factory defaultsを行います．

![Screen Shot 2021-06-08 at 10.22.48.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262828/6df167f7-c270-618d-24c8-ed37e362e78b.jpeg)

少し，強制的な直し方ですが，これでビルドしていただくと，うまくいくと思います．

たまに，ビルドできなくて午前中なくなる:(
Qiitaでコードブロックでマークダウンを指定してコードブロックを書くときはこれでいける！

# はじめに
こんにちは。唐揚げと竜田揚げの違いが説明できませんでした、筆者です。

さて、先日、Qiitaで記事書いているときに、コードブロックでマークダウンを指定してコードブロックを書きたいとき、どうすればいいんだ？:thinking:

となって、これに行き着いたので、もし表現したい人いましたら参考になれば幸いです。

# 結論これ

インデント入れると、**```** がコードブロックの終了とみなされず、コードブロック内に収まってくれました！
ちょっときもいですが、読者にやりたいことが伝わるのであれば、まぁこれでいっかとなりました... :innocent: 

```md
    ```js
        console.log()
    ```
```

# おわりに
超しょうもないTipsみたいなやつですが、地味に困って編み出した技みたいなやつです。
参考になれば幸いです:bow:
tailwindCSSでimportされない。装飾の設定が反映されない問題の対処。 Win10 Next.js VSCode

追記 2021年10月27日
正常なはずのcssファイルの警告が消えない時
VScode拡張機能の
"PostCSS Language Support"
をいれる。
追記終了

追記 2021年6月10日
VSCodeをクリーンインストール（VScode自体の他、VScodeの設定も拡張機能も全て消去）

```ターミナル
npx create-next-app {アプリ名}
cd {アプリ名}
npm install -D tailwindcss@latest postcss@latest autoprefixer@latest
npx tailwindcss init -p

```

```styles/globals.css
@tailwind base;
@tailwind components;
@tailwind utilities;
```
波線が表示され、その上にマウスカーソルを乗せると、
クリーンインストールしてからこの手順でも同じように
`Unknown at rule @tailwindcss(unknownAtRules)`
と表示されました。

そして、マニュアル通りに
インストール - Tailwind CSS
https://tailwindcss.com/docs/installation

```
@import "tailwindcss/base";
@import "tailwindcss/components";
@import "tailwindcss/utilities";
```

と回避したところ正常に読み込めました。

追記終了



環境
Windows10
Next.js 10
VSCode

# 問題 tailwindCSSの設定がimportされない。

```globals.css
@tailwind base;
@tailwind components;
@tailwind utilities;
```

@tailwind にマウスカーソルを載せてホバーを表示させると
`Unknown at rule @tailwindcss(unknownAtRules)`
と表示されていてtailwindCSSの装飾がアプリに反映されない。

実際の画像
![tailwindCSS インポートが反映されない.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44761/281b16b7-c9fd-af31-b851-c584099d4400.png)


公式
Installation - Tailwind CSS
https://tailwindcss.com/docs/installation
を見てみると


Windows10の場合
>If you’re using postcss-import (or a tool that uses it under the hood, such as Webpacker for Rails), use our imports instead of the @tailwind directive to avoid issues when importing any of your own additional files:

postcss-import (またはWebpacker for Railsのようにボンネット内で使用するツール)を使用している場合は、@tailwindディレクティブの代わりに私たちのimportを使用して、独自の追加ファイルをインポートする際の問題を回避してください。

とあります。

```
@import "tailwindcss/base";
@import "tailwindcss/components";
@import "tailwindcss/utilities";
```
しかし、これではtailwindCSSの装飾した色々な設定が反映されませんでした。

そこで

```
/* Windows10の場合？ */
@import "~tailwindcss/base";
@import "~tailwindcss/components";
@import "~tailwindcss/utilities";
```
とこのように`~` を先頭につけるとtailwindCSSの装飾の設定が反映されるようになりました。

![tailwindCSS インポートが反映されない 反映する方法.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44761/de158e7c-5cdd-e8e3-bee9-b5fac409c3ff.png)

このように警告などは表示されていません、またtailwindCSSの装飾の設定が反映されています。
しかし`@layer`の箇所では警告が出たままです。

# その他
@layer でも警告が出ているが、`~`を付けても消えませんでした。

# 設定は反映されているが、警告も出ている場合。
VSCodeの`settings.json`で

```settings.json
"css.lint.unknownAtRules": "ignore",
```

と無視する設定にします。
actorって結局なんなん？

Swiftのasync/awaitはわかりやすいアップデートだけど一緒に出てきた`actor`って結局何者なのか？というのを軽く調べてみたメモ

### 参考
[Swift Proposal](https://github.com/apple/swift-evolution/blob/main/proposals/0306-actors.md)

### ざっくり概要
並列化の安全を保証できるデータ構造、並列処理のためのクラス

### 何がいいの？
プロポーザルによるとactorの変更には以下のような制約がかかる

- 属するプロパティを変更する際はselfに対して呼び出す必要がある
- 他のactorインスタンス（用語がこれでいいのかは不明）に変更をかけようとするとコンパイラレベルでエラーが出る

すなわち、並列処理で別々のスレッドが同じインスタンスを触って変更に矛盾が生じるみたいな事故を言語レベルで防ごうぜってことだと思います。
他の機能もたくさんありそうですが、大事なのはここの理解かなと感じました。

### 結論
並列処理でガンガン変更を加えるデータには`class`ではなく`actor`を使っていきましょう
Next.jsでnpm run devを実行したところ、エラー「segmentation fault」が発生した

## はじめに

![ 2021-06-07 12.59.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166484/1a047832-a840-8222-2c9c-afa09f2e5c31.png)

こんにちわ、dtakkiyです！

Next.jsで作成したプロジェクトで`$npm run dev`を実行したところ、下図の様に`segmentation fault`エラーで落ちるようになりました。
ローカルでの実行の度に`segmentation fault`エラーが起こるため、開発が全く進まなくなりました。

今回は、このエラーの解消方法についてお伝えします。

## 実行環境

ハード: MacBookAir
cpu: Apple M1
os: macOS Big Sur version 11.2.3
node: version 16.2.0
next.js: 10.2.3

## 解決方法

nodeのバージョンを最新版のversion 16.2.0から推奨版version 14.17.0に切り替えました。
（2021/06/07時点）

![ 2021-06-08 6.54.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166484/376586b6-5597-aaab-09c4-81649148026e.png)

## nodeの新しいバージョンをインストール

nodeのバージョン管理には、nvmを使用しています。
以下の手順で推奨版のversion 14.17.0をインストールします。

```zsh

#現在インストールされているバージョンの確認
$nvm list                  

# インストール可能なバージョンの確認
$nvm ls-remote             

# v14.17.0のインストール
$nvm install v14.17.0      

#デフォルトのバージョンをv14.17.0に指定
$nvm alias default v14.17.0 

#現在のバージョンを確認
$nvm current 
v14.17.0

```

## node_modulesフォルダの削除および再インストール

作成したnext.jsプロジェクトにあるに`node_modules`フォルダを削除します。

```bash
$ rm -rf ./node_modules
```

nodeモジュールを再インストールします。

```bash
$ npm install
```

## npm run dev の再実行

```bash
$ npm run dev
```

以上の手順でエラーは解消されました。

## おわりに

以上です。
バージョン切り替え後は、エラーは発生せず動作は安定しています。
ターミナルで「zsh: command not found:」が出てきた時

git hubにクローンしようとして、コマンド入力した際に ``zsh: command not found:`` が出てきて焦ったのでここにメモとして残しておきます。

環境
macbook air (m1チップ)
デフォルトシェルはzsh

##デフォルトシェルとは

シェルは、Linuxへの命令文を入力するためのアプリケーションの総称です。Linuxの代表的なシェルはbashですが、それだけでなく、sh、ksh、zsh、csh、tcshなどもシェルです。

macOS Catalina以降はzshです。
※読み方は「ズィーシェル」だと思います。

####デフォルトシェルの確認コマンド

```
$ echo $SHELL        // デフォルトシェルを表示する
/usr/local/bin/zsh   // zshの場合
```

ターミナルの設定ファイルが存在しない場合は設定ファイルの作成が必要

####設定ファイルの作成
```
touch .zshrc 
```

####設定ファイルの編集
```
open ~/.zshrc 
```

パスを通します（環境変数（$PATH）の記述を変えて、コマンド検索パスを追加すること）

※私はパスを通す意味がわからなかったので、こちらを参考にしました。
https://qiita.com/Naggi-Goishi/items/2c49ea50602ea80bf015

####パスを通す
```
export PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
```

###編集内容を保存する
```
source ~/.zshrc
```
自分の場合はこれでターミナルを再起動したところ解決しました！

参考
https://teratail.com/questions/322624
https://qiita.com/k3ntar0/items/eb8cdbd8eba9da388def
https://algorithm.joho.info/mac/zsh-command-not-found-ls/
Windows cmd - Note

# Content
- CMD
- Environment variable

# CMD

## Search 

|Title|cmd|Description|
|---|---|---|
|Search :<br/>current folder|dir FILE_NAME|-|
|Search :<br/>any place|dir /s `*foo*`|Finds directories as well as files in current folder and sub folders<br/><br/>/s : Lists every occurrence of the specified file name within<br/>the specified directory and all subdirectories.|

|Other example|Description|
|---|---|
|dir /s SEARCH_KEYE >> FOLDER_NAME\result.txt|Store search result in file|

# Environment variable
#### [Ref. site](http://www.dowdandassociates.com/blog/content/howto-set-an-environment-variable-in-windows-command-line-and-registry/)


### cmd : See environment variable

```
### set VAR_NAME
C:\....> set JAVA_HOME
JAVA_HOME=C:\Program Files...\...\jdk-11.0.9

C:\....> echo %JAVA_HOME%
C:\Program Files...\...\jdk-11.0.9
```

#### cmd : Set environment variable

```
# set VAR_NAME "path...."
setx MONGODB "C:\Program Files\MongoDB\Server\5.0\bin"
```
p5.js Web Editorでフォントを指定する

p5.jsは[Web Editor](https://editor.p5js.org/)を使って，手軽にプログラミングを試すことができて，良いのですがフォントの指定がp5.jsのreferenceに従って試してもエラーになります。

## Reference
p5.jsの[Reference loadFont()](https://p5js.org/reference/#/p5/loadFont)によると，

```
let myFont;
function preload() {
  myFont = loadFont('assets/inconsolata.otf');
}

function setup() {
  fill('#ED225D');
  textFont(myFont);
  textSize(36);
  text('p5*js', 10, 50);
}
```

でフォントの指定ができるように記述されています。しかし，Web Editorにcopyして試すと，consoleに以下のようなエラーが表示されてしまいます。

> 🌸 p5.js says: It looks like there was a problem loading your font. Try checking if the file path (assets/inconsolata.otf) is correct, hosting the file online, or running a local server. (More info at https://github.com/processing/p5.js/wiki/Local-server) 
> parseBuffer@https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.3.1/p5.js:51306:25

## 対策
検索してみると，[loadFont()が効いてない！？という時でも Fontファイルを読み込んで使う２つの方法](https://blog.creative-plus.net/archives/9810)という記事が見付かりました。この記事を参考にしてみます。

### htmlのヘッダでフォントを読込む
[Google Fontsの使い方や利用方法](https://www.webdesignleaves.com/pr/plugins/googleFonts_01.html)を参考に利用したいフォントを選びます。

試しに特徴のある[monoton](https://fonts.google.com/specimen/Monoton?query=monoton)フォントを選んでみます。

> \+ select this style

をクリックすると，フォントを利用するためのコードが得られます。

```
<link rel="preconnect" href="https://fonts.gstatic.com">
<link href="https://fonts.googleapis.com/css2?family=Monoton&display=swap" rel="stylesheet"> 
```

これをindex.htmlに追加します。Web Editor の実行ボタン下にある">"をクリックします。
![Screenshot 2021-06-08 at 10-22-22 p5 js Web Editor.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233756/1acbf3f2-e059-0e96-306a-59556906135c.png)

スケッチファイルの一覧が表示されるので，index.htmlを選択し，ヘッダにGooogle Fontsで指示されたコードを追加します。
![Screenshot 2021-06-08 at 10-23-38 p5 js Web Editor.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233756/dd8bef85-b12b-6ad1-65a3-90f6cd6bccad.png)

index.htmlでフォントを指定したので，loadFont()で読み込みせずにtextFont()で指示します。
![Screenshot 2021-06-08 at 10-30-15 p5 js Web Editor.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233756/1cea6c45-89c3-f401-734c-0c404230fe0c.png)

Monotonフォントをp5.jsから表示することができました。
HelloWorldについて

HelloWorldの実行について

①プロジェクトの作成
②パッケージの作成
③クラスの作成　※public static void main(String[] args) にチェックを入れる
④コードの入力

```java
package test1;

public class Test1 {

	public static void main(String[] args) {
		// TODO 自動生成されたメソッド・スタブ
        System.out.println("Hello World");
	}

}
```

⑤実行
RPGツクールMZで「プレイヤーから接触」が起動しない

障害物に触れた時に起動するイベントを作りたかったが、なぜかイベントが起動しない。。。
![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1569020/fcf05d6a-86de-c6ed-2be2-bf8b3229437e.png)

原因は「画像」でキャラクター以外を選択すると、「プライオリティ」が「通常キャラの下」になるのが原因。
**「プライオリティ」を「通常キャラと同じ」にすると起動する** ようになる。
![2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1569020/12f239ba-e4d3-cb08-370f-3564799383c2.png)
話題の次世代グリーン仮想通貨”Chia”

従来仮想通貨のマイニングはCPU,GPU,ASIC などで行われてきた。しかし、そのマイニングに掛かる電力が大きく現在のSDGs等で語られている二酸化炭素削減の観点からすると好ましい方向ではない。　テスラのイーロンマスクもこの点を問題視した発言を述べている。　そういった中、HDDを使用してPoS,PoTを実施してマイニングを行う画期的な仮想通貨が提案された。　 "Chia"である。　この方法により従来の1/10とも言われる電力の削減が可能となってくる。

イーロンマスク、コメント；
https://www.theblockcrypto.com/linked/105906/elon-musk-bitcoin-miners-renewable-energy-michael-saylor-tesla

Chia by mediglobe Inc.;
https://youtu.be/hgQJE5PhCLU
flutter で行こう；iOS,Android 自由自在

flutterという言葉をチラホラ耳にする機会も多くなったと思う、またコーダーであればiOS,Androidのapp開発でそれぞれXcodeとAndroid Studioの環境を使い分ける事にストレスを感じる事も多いと思う。　これらの環境を一元的にコーダーの視点で統一的に開発ができる様になった環境がflutterだ。　是非この機会に接する事をオススメする。とは言え私もflutter熟練者ではないので、皆さんと同じ様にTry&Errorをしつつ参考を示していきたい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167640/7e825e83-5a74-15a8-2838-9ebbdbc517b0.png)