OmniAICreator/Qiita-1.07M huggingface dataset:
【Javascript】Truthy | Falsy values（javascriptにおける真偽値について）

#初めに
javascriptを学ぶ上で基礎的な内容ですが、とても重要なTruthy valuesとFalsy valuesについてまとめてみました。

※内容に間違いなどがある場合はご指摘をよろしくお願いします。

# Falsy valuesとは
booleanに変換した際にfalse(偽）になる値のことをFalsy valuesと言います。具体的には<b>「0, '', undefined, null, NaN, 0n」</b>の６種類があります。

# Truthy valuesとは
Falsy valuesでない全ての値がTruthy valuesになります。

# Boolean関数を使って試してみる
まずはFalsy valuesをBoolean関数を使ってtrueかfalseかをみてみます。

```javascript
    //Falsy values
    console.log(Boolean(0));
    console.log(Boolean(''));
    console.log(Boolean(undefined));
    console.log(Boolean(null));
    console.log(Boolean(NaN));
    console.log(Boolean(0n));
```
予想通り、全てfalseと表示されます。

![スクリーンショット 2021-05-24 7.03.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/966135/5e6f9ddf-5486-8d8b-84db-f80fac7b6730.png)

次はTruthy valuesを試してみました。

```javascript
    // Truthy values
    console.log(Boolean('田中'));
    console.log(Boolean(2));
    console.log(Boolean({}));
    console.log(Boolean([]));
    console.log(Boolean('0'));
```
{}や[]が空でもtrueと返してくれます。'0'も0ではないのでtrueになります。
![スクリーンショット 2021-05-24 7.11.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/966135/41fdb2f0-d6a2-b074-85e3-3f7e0a580caf.png)

# if文などによるロジカルの問題
6種類のfalsy valuesがあることは分かりましたが、このfalsy valuesを意識しないといけない理由について考えてみます。

```javascript
  const money = 0;
    if (money) {
      console.log("お金がありません。");
    } else {
      console.log("お金があります。");
    }
```
上の例で言うと、falsy valuesを知らなかった場合、money=0というのは真実？なのでコンソールには"お金がありません"と表示されると思うかもしれません。どう表示されるかコンソールで確認してみました。
![スクリーンショット 2021-05-24 7.23.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/966135/6a16c9e5-1415-f74b-8bfa-a65655e4bdee.png)
結果はelseの"お金があります"が表示されます。これは<b>0はfalsy valuesであり、戻り値がfalseになるからです</b>。
次にcarをletを使って宣言し、if文を使って判定してみます。

```javascript
 let car;
    if (car) {
      console.log('Car is defined');
    } else {
      console.log('Car is Undefined');
    }
```
結果は以下の通りです。
![スクリーンショット 2021-05-24 7.31.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/966135/a7ab01a7-dae4-1123-c91a-b627aeaacee4.png)
carは宣言されてはいるものの、値を指定していないので値はundefinedになります。undefinedはfalsy valuesになるためelseの'Car is Undefined'が実行されます。
carの値を0として定義してみたらどうでしょう。

```javascript
    let car = 0;      //0の値を指定する
    if (car) {
      console.log('Car is defined');
    } else {
      console.log('Car is Undefined');
    }
```
carの値はundefinedではないため、コンソールには'Car is defined'と表示されるでしょうか。
![スクリーンショット 2021-05-24 7.37.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/966135/4345425b-5b92-a09e-47e1-07c8a47a220f.png)
結果は先と同じように'Car is Undefined'と表示されます。これはcarに指定した<b>0はfalsy valuesであり、if文の判定でfalseとなったためです</b>。

# 終わりに
truthy valuesとfalsy valuesはshort circuituing(&&と||演算子）とnullish coalescing operator(??)日本語で言うと合体演算子を理解するために非常に重要な概念のでしっかり理解したいと思います。

# 参考サイト
https://developer.mozilla.org/ja/docs/Glossary/Truthy
Dockerで立ち上げたLumen(Laravel) + mysqlでマイグレーションを行うとSQLSTATE[HY000] [2054] The server requested authentication method unknown to the clientエラーが起きる

LumenとMysqlを触っていて少しはまったので備忘録として残しておく。

#参考サイト
【Laravel】MySQL 8でmigration時にエラーが出たときの対処方法
https://takakisan.com/laravel-mysql-8-migration-error-fix/

#状況
Dockerで立ち上げたLumen(Laravel) + MySQL で Lumenのコンテナに入り
以下のコマンドを入力

```:Lumen_cmd
php artisan migrate
```

その後、以下のようにエラーが発生する。
![mysql.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517290/d7d83062-85a4-0443-21b5-b6e5620701ae.png)

#Dockerコード(MySQL)
MySQLのDockerfileのコードは以下

```:Dockerfile
FROM mysql:8.0.16
```

MySQL部分のdocker-compose.ymlのコードは以下

```:docker-compose.yml
mysql:
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: keijiban
      MYSQL_PASSWORD: root
      MYSQL_USER: user
```

#Lumenでの.envファイル
.envファイルでのmysql設定部分は以下

```:.env
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=keijiban
DB_USERNAME=user
DB_PASSWORD=root
```

#調べた結果
どうやらMySQL8ではユーザー作成時の認証方式のデフォルトがcaching_sha2_passwordになっているのが原因

#MySQLを調べてみる
まず、Mysqlのコンテナに入り、Mysqlにログイン、
今回、ユーザー名と認証プラグインがわかればいいので以下のコマンドを入力

```:MySQL_cmd
select user, plugin from mysql.user;
```

すると以下のように出力され、user部分がcaching_sha2_passwordであることがわかる。
![mysql2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517290/931d80c8-4ef3-f0f6-a82e-30effcd2ddc3.png)

#MySQLの変更
その後、確認ができたらcaching_sha2_passwordの認証方式を変更する。
変更するには以下のコマンドを入力

```:MySQL_cmd
alter user 'user' identified with mysql_native_password by 'pass';
```

※今回、.envファイルでDB_USERNAME=user、DB_PASSWORD=rootと指定しているので、'user'部分はuser、'pass'部分はrootに変更(この部分は指定しているのに合わせて)

コマンドを入力後、再度ユーザー名と認証プラグインを確認してみると
![mysql3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517290/f411e0a1-5a3f-593c-2d71-d2ff296467fc.png)
このようにcaching_sha2_passwordからmysql_native_passwordに変わっていることが確認できる。

#Lumenで再度php artisan migrateを行ってみる。
MySQLの認証プラグインの変更が終われば、MyAQLのコンテナから抜け、Lumenのコンテナに入り再度

```:Lume_cmd
php artitisan migrate
```

を入力、
![lumen.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517290/6682bb61-508b-680f-5076-5f88dafcc6e2.png)
このように、マイグレーションが成功する。
[Xcode] ここ数年、春先から最新のiOS SDKビルドじゃないとバイナリアップロードができなくなっている問題の解説と、プロダクトマネジメント上で必要な考慮

Xcode 11 / iOS 13で以下のような話題が上がりまして…
[[速報] 2020年4月の審査から、iOS 13 SDK（Xcode 11.xでのビルド）が必須になる（追記あり）](https://qiita.com/y-some/items/4d5df3606145a3a36522) - Qiita

Xcode 12 / iOS 14でも同じでした。
→2021年4月26日以降、iOS 14 SDK（Xcode 12.xでのビルド）が必須に
[App Storeへの提出に関するアップデート](https://developer.apple.com/jp/news/?id=ib31uj1j) - Apple Developer ニュースとアップデート

ここ数年の流れを踏まえると、プロダクトマネジメントの観点で、以下のような認識を持つ必要があります。

- 毎年9月にiOSとXcodeのメジャーアップデートがあり、翌年4月以降、最新メジャーVerのSDKでビルドしないと**ビルドをAppleのサーバーにアップロードできない＝審査提出できない（バグ対応ですら）。**
- Xcodeのバージョンアップに伴い、Swiftコンパイラのバージョンが上がって、**アプリのコードを修正しなければならないことがある。**
- さらには、**ライブラリの対応状況の事前調査も必要。**

すなわち、
Xcodeの新バージョンが出る9月〜そのVerのビルドでの審査提出が必須となる翌4月の間に、
アプリへの影響調査と、場合によっては改修が必要であり、
**あらかじめそのタスクをマスタースケジュールに盛り込んだ方が良いと考えます。**

＜参考＞バージョンの対応表（抜粋）

| Xcode | iOS SDKs | Swift |
|:-:|:-:|:-:|
| 12.0 | 14.0 | 5.3 |
| 11.0 | 13.0 | 5.1 |
| 10.0 | 12.0 | 4.2 |
パスワードをリセットする方法がないが、組織にアクセスできる場合の回避方法

知らんかったなぁ。裏ワザだ。

1. Open the developer console by clicking on the gear icon
2. Press CTRL+E to open the execute anonymous window
3. Enter the following code:
System.resetPassword(UserInfo.getUserId(), true);

​​​​​​4. Click the execute button

https://qiita.com/drafts/599185382d9d14a2838e/edit
plunkerでcssフレームワーク その12

#概要

plunkerでcssフレームワークやってみた。
uikit使ってみた。

#サンプルコード

```
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/uikit@3.2.6/dist/css/uikit.min.css" />
<script src="https://cdn.jsdelivr.net/npm/uikit@3.2.6/dist/js/uikit.min.js"></script>

```

#成果物

https://embed.plnkr.co/plunk/63c02k3f3bLYACnS

以上。
plunkerでcssフレームワーク その11

#概要

plunkerでcssフレームワークやってみた。
materialize使ってみた。

#サンプルコード

```
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0-rc.2/css/materialize.min.css">
  <script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0-rc.2/js/materialize.min.js"></script>

```

#成果物

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

以上。
plunkerでcssフレームワーク その10

#概要

plunkerでcssフレームワークやってみた。
foundation使ってみた。

#サンプルコード

```
<link href="https://cdnjs.cloudflare.com/ajax/libs/foundation/6.4.3/css/foundation.min.css" rel="stylesheet">

```

#成果物

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

以上。
rails5アプリのローカル開発環境メモb

#ローカル開発環境をスムーズに行うために簡素版

ローカルの開発の時に急に詰まることありませんか？
僕は、ちょいちょいエラーが起きてしまうことがあるので、
備忘録としてこのメモを残します。
注意としては、Rails6には慣れていないので、Rails5を選んでいます。

##開発環境

macOS Bigsur 11.3.1
Ruby 2.7.2
Rails 5.2.6
Bootstrap 4.5.0
Devise

- - -

##準備開始

```ruby:初期処理
#最初に行うのはinit
bundle init

#このオプションを入れることで、プロジェクトのvendor/bundle以下にgemが格納される
bundle install --path vendor/bundle

#ここで、いよいよrailsをインストール
bundle exec rails new . -B --skip-turbolinks
#herokuへデプロイするならpostgrsqlを選択
bundle exec rails new . -B -d postgresql

#今回はこれ
bundle exec rails _5.2.6_ new . -B --skip-turbolinks
```

これに変更
gem 'rails', '~> 5.2.6'
gem 'sqlite3', '~> 1.3.6'

###最低限のgitignore
```ruby:igore
.DS_Store
/vendor/bundle
/.idea
```

勝手に作られてしまうファイルがあったり、gemはgitの管理下に置かないので
こんな感じの設定で。

あとは、`bundle install`や`bundle update`を行って
gemなどをインストールするのを忘れず。
一応、`rails s`して挙動は確認すること。
忘れがちなデータベース作成も`rails db:create`忘れずにすること。
railsに毎回怒られるw

##GitHubへプッシュ

```ruby:GitHub
git init
git add .
git commit -m "first commit"
git remote add origin https://github.com/username/hoge.git
git push -u origin master
```

参考記事
・[その1](https://qiita.com/d0ne1s/items/16b0815bb5bc0ed13eb8)
・[その2](https://qiita.com/yuitnnn/items/b45bba658d86eabdbb26)
・[その3](https://qiita.com/take18k_tech/items/a36d77316e32a6696205)
集合

```py
>>> a={1,2,2,3,4,4,5,6}
>>> a
{1, 2, 3, 4, 5, 6}
>>> type(a)
<class'set'>
>>> b={2,3,3,6,7}
>>> b
{2, 3, 6, 7}
>>> a-b
{1, 4, 5}
>>> b-a
{7}
>>> a & b
{2, 3, 6}
>>> a | b
{1, 2, 3, 4, 5, 6, 7}
>>> a ^ b
{1, 4, 5, 7}
>>> s={1,2,3,4,5}
>>> s
{1, 2, 3, 4, 5}
>>> s[0]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'set' object is not subscriptable
>>> s.add(6)
>>> s
{1, 2, 3, 4, 5, 6}
>>> s.add(6)
>>> s
{1, 2, 3, 4, 5, 6}
>>> s.remove(6)
>>> s
{1, 2, 3, 4, 5}
>>> s.clear()
>>> s
set()
>>> f=['apple', 'banana', 'apple', 'banana']
>>> f
['apple', 'banana', 'apple', 'banana']
>>> set(f)
{'banana', 'apple'}
>>> kind=set(f)
>>> kind
{'banana', 'apple'}
>>> 
```
【Blender基本ショートカット】ブレンダーでモデリングするときによく使うショートカットまとめ

# はじめに
Blenderを使用した際に使うショートカットのメモです。
気ままに更新、追加していく予定です。

<br>
#移動 " G "

移動したい点、辺、面を選択し、Gキーを押すと移動することが出来ます。
![vijr1-u8qo5.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1208356/99b67d66-1e47-431f-b680-502db07099fb.gif)

https://youtu.be/KLCbRv7Hhl4




### X, Y, Z軸を移動 " G + (X,Y,Z) "

Gキーを押したあと、X, Y, Zキーを押すとその軸のみ移動するようになります。

### X, Y, Z軸以外を移動 " G + Shift + (X,Y,Z) ​"

Gキーを押したあとShftキーを押し、さらに、X, Y, Zキーを押すとその軸以外を移動するようになります。


###辺上を移動" G + G "

点を選択した状態でGを2回押すと、点が辺に沿って移動するようになります。

<br>
#回 転 " R "

回転させたい点、辺、面を選択し、Rを押すと回転させることが出来ます。

<br>
#拡 大・縮小 " S "
###面 をそろえる" S + (X,Y,Z) + 0"

Alt　＋S　法線方向に拡大縮小

水平反転　S + X,Y,Z + -1

<br>
#辺 ・面の作成 " F "

作成したい面となる部分の点か辺を選択し、Fキーを入力すると選択した点や辺の中を埋めるように面が作成されます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1208356/fc5634bb-4796-d67d-13a4-56660142b671.png" width="370">　　<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1208356/4e4d8ea0-13a8-7e66-8bfc-f3afa850bccc.png" width="370">

<iframe width="560" height="315" src="https://www.youtube.com/embed/WLKRYeEXy3U" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

<br>
#頂点をMesh上でつなぐ " J "

作成したい面となる部分の点か辺を選択し、Fキーを入力すると選択した点や辺の中を埋めるように面が作成されます。


<br>
#点 ・辺・面の押し出し " E "

<br>
#複 製 " Shift + D  "
###リ ンク複製 " Alt + D  "

<br>
#結合 ' Ctl + D '



<br>
#ループカット ' Ctr + R ' 

<br>
#非 表示 " H "
###選 択中以外を非表示 " Shift + H "
###再 表示 " Alt + H "

<br>
#ループ選択　' alt + 右クリック '
###リング選択 ' Alt + Ctr + 右クリック'

<br>
3Dカーソルを原点に移動 ' Shift C '


Lキー１メッシュを　全選択

P　分離aa

ctl + J オブジェクトの結合


面の向き反転　Alt＋N
Laravel HomesteadをApple Silicon(Apple M1)で利用する

Apple Silicon上のParallels Desktopに対応したLaravel Homestead非公式ビルド([Laravel Homestead Unofficial Build for Parallels Desktop on Apple Silicon](https://app.vagrantup.com/yodoware/boxes/homestead-arm64))により、Apple Silicon上でLaravel Homesteadを利用します。

VagrantからParallels Desktopを操作するために、Parallels Desktop for MacのPro Edition以上が必要です。

# 筆者の環境

* Apple M1
* macOS Big Sur 11.3.1
* Parallels Desktop 16 for Mac, Pro Edition 16.5.0 (50692)
* Vagrant 2.2.15

# 設定

`Homestead.yaml` を以下のように設定して、`vagrant up`します。

```yaml
provider: parallels
box: yodoware/homestead-arm64
version: '>= 11.3.0'
```

`vagrant ssh`で接続できます。その他操作方法は、通常のLaravel Homesteadと同じです。
Vue、Vuetifyでvue-test-utilsを使用して、ファイルのダウンロードをテストするときに、window.location.hrefを書き換える方法

##window.location.hrefを書き換える方法

```
// window.location.hrefを書き換える
global.window = Object.create(window);
Object.defineProperty(window, 'location', {
    value: {
        href: "",
    },
});
```


##記述例↓

```
    it('xxxテスト', async () => {
        // mountする
        const wrapper = mounted(localVue, vuetify, mount, dataNormal, propNormal);
        await flushPromises(); // Promise を即時に resolve

        // window.location.hrefを書き換える
        global.window = Object.create(window);
        Object.defineProperty(window, 'location', {
            value: {
                href: "",
            },
        });

        axios.get.mockResolvedValueOnce(downloadResponse)

        // ダウンロードボタンをクリックシミュレート
        expect(wrapper.find('#download_button').exists()).toBe(true)
        const button = wrapper.find('#download_button')
        button.vm.$emit('click')
        await flushPromises();

        expect(window.location.href).toBe("http://download-url-test")
    })

    // mountファンクション
    function mounted(localVue, vuetify, mountType, data, props) {
       return mountType(DownloadResponseHistory, {
            localVue,
            vuetify,
            data: data,
            propsData: props
        })

    // ダウンロードのレスポンス
    const downloadResponse = {
        status: 200,
        data: {
            "download_url": "http://download-url-test",
        }
    }
```
ESXiでOVFファイルのエクスポート、インポートを試す

#　目的

ESXiからエクスポートしたOVFファイルをESXi、Hyper-vへインポートする

# 環境

### Hyper-vはあとで記載

![環境図.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1522163/9a4768d4-4d8e-9355-33c5-beefdda091be.jpeg)

# 実施方法


### エクスポートしたい仮想マシンを選ぶ

仮想マシンを右クリック-エクスポートをクリック

![export.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1522163/02c0df51-47ad-1286-d090-05ee77c3e5e3.jpeg)


### エクスポート


エクスポートをクリック

![export2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1522163/bfdbd9f3-139d-ee0a-6d1d-29c844d9c2ed.jpeg)

## なぜか止まる

50%でなぜか止まってしまいます

![stop.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1522163/e50f5223-e763-3c79-ab53-a566bd8a5994.jpeg)

## 解決策

OVFツールを使うことでエクスポートすることができました。

OVFTOOL
https://code.vmware.com/web/tool/4.4.0/ovf

### OVFtoolを使用したインポート

以下のようなコマンドを実行します

実行する場所
C:\Program Files\VMware\VMware OVF Tool
※デフォルトなら

.\ovftool.exe --noImageFiles vi://root:PASSWORD@192.168.1.100/win2016_struct_test D:\temp(出力先)

詳しくはヘルプを参照

### インポートできたことを確認

![inport.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1522163/1c95d85c-2860-29a2-b125-91971ed8d918.jpeg)

### OVFでインポート

![OVF.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1522163/fd2be56c-e922-a39c-0917-bc2780b0b782.jpeg)

次へ

![ovf2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1522163/73dc8c4b-b5ce-9a9b-972b-787d9e1d8612.jpeg)

先ほどエクスポートしたOVFファイルとvmdkをドラッグ＆ドロップします

![ovf3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1522163/86f2a649-11d5-4cba-4f3c-a0865b9d6207.png)

次へ

![ovf4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1522163/0e674351-6727-c102-2a10-d71efecd5353.png)

次へ


以下のようなエラーが出ました

![sippai.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1522163/8de43056-5656-183b-c452-c9a9e800e84b.jpeg)


## 原因

nvramファイルがないから
以下の公開情報にvmramファイルについて記載されています
https://docs.vmware.com/jp/VMware-vSphere/7.0/com.vmware.vsphere.vm_admin.doc/GUID-CEFF6D89-8C19-4143-8C26-4B6D6734D2CB.html

仮想マシンの BIOS 設定の状態が保存されているようです
ディスクのブート順序等が関係するかとおもわれます

### nvramファイルも入れてもう一度

エラーが出ませんでいた

![seikou.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1522163/e49df701-d1cf-08f9-8081-45d87684a235.jpeg)

### 動作確認

sql serverなども問題なく動いています

![sqlok.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1522163/15561992-5748-939e-d64a-9467fafd1f53.jpeg)


### 注意点

ESXi、Vcenter　Server等互換性の問題もあるので要チェック

https://kb.vmware.com/s/article/2007240?lang=ja
https://interopmatrix.vmware.com/#/Interoperability
【UiPath】右クリックでセレクターに変数入れてみた


※※初投稿で緊張してます。大目に見てやってください。※※

#自己紹介
はじめましてこんにちは。馬刀貝と申します。
あ、「まてがい」と読みます。
知っている方は知っていると思うのですが、潮干狩りで取れるあの貝です。
酒蒸しにするととんでもなくおいしいですよね～。
[まてがいの酒蒸しのレシピ](https://www.kurashiru.com/recipes/c5c686cc-778d-4ed4-84ea-ebdfe7989d5e)

そんなマニアックな名前はまあ被らないので
「既に使われています」のストレス回避にもってこいなんです。
ゲームとかの名前にもよく使ってます。モンハンとか。

#今回の目的
私はなんやかんやで仕事でずっとUiPath触ってる人間なのですが
「セレクターに変数を入れる」って記事、そういえばないんですよ。
使いこなせるとめちゃ実用的なんですけどね。
お客さんや新入りメンバーに説明するとき「このサイト見て！」って言えるものを
自分で作っちゃえ！と思って投稿をするに至りました。

結構古い記事で＋とかで結んだり、idx要素を使っていじっている記事なら多いんですが
ぶっちゃけそこまで難しいことせずに
今回はタイトル通り「右クリック」でブチ込んでいければと思います！

#材料
・UiPath
・[モンハンライズの攻略サイト](https://kamigame.jp/MH-RISE/page/145436122246284480.html)

下準備
①サイトを開いておく。中部あたりの「大型モンスター早見表」を使います。
②適当なString型の変数を作っておく。私は「モンスター名」にしました。
③「代入」と「クリック」のアクティビティを入れておく。

#いざ調理
まずはクリックで、セレクターの様子を確かめます。
「画面上で指定」を使ってお好きなモンスターの名前をクリックしちゃってください。

![無題1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1543695/ba8270d7-67e2-cf68-7018-e89623d6f331.png)

画像よりは「名称」をしっかりキャッチできている状態が望ましいです。
完了したら「セレクターを編集」で、様子を見てみます。

![無題2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1543695/02dac234-2f88-e860-1b24-733c93bc1852.png)

なるほどな、「aaname」の部分をいじればもしかすると動的にできるかもな、、、？
と期待を寄せつつ、この部分を手動で「ティガレックス」に変更して、強調表示してみます。
空白がいっぱい入ってるのはよくわかんないですが、まあそっとしておきましょう

![無題3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1543695/bed6a77d-eb83-4fcc-d301-8fd7d5d9608d.png)

わーい移り変わった～

![無題4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1543695/96d53e8e-c66b-ee87-e434-92ab1fd5591a.png)

ということはこの「aaname」の部分に変数を入れて、
ティガレックスやらベリオロスやらアカムトルムやらを代入しておけば
変数に対応したリンクがクリックできそうですね^^


ということで、名前の部分をいったんまっさらにして、右クリックします。
![無題5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1543695/28fd0998-6c35-380c-e0c0-2cfede66c7a0.png)

するとあら不思議、こんな風に「変数を選択」って項目が出てくるんですね。
UiPathで右クリックってあんまり使わないので意外ですよね～
あとは適当に作った変数を選択してあげればおっけーです。
{{変数名}}で囲まれる感じになります。無理やりブチ込まれてる感あって私は好きです。

![無題6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1543695/72bf5992-38b5-31fb-d31c-6d6f562dd030.png)

上下はリンクしているはずなんですが、
たまに片方だけしか変更が反映されてないことがあるので注意が必要です。
あとは変数の中身をいじくりまわして遊んでみてください。


#使いどころ
どうしても検索窓が無くて、1つに絞り込むのが難しい場合や
毎回並びが変わってしまうリンク群の中から
特定のものをクリックしたい場合などに使えると思います。

#おわりに
もし需要があった場合は
「データスクレイピング」との合わせ技によるクリックなどもご紹介しようと思います。
ここまでご覧いただきありがとうございました。
お役に立てていれば幸いです。
ぜひチャンネル登録と高評価をお願いします(？)
Exchange 2010 ユーザーの最終更新日時を取得

# 環境

Exchange Server 2010


# 確認方法

1  管理コンソールを開く
2  「受信者の構成」-「メールボックス」を開き 右クリック
3  「表示」-「列の追加/削除」をクリック

![exchange1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1522163/d2034893-00ff-eb29-2774-682ef4c8d4a2.jpeg)

4  「最終更新日時」を追加し「OK」をクリック

![exchange2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1522163/137aa293-1451-667e-6912-dd99f6672477.jpeg)

5 「最終更新日時」列が追加されていることを確認

![exchange3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1522163/5cd11f6a-bd05-82ad-f342-9d9223fa6860.jpeg)

# その他

https://o365reports.com/2019/06/18/office-365-users-last-logon-time-incorrect/

LastActionTimeが正しいという情報があるが、Exchange2010ではそのようなパラメータはない
LastLogontime以外日付と思わしき値はない

MSから公開情報があるわけではないため、何で更新される値かは不明

powershellのフォーマットリストで得られる値を参考に載せます

```
RunspaceId              
AssociatedItemCount     
DeletedItemCount        
DisconnectDate          
DisconnectReason        
DisplayName             
ItemCount               
LastLoggedOnUserAccount 
LastLogoffTime          
LastLogonTime           
LegacyDN                
MailboxGuid             
ObjectClass             
StorageLimitStatus      
TotalDeletedItemSize    
TotalItemSize           
MailboxTableIdentifier  
Database                
ServerName              
DatabaseName            
MoveHistory             
IsQuarantined           
IsArchiveMailbox        
Identity                
MapiIdentity            
OriginatingServer       
IsValid                 
```
OpenpyxlでPythonからExcelファイルを操作

### お約束

Excelのファイルは以下のような階層構造があります。

1. Workbook
1. Sheet
1. Cell

特定のセルを読みたければ、「ワークブックを開いてシートを開いてセルを開く」が必要です。

### インストール

- 必要に応じて仮想環境を有効化すること

```
python -m pip install openpyxl
```

### Pythonでパッケージ読み込み

- `NameError: name 'openpyxl' is not defined`とか出たらこれをやる

```
import openpyxl
```

### ワークブックを開く

- カレントディレクトリに「sample.xlsx」があることを想定

```
workbook = openpyxl.load_workbook("sample.xlsx")
```

### シートを開く

- 上記で開いたワークブックに「Sheet」シートがあることを想定
    - シート名はケースセンシティブなので注意

```
sheet = workbook["Sheet"]
```

### 単一セルを選択

- 上記で開いたシートの「A1」セルを選択

```
cell_A1 = sheet["A1"]
```

### セルから情報を取得

- 上記で開いたセルを対象に実行

```
# 入力値
cell_A1_value = cell_A1.value
print(cell_A1_value)

# ハイパーリンク
cell_A1_link = cell_A1.hyperlink.target
print(cell_A1_link)

# フォント
cell_A1_font = cell_A1.font
print(cell_A1_font)
```

### セルに情報を設定

- 上記で開いたセルを対象に実行
    - 後述の**保存を行わないと反映されない**ので注意

```
# 入力値
cell_A1.value = "Qiita"

# ハイパーリンク
cell_A1.hyperlink.target = "https://qiita.com/"

```

### 列の追加

- 上記で開いたシートを対象に実行
    - 後述の**保存を行わないと反映されない**ので注意

```
# A列が1。以下の例ではB列の位置に列を挿入。B列はC列へ移動
sheet.insert_cols(2)
```

### 行の追加

- 上記で開いたシートを対象に実行
    - 後述の**保存を行わないと反映されない**ので注意

```
# 1行目が1。以下の例では2行目の位置に列を挿入。2行目は3行目へ移動
sheet.insert_rows(2)
```

### ワークブックを保存

- 上記で開いたワークブックを保存

```
# 開いたファイルと同名を指定すると上書き
workbook.save("sample.xlsx")

# 開いたファイルと別名を指定すると新規作成
workbook.save("sample_changed.xlsx")
```
C/C++迷信集でおなじみきじねこさんのWebサイト、再構築につきコンテンツ消滅、リライトへ

[C/C++迷信集](https://web.archive.org/web/20191011111928/http://www.kijineko.co.jp/tech/superstitions)などでおなじみ、きじねこさんのWebページが、再構築されたようだ。

C++の標準規格、周辺環境が目覚ましい発展を遂げる中、相対的に若干のふるさを感じるものの、良質なコンテンツのあるWebサイトだったが<sup>[独自研究]</sup>、この度サイトの再構築、HTTPS化と同時に、記事の内容そのものも刷新するそうだ。

> [今後の計画 ｜ 株式会社きじねこ](https://www.kijineko.co.jp/%e4%bb%8a%e5%be%8c%e3%81%ae%e8%a8%88%e7%94%bb/)
>
> 基本的に当面は毎日更新を目指そうと考えています。そうはいってもどうしても投稿できない日は出てきますので、1年継続して300投稿できれば成功だと思っています。幸いにしてリライトすべき過去の投稿は大量にありますから、1年やそこらでもネタ切れしないと高をくくっています。

ただし、過去の記事が短期的には消滅したことになり、またすべての記事がリライトして復活するとも考えづらい。

> [モダンC++のHello, World! ｜ 株式会社きじねこ](https://www.kijineko.co.jp/%e3%83%a2%e3%83%80%e3%83%b3c%ef%bc%8b%ef%bc%8b%e3%81%aehello-world/)
>
> まだ何もないWebサイトなのに大勢の方に訪問していただきありがとうございます。また、旧サイトのコンテンツ目当てに来られた方にはご迷惑をおかけしています。必要な方は[アーカイブ](https://web.archive.org/web/20191011111915/http://www.kijineko.co.jp/)を参照していただければ幸いです。

そのためWebArchiveへの誘導がされているようだ。

早速上がっているリライトされた記事である[モダンC++のHello, World! ｜ 株式会社きじねこ](https://www.kijineko.co.jp/%e3%83%a2%e3%83%80%e3%83%b3c%ef%bc%8b%ef%bc%8b%e3%81%aehello-world/)を見てみる。

文字列は初学者にとってはUDLsを用いることで、`std::string`であるべきだという主張が見られる。これは[江添亮氏のC++入門書](https://github.com/EzoeRyou/cpp-intro/blob/master/003-guide-to-c%2B%2B.md#%E6%A8%99%E6%BA%96%E5%87%BA%E5%8A%9B)でもおなじ主張がされている。C++のHello Worldもいつの間にか大変革を終えていたようだ。

---

私自身もここからの引用やらそこへのリンクやらしているので差し替えないとなぁ・・・。
CTAS（Create Table As Select）他テーブルを利用したテーブルの作成方法

#目的
TeradataにおけるCTAS（Create Table As Select）他テーブルを利用したテーブルの作成方法

#コマンド
| 内容 | コマンド | 実行例・補足 |
|:-:|:-:|:-:|
| 他テーブルを利用したテーブル作成  | Create table [テーブル名] as (select * from [元テーブル名]) with data; |   |
|   |   |   |
|   |   |   |
#実行例
```
create table t2 as (select * from t1) with data;

 *** Table has been created. 
 *** Total elapsed time was 54 seconds.


 BTEQ -- Enter your SQL request or BTEQ command: 
select count(*) from t1;

select count(*) from t1;

 *** Query completed. One row found. One column returned. 
 *** Total elapsed time was 1 second.

   Count(*)
-----------
   16777216

 BTEQ -- Enter your SQL request or BTEQ command: 
select count(*) from t2;

select count(*) from t2;

 *** Query completed. One row found. One column returned. 
 *** Total elapsed time was 1 second.

   Count(*)
-----------
   16777216


```

#参考
[Using Teradata SQL: Create a table from another table or select statement](https://www.muddydogs.life/2015/08/10/using-teradata-sql-create-a-table-from-another-table-2/)
[]()
[]()
標準入力のScannerを1度closeしたら、2度と標準入力できない理由を調べた

#概要

Javaで標準入力ストリームのScannerを1度close()すると、再度Scannerクラスのインスタンスを生成しても標準入力ができなくなります。

```Java:Sample.java
Scanner sc1 = new Scanner(System.in);
sc1.close();
Scanner sc2 = new Scanner(System.in);
String input = sc2.nextLine(); // NoSuchElementException
```

理由は、「標準入力ストリームはプログラム開始時に開き、sc生成時に開くわけではない。一方で、sc.close()すると標準入力ストリームが閉じてしまうため」です。

「当たり前じゃん」と思ったらそれでOK。
以下、もう少し詳しく説明します。

#私が誤解していた点
私は上述のエラーについて、「Scannerクラスのインスタンスを新しく生成しているんだから、読み込めてもいいのでは？」と思っていました。
これは、Scannerクラスとストリームの関係があいまいだったゆえの誤解です。

実際は new Scanner(System.in);
においてストリームはSystem.inです。
inはSystemクラスのstaticフィールドであり、InputStream型です。

```Java:System.java
/**
* The "standard" input stream. This stream is already
* open and ready to supply input data. Typically this stream
* corresponds to keyboard input or another input source specified by
* the host environment or user.
*/
public final static InputStream in = null;
```

#sc.close()すると何が起きる？
scというスキャナをクローズするわけですが、その際に可能ならストリームも閉じます。
つまり、以下のコードでは、標準入力ストリームSystem.inが閉じます。

```Java:Sample.java
Scanner sc = new Scanner(System.in);
sc.close();
```

Scanner.close()を読むと、確かにsource（ここではSystem.in）に対してsource.close()を試みています。
なお、sourceはScannerインスタンス生成時の引数です。また、InputStreamはCloseableです。

```Java:Scanner.java
public void close() {
    if (closed)
        return;
    if (source instanceof Closeable) {
        try {
            ((Closeable)source).close();
        } catch (IOException ioe) {
           lastException = ioe;
        }
    }
    sourceClosed = true;
    source = null;
    closed = true;
    }
```


#サンプルコードを用いた解説
```Java:Sample.java
//プログラム開始
//既に標準入力ストリームは開いている

//スキャナを生成したが、ここで標準入力ストリームが開くわけではない
Scanner sc1 = new Scanner(System.in);

//スキャナを閉じると同時に、System.in（標準入力ストリーム）も閉じる
sc1.close();

//スキャナを生成したが、ここで標準入力ストリームが開くわけではない
Scanner sc2 = new Scanner(System.in);

//標準入力ストリームが開いていないのでエラー
String input = sc2.nextLine(); // NoSuchElementException

//プログラム終了時に標準入力ストリームが開いていた場合、自動で閉じる
//プログラム終了
```

System.inを引数にスキャナを生成しても標準入力ストリームは開きませんが、sc.close()するとSystem.inまでclose()するということです。
これが、標準入力のスキャナを1度closeしたら、（再度スキャナを生成しても）2度と標準入力できない理由です。



#eclipseが警告してくる理由（推測）
これ、実用上は「毎回Scannerクラスのインスタンスを生成する必要はない」「標準入力ストリームはプログラム終了時に自動的に閉じるから、明示的に閉じる必要はない」というだけの話です。

でも、eclipseで次のようなプログラムを書くと警告してくるんですよね。

```Java:Sample2.java
public static void main(String args[]) {
    inputName();
    inputName();
}
static void inputName() {
    Scanner sc = new Scanner(System.in); 
    //リソース·リーク：scが閉じられることはありません
    String name = sc.nextLine();
    System.out.println("名前：" + name);
}

```
「へぇ、じゃあ閉じます」と思ってinputNameの最後にsc.close()を追加すると、エラーが出るわけです。

なんなんだという感じですが、これはスキャナが標準入力ストリーム専用ではないことに起因すると推測しています。
つまり、scは明示的に閉じるべきストリームのスキャナかもしれないので、eclipseが保守的に警告を出してくれている、ということです。
標準入力ストリームの場合はこの警告は無視して構いません。

#未解決点
###①標準入力ストリームをclose()したあと、無理やり改めて開く方法は存在する？
そもそも「ストリームを閉じる」って具体的に何が起きている？？
InputStream.close()のコードを呼んでも分からなかった（抽象クラスだし）
###②標準入力ストリームは具体的にはどう開いている？
「プログラム開始時に自動で開く」らしいけど、特別な実行が行われている？それとも通常のクラスと同様の処理がされている？
後者なら、System.inはstaticフィールドだから、Systemクラスが最初に使われる時にメモリにロードされるはず。でもSystemクラスはインスタンス生成不能だし、プログラム開始時にSystem.inを呼び出しているということ？
①と合わせて、ストリーム周りやJVMの本質的な理解が必要そう。
【React】A component is changing a controlled input to be uncontrolledの解決方法

<h2>症状</h2>
MaterialUIのtextFieldの文字を変更した際に、下記エラーが発生しました。
また、フォーカスをテキストフィールドから外したとき、ラベルが文字と重なってしまう事象も発生しました。


```
Warning: A component is changing a controlled input to be uncontrolled. This is likely caused by the value changing from a defined to undefined, which should not happen. Decide between using a controlled or uncontrolled input element for the lifetime of the component. More info: https://reactjs.org/link/controlled-components
```

エラー内容をそのままグーグル翻訳に投げると、
「警告：コンポーネントが制御された入力を制御されないように変更しています。これは、値が定義済みから未定義に変更されたことが原因である可能性がありますが、発生しないはずです。コンポーネントの寿命の間、制御された入力要素を使用するか、制御されていない入力要素を使用するかを決定します。詳細：https：//reactjs.org/link/managed-components」

該当するTextFieldのソースがこちらになります。

```react:TextField
import React, { useContext,useContext } from 'react';
import TextField from '@material-ui/core/TextField';
import { makeStyles } from '@material-ui/core/styles';
import NameDispatch from "../reducer/nameReducer";
import {NameState,NameDispatch} from "../context/Context";

export const MaterialUINameLine() {
    const NameLineState = useContext(NameState)
    const NameLineDispatch = useContext(NameDispatch)

    const handleChange = (event) => {
      NameDispatch({
        type:NAMECHANGE,
        payload:{
          namae: event.target.value
        }
      })
    };

 return (
   <div>
        <form className={classes.root} noValidate autoComplete="off">
          <TextField 
            id="outlined-basic" 
            label="価格" 
            variant="outlined" 
            fullWidth
            value={state.name}
            onChange={handleChange}
        />
      　</form>
    </div>
  );
}
```


<h2>解決方法</h2>
handleChangeで値を更新する際のReducerに渡す箇所を直したら、エラーが解消されました。

```react:TextField
//before
 const handleChange = (event) => {
      NameDispatch({
        type:NAMECHANGE,
        payload:{
          namae: event.target.value
        }
      })
    };

//after
 const handleChange = (event) => {
      NameDispatch({
        type:NAMECHANGE,
        payload:{
          //↓ここ
          name: event.target.value
        }
      })
    };

```

エラーの原因としては、値がundefinedやnullになってしまった場合、本エラーが発生するようです。

このエラーが発生のが、値の初期値か値の変更時にnullやundefinedになってしまいがちなので、事象とその周辺を中心にデバッグすると解決しやすそうです。


<h2>参考</h2>
https://material-ui.com/components/text-fields/

https://blog.mitsuruog.info/2017/09/react-uncontrolled-input
Flutter WebView スワイプで戻る

<h2>やりたいこと</h2>
``webview_flutter``を利用してスワイプで戻るを実現するために調べてみました。
ですが、そう簡単にはいかず、これといったやり方を見つけることができませんでした。
数日、試行錯誤して何とかできたけれども、他のやり方だったりもっと良いやり方などあれば教えてほしいのです。

<h2>試したこと</h2>
・``gestureRecognizers``を利用してみる。
・``PageView``を利用してみる。
・``Dismissible``を利用してみる。
・``GestureDetector``を利用してみる。


初学者の僕に理解するには難しかった、、、

その中で選ばれたのは``GestureDetector``でした。

<h2>コード</h2>

```
import 'dart:io';

import 'package:flutter/cupertino.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'package:webview_flutter/webview_flutter.dart';

void main() {
  runApp(MaterialApp(home: MyApp()));
}

class MyApp extends StatefulWidget {
  @override
  _State createState() => _State();
}

class _State extends State<MyApp> {
  @override
  void initState() {
    super.initState();
    if (Platform.isAndroid) WebView.platform = SurfaceAndroidWebView();
  }

  late WebViewController _webViewController;
  double _currentPositionX = 0;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Stack(
        children: [
          WebView(
            initialUrl: 'https://flutter.dev',
            javascriptMode: JavascriptMode.unrestricted,
            onWebViewCreated: (WebViewController controller) async {
              _webViewController = controller;
            },
          ),
          GestureDetector(
            onHorizontalDragUpdate: (details) {
              _currentPositionX = details.primaryDelta!.toDouble();
            },
            onHorizontalDragEnd: (details) async {
              print(_currentPositionX);
              if (_currentPositionX > 0) {
                if (await _webViewController.canGoBack()) {
                  await _webViewController.goBack();
                  print('もどる');
                }
              }
            },
            child: Container(width: 50, color: Colors.green),
          ),
        ],
      ),
    );
  }
}
```

<h2>やり方と感想</h2>
``WebView``の上に``Container``を配置
``onHorizontal``で水平スクロールを感知
``details.primaryDelta``で　どっちのスワイプかを知る。
正の値だったら左から右
負の値だったら右から左
になります。

そして``goBack()``でページを戻す

後は、読み込み時処理に動作させないようにすることと
他の部品の高さを差し引いたコンテナにする。
コンテナ透明にする。
コンテナが大きすぎるとユーザーが利用しずらくなっちゃうので、
どのくらいの大きさにしようか検討中、、、

なんだか他にもっと良いやり方だったり書き方があると思うので、
わかる人がいたら是非！教えてください(｀・ω・´)ゞ

<h2>参考URL</h2>
https://www.youtube.com/watch?v=RA-vLF_vnng
https://pub.dev/packages/webview_flutter
https://cbtdev.net/flutter-gesture-detector/
https://nobushiueshi.com/flutterwebview%E3%81%A7%E8%89%B2%E3%80%85%E3%81%AA%E6%93%8D%E4%BD%9C%E3%82%92%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%E9%80%B2%E3%82%80%E3%80%81%E6%88%BB%E3%82%8B%E3%80%81%E3%83%AA%E3%83%AD%E3%83%BC/
AWS単語集

AWSの試験勉強のメモ
各サービスが何やっているかをまず覚えていく。

#セキュリティグループ
インスタンス単位の通信制御
#ネットワークACL
サブネット単位の通信制御
#SNS
プッシュ型の通知サービス
#SQS
ポーリング型
Standardキュー：順序を保証しないし、同じメッセージが２回発信される可能性がある。
FIFOキュー：順序を保証。ただし、Standardキューより遅い。
#インターネットゲートウェイ
VPCとインターネットを接続
各VPCに１つだけ接続可能
#NATゲートウェイ
ネットワークアドレス変換機能を有し、プライベートIPをNATゲートウェイが持つグローバルIPに変換し、外部と通信する。
#EMR
分散処理フレームワーク
#CloudTrail
AWS内のユーザアクティビティログ（AWS内のユーザ操作ログ）を取得
#CroudFront
世界中に120を超えるエッジロケーションがあり。
最も近いエッジロケーションから配信。
#AWS Organization
アカウント作成自動化も可能。
料金とかを一元化できる。
#Amazon Inspector
脆弱性をチェック
#Amaszon GuardDuty
悪意のあるアクティビティや不正なアクティビティから保護する。
#Redshift
データウェアハウス用のRDB
#ECS
コンテナー化されたアプリケーションを実行
#S3 Transfer Acceleration
エッジロケーションを利用して、クライアントとS3バケットの間で超郷里に渡るファイル転送を高速・簡単・安全に行う。
#Amazon Athena
S3内のデータをSQLタイプのクエリ処理で分析
#Route53
DNSサービス
ドメイン登録
#Aurora
RDS
#AWSプロフェッショナルサービス
支援プログラム
#AWS Storage Gateway
オンプレミスとAWSをシームレスに接続できるハイブリットストレージサービス
#OpsWorks
EC2インスタンスの構成方法を自動化
#KMS
EBSボリュームを暗号化
#STS
一時的な認証情報を適用する機能（セキュアトークン）
#Elastic BeanStalk
デプロイ
#ECR
DockerコンテナイメージをAWSクラウドに保存
#Amazon Cognite
モバイルからAWSのリソースにアクセス
Thymeleaf  外部JSファイルでinlineで利用したいけど動かない

# やりたかったこと
ThymeleafでJavascriptをinlineで利用する。その際のjsファイルを外部ファイルにしたい。

```html
<script type="text/javascript" th:inline="javascript" th:src="@{/js/test.js}"></script>
```

# 結論
できないっぽい。(調べた感じ、できないという記事しか見つけられなかった)
https://stackoverflow.com/questions/27176640/how-to-put-code-thymeleaf-in-an-external-javascript-file

## どうしたのか
外部jsファイルでは、inline利用は諦める。
inlineで使用したいものは、Thymeleafのテンプレートファイルに以下タグを記載して利用する。

```html
<script type="text/javascript" th:inline="javascript">
  $(function() {
    var testFlg = /*[[${associationFlg}]]*/
  })
```
RaspberryPiからTVを操作する方法のメモ

#はじめに
RaspberryPiのHDMI出力をTVに接続してTVの簡単な操作を行う方法をメモする

#ハード関係の準備

* RaspberryPiの準備(おそらくどれでも使える。今回は2B(古い)を使った。OSはbuster)
* RaspberryPiのHDMI出力をTVのHDMI入力に接続どの入力でもOK)
* TV側のHDMI連動制御の設定が有効であることを確認(TVメーカで本機能の呼び方ががまちまち。”なんとかリンク”の機能を有効にする)

#cec-utilsのインストール

```
sudo apt install cec-utils
```

#CEC(Consumer Electronics Control)について超ざっくりの説明
CECはHDMIの規格の一部で、HDMIで接続した機器間でコマンドをやり取りしてシステム制御を行う機能を実現するもの。HDMI-IFにはCECのためのポートが1ピン用意されている。
CECには、定義済みのコマンドとリモコンコマンド・パススルーという二種類が存在する。TVの電源を入れたり、アクティブになったソースに自動的にTVの入力を切り替えたりすることは前者のコマンドで定義されているが、TVの入力ソースや放送受信CHを切り替える場合には、後者のコマンドを使う必要がある(前者にはこれらの機能がコマンド定義されていない)。

#cec-utilsを用いた具体的な操作方法
おまじない(数字)の意味については機会があれば追記したいが、今回は割愛。
今回の条件に限ってのおまじないになっていることに注意
以下のコマンドをRaspberryPiのシェル上で入力するとTVが所定の動作をする(はず)


## TVの電源操作(トグル)

```
# echo "txn 10:44:40"|cec-client -s
```

現在の電源状態と違う状態になる(現在ONならstandbyに、現在standbyならONに)
リモコンには電源ON/OFFを個別に指定するコマンド(ボタン)がない

## TVのCH切替(番号指定)

```
# echo "txn 10:44:21"|cec-client -s #1chにする
# echo "txn 10:44:22"|cec-client -s #2chにする
# echo "txn 10:44:24"|cec-client -s #4chにする
# echo "txn 10:44:25"|cec-client -s #5chにする
```

## TVのCH切替(UP/DOWN)

```
# echo "txn 10:44:30"|cec-client -s #CH-UPする
# echo "txn 10:44:31"|cec-client -s #CH-DOWNする
```

## TVの入力切替(インクリメンタル・巡回)

```
# echo "txn 10:44:34"|cec-client -s #次の入力を選択する
```

## TVの音量調整(UP/DOWN)

```
# echo "txn 10:44:41"|cec-client -s #音量1段Up
# echo "txn 10:44:42"|cec-client -s #音量1段Down
```

## コマンド参考先
パラメータを選択するとCECのコマンド列(おなじない)を出力してくれるありがたいサイト
上記以外の機能・コマンドのおまじないを試してみたい場合はこのサイトがとても参考になる
[CEC-O-MATIC](https://www.cec-o-matic.com/ "CEC-O-MATIC")

# 最後に
cec-clientをshell上から操作する方法は、とっつきやすいがオーバーヘッドが大きく、はっきり言って遅い。
cec-clientをインタプリタモードで動かして、その中でコマンドを打ち込めばそれなりに高速に動くが、
スクリプトで自動化するような用途には向かない。
より快適で使い勝手よく扱いたい場合は、Pulse-Eight社が公開しているlibCECを利用し、C/Python3でコードを書いたほうがよい(個人的見解)
なお、利用の際はライセンスをご確認のこと

[libcec](http://libcec.pulse-eight.com/ "libcec")
ちょっと古めのElixirバージョンでmix testしたい

# はじめに
- [Elixir](https://elixir-lang.org/) 楽しんでいますか:bangbang::bangbang::bangbang:
- [Hex](https://hex.pm/)の開発をしているとちょっと古めのElixirバージョンで`mix test`したくなるときがあるかもしれません
- 私の場合は @piacerex さん作の[smallex](https://github.com/piacerex/smallex)という[Elixir](https://elixir-lang.org/)の標準にはないけれどあると便利な小粒でピリリと辛い小粋で気の利いた[Hex](https://hex.pm/)の開発でそういうことをしたくなっちゃったりしました
- `mix.exs`に`elixir: "~> 1.6"`という記述があって、あれこれって本当に`1.6`でイゴくのだっけ？　というのを確かめたくて、Elixir 1.6を[asdf](https://asdf-vm.com/#/)でインストールしようとしました
- `OTP 21`が必要で、macOS CatalinaとUbuntu 20.04でインストールしようとしましたがエラーがでました
    - けっこう時間がたったあとに無理でしたと言われる感じでますます萎えます
- 古いもののビルドを通す努力を続ける気にもならずどうしようかとしばし逡巡したのち、「あ、[Docker Hub](https://hub.docker.com/)にあるんじゃないの？」とおもってやってみたらうまくいったので書いておきます

# こげな感じでやりました

## コンテナを立ち上げる
```
$ docker pull elixir:1.6.6

$ docker run -it --rm elixir:1.6.6 
```

- `elixir:1.6.6`のところは、 https://hub.docker.com/_/elixir?tab=tags&page=1&ordering=last_updated から必要とするものを探してください

## [Dockerコンテナのシェルの中に入る](https://qiita.com/__cooper/items/4740c24666299c366044)
- リンク先の記事の通りです
    - ありがとうございます！

```
$ docker ps                                                        
CONTAINER ID   IMAGE          COMMAND   CREATED         STATUS         PORTS     NAMES
15bdc05bae6c   elixir:1.6.6   "iex"     9 seconds ago   Up 6 seconds             dreamy_sutherland

$ docker exec -it dreamy_sutherland bash
```

## 中に入れたらあとはもうこちらのものですね
- 以下、`mix test`する操作の一例です

```
root@15bdc05bae6c:/#

root@cbf7ce2b75e8:/# cd /root/

root@15bdc05bae6c:~# git clone https://github.com/piacerex/smallex.git

root@15bdc05bae6c:~# cd smallex/

root@15bdc05bae6c:~/smallex# git checkout -b b-afbb723449c82f9bde16bf58ba8e787d39fc6334 afbb723449c82f9bde16bf58ba8e787d39fc6334

root@15bdc05bae6c:~/smallex# HEX_HTTP_CONCURRENCY=1 HEX_HTTP_TIMEOUT=120 mix deps.get

root@15bdc05bae6c:~/smallex# mix test
```

- `HEX_HTTP_CONCURRENCY=1 HEX_HTTP_TIMEOUT=120 mix deps.get`は、私の家のインターネットが夜だと遅くなっていてですね、そんなときにこれをつけるとうまくいきます
    - 手前味噌の記事: [HEX_HTTP_CONCURRENCY=1 HEX_HTTP_TIMEOUT=120 mix deps.get (Elixir)](https://qiita.com/torifukukaiou/items/3890d4ea8220f44c7e0a)
    - `mix deps.get`失敗したときのメッセージに書いてあるのでそのまま試している感じです
    - これに出くわしたことがない人はいいネット環境なのでしょう
    - うらやましいです


# Wrapping Up :lgtm::lgtm::lgtm:
- Enjoy [Elixir](https://elixir-lang.org/) :bangbang::bangbang::bangbang:
【メモ】JupyterNotebookを自動実行してHTMLで保存する（ついでに生成された画像を単体で保存したりする）

# 背景
* jupyter notebookをデータ分析に使った際に、その結果をある程度再現可能なものにしたい
* 毎回頭から実行するのも面倒、またワンクリックで簡単に結果を見れるようにしたい
* notebookを書くことで、ダッシュボードを作る代わりにならないか

# 結論
* nbconvertで出来ます
* nbconvertをうまく使えば作成した画像だけ保存のようなこともできる
基本的には
* https://nbconvert.readthedocs.io/en/latest/nbconvert_library.html
を参照すればOK。
* コマンドラインからは`jupyter nbconvert --to html --execute test.ipynb` で一発で出来る.inplaceでやったりpdfにしたりとかもできる。

以下はソースコード上で実行したい、さらに細かい作業を行いたい場合の方法。 

# 頭から末尾まで実行する
`nbconvert.preprocessors` の`ExecutePreprocessor` を使えばできる。

```python
import nbformat
from nbconvert.preprocessors import ExecutePreprocessor

input_name = "test.ipynb"
output_name = "out.ipynb"
with open(input_name) as f:
    nb = nbformat.read(f, as_version=4)
ep = ExecutePreprocessor(timeout=500)
ep.preprocess(nb,resources={'metadata': {'path': '/'}})
with open(output_name, "w") as f:
    nbformat.write(nb, f)
```

# notebook をHTMLに変換

```python
html_exporter = HTMLExporter()
html_exporter.template_name = 'classic'
body, resources = html_exporter.from_notebook_node(nb)
```

bodyに,HTMLが文字列として格納されるので、普通にファイルに保存してやればOK。

# もう少し中身を見てみる（画像保存、notebookを書き換えて実行）
nbformatで読み込んだnotebookは辞書になっており、'cells'で、実際のセルにアクセスできる。
例えばこんなセルは

```python
from datetime import datetime
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd 
from sklearn.datasets import load_iris

iris = load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)
print(datetime.now())
```

以下のような感じで保存されている。sourceを適当に編集してやれば自動的な置換なども可能。（データセットのパスを変えたり、機密情報を入れたり隠したりには使えるかもしれない。）

```python
{'cell_type': 'code',
 'execution_count': 10,
 'metadata': {},
 'outputs': [{'name': 'stdout',
   'output_type': 'stream',
   'text': '2021-05-23 20:31:25.888013\n'}],
 'source': 'from datetime import datetime\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport pandas as pd \nfrom sklearn.datasets import load_iris\n\niris = load_iris()\ndf = pd.DataFrame(iris.data, columns=iris.feature_names)\nprint(datetime.now())'}
```

画像はcellの中のoutputsなる配列に格納されている。BASE64でエンコードされているので読み込むには以下のような感じにする。(1番目のセルに画像が保存されているときの例。)
以下のようなセルには

```python
plt.plot(np.random.rand(100))
```

以下のようにすれば画像をよみこんだりできる。

```python
out = nb['cells'][1]['outputs'][1]['data']['image/png']
img = Image.open(io.BytesIO(base64.b64decode(out)))
```

RSTExporterを使うともう少し取り出しやすい形で画像を変換できる。

```python
from nbconvert import RSTExporter
exporter = RSTExporter()
body, resources =exporter.from_notebook_node(nb)
img = Image.open(io.BytesIO(resources['outputs']['output_1_1.png']))
```
Python関数の引数は「参照の値渡し」

# Python関数の引数は「参照の値渡し」である

[Pythonの公式チュートリアル](https://docs.python.org/3/tutorial/controlflow.html#defining-functions)によると、Pythonでは関数の引数はすべて「参照の値渡し」のようです。

> The actual parameters (arguments) to a function call are introduced in the local symbol table of the called function when it is called; thus, arguments are passed using call by value (where the value is always an object reference, not the value of the object).

## 検証

Python 3.9.5で検証。
- 参考: [組み込み関数 id() の仕様](https://docs.python.org/ja/3.9/library/functions.html#id)

```python
def f1( a ):
    print("#1: {} {}".format(a, hex(id(a))))
    if type(a) is list:
        a.append(40);
    elif type(a) is tuple:
        a += (40, )
    else:
        a += 40
    print("#2: {} {}".format(a, hex(id(a))))

mylist = [10,20,30];
print("\n#0: {} {}".format(mylist, hex(id(mylist))))
f1(mylist)

mytuple = (10,20,30)
print("\n#0: {} {}".format(mytuple, hex(id(mytuple))))
f1(mytuple)

myint = 1
print("\n#0: {} {}".format(myint, hex(id(myint))))
f1(myint)

myint2 = myint
print("\n#5: {} {}".format(myint2, hex(id(myint2))))
```

## 実行結果

```bash
#0: [10, 20, 30] 0x1f813e86d80
#1: [10, 20, 30] 0x1f813e86d80
#2: [10, 20, 30, 40] 0x1f813e86d80

#0: (10, 20, 30) 0x1f813e92300
#1: (10, 20, 30) 0x1f813e92300
#2: (10, 20, 30, 40) 0x1f813e8c360

#0: 1 0x1f813c86930
#1: 1 0x1f813c86930
#2: 41 0x1f813c86e30

#5: 1 0x1f813c86930
```

## 考察

1. 関数の引数がimmutableであろうとmutableであろうと、すべて「参照値の値渡し」となる
1. 関数内でimmutableに対する演算を行った際に、新しいオブジェクトが生成され演算結果が格納される（関数を呼び出す前にコピーが生成されるわけではない）
1. 別の変数に代入しただけでは、オブジェクトのコピーが生成されるわけではない
Thymeleaf if文書く時よく間違うのでメモ


Thymeleafでif文を書くときによく間違うので書いておく。
以下記事に記載があるように、ちゃんと指定された演算子を使わないと動かない。
また `==`は動いたりするのでついついjavaの演算子とかでいけると勘違いしてしまう。
https://qiita.com/narikei/items/c4780d6bb69902380136

例えばjavaで書いた場合の
`if (testFlg == 1 && (testId == 0 || testId == 1))` はThymeleafで以下のように書く

```html
<div th:if="${testFlg eq 0 and (testId eq 0 or testId eq 1)}">
    <li>メモ</li>
</div>
```
MacでNext.jsのGettingStartedを進めてみる (1)

Macで [Next.jsの公式Getting Started](https://nextjs.org/docs/getting-started)を進めてみたメモです。

使用した環境は Intel Mac + Catalinaです。
バックエンドとしては[strapi](https://strapi.io/)を使っていきます。

今回は Getting Started の章をやっていきます。


# 0. 事前準備

1. [Homebrew](https://brew.sh/index_ja)を使って[yarn](https://yarnpkg.com/)と[Node.js](https://nodejs.org/ja/)をインストールする

    ```sh:command
    $ brew install yarn node
    ```

2. 作業用フォルダを作成して移動する

    ```sh:command
    mkdir -p ~/devel/ && cd $_
    ```


# 1. Getting Startedをやってみる

[Getting Started](https://nextjs.org/docs/getting-started)ページの内容を、[yarn](https://yarnpkg.com/)を使って実行します。 この際、[TypeScript](https://www.typescriptlang.org/)を使用するオプションを指定します。

1. 今回は `next-sample-app` という名前でプロジェクトを作成する

    ```sh:command
    $ yarn create next-app --typescript next-sample-app
    ```
    ```plaintext:output
    yarn create v1.22.10
    [1/4] 🔍  Resolving packages...
    [2/4] 🚚  Fetching packages...
    [3/4] 🔗  Linking dependencies...
    [4/4] 🔨  Building fresh packages...
    
    ~~~~~~~~ 中略 ~~~~~~~~
    
    We suggest that you begin by typing:
    
      cd next-sample-app
      yarn dev
    
    ✨  Done in 11.03s.
    ```

2. 生成されたフォルダに移動する

    ```sh:command
    $ cd $_
    ```

3. サーバーを起動してみる

    ```sh:command
    $ yarn dev
    ```
    ```plaintext:output
    yarn run v1.22.10
    $ next dev
    ready - started server on 0.0.0.0:3000, url: http://localhost:3000
    info  - Using webpack 5. Reason: no next.config.js https://nextjs.org/docs/messages/webpack5
    ```

4. サーバーが起動したのでブラウザで開いてみる

    ```sh:command
    $ open http://localhost:3000/
    ```
    ![スクリーンショット 2021-05-23 16.16.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164813/41cbb715-fe0b-6027-324e-6f1d180c6347.png)


これで Getting Started のページが完了。
今回はManual Setupではないので、ホームページとしては `pages/index.tsx` が表示されている。

サーバーは起動したままの状態にしておくこととし、以降の作業は別のターミナルで行う。


## [ちょっと寄り道] ホームページを変更してみる

デフォルトで用意されているホームページではなくて、任意の文字列を出力する形に変更してみる。
Getting StartedのManual Setupでは `pages/index.js` を作成しているが、今回はTypeScriptで作っているので、ファイル名を `index.tsx` とし、TypeScript版に書き換えた内容で作成する。

1. ホームページである `pages/index.tsx` を上書きする


    ```tsx:pages/index.tsx
    function HomePage() {
      return <div>Welcome to Next.js!</div>;
    }
    
    export default HomePage;
    ```

2. ブラウザで開いてみる

    ```sh:command
    $ open http://localhost:3000/
    ```
    ![スクリーンショット 2021-05-23 17.03.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164813/fa059fb9-9697-4d56-1a4a-1863d4d4c98c.png)

ホームページが任意の文字列に変更されました。


次回は Basic Features / Pages を進めていきます。


# MacでNext.jsのGettingStartedを進めてみる シリーズの記事

1. Getting Started をやった記事
2. [Basic Features / Pages をやった記事](https://qiita.com/tk_hamaguchi/items/2e375ce4a3037c7e9c77)
3. [Basic Features / Data Fetching をやった記事](https://qiita.com/tk_hamaguchi/items/9fb3c74833206319609d)
仮想通貨のコントラクトアドレスを簡単に取得するWebアプリを作成してみた

CoinGeckoのAPIを利用して、仮想通貨のコントラクトアドレスを簡単に取得するWebアプリを作成してみました。
今回の作成したWebアプリでは[CoinGeckoの公開API](https://www.coingecko.com/ja/api#explore-api)を使用しています。
Webアプリにアクセスすると、Windowが開きコイン名を小文字英数字で入力することで、プラットフォーム、コントラクトアドレス、ホームページアドレスを表示してくれます。
また、コントラクトアドレスはクリップボードにコピーされそのままMetaMaskなどに貼り付けることができます。
（何も入力しない場合、サンプルでUniswapのデータが表示されます。）

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">コントラクトアドレス取得！ <a href="https://t.co/MN0SbUHmQr">pic.twitter.com/MN0SbUHmQr</a></p>&mdash; ymachida196 (@ymachida196) <a href="https://twitter.com/ymachida196/status/1396481324320317451?ref_src=twsrc%5Etfw">May 23, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

#きっかけはコントラクトアドレスを探してくるのが手間だったから。
MetaMaskなどのウォレットを利用する際、いちいちCoinGeckoやCoinMarketCapのサイトに行きコントラクトアドレスをコピーすることが面倒だったので、通貨名を入力するとシンプルにコントラクトアドレス取得してくれるアプリをがあったらと思い作成してみました。
https://modest-goldberg-a38b56.netlify.app/

#使用ライブラリ
【CSS】
　Bootstrap 4.5.0
【JS】
　Axios 0.21.1
　Clipboard-copy 4.0.1

#CodePenでの開発
今回のWebアプリ開発では、CodePenを利用し開発を行いました。
CodePenのエディターを掲載します。
<p class="codepen" data-height="265" data-theme-id="light" data-default-tab="js,result" data-user="yujimachida" data-slug-hash="rNyygeO" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="Contract_Adress">
  <span>See the Pen <a href="https://codepen.io/yujimachida/pen/rNyygeO">
  Contract_Adress</a> by YujiMachida (<a href="https://codepen.io/yujimachida">@yujimachida</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

#終わりに
あったら便利というものを作成してみました。
CodePenはその場で動作確認ができ、非常に使いやすいツールでした。
今回は最低限の機能にとどまりましたが更にアップデートしていきたいと思います。
Ajaxでバイナリデータを受け取ってimageタグにロードする

以下の記事を参考にさせていただきました
https://qiita.com/Yarimizu14/items/f56123c738f12ad1844a

仕様は入力フォームにデータを入力して、サーバサイドにJSON文字列を送付、サーバサイドでJSON文字列をパースしてImageを生成して、レスポンスを返す、JavaScriptでレスポンスを受け取って画面内のImageタグにロードします。エラーハンドリンクは省略しています。

**JavaScript**

```javascript
var oReq = new XMLHttpRequest();
oReq.open("POST", "http://localhost:8080/target", true);
oReq.responseType = "arraybuffer";
oReq.setRequestHeader("Content-Type", "application/json");
oReq.onload = function (oEvent) {
    var arrayBuffer = oReq.response;
    if (arrayBuffer) {
        var byteArray = new Uint8Array(arrayBuffer);
        var binaryData = "";
        for (var i = 0; i < byteArray.byteLength; i++) {
            binaryData += String.fromCharCode(byteArray[i]);
        }
        var img = document.getElementById("targetid");
        img.src = "data:image/png;base64," + window.btoa(binaryData);
    }
};
oReq.send(JSON.stringify(json));
```

こちらを適宜修正して、資産運用の推移を画面から入力して、グラフを返すような機能を作ります。
wixを触ってみた感想

先日ローコードツールを扱っているところでカジュアル面談を受けたので
試しに似ているツールでシェアが多いwixを触ってみました。

#感想
個人的には、パワーポイント間隔でwebサイトが作れるので
プロフィールサイトなどを作る文には丁度いいなと思いました。

ただ、扱いが慣れるのに時間がかかるかなと思いました。

アイデア次第では、面白いものが作れそうとも思ったので
少しずつ触っていくことにします。
laravel8でjetstreamを導入する

#参考記事

jetstream公式ドキュメント→https://jetstream.laravel.com/2.x/installation.html

laravel breezeでポートフォリオを作っていたのですが、
tailwindcssとinertia.jsでvueを扱えることから完全にbreezeの上位互換だと
考えjetstreamを導入することにしました。

また、プロフィールページがありそこでサムネイルも実装されているので
純粋に「すげぇ」と思いました。。

二段階認証もありアカウント削除の機能も実装されているので
他に時間が使えそうです。

#初期設定の日本語化
laravel breezeと少し違うところがあるっぽいので
このサイトを参考にしました。

https://blog.capilano-fw.com/?p=7930

とてもわかり易かったので参考になりました。


すでにbreezeの方で雛形ができているので時短できそうです。
Git fetch時にリモートリポジトリで削除されたブランチをローカルリポジトリから削除する

# 目的

- `$ git fetch`時にリモートリポジトリで削除されたブランチをローカルリポジトリから削除する方法をメモ的にまとめる

# 方法

- 下記コマンドを実行する。

    ```terminal
    git fetch -p
    ```

- 下記でもよい。

    ```terminal
    git fetch -prune
    ```