OmniAICreator/Qiita-1.07M huggingface dataset:
【ReactNative】Unable to resolve module path from ...

# 前提
ReactNativeにて、`Unable to resolve module path from ...(native層のファイル)`というエラーが出た。

```
.
├── api_dir
│   ├── fuga
│   └── fugafuga
└── native_dir
    ├── hoge
    └── hogehoge
```

# エラーになる理由
ReactNativeはNode.jsが元々提供している"path"モジュールを使用することができない。


native層以外であれば、Node.jsが提供している"path"を直接使用することが可能なため、
npm installすることなく、`const path = require('path');`を記述するだけで使用が可能。

native層の場合は、npmのパッケージをinstallする必要がある。

```
$ npm install --save path
```

``` package.json
"path": "^0.12.7",
```

``` hoge.js
const path = require('path');
```

Node.jsはJavaScriptそのものでなく、あくまでNode.jsという認識が大切でした・・・

# 参考

https://github.com/facebook/react-native/issues/6365

https://www.npmjs.com/package/path
AWSLambda(Nodejs)でプロキシ統合のAPIGatewayから渡ってきたevent.bodyがundefinedになる

# はじめに
AWSLambdaのNodejsでプロキシ統合のAPIGateway経由で
event.bodyを取得しようとした際にundefinedになりハマったので、メモ

[AWSLambdaのプロキシ統合とは](https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html)
# 該当のコード
APIGatewayから渡ってきたパラメータを取得しようと参照するとundefinedの参照エラーになる。

```
exports.handler = async (event, context) => {
    // event.bodyがundefinedになる
    JSON.parse(event.body).hoge
}
```

# 解決した方法
以下のように先にif文で確認してから参照するとundefinedにならない。

```
exports.handler = async (event, context) => {
    if (event.body) {
        JSON.parse(event.body).hoge
    }
}
```

# 終わりに
上記の方法で問題は解決できたが、
なぜundefinedになるのかがよくわからないが公式の実装サンプルなどでもif文で確認している。
PHPでセッションを利用してみた

以前
クッキー、セッションについてまとめてみましたが、実装していなかったので
今回は例を用いて実装していこうと思います。
[クッキーとセッションって何？[図あり]](https://qiita.com/freelanceradiation/items/79aa5be29df31070300f)

###画面
![ev007.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700700/af6b1535-239d-cbae-5843-2be966352130.jpeg)

###内容
■http://localhost/session/session1.php
・初回の場合「初回の訪問です。」表示。
・2回目以降「訪問回数」表示。

■http://localhost/session/session2.php
session1.phpの「ログアウトする」ボタンを押下すると表示。
セッションを削除します。

■http://localhost/session/session3.php
session2.phpの「ログアウトの確認」ボタンを押下すると表示。
現在のセッションの状態を確認できる。


#実装
```php:session1.php
<?php
session_start();
?>

<html>

<head>
    <title>PHP TEST</title>
</head>

<body>

    <?php
//東京の時刻に設定
    date_default_timezone_set('Asia/Tokyo');

    if (!isset($_SESSION["visited"])) {
        print('初回の訪問です。セッションを開始します。');

        //セッション変数は複数保存可能
        $_SESSION["visited"] = 1;
        $_SESSION["date"] = date('Y年m月d日 H時i分s秒');
    } else {
        $visited = $_SESSION["visited"];
        $visited++;//更新するたびに訪問回数が増えるように
        print('訪問回数は' . $_SESSION["visited"] . 'です。<br>');

        $_SESSION["visited"] = $visited;

        if (isset($_SESSION["date"])) {
            print('前回の訪問日時は' . $_SESSION["date"] . 'です。<br>');
        }

        $_SESSION["date"] = date('Y年m月d日 H時i分s秒');
    }

    ?>

    <p>
        <a href="./session2.php">ログアウトする</a>
    </p>

</body>

</html>
```

```php:session2.php
<?php
session_start();
?>

<html>

<head>
    <title>PHP TEST</title>
</head>

<body>

    <?php
    print('セッション変数の一覧を表示します。<br>');
    print_r($_SESSION);
    print('<br>');

    print('セッションIDを表示します。<br>');

    //デフォルトでPHPSESSIDが表示
    print($_COOKIE["PHPSESSID"] . '<br>');

    print('<p>ログアウトします</p>');

    //セッション変数を全て解除
    $_SESSION = array();

    if (isset($_COOKIE["PHPSESSID"])) {
        setcookie("PHPSESSID", '', time() - 1800, '/');
    }
    //セッションを破棄する
    session_destroy();
    ?>

    <p>
        <a href="./session3.php">ログアウトの確認</a>
    </p>

</body>

</html>
```

```php:session3.php
<?php
session_start();
?>

<html>

<head>
    <title>PHP TEST</title>
</head>

<body>

    <?php
    print('セッション変数の確認をします。<br>');
    if (!isset($_SESSION["visited"])) {
        print('セッション変数visitedは登録されていません。<br>');
    } else {
        print($_SESSION["visited"] . '<br>');
    }

    print('セッションIDの確認をします。<br>');
    if (!isset($_COOKIE["PHPSESSID"])) {
        print('セッションは登録されていません。<br>');
    } else {
        print($_COOKIE["PHPSESSID"] . '<br>');
    }
    ?>
    <a href="./session1.php">ログインする</a>

</body>

</html>
```
最大値を配列を使わずに標準出力する方法、配列を使う方法


最大値を配列を使わずに標準出力する方法、配列を使って標準出力に出力する方法の両方を投稿します。

配列を使わない方法

```Ruby
N = gets.to_i
max_num =0
for i in (1..N).each do
    num = gets.to_i
    if num >= max_num
        max_num = num
    end
end    
puts max_num
```

配列を使う方法

```Ruby
n = gets.to_i

arr = Array.new(n)
n.times { |i| arr[i] = gets.to_i }

puts arr.max
```

配列を使う方がシンプルにコーディングできますね。
FargateSpotを使って利用料を3割にしたときのノウハウ

## はじめに
こんにちは，ある企業の長期インターンシップに参加している大学４年生です.
今回インターンにて利用しているAWSのサービスの1つ「Fargate」について，安く運用したいと思ったこととその方法について書きたいと思います.
## そもそもFargateとは
公式ドキュメント：
[https://aws.amazon.com/jp/fargate/](https://aws.amazon.com/jp/fargate/)

コンテナ向けサーバーレスコンピューティングの一種であり，Dockerのイメージファイルを作るだけで簡単にデプロイできる便利なサービスです.
## 今回の課題
### 料金
#### ざっくり料金表（データ転送料+為替レートにより前後します）
|vcpu    |メモリ（GB）|料金（円/月）  |
|--------|----------|---------|
|0.25    |0.5       |1,236円  |
|0.5     |1.0       |2,473円  |
|1.0     |2.0       |4,947円  |
|2.0     |4.0       |9,894円  |
> （2021年6月12日現在の為替レートで月に732時間動作させた際の表です）

現在のインターン業務ではこのタスクをかなりの数同時稼動等をしているのでまともに動かすと，
**100,000円 ~ /月**を余裕に超えてしまうためこのコストそのものが課題になっています．

## 課題解決策
### FargateSpot
[AWS Fargate Spotの発表 – Fargateとスポットインスタンスの統合](https://aws.amazon.com/jp/blogs/news/aws-fargate-spot-now-generally-available/)
[AWS Fargate キャパシティープロバイダー](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/fargate-capacity-providers.html)

大雑把に説明すると，価格が7割引になるFargateです．
#### 実際に利用してみる
まずFargateを利用するクラスターを作り，作成したクラスターを選択します．
右上に**クラスターの更新**というボタンがあるので押します．
![fargatespot_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/949737/e4f0ee77-c759-502e-06bb-1841c100db6d.png)
クラスターの更新を押すと**キャパシティープロパイダー戦略**という項目があるので追加し，**FARGATE_SPOT**を選択します．
![fargatespot_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/949737/37b075e0-938f-68c3-7571-1f6e2ea1865b.png)
そして実行したいタスクをクラスター内にて利用することで**FargateSpot**を利用することが出来ます．
![fargatespot_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/949737/683e65fc-a767-dec5-1508-107c92ad3275.png)

### 唯一の弱点
FargateSpotは連続稼働を保証しておらず，ある日突然**タスクが終了**することがあります...
~~（今まで一度も終了したこと見たことないけど）~~
> Fargate Spotが空きキャパシティを確保できるかぎり、ユーザーは指定したタスクを起動することができます。

### 弱点をカバーする方法
タスク終了前にsignalが送られるのでタスク内で再起動処理を行う！
> スポットの中断により Fargate Spot キャパシティーを使用するタスクが停止すると、
タスクが停止する前に 2 分間の警告が送信されます。
警告は、タスク状態変更イベントとして Amazon EventBridge に送信され、
実行中のタスクに **SIGTERM** シグナルが送信されます。

実際にタスク終了を検知するソースコードを下記に記載します.

#### ソースコード
```python
import signal
import sys
import time
import random
import pprint


# 何かしらの処理を行い最終的に出力する変数
# 配列・辞書等...
response_data = []


def signal_receive_process(sig, frame):
    """SIGTERMシグナルを受け取った際に行う処理を書く"""
    print("SIGTERM!!")
    # 正常終了時の処理を行う
    task_finish_process()

    # タスクを終わらせる
    sys.exit(0)


def task_finish_process():
    """タスクが終了する際に行う処理を書く"""
    # 今回は単に表示させるだけ
    pprint.pprint(response_data[0:20])


def main():
    """何かしらの処理（web・machine_running etc...）を書く"""
    # SIGTERMを検知する
    signal.signal(signal.SIGTERM, signal_receive_process)

    for idx in range(100):
        print(idx)
        # 何かしらの処理を行う
        append_data = idx * random.random()
        # データを格納する
        response_data.append(append_data)
        idx += 1

        time.sleep(1)

    # 正常終了時の処理を行う
    task_finish_process()


if __name__ == '__main__':
    main()
```
## 終わりに
今回，Fargateを安く利用する方法について主に書くことができました！
今後も様々なことに書いていきたいと思います！
OpenFOAM10 を LXD 環境にインストール

OpenFOAM10 を LXD 環境の Ubuntu 22.04 にインストールする方法です。
参考ページ
[Download v8 | Ubuntu](https://openfoam.org/download/8-ubuntu/)
[LXD で Ubuntu を使う](https://qiita.com/ekzemplaro/items/39ffcc47e69d50ada8dc)

LXD 環境の構築

```bash
lxc launch ubuntu:22.04 ubuntu
```

インストールが完了するとホストから次のように見えます。

```text
$ lxc list
| ubuntu  | RUNNING | 10.64.227.206 (eth0) | fd42:c9bf:2e1c:6d4f:216:3eff:fe41:e63f (eth0) | 
CONTAINER | 0         |
```

インストールした ubuntu 22.04 にログインします。

```text
$ lxc console ubuntu
To detach from the console, press: <ctrl>+a q

ubuntu login: 
```


OpenFOAM10 のインストール

```bash
sudo sh -c "wget -O - https://dl.openfoam.org/gpg.key | apt-key add -"
sudo add-apt-repository http://dl.openfoam.org/ubuntu
```

次はかなり時間がかかります。

```bash
sudo apt -y install openfoam10
```

更新

```bash
sudo apt update
sudo apt upgrade
```

## インストールできたことの確認

.bashrc に次の一行を加えます。

```text:~/.bashrc
（省略）
#
. /opt/openfoam10/etc/bashrc
```

```text
$ simpleFoam -help

Usage: simpleFoam [OPTIONS]
options:
  -case <dir>       specify alternate case directory, default is the cwd
  -fileHandler <handler>
                    override the fileHandler
  -hostRoots <(((host1 dir1) .. (hostN dirN))>
                    slave root directories (per host) for distributed running
  -libs <(lib1 .. libN)>
                    pre-load libraries
  -listFunctionObjects
                    List functionObjects
  -listFvOptions    List fvOptions
```

リモートデスクトップ　x2go を使う

サーバー側　（インストールした ubuntu 20.04)
GNome もインストール

```bash
sudo apt -y install x2goserver x2goserver-fmbindings x2goclient
sudo apt -y install gnome-panel gnome-flashback gnome-session-flashback indicator-applet-appmenu
```

クライアント側　　（ホストOS）

```bash
sudo apt install x2goclient
```

クライアント（ホストOS）で

```bash
x2goclient
```

GNOME を使います。
![gnome_aa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/9b5ecb5a-20cf-f97f-a345-f3eaae7dbd49.png)

![gnome_bb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/4182b209-92f8-56de-40c8-eebc89e16024.png)

![gnome_cc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/ebef8b5e-ad7c-88a3-ace1-7f35377884e8.png)

ターミナルで次の操作を行う
$FOAM_RUN が設定されていることを確認

```text
$ echo $FOAM_RUN
/home/uchida/OpenFOAM/uchida-8/run
```

```bash
mkdir -p $FOAM_RUN
cd $FOAM_RUN
cp -r $FOAM_TUTORIALS/incompressible/simpleFoam/pitzDaily .
cd pitzDaily
blockMesh
simpleFoam
paraFoam
```

![gnome_dd.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/4ff236f8-cc29-27a0-dcd1-e28546749bf7.png)

サンプル
![gnome_ee.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/675dacaf-6224-46ce-0236-95b6c7940073.png)
イーロン・マスク御所望の、話題のグリーン仮想通貨”Chia”をマイニングしてみた

昨今仮想通貨が話題になる事が多くなってきたが、マイニングの莫大な消費電力は二酸化炭素削減を謳っている世の中の動きとは異なるものがあり閉口していた。　　ところが４月頃から急にHDDを用いてマイニングの消費電力が格段に少ない”Chia coin”というものが現れてきた。　　　
そこで好奇心旺盛なDr.Fuとしては前回の仮想通貨のブームで億り人になり損なった腹いせに、まずはマイニングにトライしてみた、、、

https://youtu.be/hgQJE5PhCLU

実験１：適当なマシンがないので（かつてはあったのであるが、何を思ったか断捨離してしまったので、、）AWSでトライ！！
東京リージョンでまずお試し、、、　　　ふむふむ、Windowsでさくっとプロッティングが始まる、、　しかし、、Task managerでチェックするとDisk パフォーマンスが100%に張り付く、、、

このPlot とやらいう畑の耕作、ずいぶん時間がかかるのがやっとわかった、、、、

k=35 とかやった日には３〜４日がかり、、、、

どうにかSNSやら、何やらを見て　k＝３２が標準であることにたどり着く、、、、

しかも割り当てるRAMのサイズやらスレッドの数やら、、、

GPU使ったり、SSD使ったり、、、、、、

AWSは便利便利！　なんでもすぐ試せるよ〜

と思って調子に乗って試してると、、、、

Bill = 約２０万円！！！！　　　チーン！　　　　あ”〜〜〜　やってもーた、　こそっと経費で落とそ〜

でもってAWSの成果は一応あったので、実物のPlot&Farmマシンを購入することにしたのだった、、、


つづく
メモリーツリーを使用した勉強法

#★はじめに
現在TBSテレビで日曜21:00から放送されている「ドラゴン桜」をご存じでしょうか。
元暴走族の貧乏弁護士・桜木建二が低偏差値の高校生を東大に現役合格させるまでを描いた作品で、阿部寛さん、長澤まさみさんをはじめ、加藤清史郎君(元こども店長)、高橋海人君(King＆Prince)、平手友梨奈さん等が出演しています。(漫画が原作で、久しぶりにリアルタイムで観ているドラマです！個人的に阿部寛さんは「TRICK」の上田教授役が一番好きですが、桜木弁護士役もかなり当たり役だと思います)

ドラゴン桜では毎回、"桜木メソッド"と呼ばれる勉強法が次々と出されていますが、今回は16年前(2005年放送)の前シーズンで紹介された「メモリーツリー」を使用した勉強法を紹介したいと思います。

#★「メモリーツリー」とは
簡単にいえば、「短時間で多くの内容を効率的に記憶できる勉強法」です。
中央にテーマを書き、そこから放射線状に（蜘蛛の巣状に）書いていくまとめノートの作り方です。思考を整理し、発想を豊かにし、記憶力を高めるために、"想像"と"連想"を用いて思考を展開できます。
「マインドマップ」と似ています。

##実際に書くとこんな感じ・・・
下の例はエンジニアらしく、「テストの種類」をテーマにして書きました。
![0D0D1072-AA34-43FF-BE36-1C4A2836B1B6.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567448/a07ad9b6-9bbe-1f42-5888-9f8d1f933050.jpeg)

#★書く上でのメリット・デメリット
メモリーツリーを使ってみると、以下のメリットがあります。
・頭の中が整理される
・新しい知識を身に付けている感覚
・わからない時に確認しやすい

反対に、以下のデメリットもあります。
・手書きだと時間が掛かる
・ある程度自分なりの工夫が必要

#★絵を描いて覚えるのも良し
文字だけでなく絵を描いて覚えるのもありです。
桜木弁護士曰く、「絵やシンボルを使うと左右の脳をフルに使って記憶が出来る。絵の印象が強ければ左脳で思い出せなくても右脳で思い出せる。メモリーツリーを自分なりに作っておけば、教科書(参考書)よりもはるか効率的に暗記が出来る」らしいです。


#★最後に
色々な勉強法がありますが、「ドラゴン桜」を観ていて"メモリーツリーも面白い勉強法だな"と興味を持ったので紹介させていただきました。使うか使わないかは人それぞれですが、こんな勉強法もあるよ、というのを知っておいていただければと思います。
Visual Studio2019で文字が見にくかったのでフォントを変えました

初期のMSゴシックがなんとも見にくかったので、フォントをConsolasに変えました。
ConsolasはMicroSoftが提供しているプログラミング用フォントです。
とりあえずConsolasにしておけば無難かと思います。

![スクリーンショット 2021-06-15 135440.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1006407/1a5d3445-9ec5-19d5-8998-2c1a1bedc7bc.png)

「ツール」→「オプション」

![スクリーンショット 2021-06-15 105739.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1006407/9f11a567-d478-844d-ae4e-1875db559d3c.png)

「環境」→「フォント及び色」→「フォント」→「Consolas」→「OK」

![スクリーンショット 2021-06-15 135113.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1006407/72ff57db-e747-164c-b814-057a129ec0f5.png)

ぐっと見やすくなりました。

![スクリーンショット 2021-06-15 135730.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1006407/f85202cd-8e80-ebcf-48d0-6d5cb4380df4.png)
Laravelの認証機能に使用するハッシュ変更 bcrypt→PHPass(Wordpress)

# 概要
Laravelではlaravel/ui vue --auth等で作った認証ページに使用される会員登録とログイン時のパスワードのハッシュ化には、
bcryptがデフォルトで設定されているので今回はWordPressに使用されているPHPassに変更する。
注意しなければならないのが、今回はbcryptとPHPassを共存させるわけではなく全てPHPassにハッシュ方式を統一させます。

背景として、既存システムのWordPressのwp_usersを新規システムのLaravel側のusersテーブルに移行する必要がありました。
なので、bcryptは完全にやめてWordpressのハッシュ方式に変更しました。

# bcrypt→PHPass(WordPress)にハッシュ変更


#### ①必要パッケージインストール

WordPressに使用されているパスワードのチェック、平文のハッシュ化を行うためのパッケージをインストールします。

```json:composer.json
"require": {
  "mikemclin/laravel-wp-password": "~2.0.1"
}
```

```
composer update
```
参考
https://github.com/mikemclin/laravel-wp-password

#### ②Service作成

makeとcheckは会員登録とログインで使用される関数です。
ここをインストールしたパッケージを使用してWordPress仕様に変更します。

```php:App\Services\PHPass\PHPassHashService.php

<?php

namespace App\Services\PHPass;

use MikeMcLin\WpPassword\Facades\WpPassword;

class PHPassHashService implements \Illuminate\Contracts\Hashing\Hasher
{

    /**
     * Hash the given value.
     *
     * @param  string  $value
     * @return array   $options
     * @return string
     */
    public function make($value, array $options = array())
    {
        return WpPassword::make($value);
    }

    /**
     * Check the given plain value against a hash.
     *
     * @param  string  $value
     * @param  string  $hashedValue
     * @param  array   $options
     * @return bool
     */
    public function check($value, $hashedValue, array $options = array())
    {
        return WpPassword::check($value, $hashedValue);
    }

    /**
     * Check if the given hash has been hashed using the given options.
     *
     * @param  string  $hashedValue
     * @param  array   $options
     * @return bool
     */
    public function needsRehash($hashedValue, array $options = array())
    {
        return false;
    }

    /**
     * Get information about the given hashed value.
     *
     * @param string $hashedValue
     * @return array
     */
    public function info($hashedValue)
    {
        // TODO: Implement info() method.
    }
}


```

#### ③Provider作成

サービスを使用するためのプロバイダーを作成

```php:App\Providers\PHPassHashServiceProvider.php
<?php

namespace App\Providers;

use App\Services\PHPass\PHPassHashService;
use Illuminate\Support\ServiceProvider;

class PHPassHashServiceProvider extends ServiceProvider
{
  /**
   * Register services.
   *
   * @return void
   */
  public function register()
  {
    $this->app->bind('hash', PHPassHashService::class);
  }

  /**
   * Bootstrap services.
   *
   * @return void
   */
  public function boot()
  {
    //
  }

  public function provides()
  {
    return array('hash');
  }
}

```

#### ④プロバイダー変更

```php:config\app.php
'providers' => [
    //Illuminate\Hashing\HashServiceProvider::class, ←コメントアウト
    App\Providers\PHPassHashServiceProvider::class, ←追加
]
```

これでlaravel/ui等で作った認証でbcryptではなくWordPressのハッシュ方式に変更が完了となります。
最後に再読み込みとキャッシュクリアして終了です。

```
composer dump-autoload
```

```
php artisan config:cache
```

参考
https://solomaker.club/how-to-change-default-laravel-hash/
SwiftLintをコメントで無視する

# はじめに
自分のメモのために記事を書いています。
初学者の方の参考になれば幸いです。
# 記事内容
SwiftLintをコードで無視するをメモとして書いています。
詳しい内容はGitHubのSwiftLint（Opt-In Rules）に書かれています。[https://github.com/realm/SwiftLint](https://github.com/realm/SwiftLint)
# コードでルールを無視する
- ルールは、次の形式のソースファイル内のコメントで無効にできます。

```swift
// swiftlint:disable <rule1> [<rule2> <rule3>...]
```

- ルールは、ファイルの終わりまで、またはリンターが一致する有効化コメントを確認するまで無効になります。

```swift
// swiftlint:enable <rule1> [<rule2> <rule3>...]
```

例えば:

```swift
// swiftlint:disable colon
let noWarning :String = "" // 変数名の直後のコロンに関する警告はありません！

// swiftlint:enable colon
let hasWarning :String = "" // 変数名の直後のコロンについて警告が生成されます
```

- allキーワードを含めると、リンターが一致する有効化コメントを確認するまで、すべてのルールが無効になります。

```swift 
// swiftlint:disable all
```

```swift 
// swiftlint:enable all
```

例えば:

```swift
// swiftlint:disable all
let noWarning :String = "" // 変数名の直後のコロンに関する警告はありません！
let i = "" // 短い識別子名についての警告もありません

// swiftlint:enable all
let hasWarning :String = "" // 変数名の直後のコロンについて警告が生成されます
let y = "" // 短い識別子名について警告が生成されます
```

- 以下の三種類いずれかのコマンドを追加することで、有効範囲を変更することも可能です。

```
:previous
// 前の行のみコマンドを適用します
```

```
:this or :next
// この（現在の）行または次の行のみコマンドを適用します
```

例えば

```swift
// swiftlint:disable:next force_cast
let noWarning = NSNumber() as! Int
let hasWarning = NSNumber() as! Int
let noWarning2 = NSNumber() as! Int // swiftlint:disable:this force_cast
let noWarning3 = NSNumber() as! Int
// swiftlint:disable:previous force_cast
```
隣接リスト Java編

https://paiza.jp/works/mondai/a_rank_level_up_problems/a_rank_graph_step2

　隣接リストをJavaで実装しようとすると、案外手間だった。
　訂正すると**滅茶苦茶手間だった**。Javaは可変長配列の扱いが難しい……。

　まともな資料もないし……もしかしてJavaで組むこと自体が想定されてないモデルだったりするのだろうか。

###コード

```java
import java.util.Scanner;
import java.util.ArrayList;
import java.util.Collections;

public class Main {
    public static void main(String[] args) throws Exception {
        Scanner sc = new Scanner(System.in);
        
        int n = sc.nextInt();
        int m = sc.nextInt();
        
        ArrayList<ArrayList<Integer>> al = new ArrayList<ArrayList<Integer>>();   //ArrayListを二次元に
        
        for(int i=0; i<n; i++){
            ArrayList<Integer> ar = new ArrayList<Integer>();   //外側のListに添え字を作るために
            al.add(ar);   //N回、入れ物のArrayListを作っておく
        }
        
        for(int i=0; i<m; i++){
            int a = sc.nextInt()-1;
            int b = sc.nextInt()-1;
            
            al.get(a).add(b);   //外側Listの添え字をgetして、中のListにbをaddする
            al.get(b).add(a);   //同様のことをする。隣接リストなので数字を入れ替える
        }
        
        for(int i=0; i<n; i++){
            Collections.sort(al.get(i));   //外側リストの添え字ごとに中身をソートして
            for(int j=0; j<al.get(i).size(); j++){
                System.out.print(al.get(i).get(j));   //表示
            }
            System.out.println("");
        }
    }
}

```

###参考

https://base64.work/so/java/2906769

https://ja.ec-europe.org/942191-java-implementation-of-adjacency-list-RZAPIX
windowsに最初に入れる便利ソフトメモ

# windowsに最初に入れるソフト
## snipaste
F1すぐにスクショ、すぐに赤枠が振れる。
クリップボードにコピー可能。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384142/e71c1970-58e5-731f-a514-aea243d1c84f.png)

## PowerToys
Shift押しながらのウィンドウ移動を使用した画面分割が最強になる。
microsoft製。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384142/4fa6b65e-c10b-73b1-df76-af4ccb42f37a.png)

## Auto Screen Capture
自動インターバルでスクショを撮影できる。
1日を振り返るのに使用。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384142/7049b71d-c17f-9be4-7fb7-6b1ef6b409ae.png)

## 7+ Taskbar Tweaker
タスクバーのカスタマイズが可能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384142/6b79ab97-4ba3-05f8-a7f1-c01acdada433.png)
RHELのAzureイメージにpython3をインストールする方法

## はじめに

この記事では**Azure**の**RHEL７**または**RHEL8**イメージに**python3**をインストールする方法を紹介します。

## RHEL7
### 概要
**RHEL7**のAzureイメージでは、*Pythonバージョン2.7.5*がインストールされ、**python**コマンドは**python2**を指しています。

**python3**は**RHEL 7.7**からのみ利用可能であり、VMが**RHEL 7.6**以下などの以前のリリースを使用している場合、リポジトリからインストールできないことに注意してください。リポジトリから**python3**をインストールするには、VMを**RHEL 7.7**にアップグレードしてください。

VMが**RHEL 7.7**以降であれば、次のコマンドを使用して**python3**をインストールできます。

### コマンド

```bash
sudo yum install python3 -y
```

### 結果

```bash
$ python --version
Python 2.7.5
$ python2 --version
Python 2.7.5
$ python3 --version
Python 3.6.8
```

## RHEL8
### 概要
**RHEL8**のAzureイメージでは、*Pythonバージョン3.6.8*がインストールされ、**python**コマンドは設定されていません。**python**を**python3**を刺すようにするには次のコマンドを使ってください。

### コマンド

```bash
sudo alternatives --set python /usr/bin/python3
```

### 結果

```bash
$ python --version
Python 3.6.8
```

## おわりに
以上です。
Databricksにて上位階層／並列階層にあるノートブックに対して%runを実施する方法

## 概要
Databricksにて上位階層にあるノートブックに対して%runを実施するには、一般的な方法と同様に、%runの呼び出しもとを".."と記載することで実行できます。

この記事では、"run"というノートブックから"select"というノートブックを実行するという検証結果を記載します。

## 検証① 上位のディレクトリにあるノートブックの実行
### 1. ディレクトリを構成
下記のような構成を作成します。

```txt
.
│  select
│
└─pipeline
        run
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/06f2b9b3-3209-1387-96b3-029078bb35ad.png)

### 2."select"というノートブックにコードを記載

```python
%sql
SET TIME ZONE 'Asia/Tokyo';
select now()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/94ea1b50-74da-57bf-9f59-e605a13cdfaf.png)

### 3."run"というノートブックにコードを記載して実行

```python
%run ../select 
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/53e9f9c7-9d02-6ef2-1b8a-c9c7ae558419.png)


## 検証②　"run"と並列関係にあるディレクトリのノートブックの実行
### 1. ディレクトリを構成
下記のような構成を作成します。

```txt
.
├─code
│      select
│
└─pipeline
        run
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/2d09ad82-dcce-c10a-e097-a1d89027cc0f.png)

### 2."select"というノートブックにコードを記載

```python
%sql
SET TIME ZONE 'Asia/Tokyo';
select now()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/94ea1b50-74da-57bf-9f59-e605a13cdfaf.png)

### 3."run"というノートブックにコードを記載して実行

```python
%run ../code/select 
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/8b5f7f36-4dce-3c66-b205-fd353c3dc38b.png)
PostgreSQLでユーザ(Role)あたりのコネクション数を制限したい

# はじめに
PostgreSQLでユーザ(Role)あたりのコネクション数を制限したいときは、`ALTER ROLE ~ CONNECTION LIMIT N;` を使いましょう。

（PostgresqlはユーザもRoleとして表現されます）

[公式ドキュメントの記載箇所](https://www.postgresql.org/docs/9.0/sql-alterrole.html)

# サンプル

ユーザは `shase-san` というのを使っています。

ALTER ROLEの発行

```sql
ALTER ROLE shase-san CONNECTION LIMIT 5;
```

確認

```sql
foodb=> \du shase-san
                                 List of roles
  Role name   |  Attributes   |                    Member of
--------------+---------------+-------------------------------------------------
 shase-san    | 5 connections | {}
```

実際にpsqlコマンドで試した所、上記の場合5接続しかできなくなっています。

# おまけ

特定ユーザの現在のコネクションをすべてkill

```sql
SELECT
  pg_terminate_backend(pid)
FROM
  pg_stat_activity
WHERE
  usename = 'shase-san'
AND
  pid <> pg_backend_pid();
```

# おわりに
PostgreSQL の達人に教えてもらいました。感謝  :pray:
改ざん検知 Tripwire のプチテスト

vulnerable なWebサーバを構築したついでに，オープンソースの改ざん検知 Tripwire を導入してみた。
改ざん検知を導入したのは初めてだったのでよい経験になった。


# Tripwireのインストール

インストールの参考になったサイトはココ。
書いてあるとおりに進めると動きます。
素晴らしい。

https://www.server-world.info/query?os=Ubuntu_18.04&p=tripwire

# テスト1

デフォルトの状態で，CVE-2019-11043の攻撃を実施した後でチェックしたところ，

```
  Rule Name               Severity Level   Added    Removed  Modified
  ---------               --------------   -----    -------  --------
* System boot changes     100              1        0        0

--------------------------------------------------------------------
Rule Name: System boot changes (/var/log)
Severity Level: 100
--------------------------------------------------------------------

Added:
"/var/log/apport.log"

```

と１ファイルの増加を検知した。

/var/log/apport.logの中を見てみると， `/usr/sbin/php-fpm7.3` がクラッシュしており，一応，攻撃が検知できた。

が，攻撃によって作成されたwebshell `/tmp/a` は検知できなかった。

/var/log/apport.logの発見が偶然と思われたので，再度，CVE-2019-11043の攻撃を実施してチェックした。
その結果は予想どおりで，/var/log/apport.logの増加は検知しなかった。

# ポリシーの最適化

ポリシーの最適化で参考になったサイトはココ

https://www.atmarkit.co.jp/ait/articles/0407/23/news090_2.html

Tripwireでは，
+pinugtd-srlbamcCMSH  -->  Dynamic  -->  SEC_CONFIG
などとプロパティ値を別名にしているが，ネーミングセンスが悪く，非常にわかりにくい。

Dynamic  -->  SEC_CONFIG　にする必要があるのか？
まったく意味不明だ。

それはさておき，Webサイト専用の設定として
sudo vi /etc/tripwire/twpol.txt.new

```
#
# Web contents
#
(
　　rulename = "Web contents",
　　severity = 100
)
{
　　/var/www/html -> $(ReadOnly) (recurse = true);
}
``` 

を追加した

# テスト2

sudo su -
echo "aaa" > /var/www/html/tmp/bad.php
を行った後，チェックしたところ，


```
  Rule Name               Severity Level   Added    Removed  Modified
  ---------               --------------   -----    -------  --------
* Web contents            100              1        0        1

--------------------------------------------------------------------
Rule Name: Web contents (/var/www/html)
Severity Level: 100
--------------------------------------------------------------------

Added:
"/var/www/html/tmp/bad.php"

Modified:
"/var/www/html/tm"

```

となった。

Tripwireのバージョンを確認すると `copyright 2000-2018` と表示されるけど，開発が止まっているのかな？
スプレッドシートを基にGASで一気にGoogleドライブにフォルダ構造を作成する

# はじめに
こんにちは。最近、実家の畑を勝手に荒らすおじさんがいるそうで、警察に通報しました。ロープはったり立ち入り禁止の札貼ったり、これで来なくなればいいのですが... :innocent: 

さて、今回はスプレッドシートに記載のフォルダの階層構造を基に、**Googleドライブ**にフォルダ作成する機会があったので、せっかくなので記事にしました。

何かプロジェクト前とか、整理整頓したいぞって方いらっしゃいましたら、参考になれば幸いです:smile:

# 手順
1. ルートフォルダ作成.
1. 階層構造をスプレッドシートで作成.
1. GASで1のスプレッドシートの情報取得.
1. ルートフォルダを取得.
1. スプレッドシートに記載のフォルダが空欄の場合はスキップ.
1. 作成対象フォルダが既に作成済みの場合は当該フォルダをルートフォルダに切り替えてスキップ.
1. 6に該当しない場合は指定フォルダ名でフォルダ作成.
1. 4-7を繰り返し.

# スプレッドシートを基にGASで一気にGoogleドライブにフォルダ構造を作成する

## 1. ルートフォルダ作成
こんな感じです↓
URLに含まれるfolder_idをスクリプトで使います:pray:
![b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86984/d2b78b25-62f0-1862-b5da-fff813ba0286.png)

## 2. スプレッドシート作成
こんな感じ↓
![a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86984/6b3cea19-c645-f01d-837d-cfdd2a5062c7.png)


## 3. スクリプト作成
スプレッドシートに紐づくスクリプトで作成しちゃいます。

![a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86984/0aa8cdb0-1997-cd91-c4e1-a2ea25923e91.png)


## 4. 実スクリプト

```js
const main = () => {
  const sheet = SpreadsheetApp.getActiveSheet()
  const data = sheet.getRange(2, 2, sheet.getLastRow() - 1, sheet.getLastColumn() - 1).getValues()
  const folder_id_root = 'xxxx'
  const folder_root = DriveApp.getFolderById(folder_id_root)

  let row, folder_name, folders, folder
  for (let i in data) {
    row = data[i]
    // 手順4
    folder = folder_root
    for (let j in row) {
      folder_name = row[j]
      if (! folder_name) {
        // 手順5
        continue
      }

      folders = folder.getFoldersByName(folder_name)
      if (folders.hasNext()) {
        // 手順6
        folder = folders.next()
        continue
      }
      // 手順7
      folder = folder.createFolder(folder_name)
    }
  }
}
```

## 5. 実行結果
こんな感じでできました！

![a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86984/cc8e93ce-874a-7864-0fce-49dfd63d1960.png)

# おわりに
今回は年月で作りましたが、長期プロジェクト等々で一気に作りたいなんてときにお役立てくださいませ:+1:
それでは！
7セグの読み取り装置を簡単に作ってみた

割と最近、 **7セグの表示を読み取ってデータベースに保存する** という仕組みを作ったんですが、活用シーンが割とありそうなのでザックリですが作り方をまとめます。

# 7セグ読み取り
コレが一番肝心なところですね。
[SSOCR](https://www.unix-ag.uni-kl.de/~auerswal/ssocr/) ( Seven Segment Optical Character Recognition ) を使うとかなりいい精度で読みとってくれます。
7セグに特化してる分は高精度なのでしょう。
僕が処理した範囲ではTesseractOCRより読取精度が良かったです。

## SSOCRのインストール
サイトからソースをダウンロードして

- make
- make install
だけで大丈夫と思います。

Windowsの場合、先に [Cygwin](http://cygwin.com/) をインストールが必要です。
インストール時に

- gcc-core
- gcc-g++
- libintl-devel
- imlib2
- imlib2-devel
- cygutils-X11

あたりを追加したかな？（あとでも追加可）
最初にやったWindows PCでは他にも何かアレコレ入れたせいか問題なくmakeできましたが、2回目のWindows PCではエラーが出てmakeがコケました。
いろいろやってみたけど解決しないので、コマンドを直打ちして力業でmake。
（オススメはしません。自己責任で。。。）

```shell
> cc -D_FORTIFY_SOURCE=2 -Wall -W -Wextra -pedantic -Werror -pedantic-errors -fstack-protector-all  -O3   -c -o ssocr.o ssocr.c
> cc -D_FORTIFY_SOURCE=2 -Wall -W -Wextra -pedantic -Werror -pedantic-errors -fstack-protector-all  -O3   -c -o imgproc.o imgproc.c
> cc -D_FORTIFY_SOURCE=2 -Wall -W -Wextra -pedantic -Werror -pedantic-errors -fstack-protector-all  -O3   -c -o charset.o charset.c
> cc -D_FORTIFY_SOURCE=2 -Wall -W -Wextra -pedantic -Werror -pedantic-errors -fstack-protector-all  -O3   -c -o help.o help.c
```
その後に `make install` でちゃんと使えるようになりました。

## 読取
### 動作確認
確認で公式サイトのトップにある6桁の7セグ画像を落として

```shell
> ssocr.exe -D-1 -t 70 six_digits.png
```
と実行すると `431432` が返ってきました。
（指定しているパラメータについては、公式サイトを参照ください）

### 環境に合わせた調整
使う環境やカメラによって取得できる画像は様々です。
そのため、環境に合わせた画像の前処理やパラメータの調整が必要です。
ザックリと

- 明るさ、コントラストの調整
- 7セグ部分の切り出し
- 回転角度の調整

あたりが必要です。

#### 明るさ、コントラスト等
imagemagickあたりでコマンドからパラメータで調整するといいと思います。

#### 切り出し
余計なものが写っていると7セグの読取精度が下がります。
できるだけ7セグの部分だけを処理するのがよいです。
切り出し（読取エリアの設定）は、SSOCRのパラメータで可能です。

```
crop X Y W H
    Use only the subpicture with upper left corner (X,Y), width W and height H.
```
詳細はサイトのマニュアルを参照してください。
サンプル画像だと

```shell
> ssocr.exe crop 3 3 40 65 -d1 -t 70 six_digits.png
```
で `4` と返ってきます。

#### 回転角度の調整
SSOCR、全体的に7セグの読取精度はよいのですが、角度が悪いと特に **"1"** の読取精度がダダ下がりでした。
角度はカメラを設置するときに調整して固定するのがよいですが、必要な場合はこれもパラメータで調整可能です。

```
rotate THETA
    Rotate the image THETA degrees clockwise around the center of the image. 
    Image dimensions do not change, pixels rotated out of the image area are dropped, 
    pixels from outside the image rotated into the new image are set to the background color. 
```

#### その他
他にも、数字の桁数、小数点の有無、"-"符号の有無などパラメータで調整できます。
必要に応じて設定してください。

# 読取装置の作成
これを使って、以下の2例を作成しました。
構成や処理フローなど参考までに。

## Windows10 + ネットワークカメラ
構成は

- Windows10 PC
- ネットワークカメラ
- NAS
- DB

です。
流れは、

- ネットワークカメラで7セグを撮影
  - 定期的に自動撮影
  - カメラの機能で可能ならそれを利用、もしくはコマンド等でも
- 7セグの写真をNASに保存
- Windows10 PC上でNASに保存された写真を読取処理
  - SSOCRを実行するバッチを作成
  - タスクスケジューラでバッチを定期実行
- 読み取った値をDBに保存
  - DBでもよいですし、エクセルやテキストに保存でもよいと思います。

という感じです。

## RaspberryPi Zero + PiCamera
構成は、

- RaspberryPi Zero
- PiCamera
- DB

です。

流れは、

- RaspberryPi ZeroからPiCameraで写真撮影
  - コマンドで撮影可
`> raspistill -w 1920 -h 1080 -o pi-camera.png`
- SSOCRで読取処理
- DBなどに保存

という感じで、上記を行う一連のシェルを作成して、cronで定期実行します。

# まとめ
読取装置の構成や処理の詳細は環境によって異なると思いますが、 **写真撮影** と **SSOCRの処理** で何とかなるということはわかってもらえたかと思います。

皆さんのお役に立てば幸いです。
Linux tee 命令

## tee 命令

tee 命令用于将数据重定向到文件，另一方面还可以提供一份重定向数据的副本作为后续命令的 stdin。简单的说就是把数据重定向到给定文件和屏幕上。

存在缓存机制，每 1024 个字节将输出一次。若从管道接收输入数据，应该是缓冲区满，才将数据转存到指定的文件中。若文件内容不到 1024 个字节，则接收完从标准输入设备读入的数据后，将刷新一次缓冲区，并转存数据到指定文件。

## 语法

```
tee(选项)(参数)

-a：向文件中重定向时使用追加模式；
-i：忽略中断（interrupt）信号。
```

```
ls | tee out.txt
1.sh
1.txt
2.txt
```

```
ls | tee out.txt | cat -n
```

`ping qiita.com | tee 1.txt 2.txt 3.txt`

## 使用 tee 命令提升文件写入权限

假如你使用 Vim 编辑器 打开文件，并且做了很多更改，然后当你尝试保存修改时，你得到一个报错，让你意识到那是一个 root 所拥有的文件，这意味着你需要使用 sudo 权限保存修改。

如此情况下，你可以（在 Vim 内）使用 tee 命令来提高权限，这个命令会向你索要 root 密码，然后就能让你保存修改了。

`:w !sudo tee %`

---

参考：

https://linux.cn/article-9435-1.html

https://man.linuxde.net/tee
M1 MacのPythonでgrpcioを入れる方法

M1 Macにgrpcioが入らなかった問題。

# 解決方法

Macに最初から入っているPythonを使用しつつ、環境変数を設定すると解決しました。

最初、pyenvのpython-buildを使って入れたPythonでgrpcioをインストールしようとしていたのですが、clangのエラーが発生してしまいインストールできませんでした。

`/usr/bin/python3`にシステムで最初から入っているPython 3.8.2が入っているので、こちらを使うとうまく行きました。

また、`GRPC_PYTHON_BUILD_SYSTEM_OPENSSL=1`と`GRPC_PYTHON_BUILD_SYSTEM_ZLIB=1`の環境変数を設定しました。

```bash
GRPC_PYTHON_BUILD_SYSTEM_OPENSSL=1 GRPC_PYTHON_BUILD_SYSTEM_ZLIB=1 /usr/bin/python3 -m pip install grpcio
```

Homebrewでopensslを入れているため、以下の環境変数を設定しています

```bash
export LDFLAGS="-L/opt/homebrew/opt/openssl/lib"
export CPPFLAGS="-I/opt/homebrew/opt/openssl/include"
```
Ionic Vue でwebpackの設定をカスタマイズする 

## 色々調べたがなかなか出てこなかったのでファイル全文検索でwebpack.configを探した

下記にあるらしい

> @vue/cli-service/webpack.config

よくよく考えれば、 `vue-cli-service build` をやってるのだから上記にあるのは当たり前ですな。。。

（なぜか思い至らなかった。）

## `node_modules` にあるので読み込んでオーバーライドする

よくあるやつなのですが。
~~プロジェクトディレクトリに `config/webpack.config.js` を作ります。~~
↑ まちがいでした。
プロジェクトディレクトリに `vue.config.js` を作ります。

```js:~/vue.config.js
// もとの設定読み込み
// eslint-disable-next-line @typescript-eslint/no-var-requires
const webpackConfig = require('@vue/cli-service/webpack.config')

module.exports = {
    configureWebpack: {
        ...webpackConfig,
        ...{
            devtool: false, // eval しない
        }
    }
}
```

## カスタマイズした設定を使うように設定する

~~プロジェクトの `package.json` に加える。~~
~~これは昔からあったやつですね。~~
必要ないです。

## ビルドしてみて確認する

eval されなくなった。OK！（されてなかった）

### 追記

修正版で、キチンとevalされてないこと確認できますた。
サーセン。
Gravioでお茶出しくん

Gravio Hubで音声再生ができるようになったのでいろいろ試してみたくなった。
以前、客先でやったことのある通称「お茶出しくん」の音声版を作ってみる。「お茶出しくん」はお客様対応中にボタンを押すとお茶やコーヒーをお願いできるもの。以前はLINEで通知してみたが、スピーカーで喋ってくれるとLINE見てなかったーってことはなくなる。まぁ、人がいなければやはり意味はないのだが、その場合はLINEとハイブリッドで。

# 使用環境
* Gravio HubKit v4.3.0-6722
* Gravio Studio v4.3.4162.0
* Gravio ワイヤレススイッチ
* Gravio Hub
* Bluetoothスピーカー
* Amazon Polly

# 事前準備
* 「[Gravio HubにBluetoothスピーカーをペアリングする][Gravio-Speaker]」 を参考にGravio Hubでスピーカーをペアリングしておく
* AWSにアカウントを取得し、[Amazon Polly][AmazonPolly]を使えるアクセスキー、シークレットキーを取得しておく

# 手順
## Gravioワイヤレススイッチを設定
まずは、呼び出し用のボタンをペアリングして、レイヤーに紐付けます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/68653619-1075-ac4d-4e7e-3d3b87b93125.png)

エリア名は今回利用するのでちゃんとわかりやすい部屋の名前で。今回は「会議室」としておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/0a3d922b-b60b-86ad-a020-347bae6ce287.png)

## 基本プロパティセットを作成
AWSのアクセス情報を基本プロパティセットに設定しておく。せっかく取得したので、今後も再利用できるように。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/3a642668-4d82-4c9d-8d84-b1a962fcc2fe.png)

## アクションを作成
アクションを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/a8931509-ba53-0e9b-eadb-ce1d393685f4.png)

コンポーネントはAWSPollySpeechだけですね。
プロパティも簡単。基本プロパティセットには先ほど作成したものを選択し、音声は今回日本語を話すので、「Mizuki」さんか「Takumi」さんを選びます。
あとは話す内容です。

```cp.Text
cp.Text = tv.AreaName + "にコーヒーをお願いします"
```

`tv.AreaName` でボタンの置いてあるエリアの名称をくっつけてます。これで、いくつかの会議室があった場合でも、どこに持っていけばいいか簡単にわかりますね。

## トリガーを作成

最後にトリガーを作成して、ボタンとアクションを紐付けます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/1b009866-9ca4-5d32-b01c-6c38ec434e18.png)

エリアとレイヤーを選び、ボタンのイベントは「Single press」を選んでおきます。
アクションは先ほど作成した「CoffeePlease」を選びます。

## 試してみる
ボタンを押すとスピーカーから「会議室にコーヒーをお願いします」と流れます。
これ、スピーカーもボタンをワイヤレスなので、Gravio Hubと離れた位置に置くことができます。これって結構大切です。設置の自由度が上がれば、利用用途も格段に広がりますね！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/54e43463-5e20-2a00-cae2-a6a0a133e7a8.png)


# 参考
* [Gravio HubにBluetoothスピーカーをペアリングする][Gravio-Speaker]
* [Gravio][]
* [AWS Polly Speechコンポーネント][Gravio-AWSPollySpeech]
* [Amazon Polly][AmazonPolly]




[AmazonPolly]:https://aws.amazon.com/jp/polly/
[Gravio-Speaker]:https://qiita.com/zrock/items/fc2ebb52f3200fe04975
[Gravio]:https://www.gravio.com/jp
[Gravio-AWSPollySpeech]:https://doc.gravio.com/manuals/gravio4/1/ja/topic/amazonpollyspeech-action-component
Finderの名前順ソートのルール（未解決）

# 概要

- Finderの並び順のルールがきになったので少し試してみた
    - これといった情報は見つからず仕舞い
    - こちらはただ一旦集めた情報をまとめてみたという記事です
    
# 実証

- 「み」「錦」「凸」の並び順を考える
- 英語環境・日本語環境で並び順が異なる結果となる
- それぞれの文字コードは以下の通り

> http://charset.7jp.net/dump.html
>![](https://i.imgur.com/79UDYRr.jpg)

- 英語環境下だと以下の並び
    - `UTF-8`での比較？

![](https://i.imgur.com/HyYh9V8.jpg)

- 日本語環境下だと以下の並び
    - `Shift-JIS`での比較？

![](https://i.imgur.com/tb9IjW6.jpg)

- 同じことをPythonで試してみた結果

``` Python
names = ["凸", "み", "錦"]
names_sorted_by_utf8 = sorted(names, key=lambda name: name)
names_sorted_by_sjis = sorted(names, key=lambda name: name.encode('shift_jis'))

print(f'utf8: {names_sorted_by_utf8}')
print(f'sjis: {names_sorted_by_sjis}')
```

```
utf8: ['み', '凸', '錦']
sjis: ['み', '錦', '凸']
```

# その他考慮が必要そうなこと
- [jaconv](https://pypi.org/project/jaconv/)
    - ひらがな・カタカナの変換が一旦必要
- [natsort 7\.1\.1](https://pypi.org/project/natsort/)
    - 自然順ソートも考慮が必要
    - [Python 3\.x \- Python3 ファイルを順番通りに読み込みたい｜teratail](https://teratail.com/questions/149343)
- 真偽不明
    - [ファイル・フォルダ名の並び順はこの順番だ！記号>数字>… \| ペパコミ株式会社](https://pepacomi.com/archives/381)
    - [日本語のソート順](https://support.claris.com/s/article/%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%81%AE%E3%82%BD%E3%83%BC%E3%83%88%E9%A0%86-1503692994006?language=ja)
【Linux】ls コマンドの結果を１行ずつ表示する

# はじめに
ls コマンドの結果をテキストファイルに入れたり、Excelに貼り付けたりするときに便利なls コマンドのオプションを紹介します。

# ls -1 で1行ずつに表示する

ls コマンドは基本的に横に並べたがります。

```
[root@localhost ~]# ls /etc/
DIR_COLORS               idmapd.conf               profile.d
DIR_COLORS.256color      init.d                    protocols
DIR_COLORS.lightbgcolor  inittab                   rc.d
・・・
```

`ls -1`としてやることで、横並びにならなくなります。

オプションは<font color="red">数字の1</font>であることに気を付けてください。

```
[root@localhost ~]# ls -1 /etc/
DIR_COLORS
DIR_COLORS.256color
DIR_COLORS.lightbgcolor
GREP_COLORS
NetworkManager
PackageKit
・・・
```

# ディレクトリの中身も表示したい
ディレクトリの中身まですべて表示したい(再帰的に表示したい)ときには`ls -1R`とします。

```
[root@localhost ~]# ls -1R /etc/
・・・
/etc/NetworkManager/dispatcher.d:
04-iscsi
11-dhclient
20-chrony
no-wait.d
pre-down.d
・・・
```

<br>
ディレクトリ名:
ファイル名1
ファイル名2
ディレクトリ名1
・・・

といった表記で結果を得ることができます。

# おわりに
使い勝手の良いオプションだと思います。
このオプションを知っているというだけでドヤ顔ができる日が来るかもしれないのでぜひ、覚えておいてください。
Could not locate VRChat data directory for exception watcher. というエラーの対処法

初めまして、Mouleです。自分用メモとしてQitaはじめます。
VRChatのワールド制作をしていたら、Unityにて、「Could not locate VRChat data directory for exception watcher」とかいうエラーがマイフレームコンソールに出続けるようになってしまったのでそれについての記事です。
詳細は記事の後半に書きます。
なおGitを使ってる方は解決策3をおすすめします。

# 解決策1
これは根本的な解決にはならないので根本的に解決したい方は解決策2か3を使ってください。

エラーログを出している該当箇所、UdonSharpRuntimeLogWathcer.csの75行目
> Debug.LogError("[UdonSharp] Could not locate VRChat data directory for exception watcher");

を、コメントアウトしてください。(コメントアウトって何って方は、上の行を削除して代わりに下のコードを貼り付けてください。)

> //Debug.LogError("[UdonSharp] Could not locate VRChat data directory for exception watcher");

これで、エラーを無視するようになります()

# 解決策2
プロジェクトを新しく作り直して、必要なものを全部移行しましょう。
めんどくさいので、可能なら解決策3を使いましょう。
またGitがわからないという方はこちらの記事をおすすめします。
[【Git】【Unity】VRChatterのためのGit入門](https://qiita.com/sansuke05/items/d4dd046eef65a987ed02)

# 解決策3
クローンし直しましょう。
(詳細にも書きますが、自分も原因を完全に理解しているわけではないので、治らなかったらすみません。)


# 詳細
この部分は、新しいことがわかり次第更新される予定です。

### 環境
- MacBook Pro (15-inch, 2019)
- Unity2018.4.20f1
- VRCSDK 2021.5.21.12.23
- UdonSharp v0.19.11

### エラーが出るようになったきっかけ
デバッグのためにEditorでシーンを再生し、処理が重かったのかUnityがフリーズしてしまったので、Unityを強制的に落としたところこのエラーが出るようになりました。
余談ですが、Unityって結構シーン再生中に落としたりするとやばいエラーが発生することが多いです。
Gitで前後の状態を確認しても特に変更はないので、Editorとかのレベルで何かが変わってしまうみたいです。
つまり普段Gitで管理してる部分には何も異常がないので、クローンしなおせば大方治ります。(諸説あります)

### エラーの内容と検証
Could not locate VRChat data directory for exception watcher.
何かのディレクトリが無いって怒ってますね。
ログエラー周りのコードを見てみます。
```
            
            if (logDirectoryWatcher == null && ShouldListenForVRC())
            {
                AssemblyReloadEvents.beforeAssemblyReload += CleanupLogWatcher;
                // Now setup the filesystem watcher
                string[] splitPath = Application.persistentDataPath.Split('/', '\\');
                string VRCDataPath = string.Join("\\", splitPath.Take(splitPath.Length - 2)) + "\\VRChat\\VRChat";
                if (Directory.Exists(VRCDataPath))
                {
                    logDirectoryWatcher = new FileSystemWatcher(VRCDataPath, "output_log_*.txt");
                    logDirectoryWatcher.IncludeSubdirectories = false;
                    logDirectoryWatcher.NotifyFilter = NotifyFilters.LastWrite;
                    logDirectoryWatcher.Changed += OnLogFileChanged;
                    logDirectoryWatcher.InternalBufferSize = 1024;
                    logDirectoryWatcher.EnableRaisingEvents = false;
                }
                else
                {
                    //Debug.LogError("[UdonSharp] Could not locate VRChat data directory for exception watcher");
                }
            }

なにやら、VRCDataPathとやらにあるディレクトリを探してますね。
試しにこれを出力したら以下のパスが見れました。
> \Users\[ユーザー名]\Library\Application Support\VRChat\VRChat

なので、その通りのパスのディレクトリを作ってみたのですが、エラーは変わらず表示され続けました。

### わっかんね
わかんなかったのと、別にエラーのままでいっかなって思ったのでコメントアウトしました、本当にすみません。
Gitで差分を見ても特に異常はなく、過去のコミットに戻ってもエラーは出続けてたので、クローンしなおせば流石に治ると思います(気が向いたら試します)


### あとがき
このエラー文でググっても何も情報が出てこなかったので、将来の自分のために何もわからないまま記事を書きました。
わかる方がいたらぜひ教えてください。
情報が増えたら都度追記します。
読んで頂きありがとうございました。
Linuxで時刻情報・timezoneを変更する方法


## 実行環境
- DegitalOcean
- Ubunt==20.04.2

## 本題
**linux環境でtimezoneを変換したい。**

よくある話だと思います。

調べると、色んな記事があるのですが、私の環境で利用している``degital ocean``について調べると、該当ファイルがなかったり、AWSやGCPとの違いが散見されました。一般的には、AWSやGCPを使う方が多いと思うので、そこまで汎用的な話ではないと思いますが、以下端的に解決方法をまとめます。


## **1.現在のタイムゾーンを確認する**

```terminal:terminal
cat /etc/timezone
```
現在、設定されているタイムゾーンが返されます。

```terminal:terminal
Etc/UTC
```

## **2.使えるタイムゾーンを調べる**

```terminal
timedatectl list-timezones
```

使えるTimezone一覧が使用できます。

```terminal:terminal(一部抜粋)
Asia/Tashkent
Asia/Tbilisi
Asia/Tehran
Asia/Tel_Aviv
Asia/Thimbu
Asia/Thimphu
Asia/Tokyo
Asia/Tomsk
Asia/Ujung_Pandang
Asia/Ulaanbaatar
Asia/Ulan_Bator
Asia/Urumqi
Asia/Ust-Nera
Asia/Vientiane
```

``Asia/Tokyo``が見つかると思います。

## **3.設定を変更**

```terminal
sudo timedatectl set-timezone Asia/Tokyo
```
``Asia/Tokyo``を変えれば適宜変更はできると思います。

## 参考資料
- [Change Local Time Zone?](https://www.digitalocean.com/community/questions/change-local-time-zone)
Avenues物語～より良い教育を目指して～

今回はBejamas社が取り組んだJamstackの事例についてご紹介したいと思います:clap:

Avenuesにとっては、静的なサイトでのパフォーマンスの向上は、合わせて良い事となりました。

著者：アルカディウス・ゴレツキ 2020年2月6日
原文：https://bejamas.io/blog/case-study-avenues/

![2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1242415/e6d6c142-0055-8be2-4c8a-f9c0b2e56b88.jpeg)

興味深くやりがいのあるプロジェクトは私たちのスキルを高めてくれます。有意義で意欲的なプロジェクトは、私たちの心に豊かさをもたらします。そのため、より良い教育で世界を変え、未来を切り拓くことを目指す学校のプロジェクトに取り組めたことはとても光栄でした。

光栄であり、大きな責任です。

##Avenuesの物語

Avenues: The World Schoolは、多くのキャンパスを持つ学校の一つで、世界に焦点を当てた変革的な学習体験を世界中の学生達に提供しています。ニューヨークに本社を置き、サンパウロと深圳にキャンパスを持ち、バーチャルキャンパスを世界中の人々に公開しているAvenuesは、より良い実践方法を開発し、現状に挑戦し、キャンパスだけではなく、世界中の教育に貢献することを使命としています。Avenuesのミッションをウェブ上で紹介するために協力したことは、困難ではありましたが、非常にやりがいのあるものになりました。

###1－1 概要

以前のAvenuesのサイトはWordPressで構築されてから、6年以上が経っていました。長年の維持管理が複雑になってきたため、AvenuesのウェブサイトマネージャーであるDmitry Terner氏は、今後の再設計について明確なアイデアを持っていました。彼は、少なくともあと5年以上はテックコミュニティで主流になる、モダンなウェブ開発アーキテクチャでWordpressを置き換えたいと考えていました。

以前はパフォーマンスが脆弱であり、かつモバイルからの訪問者の割合が大きかったため、スムーズで高速なモバイルフレンドリーなウェブサイトにしたいと思っていました。また、コストを削減して開発を効率化したいとも考えていました。さらに、彼は多言語のリクエストをバックアップするシンプルでエレガントなCMSも求めていました。

###1－2 使用したスタック

問題点やビジョンを考えると、Avenuesはすでにサーバーレスのインフラを持っていたため、ヘッドレスCMSの導入は最初から理にかなっていました。そこからJamstackを選択するのは自然な流れでした。

静的サイト生成ツールとしてのGatsby、コンテンツ管理ツールとしてのStoryblok、ホスティングとCI/CDソリューションとしてのNetlify

>**Storyblok**

>Avenuesの場合、標準的なヘッドレスCMSとシームレスなエディタ用の「ページビルダー」を組み合わせたCMSとしてStoryblokを選択しました。ライブプレビューオプションのおかげで、静的なウェブサイトのコンテンツをより便利に更新することができます。基本的に担当編集者は、これを使えば、新しいページを作ることができるだけでなく、古いページへの変更点がウェブサイト上でどのように見えるかを、再構築を待つことなく瞬時に確認することができます。

このスタックは信頼性の高いユーザー/エディタ中心のコンボであることが証明されたため、すでにいくつかのプロジェクトで使用されています。Storyblokは、編集者がウェブサイトのコンテンツを完全に制御できる素晴らしいCMSです。今までは、中国のサーバーでファイルを保持することが義務化されているという懸念がありましたが、GatsbyとBuddyのスムーズな統合には本当に驚かされました。しかし、いくつかの課題がありました。

>Jamstackのメリットをストレートに受けることができました。コストは、拡張機能の実装の容易さや固有のセキュリティの向上と同様に、明らかにメリットがありました。
ドミトリー・ターナー/アベンニューズのサイトマネージャー

###1－3 このプロジェクトでの最大の課題

本来なら大きな助けになるはずだったStyled-Componentsが私たちの抱えていた最大の課題の一つになりました。

スタイリングされたコンポーネントとは？Styled Components は CSS-in-JS の変形版で、クラス名が衝突せず、実際の CSS コードを書いてコンポーネントのスタイル設定をすることができます。

小さくて、似ているようで違うものをいくつも持つよりもカスタマイズ性の高いコンポーネントを作ることに注力していました。クライアントからの厳しいデザインガイドラインがあり、デザインの悪いコンポーネントはウェブサイト全体のパフォーマンスに悪影響を及ぼす可能性があったため、この作業は非常に困難を極めました。

###1－4 結果

現在のセットアップは、はるかに合理化され、費用対効果が高く、汎用性が高いことが判明しました。まだこれを活用したことはありませんが、APIアクセスでコンテンツレイヤーとプレゼンテーションレイヤーを完全に分離できるようになったことは、Avenuesチームに新たな可能性をもたらしました。彼らは今、キャンパスのロビースクリーン用のアプリケーションを使って、これをどのように拡大できるかを検討しています。サーバーインフラの心配をしなくて済むようになったのは大きなメリットです。

Bejamasにとって、学習は適切な教育から始まる刺激的な旅であり、できれば一生続くことを願っています。人生を教育に捧げる人々と一緒に働くことができたことで、私たちの努力ははるかに価値のあるものになりました。

>BejamasはJamstack製品の専門家として、自社では検討していなかったStoryblok CMSを推奨していました。そのような指導、親しみやすさ、専門知識は、私たちが求めていたものであったため、本当にこのプロジェクトが行えてよかったと思っています。
ドミトリー・ターナー/アベンニューズのサイトマネージャー

Avenuesプロジェクトで、私たちは真に変化を起こし、未来に影響を与え、より速く、より良いインターネットのウェブサイトを一度に構築することができました。

今日の世界に変化をもたらしたと言える人は何人いますか？

最後まで読んで下さり、ありがとうございました:bow_tone1:

Jamstackに関心がある方はこちらまでお問合せください！
**株式会社ヒューマンサイエンス
https://www.science.co.jp/**
Windowsのタスクバーにアナログ時計を


#小さいタスクバーに日付を表示させる
##TClockソフト

デフォルトのタスクバーから、
小さいタスクバーに表示を変更すると、日付が消えてしまいます。

しかし、日付も表示したいというとき、
TClock というソフトを使えば、自由にタスクバーをカスタムすることができます。

[TClock](https://www.vector.co.jp/soft/winnt/personal/se518700.html)

上記リンクからダウンロードして、ZIP解凍してから
exeファイルを起動してください。



##こんな感じ


私の場合、このように設定しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654203/ca31a348-33b5-7b81-71a3-665b0f84db7e.png)


###設定方法

タスクバーを右クリックし、
TClockプロパティを起動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654203/0f545423-33d3-ddbf-84aa-323b0b809eeb.png)


####色とフォント
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654203/794b2f06-5305-df53-eefd-9da6edd6840e.png)


####書式
「自分で書式を入力する」の下の
テキストボックスに好きな時刻表示を書けば反映されます。
CPUの稼働率とかも書けば表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654203/169a398d-e68f-9897-3a8f-8b7d94b7ef81.png)

「mm-dd ddd\nhh:nn:ss ★」
こう書くと
↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654203/e01788f0-a1b0-12c2-b8cd-434f4ef96f01.png)

★が現れた！


####アナログ時計
青と白の棒のやつです。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654203/0eef1387-5337-5e7e-6769-98d24330daf9.png)

####ツールチップ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654203/0125cb19-21f0-66eb-cd4b-6e9a4f6d581d.png)


###スタートアップに設定

Windowsが起動するたびにTClockを起動を設定しておけば、
毎日PC起動時に自動的にTClockも起動されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654203/129f1046-71f7-0f25-c45e-623a26a5434a.png)



他にも、CPU使用量・バッテリー残高・ボリューム設定など
できるので、設定をいじってみてください。
ECHONET Liteの紹介　その２

## はじめに
ECHONET Liteは、スマートホームを実現するための標準インタフェースです。
スマートホームを実現することで、家庭の省エネルギー化を進め、より便利な生活を実現します。ここでは、家庭の省エネルギー化、スマートホームに関係する言葉を紹介します。
## ZEH (net Zero Energy House) とは
家全体のエネルギー消費量を減らした住宅の表し方としてZEHという言葉があります。ZEHとは、簡単に言えば、消費するエネルギーを減らして、創るエネルギーと1年間で同じになるようにして、正味（Net）の消費エネルギー量をおおむね０にする住宅のことです。
ZEHでは、住む人に無理な生活を強いることなく快適な住宅環境を保つことを目指します。
ZEHを実現するための指標は次の３つになります。
![ECHONET Lite 概要_図10.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1369926/0b4752b6-dfc3-7fef-82c3-6e177e83e384.jpeg)
ZEHを実現するため、住宅の高断熱化と高効率設備の採用により省エネルギーに努め、太陽光発電などでエネルギーを創ります。
「エネルギーを上手に使う」とは、個々の設備を高効率(省エネ)にすることが基本ですが、設備とエネルギーを創る発電設備等を連携することで、さらに省エネルギーを実現できると考えられており、この連携を実現するのがECHONET Liteです。
なお、使用するエネルギーの75%が省エネできる場合、Nearly ZEHになります。
## HEMS (Home Energy Management System) とは？
家庭で使うエネルギーを効率的に利用するためにエネルギーを管理するシステムのことです。
管理の仕方には、電気やガスなどの使用量などの情報を集めて、その情報を専用モニターやスマホで見られるようにする「見える化」があります。その住宅に住んでいる人にエネルギーの使用状況を見えるようにすることで、無駄な使い方をしないように気付いてもらうための仕掛けです。
さらには、集めた情報を分析して、エネルギーが無駄にならないよう家庭内の電化製品や住宅設備機器を自動で制御することを目指しています。家庭内の情報としては、スマートメーターによる家庭内の使用電力量、家庭内の電化製品や住宅設備機器の状態、太陽光の発電量などがあります。
これらの情報を集め、制御指示を伝える通信を実現するのがECHONET Liteです。
![ECHONET Lite 概要_図11.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1369926/06ed2a74-3d56-c09b-22fe-6a21da969942.jpeg)
## HEMSを構成する「重点8機器」
家庭部門の省エネルギーを推進するため、政府は、エネルギーに関連が深い家電や住宅設備機器の中から8つの機器を「HEMS重点8機器」と定めました。家庭内のエネルギー最適制御の実現を目指し、HEMSで活用できる機器の製品化、普及を推進しています。
HEMS重点8機器は次の8つの機器になります。
![ECHONET Lite 概要_図12.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1369926/235d9ced-4f04-a143-f9c0-d48a11687f05.jpeg)
## IoT (Internet of Things) とは？
IoTとは、コンピュータやスマホなどの情報・通信機器だけでなく、世の中にあるいろいろなモノが通信機能を持ってモノ同士で直接通信したり、インターネットに接続して情報を相互にやり取りすることです。
インターネットにつながるモノは、デジタル情報家電から始まり生活家電にも広がっています。そこから発信される膨大なデータがAIで分析され、ロボットや車、さらにはモノ(IoT)へのアクションにつながる循環が可能になってきています。
家庭内の生活家電や住宅設備機器などがコントローラを介してインターネットへつながることを実現するのがECHONET Liteです。
![ECHONET Lite 概要_図30.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1369926/8be21ae4-cc73-e901-78fa-46f343553dac.jpeg)
## 住宅分野におけるIoTの活用
IoT技術を活用し、スマートホームがインターネットを通じてクラウド環境と接続され、外部と宅内情報を連携してエネルギー自動制御やセキュリティ監視などを実現することで、お客様に豊かな生活 (QoL : Quality of Life向上サービス) を提供するのがIoT住宅です。
IoT住宅では、エネルギー機器だけでなく家庭内の様々な機器がインターネットに接続するため、ECHONET Liteの活用範囲がさらに広がります。
![ECHONET Lite 概要_図14.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1369926/f5a9afc8-7d4b-d460-1cbf-f8bf5511b4d1.jpeg)