OmniAICreator/Qiita-1.07M huggingface dataset:
Rubyで湯婆婆を実装してみる

## はじめに
最近巷ではいろいろな言語で[湯婆婆を実装する](https://qiita.com/Nemesis/items/c7192a7c510788d2cba2)のが流行っているようですが、まだRubyではなさそうなので乗っかっておきます。

## コード
```ruby
puts "契約書だよ。そこに名前を書きな。"

name = gets.chomp

puts "フン。#{name}というのかい。贅沢な名だねぇ。"

new_name_index = rand(name.size)
new_name = name[new_name_index]

puts "今からお前の名前は#{new_name}だ。いいかい、#{new_name}だよ。分かったら返事をするんだ、#{new_name}!!"
```

## 解説
### 契約書
まずは契約書を渡します。

```ruby
puts "契約書だよ。そこに名前を書きな。"

name = gets.chomp
```

`gets`で標準入力を読み取ります。これには最後の改行も含まれているため、`chomp`で改行を取り除きます。

### 名前を奪う
```ruby
new_name_index = rand(name.size)
new_name = name[new_name_index]
```

`rand`で`0 <= n < name.size`の乱数を生成し、一文字を抜き出します。

## 実行結果
```shell-session
$ ruby yubaba.rb
契約書だよ。そこに名前を書きな。
山田太郎
フン。山田太郎というのかい。贅沢な名だねぇ。
今からお前の名前は田だ。いいかい、田だよ。分かったら返事をするんだ、田!!
```

### 何も入力しないと
本家と違い、何も入力せずEnterを押してもエラーは発生しません。

```
$ ruby yubaba.rb
契約書だよ。そこに名前を書きな。

フン。というのかい。贅沢な名だねぇ。
今からお前の名前はだ。いいかい、だよ。分かったら返事をするんだ、!!
```

ただし、Enterの代わりにCtrl+Dを押すとエラーが発生します。

```
$ ruby yubaba.rb
契約書だよ。そこに名前を書きな。
Traceback (most recent call last):
yubaba.rb:3:in `<main>': undefined method `chomp' for nil:NilClass (NoMethodError)
```
jetson nano上のDockerfileでopencv-pythonのビルドを試みるもエラー（/tmp/nano_build_opencv/build_opencv.sh 3.4.10' returned a non-zero code: 1）

jetson nano上のDockerfileでopencv-pythonのビルドを試みるもエラー

Dockerfile

```Dockerfile:Dockerfile（該当部分を抜粋）
RUN git clone https://github.com/mdegans/nano_build_opencv /tmp/nano_build_opencv
ADD build_opencv.patch /.
RUN patch -p1 /build_opencv.patch && \
    gosu jetson /tmp/nano_build_opencv/build_opencv.sh 3.4.10
```

docker build時にエラー

```
Do you wish to remove temporary build files in /tmp/build_opencv ? 
(Doing so may make running tests on the build later impossible)
The command '/bin/sh -c patch -p0 < /build_opencv.patch &&     cat /tmp/nano_build_opencv/build_opencv.sh &&     gosu jetson /tmp/nano_build_opencv/build_opencv.sh 3.4.10' returned a non-zero code: 1
```

yesコマンドで、`y`を入力することでエラーを回避

```Dockerfile:Dockerfile（該当部分を抜粋）
RUN git clone https://github.com/mdegans/nano_build_opencv /tmp/nano_build_opencv
ADD build_opencv.patch /.
RUN patch -p1 /build_opencv.patch && \
    yes | gosu jetson /tmp/nano_build_opencv/build_opencv.sh 3.4.10
```

# 参考
[コマンドの途中で聞いてくる yes を自動入力したい？それ yes で出来るよ](https://www.agent-grow.com/self20percent/2018/08/06/linux-command-auto-yes/)
ASP.NET CoreでCSVを簡単に読み書きする

ASP.NET CoreでMVCアプリをつくる際に、CSVからデータを取り込んだり、データベースの中身をCSVとして書き出すなんてニーズがたまに出てきます。業務にも頻繁に登場するCSV。これを扱いやすくするパッケージについてまとめます。

## CsvHelper
[CsvHepler](https://joshclose.github.io/CsvHelper/)は、NuGetでダウンロードできるパッケージです。使い方も簡単で、CSVをよく使うなら是非入れておきたいパッケージとなっています。

![スクリーンショット 2020-11-07 15.18.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482880/63b37922-46d2-8361-980a-54dc14f75315.png)

## CSVを読み込む
このようなCSVがあるとします。

```user.csv
Id,Name
1,Tom
2,Bob
```
CSVに対応するモデルを用意します。

```C#:Models/User.cs
public class User
{
    public int Id { get; set; }
    public string Name { get; set; }
}
```
コントローラーにCSVを読み込む処理を書きます。ここで、必要なUsingディレクティブを追加します。

```C#:Controllers/HomeController.cs
using System.Diagnostics;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using CsvHelperApp.Models;
using System.IO;
using CsvHelper;
using System.Globalization;

public IActionResult ReadCsv()
{
　 // StreamReaderにCSVのパスを渡す
 　using (var reader = new StreamReader("user.csv"))
 　using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
 　{
   　  var records = csv.GetRecords<User>();
       
　　　　// ここに読み込んだCSVを処理を書く
 　}

 　return View();
}
```
## 名前によるマッピング

名前によるマッピングも可能です。必要なUsingディレクティブを追加します。

```C#:Models/User.cs
using CsvHelper.Configuration.Attributes;

namespace CsvHelperApp.Models
{
    public class User
    {
        // ヘッダーを名前で指定することでマッピングできる
        [Name("Id")]
        public int Id { get; set; }

        [Name("Name")]
        public string Name { get; set; }
    }
}

```

エディターで確認してみると、きちんとCSVのカラムとデータが変数に格納されていることがわかります。

![スクリーンショット 2020-11-07 18.00.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482880/d8da8297-a3e6-49b7-850b-ad596fcad578.png)

### 参考
https://joshclose.github.io/CsvHelper/getting-started/
centosでログローテーションを実行


# ログローテーションをすぐ実行する場合

### 日付の修正 
    * /var/lib/logrotate/logrotate.statusを修正して1日前の日付にする

### エラーのチェック

```shell
# logrotate -dv /etc/logrotate.d/httpd
```
### ローテーションの実行

```shell
# /etc/cron.daily/logrotate
# こちらでもいける
# /usr/sbin/logrotate -f /etc/logrotate.d/httpd
```
jetson nano上で、Dockerfileでpip install xxx.whlを試みるもエラー（xxx.whl is not a supported wheel on this platform.)

jetson nano上で、Dockerfileでpip install xxx.whlを試みるもエラー


```dockerfile:Dockerfile(該当部分の抜粋）
RUN wget https://nvidia.box.com/shared/static/yhlmaie35hu8jv2xzvtxsh0rrpcu97yj.whl && \	
    mv yhlmaie35hu8jv2xzvtxsh0rrpcu97yj.whl torch-1.4.0-cp27-cp27mu-linux_aarch64.whl && \
    pip install torch-1.4.0-cp27-cp27mu-linux_aarch64.whl
torch-1.4.0-cp27-cp27mu-linux_aarch64.whl is not a supported wheel on this platform.
```

[こちら](https://qiita.com/seigot/items/9863f5711fa82bb4031b)で実績ある手順なのに、Dockerfile上だとエラーが起きる。なぜ、、、

Dockerfile上でpipバージョンを出力すると、なぜかpython3を指していた。

```
# pip --version
pip 9.0.1 from /usr/lib/python3/dist-packages (python 3.6)
```

`pip install`の代わりに、`python -m pip install`を利用すると解決した。なぜ、、、

```dockerfile:Dockerfile(該当部分の抜粋）
RUN wget https://nvidia.box.com/shared/static/yhlmaie35hu8jv2xzvtxsh0rrpcu97yj.whl && \	
    mv yhlmaie35hu8jv2xzvtxsh0rrpcu97yj.whl torch-1.4.0-cp27-cp27mu-linux_aarch64.whl && \
    python -m pip install torch-1.4.0-cp27-cp27mu-linux_aarch64.whl
```
streamlitチュートリアル　和訳

下記の和訳です。
https://docs.streamlit.io/en/latest/tutorial/create_a_data_explorer_app.html#create-an-app

# アプリを作成する
uber_pickups.py

```python

import streamlit as st
import pandas as pd
import numpy as np

st.title('Uber pickups in NYC')
```
streamlit run uber_pickups.py
自動で新しいタブが開く。

# データを取得する
```python
DATE_COLUMN = 'date/time'
DATA_URL = ('https://s3-us-west-2.amazonaws.com/'
         'streamlit-demo-data/uber-raw-data-sep14.csv.gz')

def load_data(nrows):
    data = pd.read_csv(DATA_URL, nrows=nrows)
    lowercase = lambda x: str(x).lower()
    data.rename(lowercase, axis='columns', inplace=True)
    data[DATE_COLUMN] = pd.to_datetime(data[DATE_COLUMN])
    return data

# Create a text element and let the reader know the data is loading.
data_load_state = st.text('Loading data...')
# Load 10,000 rows of data into the dataframe.
data = load_data(10000)
# Notify the reader that the data was successfully loaded.
data_load_state.text('Loading data...done!')

```
この関数は、データフレームにロードしたい行数を指定するパラメータ(nrows)を1つ受け取ります。

アプリの右上隅に、アプリを再実行するかどうかを尋ねるボタンがいくつか表示されます。常に再実行」を選択すると、保存するたびに変更内容が自動的に表示されます。

# キャッシュによる省力化
以下のように追記

``` python
@st.cache
def load_data(nrows):
```
スクリプトを保存すると、Streamlit が自動的にアプリを再実行します。このスクリプトを @st.cache で実行するのは初めてなので、何も変更はありません。キャッシュの威力を実感できるように、ファイルをもう少しいじってみましょう。

以下のように変更

``` python
# 変更前
data_load_state.text('Loading data...done!')

# 変更後
data_load_state.text("Done! (using st.cache)")
```

追加した行がすぐに出てきたのがわかりますか？一歩引いてみると、これは実際には非常に驚くべきことです。何か魔法のようなことが裏で起こっていて、それを起動するのに1行のコードで済んでいるのです。

# ローデータを調査する
以下を末尾に追記

``` python
st.subheader('Raw data')
st.write(data)
```
# ヒストグラムを描く

``` python
st.subheader('Number of pickups by hour')
hist_values = np.histogram(
    data[DATE_COLUMN].dt.hour, bins=24, range=(0,24))[0]
st.bar_chart(hist_values)
```
ざっと確認したところ、最も混雑している時間帯は17時（午後5時）のようです。

このダイアグラムを描くために、Streamlitのネイティブなbar_chart()メソッドを使用しましたが、StreamlitはAltair、Bokeh、Plotly、Matplotlibなどのより複雑なチャートライブラリをサポートしていることを知っておくことが重要です。完全なリストは、サポートされているチャートライブラリを参照してください。

# 地図にデータをプロットする
Uberのデータセットでヒストグラムを使用することで、ピックアップの最も混雑する時間帯を特定することができましたが、市内のどこにピックアップが集中しているかを把握したいとしたらどうでしょうか。このデータを棒グラフで表示することもできますが、市内の緯度・経度座標に精通していなければ、解釈するのは簡単ではありません。ピックアップの集中度を表示するために、Streamlit st.map() 関数を使って、ニューヨーク市の地図上にデータを重ね合わせてみましょう。

```python
st.subheader('Map of all pickups')
st.map(data)
```

ヒストグラムを描いた後、Uberのピックアップが最も混雑する時間帯は17:00であることがわかりました。17:00にピックアップが集中していることを示すために、マップを描き直してみましょう。

以下を末尾に追記。

``` python
hour_to_filter = 17
filtered_data = data[data[DATE_COLUMN].dt.hour == hour_to_filter]
st.subheader(f'Map of all pickups at {hour_to_filter}:00')
st.map(filtered_data)
```

# スライダーを使う
``` python
# 変更前
hour_to_filter = 17

# 変更後
hour_to_filter = st.slider('hour', 0, 23, 17)  # min: 0h, max: 23h, default: 17h
```

# ボタンを使う
``` python
# 変更前
st.subheader('Raw data')
st.write(data)

# 変更後
if st.checkbox('Show raw data'):
    st.subheader('Raw data')
    st.write(data)
```
jetson nano上でtorchvisionの使用を試みるもエラー（AttributeError: module 'torch.jit' has no attribute '_script_if_tracing'）

jetson nano上でtorchvisionの使用を試みるもエラー

```
Traceback (most recent call last):
  File "train.py", line 7, in <module>
    import torchvision
  File "/usr/local/lib/python3.6/dist-packages/torchvision-0.7.0a0+78ed10c-py3.6-linux-aarch64.egg/torchvision/__init__.py", line 5, in <module>
    from torchvision import models
  File "/usr/local/lib/python3.6/dist-packages/torchvision-0.7.0a0+78ed10c-py3.6-linux-aarch64.egg/torchvision/models/__init__.py", line 12, in <module>
    from . import detection
  File "/usr/local/lib/python3.6/dist-packages/torchvision-0.7.0a0+78ed10c-py3.6-linux-aarch64.egg/torchvision/models/detection/__init__.py", line 1, in <module>
    from .faster_rcnn import *
  File "/usr/local/lib/python3.6/dist-packages/torchvision-0.7.0a0+78ed10c-py3.6-linux-aarch64.egg/torchvision/models/detection/faster_rcnn.py", line 7, in <module>
    from torchvision.ops import misc as misc_nn_ops
  File "/usr/local/lib/python3.6/dist-packages/torchvision-0.7.0a0+78ed10c-py3.6-linux-aarch64.egg/torchvision/ops/__init__.py", line 1, in <module>
    from .boxes import nms, box_iou
  File "/usr/local/lib/python3.6/dist-packages/torchvision-0.7.0a0+78ed10c-py3.6-linux-aarch64.egg/torchvision/ops/boxes.py", line 43, in <module>
    @torch.jit._script_if_tracing
AttributeError: module 'torch.jit' has no attribute '_script_if_tracing'
```

torchvisionのバージョンを更新すると解決、これはpytorchと依存があるかもしれないので注意

```
# pip3 install torchvision==0.2.2
```

# ImportError: No module named torchvisionの場合

```
ImportError: No module named torchvision
```

インストールが必要と思われます

```
# pip install torchvision
```
RustDT(Eclipse)でコンテンツアシストがエラーになるときの対処法

# いきなり本題
タイトルの通りRustDT(というかracer?)でタグジャンプしたりオートコンプリートしようとすると図のように
![コンテンツ・アシスト - エラー](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469259/d774a4af-b583-6e1f-8fba-e8f5bc6a45ad.png)
`does not contain 'libcore' directory.`とエラーが出てしまう場合の対処法がわかったので共有したいと思います。
ちなみに根拠は何も無いので自己責任でお願いします。

# 対処法
まず`Rust 'src' Directory`はRustDTのUser Guideには`lib\rustlib\src\rust\src`にしてと書かれていますがどうもパスが変わったようなので`lib\rustlib\src\rust\library`にしてください。
次に上記パスに`libcore`という空のディレクトリを追加してください。昔がどうだったのかは知りませんが`libcore`から`core`に名前が変わったんでしょうか…？
とりあえず`println!`についてタグジャンプしたりオートコンプリートしたりできることは確認しました。

# おわりに
本家で修正してくれることを祈ります…
jetson nano上でtorch2trtの使用を試みるもエラー（ImportError: No module named torch2trt）

jetson nano上でtorch2trtの使用を試みるもエラー

```
ImportError: No module named torch2trt
```

torch2trtをインストールして解決

```
git clone https://github.com/NVIDIA-AI-IOT/torch2trt
cd torch2trt
python setup.py install
```

python3の場合は以下で解決した

```
python3 setup.py install
```

# 参考
[https://github.com/NVIDIA-AI-IOT/torch2trt](https://github.com/NVIDIA-AI-IOT/torch2trt)
jetson nano上でpytorchをimportしようとするもエラー（ImportError: No module named builtins）

jetson nano上でpytorchをimportしようとするもエラー

```
# python -c 'import torch; print(torch.__version__) '
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/torch/__init__.py", line 19, in <module>
    from ._six import string_classes as _string_classes
  File "/usr/local/lib/python2.7/dist-packages/torch/_six.py", line 23, in <module>
    import builtins
ImportError: No module named builtins
```

[こちら](https://stackoverflow.com/questions/27495752/no-module-named-builtins)や[こちら](https://forums.developer.nvidia.com/t/pytorch-for-jetson-version-1-7-0-now-available/72048)を参考に、futureをインストールして解決。

```
# pip install future
Collecting future
  Downloading https://files.pythonhosted.org/packages/45/0b/38b06fd9b92dc2b68d58b75f900e97884c45bedd2ff83203d933cf5851c9/future-0.18.2.tar.gz (829kB)
    100% |################################| 829kB 416kB/s 
Building wheels for collected packages: future
  Running setup.py bdist_wheel for future ... done
  Stored in directory: /root/.cache/pip/wheels/8b/99/a0/81daf51dcd359a9377b110a8a886b3895921802d2fc1b2397e
Successfully built future
Installing collected packages: future
Successfully installed future-0.18.2
```

```
# python -c 'import torch; print(torch.__version__) '
1.4.0a0+7f73f1d
```

# 参考
[https://stackoverflow.com/questions/27495752/no-module-named-builtins](https://stackoverflow.com/questions/27495752/no-module-named-builtins)
[ytorch-for-jetson-version-1-7-0-now-available](https://forums.developer.nvidia.com/t/pytorch-for-jetson-version-1-7-0-now-available/72048)
UtilLoggingJdbcLoggerのログ出力設定を変更したい

# 1. java.util.logging.config.fileを利用する

Doma2ではログ出力にJDBCLoggerインターフェースを利用し、その実装の一例として`UtilLoggingJdbcLogger`が提供されています。この`UtilLoggingJdbcLogger`はログ出力にJUL(`java.util.logging`)を採用しているため、ログ出力に関する設定はシステムプロパティ`java.util.logging.config.file`が利用できます。

```properties:logging.properties
handlers= java.util.logging.ConsoleHandler, java.util.logging.FileHandler

java.util.logging.FileHandler.level = INFO
java.util.logging.FileHandler.pattern = logging_by_propertiesfile.log
java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter

java.util.logging.ConsoleHandler.level = INFO
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
```

たとえば上記のような`logging.properties`があって、これを`UtilLoggingJdbcLogger`の設定としたい場合、`-Djava.util.logging.config.file=\path\to\logging.properties`とすればよいです。

# 2. java.util.logging.config.fileを利用する

システムプロパティファイルを使わず、自分で`UtilLoggingJdbcLogger`を拡張することもできます。

まず`UtilLoggingJdbcLogger`を継承したクラスを作成します。このときログ出力の設定は`super.logger` (JULのインスタンス) に対して実施します。

```java:MyUtilLoggingJdbcLogger.java
public class MyUtilLoggingJdbcLogger extends UtilLoggingJdbcLogger {
    public MyUtilLoggingJdbcLogger() {
        try {
            Formatter formatter = new SimpleFormatter();

            Handler consoleHandler = new ConsoleHandler();
            consoleHandler.setFormatter(formatter);
            consoleHandler.setLevel(Level.INFO);

            Handler fileHandler = new FileHandler("logging_by_class.log");
            fileHandler.setFormatter(formatter);
            fileHandler.setLevel(Level.INFO);

            super.logger.addHandler(consoleHandler);
            super.logger.addHandler(fileHandler);
        } catch (SecurityException | IOException e) {
            e.printStackTrace();
        }
    }
}
```

あとはDoma2のConfigクラスに作成した`MyUtilLoggingJdbcLogger`を使うよう設定します。具体的には`getJdbcLogger`メソッドをオーバライドして、`MyUtilLoggingJdbcLogger`インスタンスを戻り値とするだけです。

```java:AppConfig.java
@SingletonConfig
public class AppConfig implements Config {
    private final JdbcLogger logger;

    private AppConfig() {
        logger = new MyUtilLoggingJdbcLogger();
    }

    @Override
    public JdbcLogger getJdbcLogger() {
        return logger;
    }
}

```

# 環境情報

- java: openjdk version "11.0.3" 2019-04-16
- doma: 2.42.0
jetson nano上でrospy使用を試みるもエラー（ImportError: No module named rospy）

jetson nano上でrospy使用を試みるもエラー

```
# python inference_from_image.py --pretrained_model ../../experiments/models/checkpoints/sim_race_test.model_epoch\=20.pth
Traceback (most recent call last):
  File "inference_from_image.py", line 2, in <module>
    import rospy
ImportError: No module named rospy
```

環境変数が足りない可能性がある。以下を実行して解決。

```
source /opt/ros/melodic/setup.bash
```
Linux上のサイズの大きなファイルをコマンドラインから探す

Linux上のサイズの大きなファイルをコマンドラインから探す

```bash
カレントディレクトリ配下の100MB以上のファイルを探す
$ find ./ -size +100M | xargs ls -lh

サイズ大-->小の順番にソート（昇順ソート）
$ find ./ -size +100M | xargs ls -lhS

サイズ小-->大の順番にソート（降順ソート）
$ find ./ -size +100M | xargs ls -lhSr

カレントディレクトリの各ファイルのサイズを出力する（ディレクトリ含む）
$ ls | xargs du -sh

カレントディレクトリのサイズを出力する
$ du -sh
```
jetson jetpack4.3 でdocker使用を試みるもエラー(docker: Error response from daemon: OCI runtime create failed: container_linux.go:345: starting container process caused ...)

jetson jetpack4.3 でdocker使用を試みるもエラー

```
$ sudo docker run --runtime nvidia --network host -it -e DISPLAY=$DISPLAY -v /tmp/.X11-unix/:/tmp/.X11-unix nvcr.io/nvidia/l4t-ml:r32.4.4-py3
Unable to find image 'nvcr.io/nvidia/l4t-base:r32.3.1' locally
r32.3.1: Pulling from nvidia/l4t-base
...
docker: Error response from daemon: OCI runtime create failed: container_linux.go:345: starting container process caused "process_linux.go:430: container init caused \"process_linux.go:413: running prestart hook 0 caused \\\"error running hook: exit status 1, stdout: , stderr: exec command: [/usr/bin/nvidia-container-cli --load-kmods configure --ldconfig=@/sbin/ldconfig.real --device=all --compute --compat32 --graphics --utility --video --display --pid=12846 /var/lib/docker/overlay2/2d4c22c59f99d4716784fb5ef7b2ff364430858e2d7b88407d1fb1498a134ca3/merged]\\\\nnvidia-container-cli: mount error: file creation failed: /var/lib/docker/overlay2/2d4c22c59f99d4716784fb5ef7b2ff364430858e2d7b88407d1fb1498a134ca3/merged/usr/lib/libvisionworks.so: file exists\\\\n\\\"\"": unknown.
```

**nvcr.io/nvidia/l4t-ml:r32.4.4-py3** コンテナは、jetpack4.4以降しか対応してないみたいだった。
jetpack4.4を使用して解決。

> [https://ngc.nvidia.com/catalog/containers/nvidia:l4t-ml](https://ngc.nvidia.com/catalog/containers/nvidia:l4t-ml)
> note: the l4t-ml containers require JetPack 4.4 or newer

# 参考
[https://ngc.nvidia.com/catalog/containers/nvidia:l4t-ml](https://ngc.nvidia.com/catalog/containers/nvidia:l4t-ml)
jetson nanoへのopencv-pythonインストール時にエラー(ModuleNotFoundError: No module named 'skbuild')


jetson nanoへのopencv-pythonインストール時にエラー

```
# python3 -m pip install opencv-python
Collecting opencv-python
  Downloading https://files.pythonhosted.org/packages/30/46/821920986c7ce5bae5518c1d490e520a9ab4cef51e3e54e35094dadf0d68/opencv-python-4.4.0.46.tar.gz (88.9MB)
    100% |################################| 88.9MB 2.7kB/s 
    Complete output from command python setup.py egg_info:
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "/tmp/pip-build-vc_ucm46/opencv-python/setup.py", line 9, in <module>
        import skbuild
    ModuleNotFoundError: No module named 'skbuild'
    
    ----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-vc_ucm46/opencv-python/
```

ソースからビルドで解決。でもこれは8時間くらい掛かった、、、

```
git clone https://github.com/mdegans/nano_build_opencv
cd nano_build_opencv
./build_opencv.sh
```

swapファイル6GB追加が要りそう。
（ない場合はメモリ枯渇でビルドエラーになることがありました。8時間後にビルドエラーは辛い）

```
git clone https://github.com/JetsonHacksNano/installSwapfile
cd installSwapfile
./installSwapfile.sh
```


# 参考
[pip installでModuleNotFoundError: No module named ‘skbuild’が出た時](https://omohikane.com/pip-error-skbuild/)
[https://github.com/mdegans/nano_build_opencv](https://github.com/mdegans/nano_build_opencv)
[git clone https://github.com/JetsonHacksNano/installSwapfile](git clone https://github.com/JetsonHacksNano/installSwapfile)
Ansibleで利用頻度の高いコマンド集

###バージョン確認
```
# ansible --version
```

###インベントリに記述されているホスト群を参照
```
# ansible node1 --list-hosts
```

###モジュールを確認
```
# ansible-doc -l               #すべてのモジュールを確認
# ansible-doc -l | grep        #モジュールを探す
# ansible-doc [モジュール名]    #特定のモジュールを調べる
```

###モジュールの実行
```
# ansible [ホスト名orグループ名] -m [モジュール]
ex) ansible node1 -m ping
```

###Linuxコマンドを実行
```
# ansible [ホスト名orグループ名] -m command -a "[実行コマンド]"
ex) ansible node1 -m command -a "rpm -qa"
```

###ymlファイルの構文チェック
```
ansible-playbook --syntax-check [ファイル名]
```

###プレイブック実行
```
ansible-playbook [ファイル名]
```

###ファクト確認
```
ansible [ホスト名orグループ名] -m setup
ansible [ホスト名orグループ名] -m setup 'filter=[変数名]'     #特定のファクトを調べる
ansible [ホスト名orグループ名] -m setup | grep                #特定のファクトを調べる
```
※ファクト：Ansible によってターゲットノードから自動的に収集される変数

###新規ロールのディレクトリ作成
```
ansible-galaxy init --offline roles/[ロール名]
```
jetson nano上でpandasのバージョンアップを試みるもエラー（RuntimeError: Cannot cythonize without Cython installed.）


jetson nano上でpandasのバージョンアップを試みるもエラー

jetpack4.4.1 pandasのデフォルトバージョンは以下だった

```
$ python3 -c "import pandas as pd ;print(pd.__version__);"
0.22.0
```

以下の通りバージョンアップを試みるもエラー

```
$ pip3 install -U pandas
Collecting pandas
  Downloading https://files.pythonhosted.org/packages/09/39/fb93ed98962d032963418cd1ea5927b9e11c4c80cb1e0b45dea769d8f9a5/pandas-1.1.4.tar.gz (5.2MB)
    100% |████████████████████████████████| 5.2MB 76kB/s 
    Complete output from command python setup.py egg_info:
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "/tmp/pip-build-x6hm0bxt/pandas/setup.py", line 792, in <module>
        setup_package()
      File "/tmp/pip-build-x6hm0bxt/pandas/setup.py", line 762, in setup_package
        ext_modules=maybe_cythonize(extensions, compiler_directives=directives),
      File "/tmp/pip-build-x6hm0bxt/pandas/setup.py", line 519, in maybe_cythonize
        raise RuntimeError("Cannot cythonize without Cython installed.")
    RuntimeError: Cannot cythonize without Cython installed.
    
    ----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-x6hm0bxt/pandas/
```

以下パッケージをインストールする

```
pip3 install cython
pip3 install numpy
```

pandasの再バージョンアップを試みると解決できていた。

```
$ pip3 install -U pandas
Collecting pandas
  Using cached https://files.pythonhosted.org/packages/09/39/fb93ed98962d032963418cd1ea5927b9e11c4c80cb1e0b45dea769d8f9a5/pandas-1.1.4.tar.gz
Collecting numpy>=1.15.4 (from pandas)
Collecting python-dateutil>=2.7.3 (from pandas)
  Downloading https://files.pythonhosted.org/packages/d4/70/d60450c3dd48ef87586924207ae8907090de0b306af2bce5d134d78615cb/python_dateutil-2.8.1-py2.py3-none-any.whl (227kB)
    100% |████████████████████████████████| 235kB 425kB/s 
Collecting pytz>=2017.2 (from pandas)
  Downloading https://files.pythonhosted.org/packages/12/f8/ff09af6ff61a3efaad5f61ba5facdf17e7722c4393f7d8a66674d2dbd29f/pytz-2020.4-py2.py3-none-any.whl (509kB)
    100% |████████████████████████████████| 512kB 595kB/s 
Collecting six>=1.5 (from python-dateutil>=2.7.3->pandas)
  Downloading https://files.pythonhosted.org/packages/ee/ff/48bde5c0f013094d729fe4b0316ba2a24774b3ff1c52d924a8a4cb04078a/six-1.15.0-py2.py3-none-any.whl
Building wheels for collected packages: pandas
  Running setup.py bdist_wheel for pandas ... -/
done
  Stored in directory: /home/jetson/.cache/pip/wheels/45/5e/9b/1e8dbba01915fb08523e64dd84e7eff94e5da6ea9eba128bf5
Successfully built pandas
Installing collected packages: numpy, six, python-dateutil, pytz, pandas
Successfully installed numpy-1.19.4 pandas-1.1.4 python-dateutil-2.8.1 pytz-2020.4 six-1.15.0
$ python3 -c "import pandas as pd ;print(pd.__version__);"
1.1.4
```

# 参考
[https://stackoverflow.com/questions/15175135/build-scipy-error-cythonize-failed](https://stackoverflow.com/questions/15175135/build-scipy-error-cythonize-failed)
jetson nano上で pip install xxx.whl を試みるもエラーになりました(.whl is not a valid wheel filename)

jetson nano上で pip install xxx.whl を試みるもエラーになりました

```
# wget https://nvidia.box.com/shared/static/yhlmaie35hu8jv2xzvtxsh0rrpcu97yj.whl
# pip install yhlmaie35hu8jv2xzvtxsh0rrpcu97yj.whl 
yhlmaie35hu8jv2xzvtxsh0rrpcu97yj.whl is not a valid wheel filename.
```

取得したバイナリのファイル名のフォーマットを直して解決

```
# wget https://nvidia.box.com/shared/static/yhlmaie35hu8jv2xzvtxsh0rrpcu97yj.whl -O  torch-1.4.0-cp27-cp27mu-linux_aarch64.whl
# pip install torch-1.4.0-cp27-cp27mu-linux_aarch64.whl
yhlmaie35hu8jv2xzvtxsh0rrpcu97yj.whl is not a valid wheel filename.
```

# 参考
[pytorch-for-jetson-version-1-7-0-now-available/72048](https://forums.developer.nvidia.com/t/pytorch-for-jetson-version-1-7-0-now-available/72048)
jetson nano上で pip install pytorch を試みるとエラーになりました(error: package directory 'torch/cuda' does not exist)

jetson nano上で pip install pytorch を試みるとエラーになりました

```
# pip install torch       
Collecting torch
  Downloading https://files.pythonhosted.org/packages/f8/02/880b468bd382dc79896eaecbeb8ce95e9c4b99a24902874a2cef0b562cea/torch-0.1.2.post2.tar.gz (128kB)
    100% |################################| 133kB 750kB/s 
    Complete output from command python setup.py egg_info:
    running egg_info
    creating pip-egg-info/torch.egg-info
    writing requirements to pip-egg-info/torch.egg-info/requires.txt
    writing pip-egg-info/torch.egg-info/PKG-INFO
    writing top-level names to pip-egg-info/torch.egg-info/top_level.txt
    writing dependency_links to pip-egg-info/torch.egg-info/dependency_links.txt
    writing manifest file 'pip-egg-info/torch.egg-info/SOURCES.txt'
    error: package directory 'torch/cuda' does not exist
    
    ----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-7PRgOy/torch/

```

[こちら](git clone http://github.com/dusty-nv/jetson-inference)の記事を見つけるも再びエラー

```
git clone http://github.com/dusty-nv/jetson-inference
cd tools
./install-pytorch.sh 
# [jetson-inference]  Package selection status:  0
[jetson-inference]  Packages selected for download:  1
[jetson-inference]  invalid PyTorch version selected:  PyTorch python27
 
[jetson-inference]  errors encountered during installation, exiting with code 1
[jetson-inference]  to run this tool again, use the following commands:
 
    $ cd <jetson-inference>/build
    $ ./install-pytorch.sh
```

[こちら](https://forums.developer.nvidia.com/t/pytorch-for-jetson-version-1-7-0-now-available/72048)を参考にインストールできました。

```
# wget https://nvidia.box.com/shared/static/yhlmaie35hu8jv2xzvtxsh0rrpcu97yj.whl
# mv yhlmaie35hu8jv2xzvtxsh0rrpcu97yj.whl torch-1.4.0-cp27-cp27mu-linux_aarch64.whl 
# pip install torch-1.4.0-cp27-cp27mu-linux_aarch64.whl 
Processing ./torch-1.4.0-cp27-cp27mu-linux_aarch64.whl
Installing collected packages: torch
Successfully installed torch-1.4.0a0+7f73f1d
```

# 参考
[pytorch-for-jetson-version-1-7-0-now-available/72048](https://forums.developer.nvidia.com/t/pytorch-for-jetson-version-1-7-0-now-available/72048)
[git clone http://github.com/dusty-nv/jetson-inference](git clone http://github.com/dusty-nv/jetson-inference)
DBeaverからローカルのMySQLに接続できない問題への対処法

![f3f5c080-808b-11ea-9713-2bea65875d95.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102978/d3e2ef9f-3fb6-d935-75c3-a5235f3cc797.png)


ローカルにMySQLを構築し、DBeaver（DBクライアント）から接続を行う際に2つエラーが生じたので、エラーの原因と回避方法をメモ書き程度ですが記録します。


# ■ エラー内容
今回は以下2種類のエラーについて解説します。

1. caching_sha2_passwordのエラーが出力される。
2. Public Key Retrieval is not allowedのエラーが出力される。




# ■ caching_sha2_passwordのエラーが出力される。

### エラーが発生する条件
1. ローカルで起動しているMySQLがバージョン8系である。
2. 起動プロファイルを「MySQL5」で作成してしまっている。

この場合、「caching_sha2_password」エラーが出力されます。


### 対処法
1. DBeaverで接続プロファイル作成時に「MySQL5」ではなく「MySQL」を選択します。

![1c1c2e2398ecb8df6472c4355c2cb62a.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102978/6baf54bd-21b2-ef93-8ff4-8f2195148a5c.jpeg)


なお、接続時にドライバーのDLを推奨された際は、指示に従いドライバーをDLしてください。

MySQLはバージョン8系から、より安全な接続を提供するためにSHA-256を利用した暗号化と認証方式を提供しています。このエラーはより安全な接続方式を利用するためにクライアント側でもMySQLの推奨設定可能とするためのものです。




# ■ Public Key Retrieval is not allowedのエラーが出力される。

### エラーが発生する条件
1. caching_sha2_passwordを利用してMySQLに接続しようとしている。
2. クライアントとDBサーバー間の通信経路がTLSで保護されていない。


### 対処方
1. 接続先プロファイルのドライバー設定からallowPublicKeyRetrievalをtrueに設定します。


![0454187a8ade5aa17af842b30931cbae.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102978/eb06e0f4-62a8-9aee-47fc-78759d5964f7.jpeg)


通常MySQLでは、caching_sha2_passwordを利用してDBに接続する場合は、通信経路の保護が推奨されておりデフォルトでは保護なしでの接続はできないようになっています。この設定をtrueにすることで保護されていない環境下でもcaching_sha2_passwordを利用した接続が可能になりエラーを回避できます。
なお無論ですが、通信経路が保護されていない環境ではMITMなどの攻撃に脆弱であり、開発者自身が安全性を保証する必要があります。




# ■ 参考資料
https://stackoverflow.com/questions/50379839/connection-java-mysql-public-key-retrieval-is-not-allowed
SvelteでWebコンポーネントを開発したい。けどDid you forget the 'customElement: true' compile option?が表示されてしまう。

## 背景
ここ5年ほどはAngular大好きできてましたし、今でも好きなのは変わらないのですが、どうしてもバンドルサイズの大きさだけは玉に瑕で、新バージョンが出るたびにどれだけ小さくなるか期待するのですが、まだまだかなという感想です。もちろん高機能故なのでしょうがないのですけど。。。

ってことでWebコンポーネントを作成する機会があったので、Angular Elementsはあるのを知りつつSvelteに浮気してみました。
Svelteは去年あたりから気になってはいたのですが、[今年の夏にTypescriptを公式サポート](https://svelte.dev/blog/svelte-and-typescript)したことで、俄然使ってみたかったからです。

## プロジェクトの作成
私はVS Codeで開発するので`Svelte for VS Code`プラグインを追加して起きます。
そしてターミナルで以下を実行します。

```
$ npx degit sveltejs/template sample-svelte-component
$ cd sample-svelte-component/
$ node scripts/setupTypeScript.js
$ npm install
```

Javascript用の雛形プロジェクトから、スクリプトを実行してTypescript用に変換するんですね。すると以下のようなプロジェクトができあがります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387890/179bfa73-e7b9-d5e6-6955-d6e84dd6b21a.png)

なお、今回使用している主なバージョンは以下の通りです。

|モジュール|バージョン|
|---|---|
|svelte|3.29.4|
|svelte-check|1.1.11|

## Webコンポーネントにする
[ドキュメント](https://svelte.dev/docs#Custom_element_API)によると、Webコンポーネントを作成するには

* コンパイルオプションで`customElement: true`を指定する。
    * 雛形プロジェクトだとrollupでビルドしているので、rollup.config.jsで指定することになります。
        
        ```javascript
	plugins: [
	    svelte({
	        customElement: true, // <- 追記
	        // enable run-time checks when not in production
	        dev: !production,
        ```
* .svelteファイル中で`<svelte:options tag="sample-svelte-component"/>`のようにtag属性で要素名を指定する。

だそうです。
あと雛形に依存した修正として

* `main.ts`内でbody要素配下にインスタンスを追加しているコードをコメントアウトしました。

    ```typescript
    import App from './App.svelte';
    
    // const app = new App({
    // 	target: document.body,
    // 	props: {
    // 	    name: 'world'
    // 	}
    // });

    export default App; // <- ここも意味があるか判らないけどappからAppに変更
    ```

* index.htmlにWebコンポーネントの要素名を追加しました。

    ```html
    <body>
        <sample-svelte-component name="world">
        </sample-svelte-component>
    </body>
    ```

を行って`npm run dev`を実行すると動作を確認できます。

## svelte:optionsのtag属性にWarningが表示される
ここで件名に書いた本題なのですが、VS CodeでApp.svelteを見ると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387890/192cdee9-e6f9-aff5-d7fd-bc64a8cc9a05.png)
が表示されて非常に気になります。`Svelte for VS Code`プラグインの問題かと思ったら、`npm run validate`を実行しても同じWarningが表示されます。

しかし、'npm run build'すればコンパイルは正常終了しますし、roll.config.jsから'customElement: true'の設定を消して実行すれば同じWarningが表示されるので、設定が間違ってる訳ではない筈です。

そこで実際に問題があれば`npm run dev`でも'npm run build'でもWarningが表示されるので、VS Codeの設定で当該Warningを無視するようにしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387890/70a7fa19-9ee2-4fd8-3e9a-2cfcd6243cc6.png)

## 最後に
ちなみに`npm run validate`でも上記の問題は発生してしまいます。
まだまだ開発環境が充実しているとは言えませんが、注目度から言って、今後の発展が期待できるのは間違いないと思います。
ESP32にPlatformIO IDEをつかって書き込む話


##はじめに
普段マイコンの書き込みには[Arudino IDE](https://www.arduino.cc/en/software)を使ったり同サイト内のWeb Editorを使ったりしていたが…
**アプリのほうは個人的に使いづらい**
**Web Editorはクラウド型なので便利で使いやすいけどログインの処理とかが面倒くさい**
みたいなことを感じてたので今回[KeeYees ESP32 ESP-32S 開発ボード](https://www.amazon.co.jp/KeeYees-ESP-32S-Bluetooth%E3%83%87%E3%83%A5%E3%82%A2%E3%83%AB%E3%83%A2%E3%83%BC%E3%83%89%E5%AF%BE%E5%BF%9C-ESP-WROOM-32%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E5%86%85%E8%87%93-%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%AD%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%A9/dp/B07QC4WSTY)をAmazonで衝動的にポチッたついでにVSCode + PlatformIOでサンプルプログラムを書き込んでみた


##環境
OSはwindows
VSCodeとPlatformIOはインストール済み

##サンプルプログラム
```cpp:SimpleTime.cpp
#include <WiFi.h>
#include "time.h"

const char* ssid       = "your_ssid";
const char* password   = "your_pass";

const char* ntpServer = "pool.ntp.org";
const long  gmtOffset_sec = 3600;
const int   daylightOffset_sec = 3600;

void printLocalTime()
{
  struct tm timeinfo;
  if(!getLocalTime(&timeinfo)){
    Serial.println("Failed to obtain time");
    return;
  }
  Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S");
}

void setup()
{
  Serial.begin(115200);
  
  //connect to WiFi
  Serial.printf("Connecting to %s ", ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      Serial.print(".");
  }
  Serial.println(" CONNECTED");
  
  //init and get the time
  configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
  printLocalTime();

  //disconnect WiFi as it's no longer needed
  WiFi.disconnect(true);
  WiFi.mode(WIFI_OFF);
}

void loop()
{
  delay(1000);
  printLocalTime();
}
```
サンプルプログラムにはwifiにつなげて時間を表示するプログラムを選択

##手順
PlatformIOはVSコードからわりかし簡単にインストールできる
![Pla.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/861365/66a8d99c-8bdb-21da-ceee-db794c47247b.jpeg)

が+New Projectのときのボード選択ありすぎ...どれだこれ？
とりあえずesp32devを選択
platfomは02:espressif8266と32:espressif32で分かれているので注意が必要かも今は大体WROOM-32が販売してるとおもうのでespressif8266は使わないかな？
![plo.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/861365/87501cb2-1847-dacc-5249-be0f16efbfd5.jpeg)

プログラムをの名前は適当に入力

先ほどのサンプルプログラムをsrcの中のmain.cppに入力
![plo2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/861365/6af6724d-78b7-8a8b-d515-0d1ee5534c18.jpeg)

platformio.ini内にモニタースピードとアップロードスピードを設定

```ini:platformio.ini
[env:esp32dev]
platform = espressif32
board = esp32dev
framework = arduino
monitor_speed = 115200
upload_speed = 921600
```
モニタースピードは入れないと表示が文字化けするし
アップロードスピードは自分の環境だといれないと書き込みがタイムアウトで失敗することが多かった
 
VSCodeの左下のバーから
✓：build
→：uploadをおこなう
![plo3.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/861365/b3d47e93-af33-626e-6ee3-78016e640b51.jpeg)

無事成功したらserialmonitorから結果が見れます
![plo4.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/861365/dd9c6be7-0188-0452-59ab-326c81681ec8.jpeg)

##まとめ
数回PlatformIOは触ったことがあったがやっぱり純正より使いやすいしカッコいい（笑）
つぎはこの開発環境とESP32で温度検知をやってみようとおもった
SalesforceのCLIに登録した組織情報をリストから消したい

有効期限が過ぎたものをsfdxのリストから消したいときに打つコマンドです。
以下で`sfdx force:org:list`から消すことができます。

```bash
sfdx force:auth:logout -u ALIAS
```
以下の例で`HOGEHOGE`を消したいときは、`sfdx force:auth:logout -u HOGEHOGE`で消えてくれるはずです。

|  |ALIAS          |USERNAME                       |ORG ID              |CONNECTED STATUS|
|:--|:--|:--|:--|:--|
|(D)  |TEST     |test@test.test       |XXXXXXXXXXXXXXXXXX  |Connected|
|     |HOGEHOGE           |hogehoge@hogehoge.com      |XXXXXXXXXXXXXXXXXX  |RefreshTokenAuthError|
|     |PIYOPIYO      |piyopiyo@piyopiyo.piyopiyo            |XXXXXXXXXXXXXXXXXX  |RefreshTokenAuthError|

実用的なコマンドはまとまっている印象ですが、
回数は少ないですが、こういうお掃除系のコマンドも欲しい場面ありますね。
jetson nano上でpytorchを使うもエラー（Attempted to read a PyTorch file with version 3, but the maximum supported version for reading is 2. Your PyTorch installation may be too old. ）

jetson nano上でpytorchを使うもエラー

```
please report a bug to PyTorch. Attempted to read a PyTorch file with version 3, but the maximum supported version for reading is 2. Your PyTorch installation may be too old. (init at ../caffe2/serialize/inline_container.cc:132)
```

python3 pytorchで一度作成したモデルを、python pytorchで利用していることが原因だった。
pytorchのバージョンを確認ののち、バージョンを同じにしたら解決。

```
# python -c 'import torch; print(torch.__version__) '
1.4.0a0+7f73f1d
# python3 -c 'import torch; print(torch.__version__) '
1.6.0
```

[こちら](https://forums.developer.nvidia.com/t/pytorch-for-jetson-version-1-7-0-now-available/72048)を参考に同じバージョンをインストールした。

# 参考
[pytorch-for-jetson-version-1-7-0-now-available](https://forums.developer.nvidia.com/t/pytorch-for-jetson-version-1-7-0-now-available/72048)
[jetson nanoにpytorch+cuda10.2の環境構築をするのはしんどすぎる【2020.09.01時点】~自作運転支援システムへの道~](https://qiita.com/m_tani_july/items/45f44f1dbda1841fdba1)
アニメーション

```html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>My CSS Animation</title>
  <link rel="stylesheet" href="css/styles.css">
</head>
<body>
  <span class="btn">OK</span>
  
  <script> </script>
</body>
</html>
```

```css
body {
  padding: 64px;
}

.btn {
  padding: 16px 32px;
  background: hsl(200, 100%, 40%);
  color: #fff;
  border-radius: 4px;
  box-shadow: 0 1px 4px rgba(0, 0, 0, 0.1);
  cursor: pointer;
  
  transition: background .3s;
}

.btn:hover {
  background: hsl(200, 100%, 45%);
}

```

デモ
http://samples.dotinstall.com/s/basic_css_animation_v2/51816/MyCSSAnimation/index.html
AWSについていろいろ

#はじめに

こちらではAWS機能について書いていきたいと思います。
公式ドキュメントやAWS認定試験（ソリューションアーキテクトやDevOpsなど）の勉強教材など細かい内容をかかず、ざっくりとした内容で。
試験などに興味はないし！公式ドキュメントなど長ったらしくて読めん！
という方に向けに作っていきたいと思います。
(私の備忘録も兼ねて)

写真はつけられればつけます。(Qiitaの制限の範囲内で)

こんかいは環境やサービスというより語録的な内容になります

#環境
AWS

#グローバルインフラストラクチャ
世界中にデータセンターがあり、それを利用することになる
大きな区分から
・リージョン
・AZ
・エッジロケーション

https://aws.amazon.com/jp/about-aws/global-infrastructure/regions_az/?p=ngi&loc=2
#リージョン
国や地域単位であるAWS拠点お国の法律に基づく内容になるのでどこのリージョンを使うかは調べなければならない
日本には東京リージョンと大阪ローカルリージョンがある。
https://aws.amazon.com/jp/about-aws/global-infrastructure/
![スクリーンショット 2020-11-07 16.46.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608443/6a6a63c7-019a-d7d9-b863-509c4a70a353.png)

基本的にはリージョンどうしは繋がっていないが
障害時つなげたりはする。


##リージョンによってなにが違うの？
料金とシステム
米国東部(バージニア北部)だと最新のサービスが使えたりする。

##リージョン間で可能な連携
・AWS Direct Connect Gateway経由での接続
・インターリージョンVPC　Peeringでの接続
・EC２リージョン間でのAMIのコピー
・S３リージョン間でのレプリケーション
・RDSリージョン間でのリードレプリカ
・DynamoDBリージョン間でのレプリカライブラリ
・Route53DNSフェイルオーバー

#AZ(アベイラビリティーゾーン)
ひとつのリージョンのひとつ中に複数あるいわゆるデータセンターになっている
AZ同士は低レイテンシーのリンクで接続されている。
そのため**サービスによってAZを跨げるか跨げないかが違う**
障害などに備えて複数のAZを使ってシステム構成をすべき。

#エッジロケーション
キャッシュデータなどを利用するさに小さなエンドポイントになる拠点
・CloudFlont
・Lambdaエッジ
https://aws.amazon.com/jp/cloudfront/features/

![スクリーンショット 2020-11-07 17.18.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608443/5a1be572-4e99-1b8b-ca19-7d964221a45b.png)
jetson nano上にopencv-python3のインストールを試みるもエラー（ModuleNotFoundError: No module named 'skbuild'）

jetson nano上にopencv-python3のインストールを試みるもエラー

```
# python3 -m pip install opencv-python
Collecting opencv-python
  Downloading https://files.pythonhosted.org/packages/30/46/821920986c7ce5bae5518c1d490e520a9ab4cef51e3e54e35094dadf0d68/opencv-python-4.4.0.46.tar.gz (88.9MB)
    100% |################################| 88.9MB 2.7kB/s 
    Complete output from command python setup.py egg_info:
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "/tmp/pip-build-vc_ucm46/opencv-python/setup.py", line 9, in <module>
        import skbuild
    ModuleNotFoundError: No module named 'skbuild'
    
    ----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-vc_ucm46/opencv-python/
```

以下の通りソースコードからビルドするとよい

```
git clone https://github.com/mdegans/nano_build_opencv
cd nano_build_opencv
./build_opencv.sh
```

# 参考
[pip installでModuleNotFoundError: No module named ‘skbuild’が出た時](https://omohikane.com/pip-error-skbuild/)
[https://github.com/mdegans/nano_build_opencv](https://github.com/mdegans/nano_build_opencv)
[error-could-not-build-wheels-for-opencv-python-which-use-pep-517-and-cannot-be](https://stackoverflow.com/questions/63732353/error-could-not-build-wheels-for-opencv-python-which-use-pep-517-and-cannot-be)
Azure Logic Appsを使ってDatabaseからGoogle spreadsheetに結果を出力

# 背景
Google Spreadsheetを使ってMapなどに連携している既存環境がある。
そろそろデータも多くなってきたので、参照元になっているSpreadsheetをDatabase化しようと思う。
参照している各GoogleMapやSpreadsheetまで手をいれるのはまだしたくない。
あと、プログラミングをあまりしない人でも、GUIである程度カスタマイズできるようにしたい。

そういった背景で、作ってみようと思った次第。
やってみて、思いのほかはまったので、アウトプットしておきます。

# ざっくり構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311866/2c1e4172-6e82-3ce8-08e5-88ff30822cee.png)
とりあえず、HttpTriggerにしてみました。
TriggerはDatabaseの更新頻度によるのかな。

# はまったポイント
## 1. SQL Databaseとのコネクト
Azure Acitve Directory認証を構築しようとしたけれど、うまくいかず。。。
認証系の勉強が必要ですね。
結果、SQL認証で実装。

## 2. SQL Databaseアクションの選択
テーブルのデータを取得するアクションがない。
仕方なくクエリ実行を選択。。。

## 3. HTTP要求の受信
POSTだけと知らず、
GETを受け付けるTriggerがあるのか調べるかな。

## 4. Google Spreadsheetコネクト
SQL Serverコネクトと同じような処理しかできないので、部分的な更新などができない。
探したところDriveコネクトでファイル自体を更新するしかない。

# 今後
すこしずつ改修していくかな
Headless Chromeでブラウザの位置情報を設定する方法

スクレイピングする際にはサイトによってブラウザの(地理)位置情報を求められる場合があります。この記事は、Selenium+Headless Chrome+Pythonを用いた場合の解決方法についての個人的メモです。

##環境
EC2 (Amazon Linux 2 AMI)

##参考
[Setting sensors (location) in headless Chrome](https://stackoverflow.com/questions/46713871/setting-sensors-location-in-headless-chrome)

##ツール
・Selenium
・Chrome driver(85.0.4183.87)
・Python3(3.6.2)


##位置情報が必要になった理由

とあるサイトをHeadless Chromeを使ってスクレイピングしようとするとエラーが発生。スクリーンショットを確認すると下記のようなポップアップが表示されて指定のページにアクセスができなかった。

__*"位置情報が取得できなかったため、処理ができません。位置情報を許可してください。"*__

色々と調べた結果、どうやらブラウザの位置情報が確認できないことが原因であった。

##Headless Chromeに位置情報を設定する方法

ということでHeadless Chromeに位置情報を設定する方法はないかと調べてみたが、意外と情報が少ない。。。

そもそもChromeブラウザで位置情報を設定する方法があるのかという疑問があったので、調べてみるとデベロッパーツールから設定はできるらしい。

ということは、「headless chromeでもデベロッパーツールの操作ができれば解決するのでは？」と思ったところで、Stack overflowで同じ内容を質問している人がおり、解決策が提示されていた。どうやらexecute_cdp_cmd()というメソッドを利用するらしい。

###execute_cdp_cmd()
selenium.webdriverが持つメソッドで、Google Developperツールの設定ができるらしい。


コードの実装例は以下

```python:location_setting.py
from selenium import webdriver

def start_chrome_driver():
	options = webdriver.ChromeOptions()
	options.add_argument("--headless")
	options.add_argument("--disable-gpu")
	# executable_pathは各々の環境に合わせて変更してください
	driver = webdriver.Chrome(executable_path="/usr/local/bin/chromedriver", chrome_options=options)
	return driver

# Headless Chromeを起動
driver = start_chrome_driver()

# 位置情報の設定を許可（許可をしないと位置情報の設定ができない）
driver.execute_cdp_cmd(
    "Browser.grantPermissions",
    {
        "origin": "https://hromssp.obc.jp/",
        "permissions": ["geolocation"]
    },
)

# 緯度、経度、緯度・経度の誤差(単位：m)を設定する
driver.execute_cdp_cmd(
    "Emulation.setGeolocationOverride",
    {
        "latitude": 35.689487,
        "longitude": 139.691706,
        "accuracy": 100,
    },
)

```
※ちなみに上記で設定している緯度・経度は東京都庁の場所になります。

##結果
これでHeadless Chromeでも位置情報の設定(偽装？)ができるようになり、スクレイピングしたいページにアクセスできた！
C++11 ムーブ可能だがコピー不可(movable but non-copyable)オブジェクトのメモ

ムーブは可能だが, コピーはさせたくないときがあります. ファイルやスレッドのリソース管理など.

Movable but Non-Copyable Types
https://www.boost.org/doc/libs/1_65_0/doc/html/move/movable_only_classes.html

C++ : Movable but not copyable
https://xenakios.wordpress.com/2013/09/22/movable-but-not-copyable/

ありがとうございます.

RAII 的な設計にも役立つかしらん?
PlayFrameworkでSassを使う方法(簡単)

こんにちは！
見て頂きありがとうございます！！

都内のベンチャー企業でエンジニア1年生(2ヶ月目)をしているjunと申します。

記念すべき初のQitaの投稿です。

今回PlayFrameWorkにSassを導入してみたので自分のメモがてら紹介したいと思います。

#参考にしたサイト
[Play公式ドキュメント](https://www.playframework.com/documentation/2.8.x/AssetsSass)

#実行環境
- PlayFramework 2.8.2
- Scala 2.13.3

まずPlayでSassを有効化するためにplugin.sbtに以下を追記してください

```
plugin.sbt
addSbtPlugin("org.irundaia.sbt" % "sbt-sassify" % "1.4.11")
```

これで準備OKです。

##ファイル構成
```
app
 └ assets
   └ stylesheets
     └ main.scss
     └ modules
       └ _reset.scss
       └ _layout.scss
```
まず、appフォルダ直下にassetsフォルダを作成します。
assetフォルダ直下にmain.scssを配置します。
このmain.scssがマスターのscssファイルとなります。
modulesフォルダ以下にいわゆるmoduleを作成していきます。

元々publicフォルダにあったmain.cssは削除しておいた方が良いかもしれません。
てかむしろ削除しておかないと、同じファイルが生成されているよって感じてエラーがでます。。


modulesフォルダ以下を読み込むには、
main.scssフォルダに以下のように記述すればOKです。

```
/main.scss

@import "modules/_reset"
@import "modules/layout"

~~以下Scss記述
.header {
　~~
}

```
このあたりは通常のSassの書き方と同じですね。

ちなみにviewsのmain.scala.htmlファイル内の

```
 <link rel="stylesheet" media="screen" href="@routes.Assets.versioned("stylesheets/main.css")">
```
は変更しなくてもいけました。

結局コンパイルされてmain.scss →　main.cssになるの変更しなくてもいけるぽいですね。

これで終わりです笑
難しいと思いましたが、意外と簡単でした。
簡単ですが終わります。

誰かの参考になれば幸いです。
Command Pattern

#Command Pattern
<font color="#00f">クラスインスタンスを保存するクラスを作り（command.class)、保存したクラスインスタンスのメソッドをcommand.classメソッドのように扱う。

このページでは
・シンプルなCommandパターン
・メソッド実行回数を表示する機能の追加
について記載します

[Design Pattarm MENU](https://qiita.com/old_cat/items/852d980bedb9100dd7e3)
##シンプルなCommandパターン

以下の構成とします

|クラス|説明|
|-----|----|
|command.interface|登録されるインスタンスを共通化する|
|samCommand1.class|commandを実装しメソッドを一つ持たせる|
|samCommand2.class|commandを実装しメソッドを一つ持たせる|
|commandPool.class|samCommand1とsamCommand2のインスタンスを保存する|
|user(Main.class)|Command.classの動作を確認|
＊user　他の開発者がこのパターンを利用する、という意味合いを含みます

```java:command.interface
interface command{
  void s();
}
```
```java:samCommand1.class
class samCommand1 implements command{
  public void s(){System.out.println("command1");}
}
```
```java:samCommand2.class
class samCommand2 implements command{
  public void s(){System.out.println("command2");}
}
```
```java:commandPool.class
class commandPool{
  command[] pool=new command[2];  // command.interfaceを実装したクラスインスタンスを格納します
  void set(int key,command com){
    if(pool[key]==null){
       pool[key]=com;
    }
  }
  void exec(int key){
    pool[key].s();
  }
}
```
```java:user(Main.class)
public static void main(String[] args){
  samCommand1 sc1 = new samCommand1();
  samCommand2 sc2 = new samCommand2();
  commandPool cop = new commandPool();
  cop.set(0,sc1);
  cop.set(1,sc2);
  cop.exec(1);
}}
```

##メソッド実行回数を表示する機能の追加
commandPool.classを下記に修正

```java:commandPool.class
class commandPool{
  command[] pool = new command[4];
  int[] count = new int[2];
  void  set(int key,command com){
    if(pool [key]==null){
       pool [key]=com;
       count[key]=0;
    }
  }
  void exec(int key){
    pool [key].s();
    count[key]++;
    System.out.println(count[key]+"回目");
  }
}
```
streamlit説明　和訳

下記の和訳です。
https://docs.streamlit.io/en/latest/main_concepts.html

# アプリを作成する
### 実行方法
streamlit run your_script.py [-- script args]

上記のようにスクリプトを実行するとすぐにローカルの Streamlit サーバーが起動し、アプリがデフォルトのウェブブラウザの新しいタブで開きます。アプリはあなたのキャンバスであり、チャート、テキスト、ウィジェット、表などを描く場所です。

アプリに何を描くかはあなた次第です。例えば、st.text は生のテキストをアプリに書き込み、st.line_chart は折れ線グラフを描画します。利用可能なすべてのコマンドについては、API ドキュメントを参照してください。

# 開発の流れ
アプリをアップデートするたびに、ソースファイルを保存してください。保存すると、Streamlit は変更があるかどうかを検出し、アプリを再実行するかどうかを尋ねてきます。画面右上の「常に再実行」を選択すると、ソースコードを変更するたびにアプリが自動的に更新されます。

# データの流れ
Streamlitのアーキテクチャでは、プレーンなPythonスクリプトを書くのと同じ方法でアプリを書くことができます。画面上で何かを更新しなければならないときはいつでも、StreamlitはPythonスクリプト全体を上から下へと再実行します。

これは2つの状況で起こる可能性があります。

- アプリのソースコードを変更したとき。
- ユーザーがアプリ内のウィジェットを操作するとき。

# データの表示とスタイル
Streamlitアプリでデータ（テーブル、配列、データフレーム）を表示する方法はいくつかあります。はじめに、magic と st.write() を紹介しましたが、これはテキストからテーブルまで何でも書き込めるものです。では、データを可視化するために設計されたメソッドを見てみましょう。

なぜいつもst.write()を使わないのか？理由はいくつかあります。

Magic と st.write() は、渡されたデータのタイプを検査して、アプリでそれを最適にレンダリングする方法を決定します。別の方法で描画したい場合もあります。例えば、データフレームをインタラクティブなテーブルとして描画する代わりに、st.table(df)を使用して静的なテーブルとして描画したい場合があります。

2つ目の理由は、他のメソッドは、データを追加したり置き換えたりして、使用したり変更したりできるオブジェクトを返すからです。

最後に、より特殊な Streamlit メソッドを使う場合は、追加の引数を渡して動作をカスタマイズすることができます。

例えば、データフレームを作成し、Pandas Styler オブジェクトを使って書式を変更してみましょう。この例では、Numpy を使ってランダムサンプルを生成し、st.dataframe() メソッドを使ってインタラクティブなテーブルを描画します。
yocto のリファレンスマニュアルをコンパイルして pdf 版を手に入れる

# yocto のリファレンスマニュアルをコンパイルして pdf 版を手に入れる

## 背景

`yocto` `pdf` `manual` というようなキーワードで検索しても古いバージョンしか見つからないので、
新しいバージョンの pdf を取得するために必要なビルド手順調べた。
https://www.google.com/search?q=yocto+pdf+manual&oq=yocto+pdf+manual

## 動作確認環境

ubuntu20.04 上と docker 上の ubuntu18.04 と GitHub Actions 上で確認した。

## 関連サイト

### ビルド方法

以下ページでビルド方法の説明が書いてある。
https://git.yoctoproject.org/cgit.cgi/poky/tree/documentation/README?h=zeus

### docker や GitHub Actions など 実際に試したデータ

https://github.com/m-tmatma/yocto-manual
にデータを置いている。

## 準備作業

```
sudo apt-get update
sudo apt-get install -y git-core \
    make xsltproc fop \
    python3 python3-dev python3-pip python3-setuptools python3-sphinx python3-yaml python3-sphinx-rtd-theme
```

## ソース取得

以下の例では zeus

```
git clone -b zeus git://git.yoctoproject.org/poky
```

以下でも OK

```
git clone -b zeus https://git.yoctoproject.org/git/poky
```

## ビルド

以下コマンドでビルドする

```
cd poky/documentation
make pdf DOC=ref-manual
```

`poky/documentation/ref-manual/ref-manual.pdf` に PDF ファイルが作成される。
Dartで湯婆婆を実装してみる

誰もやってなかったようなので。。。

元ネタ: [Javaで湯婆婆を実装してみる](https://qiita.com/Nemesis/items/c7192a7c510788d2cba2)

# コード

```dart
import 'dart:io';
import 'dart:math';

main() {
  print("契約書だよ。そこに名前を書きな。");

  // 標準入力を1行読み込む
  var name = stdin.readLineSync().trim();

  print("フン。${name}というのかい。贅沢な名だねぇ。");

  // 名前を奪う
  var random = new Random();
  var newNameIndex = random.nextInt(name.length);
  var newName = name.substring(newNameIndex, newNameIndex + 1);

  print("今からお前の名前は${newName}だ。いいかい、${newName}だよ。分かったら返事をするんだ、${newName}!!");
}
```

# 実行結果

```console
$ dart yubaba.dart
契約書だよ。そこに名前を書きな。
千尋
フン。千尋というのかい。贅沢な名だねぇ。
今からお前の名前は千だ。いいかい、千だよ。分かったら返事をするんだ、千!!
```

# おまけ

空入力を与えると...？

```console
契約書だよ。そこに名前を書きな。

フン。というのかい。贅沢な名だねぇ。
Unhandled exception:
RangeError (max): Must be positive and <= 2^32: Not in range 1..4294967296, inclusive: 0
#0      _Random.nextInt (dart:math-patch/math_patch.dart:230)
#1      main (file:///home/kogia-sima/PG/Dart/yubaba/yubaba.dart:14)
#2      _startIsolate.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:307)
#3      _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:174)
```

Javaと同じくクラッシュしました。

# 感想

コードに冗長性がほとんど見られないのはDartの大きな強みの一つだと思う。