OmniAICreator/Qiita-1.07M huggingface dataset:
MSIXでパッケージ化する場合はレジストリアクセスに気を付ける

## はじめに
ClickOnceに変わる新しいアプリケーション配布の仕組みとして、MSIXがあります。
既存の.NET Frameworkで作成したアプリケーションでも、`Windows アプリケーション パッケージ プロジェクト`をソリューションに追加するだけで、容易にMSIXでパッケージ化することができます。
（具体的なやり方はDocsを参照）
https://docs.microsoft.com/ja-jp/windows/msix/desktop/desktop-to-uwp-packaging-dot-net

今回は、MSIXでパッケージングした結果、レジストリアクセスにハマってしまった事例について紹介します。

## MSIXでパッケージ化したらレジストリが他のアプリと共有できなくなった
既存のアプリでレジストリに書き込みを行ない、他のアプリで同じキーを読み取るケースを想定して下さい。

例えば、以下の2つのアプリがあるとします。

アプリA・・・今回MSIXでパッケージ化したアプリ
アプリB・・・その他のアプリ

以下の流れで同じレジストリキーの値に対して読み書きを行ないます。

1. レジストリキー`HKCU\SOFTWARE\HOGE`の`VAL`値に「0」が設定されているとする
1. アプリAで`VAL`値を読み込む
1. アプリBで`VAL`値を読み込む
1. アプリAで`VAL`値を**「1」に書き替える**
1. アプリAで`VAL`値を読み込む
1. アプリBで`VAL`値を読み込む

単体のEXEとして動作させた場合、
　2.・・・「0」
　3.・・・「0」
　5.・・・「1」
　6.・・・「1」
という結果になります。当然の結果です。

ところが、この **アプリA** をMSIXでパッケージングして配布・動作させると、
　2.・・・「0」
　3.・・・「0」
　5.・・・「1」
　6.・・・ **「0」**
という結果になります。
4.でアプリAが書き換えた「1」の値が、アプリBから読み取れていません。

## MSIXでパッケージ化されたアプリからのレジストリ アクセスは仮想化される
MSに問い合わせた結果、
>MSIXでパッケージ化されたアプリからのレジストリ アクセスは仮想化されており、システムや他のアプリケーションから分離された【ユーザーごと・アプリごとのプライベートな場所】にリダイレクトされる。
そのため、パッケージ化されたアプリケーションから直接他のアプリケーションで読み書きされるレジストリに書き込むことはできない。

ということでした。以下に詳細な説明があります。
https://docs.microsoft.com/ja-jp/windows/msix/desktop/desktop-to-uwp-behind-the-scenes#registry

即ち、MSIXでパッケージ化したアプリから`HKLM\Software`や`HKCU`以下への書き込みを行なうと、**インストール後初回の書き込み時に**【ユーザーごと・アプリごとのプライベートな場所】にコピーされ、それ以降はその場所に対する読み書きとなる、という事です。

上記の例で言うと、
>4.アプリAで上記のレジストリキーの値を「1」に書き替える

の時点で、書き込みを行なったレジストリキーの値がアプリA専用のプライベートな場所にコピーされ、そちらに対する書き込み・読み込みとなっていたため、他のアプリBから読み取った値と異なってしまった、という事です。
（MSの回答では、HKCU全体ではなく、書き込みを行なった「値」単位でコピーされるとのこと）

なお、値の読み込みに関しては、システムレジストリの値と、【ユーザーごと・アプリごとのプライベートな場所】の値がマージされて読み取られるそうです。

## 回避策
.NETのコードでレジストリの書き込みを行なうと上記の現象になりますが、**reg.exe**を起動して別プロセスから値を書き込むと、システムレジストリに対する書き込みとなる事がわかりました。

元々、C#の`RegistryKey.SetValue`メソッドで書き込みを行なっていましたが、以下のようにプロセスを起動する事で、【ユーザーごと・アプリごとのプライベートな場所】が作られることなく、レジストリへの書き込みが行なえました。

```
var argument = @"ADD ""HKEY_CURRENT_USER\SOFTWARE\HOGE"" /v ""VAL"" /t REG_DWORD /d ""1"" /f";
Process.Start("reg.exe", argument);
```

なお、読み込みに関しては、書き込みを全て**reg.exe**で行なう前提であれば、`RegistryKey.GetValue`メソッドで行なっても問題ありません。
（【ユーザーごと・アプリごとのプライベートな場所】ができていない、という前提）

## 注意点
既にMSIXで配布し、レジストリへの書き込みを行なってしまい、【ユーザーごと・アプリごとのプライベートな場所】が作成されてしまったものについては、MSIXアプリをアンインストールするしかこれを削除する方法はありません。
[メモ]Ruby・Rails環境構築

#はじめに
完全自分用の記事になります
といえども、わりとシンプルにまとめてますので、この通りにすれば、まずこけることはないかなと思います
#環境構築

##Homebrewのインストール

```:terminal
% cd  # ホームディレクトリに移動
% pwd  # ホームディレクトリにいるかどうか確認
% /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)" # コマンドを実行
```

処理に時間がかかる可能性のある操作ですので、慌てずに待つこと
パスワードを求められたら自身のPCのパスワードを入れる

以下のようになればOK
```:terminal
% brew -v
Homebrew 2.5.1 # 数字は異なる場合があります。
```
以下のコマンドで最新

```:terminal
% brew update
```

Homebrewの権限を変更する

```:terminal
sudo chown -R `whoami`:admin /usr/local/bin
```

##Rubyのインストール

Rubyの土台となる、rbenvとruby-buildを、Homebrewを用いてインストールします。以下のコマンドを実行。

```:terminal
% brew install rbenv ruby-build
```

ｒbenvはインストールされた。
PCにおけるどこの場所からも使用できるようにするため、以下のコマンドを実行。

```:terminal
echo 'eval "$(rbenv init -)"' >> ~/.zshrc
```

設定ファイルであるzshrcを修正したので、以下のコマンドでzshrcを再読み込みし、変更を反映。

```:terminal
% source ~/.zshrc
```

##readlineのインストール

ターミナルのirb上で日本語入力を可能にする設定を行うために、以下のコマンドでインストール。

```:terminal
% brew install readline
```
rbenvの時と同様に、以下のコマンドでreadlineをどこからでも使用できるようにする。

```:terminal
% brew link readline --force
```

##Rubyのインストール

```:terminal
% RUBY_CONFIGURE_OPTS="--with-readline-dir=$(brew --prefix readline)"
% rbenv install 2.6.5
```

使用のバージョンを以下で指定

```:terminal
% rbenv global 2.6.5
```

Rubyのバージョンを指定できたので、以下のコマンドでrbenvを読み込み、変更を反映。

```:terminal
% rbenv rehash
```
ちゃんとインストールされたか確認！

```:terminal
% ruby -v
```

##MySQLの準備

```:terminal
% brew install mysql@5.6
```

MySQLは本来であればPC再起動のたびに起動し直す必要があるが、それは面倒であるため、自動で起動するようにしておく。

```:terminal
% mkdir ~/Library/LaunchAgents 
% ln -sfv /usr/local/opt/mysql\@5.6/*.plist ~/Library/LaunchAgents
% launchctl load ~/Library/LaunchAgents/homebrew.mxcl.mysql\@5.6.plist 
```

rbenvやreadlineの時と同様に、どこからでもMySQLを操作するためのコマンドmysqlを実行できるようにしておく。

```:terminal
% echo 'export PATH="/usr/local/opt/mysql@5.6/bin:$PATH"' >> ~/.zshrc # mysqlのコマンドを実行できるようにする設定
% source ~/.zshrc #  設定を読み込むコマンド
% which mysql # mysqlのコマンドが打てるか確認する

# 以下のように表示されれば成功
/usr/local/opt/mysql@5.6/bin/mysql
```

##shade-mini-infoを用意

```:terminal
% brew install shared-mime-info
```

##Railsの準備

Rubyの拡張機能（gem）を管理するためのbundler（バンドラー）をインストール

```:terminal
% gem install bundler --version='2.1.4'
```
Railsをインストールします。

```:terminal
% gem install rails --version='6.0.0'
```
一応確認っと、、

```:terminal
% rails -v
Rails 6.0.0  # 「Rails」のあとに続く数字は変わる可能性があります
```

##Node.jsのインストール

Railsを動かすためにはNode.jsが必要となり、それをHomebrewを用いてインストールします。

```:terminal
% brew install node@14
```

この時、最後にWarning: node@14 14.15.3 is already installed and up-to-dateと表示されても問題はない。
あとはパスを通して完了

```:terminal
% echo 'export PATH="/usr/local/opt/node@14/bin:$PATH"' >> ~/.zshrc
% source ~/.zshrc
```

一応確認っと。

```:terminal
% node -v
v14.15.3 # 数値は異なる場合があります
```

##yarnをインストール

yarnは、プログラム同士の関係性を管理する役割などで用いられるもので,Node.jsを利用する際に、プログラム同士の関係性を管理する役割などを担う。

```:terminal
% brew install yarn
% yarn -v #確認
```

#おわりに

完全自分用でした。
間違い等はご指定くださると幸いです。
初心者がROSチュートリアルやってみた#1

本記事は、ROSの公式チュートリアルをやっていく上でどこかにメモしときたいと感じたので、メモ感覚で書いていきます。ご指摘やアドバイス等、お待ちしております。

といっても途中までチュートリアルをやっているので、この記事はROS公式チュートリアル(http://wiki.ros.org/ja/ROS/Tutorials)
の3.ROSパッケージを作るからやっていますあしからず。
そこで、現在の僕の環境を書き残しておきます。
###環境
Oracle VM VirtualBox
Ubuntu16.04
ROS:kinetic
ROSversion:1.12.17
##1.catkinパッケージの必須要素
ここはホーホーと読むだけで良さそうですね。今後うまくいかないときに必須要素があるか確認することがあるかも。
##2.catkinワークスペース内のパッケージ群
ここも読むだけで良さそうです。
今後チュートリアルをしていく上で、catkinワークスペースが必要になってくるので、まだ作っていない人は(http://wiki.ros.org/catkin/Tutorials/create_a_workspace)
で空のワークスペースを作ろうとのこと。僕は作った記憶が無いですが(一度にいろんなことに手を出しすぎて忘れた)、なんだかターミナルでroscdしたらこのようになったのでできてるっぽい。
![Screenshot from 2021-06-05 13-02-46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/727850/d45c7ecf-d1dd-d8fc-b6c5-051bb4a6396d.png)

というわけで次へ。

##3.catkin形式のパッケージを作る
ここは、チュートリアルのまんまやって、こうなった。
![Screenshot from 2021-06-05 13-04-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/727850/71f86190-60b9-eacc-a8d8-9aff9b2e466a.png)


良さそう。今後、開発をしていく時には、

```
$cd ~/catkin_ws/src
$catkin_create_pkg [パッケージの名前] [依存するライブラリ]
```
で良さそう。


##4.パッケージの依存
ここはもうなるほど！って感じ。依存関係の確かめ方とかわかりました。
引数でそれぞれ見れちゃうってことね。

##5.自分のパッケージをカスタマイズする
package.xmlのタグの説明ですね。それぞれのタグを理解すればカスタマイズできちゃうってことか。
ロボコンでチーム開発で大きなプロジェクトになってきたらmaintainerタグが重要になってきそうですね。

カスタマイズするっていってもまだなんもわかんないから、どれが必要でどれが不要かわからんですね。
ライブラリに関しては今後勉強するとして、チュートリアルで作った範囲ではdescriptionタグとmaintainerタグ、licenceタグ、dependenciesタグ(build_depend,buildtool_depend,run_depend,test_depend)以外はなくても大丈夫って感じかな。

とりあえず、3は終わり。今日ちょうど部会があるので、友人に聞いてみようかな。

#参考
ROS公式チュートリアル
http://wiki.ros.org/ja/ROS/Tutorials/CreatingPackage
信用するプロキシの設定【Laravel】

何が書いてあるか分からない…
説明の意味が分からない…
https://readouble.com/laravel/5.5/ja/requests.html#configuring-trusted-proxiesにて
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1602694/5eabd952-7cef-1c66-2dd9-008082579fbd.png)


≪分からない単語辞書≫
ロードバランサ：
サービスが止まらないようにサーバーを振り分ける。
中でも、ラウンドロビンは、分散対象のサーバー全てに均等に振り分けをします。

トラフィック：
インターネットやLANなどのコンピューターなどの通信回線において、一定時間内にネットワーク上で転送されるデータ量のこと。
（https://www.idcf.jp/words/traffic.htmlより）

フォワーディング：
ネットワーク上で、あらかじめ指定された条件や設定などに基づいて、外部から受信したデータを特定の宛先へ自動的に転送する機能。
イメージは、宅配さんが自分の地区で住所をたどり、荷物を送り届ける。

セキュア：
一般的に、コンピュータがセキュアな状態である、と形容される場合、暗号化方式を利用して通信の盗聴や改竄を防止したり、認証方式を利用してなりすましを防止したり、脆弱性・セキュリティホールの検出ツール、あるいはファイヤーウォールなどを利用して不正アクセスを防止したり、といった対策が適切に講じられている状態を指す。
（https://www.weblio.jp/content/ より）

プロキシ（webプロキシ）
日本語に訳すと「代理」や「中継」を意味します。つまり、WEBプロキシサーバとはインターネットに代理接続しアクセスするサーバのことを指します。
（https://www.amiya.co.jp/column/web_proxy_20200911.html#i より）

以上つらつらと書きましたが、私はAWSを利用しているので、
こちらを行います。(vfs connectionエラーの予防)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1602694/80991fe8-3f9c-c787-34a0-2a4b97ab3af5.png)

≪分からない単語辞書≫
プロバイダ：
単にプロバイダといった場合は、通信回線を通じて加入者にインターネットへの接続・中継サービスを提供する「インターネットサービスプロバイダ」（ISP：Internet Service Provider）のことを指す場合が多い。
（https://e-words.jp/w/%E3%83%97%E3%83%AD%E3%83%90%E3%82%A4%E3%83%80.html より）
【React】Expected an assignment or function call and instead saw an expression  no-unused-expressionsの対処法

<h2>症状</h2>
Reactのコードをコンパイルした時に、以下のエラーが発生しました。

```terminal:error
Expected an assignment or function call and instead saw an expression  no-unused-expressions
```

そのまま翻訳すると、
「割り当てまたは関数呼び出しが予期されていましたが、代わりに未使用の式のない式が表示されました」

エラーが出たソースは以下です。

```React:Hoge.jsx
import React ,{ Fragment} from 'react';1

export const Hoge= () => {
    return(
      <Fragment>
        "Fuga"
      </Fragment>
    )
}
```

<h2>解決策</h2>
importの後に1が入っていたため、起きていました。
1を取り除いたら、エラーが解消されました。

```React:Hoge.jsx
import React ,{ Fragment} from 'react';

export const Hoge= () => {
    return(
      <Fragment>
        "Fuga"
      </Fragment>
    )
}
```
bigquery ddl with hive partition on gcs

```
CREATE EXTERNAL TABLE dataset.AutoHivePartitionedTable
WITH PARTITION COLUMNS
OPTIONS (
  uris=['gs://bucket/path/*'],
  format=csv,
  hive_partition_uri_prefix='gs://bucket/path'
);

```

https://cloud.google.com/bigquery/docs/reference/standard-sql/data-definition-language#create_external_table_statement

- parquetの場合はformat=parquet
- if not exists と or replaceの同時指定はできない．当然．．．
AWS クライアントVPN TLSバージョンの確認

# OpenVPN クライアントでのTLSバージョンの確認

ログのパスは以下の通り。

OpenVPN/log/downloaded-client-config.log

ログにはTLSv1.2と記載されている。

```
2021-06-05 08:13:56 Control Channel: TLSv1.2, cipher TLSv1.2 ECDHE-RSA-AES256-GCM-SHA384, 2048 bit RSA
```

# AWS VPN クライアントでのTLSバージョンの確認

ログのパスは以下の通り。

Amazon/AWS VPN Client/WinServiceLogs/username/win_service_aws_client_vpn_connect_20210605.log

ログにはTLSv1.2と記載されている。

```
2021-06-05 06:22:37.903 +09:00 [DBG] [TI=11] [4900] Sat Jun 05 06:22:37 2021 Control Channel: TLSv1.2, cipher TLSv1/SSLv3 ECDHE-RSA-AES256-GCM-SHA384, 2048 bit RSA

```

# 参考記事

https://docs.aws.amazon.com/ja_jp/vpn/latest/clientvpn-user/client-vpn-connect-windows.html

https://qiita.com/u-bayashi/items/6216fea98fcc76d97383
FileSystemObjectを使った、ワイルドカード指定のファイル存在チェック

あるあるネタにも関わらず、ネットではあまりツッコんだ内容がなかったのでメモ。
***
+ 業務上、べらぼうに長いファイルパス（300バイト以上）を扱うため、ファイル存在チェックでVBAのDir関数は使えない:frowning2:
+ 一方、FileSysystemObject（以下FSO）のFileExistsメソッドでワイルドカードを指定するとエラーになり:cry:
　⇒FSOのGetFolderメソッドで、対象フォルダ中の全ファイル名を抜き出し、Likeでワイルドカードパターンと照合します。

```
Dim fso As Scripting.FileSysystemObject
Dim fil As Scripting.File
Dim 存在FLG As Boolean

Set fso = New Scripting.FileSystemObject
存在FLG = False
With fso
    For Each In .GetFolder(非常に長いパス).Files
        If fil.Name Like "テンプレートver*.xlsx" Then
            存在Flg = True
            Exit For
        End If
    Next fil
End With
If Not 存在FLG Then
    MsgBox "テンプレートファイルがありません。", vbExclamation
End If
```

***
この方法、感覚的？に**「パフォーマンスが悪いのでは？」**などど書いたサイトもあったけど、ホンマに？
というわけで実験。

チェック対象フォルダに
　テンプレートvea1.xlsx
　テンプレートvea2.xlsx
　　・・・
　テンプレートvea1000.xlsx
の要領で、ワイルドカード最後の１文字がマッチしない名前のファイルを1,000個作成。

上記　VBAを実行し、処理時間を計測。５回計測して、処理時間は0.27～0.29秒。実行画面でもほとんどストレスは感じず。
（Windows10 Pro/Intel Xeon6126 2.6GHz×2/8GB RAM（VDI環境）） 
存在チェックは、ほとんどの場合そのファイルが存在すること前提のチェックなわけで、だとすればもっと早く終わる（はず）。

***
まあ、そもそも１フォルダに1000個もファイル格納させてるようなケースは、人・機械いずれが使うにも問題が多いような:sweat_smile:
というわけで、普通に使う向きには、特にパフォーマンスの問題はないと思われます。
Gradle のことはじめ

# はじめに

# gradle のインストール

まずは、 chocolatey をインストールする。
以下のインストールのページにある PowerShell を実行する。
https://chocolatey.org/install


管理者モードで PowerShell ターミナルで以下のコマンドを実行。

```powershell
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
```

chocolatey のインストールが終われば、そのまま PowerShell のターミナルで以下のコマンドを実行

```powershell
choco install gradle -y
```

# gradle プロジェクトの作成

プロジェクト用のディレクトリ作成

```batch
>mkdir sample-gradle-project
```

ディレクトリで gralde プロジェクトを作成

```batch
>cd sample-gradle-project

D:\github\program\sample-gradle-project>gradle init

Select type of project to generate:
  1: basic
  2: application
  3: library
  4: Gradle plugin
Enter selection (default: basic) [1..4] 2

Select implementation language:
  1: C++
  2: Groovy
  3: Java
  4: Kotlin
  5: Scala
  6: Swift
Enter selection (default: Java) [1..6] 3

Split functionality across multiple subprojects?:
  1: no - only one application project
  2: yes - application and library projects
Enter selection (default: no - only one application project) [1..2] 2

Select build script DSL:
  1: Groovy
  2: Kotlin
Enter selection (default: Groovy) [1..2] 1

Project name (default: sample-gradle-project):
Source package (default: sample.gradle.project):

> Task :init
Get more help with your project: https://docs.gradle.org/7.0/samples/sample_building_java_applications_multi_project.html

BUILD SUCCESSFUL in 3m 14s
2 actionable tasks: 2 executed

D:\github\program\sample-gradle-project>
```

# Gradle でビルド
以下のコマンドでビルドする。ビルドすると、「app\build\distributions」に zip, tar ファイルができる。

```batch
D:\github\program\sample-gradle-project>gradle build

BUILD SUCCESSFUL in 26s
13 actionable tasks: 13 executed
```

# 実行
Windows で「app\build\distributions」にある zip ファイルを展開するとバッチファイルを実行する

```batch
> cd D:\github\program\sample-gradle-project\app\build\distributions
> unip app.zip
> cd D:\github\program\sample-gradle-project\app\build\distributions\app\bin
> app.bat
```
【超簡単】Python初心者が、初めて自分の頭で考えて動いたじゃんけんゲーム

#目的
▶︎プログラミング初心者でも、少ないコード量で自分で動かした実感の持てるゲームを作る。

一通り覚えた知識の中から、じゃんけんゲームを一から作ってみようと思いエラーを出しまくりながらも初めて理想通りに動いたコードです。
キレイなコードとは言えないと思いますが、動くとモチベーションが上がります。

```python
#『じゃんけーん』のあとに間を作るために必要な、sleepをtimeからimport
#リストの中をランダムに表示させる、randomをimport

from time import sleep
import random

#リストを作る
cp = ['グー','チョキ','パー']

#randomのメソッドshuffleでリストcpをシャッフル
random.shuffle(cp)

#わかりやすく最初はグーと言ってもらう
print('最初はグー！')

#inputをsayに入れる
say = input()

#もしsayがじゃんけん(janken)だったら、(じゃんけんとこちらが言ったら)sleepで2秒間あけて
#ポイ！！をプリントすると同時に、cpリストの0番目を表示する。
if say == 'janken':
   sleep(2)
   print('ポイ！！')
   print(cp[0])
```

コメントをなくすとこんな感じです。

```python
from time import sleep
import random

cp = ['グー','チョキ','パー']
random.shuffle(cp)

print('最初はグー！')
say = input()

if say == 'janken':
   sleep(2)
   print('ポイ！！')
   print(cp[0])
```

##結果
これで実行すると最初はグー！のあとインプット待ちとなるため、janken(言葉はじゃんけんと変えてもいい)
と入力した後に、２秒間あけてポイ！！と同時にランダムにリストが表示されました。

##最後に
今回こちらのコードで動きましたが、初心者が考えたものなのでもしかしたらもっとわかりやすい書き方もあるかもしれません。もしフォローしていただける方がいましたら、ぜひお声がけください。
ただ自分の頭でちゃんと考えて動もができた時の感動は最高ですね！
HttpとHttpsの違い

Https
SSLによって暗号化されたサイト（ポート番号443番）

Http
SLLによって暗号化されていないサイト（ポート番号80番）

SSLとは
インターネット上におけるWebブラウザとWebウェブサーバ間でのデータの通信を暗号化し、送受信させる仕組みのことです。
インターネット上で頻繁に送受信される氏名・住所・メールアドレスなどの個人情報や、ショッピングの決済に必要なクレジットカード情報、ログインに必要なID・パスワードといった情報は、常に悪意ある第三者から狙われております。
SSLは、これらの重要な情報を、悪意ある第三者による盗聴を防いだり、送信される重要な情報の改ざんを防ぐ役割を持っています。
（https://jp.globalsign.com/ssl-pki-info/ssl_beginner/aboutssl.html#aboutssl より）

ポート番号とは
TCP/IP通信において、コンピュータが通信に使用するプログラムを識別するための番号です。ポート番号は16ビットの整数であり、0番～65535番まであります。
TCP/IP通信においては、IPアドレスがあればネットワーク上のコンピュータを一意に識別することができますが、該当コンピュータのどのプログラムに通信パケットを届けるかは、IPアドレスだけでは決定できません。どのプログラムに通信パケットを渡すのかを決定するために、ポート番号を使用します。
（https://www.nic.ad.jp/ja/basics/terms/port-number.html より）


おまけ学習
リンクの後に＃id名をつけるとページ内のidに飛べる。
Anaconda仮想環境でconda installを使ってMeCabを使えるようにする

### まえがき
以前も触れた書籍「[すぐに使える!業務で実践できる! PythonによるAI・機械学習・深層学習アプリのつくり方 TensorFlow2対応](https://www.amazon.co.jp/%E3%81%99%E3%81%90%E3%81%AB%E4%BD%BF%E3%81%88%E3%82%8B-%E6%A5%AD%E5%8B%99%E3%81%A7%E5%AE%9F%E8%B7%B5%E3%81%A7%E3%81%8D%E3%82%8B-Python%E3%81%AB%E3%82%88%E3%82%8BAI%E3%83%BB%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%83%BB%E6%B7%B1%E5%B1%A4%E5%AD%A6%E7%BF%92%E3%82%A2%E3%83%97%E3%83%AA%E3%81%AE%E3%81%A4%E3%81%8F%E3%82%8A%E6%96%B9-TensorFlow2%E5%AF%BE%E5%BF%9C-%E3%82%AF%E3%82%B8%E3%83%A9%E9%A3%9B%E8%A1%8C%E6%9C%BA/dp/4802612796)」でMeCabが登場したので、早速インストールしようとしてみました。しかし、有名かつ古参のソフトウェアということで、ネット上の情報の時間軸が散らばっていて、結構導入に手こずりました。


同じようにAnaconda仮想環境でconda installを使いMeCabを導入したい方の参考になれば、ということで残しておきます。

### 実行環境
- Anaconda3(64bit)
- Python3.8

### 導入方法
まずは[こちらのサイト](https://www.fenet.jp/dotnet/column/%E8%A8%80%E8%AA%9E%E3%83%BB%E7%92%B0%E5%A2%83/7805/)を参考にしつつMeCabのインストールと、Path通しを行ってください。サイト中にもありますが、デフォルトのshift_jisではなくutf-8でインストールしないと後でエラーを吐くのでご注意ください。

次にconda installを行いますが、自分がデフォルトとconda-forgeのチャンネルで探す限り、"mecab-python-windows"も"mecab-python3"も"mecab"も見つけることができませんでした。

そこでAnacondaの公式サイトで検索をかけたところ、[このパッケージ](https://anaconda.org/MZH/mecab-python3)がでてきました。こちらに記載してあるコマンドの

```conda install -c mzh mecab-python3```

でインストールしたところ、以下のコードが実行できました。

```python:
import MeCab

# MeCabオブジェクトの生成
tagger = MeCab.Tagger()
# 形態素解析
result = tagger.parse("紹介されているパッケージや環境がばらついていて、非常に苦労しました。")
print(result)
```

```:出力
紹介	名詞,サ変接続,*,*,*,*,紹介,ショウカイ,ショーカイ
さ	動詞,自立,*,*,サ変・スル,未然レル接続,する,サ,サ
れ	動詞,接尾,*,*,一段,連用形,れる,レ,レ
て	助詞,接続助詞,*,*,*,*,て,テ,テ
いる	動詞,非自立,*,*,一段,基本形,いる,イル,イル
パッケージ	名詞,一般,*,*,*,*,パッケージ,パッケージ,パッケージ
や	助詞,並立助詞,*,*,*,*,や,ヤ,ヤ
環境	名詞,一般,*,*,*,*,環境,カンキョウ,カンキョー
が	助詞,格助詞,一般,*,*,*,が,ガ,ガ
ばらつい	動詞,自立,*,*,五段・カ行イ音便,連用タ接続,ばらつく,バラツイ,バラツイ
て	助詞,接続助詞,*,*,*,*,て,テ,テ
い	動詞,非自立,*,*,一段,連用形,いる,イ,イ
て	助詞,接続助詞,*,*,*,*,て,テ,テ
、	記号,読点,*,*,*,*,、,、,、
非常	名詞,形容動詞語幹,*,*,*,*,非常,ヒジョウ,ヒジョー
に	助詞,副詞化,*,*,*,*,に,ニ,ニ
苦労	名詞,サ変接続,*,*,*,*,苦労,クロウ,クロー
し	動詞,自立,*,*,サ変・スル,連用形,する,シ,シ
まし	助動詞,*,*,*,特殊・マス,連用形,ます,マシ,マシ
た	助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。	記号,句点,*,*,*,*,。,。,。
```

相変わらずものすごい精度で驚くばかりです。

### あとがき
書籍の方には「MeCabはWindowsだとセットアップが大変なので、VirtualBox上で仮想環境を作って導入してね」とありましたが、確かにそこそこ大変でした。

集合知に感謝。

### 参考サイト様(アルファベット順)
 - [Anaconda.org: MZH / packages / mecab-python3 1.0.3](https://anaconda.org/MZH/mecab-python3))
 - [.NET Columns: MeCabをPython3で使ってみよう｜形態素解析について分かりやすく解説](https://www.fenet.jp/dotnet/column/%E8%A8%80%E8%AA%9E%E3%83%BB%E7%92%B0%E5%A2%83/7805/)
 - [MeCab: Yet Another Part-of-Speech and Morphological Analyzer](https://taku910.github.io/mecab/)
 - [teratail: mecab-python-windowsのインストールが上手くできない](https://teratail.com/questions/282254)
pictureBoxに画像を埋め込む

1.新規プロジェクトを立ち上げ、Form1.csにpictureBoxを配置して下さい![スクリーンショット (83).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587997/d38232d3-fd0d-0d2b-1c47-5b6a58cf8f52.png)

pictureBoxのサイズと配置場所はとりあえずどこでもいいです。

2.埋め込みたい画像をプロジェクト内に入れる作業を行います。

2-1.ソリューションエクスプローラー→プロジェクト名を右クリック→追加→新しいフォルダーを選択→「Recources」というフォルダー名にしてエンターを押す
![スクリーンショット (85).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587997/827b7edb-935f-d1aa-bccb-17315631cb2e.png)

2-2.ソリューション内のPropertiesをクリックし下記の画面を表示させてください
![スクリーンショット (87).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587997/497a07fe-6d61-baa4-7586-d60e0fafb2a1.png)

2-3. 上記の画面に切り替わったら左のメニュー（画像ではアプリケーションとなっている部分）のリソース*をクリックします。
![スクリーンショット (91).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587997/ba2ada07-3c7b-03c1-4a6b-0203ff80ea06.png)



2-4. 水色のメニュー「文字列」横にある▼をクリックしイメージを選択してください。
![スクリーンショット (91_2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587997/9da19188-2dc9-3caf-97e7-53beaa8335cb.png)
![スクリーンショット (93).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587997/70178fc9-0031-d704-1540-3a62ab93c273.png)


2-5.文字列一覧からイメージ一覧が表示される画面へ切り替わります。
（画像を挿入していないので一覧には何も表示されません）
![スクリーンショット (89).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587997/d1b14446-c6d8-faf6-7b3b-ce64f130c480.png)

2-6.枠内に取り込みたい画像をドラッグ＆ドロップで挿入します。



2-7.今回は「？ブロック」の画像を挿入したので一覧画面に表示されていることが分かります（作成したResourcesフォルダー内に元画像データが保存されているのが分かります）
![スクリーンショット (96).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587997/c8be4c2d-128f-24b3-ac5a-39df300da726.png)

3.次にClass内に以下のコードを記述します。

```c#:Form1.cs
namespace maptiptest {
	public partial class Form1 : Form {
		// 変数定義
		public Image img;
		private void Form1_Paint(object sencdr, PaintEventArgs e) {
			Graphics g = e.Graphics;
			// Properties内のResourcesからtestという画像を探す
			img = Properties.Resources.test;
			// 変数名, 設置する座標X, 設置する座標Y, 画像の幅Width, 画像の高さHeight);
			g.DrawImage(img, 10, 10, 48, 48);
		}
	}
}
```

4.記事の初めに設置したPictureBoxのプロパティ→イベントをもう一度開き、Paint項目に関数名（Form1_Pain）を記述してください。
![スクリーンショット (97).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587997/81426bac-d77f-4fee-3b39-f0d22902092b.png)


5.以上のことをやり終え開始ボタンをクリックすると画像が表示されます。
![スクリーンショット (99).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587997/0af3c820-5348-15b9-d50c-93a63cf848d8.png)
Vue.jsの動的引数が機能しない

Vue.js 2.6.0以降で利用できる動的引数について。
公式ドキュメントのチュートリアルを進めていたらエラーが出ました。
https://vuejs.org/v2/guide/syntax.html#Dynamic-Arguments

>vue.js:634 [Vue warn]: Property or method "attributename" >is not defined on the instance but referenced during >render. Make sure that this property is reactive, either >in the data option, or for class-based components, by >initializing the property

>vue.js:634 [Vue warn]: Invalid value for dynamic >directive argument (expected string or null): undefined

ソース

```
<div id="app">
  <a v-bind:[attributeName]="url">hoge</a>
</div>
<script>
  var vm = new Vue({
    el: '#app',
    data: {
      url: 'http://hoge.com',
      attributeName: 'href'
    },
  })
</script>
```

原因は`v-bind`に渡している変数名`attributeName`。
DOM内テンプレート(直接HTML書いたテンプレート)では、ブラウザが属性名を
小文字として認識するので、`attributename`がない！ってなってるみたいです。

なのでDOM内テンプレートを使う場合、変数名を全部小文字`attributename`にすればOKです。
webpackを利用している場合は事前にコンパイルされるので問題ないようです。(※試してません)

```
<div id="app">
  <a v-bind:[attributename]="url">hoge</a>
</div>
<script>
  var vm = new Vue({
    el: '#app',
    data: {
      url: 'http://hoge.com',
      attributename: 'href'
    },
  })
</script>
```

ドキュメントをしっかり読むと、ちゃんと記載されてます。
https://vuejs.org/v2/guide/syntax.html#Dynamic-Arguments
>in-DOM テンプレート (すなわち、HTML ファイルに直接書かれるテンプレート) を使う場合、ブラウザが強制的に属>性名を小文字にするため、キー名を大文字にするのは避けるべきです:

つまり、DOM内テンプレート使うときはちゃんとブラウザの属性名として有効な文字にしなさいよ。ってことですかね。
Arcserve ログ抑制はできない

#UEFIにて利用の場合はログが出力されるが抑制は不可とのこと。

[Arcserve Unified Data Protection 7.0 (Windows)
　・項番40](https://support.arcserve.com/s/article/2019042201?language=ja&t=1621924676927)




UEFIパーティションが内部でFAT32として構成されているのですが、ブロックレベルバックアップをしたあと、ファイルの情報を構成する際にサポートしないFAT32パーティションを認識してしまうため発生するメッセージとなります。
こちらは実際にFAT32ボリュームがあった場合に警告がないと取りこぼしが発生する可能性があることから発生してしまうメッセージとなります。

大変申し訳ありませんが、現行ではログ出力の抑制はできかねてしまいますのでご案内通り無視いただく運用にて回避をいただけますと幸いです。
以上、ご不便おかけし申し訳ございませんが、どうぞよろしくお願いいたします。
【Next.js】 コンポーネントを絶対パスとエイリアスで指定する方法

## はじめに

こんにちわ、dtakkiyです!

Next.jsでプロジェクトが大きくなってきた場合に、コンポーネントを相対パスでリンクさせているとファイルの移動などでミスが出やすくなるかもしれません。またネストが深いとコードの可読性にも問題があります。

そこで今回は、設定ファイルで/srcフォルダを基準に絶対パスで指定する方法を紹介します。
またエイリアスを使った指定方法も紹介します。

<b>Before</b>

```javascript
import React from 'react'
import Button from '../../../components/home/Button' // 相対パスで指定
import Title from '../../../components/home/Title'   // 相対パスで指定

const About = () => {
  return (
    <div>
      <Title />
      <Button />
    </div>
  )
}

export default About
```

<b>After</b>

```javascript
import React from 'react'
import Button from '/src/components/home/Button' // 絶対パスで指定
import Title from '@/components/home/Title'      // エイリアスで指定

const About = () => {
  return (
    <div>
      <Title />
      <Button />
    </div>
  )
}

export default About
```

ネストも浅くなり、だいぶスッキリしました！

## 動作検証の環境

- Next.js: 10.2
- Javascript

## 設定方法



まず基準となる親フォルダ`/src`を作成します。

```sh
$ mkdir src  
```

次に`jsconfig.json`を作成します。

```sh
$ touch jsconfig.json
```

作成したJSONファイルに以下のキーを設定します。
今回は`/src`を基準のフォルダに指定しました。

```json:jsonconfig.json
{
  "compilerOptions": {
    "baseUrl": "/src",
    "paths": {
      "@/components/*": ["src/components/*"] 
    }
  }
}
```

## 参考サイト
[Absolute Imports and Module path aliases](https://nextjs.org/docs/advanced-features/module-path-aliases)
Bubble.ioでChart Elementを利用する

Bubble.ioでChart Elementを利用したときの個人メモ

---

# Chart Elementの準備
- 「Chart Element」を検索し、「Instal」を押下  
  ![002.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242897/025be801-36a3-c4d0-36b1-304e7189ff12.jpeg)

# API Connectorの準備
- チャートに表示するデータをAPIを利用して取得する  

## インストール
- API Connectorのインストールは[Bubble.ioでAPI Connectorを利用する](https://qiita.com/nkmk1215/items/7b2a5aba763a973fa4bb)と同様

## 設定
- 今回はマーケットデータを取得できる[QUICK Xignite APIs](https://www.quick.co.jp/qxapis/)を利用する  
  以下を設定し、「Reinitialize call」を押下
    - API Name:MarketInfo
    - Authentication:None or self-handled
    - Name:getInfo
    - Use as:Data  
      　※ワークフロー内でAPIを実行せず、画面描画時に実行するため、Dataを選択
    - Data type:JSON
    - HTTP method:GET
    - URL:https://api.marketdata-cloud.quick-co.jp/DummyFinancialStatements.json/GetIncomeStatementHistory
    - Keys & Values
        - IdentifierType:Symbol
        - Identifiers:1048
        - AccountingStandards:ConsolidatedIFRS,ConsolidatedUS,ConsolidatedJP,NonConsolidated
        - _Language:Japanese
        - _Token:abc

  ![000.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242897/2796a52e-8b00-a4eb-6d55-88d819d427d6.jpeg)

# 画面実装
- 完成イメージ  
  ![005.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242897/bbbbe0f6-abaa-db48-d285-a37a994f170b.jpeg)

## Group
- APIを紐づけるGroupを作成   
  ![003.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242897/8815867d-6264-9c84-a7f2-31b5de63f007.jpeg)

## Line/Bar Chart
- チャートを描画するLine/Bar ChartをGroup上に作成   
  ![004.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242897/3fbeae18-91db-db6e-8486-6615a52206b3.jpeg)

### Chart type
- チャートの表示形式を指定（今回はBarを選択）

### Type of data
- 表示したいデータを含む直近のリスト「getInfo ArrayOfSalesAndIncome」を指定

### Data source
- X軸を指定（今回は日付）

### Value expression
- Y軸を指定（今回は売上）

### Label expression
- X軸の表示形式、ソートを指定

# 動作確認
- 画面描画時にAPIを実行し、チャートを表示する  
  ![005.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242897/53f2068f-5d60-5166-ba1c-595325a5377d.jpeg)
  
# 感想
- API Connectorは使い方が2つあり、使い勝手よさそう
    - 要素から呼び出す（Data）
    - ワークフローから呼び出す（Action）
- データを視覚化するだけなら、かなり早い
- 表示形式をどこまで細かくいじれるかは確認が必要
オフラインどう書く第30回の解答

問題はこちら->http://nabetani.sakura.ne.jp/hena/ord30taxi/

今回は「事実」をリストを使わずに書いてみました。
fi(市,初乗りの距離,初乗りの料金)、ad(市,加算料金)、pl(乗車地点,市)、
pa(乗車地点-降車地点,道のある市,距離)となっています。
solve/2で初乗り料(料金の初期値)と初乗りの距離をmove/5に渡して実行しています。
move/5で経路（pa/3）をめぐり、追加料金が生じる距離ならaddi/6に任せています。
addiでは、中継地までの距離(D)から加算までの残りの距離(Rd)を引いて料金を加え、
加算までの距離をリセットすることを繰り返します。
加算までの残りの距離が中継地間の残りの距離より長くなったら
加算までの残りの距離から中継地間の残りの距離を引いてmoveに戻り、新しい経路を走ります。
中継地で料金が変わることのない問題になっていますので処理が楽です。

```prolog
%swi-Prolog version 7.4.2,7.6.4
%:-initialization(start).  %ideone
%start.

fi(e,995,400).
fi(t,845,350).

ad(e,60).
ad(t,50).

pl(a,e).
pl(b,e).
pl(c,e).
pl(_,t).

pa(a-b,e,1090).
pa(a-c,e,180).
pa(a-d,t,540).
pa(b-c,e,960).
pa(b-g,e,1270).
pa(c-d,t,400).
pa(c-f,e,200).
pa(d-e,t,720).
pa(d-f,t,510).
pa(e-g,t,1050).
pa(f-g,t,230).
pa(X-Y,Pl,D):-pa(Y-X,Pl,D).

move(_,_,[],R,R):-!.
move(Rd,F,[H|T],Su,R):-
     pa(F-H,Pl,D),(D>Rd->(ad(Pl,P),addi(Rd,D,P,Su,Rd1,Su2));
    (Rd1 is Rd-D,Su2 is Su)),move(Rd1,H,T,Su2,R).

addi(Rd,D,_,Su,Rd1,Su):-D=<Rd,!,Rd1 is Rd-D.
addi(Rd,D,P,Su,Rd1,R):-D1 is D-Rd,Su1 is Su+P,addi(200,D1,P,Su1,Rd1,R).

solve([H|T],R):-pl(H,L),fi(L,Fd,Pr),move(Fd,H,T,Pr,R).

start:-str(S),split_string(S,"\n\s","\s",L),go(L),!.

go([]).
go([_,B,Q|T]):-string_lower(B,B1),atom_chars(B1,SL),solve(SL,R),disp(R,Q),go(T).

disp(R,Q):-number_string(R,S),(Q==S->Str=" pass ";Str=" fail  "),write(Str),writeln(S).

%start.
%:-initialization(start).   %for ideone

str("0       ADFC    510
1       CFDA    500
2       AB      460
3       BA      460
4       CD      400
5       DC      350
6       BG      520
7       GB      530
8       FDA     450
9       ADF     450
10      FDACB   750
11      BCADF   710
12      EDACB   800
13      BCADE   810
14      EGFCADE         920
15      EDACFGE         910
16      ABCDA   960
17      ADCBA   1000
18      BADCFGB         1180
19      BGFCDAB         1180
20      CDFC    460
21      CFDC    450
22      ABGEDA  1420
23      ADEGBA  1470
24      CFGB    640
25      BGFC    630
26      ABGEDFC         1480
27      CFDEGBA         1520
28      CDFGEDABG       1770
29      GBADEGFDC       1680").
```
Ruby で解く AtCoder AHC 003 念のためフラッシュする

# はじめに
*[AtCoder Problems](https://kenkoooo.com/atcoder/#/)* の Recommendation を利用して、過去の問題を解いています。
AtCoder さん、AtCoder Problems さん、ありがとうございます。

# 今回のお題
*[AtCoder Heuristic Contest 003](https://atcoder.jp/contests/ahc003)*
<font color="gray">Difficulty: ???</font>

今回のテーマ、ヒューリスティックコンテスト

第3回目のヒューリスティックコンテストです。
ヒューリスティックコンテストは少しずつ改善していく感じが楽しいコンテストです。

しかし、今回は`TLE`が取れなくて楽しめなかったです。
# TLE
```ahc.rb
1000.times do
  s = gets.split.map(&:to_i)
  t = ''
  if s[2] - s[0] > 0
    t << 'D' * (s[2] - s[0])
  else
    t << 'U' * (s[0] - s[2])
  end
  if s[3] - s[1] > 0
    t << 'R' * (s[3] - s[1])
  else
    t << 'L' * (s[1] - s[3])
  end
  puts t
  gets
end
```
# AC
```ruby.rb
$stdout.sync = true
1000.times do
  s = gets.split.map(&:to_i)
  t = ''
  if s[2] - s[0] > 0
    t << 'D' * (s[2] - s[0])
  else
    t << 'U' * (s[0] - s[2])
  end
  if s[3] - s[1] > 0
    t << 'R' * (s[3] - s[1])
  else
    t << 'L' * (s[1] - s[3])
  end
  puts t
  gets
end
```
```stdout.rb
$stdout.sync = true
```
`Slack`の`ruby-jp`で教えてもらったのですが、フラッシュしないといけない様です。
[Ruby 3.0.0 リファレンスマニュアル](https://docs.ruby-lang.org/ja/latest/method/Kernel/v/=3e.html)

問題にも書いてありました。
![20210605a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538241/ab508c3a-d08c-7ba9-9cf1-9bce66d5cb88.png)
*[Ruby技術者認定試験合格教本 Silver/Gold対応　Ruby公式資格教科書](https://www.amazon.co.jp/gp/product/4774175676/)* のP259-262に`IOクラス`の説明として載っています。
Ruby技術者認定試験としてSilverの出題範囲となっています。
# まとめ
+ AHC 003 A を解いた
+ ruby-jp の皆さんありがとう
+ ヒューリスティックコンテストを楽しもう
サーバーにログインするって？どんなこと？

さあ！皆さん！
ちょっと面白そうなトピックですね！

よく映画やハッキングの事件で「サーバーに侵入」と言う言葉を聞きますが
それって具体的にどう言うことでしょうか？


結論！ログインすると言うことです。ここではVPC上に自分で立てたEC2に実際に自分のPCからログインをして見ましょう。

まずはEC2(サーバーの立て方)を読んでサーバーを立ててください。
https://qiita.com/Hibiki24/items/a1df2c5e6b23dbdb9b9e

それができたら、いよいよログインです。
皆さん、サーバーを立てる時に以下のような形で鍵をダウンロードしませんでしたか？
![スクリーンショット 2021-05-30 16.25.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227633/fb40c053-5173-0e87-1de7-346f3d5a2f09.png)

ここでダウンロードした鍵は後で使うのでデスクトップに移動させて置いてくださいね！

さて、あとはもう簡単です。
まずは、立てたサーバーがちゃんと通信できるかpingで確かめましょう。

![スクリーンショット 2021-06-05 10.11.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227633/b9fb7151-1316-573f-f59a-94b1c68d1a84.png)

立てたサーバーのパブリックIPアドレスをメモっておいて、ターミナルを起動しましょう。
準備ができたた　ping (IPアドレス)のコマンドを走らせます。

![スクリーンショット 2021-06-05 10.54.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227633/c4266e13-c103-45e4-9194-8e36421801d9.png)

あれ。。。。できない。

皆さん。こう言うこともあります。こう言う時は諦めず色々設定や方法を変えて見ましょう。
ここは記事なので複数試したトラブルシューティングは端折りますが、私の場合はルートテーブルがきちんとインターネットゲートウェイを向いていない事が今回問題でした。

https://aws.amazon.com/jp/premiumsupport/knowledge-center/instance-vpc-troubleshoot/

EC2に接続トラブルがある際のトラブルシューティングのURLを上に貼って置きますね。
このように必ず何かしらの方法でトラブルは解決できる場合がほとんどです。大事なのは根気！！！
![スクリーンショット 2021-06-05 10.33.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227633/d48077c9-fd97-ad20-ad79-2a6e6f86125a.png)

![スクリーンショット 2021-06-05 10.26.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227633/d18ed439-e654-f1ae-eeba-56921db6db4e.png)

このようにAWSには丁寧な説明ページがたくさんあります。

皆さん、これは何においても言えることですが「めんどくさい」、「もう嫌だ」などと思った時は下記を思い出しましょう。
「今、自分以外にもたくさんのライバルが見えないところで挫折している。今ここで手を止めなければ、能力ではなく"諦めないと言う選択”によって、その選択それだけで、上位何割かに躍り出ることができる」と。

すみません。本題に戻ります。

無事pingが打てたのでいよいよSSH接続によってEC2にログインしたいと思います。

ssh接続の文法は 「ssh -i (接続に用いる鍵名) (接続先)」です。この時接続に用いる鍵は自分が今いるディレクトリになくてはいけません。「/」を使って他のディレクトリを参照することもできます。

では、やって見ましょう。

![スクリーンショット 2021-06-05 10.30.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227633/f84f125d-4652-f586-32c3-fcc94470a640.png)

あれ、まあ。使おうとしてる鍵がtoo open セキュリティがゆるゆるとのことですね。
chmod でこの鍵のセキュリティを高めましょう。

![スクリーンショット 2021-06-05 10.33.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227633/818f6f15-7f48-c668-a8e1-b4d9eedecddf.png)


これで問題ないはずです。

![スクリーンショット 2021-06-05 10.33.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227633/1b583834-777c-4ab7-4596-1ec15cfcc92d.png)

無事ログインができました。
皆さん。ここでログインした後のIPアドレスに172.16.1.54と言うパブリックIPアドレスではなく、VPC内でのご自身が設定されたIPアドレスになっていることをご確認ください。

今回はここまでです。
サーバーに侵入って、単純にログインの事でしかないんですね。まあ、持ってるはずのない鍵を手に入れるところがハッカーのすごいところなんですが。。。
「git fetchコマンドがローカルに反映されない」という誤解

#はじめに
GitHub上にあるリモートリポジトリから、ブランチを取得してみたのだがGitの理解が浅かったようで`git fetch`コマンドがうまく使えなかった。



#GitHub上にあるブランチを取得したい
基本的な取得方法は下記のコマンドを実行するだけ。

```
#下記のコマンドでリモートの全ブランチをローカルに取得させる
git fetch
```
ただここで、`git branch`で確認してみると`master`のみで、その他のブランチが表示されなかった。

この時点で「あれ？　ブランチ取得できていない？」と思ってしまった。

調べてみると、どうやら取得するのはリモートリポジトリの情報をローカルに持ってくるだけで、実際にはワークツリーに反映されない仕様みたい。

```
#全てのブランチを確認
git branch -a

#ブランチを指定して切り替えてみる
git checkout topic_branch

=> * topic_branch
     master
```
切り替えることができた。
これで`git fetch`コマンドが、なんとなく理解できた。

参考元
[リモートブランチをローカルで取得する[git fetch][Sourcetree]](https://noumenon-th.net/programming/2018/12/24/git-fetch/)
CSSの命名規則

# はじめに
副業先でCSSの見直しを行うことになりました。
主に自分の確認用ですが、チーム開発の時の基準になるかもと思い、CSSの命名規則について整理しました。

副業先が`BEM`を使用しているので、命名規則も`BEM`を意識したものになっています。
また、入れ替わりの激しい職場ということもあり、共通認識を持ち難い環境のため、ルールをシンプルにすることを優先しております。（結果、class名が冗長になる場合があります）

# 命名規則
- シングルクラスで記述する
- 複数の単語の組み合わせは`ケバブケース`
- 単語は省略しない
- 予測しやすい名称（見た目や場所ではなく意味で）
- 最初からコンポーネントを意識しない

## シングルクラスで記述する
1つの要素に対して、1つのclassを指定する（多くても2つまで）。

``` html
<!-- OK -->
<div class="hoge1">〜</div>

<!-- NG -->
<div class="hoge1 hoge2 hoge3">〜</div>

```

## 複数の単語を組み合わせる時は`ケバブケース`
単語を組み合わせるときは`-（ハイフン）`使う。

```html
<!-- OK -->
<div class="hoge-title">〜</div>

<!-- NG -->
<div class="hoge_title">〜</div>
<div class="hogeTitle">〜</div>
<div class="HogeTitle">〜</div>
```

## 単語は省略しない
class名に使用する英単語は、長くても省略せずに記載する。
（省略する内容に個人差が生まれやすいため）

```html
<!-- OK -->
<div class="title">〜</div>

<!-- NG -->
<div class="ttl">〜</div>
```
## 予測しやすい名称（見た目や場所ではなく意味で）
HTMLの構造や色が変わったときに破綻しないように、できる限り意味でつけるようにします。
意味でつけるようにすることで、なんのstyleかも予測しやすくなると思います。


```html
<!-- OK -->
<div class="text-attention">〜</div>

<!-- NG -->
<div class="text-red">〜</div>
```

具体的な命名については、[A/HC/LC pattern]( https://github.com/kettanaito/naming-cheatsheet#ahclc-pattern ) を参考にしています。
`Action (A)`に相当するものがない場合は、UIや要素の名前を代用しています。


以上です。
最後までお読みいただき、ありがとうございました。

私もまだまだ勉強中で「これだ！」と確信できる部分は少ないものの、ある程度ルールを決めておくことで、見通しの良いデータに近づくのではないかなと思っています。


---
# お世話になったサイト
- [BEM命名をルール化 & HTML5要素を正しく使う](https://qiita.com/s79ns/items/47e6bcfec727791d91e7)
- [CSSの命名規則BEMについて]( https://qiita.com/s79ns/items/83a28387001fc6b318ef )
[React Native] スタイル周りのTips

# 前書き
ReactNativeで開発を行った際に、得たTipsをまとめています。

# 目次
[1.複数のstyleをあてたい](#1-複数のstyleをあてたい)
[2.要素を上下中央揃えにしたい](#2-要素を上下中央揃えにしたい)
[3.Androidでshadowが当たらないことがある :thinking:](#3-androidでshadowが当たらないことがある-thinking)
[4.Android（機種依存かも）でダークモードにするとアプリのstyleが変更されてしまう](#4-android機種依存かもでダークモードにするとアプリのstyleが変更されてしまう)
[5.`height`、`maxHeight`を両方充てたのに、最大値がうまく機能しない](#5-heightmaxheightを両方充てたのに最大値がうまく機能しない)
[6.Androidで文字が見切れてしまう](#6-androidで文字が見切れてしまう)
[7.デバイスのサイズを取得する](#7-デバイスのサイズを取得する)
[8.`ScrollView`のスクロールバーを非表示にする](#8-scrollviewのスクロールバーを非表示にする)


#1. 複数のstyleをあてたい

用途：その要素だけ、共通のスタイルに加えて個別のスタイルをあてたい

```jsx
// 方法１：オブジェクト
<View style={Object.assign({}, style1, style2)}>
/* 略 */
</View>

// 方法2：配列
<View style={[style1, style2]}>
/* 略 */
</View>
```
公式では、方法２が記載されているので、方法２で記述するのが良いと思います

https://reactnative.dev/docs/style

#2. 要素を上下中央揃えにしたい

```jsx
width: '90%',
maxWidth: 500,
marginLeft: 'auto',
marginRight: 'auto',
marginTop: 'auto',
marginBottom: 'auto',
```

#3. Androidでshadowが当たらないことがある :thinking:
実際のケース：`TouchableWithoutFeedback`タグの子要素の`View`に対してshadowを付与したが当たらなかった

```jsx
// 解決策：TouchableWithoutFeedbackとshadowをあてるViewの間にViewを挟む
<TouchableWithoutFeedback>
  <View>
    <View style={{shadowColor: 'rgba(181,173,165,1)'}}>
      /* 略 */
    </View>
  </View>
</TouchableWithoutFeedback>
```
※ 実際は`shadowColor`以外も設定する必要があります

#4. Android（機種依存かも）でダークモードにするとアプリのstyleが変更されてしまう
実際のケース：xiaomiのスマホでダークモードに設定すると、アプリの色も変更されてしまった

```xml
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- Customize your theme here. -->
    <item name="android:forceDarkAllowed">false</item>"
</style>
```

#5. `height`、`maxHeight`を両方充てたのに、最大値がうまく機能しない

```jsx
<View style={{
    width: (screenWidth > 500 ? 500 : screenWidth) * 0.9,
    height: screenWidth > 500 ? 300 : 400,
}}>
```
※ `maxHeight`を使用せずに`height`の値を動的に切り替えるように実装を変えました

#6. Androidで文字が見切れてしまう

実際のケース：`fontSize`と`lineHeight`に同じ値を指定していた場合、iOSだと正常に見えるがAndroidだと文字が見切れる

```jsx
<Text style={{fontSize: 16, lineHeight: 20}}>Androidで文字が見切れる</Text>
```
Androidの場合はlineHeightを`[文字サイズ] * 1.1`かそれ以上に指定しましょう

#7. デバイスのサイズを取得する

```jsx
/**
* Function Componentを利用していて、画面の横向きも考慮する必要がある場合
**/
import { useWindowDimensions } from 'react-native'

const { width: SCREEN_WIDTH, height: SCREEN_HEIGHT } = useWindowDimensions()

/**
* デバイスの向きを変えたイベントでサイズを取得したくて、Class Component
**/
import { Dimensions, ScaledSize　} from 'react-native'

// スクリーン幅の保存する処理
const handleScreenWidth = (window: ScaledSize) => {
  this.setState({ screenWidth: window.width })
}
componentWillMount() {
  Dimensions.addEventListener('change', ({ window }) => handleScreenWidth(window))
}
componentWillUnMount() {
  Dimensions.removeEventListener('change', ({ window }) => handleScreenWidth(window))
}

/**
* デバイスの向きを変えなくてもいい場合
**/
import { Dimensions　} from 'react-native'
const { width: SCREEN_WIDTH, height: SCREEN_HEIGHT } = Dimensions.get('window')
```

#8. `ScrollView`のスクロールバーを非表示にする

```jsx
<ScrollView horizontal={false} showsVerticalScrollIndicator={false}>
/* 省略 */
</ScrollView>
```
ちなみに`horizontal={false}`を書いておくと横方向へのスクロールが禁止されます

---

逐次更新しますー:relaxed:
IndexedDB


#indexedDB

##データベースを使用しなくてもjavascriptで管理できる

__ か ** で囲むとHTMLのstrongタグになります。Qiitaでは**太字**になります。

https://b-risk.jp/blog/2020/07/indexeddb_and_dexie/

https://blog.katsubemakito.net/html5/indexeddb1
[Ruby] クラスとインスタンス

## はじめに
プログラミング言語の中で独特の考え方「クラス」と「インスタンス」。
初めてプログラミング言語を触れたとき理解に苦しんだ考え方の一つです。
自分なりに噛み砕いた理解をまとめてみました。

## クラス
はじめに、クラスとインスタンスはプログラミング言語の中の独特な考え方と言いましたが、よくよく考えたらそうでもないかと思います。（どっちやねん 笑）

よく言われるのは、クラスとは設計図だと言います。
その設計図をもとに作られた実体がインスタンスです。

なぜクラス（設計図）が必要かですが、それは共通する部分を再利用することができるからです。


## タイヤキでクラスを紐解く

たくさんのタイヤキを作ろうとしたとき、タイヤキ器を用いて作りますよね。タイヤキ器に材料を流し込んで、焼いてタイヤキが出来上がります。

このタイヤキ器こそがクラスです。出来上がったタイヤキ（実体）がインスタンスです。

先ほど、共通部分を再利用することができると言いました。
例えばタイヤキはタイヤキ器を使ってタイヤキを作っていきますが、新商品カスタードクリームタイヤキを作ることとなりました。

しかし、中のあんこをカスタードクリームに替えるだけなので、作り方はほとんど同じだったりします。
また、新商品イチゴミルクタイヤキが出ました。

これも、少しアレンジするだけでいいので元々のノーマルタイヤキから作り方を大きく変える必要はありません。


これが共通部分を再利用することができるという意味です。
*※この辺は次回の記事に詳しく書きます。*


## インスタンスの生成

クラスを用いてインスタンスを生成する方法ですが、クラスにはnewメソッドという特別なメソッドを使用することができます。
今回のタイヤキの例でタイヤキ器からタイヤキ（実体ある商品）を生み出してみます。
*※ここではクラスの中身は空です。*

```Ruby
class Taiyaki #クラスは大文字から始めます。

end

taiyaki = Taiyaki.new
```
最初にクラスを定義してあげます。（タイヤキ器の構造や型を作ってあげる）

そしてそのクラスにnewメソッドを使ってインスタンスを生成します（タイヤキ器を使って商品を作成）


##最後に
プログラミングでは同じ記述はコードが長くなってしまったり、読みづらくなりがちなので嫌われます。
できるだけ一度書いたら再利用することと、再利用する際にわかりやすい名前の付け方も結構重要だなと最近感じます。

私はわかりづらい概念は何かに置き換えることを意識しています。きっと近いものがどこかに存在するのではないでしょうか。
なんでもいいので自分なりにイメージを掴んでおくことは大切かと思います。
めんどくさい3D-CADはPythonで操作する

最近、3D-CADで物つくりをと考えていて、CADのことを色々調べたうえでの自分の結論

* FUSION360 今のところベスト、solidworksを職場で使っていて、モデル作成のイメージが近い
* BLENDER これはないな
* SKETCH-UP なんちゅうか、めんどい
* DraftSight ええっちゅう噂・・・
→　すべて触った上で、見解を書くけど・・・　すべてのCADソフト＝邪魔

### 結論
* Pythonでモデル作れるCADが有難い　→　Cadqueryというものがある。

https://asukiaaa.blogspot.com/2018/10/freecadcadquery.html

### その他
* Pythonで動画を作る

https://zulko.github.io/moviepy/index.html

さのうち、Pythonでシコれる日が来るだろう・・・
Pythonのパッケージ追加時にpathが設定されていない

環境
Ubunts 16.04
Python 3.9.5


何をしたかったのか？
Pythonパッケージのdjangoをインストールしたいと考えていた。

起こった現象
インストールはうまく行ったものの、WARNINGが出て、その後うまく動かなかった。


やったこと

Djangoのインストール作業
pip3 install django

を実行後に下記のメッセージが出たが対応方法がわからなかったため、立ち止まることになった…

WARNING: The script sqlformat is installed in '/home/key/.local/bin' which is not on PATH.
  Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.

対応方法

環境ファイル？(.bashrc)にパスを追加する。

どこにファイルがあるのかを検索して調べると気に下記のサイトが参考になった。


https://www.exceedsystem.net/2020/09/29/1321/


結果

ひとまず、パスは追加されたようでなんとか動きそうな感じになった。
Bubble.ioでAPI Connectorを利用する

Bubble.ioでAPI Connectorを利用したときの個人メモ

---

# API Connectorの準備
## インストール
1. Pluginsにて「Add Plugins」を押下![000.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242897/31b8cb76-be24-ffa7-682b-98818510f375.jpeg)
- 「API Connector」を検索し、「Instal」を押下![001.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242897/be4c0764-4954-eb32-b3a3-009c68b49f8e.jpeg)

## 設定
1. 今回は郵便番号から住所を検索できる[zipcloud](http://zipcloud.ibsnet.co.jp/)を利用する   
  以下を設定し、「Reinitialize call」を押下
    - API Name:Zipcode
    - Authentication:None or self-handled
    - Name:getAddress
    - Use as:Action
    - Data type:JSON
    - HTTP method:GET
    - URL:http://zipcloud.ibsnet.co.jp/api/search
    - Key:zipcode
    - Value:1110032
![002.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242897/1f84010c-dba9-ec56-da26-54f039c47746.jpeg)
- 設定したKey（今回はzipcode）、Value（今回は1110032）でリクエストされ、  
  レスポンスが解析される  
  内容が期待通りであれば、「SAVE」を押下![003.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242897/98722e3a-b785-09bc-8cc5-22120771ecf7.jpeg)

# 画面実装
- 完成イメージ   
  ![019.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242897/d0b9ce9c-90ce-f021-90af-2aa708095cbb.jpeg)

## Group
- APIを紐づけるGroupを作成   
  ![004.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242897/8c6e0287-124e-fa7c-c6f7-4f448f89c1fb.jpeg)

## Input
- 郵便を入力するInputをGroup上に作成   
  ![005.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242897/381df7c2-33f5-cde8-b224-da8009ae0da4.jpeg)

##Button
1. APIを実行するButtonをGroup上に作成し、ワークフローを作成  
  ![006.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242897/6a5fac90-01b6-0ff4-aede-e8614e7c031f.jpeg)
- 「Plugins」からAPI（今回はZipcode - getAddress）を選択  
  ![007.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242897/f132c2b4-89a9-2624-3322-f62c84ab3c19.jpeg)
- API呼び出し時のパラメータとしてInputの値を指定  
  ![008.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242897/b8e9da39-1051-9052-1d5f-ce638041130f.jpeg)
- レスポンスを保持する要素にGroupを指定  
  ![009.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242897/e92e75c9-09f8-df09-2655-de0e44178726.jpeg)   
  ![010.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242897/7448d5c1-b62a-f72f-4144-a24005402c81.jpeg)
- 最後にInputをリセットするアクションを追加（任意）  
  ![013.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242897/3ab7b0b3-ec87-3324-3eef-460e71d99367.jpeg)  
  ![014.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242897/08e63151-b644-729d-058a-2901e754bcf4.jpeg)

## Text
- レスポンスを表示するTextをGroup上に作成  
  　※「Make this element fixed-width」にチェックを入れる  
  ![017.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242897/0f66f918-2601-e65e-6b74-e944ba376782.jpeg)

# 動作確認
1. 郵便番号を入力し、検索ボタンを押下  
  ![018.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242897/b43ec7b8-e508-4340-bc4b-4451b11aa6d6.jpeg)
- 検索結果が出力される  
  ![019.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242897/e1dd9d53-0bb2-28a6-9451-7cd4fc82010e.jpeg)

# 感想
- APIのI/Fを自動的に定義してくれるため非常に楽
- 取得したレスポンスの保持についてもほぼ意識することなく出力できた
gem pg をダウンロードしてバグを直したい 





現場railsの３章でbin/rails db:createをしようとした時です。
嬉しいことに、エラーにぶつかりました。どうやらgem pgがインストールされていないようです。

```
An error occurred while installing pg (0.19.0), and
Bundler cannot continue.
Make sure that `gem install pg -v '0.19.0' --source
'https://rubygems.org/'` succeeds before bundling.

```
以下のコードを記入しても治らず

```
$ gem install pg
Building native extensions. This could take a while...
ERROR:  Error installing pg:
        ERROR: Failed to build gem native extension.

```
さらに

```
An error occurred while installing pg (1.2.3), and Bundler
cannot continue.
Make sure that `gem install pg -v '1.2.3' --source
'https://rubygems.org/'` succeeds before bundling.

In Gemfile:
  pg
```
解決につながった記事および方法
---
こちらの記事を参考にして、以下のコマンドを入力したら治りました！libpq-devがないとpostgreサーバーにアクセスができないみたいですね。
https://qiita.com/Dexctersu/items/b2171f90f5bb82cf0888

```
$sudo apt install libpq-dev
$gem install pg -v 1.2.2
Building native extensions. This could take a while...
Successfully installed pg-1.2.2
1 gem installed
```
sudoコマンドを使うことで、root権限を持つユーザーの処理を代わりに行うことができるみたいです。
（引用「【 sudo 】コマンド――スーパーユーザー（rootユーザー）の権限でコマンドを実行する」https://www.atmarkit.co.jp/ait/articles/1611/28/news036.html）

aptコマンドはパッケージ管理に使用するコマンドみたいですね。

（引用「aptコマンドチートシート」https://qiita.com/SUZUKI_Masaya/items/1fd9489e631c78e5b007）

こちらにも解決方法が載っていましたが、いまいちvimの使い方が分からないので、宿題として持ち帰りますね。
 https://qiita.com/miriwo/items/67681165b0a89218ee61

```
$ echo export PATH='/usr/local/bin:$PATH' >> ~/.bash_profile
$ source ~/.bash_profile
```

参考文献
---
解決につながった記事はこちら↓
https://qiita.com/Dexctersu/items/b2171f90f5bb82cf0888

「【 sudo 】コマンド――スーパーユーザー（rootユーザー）の権限でコマンドを実行する」https://www.atmarkit.co.jp/ait/articles/1611/28/news036.html
「aptコマンドチートシート」https://qiita.com/SUZUKI_Masaya/items/1fd9489e631c78e5b007
サーバレスを使う上での運用上の注意点

# １．Webの稼働環境はサーバレスが増えつつある

 Netlify、VercelなどJAMStackのサーバをGithubActionsでデプロイするだけという、お手軽にWebアプリを公開できるサーバレスの環境を利用することが増えつつある。

昔は、レンタルサーバやVPSで稼働環境を構築してそこにアプリをデプロイしていたが、環境構築部分はほぼなく、簡単な設定だけでサーバにコンソールやFTPソフトでログインすることなくアプリがデプロイできる。

こんな便利なものを使わないのDXしていないことにほかならない。

そんな便利なサーバレスサービスだけれど、気をつけておかないといけないこともある。

#２．サービス内容の変更を絶えずフォローする

サービスとして使っている以上、サービス内容が運営者側の理由で変わることは当然ある。
たとえば、以下の点については注意が必要だろう。

- 価格の改定
- 帯域などのスペックの変更
- その他機能の追加、廃止

#３．同様の退避先、移行先を予め調査、準備をしておく

サービス自体の変更によってコストが合わない、機能実現ができないということも起こりうる。
それに備えて、公開するアプリの予算、そして、どういったサーバレスの機能を必要としているかを整理して、
もし使えなくなったときの代替となるサービスをある程度探しておく必要もある。


#４．サービスを変更する際にDNSを機動的に変更できること

サービス変更によって移行せざるをえなくなったとき、DNSの変更が必要になる。
意外と、変更しないからDNSの設定情報がすぐわからなかったりする人もいるかもしれない。
ただ、サーバレスサービスを使う以上、いつでもDNSの変更をできるように日頃から準備をしておくべきだろう。


#５．できるだけ大手サービスを使う

できればサービスの変更はしない方がいい。
そう考えると比較的大手の方がサービスは続きやすいだろうし、価格ももしかしたら安くなるかもしれない。
最近は、サーバレスサービスも様々なものがでて競争をしているが、当然、このビジネスはコストがかかるし、
競争に敗れる会社もあるだろう。
資金力がものをいうところもあるので、大手サービスを使っておくほうが無難だと思う。

#６．さいごに

サーバレスサービスは便利だし積極的につかって、運営コストをさげていくべきだと思う。
けれど、サービスである以上、その内容が変更されることも起こりうる。
こうした注意を日頃から払っておくことで、いざというときの対応がしやすくなる。

何も変化がないのがいいし、変化があってもより安くなったり楽になる変化ならよいけど、
サーバレスサービスは競争が激化しているのでそうとも限らない。

サーバレスで手間はないかもしれないけれど、注意を払ったり対策はとっておく必要がある。
それが保守作業の一環となるだろう。
rails チュートリアル　6章　備忘録

備忘録の用途
---
１脳のインデックスの外部保存化
２自分ってすごいなと思うため。self esteemが高い人ほど失敗を前向きに捉えるため人生うまくいくらしい。
(引用文献: "DOES HIGH SELF-ESTEEM CAUSE BETTERPERFORMANCE, INTERPERSONAL SUCCESS, HAPPINESS, OR HEALTHIER LIFESTYLES?"
https://www.researchgate.net/publication/296629428_Does_high_self-esteem_cause_better_performance_interpersonal_success_happiness_or_healthier_lifestyles)

まとめ
---
・名前、email、パスワードのバリデーションやテストの仕方、正規表現の確認方法が記載されている。守りを固めること、いわばサイトの守備力を上げる方法を学べる章。
・フロントの実装が少ないのでかなり退屈な章になっている。（早くホームページのフロント作らせて〜〜という気持ちになる）
・ひたすらコピペで進めた。（後で見返せばいいかなと）
STM32L010のSPIの速度を変える。


x Mbedのリビジョン143

目的
SPIのテスト用

```c++

#include "mbed.h"

#define fc2     (0b000000)
#define fc4     (0b001000)
#define fc8     (0b010000)
#define fc16    (0b011000)
#define fc32    (0b100000)
#define fc64    (0b101000)
#define fc128   (0b110000)
#define fc256   (0b111000)

// fc256 239khz   303
// fc128 433khz   303
// fc64  739khz   303
// fc32  1.118mhz 303
// fc16  1.547mhz 303
// fc8   555khz   303
// fc4   566kzh   303
// fc2   199kzh   303

// fc256 405khz   767
// fc128 739khz   767
// fc64  1.253mhz 767
// fc32  1.924mhz 767
// fc16  1.345mhz 767
// fc8   870khz   767
// fc4   488khz   767
// fc2   278khz   767

// fc256 106khz 010
// fc128 176khz 010
// fc64  262khz 010
// fc32  346khz 010
// fc16  416khz 010
// fc8   459khz 010
// fc4   346khz 010
// fc2   122khz 010



#define swclk1  PA_5    //A4
#define test01  PA_6
#define swdio1  PA_7    //A6
#define en1     PA_4    //A3

SPI spi( swdio1 , test01, swclk1); // mosi, miso, sclk
DigitalOut cs(en1);

//Serial pc(USBTX, USBRX); // tx, rx
//Serial pc(SERIAL_TX, SERIAL_RX); //767
//RawSerial pc(PA_2, PA_3); //010
 
int ii;
 
int main() {
    //pc.printf("\r\n010\r\n");
    
    spi.format(8,0);
    spi.frequency(1000000);
 
    ii = SPI1->CR1;
             // 123456789012345
    ii = ii & 0b111111111000111;
    ii = ii | fc8;
    SPI1->CR1 = ii;
 
    while(1){
//        spi.write(0b00000000); //debug
      //spi.write(0b00000001); //debug
        //spi.write(0b00000111); //0
//        spi.write(0b00011111); //1
        

        spi.write(0b00011111); //1
        spi.write(0b00011111); //1
        spi.write(0b00011111); //1
        spi.write(0b00011111); //1
        spi.write(0b00011111); //1
        spi.write(0b00011111); //1
        spi.write(0b00011111); //1
        spi.write(0b00011111); //1


    }//while
}//main

//容量削減
void error(const char* format, ...){}



```
rpm-ostree rebase での GPG signatures found, but none are in trusted keyring

```
# rpm-ostree rebase fedora:fedora/34/x86_64/silverblue
error: Commit 60c89703aaf58f4c05c7cabcffa8b8ca581c8d22460c195d63d0ac8f5249e2d0: GPG signatures found, but none are in trusted keyring
```

視察の後、次にて解決。

```
# /bin/rpm -i fedora-gpg-keys-35-0.4.noarch.rpm
```