OmniAICreator/Qiita-1.07M huggingface dataset:
SSHの公開鍵認証とその他

本日、初めてMENTAを活用させて頂き、その際にご指摘頂いた内容や分からなかったコマンドをまとめておこうと思います！

1. etc/hostsファイル
2. ウェルノウンポート
3. chmod 600 config
4. SSHの公開鍵認証

## hostsファイル（ホスツファイル

ホスト名とIPアドレスの対応付けが記載されており、名前解決してくれるファイル。
ホスト名：ネットワーク上でコンピュータを識別する為のつける「コンピュータの名前」
IPアドレス：コンピュータ向けのネットワークにおける住所
実際には少し違うが、ホスト名 ≒ ドメイン名 と考える、とDNSに役割が似ている。
違いは（正確には認識していない）、

1. hosts設定はあくまでもわりと小規模なネットワーク環境で便利なものである。

    Webサーバの台数もDBサーバの台数もめちゃくちゃ増えた場合、それぞれのWebサーバのhostsファイルに正しく設定して管理する事は非常に大変になる。この時に活用可能になるのがDNS。（多分

2. あくまでも内部向けのアクセスしか管理できないこと。

    開発環境にアクセスする。

反対にDNSでは、多くのIPアドレスとドメイン名の関連付けを行っており、他者（自分以外のコンピューター）が求めるIPアドレスにアクセスする際にも、案内可能。

Linuxの場合、hostsファイルは`etc/hosts`に存在しており、`vim`エディタを用いて変更が可能。
変更の際は、`0.0.0.0 Ub_iwerks.com`のように、`IPアドレス"半角スペース"ホスト名`と記載する。
ちなみにetcファイルは、そのコンピューター用のシステム設定ファイルなどを格納するために使われるディレクトリ（らしい）。

## ウェルノンポート　well-known ports

TCP/IPによる通信で利用されるTCPやUDPの**ポート番号**のうち、著名なサービスやプロトコルが利用される為に予約されている0~1023番のこと。有名で確立されたポート番号ってこと（多分

TCP 22：SSH
UDP 53：DNS
TCP 80：HTTP

## chmod 600 config

こちらの記事が何よりも参考になりました。

https://qiita.com/shisama/items/5f4c4fa768642aad9e06

> `chmod モード 対象ファイル名`の順にコマンドを実行する。

`chmod 600 config`は、

「所有者」に対して「読み取り」「書き込み」を付与する。
「所有グループ」と「その他」に何も付与していない。

## SSHの公開鍵認証

https://qiita.com/Michinosuke/items/5778e0d9e9c04038903c

https://qiita.com/Ub_Iwerks/items/72c567057b9cd59c2382

SSHでサーバーにログインする。
＝離れたサーバーに入って、自分のコンピューターでサーバーを操作できるようにすること

SSH
セキュアに接続するサービスのこと、通信内容が暗号化された遠隔運用システム

SSHの目的
1. 遠隔ログイン
2. 遠隔コマンド実行
3. 通信のトンネル

> 通信の暗号化に用いる鍵はアプリが自動生成するため、ユーザが特に気にする必要はありませんが、電子署名の鍵は、用途に応じて2種類（認証鍵・ホスト鍵）と知っておく必要があります。
いずれも ( 公開鍵暗号の1種なので ) 公開鍵・秘密鍵の鍵ペアで使います。
その2種類の用途は次の通りです。が、一般にみんなが言ってる「公開鍵」は大抵1番目の「認証鍵」のことを指します。
認証鍵
　公開鍵認証でユーザを識別 ( ユーザ認証 ) するときに使う鍵
　原則として、SSHでアクセスするユーザが自身で作って、自身で管理する
ホスト鍵
　ホスト認証で、アクセス先のサーバを識別するときに使う鍵
　　※各サーバが個別に持っている
　　※一般のユーザが作ることはない

「認証鍵」は「公開鍵認証」というユーザー認証手続きの際に用いる。

### 認証鍵の種類（OpenSSH形式

認証鍵の種類は大きく3つあるが、今回はgithubで用いられている「OpenSSH形式」をまとめる。

1. Linux,Mac等、UNIX系OSで標準で使われるOpenSSH ( sshコマンドなど ) で使われる形式
2. "id_rsa" と "id_rsa.pub" のように、秘密鍵と公開鍵のファイルが分離しており、公開鍵の方は "秘密鍵ファイル名.pub" というファイル名になる

### 認証鍵作成ツール

`ssh-keygen`コマンド。

1. OpenSSHに付属する鍵作成・変換コマンドです。
2. OpenSSH形式の鍵ペアを作成することができます。

### 公開鍵の登録

> その方法については、サーバの管理者の案内する方式に従うのが筋です。例えばGitHubの場合、次のようにsettingsメニューから登録できるように、Webページ上でメニューが整備されています。

githubのSSH接続はこの流れでやった。

https://qiita.com/shizuma/items/2b2f873a0034839e47ce
Web技術の基本まとめ Chapter1

Chapter1

* 文章の公開・閲覧のシステムのことを`Web`という。
   * Webはハイパーテキストと呼ばれる言語で構成されている。
   * ハイパーテキストは1つのWebページの中に別のWebページへの参照(ハイパーリンク)を埋め込むことができる。  
   * ハイパーテキストを記述するための言語がHTML。文章の表示方法やハイパーリンクをタグで表現する。
   * ハイパーテキストを解釈して人間に読みやすいものにしてくるのをWebブラウザという。
* WebはCERN(欧州原子核研究機構)により開発された。
    * もともとEUQUIREという各国の実験者がすぐに情報をアクセスするシステムだった。 
* インターネットはARPAによって開発されたコンピュータネットワークであるARPANETが原型となっている。
* 1つのドメインにある複数のWebページの集まりをWebサイトという。
* コンピュータの機能とユーザーのやりとりの橋渡しをする機能をユーザインタフェースという。
* ユーザーインターフェースに対してソフトウェア同士のやりとりを橋渡しする機能をAPIという。
* WebサーバーはWebブラウザからコンテンツの要求があると、必要なコンテンツをネットワークを通してWebブラウザに送信する役割。
* 世界共通のハイパーテキストのやりとりの手順をHTTPという。
* 何度アクセスしても同じものが表示されるページを静的ページという。
    * 逆にことなるものが表示されるページを動的ページという。
* WebサーバーがWebブラウザからの要求に応じてプログラムを起動させるための仕組みをCGIという。
    * CGIから呼び出されるプログラムはサーバーサイド・スクリプトと呼ばれる。一般的にはスクリプト言語(Ruby,PHPなど)。
    * HTMLに埋め込まれ、Webブラウザによって読み込まれる際に実行されるクライアントサイド・スクリプト(JavaScript)というのもある。  
* W3CによってWebの標準化がすすめられている。標準化しないとWebブラウザがどの機能をどこまで処理すればいいか分からなくなる。
* RESTとは4つの原則からなるシンプルな設計。
    * 統一インターフェース
        * あらかじめ定義・共有さらた方法で情報がやりとりされる。
    * アドレス可能性
        * すべての情報が一意なURLの構文で示される。
    * 接続性
        * やりとりされる情報にはリンクを含めることができる。
    * ステートレス性
        * やりとりは1回ごとに完結し、前のやりとりの結果に影響をうけない。
* Webページの情報に意味を付け加える構想のことをセマンティックWebという。
* 情報に関する意味を示す情報をメタデータをという。
【LeetCode】就活に向けたコーディングテスト対策 #11

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

https://leetcode.com/

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

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

#問題
今回解いたのは，難易度easyから [問題35のSearch Insert Position](https://leetcode.com/problems/search-insert-position/) です．
問題としては，整数でソートされた入力配列`nums`と，入力値`target`が与えられたとき，`target`の入る位置（順番，インデックス）を返すというもの．

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

Example 1:

```python
Input: nums = [1,3,5,6], target = 5
Output: 2
```

Example 2:

```python
Input: nums = [1,3,5,6], target = 2
Output: 1
```

Example 3:

```python
Input: nums = [1,3,5,6], target = 7
Output: 4
```

Example 4:

```python
Input: nums = [1,3,5,6], target = 0
Output: 0
```

Example 5:

```python
Input: nums = [1], target = 0
Output: 0
```

#書いたコード
繰り返しの処理を用いて解いてみました．整数でソートされた入力配列`nums`の先頭要素から順番に，入力値`target`との大きさを比較していきます．`nums[i]`が`target`以上の値の場合，そのインデックスである`i`を返します．そして，最後まで条件に当てはまらなかった場合は`nums`のどの値よりも大きいとして，リストの配列数を返すことで，実質的にリストの最後のインデックスを返します．なお，今回の問題では，`nums`があらかじめソートされているので，このようにシンプルな計算で記述できています．

```python
class Solution:
    def searchInsert(self, nums: List[int], target: int) -> int:
        for i in range(len(nums)):
            if nums[i] >= target:
                return i
        return len(nums)
```

ほかにも，Pythonの議論でとてもわかりやすいコードを見つけたので紹介します．
それが以下のコードで，`nums`に`target`が存在すれば，`nums`内の`target`の値におけるインデックスを，存在しなければ，`nums`に`target`を追加し，ソートした後のインデックスを返すというものです．やっていることがとても簡潔でわかりやすく，Pythonを深く理解していなければこのコードは書けないなと，見つけたときに感動しました．

```python
class Solution:
    def searchInsert(self, nums: List[int], target: int) -> int:
        if target in nums:
            return nums.index(target)
        else:
            nums.append(target)
            nums.sort()
            return nums.index(target)
```

#おわりに
言語を深く理解することこそが，わかりやすく読みやすいコードを書けることに繋がるのだと感じました．さらにさらに練習を重ねて，言語理解を深めたいと思います．

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

https://github.com/halpi17/LeetCodeStudy/blob/master/035/searchInsertPosition.py

[前回](https://qiita.com/halpi/items/7336ad1df98ec7a6890d)　[次回](https://qiita.com/halpi/items/f7af9573982c417a159e)
Elasticsearch Serviceでのsnapshotの設定メモ

# これはなに
- Elastic CloudのElasticsearch Serviceを使った場合のsnapshotの設定メモです。
- 新規クラスタを作成した場合、デフォルトだとsnapshotを取得しまくるのでユースケースに合わせた修正が必要です。
- この情報は、2021年6月現在の情報なので、Elastic側のUpdateで変わる可能性があります。

# どうやってやる

Kibanaからできる

- Elastic Cloudを使っている場合は、Deployment配下のSnapshots -> Modify frequencyのリンクから飛べる v 

![スクリーンショット 2021-06-22 14.52.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147174/db3f2270-004f-36de-14f2-7e8e13cd5f02.png)

Kibanaのメニューからだと、Stack Management -> Snapshot and Restore -> Policies からいける

![スクリーンショット 2021-06-22 14.54.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147174/1304e8cd-072d-9300-1066-873e9ba65e25.png)

## policyをupdateする

`cloud-snapshot-policy` というのが作られていて、初期だと30分intervalでsnapshotが取得されている。

policyのeditから、ぽちぽちしていけば、設定を更新可能。

ちなみに、ElasticsearchのAPIから

```
PUT _slm/policy/cloud-snapshot-policy
{
  "name": "<cloud-snapshot-{now/d}>",
（略）
}
```
のように、PUTしても同じことが可能。
【GROMACS Tutorial】BAR法で溶媒和自由エネルギーを計算する チュートリアル"Free Energy Calculations: Methane in Water"実施メモ

http://www.mdtutorials.com/gmx/free_energy/index.html

上のチュートリアルに従い、BAR法でメタンが水に解ける際の自由エネルギー変化を計算したので、その手順をメモする。

* 座標ファイルをmethane_water.gro, とポロジーファイルをtopol.topとして保存
* 各プロセスのmdpファイルを保存
* λを変更したmdpファイルを生成するためのスクリプト、write_mdp.plとして保存、Jobを連続して実施するためのスクリプトjob.shを保存

write_mdp.plを実行する

```bash
perl write_mdp.pl em_steep.mdp
perl write_mdp.pl nvt.mdp
perl write_mdp.pl npt.mdp
perl write_mdp.pl md.mdp
```

λを変更したmdpファイルが生成されているので、これをMDPというディレクトリに移しておく

```bash
mkdir MDP
mv *.mdp MDP
```

job.shの必要な箇所を変更する
私の場合は以下を変更した（自分が使うGROMACSのbinの箇所を指定する）

```bash
GMX=/usr/local/gromacs/2020.6_GPU/bin
```

job.shを実行する

```bash
chmod u+x job.sh
./job.sh
```

あとは最後までジョブを実行してくれる。ちなみにλ=0（メタンと水が100%相互作用している）からλ＝1（メタンと水が全く相互作用しない）までλを0.05ずつ変更しながら計算を行っている。ラムダの値は21個で、各Production MDが1nsなので、合計ではざっと20nsの計算となる

```bash
md xvg
cp Lambda_*/Production_MD/md*.xvg xvg
cd xvg/

```


```bash
gmx bar -f md*.xvg -o -oi
```

https://manual.gromacs.org/documentation/current/onlinehelp/gmx-bar.html

出力は以下。

```
Final results in kJ/mol:

point      0 -      1,   DG  0.19 +/-  0.01
point      1 -      2,   DG  0.17 +/-  0.01
point      2 -      3,   DG  0.14 +/-  0.00
point      3 -      4,   DG  0.10 +/-  0.01
point      4 -      5,   DG  0.06 +/-  0.01
point      5 -      6,   DG  0.01 +/-  0.01
point      6 -      7,   DG -0.05 +/-  0.01
point      7 -      8,   DG -0.15 +/-  0.01
point      8 -      9,   DG -0.24 +/-  0.02
point      9 -     10,   DG -0.37 +/-  0.01
point     10 -     11,   DG -0.55 +/-  0.01
point     11 -     12,   DG -0.78 +/-  0.02
point     12 -     13,   DG -1.12 +/-  0.02
point     13 -     14,   DG -1.43 +/-  0.01
point     14 -     15,   DG -1.49 +/-  0.03
point     15 -     16,   DG -1.32 +/-  0.02
point     16 -     17,   DG -1.03 +/-  0.01
point     17 -     18,   DG -0.70 +/-  0.01
point     18 -     19,   DG -0.39 +/-  0.00
point     19 -     20,   DG -0.12 +/-  0.01

total      0 -     20,   DG -9.09 +/-  0.06

```

となり、自由エネルギー変化は-9.09 +/- 0.06 kJ/mol ということになります。
XMind8を使うために色々した話

## はじめに
ManjaroでXMind8のインストールから、起動するまでに躓いた事の記録です。
しかし、最終的に使用することにしたのはXMind2020です。

___結論:XMind2020を使った方が断然いい！___ 

## インストール
AURにXMindのパッケージが配布されていたので、yayを使ってインストールしました。

```zsh:terminal
yay -S xmind
```

この時、XMind8とXMind2020のどちらかにするか聞かれたので、デフォルトになっていたXMind8にしました。

起動はrofiを使いましたが、ターミナルを使うなら以下のコマンドで起動します。

```zsh:terminal
XMind
```

### その1 _起動しない_
しかし、エラーが出て起動しません。この時はインストールが失敗したと思い、再インストールを何度かしましたが解決せず。
調べたら依存しているパッケージとフォントがインストールしているなら、起動するようです。面倒だったので別の手段を見つけました。
[こちらの記事](https://qiita.com/ocean_f/items/21c86c2f2fb97f5d27c0#xmindiniの編集)で`XMind.ini`を編集して、`Java-8-OpenJDK`を使うようにする必要がある事が分かりました。

`XMind.ini`は、yayでインストールした場合、以下のディレクトリに有ります。

```zsh:terminal
/usr/share/xmind/XMind/XMind.ini
```

### その2 _OpenJDKのインストール_
`Java-8-OpenJDK`を確認しに行くと、インストールされていませんでした。これもエラーの原因かもしれませんが、`PKGBUILD`で依存関係は解決してくれたような……
とりあえずインストールして、ディレクトリは以下のようになってます。

```zsh:terminal
yay -S java-8-openjdk #インストール

/usr/lib/jvm/java-8-openjdk/bin #ディレクトリ
```

インストールはしましたが、古いバージョンのものを使うという事に、このとき違和感を覚えました。

### その3 _XMind.iniの編集_
管理者権限での編集が必要なので、vimを使って編集しました。

```zsh:terminal
sudo vim /usr/share/xmind/XMind/XMind.ini
```

[参考記事](https://qiita.com/ocean_f/items/21c86c2f2fb97f5d27c0#xmindiniの編集)の通り、`Java-8-OpenJDK`を使えるように以下の2行を追加します。

```ini:XMind.ini
-vm 
/usr/lib/jvm/java-8-openjdk/bin
```

### その4 _起動するけど……_
ある程度やれる事はやりましたが、コマンドを実行しても起動しません。
そこで試しに`sudo`を使って見ると、何のエラーも出さずに起動しました。
_でも……`sudo`付けなきゃダメ？_


## 起動スクリプト
ターミナルから起動するのは面倒です。
rofi等のランチャーで起動するにしても`sudo`を付けて、ターミナルへパスワードを入力するなんて、スマートじゃないですよね。

なので`Zenity`を使って、パスワード入力用ダイアログを表示し、それで起動できるシェルスクリプトを作ることにしました。

###　`Zenity`
`Zenity`は通知やダイアログを表示できるプログラムで、シェルスクリプトと合わせれば、簡単なGUIプログラムが作れます。
今回は`Zenity`のパスワード入力用ダイアログを表示させます。

[マニュアル](https://help.gnome.org/users/zenity/3.32/password.html.ja)を参考に以下のようにしました。

```bash:xmind.sh
##!/usr/bin/env bash

pass=`zenity --title "User authentication" --password`
case $? in
    0) echo $pass | sudo -S XMind
    ;;
    1) echo "Authentication has been canceled."
    ;;
    -1) echo "Unexpected error." 
    ;;
esac
```

`sudo`のパスワードを受け入れる部分は[こちら](https://stackoverflow.com/questions/11955298/use-sudo-with-password-as-parameter)を参考にしました。
上のスクリプトをパスの通る場所に置いて、実行権限を与えてあげれば完成です。これで、ランチャーから起動した時にダイアログが表示されて、パスワードを入力すれば問題なく起動します。

## 画面のちらつき
これに関しては、使用環境によるものなのか分かりませんが、マインドマップを編集していると、画面がちらついて集中できないのです。
調べてみても、他に同じような症状を訴えている人を見つけることができず、XMind8の使用を断念しました。

## さいごに
結果として、冒頭で述べたようにXMind2020をインストールすることで解決しました。
こちらに関してはyayでインストールすれば、普通に起動できます。しかも、起動が早い！
なんだかんだ、遠回りした気がしましたが、`Zenity`を使った起動スクリプトの辺りに関して、このまま消してしまうのは勿体なかったので記事にしました。

## 参考リンク
[Ubuntu 18.04にXMind 8をインストール＆Dockから起動](https://qiita.com/ocean_f/items/21c86c2f2fb97f5d27c0)
[use-sudo-with-password-as-parameter](https://stackoverflow.com/questions/11955298/use-sudo-with-password-as-parameter)
Python set型 集合演算

**集合演算**

和（union） 
積（intersection）
差（difference）


**和(union)　記号 |  要素の和**
例

```python
union = {1,2,3,4} | {6,7,8,9}
print(union)
```
結果
{1, 2, 3, 4, 6, 7, 8, 9}

**積（intersection）　記号 &　被っている要素**
例

```python
intersection = {1,2,3,4,'A'} & {4,7,8,9,'A'}
print(intersection)
```
結果
{4, 'A'}

**差（difference）記号 & 左の集合から右の集合を引く残ったもの**

```python
difference = {1,2,3,4,5,} - {2,3,4,5,6}
print(difference)
```
結果
{1}
よく聞く「Apache」,「Tomcat」とは？

Apacheと、Tomcatの理解が曖昧なので、自分用の勉強用としてまとめていきます。

それぞれ一言で言うと、
>**Apache：Webサーバ
>Tomcat：サーブレットコンテナ**

それでは、それぞれ解説していきます。

#通信を表した図
![Group 6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1098849/8ea87548-fb5b-c994-bff1-43c06ebfeba5.png)
[参考](https://www.youtube.com/watch?v=kxjrd2faZMM)
訳の分からない用語がたくさんですが、後ほど解説するので、まずは、流れを説明します。

>Webブラウザでアクセス
→httpリクエストを``Apache Webサーバ``に対して送る
→``Apache``は``modJk``というモジュールを使ってAPサーバ（アプリケーションサーバ）にAJPリクエストを送る
→AJPが受け取り、Webコンテナ（サーブレットコンテナ（画面に見せる側））へ
→WebコンテナからEJBコンテナへ
→EJBコンテナがDBに接続して、Webコンテナへ（ここでコンピュータが読み取り可能な言語にコンパイルしてあげるのがjavaVM）
→WebコンテナからApacheへAJPレスポンスを送り
→ApacheからWebブラウザにhttpレスポンスを送り
→画面に表示される。

#Apache
簡単に言うと、``アパッチ (Apache)``とは**全世界的に普及しているWebサーバのソフト**のことです。
正式名称は、「Apache HTTP Server」

###ホームページが表示される流れ
>まず、ホームページを見るときに使うソフト（Webブラウザ）からホームページのファイルが置いてあるコンピュータ（Webサーバ）に対して「このページをおくれ」なお願いが出されます。
→そのお願いに対して、WebサーバからWebブラウザに「ほれ、そのページだよ」とお返事がきます。
→お返事を受け取ったWebブラウザは、受け取った内容（ホームページのファイル）を画面上に表示してくれます。

これが、ホームページが表示されるときの流れです。

###Webサーバとは
ウェブサーバ (Webサーバ)（英：Web server）とはホームページやWebサービスを置いておくコンピュータであり、
ホームページを見るソフト（Webブラウザ）から「あのページをおくれ」と言われたら「ほれ、そのページだよ」と渡してやるのが仕事のサーバです。
簡単に言うと、Webサービスを置くサーバのこと

WebサーバをWebサーバたらしめているのは「Webサーバのソフト」なのです。
普通のコンピュータにWebサーバのソフトを入れることによって、Webサーバとしてのお仕事ができるコンピュータになります。

**大事なのは、箱ではなく中身**です。
Webサーバのソフトさえ入れれば、あなたが普段使っているパソコンだってWebサーバになれます。

#Tomcat
簡易的なWebサーバとしての機能を持ちます。
正式名称は、``Apach Tomcat``と言います。　（だからややこしい）

Apache Tomcatとは、**Java Servletを動かすときに必要なソフト（サーブレットコンテナ）のひとつ**です。

###Java Servlet
``Java Servlet``とは、Webサーバ上でお仕事をするJavaのプログラムです。Java Servletを動かすためのソフトで、サーバ上で動くJavaプログラムのことです。
動的なページが生成可能です。

**補足**
ここでは、JSPもServletとみなす。と言うのも、JSPはコンパイルするとServletに変換されるから。

>**Java**
Javaのプログラムはほぼどんな環境でも動くことが特徴の言語です。
Javaを生み出した人は、このプログラミング言語を使って、いろいろなプログラムを作れるようにしました。

Javaプログラムの１つに、Webサーバで動くJavaプログラムがあります。
この「Webサーバ上で動くJavaプログラム」を「Java Servlet（サーブレット、Servlet）」と言います。

Java Servletは、``「サーブレットコンテナ（Webコンテナ、サーブレットエンジン）」``と呼ばれるソフトが必要です。
一番初めの「通信の流れを表した図」のAPサーバ内のwebコンテナの部分です。

このサーブレットコンテナの１つが**「Apache Tomcat」**です。

>Java Servletの特徴
１．ライフサイクル管理
２．マルチスレッド対応
３．プラットフォーム非依存
それぞれの特徴についてはこちらを参考に https://wa3.i-3-i.info/word12835.html


以上で　「Apache」,「Tomcat」の説明はある程度終わります。

**参考にしたサイト**
・[用語の説明](https://wa3.i-3-i.info/word12843.html)
・[YouTube解説](https://www.youtube.com/watch?v=kxjrd2faZMM)

「Tomcatあれば、Apacheが必要ないんじゃない？」ということが分かりやすく書かれたQiitaを最後に貼っておきます。

https://qiita.com/tanayasu1228/items/11e22a18dbfa796745b5
Excelで文章かいてみた

# 1. はじめに


Excel で Asciidoctor つくってみました。
たまに、Markdown や Asciidoctor 形式で文章を作るのですが、大した機能を使用しないのに、文法？が分からなくなります。

使うのは

* 見出し
* 図
* テーブル

くらいのもの

# 2. こまること


テーブルの書き方なんて絶対覚えれません。
図は、なにかで描いて、ファイル名を付けて保存して、Markdown や Asciidoctorでは タグ付きで記述しなければなりません。

# 3. じゃ


テーブルと図といえば、Excelですよね。（図は違う？）
でも、結構エクセルの図機能は使えるようになってきました。

# 4. Excelで書いてみた


* A列に、Asciidoctorぽいタグ
* B列に、図のファイル名（ファイル名の対角に図を配置）
* C列に、タイトルや本文

これで、Excelマクロで、Asciidoctor形式のドキュメントと図1個を出力します。

![excel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165394/47f1fabe-f967-67d8-a8a0-b6e67f2ca1e6.png)

出力結果は次の通り
![asciidoctor.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165394/0c53f0aa-2442-c0a5-7fdb-4cb1056f90b3.png)

[サンプルはここ](https://github.com/toramameseven/Excel2Asciidoc)

機能がぜんぜん足りないや..
【youtube-dl】YouTube said: Unable to extract video dataと出てDLできない

## はじめに
youtube-dlで音声データを抽出しようとしたら以下のようなエラーが出る。

```bash:Terminal
❯❯❯ youtube-dl "https://www.youtube.com/watch?v=hogehoge" -x --audio-format wav 
[youtube] hogehoge: Downloading webpage
[youtube] hogehoge: Downloading video info webpage
WARNING: unable to download video info webpage: HTTP Error 404: Not Found
WARNING: unable to download video info webpage: HTTP Error 404: Not Found
WARNING: unable to download video info webpage: HTTP Error 404: Not Found
WARNING: unable to download video info webpage: HTTP Error 404: Not Found
ERROR: hogehoge: YouTube said: Unable to extract video data
```

## 試したこと
+ とりあえずアップデート

```bash:Terminal
❯❯❯ youtube-dl --update
Updating to version 2021.06.06 ...
ERROR: no write permissions on /usr/local/bin/youtube-dl
```
書き込み権限がないとか今更そういうこと言う？
とりあえず`sudo`で再試行。

```bash:Terminal
❯❯❯ sudo youtube-dl --update
Password:
Updating to version 2021.06.06 ...
Updated youtube-dl. Restart youtube-dl to use the new version.
```
updateできたっぽいのでterminal再起動したらちゃんと更新できてた。

```bash:Terminal
❯❯❯ youtube-dl --version
2021.06.06
```

というわけでリトライ

```bash:Terminal
❯❯❯ youtube-dl "https://www.youtube.com/watch?v=hogehoge" -x --audio-format wav
[youtube] hogehoge: Downloading webpage
[download] Destination: hogehoge.m4a
[download] 100% of 1000.01KiB in 00:00
[ffmpeg] Correcting container in hogehoge.m4a"
ERROR:   Reason: image not found
```
なんかwav指定したつもりだったけど何故かm4aになってるしエラー出てるけどとりあえず音声データは無事生成されたのでヨシ

## 結論
とりあえずアプデ
PostgreSQLでcopyコマンドで数値型にcsv空文字を入力したときにERROR:  invalid input syntax for type numeric: ""エラーが出たときの対処

# 前提

```
root@f6f006004a3a:/# psql -U postgres
psql (13.3 (Debian 13.3-1.pgdg100+1))
```

# CSVファイル
```test.csv
root@f6f006004a3a:/# cat test.csv
"Bob","123"
"Tom",""
```

# テーブル定義
```
postgres=# create table test(name varchar(50), saraly numeric);
CREATE TABLE
```

# エラーになるパターン
```
postgres=# copy test from '/test.csv' with (format csv, null '');
ERROR:  invalid input syntax for type numeric: ""
CONTEXT:  COPY test, line 2, column saraly: ""
postgres=#
```
空文字はnullとして扱うよう、「null ''」を指定しているのに、numericに空文字はダメという感じのエラーが出る。

# 正常パターン
```
postgres=# copy test from '/test.csv' with (format csv, null '', force_null(saraly));
COPY 2
postgres=# select * from test;
 name | saraly
------+--------
 Bob  |    123
 Tom  |
(2 rows)

postgres=# select * from test where saraly is null;
 name | saraly
------+--------
 Tom  |
(1 row)

postgres=#
```

saralyカラムをforce_null指定することで、正常にCSVファイルをテーブルデータに登録できました。force_nullのオプション名から、全ての行でnullになってしまうかも？という疑惑もありましたが、CSVファイル上空文字になっていない行については、正しく値が入ってます。
Automate  で The payload is too large.となった時の対処法

# 概要
Mailで受信した画像を、Teams のPost Adaptive CardでBase64で固めて投稿しようとしたところ件名のエラーが発生。その回避方法のメモ

# 対処法
1. ファイルをアップロードしておいて、URLを投稿
1. OneDrive でCreate Fileして、Get Thumbnail (small/middle/large) で URLを投稿
![2021-06-22_21h56_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/2c0cfde2-ce78-9e62-1fc1-3df1b675db6c.png)


後者にして、画像を上書きしていけば、いつの間にか消えていていい感じ？
Power BI の定期通知画像なんであまり保存はしたくない、という。

自宅環境では問題ないので、会社の制限なんだろうか・・😅
snowflakeに設定ファイル使ってCUIで(snowsql)ログインする

#背景
snowflakeをGUIベースで実行するのが面倒くさいと思った。
CUIでどうやってやるのか聞かれるのが面倒になったのでにコマンドラインベースでやるメモ。
設定ファイルあり、なしと複数の設定を切り替えてログインするまで。
仕事で使っている人も多いと思うのでプロキシ設定忘れないように！！

あと、Windowsでやってます。

#準備
[標準のガイド](https://docs.snowflake.com/ja/user-guide/getting-started-tutorial-prerequisites.html
)を見ながらsnowsqlをインストール。面倒であれば、[リポジトリ](https://sfc-repo.snowflakecomputing.com/snowsql/bootstrap/index.html)から直接ファイルを落としてインストール。

アカウント名とユーザー名とパスワードを思い出しておく。
尚、アカウント名はsnowflakeのURLが「https\://x12345.ap-northeast-1.aws.snowflakecomputing.com/」だとしたら
「.snowflakecomputing.com」までの部分アカウント名であり「x12345.ap-northeast-1.aws」となる


#手始めに設定ファイルなしでsnowflakeにCUI経由でログイン
コマンドプロンプトでアカウント名、ユーザー名、を引き数に実行する。
```$ snowsql -a アカウント名 -u ユーザー名```

その後パスワードを聞かれるので、入力するとログインできる。
![スクリーンショット 2021-06-22 211152.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1676703/8f28fd40-d058-e19b-b4a9-8b0dd862773a.png)

###プロキシいる場合
環境変数に「HTTP_PROXY」「HTTPS_PROXY」を設定する。
もしくはコマンドで次のものを実行してもよい。
ただ、下記に書いている設定ファイル経由でプロキシ設定したほうが利便性が高いと思う。

例（パスなしの場合は、@以降だけの「プロキシURL:ポート番号」でOK）：

```
set HTTP_PROXY=http://username:password@proxyserver.com:8080
set HTTPS_PROXY=http://username:password@proxyserver.com:8080
```

#設定ファイルありでsnowflakeにCUI経由で自動ログイン

「c:\ユーザー\ユーザー名\\.snowsql」にある次の場所のconfigをメモ帳などで開く。

![スクリーンショット 2021-06-22 212317.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1676703/d331e256-6786-2c2f-91fb-41065e12be33.png)

[connections]の次の部分を書き直す。

```
[connections]          
# *WARNING* *WARNING* *WARNING* *WARNING* *WARNING* *WARNING*
# 
# The Snowflake user password is stored in plain text in this file.
# Pay special attention to the management of this file.
# Thank you.
# 
# *WARNING* *WARNING* *WARNING* *WARNING* *WARNING* *WARNING*

#If a connection doesn't specify a value, it will default to these
#
#accountname = defaultaccount  
#region = defaultregion
#username = defaultuser
#password = defaultpassword
#dbname = defaultdbname
#schemaname = defaultschema
#warehousename = defaultwarehouse
#rolename = defaultrolename
#proxy_host = defaultproxyhost
#proxy_port = defaultproxyport
```

↓ファイルを上書きする。こんな感じ。

```
[connections]          
accountname = アカウント名
username = ユーザー名
password = パスワード
```

そうすると次のコマンドをコマンドプロンプトで実行するだけでログインできる。
もちろんプロキシが必要な場合は「proxy_host = roxyserver.com」「proxy_port = 8080」みたいな感じでconnectionsにホストとポートを追記すること。

```
$snowsql
```

#設定ファイルを切り替えながらsnowflakeにCUI経由でログイン

自分みたいに、複数のsnowflakeアカウントを持っているときに自動ログインだけで足りないときは、
設定ファイルに「connections.名前」みたいなものを複数追加できる。

```
[connections.sample1]          
accountname = アカウント名
username = ユーザー名
password = パスワード

[connections.sample2]          
accountname = アカウント名
username = ユーザー名
password = パスワード

[connections.sample3]          
accountname = アカウント名
username = ユーザー名
password = パスワード
```

コマンドプロンプトからの実行時に「snowsql -c 名前」で設定ファイルを切り替えてログインできる。
[connections.sample3]を使う場合はこんな感じ。

```
$snowsql -c sample3
```

#本家の説明書き

https://docs.snowflake.com/ja/user-guide/snowsql-start.html
データ型のまとめ ― J 言語入門

前回までで、全てのデータ型の紹介が終わりました。この記事では、それらを整理して表にしています。

# 値の分類

型の名前は `datatype` の結果に合わせています。

- 数値
  - boolean
  - integer
  - floating
  - complex
  - extended
  - rational
- 文字・文字列
  - literal
  - unicode
  - unicode4
  - symbol
- ボックス
  - boxed

## 数値

|型|値|例|
|---|---|--|
|boolean|整数 `0` (false) と `1` (true)|`1`|
|integer|64 bit 符号付き整数|`42`|
|floating|IEEE 754 倍精度浮動小数点数|`3.14`|
|complex|複素数|`1j_1`|
|extended|多倍長整数|`12345x`|
|rational|有理数 (分数)|`1r2`|

## 文字・文字列

|型|値|例|
|---|---|--|
|literal|UTF-8 文字(列)|`'a'`|
|unicode|UTF-16 文字(列)|`u:16b3042`|
|unicode4|UTF-32 文字(列)|`10 u: 16b20bb7`|
|symbol|一意な文字列|`s:<'symbol'`|

## ボックス

|型|値|例|
|---|---|--|
|boxed|どんな値でも格納可能|`'abc' ; 'xy' ; (<1 2) ; 3`|

# 配列

普通は密な配列を使います。疎な配列の場合、`datatype` は型の名前の前に `sparse` を付けたものになります。

- 密な配列 (普通の配列)
- 疎な配列 (疎行列)

## 別名

|名前|意味|例|
|---|---|---|
|リスト|一次元配列|(ベクター・文字列)|
|ベクター|数値のリスト (一次元配列)|`1 2 3`|
|文字列|文字のリスト (一次元配列)|`'abc'`|
|テーブル|二次元配列|`i.3 3`|
|ブリック|三次元配列|`2 2 2 $ 'abcdefgh'`|

# アトム

配列と対比して、配列になっていない「一つの」値をアトムと呼びます。`1` や `'a'` などがアトムです。ボックスは、中に入っている値に関わらず、アトムに分類されます。

---

J では、「オブジェクト型」のようなものは無く、新しい型を定義することもできないので、上に挙げた型が全てです。逆に言うと、これらの値だけを使ってプログラムを書いていくことになります。

---

\[ 前 : [疎行列](https://qiita.com/unsigned-wrong-wrong-int/items/a7587ed207008e8d0a04) \] \[ [目次](https://qiita.com/unsigned-wrong-wrong-int/items/e15a87999cedfc6b9ced) \] \[ 次 : [verb と引数](https://qiita.com/unsigned-wrong-wrong-int/items/4357829e274c302cfe64) \]
【論文紹介】Thermal stimulation of taste

#論文紹介
論文：Thermal stimulation of taste
著者：Alberto Cruz, Barry G. Green
https://www.nature.com/articles/35002581


#どんなもの
　舌の一部分を加熱または冷却すると、実際に味覚を引き起こす可能性を示した。舌の前端の鼓索神経を低温から温めると甘さを感じ、冷却すると酸味や塩味を感じる。舌の奥の部分の舌咽神経においても温熱味覚は生じるが、温度と味覚の関係は舌の前端部分と異なる。

#先行研究と比較してすごいところ
　味覚に対する温度効果の実験では、温度そのものが味覚を刺激することよりも、化学物質の風味に対する感度の変調に焦点が当てられていた。この論文では、温度そのものが味覚を刺激することに焦点を当てた。

#技術や手法のキモ
　温度は、8mm×8mmのコンピューター制御のペルチェ熱電対を用いて、約±1.5℃s-1で変化させる。熱電対は、水循環式ヒートシンクに取り付けられ、衛生上の理由からラップで覆う。被験者はヒートシンクを取っ手にして、熱電対を舌に当てる。

#検証方法
　味覚(甘味、酸味、塩味、苦味)を含む他の感覚を感じたら報告してもらう。味を感じたとき、被験者はその強さを1から10までの尺度で報告してもらう。

1.温度と味覚の関係の調査
 20℃から段階的に温度を上昇し、35℃から段階的に温度を下げた。味覚(甘味、酸味、塩味、苦味)と熱感覚の強さをマグニチュード・スケール(LMS)16を用いて評価した。反復測定分散分析(ANOVA)を用いた。
→舌先を20℃から温めると、甘味を感じるが他の味は変わらなかった。さらに温めても、効果はなかった。舌先を15~20℃に冷却すると、多くの人は酸味を感じ、一部の人は塩味を感じた。さらに冷却しても酸味は強まらなかった。
　
2.熱的甘味と酸味が最大になる舌の端の部分の調査
　甘味の最大を評価するために20℃から35℃まで、酸味の最大を評価するために35℃から15℃まで温度変化させた。
→熱的甘味と酸味がピークなる場所は一致していなかった。スイートベストサイト(甘味が最大になる部分)は常に舌の先端で、サワーベストサイト(酸味が最大になる部分)は常に舌の先端よりも外側にあった。

3.同じ部位を化学的な刺激で実験して、熱的味覚と化学的味覚の関係の調査
→熱的甘味と化学的に生じる甘味の間には場所の関係はあるが、熱的な味覚に対する感度は化学的な味覚に対する感度ほど均一には分布していないことがわかった。

4.舌の前端に沿った温熱味覚と感受性の関連性の調査
→スイートベストサイトは、舌の先端付近で最も強く、温かさの知覚と密接に関係している。サワーベストサイトは、舌の位置と温度(冷たさ)は異なる。そのため、甘味の強い場所に比べて酸味の強い場所のばらつきが大きかった。

5.舌咽神経が支配する有郭乳頭の熱味覚についての調査
→温めると甘味は感じないが、冷やすと熱的苦味・酸味を感じた。ショ糖は、舌先で得られたのと同様に有郭乳頭でも中程度の甘味を感じた。
舌前端ではスイートベストサイトと温感が密接に関連していたが、有郭乳頭では温感が乏しく、冷感は両方で同様に評価された。


#議論
　熱的味覚と化学的味覚の感度で違いが出た要因として考えられることはなにか。
→化学的感覚メカニズムが温度に敏感なニューロンの発生率と分布の違いを反映しているのかもしれない


#気になった論文
 Cross-Modal Correspondences Between Temperature and Taste Attributes
Rocky Linux を Azure VM で試してみた

## 背景と目的

Rocky Linux 8.4 が GA したとの事で、Azure VM での提供状況を調べてみました。

## 前提条件

コマンドの実施環境は、Mac + Azure CLI です。

```zsh:zsh
% sw_vers
ProductName:    macOS
ProductVersion: 11.4
BuildVersion:   20F71

% az version
{
  "azure-cli": "2.25.0",
  "azure-cli-core": "2.25.0",
  "azure-cli-telemetry": "1.0.6",
  "extensions": {}
}
```

## 実施内容

OS イメージの URN を調べます。現時点では GA した 8.4 は提供しておらず、8.3 でした。

```zsh:zah
% az vm image list \
  --offer rocky_linux \
  --all
[
  {
    "offer": "rocky_linux",
    "publisher": "tunnelbiz",
    "sku": "rocky-8-3",
    "urn": "tunnelbiz:rocky_linux:rocky-8-3:1.0.1",
    "version": "1.0.1"
  }
]
```

マーケットプレースの Rocky Linux OS イメージに対する使用条件への同意を行い、Azure VM を作成します。

```zsh:zah
region=japaneast
prefix=mnrrocky
vmpass=$(openssl rand -base64 16)
echo $vmpass

az group create \
  --name ${prefix}-rg \
  --location $region

az vm image terms accept \
  --urn tunnelbiz:rocky_linux:rocky-8-3:1.0.1

az vm create \
    --resource-group ${prefix}-rg \
    --name ${prefix}-vm \
    --os-disk-name ${prefix}-vmOSDisk \
    --image tunnelbiz:rocky_linux:rocky-8-3:1.0.1 \
    --admin-username azureuser \
    --admin-password $vmpass \
    --size Standard_A2_v2 \
    --nsg-rule NONE \
    --public-ip-address "" \
    --storage-sku Standard_LRS
```

## 実施結果

OS 情報を取得してみました。

```zsh:zah
% az vm run-command invoke \
  --command-id RunShellScript \
  --resource-group ${prefix}-rg \
  --name ${prefix}-vm \
  --query "value[0].message" \
  --output tsv \
  --scripts "cat /etc/os-release"

Enable succeeded: 
[stdout]
NAME="Rocky Linux"
VERSION="8.3"
ID="rocky"
ID_LIKE="rhel fedora"
VERSION_ID="8.3"
PLATFORM_ID="platform:el8"
PRETTY_NAME="Rocky Linux 8.3"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:rocky:rocky:8"
HOME_URL="https://rockylinux.org/"
BUG_REPORT_URL="https://bugs.rockylinux.org/"
ROCKY_SUPPORT_PRODUCT="Rocky Linux"
ROCKY_SUPPORT_PRODUCT_VERSION="8"

[stderr]

```

## 参考

作成したリソースを削除します。

```zsh:zsh
az group delete \
  --name ${prefix}-rg
```

[Rocky Linux 8.4 GA Available Now](https://rockylinux.org/ja/news/rocky-linux-8-4-ga-release/)

[Rocky linux VM by tunnelbiz](https://azuremarketplace.microsoft.com/marketplace/apps/tunnelbiz.rocky_linux)

[az vm image list](https://docs.microsoft.com/en-us/cli/azure/vm/image?view=azure-cli-latest#az_vm_image_list)
ド忘れしていたRubyの基礎5選③

どうも、三町哲平です。

https://qiita.com/TeppeiMimachi/items/f3a9047dffdbc119df27

ド忘れしていたRubyの基礎5選の第3弾です。

今回は、コチラの問題を解く際を想定
[(4) Palindrome Number - LeetCode](https://leetcode.com/problems/palindrome-number/submissions/)

解き方は、コチラを参照
[(4) 5 line Ruby Solution > 99% of Ruby Solutions - LeetCode Discuss](https://leetcode.com/problems/palindrome-number/discuss/267430/5-line-Ruby-Solution-greater-99-of-Ruby-Solutions)

# 1. reverseメソッド
reverseメソッドとは配列の要素の順番を反転させるメソッドです。

```ruby
trains = ["赤色", "白色", "青色", "銀色"]
p trains.reverse
p trains

#=> ["銀色", "青色", "白色", "赤色"]
```
reverse!メソッドはreverseメソッドと使い方は同じですが、レシーバ自身を変更してしまうという点で異なります。

引用及び参考記事:[Rubyのreverseメソッドの使い方を現役エンジニアが解説【初心者向け】 | TechAcademyマガジン](https://techacademy.jp/magazine/19843)

# 2. to_sメソッド

to_sメソッドとは、文字列以外のオブジェクトを文字列に変換するメソッドです

```ruby
10.to_s 
# => "10"
```
引用及び参考記事:[Rubyのto_sメソッドの使い方を現役エンジニアが解説【初心者向け】 | TechAcademyマガジン](https://techacademy.jp/magazine/22202)

# 3. to_iメソッド

to_iメソッドとは、数字の文字列を数値オブジェクトに変換するメソッドです。また、小数を整数に変換することもできます。

```ruby
num = "1"
p num
# => "1"

num.to_i
# => 1
```
引用及び参考記事:[【Ruby】 to_iメソッドの使い方を理解しよう | Pikawaka - ピカ1わかりやすいプログラミング用語サイト](https://pikawaka.com/ruby/to_i)

# 4. splitメソッド

splitメソッドとは簡単に言うと文字列を分割して配列にするためのメソッドです。

```ruby
str = "samurai,engineer,blog"
array = str.split(",")
p array

#=> ["samurai", "engineer", "blog"]
```
引用及び参考記事:[【Ruby入門】splitで文字列を分割しよう！ | 侍エンジニアブログ](https://www.sejuku.net/blog/41681)

# 5. randメソッド

```ruby
rand # 疑似乱数浮動小数点数を返す
#=> 0.2575753533357512
```
```ruby
rand(5) # 0以上5未満の整数を返す
#=> 2

rand(1..5) # rangeで指定された範囲の値を返す
#=> 5
```
引用及び参考記事:[【Ruby】 | Pikawaka - ピカ1わかりやすいプログラミング用語サイト](https://pikawaka.com/ruby/rand)

https://qiita.com/TeppeiMimachi/items/36be38996eb65a68df57
Bin問題

# Bin問題

# 概要
VS CodeにてSpringを使って開発を行なっていた時に問題が発生、解決だけはできたことをまとめる

# 目次
1. 環境
2. binに反映されない問題
3. Gitから最新取得時に、ファイルを開かないと反映されない問題
※解決はできているので解決方法だけの記載となります。

# 1.環境
- VSCode
- Docker
- SpringFW
- OrcleDB
- Mac,WindowsのPCで共同で開発を行う  
  
ざっくり上記の環境で、開発を行なっていた

# 2.binに反映されない問題
初めにWindows側の環境で発生した。  
## ■問題
## 自分の書いたコードがビルドしても反映されておらず、修正前の状態でアプリが起動する。。。  

環境等やらとにかくいろんなところを確認した。。  
すると原因としては、ビルド後の ***「bin」フォルダの中身が全く変わっていない*** ことによって問題が発生していることが判明 
  
具体的にどの拡張子のファイルで起きているのか下記にまとめる

- htmlファイル
- xmlファイル
- jsファイル  
※挙動が変だった時点で、まずこの問題を疑っていたので、他のファイルでも起きている可能性はある

## ■解決方法
以下の手順を踏む

1. settings.jsonの記載にて
    "java.configuration.updateBuildConfiguration"の項目を"interactive"⇒"automatic"に変更 

2. 下記のファイルを一度開いて読み込ませる（ファイルを開かないと設定が読み込まれていない場合がある）  
    - build.gradle  
    - gradlew  
    - gradlew.bat  
    - settings.gradle  
    
3. 「build.gradle」の適当な場所に改行を追加するなどして適当な変更を加えて、上書き保存する

これでやっと「src」フォルダの内容が、「bin」フォルダの方にも反映されて、期待通りの動作をしてくれた

# 3.Gitから最新取得時に、ファイルを開かないと反映されない問題

## ■問題
表題の通り、Gitから最新環境をPULLすると  
VS Code上でエラーの表記が出ている。。。  
(resolved~~~みたいなエラーだったはず。。)

## ■解決方法
だいたいメソッドに対して、エラーが発生している。  
そのメソッドの実態があるファイルを開くと、問題は解決する。<br>
VS Codeって一度ファイルとかを開かないと、変更とか見えないの。。。？  

# まとめ
- VScodeではsrcファイルに変更を加えるとビルド時にbinファイルにも同じ変更が適用されるはずだが、変更が反映されない（Windows、Macともに）
- settings.jsonの記載を変更後、特定のファイルを更新した際にはsrcファイルの変更がbinファイルにも適用される
- 明確な原因はわからないが、ビルドの設定あたりが怪しいか？（srcファイルの変更を読み込んでいない？）
pythonエンジニア認定試験受験記(その後)

### 試験後

以下のオデッセイ開催のpython基礎認定試験を受験後の感想について記載する

Odyssey CBT | オデッセイ コミュニケーションズ
https://cbt.odyssey-com.co.jp

### 結果

無事合格した(ありがとうございます)

![IMG_1247.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530719/481a0dcb-80c6-03ea-a3c0-771753ca2228.jpeg)

感想から言うとpythonと言う言語を一通りきちんと理解しているかと言う基本的なところを問われていたと思う。
あと個人的な所感としてはエラーの処理の部分のウエイトが思ったより多かった(この点はシャッフルかもしれないので一概にそうだとは言えないが)

全体的に意地悪な問題はあまりなかった。
と言うかPRIME STUDYやDIVE INTO CODEの模試より簡単であった。
この2つで8割方取れるのであれば合格は可能だと思われる。

試験会場に行ってからは受付の方にこれからもう受けますか？とか言われて特に荷物をロッカーに入れることもなく足元のカゴに入れ(いいのかそれで...)写真を撮ることもなく、ピアソンVUEとかの試験会場とはセキュリティーとか全然違うなと思いながら試験を受けた。
まあ普通のビルの一室のパソコン教室的な感じだったのでそんなもんなのかなあとも思った。

試験中は落ち着いて問題を解けた
20分くらいで終わって3問くらい見直しして他は間違ってないだろうという確信を持って回答できた。
__正直１００点だと思っていたので間違っていたところを教えてほしい__

pythonの試験を通じで色々なことが理解できたのは良かったと思う。
これからも歩みを止めず次はデータ分析試験も受けてみようと思うので、
そのアウトプットはまた別の機会に

https://www.pythonic-exam.com/exam/analyist
Ruby 問題13 条件演算子

#問題

3桁の正の整数を入力します。その整数の「百の位・十の位・一の位の和」について、
10の倍数（0,10,20,30...）からの差が

* 2以内であるときは"True"

* それ以外は"10の倍数との差は○です"

と表示されるようにプログラムを書く。

出力例

```
near_ten(144)→True
near_ten(214)→10の倍数との差は3です
near_ten(898)→10の倍数との差は5です
0も10の倍数に含むものとします。
```

#ヒント

```.rb
def near_ten(num)
  if 
    puts "True"
  elsif 
    puts "10の倍数との差は#{}です"
  else 
    puts "10の倍数との差は#{}です"
  end
end

near_ten()
```

条件分岐を用いれながら・・・


#解答

```.rb
def near_ten(num)
  total = (num/100) + (num/10 % 10) + (num % 10)
  remainder = total % 10
  if remainder <= 2 || remainder >= 8
    puts "True"
  elsif remainder <= 5
    puts "10の倍数との差は#{remainder}です"
  else 
    puts "10の倍数との差は#{10 - remainder}です"
  end
end

```

少しづつ分けて解説していきます

```.rb
total = (num/100) + (num/10 % 10) + (num % 10)
```
上記の行で百の位・十の位・一の位を切り離して計算し、その合計を`total`に代入しています。

###100の位の計算

num = 117の場合、num/100 つまり117/100は1.17となります。

Rubyでは整数同士（integer型）の計算だと返り値は整数になるので、小数点以下は切り捨てられて結果「1」になります。

###10の位の計算

2桁の整数を10で割り、その値を10で割った際の余りが十の位になります。

num = 117の場合、117/10は11.7になります。整数同士は小数点以下の計算は行わないので、11になります。

11 % 10 は、11を10で割った際の余りを計算結果として返します。百の位の計算と同様に、小数点以下の計算は行わないので、余りは1となります。

よって、十の位は「1」となります。

###1の位の計算

2桁の整数を10で割った際の余りが一の位になります。

num = 117の場合、117 % 10 は、117を10で割った際の余りを計算結果として返します。百の位の計算と同様に、小数点以下の計算は行わないので、余りは7となります。

よって、一の位は「7」になります。
【Vue.js】フィルターとcomputedのキャッシュの違い

## はじめに
仕事で使う事になったので1からVue.jsについて学んだ。ちゃんと覚えておかないとまずそうな事を備忘録として1つ1つ残しておく。

## フィルターとcomputedのキャッシュの違い
### フィルター(filters)とは？
テキストなどを、ある決まったフォーマットにしたいという時に使うVue.jsの機能で、以下のように定義して使える。
（以下はローカル登録した場合の定義方法で、グローバル登録する書き方もあり、それは[ここ](https://github.com/yuta-katayama-23/intro-vuecli/commit/2ea78f7e53e34756d0bc90c3670b153edd018ed7#diff-27653c212e1cfe533e4eb2f7d0d3f89604c9de48a09583b4cbbbcbd08a07da79R12)を参照。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372684/f38e9347-b94e-47d9-97fe-5d7af42405e0.png)

```vue:Sample.vue
<template>
  <div>
    <!-- 省略 -->
    <h2>{{ title | upperCase }}</h2>
    <h4>{{ subTitle | lowerCase }}</h4>
  </div>
</template>

<script>
export default {
  data() {
    return {
      title: "Welcome to Tokyo",
      subTitle: "Tokyo is a great city",
    };
  },
  filters: {
    upperCase(value) {
      return value.toUpperCase();
    },
    lowerCase(value) {
      return value.toLowerCase();
    },
  },
};
</script>
```

### フィルターのキャッシュ（他のDOMが変化した時にどうなるか？）
フィルターをある要素に設定した場合、その要素が変更されていない場合でも、他の要素が変更されると再度フィルターが機能して再描画されてしまう仕組みになっている。そのため、頻繁に要素が変わるようなWebサイトでフィルターを使いすぎると処理が遅くなりサイトが重くなる可能がある。
※[【Vue.js】computedとmethodsの違い](https://qiita.com/yuta-katayama-23/items/cb1ba764d3ceddb64f9c)の通り、computedでは依存関係先が変更された時のみ再描画をするのでフィルターに比べて効率的な動きになる。
![ezgif.com-gif-maker (17).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372684/9e113a74-55e4-608a-ea69-c53caef2d9ca.gif)
動画のソースコードは以下。

```vue:Sample.vue
<template>
  <div>
    <!-- 省略 -->
    <h2>{{ title | upperCase }}</h2>
    <h4>{{ subTitle | lowerCase }}</h4>
    <p>{{ number }}</p>
    <button type="button" class="btn btn-primary" @click="number++">+1</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      title: "Welcome to Tokyo",
      subTitle: "Tokyo is a great city",
      number: 0,
    };
  },
  filters: {
    upperCase(value) {
      console.log("filters", "upperCase");
      return value.toUpperCase();
    },
    lowerCase(value) {
      return value.toLowerCase();
    },
  },
};
</script>
```

### フィルターとcomputedの使い分け
単にフォーマットしたい場面でその対象が少ないならcomputedを使う方が、速度の面から見ていい。
ただ、computedでは定義しなければならない数が多くて大変で、フィルターにしても速度的には問題なさそうである場合であればフィルターを使う。

|  | 向き・不向き |
|:-:|---|
| フィルター | 再描画が頻繁に行われるような場面では不向き<br>computedでは数が多すぎて定義できない場面では向き  |
| computed | 再描画が頻繁に行われるような場面で向き<br>描画速度を速める・処理を軽くするで向き  |

### ソースコード全体は以下

https://github.com/yuta-katayama-23/intro-vuecli/commit/1de5f03582f9fae44821cd9ecbb8cfde719ea35d

## Vue.jsの勉強メモ一覧記事へのリンク
Vue.jsについて勉強した際に書いた勉強メモ記事のリンクを集約した記事。

- https://qiita.com/yuta-katayama-23/items/dabefb59d16a83f1a1d4
Subnet Maskの正当性Check法

サブネットマスクの値が正しいかCheckするアルゴリズム。
整数で扱えるなら言語は選ばないと思う。
<pre>
int32 mask　// 整数で表記
int32 host_block = !mask

if( ( host_block & (host_block + 1) ) == 0 )
    // OK
else
    // NG
</pre>
境界値は別途手当が必要かも。。

参考：
https://kenyu-life.com/2019/01/15/n_ampersamd_n-1equal0/
Rainbowstreamインストール＆インストール直後のエラー

[Rainbowstream]は洒落たCLIのtwitterクライアントですが、最近あんまり流行っていないのか、インストール直後のエラーがの解消法で日本語の情報が見当たらなかったので、投稿します。

# rainbowstreamとは
こんな感じのCLIクライアント。会社で上司に見つからずにTwitterをやるのにとても良い笑
![Screenshot at 2021-06-22 20-41-06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613415/7e00eef5-1ee2-dae9-eb09-8db23f46cb34.png)

home - タイムライン表示
t - tweet
ls fl - フォロアー検索
h - help
q  - quit
など

詳しくは↓
https://rainbowstream.readthedocs.io/en/latest/

# インストール方法

pipでいれるだけ。。
```# pip3 install rainbowstream```

必要に応じて
```sudo apt-get install python-dev libjpeg libjpeg-dev libfreetype6 libfreetype6-dev zlib1g-dev```

# 本題 起動するとconfigファイルがないとエラーがでる

起動するとエラーメッセージがでます。また、configコマンドうっても設定もできません。

```
Your ~/.rainbow_config.json is messed up:
>>> [Errno 2] No such file or directory: '/home/user/.rainbow_config.json'
```
設定ファイルをコピーしてくる必要があります。

```
cp -i /usr/local/lib/python3.8/dist-packages/rainbowstream/colorset/config ~/.rainbow_config.json
```

ただそれだけ。。
Rocky LinuxのDocker 開発＆調査用イメージ with SSH & SFTP

#はじめに
CentOS の後継OSである Rocky Linux が正式リリースされました。
同時に Docker のベースイメージも公開されています。

**Rocky Linux ダウンロードページ**
https://rockylinux.org/download

**Rocky Linux Docker ベースイメージ**
https://hub.docker.com/r/rockylinux/rockylinux

本家のリリースに合わせて、以下 Docker の開発・調査用イメージを公開します。
使い慣れたSSH接続なら、コマンド実行の手順や、アプリインストール後の環境確認も効率的に行えると思います！
トライアル＆エラーで Docker イメージを作成するのは、もう卒業しましょう！

##公開イメージ
Rocky Linux のベースイメージにSSHとSFTPの接続機能を追加したイメージです。
簡単な使い方も付けています。

**Rocky Linux 8 開発・調査用イメージ**
https://github.com/takeyamajp/docker-rocky-sshd

**過去記事はこちら（CentOS, Ubuntu, DebianのDockerイメージ with SSH & SFTP）**
https://qiita.com/takeyamajp/items/c4294147a4a6d41c308e

コメントやGitHub, Docker Hubなどでスターを付けて頂けると励みになります。すごく。
Rustで多重起動を防ぐ

こちらの記事にインスパイアされて、私だったらこう書くかなというのを残しておきます。

https://qiita.com/mm_sys/items/2bf1207efda780250473

使うのは `flock` というシステムコールです。

[Man page of FLOCK](https://linuxjm.osdn.jp/html/LDP_man-pages/man2/flock.2.html)

これを使って実行可能ファイルそのものをロックファイルとして排他制御すれば簡単に多重起動を防げます。

Rustから `flock` を使うのは*nixのAPIをラップしたライブラリ、nixを使うと便利です。

[nix - crates.io: Rust Package Registry](https://crates.io/crates/nix)

コードはこのようになるでしょうか。


```rust
use nix::fcntl::{flock, open, FlockArg, OFlag};
use nix::sys::stat::Mode;
use nix::Result;
use std::env;
use std::thread;
use std::time::Duration;

fn main() -> Result<()> {
    // argsの0番目に実行可能ファイルの名前が入っている
    let exe = env::args().nth(0).unwrap();
    // 適当にファイルを開く
    let fd = open(exe.as_str(), OFlag::empty(), Mode::empty())?;
    // fdに対してnon blockで排他制御をする
    match flock(fd, FlockArg::LockExclusiveNonblock) {
        Ok(()) => (),
        // 本当はEAGAINかどうかを確認した方がいいが、雑でもまあいいでしょう。
        Err(e) => {
            println!("existing process!");
            return Err(e);
        }
    }

    thread::sleep(Duration::from_secs(10));
    println!("hello");
    Ok(())
}
```

これをコンパイルして実行してみると以下のように、排他制御できています。

```shell-session
$ ./target/debug/multiboot-lock&
[1] 194747
$ ./target/debug/multiboot-lock
existing process!
Error: Sys(EAGAIN)
$
hello

[1]  + done       ./target/debug/multiboot-lock
```

誰かの参考になれば
iOSでAzure Spatial Anchors のチュートリアルをやった

<blockquote class="twitter-tweet"><p lang="ca" dir="ltr">iOS で Azure Spatial Anchors<a href="https://twitter.com/hashtag/Azure?src=hash&amp;ref_src=twsrc%5Etfw">#Azure</a> <a href="https://twitter.com/hashtag/XR?src=hash&amp;ref_src=twsrc%5Etfw">#XR</a> <a href="https://t.co/bBNBPbKmCY">pic.twitter.com/bBNBPbKmCY</a></p>&mdash; 原口昂弥 (@k_haraguchi55) <a href="https://twitter.com/k_haraguchi55/status/1407305460785418249?ref_src=twsrc%5Etfw">June 22, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
## 開発環境
 + Unity 2020.3.4f1
 + iPhone 12 Pro
 + MacBook Air
 + Windows 10
 + Git
 + Mixed Reality Feature Tool 1.0.2104.3-beta
 
## やり方
### Azure Spatial Anchorsアカウントの作成
[Azureポータルにアクセス](https://portal.azure.com/)
リソースの作成をクリック
Spatial Anchorsで検索→作成



### プロジェクトをクローン
下記コマンドを入力

```
git clone https://github.com/Azure/azure-spatial-anchors-samples.git
```
### Unity
クローンしたプロジェクトを開く
ProjectからAssets\AzureSpatialAnchors.SDK\Resources\SpatialAnchorConfigを選択
作成した Azure Spatial Anchors アカウントのアカウントドメイン、アカウントID、アクセスキー(主キー)を入力
File > Build Setting
プラットフォームをiOSに切り替え
Build

### Xcode
ビルドしたフォルダ内のUnity-iPhone.xcodeprojをXcodeで開く
Unity-iPhoneを選択しプロジェクトの設定を表示
General > Deployment Info で iOS11.0を選択
Signing & Capabilities > Signing Teamを選択
デバイスを選択
![スクリーンショット 2021-06-22 20.29.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1264045/29919678-63de-195e-5e8f-94a68736f8f6.png)
再生ボタン(▶)をクリックしてデプロイ

※ MapFilePerser.sh: Permission deniedが発生した時の対処法
ターミナルを開く
下記コマンドを実行

```
chmod 777 MapFilePerser.sh
```
Azure Remote Renderingサンプルにモデル選択機能追加

#はじめに
Azure Remote Renderingとは3Dモデルを最高の品質でMixed Realityデバイスに体験できます。Azureのコンピューティング力を利用して、クラウドでレンダリング、そうしてデバイスへストリーミングとは可能です。こんな方法で各ユーザーは3Dモデルと最大の詳細で操作してコラボレーションができます。この記事で、ARRドキュメンテーションからのサンプルに機能を纏めさせていただきます。

#デモ


https://twitter.com/hf_mandak/status/1407286025886474245?s=20

#前提条件
Azure Remote Renderingチュートリアルの「チュートリアル:素材、ライト、および効果の調整」まで完成した方。

チュートリアルページ:
https://docs.microsoft.com/ja-jp/azure/remote-rendering/tutorials/unity/tutorial-landing

#アプリの使い方
このシステムスキーマはこちらです。ユーザーからポータルサイトにリクエストして、ポータルからファイルのSAS URLをリターンします。このプロダクトで[「ナレコムVR」](https://narekomu-vr.com/)のポータルサイトを使用します。さらに、ARRのSAS URIを返すAPIを独自に作成しました。

![rect835.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1156398/343e3180-01f5-2385-d75e-61139e433b7e.png)

プロジェクトで「ARR」シーンを開く。「SasDownloader」で「Endpoint」に自分のポータルサイトを入れます。先ほど説明した通り、[「ナレコムVR」](https://narekomu-vr.com/)のポータルサイトをEndpointとして使用します。「Model ID」にモデルの数を挿入して、「Model ID」を入れてください。「default」IDはAzure Remote Renderingのデフォールトのモデル「builtin:\\\Engine」です。「Model List」にモデル選択ボタンを入れてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1156398/3075f3b4-9508-a95f-ec21-f84128e00951.png)





#モデル選択ボタンの作成
モデル選択ボタンを作成するために「AppMenu」→「Menu」→「MainMenu」→「MainMenuModelTools」→「SelectModelSubMenu」→「ButtonParent」を開きます。新しいボタンを作成したら、そのモデルからコピーして「SasDownloader」に登録してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1156398/a257a652-4d85-2165-ec6b-4d2afd12280c.png)
PythonとOpenCVのみでカメラからQRコード読み取り

PythonとOpenCVのみでPCのWebカメラからQRコードを読み取っている記事が意外となかったのでやってみました。
使用環境は以下の通りです。

* MacBook Pro (15-inch, 2019)
* MacOS Catalina 10.15.7
* Python 3.9.0
* opencv-python 4.5.2.54

Pythonのインストールは済んでいる前提です。

# 1. opencv-pythonのインストール
PythonからOpenCVが使用できるopencv-pythonをpipでインストールします。

```
$ pip install opencv-python
```

# 2. QR読み取りコード
```py
import cv2

# カメラデバイス取得
cap = cv2.VideoCapture(0)
# QRCodeDetectorを生成
detector = cv2.QRCodeDetector()

while True:
    # カメラから1フレーム読み取り
    ret, frame = cap.read()

    # QRコードを認識
    data = detector.detectAndDecode(frame)

    # 読み取れたらデコードした内容をprint
    if data[0] != "":
        print(data[0])

    # ウィンドウ表示
    cv2.imshow('frame', frame)

    # Qキー押すと終了
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 終了処理
cap.release()
cv2.destroyAllWindows()
```

# 3. 実行結果
![QR_359536.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365868/093b35ff-6039-5fb2-6fb5-46274d39038b.png)
こんな感じでiPhoneにQRコードを表示させてMacBookのカメラに写しています。
![QR.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365868/402ddfa5-fd34-e82b-4ff6-4d1d28d67f67.jpeg)

```
https://qiita.com/
https://qiita.com/
https://qiita.com/
...
```

# まとめ
PythonとOpenCVだけでも少ないコードで簡単にできます。便利ですね。
上のコードの変数dataにはデコードした文字列以外にもいろいろと情報が入ってきてくれるみたいなので、それも時間があったら調べてみます。
GoogleDriveのFolderに入っているtsvをSpreadsheetに全てブチ込む方法

```js
// 設定
SPREADSHEET_ID = "1gUoqY1X4sqVf6ORcjYkIwwmtnRdR1DAZq66ovm1_gvc"
FOLDER_ID = "1f5qU0x8MBQdrB0uRZIt0WB5SooYb6pZt"

function main(){
  bulkImportTsvToSpreadSheet(FOLDER_ID, SPREADSHEET_ID)
}

function bulkImportTsvToSpreadSheet(folder_id, spreadsheet_id) {
  var spreadsheet = SpreadsheetApp.openById(SPREADSHEET_ID);
  const files = DriveApp.getFolderById(folder_id).getFiles()
  while ( files.hasNext() ) {
    const file = files.next()
    // もし csv にしたかったらここを変更↓
    // ファイルの拡張子がtsvの時もここを変更↓
    if ( file.getName().endsWith(".txt") ) {
    const values = tsvToArray(file)
    const sheet = spreadsheet.getSheetByName(file.getName()) || spreadsheet.insertSheet(file.getName())
    sheet.getRange(1, 1, values.length, values[0].length).setValues(values)
    }
  }
}

function tsvToArray(tsvFile){
  const tsvString = tsvFile.getAs(MimeType.PLAIN_TEXT).getDataAsString()
  console.log(tsvString)
  var array = []
  tsvString.split("\n").forEach(function(row){
    // もし csv にしたかったらここを変更
    const rowArray = row.split("	")
    if (rowArray.length > 1 ) {
      array.push(rowArray)
    }
  })
  return array
}
```
Android端末に直接apkとobbをインストールする方法

今回は書き出したapkとobbをインストールする方法を記載いたします。  

adbコマンドのPathを通す
===
公式サイトにアクセスして`SDK Platform-Tools`をダウンロードし
Zipファイル解凍し、個人のPathを保存している場所に移動しましょう。
（C:直下でも大丈夫です。）

[SDK Platform-Tools](https://developer.android.com/studio/releases/platform-tools)	

解凍が完了したらシステム環境変数に解凍したフォルダを追加しておきます。

コマンドプロンプトなどでadbとコマンドを入力し、
adbコマンドの説明が出れば成功です。

apkとobbをインストールする
===
Androidは開発者向けオプションでUSBデバッグを有効にしておき、PCとAndroidをUSB接続しましょう。

その後コマンドプロンプトでapkとobbを置いてあるフィルダに移動し、下記のコマンドを入力しましょう。

```
adb install {パッケージ名}.apk
```

続いてobbがある場合は下記のコマンドを入力しましょう。

```
adb push {ファイル名}.main.obb /storage/emulated/0/Android/obb/{パッケージ名}/main.{ビルド番号}.{パッケージ名}.obb
```

obbビルド番号はapkと同じものにしておかないと
アプリを起動してもobbファイルを読み込んでくれないので注意しましょう！

あとはインストールしたアプリを確認してみましょう！

以上！
Raspberry Pi Pico で Sigfox 通信

# Raspberry Pi Pico
Raspberry Pi Pico(以降ラズピコ）は、今までの Raspberry Pi とは、一線を画す製品で OS を搭載することができない、より組み込み機器よりの開発基盤になっています。
マイコンには、Raspberry Pi財団が新たに開発した ARMベースのRP2040が搭載されています。 

## ラズピコの調達
ラズピコは、スイッチサイエンス等で550円で調達可能です。
[スイッチサイエンス - Raspberry Pi Pico](https://www.switch-science.com/catalog/6900/)

ただし、こちらの製品は、ピンヘッダーが接続されていないどころか、そもそも、付属もしていません。同様に、USBケーブルも付属されておらず、本当に開発基盤のみの製品です。

Amazon 等で、ピンヘッダー取付済みの商品が販売されています。

[ヘッダー ハンダ付け済み Raspberry Pi Pico](https://www.amazon.co.jp/%E3%83%98%E3%83%83%E3%83%80%E3%83%BC-%E3%83%8F%E3%83%B3%E3%83%80%E4%BB%98%E3%81%91%E6%B8%88%E3%81%BF-Raspberry-Pi-Pico/dp/B08XV4LNLS)
今回はこちらを購入して実験を行っています。

![pico.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/716263/f82d29f3-07ee-835c-1c9b-3c8c946a7649.png)


## ラズピコのセットアップ
ラズピコは、c/c++ による開発だけではなく、Micro Python が使えるようになっていますが、今回は、c/c++ による Sigfox 通信を試してみます。

ラズピコ用のバイナリのビルドには、Raspberry Pi 4 を使用します。
環境整備に関しては、@jamjam さんの記事を参考にさせていただきました。

[初めてのRaspberry Pi Pico ① C言語でLチカ](https://qiita.com/jamjam/items/ec58f48c723006dadfcf)

# Sigfox モジュール
Sigfox の モジュールに関しては、Sigfox Breakout board BRKWS01 RC3 を使用します。
私自身が、こちらのモジュールを使用した Sigfox 通信のサンプルを別途記事にしていますので、そちらをご参照ください。
[Raspberry Pi で Sigfox 通信](https://qiita.com/kataoka_se/items/21ee9cfbc27668980b5a)

ラズピコと Sigfox モジュールは、下記のPINを使用します。

![PIN.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/716263/d46e5c9e-a53f-1d65-90ee-3cfb186091c5.png)

こちらを参照。
[Raspberry Pi Pico Pinout](https://datasheets.raspberrypi.org/pico/Pico-R3-A4-Pinout.pdf)

![IMG_8006.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/716263/dfdbaeb1-7f6f-3017-ce9d-314ab0588c76.jpeg)



# ラズピコと Sigfox モジュールの通信（UART通信）
こちら [Raspberry Pi で Sigfox 通信](https://qiita.com/kataoka_se/items/21ee9cfbc27668980b5a) では、Python から UART を制御し、ATコマンドを送ることにより、Sigfox 通信を実現しました。
前述のとおり、今回は、ネイティブコードからの制御になります。
ラズピコのセットアップを行うと、```pico/examples``` の配下に、サンプルコードが配置されます。
今回は、その中の ```uart/hello_uart``` を改造します。

```
#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/uart.h"

/// \tag::hello_uart[]

#define UART_ID uart0
#define BAUD_RATE 9600

// We are using pins 0 and 1, but see the GPIO function select table in the
// datasheet for information on which other pins can be used.
#define UART_TX_PIN 0
#define UART_RX_PIN 1

int main() {
    // Set up our UART with the required speed.
    uart_init(UART_ID, BAUD_RATE);

    // Set the TX and RX pins by using the function select on the GPIO
    // Set datasheet for more information on function select
    gpio_set_function(UART_TX_PIN, GPIO_FUNC_UART);
    gpio_set_function(UART_RX_PIN, GPIO_FUNC_UART);
    
    sleep_ms(1000 * 30);
    uart_puts(UART_ID, "AT$SF=0123456789abcdefffffffff\r");    
}

/// \end::hello_uart[]
```
BAUD_RATE を 9600 に指定して、uart_puts() にて、ATコマンドで メッセージ送信を行っています。
ATコマンド送信前に、念のため 30秒ほど wait を入れていますが、厳密にそれが必要というわけではありません。

## 送信結果
Sigfox Backend の方を見ると、先ほど送信したメッセージが Sigfox クラウドまで送信されていることが確認できます。

![Sigfox Message.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/716263/ab79117b-88d2-47ff-cd91-af7811154a8c.png)
CSS flexboxについて

###　CSS flex box について
CSSでflexboxを使用すると、要素を横並びや縦方向に並べることができる。
親要素に使用するとフレックスコンテナとなり、子要素はフレックスアイテムとなる。

###　横方向に並べる
```
display: flex;     /*デフォルトは　justify-content: flex-start;　となる。*/

    justify-content: flex-start;    /*左揃え*/
    justify-content: flex-end;      /*右揃え*/
    justify-content: center;        /*中央揃え*/
    justify-content: space-between; /*子要素同士の間に均等に間隔をあける*/
    justify-content: space-around;  /*周囲に均等に間隔をあける*/
```

###　垂直に並べる
```
display: flex;

    align-items: flex-start; /*上揃え*/
    align-items: flex-end;   /*下揃え*/
    align-items: center;     /*中央揃え*/
    align-items: baseline;   /*ベースラインを揃える*/
    align-items: stretch;    /*全ての要素の高さを揃える*/
```

### 行をそろえる(複数行)
```
display: flex;

    align-content: flex-start;    /*上揃え*/
    align-content: flex-end;      /*下揃え*/
    align-content: center;        /*中央揃え*/
    align-content: space-between; /*均等に間隔をあける*/
    align-content: space-around;  /*周囲に均等に間隔をあける*/
}
```