OmniAICreator/Qiita-1.07M huggingface dataset:
Automation Anywhere A2019 の共通開発部品「パッケージ」「DLL」「MetaBot」の比較

Automation Anywhere A2019における共通開発部品の種類と使い分けについて、先日オンラインで開催された[Automation Anywhere社主催Developer Meetup Vol.2](https://aaj.connpass.com/event/172967/)でも解説されていた内容を参考にしながら概要をまとめてみました。

# v11からA2019まで見ると3つのオプションがある

以下にまとめてみました。

|v11|A2019|メモ|
|:--|:--|:--|
||パッケージ|パッケージはJavaのjarを使ったテクノロジです。|
|MetaBot (DLLを含むもの)|DLLアクション|MetaBotに含まれていたDLL(C#でビルドしたもの)はA2019標準機能としてDLLの関数を呼び出せます。|
|MetaBot|(未定)|v11のMetaBotはA2019ではそのまま利用できません。将来的にA2019に移行できる予定。|

また、Bot StoreはA2019用のパッケージやBotも既に公開が始まっています。Control Roomとの統合もされたので、Bot Storeから必要なパッケージやBotを選ぶと、Control Roomの必要な権限を持っていれば直接Control Roomに読み込むことが可能です。あと、Bot Storeの日本語版も近日中に登場予定といううれしいニュースがありました。

まだMetaBotがいつ頃A2019に移行できるかという詳細は発表がありませんでしたが、せっかくなので資産をうまく使いたいところです。
【Oracle】PL/SQLでフィボナッチ数を求める

# はじめに

PL/SQLには「ストアドファンクション」という関数がありますが、ある時に「ストアドファンクションが関数ということは、もしかするとストアドファンクションを使って再帰処理をすることができるのでは？」と思い立ち、フィボナッチ数をテーマにして再帰処理が作れるかを調べてみました。

# 使用した環境

* Oracle社が提供している[Oracle Live SQL](https://livesql.oracle.com/)でOracle19cを利用しました。

# フィボナッチ数の概要

* フィボナッチ数はよく知られた数列の一つで、「最初の2つの項は0と1で、それ以降の項は直前の2つの項の和となる」というものです。

```text:フィボナッチ数の概要
F(0) = 0
F(1) = 1
F(2) = F(1) + F(0) = 1 + 0 = 1
F(3) = F(2) + F(1) = 1 + 1 = 2
F(4) = F(3) + F(2) = 2 + 1 = 3
...
```

* これを数式で表すと、以下のようになります。

```text
F(0) = 0
F(1) = 1
F(n+2) = F(n+1) + F(n)
```

# 作成したストアドファンクション

* 以下のように、フィボナッチ数の定義をそのままストアドファンクションとして書きました。
* 第0項目から第n項目までのフィボナッチ数を1つずつ求めるため、実行用のSQL側ではFOR文を使っています。
 * 以下の`実行結果`では、「55」が第10項目（n=10）のフィボナッチ数となります。
* なお、今回はOracle Live SQLを利用させてもらっているため、負荷を極力小さくするため、ストアドファンクションの引数に指定する値は小さい方が望ましいと思います。

```sql:calc_fibonacci.sql
-- フィボナッチ数を返すストアドファンクション
CREATE OR REPLACE FUNCTION calc_fibonacci(n IN NUMBER) RETURN NUMBER
-- 宣言部
IS
-- 処理部
BEGIN
  IF (n=0) THEN
    RETURN 0;
  ELSIF (n=1) THEN
    RETURN 1;
  ELSE
    RETURN calc_fibonacci(n-2) + calc_fibonacci(n-1);
  END IF;
END;
```

```sql:実行用SQL
-- 宣言部
DECLARE
  n NUMBER;
  fib_result NUMBER;
BEGIN
  n := 10;
  DBMS_OUTPUT.PUT_LINE('Calculate Fibonacci number: F(0)~F(' || n || ')');
  DBMS_OUTPUT.PUT_LINE('----------');

  FOR i IN 0..n LOOP
    fib_result := calc_fibonacci(i);
    DBMS_OUTPUT.PUT_LINE('F(' || i || ')' || '=' || fib_result);
  END LOOP;
END;
```

```text:実行結果
Calculate Fibonacci number: F(0)~F(10)
----------
F(0)=0
F(1)=1
F(2)=1
F(3)=2
F(4)=3
F(5)=5
F(6)=8
F(7)=13
F(8)=21
F(9)=34
F(10)=55
```

# まとめ

* コンパイルエラーも起きず、意外にもサクッと再帰処理を実装&実行することができました。
* 再帰処理そのものはマシンに負担をかける処理なので、再帰させる回数をある程度小さくした方が良いと思います。
 * 負荷の高い処理になるので、業務では避けた方が良いと思います。



# 関連URL

* [【Oracle】PL/SQL入門](https://qiita.com/nkojima/items/93a9c01741965f11bb8c)
* [【Oracle】ストアドプロシージャ入門](https://qiita.com/nkojima/items/2f793251e4465a3a8da2)
* [【Oracle】ストアドファンクション入門](https://qiita.com/nkojima/items/aa7be169f2d983c0f413)
* [【Oracle】カーソル入門](https://qiita.com/nkojima/items/c073f977c4c0097bec53)
* [【Oracle】ストアドパッケージ入門](https://qiita.com/nkojima/items/32894a8752ee3b2b59e6)
* [Wikipedia - フィボナッチ数](https://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A3%E3%83%9C%E3%83%8A%E3%83%83%E3%83%81%E6%95%B0)
java(抽象クラス)

##抽象メソッドを含むクラスの宣言

#####abstract（アブストラクト）　＝　抽象メソッド

```java:Character.java
public abstract class Character {   //抽象クラスとして宣言
  String name;
  int hp;
  public void attack(Matango m) {  
   }
  }
```

**抽象クラスは、newによるインスタンス化が禁止される**
　・`newによる利用`と`継承(extends)による利用`を区別できる

##attack()を抽象メソッドとして宣言


```java:Character.java
public abstract class Character {  
  String name;
  int hp;
  public abstract void attack(Matango m); // {}を付けず、;（セミコロン）を書く
  }
```

**抽象メソッドは「現時点で何をするか確定できないメソッド」として区別**
　・「何もしない」と「何をするか未定」を明確にする
**オーバーライドを強制できる**
　・オーバーライド」し忘れを解消する
Azure AD に追加したアプリに PowerShell でユーザーやグループを割り当てる

# Azure AD の GUI ではアプリへのユーザー割り当てが難しいシーン
### アプリにグループを割り当てるには有償ライセンスが必要
Azure AD でシングルサインオン等を行うために追加した SaaS アプリケーションにユーザーを割り当てる際、グループを利用して割り当てたいニーズがあると思います。(特定の部署だけに利用を許可するケースなど)
しかしながら、Azure AD でのアプリへのグループの割り当ては Azure AD Premium (P1, P2) の有償ライセンスでのみ可能となっており、Free 版や Office 365 に付いてくる Azure AD ではユーザー単位での割り当てしかできません。
(Free 版の Azure AD で割り当ての追加画面を表示した図)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111810/bbbc3930-79f1-d467-e745-823fc6989dfa.png)

### 大量のユーザーや特定条件に一致するユーザーをアプリに割り当てたい場合
グループに限らず、大量のユーザーや特定条件にあてはまるユーザーをアプリに一括で割り当てたい場合も、GUIでポチポチやるのは手間としても処理速度的にも大変ですね。これは Azure AD の Premium ライセンスがあったとしても同様かと思います。
こういう場合は PowerShell での一括処理をお勧めします。

# PowerShell を使用したアプリへのユーザー割り当て
下記はアプリ名とグループ名を指定すると一括でグループ内メンバーをアプリに割り当てるスクリプトです。

```powershell
$cred = Get-Credential
Connect-AzureAD -Credential $cred
$app_name = "<アプリ名>"
$app_role_name = "User"
$groupId = Get-AzureADGroup -SearchString "<グループ名>"
$ary_names = Get-AzureADGroupMember -ObjectId $groupId.ObjectId | Select-Object Mail
foreach($username in $ary_names){
    $user = Get-AzureADUser -ObjectId $username.Mail
    $sp = Get-AzureADServicePrincipal -Filter "displayName eq '$app_name'"
    $appRole = $sp.AppRoles | Where-Object { $_.DisplayName -eq $app_role_name }
    New-AzureADUserAppRoleAssignment -ObjectId $user.ObjectId -PrincipalId $user.ObjectId -ResourceId $sp.ObjectId -Id $appRole.Id
  }
```

`$ary_names` に入れるユーザーを別の条件で指定すれば、その時のニーズに合わせて一括割り当てできると思います。
Rust の enum に大きさの異なる型を列挙するとメモリサイズ効率が悪いという話

例えば以下のような`enum`を定義した場合、そのサイズは 16 バイトになります。

```rust
enum Hoge {
    Char(i8),
    Short(i16),
    Long(i32),
    LongLong(i64),
}

let size = mem::size_of::<Hoge>();
assert_eq!(size, 16);
```
`Hoge`のデータ構造がどうなっているか確認します。

```rust
let long = Hoge::Long(65536);
let slice = unsafe { mem::transmute::<Hoge, [u8; 16]>(long) };
slice.iter()
    .enumerate()
    .for_each(|(i, v)| println!("index: {}, value: {:x}", i, v));
```
```
$ cargo run
index: 0, value: 2   // tag       enum の何番目の識別子か
index: 1, value: 44  // _padding0 ここから
index: 2, value: ed  //           ↓
index: 3, value: 3   //           ここまで
index: 4, value: 0   // data      ここから
index: 5, value: 0   //           ↓
index: 6, value: 1   //           ↓
index: 7, value: 0   //           ここまで
index: 8, value: 0   // _padding1 ここから
index: 9, value: 0   //           ↓
index: 10, value: 0  //           ↓
index: 11, value: 0  //           ↓
index: 12, value: 0  //           ↓
index: 13, value: 0  //           ↓
index: 14, value: 0  //           ↓
index: 15, value: 0  //           ここまで
```

つまり`enum Hoge`列挙子のデータ構造を仮想的な構造体として表すと、

```rust
struct EnumHoge {
    tag: u8,
    _padding0: [u8; ?],
    data: i8 | i16 | i32 | i64,
    _padding1: [u8; ?],
}
```

みたいな感じになっています。

`_padding0`の大きさは`data`がメモリアライメントの境界を越えないように`data`のサイズによって変わります。`Char`の`_padding`は 0。`Short`は 1。`Long`は 3。`LongLong`なら 7 となります。`_padding1`で 16 バイトの残りが埋まります。

ここで新たな疑問が。もし列挙子の数が 256 を越えたらどうなるのか？つまり`tag`の`u8`がオーバーフローしたらどうなるのか？（現実的にはまずあり得ないと思いますが）

実際にやってみた。

```rust
enum Piyo {
    LongLong0(i64),
    LongLong1(i64),
    LongLong2(i64),
    LongLong3(i64),
    // 省略
    LongLong65534(i64),
    LongLong65535(i64),
    Char(i8),
    Short(i16),
    Long(i32),
}
```

VSCode で↑を書いたらメモリ喰いまくって、スワップが 4GiB を超えて PC がフリーズしました :fearful:
たぶん`tag`のサイズが`u32`に変わると思います。

話がちょっと脱線しました。メモリサイズ効率が悪いという話に戻しましょう。

例えば↓こんな風に`Hoge`を`Vec`に入れると、実際のデータとしてのサイズは 15 バイトなのに padding があるので 64 バイトも使っちゃうよということです。

```rust
enum Hoge {
    Char(i8),      // 1 バイト
    Short(i16),    // 2 バイト
    Long(i32),     // 4 バイト
    LongLong(i64), // 8 バイト
}
// 1 + 2 + 4 + 8 = 15 バイト！

use Hoge::*;
let v = vec![Char(0), Short(1), Long(2), LongLong(3)];
// v の大きさは 16 * 4 = 64 バイト！
```
おわり。
CloudReadyでOpenVPN接続してみた

中古のHP Stream 11を購入し、CloudReadyをインストールしてみました。
小型でスタイリッシュでサクサクになってご満悦。
コマンドラインでOpenVPN接続できるようにしてみました。 

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63318/de277e02-96bc-d2be-5c0a-f1893a7e3208.jpeg" width=50%>

[CTRL]+[ALT]+[T] で端末モードになります。

```shell-session
crosh> shell
$ sudo su
# stop shill
# start shill BLACKLISTED_DEVICES="tun0"
# openvpn soma.ovpn
```

[Jitsi Meet](https://meet.jit.si/)も使えて、すぐにリモートワーク環境が出来上がりました。


参考
1. [How To Setup OpenVPN On ChromeOS](https://celo.net/members/index.php/knowledgebase/49/How-To-Setup-OpenVPN-On-ChromeOS.html)
2. [「Jitsi Meet」レビュー - Gigazine](https://gigazine.net/news/20200318-jitsi-meet/)
API Gateway（SAM）にPOSTしたらOPTIONSだよって怒られた時の対処

# 事象

ウェブページからAjaxでJSONをAPIGatewayにPOSTすると、メソッドがPOSTではなくOPTIONSに変わり拒否される。

AWS SAM LocalでのAPI開発で裏側にはLambdaがいるというようシチュエーションです。

<img width="735" alt="スクリーンショット 2020-05-23 18.30.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349281/2626c59f-09d9-bab9-2766-0f58f9815d09.png">


Ajaxリクエストをしたウェブページでは↓↓のように怒られてる。

<img width="572" alt="スクリーンショット 2020-05-23 18.30.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349281/f1182d43-aadb-d4cb-0f65-b47a1631984c.png">




# 結論

APIGatewayにCORSを許可する設定する事で解決。

[AWS公式のドキュメント](https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/how-to-cors.html)にある通りSAMテンプレートに下記を記述する事で解決。

```YAML
Globals:
  Api:
    # Allows an application running locally on port 8080 to call this API
    Cors:
      AllowMethods: "'OPTIONS,POST,GET'"
      AllowHeaders: "'Content-Type'"
      AllowOrigin: "'http://localhost:8080'" # "'*'"でもいけた
```

lambdaからの結果をPOSTしたウェブページで受け取りたい場合は、lambdaのレスポンスを下記のようにする。
じゃないと、POSTは出来てもレスポンスを受け取れ無い。

```js
// node.jsの場合
return {
    'statusCode': 200,
    'headers': {
        "Access-Control-Allow-Origin": "http://localhost:8080" // "'*'"でもいけた
    },
    'body': json.dumps(response)
}
```

# 原因

ざっとした原因は、ブラウザによるプリフライトという仕組みのせい。
疎通テストのようなもので、これにつまずいていた。

なので、プリフライトを受け付ける設定をAPIGatewayにする必要がある。

# 終わりに

最初に”axios post出来ない”みたいな感じでフロント側を疑ってしまい解決まで遠回りしました。。。
WordPressでsrcsetで勝手にレスポンシブ対応にされてギャラリーの画像の画質が悪化してしまった件

どうも、はにおかさいです。
WordPress 5.4.1でWooCommerceを使った通販サイトで、ギャラリーの画質が悪い問題を処理した時のメモ。

- wc-product-functions.php
- RestApi/Controllers/Products.php
- wc-template-functions.php
- woocommerce-blocks\src\RestApi\Utilities\ProductImages.php
あたりに確かにsrcsetという記述があり、画面の幅に応じた画質選択のコードがありました。
それらを書き換えても画質はそのまま。

https://wordpress.org/plugins/disable-responsive-images-complete/
srcsetの記述をとにもかくにも表示から抹消してくれるプラグインを見つけました。

このプラグインを使えば、勝手にレスポンシブ対応で画像の画質を落とされずに済みます。

# Ref
https://perishablepress.com/disable-wordpress-responsive-images/
【言語処理100本ノック 2020】第1章: 準備運動

## はじめに
自然言語処理の問題集として有名な言語処理100本ノックの[2020年版](https://nlp100.github.io/ja/)が公開されました。
この記事では、以下の第1章から第10章のうち、「第1章: 準備運動」を解いてみた結果をまとめています。

本編は以下のリンク先に移転しました。
https://amaru-ai.com/entry/2022/10/05/090639

[全100問の解答へ](https://amaru-ai.com/entry/2022/10/15/204035)
GitLab CIでPythonコードの静的解析

GitLab CIを使ってPythonコードの静的解析を行ったのでメモです。微妙に簡単な導入記事が見つからなかったので誰かのお役に立てれば。

# 目的

- GitLabはSaaS版、つまりWebブラウザ版をつかう
- しかも無課金
- Python
- とりあえずコードの静的解析さえできればいい
- 無料ではグループあたり2000分/月なのでマージリクエスト発行時だけをトリガーにする

# ymlファイル作成
ルートディレクトリに `.gitlab-ci.yml` を作成します。

```yml:.gitlab-ci.yml
# Docker Imageを指定
image: python:latest

# キャッシュの保存先
variables:
  PIP_CACHE_DIR: "$CI_PROJECT_DIR/.cache/pip"

# pip installしたものをキャッシュするためにvirtualenvを導入
cache:
  paths:
    - .cache/pip
    - venv/

# 実行前スクリプト
before_script:
  - python -V
  - pip install virtualenv
  - virtualenv venv
  - source venv/bin/activate

# testというstageを使う
# 長さが79文字以下はちょっといやだったので無視
test:
  script:
    # - python setup.py test
    - pip install flake8
    - flake8 *.py --exclude venv/,.cache --ignore E501
  only:
    refs:
      - merge_requests
```

# 実行
このファイルが含まれたマージリクエストを作成してください。くるくるテストが回り始めます。テストに通るとマージできるようになります。
PowerAppsでダブルタップ（ダブルクリック）する

# はじめに
PowerAppsでダブルタップしたかったので調べたのですが、なさそうなのでつくりました。

[![Screenshot from Gyazo](https://gyazo.com/8b82bb18a7551453dc0027dfb276d885/raw)](https://gyazo.com/8b82bb18a7551453dc0027dfb276d885)
わかりにくいですね。。。


# やり方

## 全体の配置

[![Screenshot from Gyazo](https://gyazo.com/6dad3a00a68fec44fcc87bf2c8cdc6d9/raw)](https://gyazo.com/6dad3a00a68fec44fcc87bf2c8cdc6d9)

|役割|コントロール|コントロール名|既定から変更する<BR>固定プロパティ|
|:-:|:-:|:-:|:-:|
|ダブルタップ間隔判定|タイマー|TmrDT|Visible=false|
|状態リセット|ボタン|BtnReset|Visible=false|
|タップするボタン|ボタン|BtnTap||
|ダブルタップ後に出すボタン|ボタン|BtnDTclose||


## スクリーン

```:DoubleTapCheck.OnVisible
Select(BtnReset);
UpdateContext({FlgPrint:false})
```

## タイマー(TmrDT)

非表示にしてどこかに置いておきます。
繰り返し、自動開始はデフォルトのまま `false` にしておきます。
ダブルタップの間隔はDurationで調整します（今回は300msec）

```:TmrDT.OnTimerStart
UpdateContext({FlgDblTap:true}) 
```

```:TmrDT.OnTimerEnd
Select(BtnReset);
UpdateContext({FlgPrint:false})
```

```:TmrDT.Start
FlgStartTimer
```

```:TmrDT.Duration
300
```


## リセットボタン(BtnReset)

非表示にしてどこかに置いておきます。


```:BtnReset.OnSelect
UpdateContext({FlgDblTap:false,FlgStartTimer:false});
Reset(TmrDT)
```


## ダブルタップするボタン(BtnTap)

```BtnTAP.OnSelect
UpdateContext({FlgStartTimer: true});
If(FlgDblTap ,Select(BtnReset);UpdateContext({FlgPrint:true}) )
```

## ダブルタップ成功時に表示させるボタン(BtnDTclose)

```BtnDTclose.OnSelect
Select(BtnReset);
UpdateContext({FlgPrint:false})
```

```BtnDTclose.Visible
FlgPrint
```

# 考え方
1. 画面読み込み時に、初期動作でタイマーをリセットする
1. BtnTapでタイマーを開始させる。と同時に、タイマー開始時の動作によりタップフラグをたてる（１回タップした、ということ）
1. BtnTapが再度タップされると、タップフラグを確認し、すでにフラグが立っていたらタイマーをリセットし、ダブルタップ成功のボタンを表示させる
1. もしタイマーが満了した場合は、タイマーがリセットされ、各フラグを折る（→２のイベントが発生したら、そこから処理再開）

でも、２のBtnTapのOnClickでタイマーを動作させたあとに、すぐタップフラグのチェックをするから、初回のタップでFlgDblTapがtrueになっちゃうと思うのですが、そうではないみたいなんですよね。一つのアクションに複数の関数を実行させる際の `;` の動作って、シーケンシャルじゃなくてパラで走っちゃうんでしょうかね？？

検証ではまっさらなアプリで試してみたので、たぶん変な変数が残存してて、みたいなことはないと思うのですが。。。
TypeDocの生成物をDocusaurus v2に食わせてdeployしてみた

# サマリ
OSSのAPI Referenceサイトを作るにあたり、TypeScriptからTypeDocを使って、しこしこドキュメントを作っていたのですが、サイト自体をDocusaurus v2で楽して公開したいなーと思ったのでやってみた記事となります。
なお、実際に下記の様なサイト(API Referenceの部分)がコマンド2発くらいで自動生成→デプロイできるようになります。
p5.toio - API Reference Site
https://tetunori.github.io/p5.toio/

# 前提と注意事項
すでにTypeScriptでビルドできる環境やソースコードがあり、TypeDocも導入済みの環境を想定しています。
以下は最小手数の導入方法を書いていますが、まずはご自分のサンドボックスリポジトリで色々いじくるのをお薦めします。

# Docusaurus v2概要
[Docusaurus](https://docusaurus.io/)はOSSのドキュメントサイトを簡単に作ることができるFacebook謹製OSSツールですが、現在正式版のv1と平行して、[いろいろ改良中のv2](https://v2.docusaurus.io/)が公開されています。(2020/05/23時点でまだα版です。v2.0.0-alpha.55)
今回は試用もかねて新しいバージョンを使ってみました。

# Docusaurus v2をインストールする
基本は[Docusaurusサイト](https://v2.docusaurus.io/docs/installation)の通りに導入することになります。一発コマンドが用意されているので、こちらで簡単にインストールできます。

```bash
npx @docusaurus/init@next init website classic
```

Docusaurus的にはフォルダ名は何でも良いのですが、後に使うツールのために`website`フォルダとしておきます。`classic`はテンプレート名ですが、おまじないと思ってください。

この時点でもうサイトの立ち上げが可能です。一度立ち上げてみましょう。

```bash
cd website/
yarn run start
```
`live-server`が自動で立ち上がり、ブラウザにテストサイトが表示されたかと思います。Docusaurus v2ではダークモードが標準サポートされていたり、モダンな感じにデザインされていますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542654/ae76675d-96b3-58b4-9bfe-0ae63e97c582.png)

# TypeDocのプラグインをインストールする
さて、いったんDocusaurusから離れて、開発のルートに戻ります。
TypeDocではデフォルトの形式ですと、ドキュメントサイトの体裁で出力されます。嫌いではないですが、Global/Module/Class/Interfaceと少々冗長に感じる気がしており、見る方からすると直感的な構成にはなっていないと感じていました。
そこで、今回はTypeDocの出力をDocusaurus v2フォーマットのMarkdownとして出力してくれるプラグイン、[typedoc-plugin-markdown](https://github.com/tom-grey/typedoc-plugin-markdown)を利用しました。小さいながら、今も活発に開発が続いているリポジトリなようです。

さて、インストールは下記のとおりです。

```bash
npm install --save-dev typedoc typedoc-plugin-markdown
```

# Markdownとして書き出し
完了したら、さっそく、Markdownとして書き出してみましょう。

Docuzaurusへ静的ドキュメントとして読ませるためには、`website/docs`フォルダ以下にmdファイルを配置する必要があります。なので、`typedoc.json`などで出力先を変更しておきます。

```json
  "out": "website/docs",
```

あとは、いつもの`typedoc`の設定に加えて、プラグインオプションと、今回のmarkdownテーマオプション`docusaurus2`をそれぞれ付帯して`typedoc`するだけです。

```bash
typedoc --plugin typedoc-plugin-markdown --theme docusaurus2
```

このコマンドを実行すると、指定したディレクトリ以下に`html/js`ではなく、mdファイルが並ぶことになります。とても簡単です。と同時に、Docusaurusのサイドバー上のメニュー表示を管轄するファイル`website/sidebar.js`が今回のmdファイルをappendしたうえで更新されます。
余談ですが、このappend、僕は不要なのでskipしたいのですが、`--skipSidebar`オプションがまだDocusaurus v2には非対応なようで、問答無用に上書きされます。Issueをみると、なんと、[本日付けでPR→修正されている](https://github.com/tom-grey/typedoc-plugin-markdown/pull/124)ので、近日中にリリースされると思います。なので、必要な人は今からオプションをつけておくことをお勧めします。

さて、準備はこれで終わりです。最後にもう一度Docusaurusを立ち上げてみましょう。

```bash
cd website/
yarn run start
```

ちゃんと今回取り込んだドキュメントが表示できるようになっていますね。お疲れさまでした。体裁は・・・そんなに良くないけど、このコマンド数でしかもほぼ自動で変換してくれるなら御の字です！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542654/1eb6c18f-4bc4-17fd-7563-d95f77b848f3.png)

必要に応じて、不要なファイルは表示しない様`sidebar.js`を編集すると、無事に自分好みの公開が出来るようになります。

# デプロイ
deployも簡単ですよー。GitHub Pagesなら、下記のコマンドを打てば、自動的に`gh-pages`ブランチにwebサイトとしてデプロイされます。

```bash
GIT_USER=<user> yarn deploy
```

Enjoy!
Iteratorメモ

Iteratorの使い方を簡易的に残します。
今までIteratorについて触れてこなかったのですが、頻出らしいので基本的な使い方についてはまとめておこうと思った次第です。

#Iterator

```java
//リスト初期化
List<String> list = new ArrayList<>(Arrays.asList("apple","banana","orange","fish"));

//Iteratorの宣言
Iterator<String> iterator = list.iterator();

//IteratorのメソッドhasNext()を使用してループ処理
//hasNext()：反復処理でさらに要素がある場合にtrueを返します。
while(iterator.hasNext()) {
	//Iteratorのメソッドnext()で要素を取り出す
	//next()：反復処理で次の要素を返します。
	String str = iterator.next();

	if(str.equals("banana")) {
	//Iteratorのメソッドremove()で要素を削除する
	//ベースとなるコレクションから、このイテレータによって最後に返された要素を削除します
		iterator.remove();
	}
}
System.out.println(list);
```
```java
[apple, orange, fish]
```
TWELITE で使える UART 出力

「超簡単！標準アプリ（App_Twelite）」の書き換えするにあたり、デバッグなどに使えそうな UART 出力。


# UARTに文字列を出力

```

vfPrintf(&sSerStream, "This is test: %d ."LB,1);
```

&sSerStream に 文字列を出力する。%d や %x, %s が使える。
cf.,https://mono-wireless.com/jp/tech/Programming/PERIPH_UART.html

## vfPrintf

cf., 
「バイナリ容量削減のためにsprintf()関数は使わない - オタクじゃないよGeekだよ」
https://mae8bit.hatenablog.com/entry/2018/08/27/191910

# デバッグ出力

```

DBGOUT(5,"This is test: %d"LB,2);
```

5は出力レベル。出力レベルは1〜5。

https://sdk.twelite.info/twelite-net-api-rifurensu/twelite-net-guan-shu/toconet_vdebuglevel#jie-shuo

# テキスト画面描画



```

V_PRINT("%c[2J%c[H", 27, 27); 
```

インタラクティブモードにおける画面描画？
エスケープシーケンスが使えるぽい。
ちなみに上記は画面消去+カーソルをホームポジションに移動するVT-100エスケープシーケンス。
Slack API でテキストの auto parse を escape する方法

# 書いてあること

- Slack API でメッセージを投稿するときの話
- `@hoge` みたいなものはメンション（通知）として auto parse される
    - 他にチャンネル名やリンクなどいろいろある
- ↑の処理を escape して平文テキストとして投稿するようにする方法です

# 方法

いろいろ調べてハマったけど公式ドキュメントにちゃんと書いてあった :tada: 
[Formatting text for app surfaces: Automatic parsing](https://api.slack.com/reference/surfaces/formatting#automatic-parsing)

> - For text in layout blocks set a verbatim attribute of your text objects to false. This is actually the default method of processing these text objects.
> - For the top-level text field, or text in secondary message attachments, you need to include a link_names argument with value of 1 when publishing the message - see the reference docs for the relevant publishing method for more information on how to include this.

解決方法は書いてある通り2つあります。

## Text object のパラメータ追加

- Text object に auto parse を無効にする `"verbatim": true` フィールドを追加する
- verbatim は "一言一句違わず、言葉通りに" みたいな意味らしい

```json
{
  "type": "mrkdwn",
  "text": "@hoge",
  "verbatim": true
}
```

- https://api.slack.com/reference/block-kit/composition-objects#text-object

## リンクフォーマットの一部を使う

- Slack の link format `<http://example.com|example link>`
- この左側だけ使えばよい
    - リンク名になる右側が空欄だと左側の実際のURLがそのまま表示される仕様で、それを利用したものだと思われる
    - 力技感がすごい :muscle: :innocent: 
- `verbatim` は全部 escape しちゃうので局所的にしたいならこちらを使ったほうがいい

```text
<@hoge|>
```
【ESXi】「このホストではSSHが有効です。」のポップアップを消す方法

# はじめに
今回は、ESXiホストでSSHを有効化した際に表示される下記メッセージを非表示にする方法をアウトプットします。

**「このホストではSSHが有効です。管理に必要な場合を除き、SSHを無効にする必要があります。」**

![キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636476/57cad898-d5b4-1a88-3e00-e1dbc30f77d2.jpeg)

# 前提

ESXiホストにてSSHを有効化していること。

![SSH_1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636476/f666ca4b-7bfc-0715-efc2-c06ec7632f80.jpeg)

![SSH_2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636476/92bbcf8f-92a2-9556-7b1b-20a5f5ad2ebc.jpeg)


# 今回の環境

**ESXi 6.7.0**

![バージョン.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636476/498063b1-27c2-5217-4a0f-cea6e6d82c90.jpeg)

# 対処方法

1.「管理」→「システム」→「詳細設定」と選択する。

![1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636476/24fe1229-09d1-1471-14a6-5988a1c20ae8.jpeg)

2.右端の検索バーで**「UserVars.SuppressShellWarning」**と検索する。

![2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636476/0b19b9d1-5790-0063-8c2b-31ba5e7760ca.jpeg)

3.下記のように表示されることを確認。

![3.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636476/22371fe6-73b7-e4c2-0bd3-4eefae470c50.jpeg)


4.**「UserVars.SuppressShellWarning」**を選択後に「オプションの編集」をクリック。

![4.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636476/86c8f2ff-ff88-33e9-3eec-1f987ceeb764.jpeg)

5.0→1に変更後に、保存をクリック。

![5.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636476/98768910-fe67-7e1d-c755-1f6899da4d91.jpeg)

6.値が**「1」**になっていることを確認。

![6.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636476/36985f9f-da1f-f0a6-8e81-cae9c12be757.jpeg)

7.ナビゲーターの「ホスト」をクリック

![7.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636476/d9491bd5-7010-e52a-9c68-44ba7e4941fc.jpeg)

8.下記メッセージが消えていることを確認。

**「このホストではSSHが有効です。管理に必要な場合を除き、SSHを無効にする必要があります。」**

![8.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636476/fc9e5b66-9bd7-352e-df46-d7efbc391079.jpeg)


# 参考

[ESXiのSSH警告を無効化する方法](http://writinglife.hatenablog.com/entry/2017/02/22/225448)
pacman で MSYS2 に Ruby をインストール

既存の MSYS2 環境に後から手動で Ruby をインストールする手順メモ

# 動作環境

```
Windows10 Home Edition

msys2-x86_64-20190524
```

# インストール済みパッケージの更新

```bash
# パッケージデータベースの更新
$ pacman -Sy

# インストールされているパッケージを最新版に更新
$ pacman -Suu
```

以下の警告が出た場合、MSYS2 のシェルをクローズボタンで終了し、再起動して再度 `pacman -Suu` を実行する

```
警告: シェルに戻る前に MSYS2 を終了し、更新を再度チェックしてください
警告: exit を呼ぶのではなく、例えば端末ウィンドウを閉じてください
```

# toolchain (gcc) のインストール

```bash
$ pacman -S base-devel
$ pacman -S mingw-w64-x86_64-toolchain
```

# ruby のインストール

```bash
$ pacman -S mingw-w64-x86_64-ruby
```

# 動作確認

```bash
$ ruby --version
ruby 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [x64-mingw32]

$ gem --version
3.1.2

$ gem list --local
benchmark (default: 0.1.0)
bigdecimal (default: 2.0.0)
bundler (default: 2.1.4)
cgi (default: 0.1.0)
csv (default: 3.1.2)
date (default: 3.0.0)
dbm (default: 1.1.0)
delegate (default: 0.1.0)
did_you_mean (default: 1.4.0)
etc (default: 1.1.0)
fcntl (default: 1.0.0)
fiddle (default: 1.0.0)
fileutils (default: 1.4.1)
forwardable (default: 1.3.1)
gdbm (default: 2.1.0)
getoptlong (default: 0.1.0)
io-console (default: 0.5.6)
ipaddr (default: 1.2.2)
irb (default: 1.2.3)
json (default: 2.3.0)
logger (default: 1.4.2)
matrix (default: 0.2.0)
minitest (5.13.0)
mutex_m (default: 0.1.0)
net-pop (default: 0.1.0)
net-smtp (default: 0.1.0)
net-telnet (0.2.0)
observer (default: 0.1.0)
open3 (default: 0.1.0)
openssl (default: 2.1.2)
ostruct (default: 0.2.0)
power_assert (1.1.7)
prime (default: 0.1.1)
pstore (default: 0.1.0)
psych (default: 3.1.0)
racc (default: 1.4.16)
rake (13.0.1)
rdoc (default: 6.2.1)
readline (default: 0.0.2)
readline-ext (default: 0.1.0)
reline (default: 0.1.3)
rexml (default: 3.2.3)
rss (default: 0.2.8)
sdbm (default: 1.0.0)
singleton (default: 0.1.0)
stringio (default: 0.1.0)
strscan (default: 1.0.3)
test-unit (3.3.4)
timeout (default: 0.1.0)
tracer (default: 0.1.0)
uri (default: 0.10.0)
webrick (default: 1.6.0)
xmlrpc (0.3.0)
yaml (default: 0.1.0)
zlib (default: 1.1.0)
```

# 参考

- [MSYS2/MinGW-w64 (64bit/32bit) インストール手順 メモ](https://gist.github.com/Hamayama/eb4b4824ada3ac71beee0c9bb5fa546d)
- [MSYS2における正しいパッケージの更新方法 - Qiita](https://qiita.com/k-takata/items/373ec7f23d5d7541f982)
- [RubyInstaller2でWindows環境にRuby 2.4 + Rails 5.0.2をインストールする - Qiita](https://qiita.com/jnchito/items/08b5be458134073c60e3)
java(is-a原則の継承)

##is-aの関係

**SuperHero（子クラス）はHero（親クラス）の一種である**
**抽象的なクラス（親クラス）と具体的なクラス（子クラス）の関係**

##has-aの関係
**HeroはSwordを持っている**




##参考にした画像

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588091/ccf44e8f-b8cc-3661-7b8e-fff1d6db3a07.png)
grin wallet のメモ

https://grin.mw/download

基本は CLI のみ.

bitcoin-qt のような GUI は, GrinPlusPlus などで提供されている.
(GrinPlusPlus と grin では wallet のフォーマットは異るっぽい? ので, wallet を移動したいときにどうするか?)

## receive

coin address というのはあまり使われない模様.

transaction file を受け取る -> receive で取り込む -> sender に response を渡して, sender で finalize して送金完了, とするっぽい.

grinmint https://grinmint.com/ でマイニングの払い出しの場合, e-mail + password でマイニングサイトで認証して, tx ファイル取得してのやりとりとなる(のでちょっとめんどい).

```
$ grin-wallet receive -i txfile.json
```

transaction がうまくいったかどうかは, grin node を建てないとわからない(はず)

## grin node

https://github.com/mimblewimble/docs/wiki/How-to-run-a-Grin-node

自前のローカルフォルダで

```
$ ./grin server config
```

とすれば, current dir でいろいろ設定ファイルが書かれるのでオススめ.

```
$ ./grin
```

CURSES あたりで Console ui が出る.  tmux あたりと組み合わせて立ち上げておくとよさそうです.

## TODO

* [ ] Grin マイニングプールから自動払い出しできるようにする
【Flutter】flutter_native_splashを使ったときに、Androidでスプラッシュ画面からアプリ画面に遷移する際、画面が真っ黒になる件の対応

# 経緯
[こちら](https://yaba-blog.com/flutter-splash-screen/)を参考にFlutterにスプラッシュ画面を導入してみたのですが、Androidでスプラッシュ画面からアプリ画面に遷移する際、一時的に画面が真っ黒になる事象が起きました。
本当はフェードインアニメーションでアプリ画面に遷移するはずなのですが...
(iOSは未検証)

# バージョンなど
```
Flutter:(Channel stable, v1.17.0, on Microsoft Windows [Version 10.0.18362.836], locale ja-JP)
Dart:2.7
flutter_native_splash:0.1.9
```

# 解決方法
`android/app/src/main/AndroidManifest.xml`の`<activity android:name=".MainActivity" ...>`タグの中に下記`<meta-data>`タグを追加すると直りました。  
  
```xml
<meta-data
    android:name="io.flutter.embedding.android.SplashScreenDrawable"
    android:resource="@drawable/launch_background" />
```

`<meta-data>`タグ追加後のXMLはこんなイメージです。

```xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.appname">
    <!-- io.flutter.app.FlutterApplication is an android.app.Application that
         calls FlutterMain.startInitialization(this); in its onCreate method.
         In most cases you can leave this as-is, but you if you want to provide
         additional functionality it is fine to subclass or reimplement
         FlutterApplication and put your custom class here. -->
    <application
        android:name="io.flutter.app.FlutterApplication"
        android:label="appname"
        android:icon="@mipmap/ic_launcher">
        <activity
            android:name=".MainActivity"
            android:launchMode="singleTop"
            android:theme="@style/LaunchTheme"
            android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
            android:hardwareAccelerated="true"
            android:windowSoftInputMode="adjustResize">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

            <!-- splash後に画面が黒くなる件の対応 ここから -->
            <meta-data
                android:name="io.flutter.embedding.android.SplashScreenDrawable"
                android:resource="@drawable/launch_background" />
            <!-- splash後に画面が黒くなる件の対応 ここまで -->
        </activity>
        <!-- Don't delete the meta-data below.
             This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
        <meta-data
            android:name="flutterEmbedding"
            android:value="2" />
    </application>
</manifest>
```

# 参考
https://github.com/henriquearthur/flutter_native_splash/issues/54
5/5にlance-aurorさんが書いている内容をマネてみると直りました。(感謝です...)
Vue.jsでメニュー 切り替え　メモ

#切り替えメニューを作りたい！

飲み物メニューボタンを押したときは、飲み物のメニューだけを表示
食べ物メニューボタンを押したときは、食べ物のメニューだけを表示
したい！

##scriptタグにメソッドとデータを準備
`selectedMenu`というデータと
`changeMenu`というメソッドを作る。

`selectedMenu`の値は空文字でもよい。その場合初期状態では非表示になる。

```vuejs

<script>
    export default {
        components: {},
        data: function () {
            return {
                selectedMenu: "1"  //選択しない状態で何も表示したくないときは空文字でもよい。
            }
        },
        methods: {
            changeMenu: function (num) {
                this.selectedMenu = num
            }
        }
    }
</script>
```

##templateタグの中を作っていきます

それぞれのメニューボタンを押すと、`changeMenu()`が動いて、`selectedMenu`の中身が変わる。

`v-if`を使って、`selectedMenu`の中身に応じて、表示・非表示を切り替えるようにする。

:warning::warning::warning:
selectedMenu === 1にする凡ミスをよくやった。:pensive:
型に注意！！
:warning::warning::warning:

```vuejs
<template>
            <button v-on:click="changeMenu('1')">飲み物メニュー</button>
            <button v-on:click="changeMenu('2')">食べ物メニュー</button>      

            <ul v-if="selectedMenu==='1'">
                <li>ビール</li>
                <li>レモンサワー</li>
                <li>お冷</li>
            </ul>
            <ul v-if="selectedMenu ==='2'"> //v-else-ifでもよい
                <li>ハンバーグ</li>
                <li>カレー</li>
                <li>お茶漬け</li>
            </ul>
</template>
```

##ついでに、
どのメニューを選択しているかわかりやすいように、menuボタンに赤色でもつけておく。

`v-bind`を使って、条件が合うと`button`タグに`active`クラスが追加されるようにする。
**オブジェクト構文**というらしい。
buttonがactiveクラスになったときだけ、赤くなるようになった！:relaxed:


```vuejs

            <button v-on:click="changeMenu('1')"
                    v-bind:class="{'active':selectedMenu ==='1'}"
            >飲み物メニュー</button>

            <button v-on:click="changeMenu('2')"
                    v-bind:class="{'active':selectedMenu ==='2'}"
            >食べ物メニュー</button>
<style>
    button.active {
        color: red;
    }
</style>
```

#参考
[Vue.jsでタブメニューをつくる](https://qiita.com/mimoe/items/86d5312b3741320b717b)
Docker版Oracle11gのデータ永続化

Docker 版 Oracle11g のデータ永続化のやり方をメモる。
使用するイメージはこちら：https://registry.hub.docker.com/r/wnameless/oracle-xe-11g-r2

# やり方
1. 空のコンテナを作る。
2. コンテナからOracleのインストールフォルダをホストにまるごとコピーする。
3. コンテナを一旦削除。
4. mount をつけて再度コンテナを作る。

## １、ます、コンテナをそのまま作る。
```shell
# mkdir oracle11g
# cd oracle11g
```

```shell
# docker run -d -p 49161:1521 \
  -e ORACLE_ALLOW_REMOTE=true \
  -e ORACLE_DISABLE_ASYNCH_IO=true \
  -e TZ=Asia/Tokyo \
  -v /etc/localtime:/etc/localtime:ro \
  --name oracle11g \
  wnameless/oracle-xe-11g-r2 \
&& docker logs -f oracle11g
```

以下のログが出力される。30秒～1分ぐらいかかるので、気長に待ちましょう。

```shell
f6c46d814f7db9cde443c78f122d91524e334e30cf44e5979836a906beae0649
Starting Oracle Net Listener.
Starting Oracle Database 11g Express Edition instance.


System altered.


System altered.

Shutting down Oracle Database 11g Express Edition instance.
Stopping Oracle Net Listener.

Starting Oracle Net Listener.
Starting Oracle Database 11g Express Edition instance.
```

ログが出たら、接続可能になります。確認して見てください。
Ctrl+c でログ監視を終了させ、docker ps -a で状況確認。

```shell
# docker ps -a
CONTAINER ID        IMAGE                          COMMAND                  CREATED             STATUS              PORTS                                       NAMES
f6c46d814f7d        wnameless/oracle-xe-11g-r2     "/bin/sh -c '/usr/sb乧"   4 minutes ago       Up 4 minutes        22/tcp, 8080/tcp, 0.0.0.0:49161->1521/tcp   oracle11g
```

問題なさそうですね。あとは接続して試しにテーブルを作ったりして確認。（確認手順は省く）


## ２、コンテナ内のファイルをホスト側にコピーする。

```shell
# docker cp oracle11g:/u01/app/oracle .
```
フォルダの大きさを確認

```shell
# du -sh oracle
1.7G    oracle
```
だったの1.7GB 、素晴らしい！
Oracle 12c は 10GB 以上必要あるから全然こっちの方が良い！！


※ オプション
１つのフォルダぐらいを mount したいから、tmp フォルダを作っておく。特に必要ないなら、やらなくて良い。

## ３、コンテナを一旦削除、docker ps -a で削除されたことを確認

```shell
# docker stop oracle11g && docker rm oracle11g
oracle11g
oracle11g
# docker ps -a
CONTAINER ID        IMAGE                          COMMAND                  CREATED             STATUS              PORTS                               NAMES
```

## ４、もう一回コンテナを作るが、今度はmount付き

```shell
docker run -d -p 49161:1521 \
  -e ORACLE_ALLOW_REMOTE=true \
  -e ORACLE_DISABLE_ASYNCH_IO=true \
  -e TZ=Asia/Tokyo \
  -v $(pwd)/tmp/:/tmp/ \
  -v $(pwd)/oracle/:/u01/app/oracle \
  -v /etc/localtime:/etc/localtime:ro \
  --name oracle11g \
  wnameless/oracle-xe-11g-r2 \
  && docker logs -f oracle11g
```

説明すると

```shell
-v $(pwd)/tmp/:/tmp/
```
/tmp フォルダをマウント。ファイルをコンテナに転送する時は便利。

```shell
-v $(pwd)/oracle/:/u01/app/oracle
```
１回目で作ったコンテナのOracleフォルダをマウント。これでデータ永続化可能なる。

```shell
-v /etc/localtime:/etc/localtime:ro
```
timezone をホスト機と同じにする。

再度接続したら、先程確認で作ったテーブルが存在するはず。

おまけ１：sqlplus を使ってみる

```shell
# docker exec -it oracle11g bash

root@5ed47462ec5b:/# sqlplus system/oracle@xe
SQL> select username from dba_users;

USERNAME
------------------------------
SYSTEM
SYS
ANONYMOUS
CTXSYS
APEX_PUBLIC_USER
APEX_040000
OUTLN
XS$NULL
XDB
MDSYS
FLOWS_FILES

USERNAME
------------------------------
HR

12 rows selected.

SQL>
```
問題なさそうですね！

おまけ２：
12c はこちら：https://qiita.com/gorilla0513/items/f22e8cce4e08da031abe

以上。
OSI参照モデムモデル

#OSI参照モデルとは

　OSI参照モデルはISOが１９８４年にリリースした開放型システム相互接続参照モデルのこと
お互いが参照・被参照関係にあるレイヤによるモデルであり、上位層は下位層に対して抽象化されている。
通信機能を以下の7階層（レイヤ）に分割する。

## ７つの階層

### ７層　アプリケーション層
具体的な通信サービス（例えばファイル・メールの転送、遠隔データベースアクセスなど）を提供。HTTPやFTP等の通信サービス。
ネットワークの入り口に位置する層で、ネットワークが可能かどうか判断する層。

### ６層　プレゼンテーション層
データの表現方法（例えばEBCDICコードのテキストファイルをASCIIコードのファイルへ変換する）。
大雑把に言えば、使う言語を決定する。

###５層　セッション層
通信プログラム間の通信の開始から終了までの手順（接続が途切れた場合、接続の回復を試みる）。

###４層　トランスポート層
ネットワークの端から端までの通信管理（エラー訂正、再送制御等）。
信用性の高いサービスを提供する。

###3層　ネットワーク層
ネットワークにおける通信経路の選択（ルーティング）。データ中継。
ネットワーク層は離れた場所に存在する相手との間でデータの伝送・運ぶルートの決定・宛先の決定する

###２層　データリンク層
直接的（隣接的）に接続されている通信機器間の信号の受け渡し。
ケーブルで直に接続されている機器とのデータのやり取りの制御。

###１層　物理層
物理的な接続。コネクタのピンの数、コネクタ形状の規定等。銅線-光ファイバ間の電気信号の変換等。
伝送媒体（電気信号や光）上にてビット転送を行うための物理コネクションを確立・維持・解放する電気・機械・機能・手続き的な手段を定義する。

##感想

　各層でどんなことが行われるのか、各層の役割が理解できていないがネットワークを通して正確にデータを送信・受信するのに重要なことだと思う。
TCP/IPというプロトコルを使用して色々なところに接続している。ネットワークはもともとリソースの共有をするために作られており、各社が独自の規格を作っていたため、他社間で通信ができないということがあったらしい。
そこで考えられたのがネットワーク・モデルという規格。
基本的にOSI参照モデルを元にネットワーク通信できるようになっているため、各層について詳しく理解することはネットワークエンジニアになる上で必要なことだと思う。
製薬企業研究者がPythonにおけるファイル走査についてまとめてみた

# はじめに

ここでは、Pythonを用いたファイル走査の方法として、osモジュールとpathlibモジュールの利用方法を紹介します。


# osモジュール

osモジュールは、ファイルやディレクトリを扱う上でベーシックなモジュールです。
よく使うメソッドなどは以下になります。

```python
import os


directory = 'ディレクトリー名'
file = 'ファイル名'

file_path = os.path.join(directory, file)
print(file_path) # ディレクトリ名/ファイル名
print(os.path.isfile(file_path)) # True
print(os.path.isdir(file_path)) # False
print(os.path.isdir(directory)) # True
print(os.path.exists(file_path)) # True

entry_list = []
for entry in os.listdir(directory):
    entry_list.append(entry)
print(directory_list)

directory_list = []
file_list = []
path_list = []
for root, dirs, files in os.walk(directory):
    for drc in dirs:
        directory_list.append(drc)
    for file in files:
        file_list.append(file)
        file_path.append(os.path.join(root, file))
print(directory_list)
print(file_list)
print(path_list)
```


# pathlibモジュール

Python3.4以降はpathlibモジュールを利用することができます。

```python
from pathlib import Path


p_dir = Path('ディレクトリ名')
p_file = Path('ファイル名')

p_path = p_dir / p_file
p_path.mkdir(parents=True, exist_ok=True)
print(p_path)

print(p_path.parts)
print(p_path.parent)
print(p_path.name)
print(p_path.stem)
print(p_path.suffix)

print(p_path.is_file()) # True
print(p_path.is_dir()) # False
print(p_dir.is_dir()) # True
print(p_path.exists()) # True

p_path.rmdir()
print(p_path.exists()) # False
```



# まとめ

ここでは、osモジュールとpathlibモジュールについて解説しました。
まだ説明不足なところもあるので、後日追記予定です。


# 参考資料・リンク

[プログラミング言語Pythonとは？AIや機械学習に使える？](https://pharma-engineer.com/basic-programming/python-summary/)
javaScript 文字の切り出しとソート処理のソースコード（googleスライドに対して実行）

# 前提
* GASで実行しています
* 想定しているプレゼンテーションに含まれるスライドの見出しオブジェクトにおける文字は「1-1.sample」のような形式を想定しています。
* 上記の形式はピリオド以前が数字とハイフン、ピリオド以降がタイトルと換言できます


```javascript:qiita&nbsp;TitleBeforePeriod.js
// グーグルスライドの任意のプレゼンテーションURLを変数に格納する
const Url = "YOUR_GOOGLE_SLIDE_PRESENTATION_URL"
// 上記変数を元に、プレゼンテーションを開く
const presentation = SlidesApp.openByUrl(Url);
// 開いたプレゼンテーションのスライド全てを変数に格納する 
const slides = presentation.getSlides();
// 関数を実行する
function slideOrganize() {
  //　配列を初期化する
  const title_before_period_list = [];
  // プレゼンテーションの１ページ目は表紙と想定
  // プレゼンテーションの２ページ目は目次と想定
  // getSlides()メソッドで取得したページはインデックス０として取得されているため、３ページ目からスライドを操作したい場合は、要素数２からを対象とする
  for (let count = 2; count <= slides.length-1; count ++){
    // 要素番号countのスライドにおけるタイトルのテキストをString型取得し、title変数へ格納する
    const title = getTitle(count);
    // 引数として渡した文字列のピリオドの位置を返すメソッドを使います
    const period_index = getPeriodIndex(title);
    // 文字の先頭から開始して、ピリオドがある位置までをsubstr()メソッドを使って切り出します
    const organize_title = title.substr(0, period_index)
    // ピリオドの位置までで切り出した文字を配列に格納します
    array.push(organize_title);
  }
  // ピリオドの前までのタイトルをソートする
  title_before_period_list.sort(function(a,b){
    if(a < b) return -1;
    if(a > b) return 1;
    return 0;
  });
  // ソートした結果をLogで出力する
  Logger.log(array);
}

// 引数はタイトルを取得したいスライドの要素番号
function getTitle(page){
  // slides[page]で操作したいスライドを要素番号を使って指定する
  // getShapes()[0]を使って、取得したスライド内にあるオブジェクトの０番目を取得する
  // Returns the list of Shape objects on the page. （引用：参照サイトより）
  // タイトルはスライド内のオブジェクトのうち、０番目にあるオブジェクトである
  const title_object = slides[page].getShapes()[0];
  // title_objectのテキストコンテンツをgetText()を使って取得する
  // テキストコンテンツをString型として取得する
  // asString() : Returns the raw text bounded by this range of the associated shape or table cell. （引用：参照サイトより）
  // page_titleには、スライドの０番目のオブジェクトである見出しオブジェクトのテキストが格納される
  // テキストはString型として格納される
  const page_title = title_object.getText().asString();
  return page_title;  
}
// 引数として受け取った文字列におけるピリオドの位置を返すメソッド
function getPeriodIndex(title) {
  // 単語を一文字ずつ配列に格納します
  const array_string = Array.from(title);
  // 上記の配列のうちピリオドがある位置をindexOf()メソッドで計算します
  const index_period = array_string.indexOf('.');
  // 受け取った文字列におけるピリオドの位置を返します
  return index_period;
}

```

# 参照
https://www.w3schools.com/jsref/jsref_substr.asp
https://developers.google.com/apps-script/reference/slides
https://developers.google.com/apps-script/reference/slides/slides-app
コンテナ型とハイパーバイザー型の違いとは？

# はじめに
今回は、コンテナ型とハイパーバイザー型の違いについてアウトプットを込めて解説していきたいと思います。
この違いは、LPIC304にも試験範囲として出題されていました。
そのため、これから受験しようと思う人には参考になる記事だと思います。

# コンテナ型とは何か？

1つのOSの中にアプリケーションを格納する箱を複数用意するという考え方の仮想化技術になります。

図にするとこのような形になります。


![container.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636476/ec6da3a8-7790-c4fd-2cfe-1f0a32305747.jpeg)



## 特徴

- とにかく処理が軽量
- 一つのOS内でアプリケーションを動作させることができる
- コンテナ設定の再利用が可能


## 代表的なコンテナ技術

- docker
- Linuxコンテナ



# ハイパーバイザー(Hypervisor)とは何か？

ハイパーバイザーとは、コンピューターを仮想化するためのソフトウェアです。

図にするとこのような形になります。

![hypervisor.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636476/62d2217b-2d97-56ff-9cb8-72f7990616d4.jpeg)


ハイパーバイザーという仮想化ソフトウェアの上に複数のOS(仮想マシン)が乗っているという構成になります。

## 特徴

- ハイパーバイザーの上に複数の仮想マシンを立てることができる
- それぞれ別のOSでサーバーを立てることができる



## 代表的なハイパーバイザー技術

- KVM
- OpenStack
- vSphere
- Hyper-V
- Xen


# コンテナ型とハイパーバイザー型の違いは？

## アプリケーション起動速度

コンテナ型の方が高速です。

**なぜなら、OSを一回一回立ち上げる必要がないからです。**

試験的にdockerを構築後に「nginx」を導入したことがあります。
実際に「nginx」を起動させてみました。
結果、vSphere上でOSを起動させるよりも圧倒的に早かったです。(30秒程)

このように、アプリケーション起動速度はコンテナの方が早いです。

## OSのカスタマイズ性

こちらは、ハイパーバイザーの方が優れています。

**なぜなら、コンテナ型は使用するOSが限られているからです。**
一方、ハイパーバイザーはOS毎に箱が作成されます。

「一方のサーバーのOSはLinuxにして、他はWindowsにする」
このような要件であれば、ハイパーバイザーの方が優れています。

このように、OSカスタマイズ性を考えるとハイパーバイザーの方が使いやすいです。

# 参考記事

[**用語集｜ハイパーバイザー**](
https://www.idcf.jp/words/hypervisor.html)

[**Dockerとは何かを入門者向けに解説！基本コマンドも**]
(https://udemy.benesse.co.jp/development/web/docker.html)

[**VPSの二大仮想化技術「コンテナ型」vs「VM型」―― その違いとメリット・デメリット**]
(https://www.tsukaeru.net/blog-detail/vps%E3%81%AE%E4%BA%8C%E5%A4%A7%E4%BB%AE%E6%83%B3%E5%8C%96%E6%8A%80%E8%A1%93%E3%80%8C%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E5%9E%8B%E3%80%8Dvs%E3%80%8Cvm%E5%9E%8B%E3%80%8D%E2%80%95%E2%80%95-%E3%81%9D%E3%81%AE%E9%81%95%E3%81%84%E3%81%A8%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88%E3%83%BB%E3%83%87%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88-37)
flutter の macos と ios の切り替え

```bash
$ flutter devices
1 connected device:

iPhone SE (2nd generation) • 82E47E25-71B8-4ACA-ACBD-D4D9A6F105C3 • ios • com.apple.CoreSimulator.SimRuntime.iOS-13-4 (simulator)


$ flutter config --enable-macos-desktop
Setting "enable-macos-desktop" value to "true".

You may need to restart any open editors for them to read new settings.


$ flutter devices
2 connected devices:

iPhone SE (2nd generation) • 82E47E25-71B8-4ACA-ACBD-D4D9A6F105C3 • ios        • com.apple.CoreSimulator.SimRuntime.iOS-13-4 (simulator)
macOS                      • macOS                                • darwin-x64 • Mac OS X 10.15.4 19E287


$ flutter config --no-enable-macos-desktop
Setting "enable-macos-desktop" value to "false".

You may need to restart any open editors for them to read new settings.
```

```
$ flutter config --enable-macos-desktop
$ flutter config --no-enable-macos-desktop
```

これで、device に macos を追加したり除いたりできるみたい。

cf. https://flutter.dev/desktop
PYNQ-Z1 + Vivado > PL.ip_dictが空 > Vivado v2019.2で発生 | Vivado v2019.1では正常動作

```txt:動作環境
Windows 10 Pro (v1909) 
PYNQ-Z1 (Digilent) (以下、PYNQと表記)
Vivado v2019.2 (64-bit) => Vivado v2019.1 (64-bit)
```

### 関連

- [PYNQ-Z1 > Getting Started > 最初のJupyter Notebook接続でつまずく > imageファイルがおかしかった?](https://qiita.com/7of9/items/7d123252a4eeaa8ae708)

### 概要

- PYNQにてLEDを操作するプロジェクトを作成
    - 例: [PYNQ-Z1でカスタムIP作成してLEDチカ](https://qiita.com/kamotsuru/items/0a04bd696006880b4e68)
- bitstreamを作成し、tclファイルとともにPYNQにscpでコピー
- Jupyter NotebookからPL.ip_dictを実施するが、辞書が空となる

### 関連情報

- [Overlay loading problem -> ip_dict empty](https://discuss.pynq.io/t/overlay-loading-problem-ip-dict-empty/93)

Vivado v2019.2の不具合という記載がある。

### Vivado v2019.1で実施

v2019.2をアンインストールし、v2019.1で試した。
PL.ip_dictはきちんとした辞書内容を返した。
Cookieの削除の話

# はじめに
Cookieをプログラムで使用する時に、「Cookieの削除はいつから有効になるのか」ふと疑問思ったので、
軽く実験してみました。
おそらく、HTTPプロトコルについての基本がわかっている人はそんなの当たり前に知っているという人が多いでしょう笑

webアプリを開発時、Cookieの処理を実装しようとした時にどうするかを考えた時に、この処理の時はあるCookieを削除して、
その後の処理を分岐させたいというアイデアが出たのですが、それって多分できないよねって話になりました。

多分っていうのが気持ち悪かったので、PHPで試しに実験してみました。

# 環境
環境  
PHP7
CakePHP3

# 実験

1. ブラウザに `Cookie名: name Cookie値: bellcrud` を登録する    
2. プログラムで `Cookie[name]`をログ出力
3. プログラムで `Cookie[name]`を削除
4. プログラムで `Cookie[name]`をログ出力

```CookiesController.php
public function index()
    {
        $this->log('----クッキー取得');
        $this->log($this->Cookie->read('name'));　// CakePHPの用意しているライブラリで取得
        $this->log($_COOKIE); // 素のPHPので取得

        $this->log('----クッキー削除');
        $this->Cookie->delete('name');　// CakePHPの用意しているライブラリで削除
        $this->log($this->Cookie->read('name'));// CakePHPの用意しているライブラリで取得
        $this->log($_COOKIE);　// 素のPHPので取得
    }
```


```error.log
2020-05-23 10:26:06 Warning: DebugKit not enabled. You need to either install pdo_sqlite, or define the "debug_kit" connection name.
2020-05-23 10:26:06 Error: ----クッキー取得
2020-05-23 10:26:06 Error: bellcrud // 取得できたことを確認
2020-05-23 10:26:06 Error: Array
(
    [Phpstorm-8ff1daf1] => ************************************
    [remember_web_*********] => ************************************
    [csrfToken] => ************************************
    [name] => bellcrud
)

2020-05-23 10:26:06 Error: ----クッキー削除
2020-05-23 10:26:06 Error:        // 取得できていない！！！
2020-05-23 10:26:06 Error: Array
(
  
    [Phpstorm-8ff1daf1] => ************************************
    [remember_web_*********] => ************************************
    [csrfToken] => ************************************
    [name] => bellcrud // 削除されていない！！！
)
```


・ CakePHPの用意している`CookieComponent`では削除された扱い
・ PHPの用意している$_COOKIEでは削除されていない

# 結論
「正確にいうと削除されません。」
CakePHPの用意しているライブラリでは削除扱いになっていますが、実際のところは素のPHPでのCOOKIE取得でわかる通り削除されていません
**COOKIEはを削除するというのは、有効期限切れにするという処理をクライアント側で完了して削除されたということ。
サーバー上で削除するというのが、そもそもの考えが意味わからないということですね。**
ただ、フレームワーク側で用意されたライブラリを使うと、削除された扱いとなり取得できなくなるようにすることができる。

# 所感
cookieを扱う時は一貫した扱い方をしないと、わけわからなくなるため、気をつけないといけないことがわかりました。
laravel-mix調査の備忘録

## 概要
Laravel-Mix調査で知らない単語がたくさん出てきたのでそれのメモ。
そもそもLaravel-Mixなんで使うの？って理由ですが

* 複数のjsファイルを一つにバンドルしたい
* キャッシュが原因でjs, cssの変更が反映されない問題を解決したい
* npmコマンド叩きたい（今の主流はyarnらしいですが...）

上記のような理由です。

参照ページ
  
* https://qiita.com/minato-naka/items/0db285f4a3ba5adb6498
* https://qiita.com/minato-naka/items/bfc3bbd9a388084e6f17
* https://qiita.com/kamykn/items/45fb4690ace32216ca25
* https://readouble.com/laravel/6.x/ja/mix.html

## Laravel Mixとは
Laravel 公式ドキュメントより
`
Laravel Mixは多くの一般的なCSSとJavaScriptのプリプロセッサを使用し、Laravelアプリケーションために、構築過程をwebpackでスラスラと定義できるAPIを提供しています。シンプルなメソッドチェーンを使用しているため、アセットパイプラインを流暢に定義できます。例を見てください。
`
全然わからん。こちとらwebpackが何者なのかすら理解できていない。
色々調べたが大体こんな感じ。

1. webpack君は複数ファイルを一つにまとめてくれるモジュールバンドラツール
1. webpack君をそのまま使うのはダルい
1. Laravel Mixを使うと簡単に書ける

完全に理解した。

## browserSyncとは
コードを変更、保存したら自動でブラウザを更新してくれる賢いヤツ。
Laravel-Mixだと簡単に書ける。

```js
mix.browserSync({
    proxy: '192.168.99.100',
    open: false, // ブラウザを自動で開かない
    files: [ // 監視対象のファイル
        'resources/**/*',
    ],
    watchOptions: {
        usePolling: true,
        interval: 500,
      },
    })
```

自前のdocker環境用の書き方だけどざっくりこんな感じです。
resources配下のファイルを変更した際に画面が自動reloadされます。
bladeの変更がリロードなしで即反映されるので開発が捗る捗る。

## UglifyJSとは
JavaScriptのコードを圧縮、軽量化(minify)したり難読化するためのツールです。
Laravel-mixの場合、コマンドによってminifyされるか否かが決まります。

`npm run dev` ⇒ minifyされない
`npm run prod` ⇒ minifyされる

```json
    "scripts": {
        "dev": "npm run development",
        "development": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
        "watch": "npm run development -- --watch",
        "watch-poll": "npm run watch -- --watch-poll",
        "hot": "cross-env NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot --disable-host-check --config=node_modules/laravel-mix/setup/webpack.config.js",
        "prod": "npm run production",
        "production": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --no-progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js"
    }
```
【Visual Studio Code】 便利な使い方 + Emmet記法

#【Visual Studio Code】便利な使い方 + Emmet記法


##ショートカット操作

<b>コピー</b>
対象行を選択した状態でCtrl+C

<b>ペースト</b>
対象行を選択した状態でCtrl+V

<b>行の移動</b>
対象行を選択した状態でAlt+↑または↓

<b>行の複写</b>
対象行を選択した状態でAlt+Shift+↑または↓

<b>マルチカーソル</b>
Altキーを押したまま複数選択
その後入力した内容は同時に反映される
（置換の代用）

<b>Ctrl+B</b>
サイドメニューの表示/非表示切り替え

<b>予測入力（の活かし方）</b>
&lt;b&gt;と打つ場合、
・&lt;→b→&gt;と入力すると予測変換が3操作目で閉じタグを表示してくれる
・あるいは&lt;→&gt;→b→&lt;→/の5操作目で閉じタグを表示しれくれる

前者の入力癖をつけた方が良い

<b>!+return</b>
HTMLのテンプレート呼出し

<b>コメントアウト</b>
対象行でCtrl+/

<b>コマンドパレット（コマンドのショートカット確認など）</b>
Ctrl+P

```js
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
</html>
```

<b>ul>li*liの数</b>

```js
ul>li*4

<ul>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
</ul>

```
<b>ul>color:色名</b>

```js
h1{
    color:red
}
```
サンプルが表示。
マウスホバーするとカラーピッカーが起動する。
![200523_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/372612/f2dc191c-e476-2e6c-673f-46cdf177b6c6.jpeg)
Sassの導入難易度を下げるツール達

## Sassとは
「Syntactically Awesome StyleSheet」の略で、CSSを効率的に記述できるように設計・開発されたRuby製のCSSメタ言語のこと
[Sass公式](https://sass-lang.com/)

## Sassの問題点
Sassに限らずですが、CUIでターミナルを開いてコマンドを打つのは初心者には結構大変です。
今回はそんなSassを簡単に使えるツールを紹介します。

## SassをGUIに使えるツール
### [Prepros](https://prepros.io/)
<img width="1792" alt="Prepros.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473780/cbbef79c-6048-407d-c6d7-c6891c35aa97.png">
Sassを「Process File」というボタンをクリックするだけで、CSSファイルを生成してくれる、
初心者にとってはとても嬉しい機能がついたテキストエディタ。
29ドルの課金をしないと広告が出てきますが、とりあえずは使ってみると良いでしょう。

### [SassMeister](https://www.sassmeister.com/)
<img width="1792" alt="SassMeister.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473780/8684bd99-7a73-c9b7-7fda-1ed9e37c4b03.png">
画面左側にSassのコードを入力するだけで、右側にCSSのコードを書き出してくれるWebサービス。
アクセスしてすぐ使えるので、SassのコードをCSSだとどうなるか試したい時に役立ちます。

### [Codepen](https://codepen.io/)
<img width="1792" alt="CodePen.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473780/d0b0bf9b-8500-1190-c081-2cec02ee66bb.png">
CodepenではSassを使えますが、そのSassのコードをCSSコードで見たい時に、
「View Compiled CSS」というボタンをクリックするだけで、CSS表示してくれます。
Codepenはスニペットとしても使えるので、これを使わない手はないでしょう。

## まとめ
今回紹介した以外にも、テキストエディタによっては拡張機能でSassを自動コンパイルしてくれるものも
あるので、調べてみても良いでしょう。
フロントエンドやWeb制作者を目指す人はSassを使える事は必須のスキルだったりするので、
最初はこうしたツールを使いながら少しづつ慣れていきましょう！