OmniAICreator/Qiita-1.07M huggingface dataset:
Ansibleでnginxを起動

# はじめに

レポジトリーはこちらです。

https://github.com/sugiyama404/ansible_docker

今回は、controllerにAnsibleをインストールし、各serverで実行します。

## Ubuntsuの設定

/etc/hostsに以下を追加します。

```text:/etc/hosts
192.168.56.8　　　　server1
192.168.56.9　　　　server2
```

# Ansibleの設定

## UbuntsuへのAnsibleのインストール

Ansibleのインストールします。

```console
sudo apt update
sudo apt install software-properties-common
sudo apt-add-repository --yes --update ppa:ansible/ansible
sudo apt install ansible
```

https://docs.ansible.com/ansible/2.9_ja/installation_guide/intro_installation.html#ubuntu-ansible

## Ansibleのserviceを設定ファイルに追記する

```text:/etc/ansible/hosts
[group]
server1
server2
```

## SSH接続エラーの回避設定

```text:/etc/ansible/ansible.cfg
[defaults]
host_key_checking = false
```

そして、ssh keyを作成後、各サーバーに配ります。

https://qiita.com/kentarosasaki/items/aa319e735a0b9660f1f0

## 疎通の確認する

pingをしてみます。
kはパスワード認証の要求、mはコマンドの実行です。

```console
ansible group -k -m ping
```

![Screenshot 2023-02-06 at 15.08.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731268/6c0288e4-2d3d-d239-56fc-6198507fd457.png)

## ansible-playbookを実行します

playbookのsyntax-check後、問題がなければ実行します。

```console
ansible-playbook hello.yml --syntax-check
ansible-playbook hello.yml -k
```

```yaml:hello.yml
---
- hosts: group
  tasks:
    - name: "first ansible"
      debug: msg="Hello world!!!!!"
```

![Screenshot 2023-02-06 at 15.11.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731268/68c3b744-a1d3-bda7-4cb7-272c610a8ad5.png)


# Nginxのダウンロードと起動

## Nginxのダウンロード方法を確認


Ubuntsuへのダウンロードを確認し、playbookに書きます。

https://www.digitalocean.com/community/tutorials/how-to-install-nginx-on-ubuntu-20-04-ja

```yaml:main.yml
---
- hosts: group
  become: yes
  tasks:
    - name: "install nginx"
      ansible.builtin.apt:
        name: nginx
        state: latest
        cache_valid_time: 86400
        update_cache: yes
    - name: "start nginx"
      service:
        name: nginx
        state: started
```

## paybookの構文をチェック

paybookの構文をチェックします。

```console
ansible-playbook main.yml --syntax-check
```

![Screenshot 2023-02-06 at 12.34.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731268/191270e4-9af6-a2cb-76d6-c72e6f26cbb0.png)

## paybookを実行

```console
ansible-playbook main.yml -k --ask-become-pass
```

--ask-become-passはssh先のsudoコマンドで求められるパスワード認証を要求させます。



![Screenshot 2023-02-06 at 12.32.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731268/e671bd4c-e006-7abe-0547-bcb0965709b7.png)

# 結果

下記にアクセスします。

```text
http://192.168.56.8:80
http://192.168.56.9:80
```

![Screenshot 2023-02-06 at 12.29.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731268/372e24ec-158e-eeae-8502-26671059debe.png)
【Flutter】dartでListからnullを除外する

SwiftのcompactMapのように、nullを含む配列からnullを除外した配列を取得する方法です。
whereTypeで型を指定すればその型に一致する要素のみ取得することができます。

```
final List<String?> hoge = [null, "a", "b", null];
final fuga = hoge.whereType<String>().toList(); // [a, b]
```

参考
https://stackoverflow.com/questions/34513924/what-is-the-best-way-to-fillter-null-from-a-list-in-dart-language
Files class

```java
public class Outer {
    public static void main(String[] args) throws Exception{
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();
        System.out.println(str);
        Path p = Paths.get("c:\\dirtest\\" + str);
        File f = p.getParent().toFile();
        System.out.println(f);
        method(f);
        if(!Files.exists(p)) {
            Files.createFile(p);
        }
        method(f);
        System.out.println(Files.getLastModifiedTime(p));
//        System.out.println(Files.getPosixFilePermissions(p));
        System.out.println("delete ? y/n");
        str = sc.nextLine();
        if(str.equals("y")) {
            Files.delete(p);
        }
        method(f);
    }
    static void method(File pf) {
        System.out.println("-----------------------------");
        File[] fs = pf.listFiles();
        for(File f:fs) {
            System.out.print(f.getName());
            if(f.isDirectory())  System.out.println("   is directory.");
            else  System.out.println("    is file");
        }
    }
}
```
```
ppp.txt
ppp.txt
c:\dirtest
-----------------------------
cook.jpg    is file
cookcpy.jpg    is file
iii    is file
sample.ser    is file
showa.txt    is file
test.txt    is file
test2dir   is directory.
test3dir   is directory.
testdir   is directory.
testmakefile.txt    is file
testwritefile.txt    is file
-----------------------------
cook.jpg    is file
cookcpy.jpg    is file
iii    is file
ppp.txt    is file
sample.ser    is file
showa.txt    is file
test.txt    is file
test2dir   is directory.
test3dir   is directory.
testdir   is directory.
testmakefile.txt    is file
testwritefile.txt    is file
2023-02-06T06:33:41.611141Z
delete ? y/n
y
-----------------------------
cook.jpg    is file
cookcpy.jpg    is file
iii    is file
sample.ser    is file
showa.txt    is file
test.txt    is file
test2dir   is directory.
test3dir   is directory.
testdir   is directory.
testmakefile.txt    is file
testwritefile.txt    is file
```
【GoF】Iteratorパターン例（スラムダンク）

# 背景
Iteratorパターンって日本語では「繰り返す」という意味ですが、
それだけなら、for文とかで良いんじゃね？
デザインパターン使う意味あるの？っていうのを具体例を使って考えてみる。

# 参考文献
* [増補改訂版 Java言語で学ぶデザインパターン入門](https://www.amazon.co.jp/増補改訂版-Java言語で学ぶデザインパターン入門-結城-浩-ebook/dp/B00I8ATHGW/ref=sr_1_4?__mk_ja_JP=カタカナ&crid=2LX5EGSDGEHES&keywords=デザインパターン&qid=1670657193&sprefix=デザインぱたーn%2Caps%2C350&sr=8-4)

* [オブジェクト指向における再利用のためのデザインパターン](https://www.amazon.co.jp/オブジェクト指向における再利用のためのデザインパターン-エリック-ガンマ/dp/4797311126/ref=sr_1_1?keywords=オブジェクト指向における再利用のためのデザインパターン&qid=1670657488&sprefix=オブジェクト指向における再利用のための%2Caps%2C190&sr=8-1)

* [オブジェクト指向のこころ](https://www.amazon.co.jp/オブジェクト指向のこころ-SOFTWARE-PATTERNS-アラン・シャロウェイ/dp/4621066048/ref=sr_1_1?__mk_ja_JP=カタカナ&crid=36ZXDJPM76WZB&keywords=オブジェクト指向のこころ&qid=1671460633&sprefix=オブジェクト指向のこころ%2Caps%2C310&sr=8-1)

# Iteratorパターンのモチベーション
* 内部構造・実装を隠蔽したい
内部の構造や実装方法は良いから、要素にアクセスしたいときに、
実装と切り離しておくことで、実装部分を修正したとしても、他の部品の修正が少なく済むことが狙い。


* 要素に対して、複数の走査（スキャン）方法をサポートしたい（かもしれない）。
要素に対して、例えば名前順でアクセスしたいか、それともID順でアクセスしたいかなど変わってくるときなど。

逆にいうと、これ以外のときには使わない方が良いと思う。だって分かりにくくなるから！
ただfor文で回すだけのほうが圧倒的に読みやすいから。


# クラス例
今回例にしたのは、スラムダンクの安西先生が選手名簿を使って、
身長の低い順に名前を表示したい、バスケ経験年数順に名前を表示したい、
っていうときを例に挙げました。

## パターン適用前
![Iteratorパターン-ページ2.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1878269/1e137e1e-8f4b-8b25-34e6-47c03075e83d.png)

安西先生は湘北選手名簿を直接見て、選手の情報を取得しています。



## パターン適用後
![Iteratorパターン-ページ1.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1878269/884bd777-776b-6876-b24d-438ef6f01324.png)

Iteratorパターンを適用すると、安西先生は名簿を直接参照していないので、
たとえば名簿の形式が変わったとしても、安西先生はやることを変える必要はない。
※実装部分を入れ替える必要はある。

あとは、身長順に選手を見たいときと、
バスケ経験が長い順に選手を見たいときなど、
どう取り出したいかが変わる場合も、安西先生は実装部分に依存していないので変更する必要はない。

# まとめ
上記のように、繰り返して何かをしたい場合に、実装部分を切り離すためのパターンとして
Iteratorパターンがあることは理解できた。
デザインパターンの中でも理解しやすいパターンだと思う。
一方で、乱用してしまうとクラス数は増えて分かりにくくなるので、
ほんとにモチベーションに合致するケースでなければ使わない方が良いのでは？と思ってしまった。

具体的には、「リスト構造」そのものが可変点として挙がっている場合や、
走査方法を複数選択可能・もしくは可変点である場合には、
使うか検討しても良いかもしれない。

みなさま、Iteratorパターンの上手い適用例を知っていたらコメントくれると助かります。

[2023/02/06] 実装例は途中まで作ったので、いつか挙げます。
App.xaml のビルドアクションを Page にすると Application.Resources が読み込まれない

# はじめに
本記事は .NET6 で検証している。

# 対処
App.xaml.cs で InitializeComponent メソッドを呼び出すコードを追加する。
```cs:例
public App()
{
  InitializeComponent();
}
```

## どうしてこうなった
ビルドアクションを Page にするとソース ジェネレーターで InitializeComponent メソッドを自動生成する。ただ、これを呼び出す場所は自動生成しない。

## InitializeComponent って何?
次のことをしている
```
System.Windows.Application.LoadComponent(
  this,
  new System.Uri(
    "/$safeprojectname$;component/App.xaml",
    System.UriKind.Relative
    )
  );

```

## ビルドアクションを ApplicationDefinition 変えないと?
スタートアップ オブジェクトを App.xaml から変更すると App.xaml の自動生成をしない。よって、InitializeComponent メソッドも呼び出せなくなる。
<input type="date">について調べてみた

# はじめに
誕生日の入力欄を以下のようなドラム式ものに変更してほしいと要望があったため、その実装方法について調べてみました。

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284888/04e6142a-83ba-8b62-9b29-326976d49b0e.png">

調べてみると、\<input type="date">で実装できるとの記事があったため、実際に試してみました。

# 結論
\<input type="date">を実装し、iPhoneで確認してみたところ、以下のようにカレンダーで表示されました。
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284888/ed3b2a2f-2ce1-d2cb-b3e9-ba826b8c0d80.jpeg">

これは、iosのアップデートで標準の日付選択欄が変わったことが原因みたいです。

https://www.nanigoto.net/entry/2020/06/27/160335

# 最後に
現状、誕生日の入力欄をドラム式にするにはプラグインを入れるしかなさそうです...
まだ、調査を開始したところなので、間違えていたら申し訳ないです。
何かおすすめの実装方法があればお教えいただければ嬉しいです！

実装できたら。また記事をアップしようと思います。
GitHub Actions で Laravel Pint を自動整形＆自動コミットする

## Laravel Pint(ピント) とは

https://readouble.com/laravel/9.x/ja/pint.html

Laravel Pint はPHPコードスタイルフィクサーのPHP-CS-Fixerのラッパーライブラリです。
コードスタイルルールに沿って統一されたコードにしてくれるとても便利なライブラリです。

Laravel9以降はデフォルトでインストールされています。
設定ファイルを別途用意しなくてもLaravelと同様のコードスタイルで統一してくれます。

## GitHub Actions とは

https://github.co.jp/features/actions

GitHub Actionsは、GitHub上でのワークフローの自動化を支援するサービスです。開発者はGitHub上のリポジトリに対して、特定のイベント(例えば、プッシュやプルリクエスト)が発生した際に自動的に実行されるタスク(例えば、ビルドやデプロイ)を定義できます。これにより開発者はリポジトリに対しての変更を素早く反映し、リリースをスムーズにできます。

## 環境

- PHP: 8.2.1
- Laravel: 9.x

## GitHub Actions ワークフロー

```yml:.github/workflows/pint.yml
name: Pint

on:
   pull_request:
     paths:
       - '**.php'

jobs:
  pint:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v3
        with:
          ref: ${{ github.head_ref }}
          token: ${{ secrets.PERSONAL_ACCESS_TOKEN }}

      - name: Apply Pint
        uses: aglipanci/laravel-pint-action@2.1.0

      - name: Auto Commit
        uses: stefanzweifel/git-auto-commit-action@v4
        with:
          commit_message: Apply Pint
```

### aglipanci/laravel-pint-action オプション

https://github.com/aglipanci/laravel-pint-action

```
      - name: Apply Pint
        uses: aglipanci/laravel-pint-action@2.1.0
          with:
            preset: laravel
            configPath: "src/pint.json"
            pintVersion: 1.4.0
            verboseMode: true
            testMode: true
```

- `preset`: 現在サポートされているpresetは `laravel`, `psr12`, `symfony`
- `configPath`: 設定ファイルを用意している場合は指定する
- `verboseMode`: 詳細を表示する
- `testMode`: 実際にファイル変更せず、コードスタイルの検査のみ

## stefanzweifel/git-auto-commit-action のための PERSONAL_ACCESS_TOKEN の設定

https://github.com/stefanzweifel/git-auto-commit-action#commits-made-by-this-action-do-not-trigger-new-workflow-runs

CI上でコミットさせるためにパーソナルアクセストークンを取得します。
リポジトリの設定 Settings > Security > Secrets and variables > Actions > New repository secret
`PERSONAL_ACCESS_TOKEN` の名前で取得したパーソナルアクセストークンを追加すればOKです。

## 詳細なルール設定

別記事で細かい設定について書いてます。

https://qiita.com/ucan-lab/items/8807a092eb6d87ddfe34
Intel® Quartus® Prime softwareでVisual Studio CodeをPreferred Text Editorにする

この記事ではVisual Stuido Codeに慣れている皆さんがIntel® Quartus® Primeソフトウェアが読み出すテキストエディタとして使用する方法を説明します。

Intel® Quartus® Primeソフトウェアには外部テキストエディタを設定するプリセットがいくつか用意されていますが、Visual Studio Codeは現時点でプリセットがないのでカスタム設定をする必要があります。

メニューからTools > Options > Preferred Text Editorの画面でText editor:をCustomに、Command-line:に
> "C:/Users/[User Name]/AppData/Local/Programs/Microsoft VS Code/Code.exe" -g %f:%l

を入力して完了です。これでエラーメッセージなどをクリックすると当該箇所をVisual Studio Codeに渡して開いてくれます。""の中はVisual Studio Codeの実行ファイルを指定するので、皆さんの環境のパスを使用してください。


This article explains how to set Visual Studio Code as the preferred text editor of Intel® Quartus® Prime software.

Intel® Quartus® Prime has some presets for the external preferred text editors. But, currently Visual Studio Code preset is not prepared yet. You can use the custom setting to use Visual Studio Code.

From the menue of Intel® Quartus® Prime software, Tools > Options > Preferred Text Editor. On the window, select Custom for Text Editor:, put:

> "C:/Users/[User Name]/AppData/Local/Programs/Microsoft VS Code/Code.exe" -g %f:%l

to Command-line: field. 

Now Visual Studio Code opens the line of the RTL files and SDC files when you click the error messages issued by Intel® Quartus® Prime software. The path in "" should be different per your environment. Your path for Visual Studio execution file should be use in it.

# Notices & Disclaimers

Intel technologies may require enabled hardware, software, or service activation.
No product or component can be absolutely secure. 
Your costs and results may vary. 
© Intel Corporation. Intel, the Intel logo, and other Intel marks are trademarks of Intel Corporation or its subsidiaries. Other names and brands may be claimed as the property of others.

#iamintel
サムネイルクリックからのYoutube API 


# サムネイルクリックからのYoutube API 

## html
```
<div class="c-youtube c-infoBox disp_youtube"><div id="disp_youtube" ></div></div>
<div class="c-youtube c-infoBox disp_youtube" id="movie" >
    <img srcset="https://img.youtube.com/vi/{{ $movie_id }}/mqdefault.jpg 768vw" src="https://img.youtube.com/vi/{{ $movie_id }}/hqdefault.jpg" class="c-youtube-thum" >

    <p class="c-youtbe-ico" ><img src="/src/img/common/icon-video.png" alt="You Tubeのアイコン"  class=" " ><noscript><img src="/src/img/common/icon-video.png" width="80" height="80" alt="You Tubeのアイコン" data-eio="l"></noscript></p>
</div>

```


## javascript
```
<script>
$('#disp_youtube').hide();
$(function(){
  $('.disp_youtube').each(function() {
    $(".disp_youtube").on('click', function() {
        $(this).after('<div class="disp_youtube" ></div>').remove();
        $('#disp_youtube').show();
        console.log(player);
        player.mute();
        player.playVideo();

    });
  });
});
</script>
<script>
$(function(){
    var tag = document.createElement('script');

    tag.src = "https://www.youtube.com/iframe_api";
    var firstScriptTag = document.getElementsByTagName('script')[0];
    firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
});
    
    var player;
    function onYouTubeIframeAPIReady() {

        console.log("youtube ready");
      player = new YT.Player('disp_youtube', {
        height: '400',
        width: '100%',
        videoId: '{{ $movie_id }}',
        playerVars: {
          playsinline: 1 , // 1はtrue、0はfalse
          'rel' : 0,
          'loop': 1
        },    
        events: {
          'onReady': onPlayerReady,
          'onStateChange': onPlayerStateChange
        }
      });
    }

    function onPlayerReady(event) {
        player.cuePlaylist({
            'listType': 'playlist',
            'playlist': ['{{ $movie_id }}','{{ $movie_id }}'],
            'index': 0,
            'startSeconds': 10,
            'suggestedQuality': 'small'
        });
        
        event.target.mute();

        // event.target.playVideo();
    }

    var done = false;
    function onPlayerStateChange(event) {
        if (event.data == YT.PlayerState.PLAYING && !done) {
        //   setTimeout(stopVideo, 6000);
          done = true;
        }
    }
    function stopVideo() {
        player.stopVideo();
    }
</script>

```

>  参考: https://developers.google.com/youtube/iframe_api_reference?hl=ja
Teradata PT Easy Loader

今回はVantageで手軽にデータの入出力が可能になるEasy Loaderについてご紹介します。
Easy LoaderはTPTの拡張版コマンドラインインターフェースであり、フラットファイルからデータベーステーブルへのロードやエクスポート、データベーステーブル間のロードなどスクリプトを記述する事無く実行できます。
簡易ローダーが使用可能となる前提としては**ファイルが区切り文字で区切られたデータ**に限定されます。
また、**入出力の項目数が一致**している必要があります。

:::note info
この記事は[Teradata PT Easy Loader の使用](https://docs.teradata.com/r/yb1a~hZ~OT4cDTh1jtcn0w/YlIVHwOAIQsOTzb6W5pF9w)を参考に要約したものです。
:::

# Teradata PT Easy Loaderジョブの実行例
## (1)ファイルのロード

```
tdload -h 192.168.10.10
       -u dist_user
       -p dist_pass
       -t dist_table
       -f src_file.csv
       -d '|'
          jobn01
```

## (2)ファイルのエクスポート
```
tdload --SourceTdpid        192.168.10.10
       --SourceUserName     src_user
       --SourceUserPassword src_pass
       --SourceTable        src_table
       --TargetFilename     dist_file.csv
                            job02
```

## (3)データベース間のデータ移行
```
tdload --SourceTdpid        dbccop1
       --SourceUserName     src_user
       --SourceUserPassword src_pass
       --SourceTable        src_table
       --TargetTdpid        192.168.10.10
       --TargetUserName     dist_user
       --TargetUserPassword dist_pass       
       --TargetTable        dist_table
                            job03
```

# コマンドパラメータの説明
```
tdload [コマンドパラメータ] ジョブ名
```
|引数|説明|
|:-|:-|
|-h|tdpid|
|-u|ユーザ名|
|-p|パスワード|
|-t|テーブル名|
|-f|ファイル名|
|-d|デリミタ文字|

# 引数パラメータの説明
## 指定パラメータ
|変数|
|:-|
|--TargetTdpId|
|--TargetUserName|
|--TargetUserPassword|
|--TargetAccountId|
|--TargetWorkingDatabase|
|--TargetLogonMech|
|--TargetLogonMechData|
|--SourceTdpId|
|--SourceUserName|
|--SourceUserPassword|
|--SourceAccountId|
|--SourceWorkingDatabase|
|--SourceLogonMech|
|--SourceLogonMechData|

## 暗黙パラメータ
実行時に値を上書き可能です。
|変数|初期値|
|:-|:-|
|--SourceInstances|1|
|--TargetInstances|1|
|--SourceMinSessions|1|
|--TargetMinSessions|1|
|--SourceMaxSessions|32|
|--TargetMaxSessions|32|
|--SourceFormat|'Delimited'|
|--SourceOpenMode|'Read'|
|--SourceTextDelimiter|‘,’|
|--SourceTraceLevel|'None'|
|--TargetFormat|'Delimited'|
|--TargetOpenMode|'Write'|
|--TargetTextDelimiter|','|
|--TargetTraceLevel|'None'|

# 終了コードの説明
致命的なエラーとは、ユーザー エラー以外のエラーを指します。
|終了コード|説明|
|:-|:-|
|0|正常に完了しました。|
|4|正常に完了しましたが、1つ以上の警告が発行されています。|
|8|構文エラーなどのユーザー エラーが原因で終了しました。|
|12|致命的なエラーが原因で終了しました。|

# おわりに
:::note warn
警告
この本書は[Teradata Vantageドキュメンテーション](https://docs.teradata.com/)よりトピックに必要な情報を抜粋したものです。掲載内容の正確性・完全性・信頼性・最新性を保証するものではございません。正確な内容については、原本をご参照下さい。
また、修正が必要な箇所や、ご要望についてはコメントをよろしくお願いします。
:::

#### Teradata Vantageへのお問合せ
[Teradata Vantage へのお問合せ](https://www.teradata.jp/About-Us/Contact)
google mapにて端末位置情報取得

# google mapにて端末位置情報取得

```
function initMap() {
	if (navigator.geolocation) {
           // map apiのインポートのみでOK
           // この呼出自体は非同期
		navigator.geolocation.getCurrentPosition((position)=>{
			cb_initMap(position.coords.latitude,position.coords.longitude);
		},
		() => {
    //とれない場合デフォルト
        	cb_initMap(35.68944,139.69167);
        }
			

		);
	}
}
```

※ https通信でないと取得はできません。

参考 :
https://developers.google.com/maps/documentation/javascript/geolocation?hl=ja
Google Cloud認定資格にて英語の受験が選択できない件

# この記事について

GoogleCloud認定試験の"Professional Cloud Database Engineer(以後PCD)"をWebassessorから申し込むつもりだったが、申し込みできる試験の中にPCDがありませんでした。


どうやらPCDだけでなく、英語の試験を申し込むことができないようでした。

結果的にPCDおよび英語の試験に申し込むことが可能になりました。
この記事では以下を記載します。
- GoogleCloud認定試験の英語での受験申し込み方法
- 申し込む過程で調べたこと/分かったこと

# 英語の試験を選択することができない

https://webassessor.com/googlecloudjp
にログインして、試験の申し込みを行おうと思ったところ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435280/998434fd-b509-ad7c-c5d7-cdb8d4b268e0.png)

Japaneseしかありません。

色々試してみましたが、英語の試験を選択することはできないようでした。

# 受験する言語ごとにアカウントが必要とのこと

https://support.google.com/cloud-certification/answer/9907651?hl=ja

> 初めて受験する方やローカライズされた言語で受験する方は、Webassessor の該当言語の Google Cloud インスタンスに新しいユーザー アカウントを作成してください。

# 英語のアカウントを作成する

https://webassessor.com/googlecloudjp

は日本語のアカウントなので、以下のURLから英語のアカウントを作成します。

https://www.webassessor.com/googlecloud/

# 英語の試験に申し込む

ログインしたら、トップページから「REGISTER FOR AN EXAM」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435280/d1036a55-ac99-3151-5869-c271ca00d8a5.png)

英語の試験が選択できるようになり、申し込める状態になりました。
PCDも選択可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435280/e1132ede-10aa-0b30-5300-6688a73e987f.png)
AutoStop WorkSpaces のメンテナンスについて考える

# AutoStop WorkSpaces のメンテナンスウィンドウ

- メンテナンスウィンドウが有効（デフォルト）な場合、重要な更新をインストールするために月に 1 度自動で開始される。
- 開始日時は月の第 3 月曜日から 2 週間、毎日 0:00～5:00。
- WorkSpace のメンテナンス期間中、*WorkSpace の状態は `MAINTENANCE` に設定される。*
- メンテナンスのタイムゾーンを変更することはできない。

https://docs.aws.amazon.com/ja_jp/workspaces/latest/adminguide/workspace-maintenance.html

# 必須要件

①Windows Update が実行されること。
②Windows Defender の定義ファイルが実行されること。
③Windows Defender によるスキャンが実行されること。

ドキュメントによると、
「WorkSpace は必要に応じて**重要な更新**を Amazon WorkSpaces からインストールして再起動します。」
と書かれている。

①と②は、メンテナンスしてくれるとして、
③はスキャンなのでおそらく実行してくれないと思われる。

https://docs.aws.amazon.com/ja_jp/workspaces/latest/adminguide/workspace-maintenance.html

# Defender の定期実行

③のDefender の Windows Defender によるスキャンは、タスクスケジューラで登録しておくとよさそうである。

- Defender をタスクスケジューラで定期実行するようにしておきます。

https://support.microsoft.com/ja-jp/topic/microsoft-defender-%E3%82%A6%E3%82%A4%E3%83%AB%E3%82%B9%E5%AF%BE%E7%AD%96%E3%81%A7%E3%82%B9%E3%82%AD%E3%83%A3%E3%83%B3%E3%82%92%E3%82%B9%E3%82%B1%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B-54b64e9c-880a-c6b6-2416-0eb330ed5d2d

![スクリーンショット 2023-02-05 21.33.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/aa0a3f83-bf74-ccd8-351c-faff41c48247.png)

- WorkSpaces はログインせずに、今回はコンソールから Defender の定期スキャンが走る 10 分前に手動で起動しておきます。
*※ 実際は、Defender の定期スキャンが走る 10 分前に、Eventbridge Scheduler で WorkSpaces を起動しておけば良さそうです。*
![スクリーンショット 2023-02-05 21.42.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/8878f304-0884-aa48-6b37-b04c87039894.png)
 　
- Defender の定期スキャンが走った 10 分後に　WorkSpaces にサインインし、Defender の状態を確認してみます。次の通り、タスクスケジューラで設定した時間帯に、Defender に定期スキャンが実行されたことがわかります。
![スクリーンショット 2023-02-05 21.57.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/0730e3e4-abe7-f4b8-2d7d-e30dbf937bd9.png)
![スクリーンショット 2023-02-05 21.58.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/272f97e6-672f-b2df-0d51-9667c2fb0991.png)
間違えてpushしてしまってどうにもならない場合

# 間違えてpushしてしまってどうにもならない場合

1. git logコマンドを打つ
```
$ git log 
```

以下のようにcommit id が表示される。
```
commit 27f0f0abd17eb40bd0aca4d2d3ae46b413a1dXXX (HEAD -> develop, origin/develop)
Author: y.satou <y.satou@gmail.com>
Date:   Mon Dec 12 17:32:14 2022 +0900

    特集
```
2. コミットIDを指定して revert する。

上記でいうと「27f0f0abd17eb40bd0aca4d2d3ae46b413a1dXXX 」
```
$ git revert <commit>
```

git が 打ち消し用のコミットを作成してくれるのでそれを コミット、pushする。
主流のレコメンドエンジン【メモ】

# レコメンドエンジンとその詳細【メモ】

## 1. 協調フィルタリング
協調フィルタリングは、ユーザーとアイテムの関係に基づいて、他のユーザーがアイテムを評価した情報を利用して推薦を行う．

### 協調フィルタリングの具体例
#### 1. アマゾン
アマゾンは、ユーザーが購入した商品や関心のある商品に基づいて、そのユーザーに推薦する商品を表示する。

#### 2. Netflix
Netflixは，ユーザーが見た映画やテレビ番組に基づいて，そのユーザーにおすすめする映画やテレビ番組を表示する．

#### 3. Google Play Music(YouTube Musicに統合)
Google Play Musicは，ユーザーが再生した曲やプレイリストに基づいて，そのユーザーにおすすめする曲を表示する．

## 2. 協調型フィルタリング
協調型フィルタリングは、ユーザー間の類似性を計算して、類似したユーザーがアイテムを評価した情報を利用して推薦を行う．

## 3. コンテンツベースフィルタリング
コンテンツベースフィルタリングは、ユーザーがアイテムを評価した情報を利用して、アイテムの類似性を計算して推薦を行う．

## 4. ベイジアンフィルタリング
ベイジアンフィルタリングは、ユーザーがアイテムを評価した情報を用いて、確率的な手法を利用して推薦を行う．

## 5. ニューラルネットワークベースのレコメンドエンジン
ニューラルネットワークベースのレコメンドエンジンは、深層学習アルゴリズムを利用して、ユーザーとアイテムの関係を学習して推薦を行う．
Rails5でAwesomeを使うときの注意

## 環境
- Rails5.2
- Awesome4、Awesome5

## はじめに
Rails5の環境でAwesome6を動かそうとしたところ、エラーが発生して、Railsが起動されなくなりました。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94029/0237251d-f7dd-ca0a-7d2e-d6d6cbd21086.png)

バージョンを落として、Awesome5（Awesome4でもOKです）で動かすと、正常にRailsが起動され、Awesomeのアイコンも表示できるようになりました。そのときの、トラブルシュート記事です。

## Awesomeの導入
Awesome4、または、Awesome5を使う場合、Gemfileに、Awesomeのgemを指定します。バージョンはしっかりと指定します。バージョンを指定しないと、最新のAwesome6がインストールされることになります。マイナーバージョンには、一番高いバージョンを指定しておいていいでしょう。
```Gemfile
gem 'font-awesome-sass',   '~> 5.15.0'		# Awesome5を導入する場合
gem 'font-awesome-sass',   '~> 4.7.0'		# Awesome4を導入する場合
```

下記２行の順番が大事なようです。上下を逆に記述するとうまく動かなくなるようです。
```application.scss
@import 'font-awesome-sprockets';
@import 'font-awesome';
```

## Viewの記述
Awesome4とAwesome5とでは、同じアイコンでも、クラス名が異なります。GemfileでAwesome4を指定して、ViewでAwesome5のアイコンのクラス名を指定した場合、正しく表示されなくなります。アイコンが非表示になるが、四角で表示されます。ただし、下位互換はなされているようです。
```index.html.slim
= link_to "CSV出力", path, class: 'btn btn-primary'  # 元

= link_to path, class: 'btn btn-primary'
        i class = "fa fa-download"  CSV出力			 # Awesome4
            
= link_to path, class: 'btn btn-primary'
        i class="fa-solid fa-download"  CSV出力		 # Awesome5
```

上がAwesome4で表示した場合で、下がAwesome5で表示した場合です。アイコン名が異なっていても、同じアイコンで表示されます。

![csv.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94029/020d7f3e-d2a4-63c1-c8bc-b9d2fbc45aab.png)

## Viewの記述（その他）

```index
= submit_tag "インポート２", class: 'btn btn-primary'   # 元

= button_tag type: "submit", class: 'btn btn-primary'
    i class = "fa fa-upload"  インポート２              # Awesome4

= button_tag type: "submit", class: 'btn btn-primary'
    i class = "fas fa-file-upload"  インポート２        # Awesome5
```

上がAwesome4で表示した場合で、下がAwesome5で表示した場合です。アイコン名が似ていますが、アイコンの種類は異なります。
![import.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94029/942f10ab-4d6f-c827-9fbd-0bcac9237ee7.png)

```index
= f.submit '登録する', class: 'btn btn-primary'          # 元

= f.button type: "submit", class: 'btn btn-primary'
    i class = "fa fa-edit" 登録する                      # Awesome4
    
= f.button type: "submit", class: 'btn btn-primary'
    i class = "far fa-edit" 登録する                     # Awesome5
```

上がAwesome4で表示した場合で、下がAwesome5で表示した場合です。
![登録する.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94029/b8db2e85-450b-9b06-5566-3630ec336472.png)


```index.html.slim
= link_to path(user), class: 'btn btn-primary'
        i class = "fa fa-edit"  編集									# Awesome4

= link_to path(user), class: 'btn btn-primary'
        i class = "far fa-edit"  編集									# Awesome5

= link_to path(user), method: :delete, 
        data: { confirm: "ユーザー「#{user.name}」 を削除します。よろしいですか？" }, 
        class: 'btn btn-danger'
        i class = "fa fa-trash"  削除									# Awesome4

= link_to path(user), method: :delete, 
        data: { confirm: "ユーザー「#{user.name}」 を削除します。よろしいですか？" }, 
        class: 'btn btn-danger'
        i class = "fas fa-trash-alt"  削除								# Awesome5
```

![編集削除.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94029/c7fd02b5-32a2-3a00-babc-64fcc83b294b.png)

## 公式サイト
Awesomのアイコンはここで検索できます。
https://fontawesome.com/versions
【備忘録】Visual Stusio 2019 の「パッケージは正しく読み込まれませんでした。」と表示された際の対応

参考にさせて頂いたサイト：
https://ykakinoki.hateblo.jp/entry/2020/08/07/094308


1. C:\Users\ユーザー名\AppData\Local\Microsoft\VisualStudio\16.0_XXXXXXX
の「ComponentModelCache」フォルダを別名に変更する。

2. Nugetパッケージマネージャーの右上の歯車を押し、オプションのNuGetパッケージマネージャー＞全般「パッケージの初回インストール時に形式の選択を許可する」のチェックを外す

3. ソリューションを右クリック＞NuGetパッケージの復元

色々と弄った際 2. のチェックを入れてしまったために参照エラーが発生していたかもしれない。
ので本来は1だけで行けそうな気もする。
参照する「16.0_XXXXXXX」ディレクトリはVisualStudioのバージョンによりかわるものの、手順自体は共通していると思われる。
Intellij IDEAでGitHubを利用する方法

# Intellij IDEAでGitHubを利用する方法
　自作したWEBアプリを公開しようとしたところGitHubに保存する必要があるとのことだった。今までGit・GitHubともにほとんど使用していなかったこともあり、その連携と利用に手間取ってしまったため、ここに備忘録として記しておく。
## 環境・用意するもの
・IntelliJ IDEA 2022.3.2 (Community Edition)
・Gitのインストール
・GitHubアカウント
## 1. Gitのインストール
　自分はGitのインストールから始まったので、手間がかかりました。インストールできていない場合、Intelij IDEAからインストールの提案があります。
__インストール→完了＞＞連携できない__
    という状態になってしまったので、改めてGit公式よりGitをインストールしました。
下の記事がとても分かりやすいので、そちらを参考にGitをインストールしてください。
__・Gitの初期設定について1-1～1-2__
__・GitHubの登録方法について1-3～1-4__

https://tech-blog.rakus.co.jp/entry/20200529/git

## 2. Intelij IDEAとの連携について
　Git・GitHubの準備が終わると後は簡単です。__VCS＞＞GitHubでプロジェクトを共有__
　![スクリーンショット 2023-02-06 131512.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125890/6a5da8d1-929e-8e1e-04b6-272163ce6ae5.png)
　こういった画面が出ます。
　![スクリーンショット 2023-02-06 131827.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125890/eb498891-cebe-6fbf-450f-c8f0ef09c107.png)
　この時初めての場合、黄色の線の位置にGitHubアカウントを入力する欄があると思います。

　その後指示通りに動くことで、GitHubと連携することができます。最後に共有を押すことで、GitHubにプッシュすることができます。また、一つ前の画像にある __VCS連携を有効にする＞＞Git__、をすることによってより使いやすく変更することができるみたいです。

:::note warn
【VCS連携を有効にするには注意】
機能が大幅に増えるため、初心者はむしろ難しいかもしれない。
→自分には少し難しすぎる...
:::
　このような感じなので、行けそうな人はやっちゃった方がいいと思います！！
　![スクリーンショット 2023-02-06 134454.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125890/2fb98951-44b1-6f00-0a8c-393d85b4749a.png)

## 3. まとめ
　今までGitもGitHubも使ったことがなかったため、連携に少し手間取ってしまいましたが、終わってみるとGit・GitHubの登録がなければ比較的簡単に連携できると思います。
　自分の場合、GitとのVCS連携を有効にした画面は、 __未知の情報が多すぎてあまり使いこなせる気がしないので、VCS連携に関してはある程度Git等を触った人向けになるのかなと思います。__ VCS連携に関しては戻す方法も分からないので、一旦このままで進めていこうと思います。
　以降、戻す方法や使い方などをきちんと理解できた時には続編を挙げるかもしれません。
Path interface

File classとほぼ同様の機能を持つ
Paths.getでインスタンス化する。get("C:","dirtest","test.txt")のような
書き方が可能。それ以外の違いが？
toFile()でfileを生成することができる

```java
public class Outer {
    public static void main(String[] args) {
        Path p = Paths.get("C:\\dirtest\\test.txt");
        System.out.println(p);
        System.out.println(p.getParent());
        System.out.println(p);
        System.out.println(p.getRoot());
        p = Paths.get("C:","dirtest","test.txt");
        System.out.println(p);
        p = Paths.get("C:/dirtest/test.txt");
        System.out.println(p);
        File f = p.toFile();
        System.out.println(f);
        p = f.toPath();
        System.out.println(p);
        p = Paths.get("C:/dirtest/test.txt2zzzz");
        System.out.println(p);
        System.out.println(p.toAbsolutePath());
        p = Paths.get("C:/dirtest/test.txt");
        System.out.println(p);
        try {
            FileReader fr = new FileReader(p.toFile());
            BufferedReader br = new BufferedReader(fr);
            try(br) {
                while(true) {
                    String str = br.readLine();
                    if(str==null) break;
                    System.out.println(str);
                }
            }
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}
```
```
C:\dirtest\test.txt
C:\dirtest
C:\dirtest\test.txt
C:\
C:\dirtest\test.txt
C:\dirtest\test.txt
C:\dirtest\test.txt
C:\dirtest\test.txt
C:\dirtest\test.txt2zzzz
C:\dirtest\test.txt2zzzz
C:\dirtest\test.txt
hello my
friend bye
```
【 Docker 】Pull制限の回避もかねて開発で使う親イメージを一旦Gitlabのコンテナレジストリに上げる


開発中に何度もDocker Hubからpullを実行しているとpull制限に引っかかってしまいます→[ダウンロード率制限](https://matsuand.github.io/docs.docker.jp.onthefly/docker-hub/download-rate-limit/)
これを回避するため一度pullしたイメージを一旦Gitlabのコンテナレジストリに登録してから使うようにしていきたいと思います。

# 手順

```
# DockerHubから一度対象イメージををpull
docker pull <Docker Hubから落とすimage>

# 落としたイメージにtagをつける
docker tag <Docker Hubから落とすimage> <GitlabのURL>/<グループ名orユーザー名>/<リポジトリ名>/<image名:tag>

# gitlabにdocker login
docker login <GitlabのURL> # Gitlabのusername/passwordでログイン

# リポジトリのコンテナレジストリにpush
docker push <GitlabのURL>/<グループ名orユーザー名>/<リポジトリ名>/<image名:tag>
```


元のイメージ: python:3.8.10-slim
Gitlabのリポジトリ: https://gitlab.com/k8shiro/containerregistry-test
の場合、

```
docker pull python:3.8.10-slim
docker tag python:3.8.10-slim registry.gitlab.com/k8shiro/containerregistry-test/python:3.8.10-slim
docker login registry.gitlab.com
docker push registry.gitlab.com/k8shiro/containerregistry-test/python:3.8.10-slim
```

になります。
以後は`docker pull registry.gitlab.com/k8shiro/containerregistry-test/python:3.8.10-slim`で使えます。


# その他
- パブリックなリポジトリでは誰でも、プライベートなリポジトリでは認証ありでのpullがデフォルトになります(プロジェクトのSettingsから変更可能)。
- Pull制限の回避という目的であれば、gitlab.comの場合Dependency Proxyを使う方法もあります。
  - https://docs.gitlab.com/ee/user/packages/dependency_proxy/index.html#use-the-dependency-proxy-for-docker-images
【Ruby on Rails5】チェックボックスを作るとき、"checkbox"　を使わずにアイコンで表示させたときの記事

### 課題

- Fontawesomeのチェックマークを使い、チェックボックスを作りたい
- アイコンを□で囲み、アイコンをクリックしたときにデータベースにチェック済みとして保存
- チェック済みでない場合、アイコンだけを消し、□は残しておきたい

### 作成の流れ
- Fontawesomeを使ってチェックマークを表示
- アイコンをborderを使って□で囲んだ
- □は残したまま、チェック済みではない場合、アイコンだけを透明にしようとした

### 悩んだところ
- opacityを使うとborderで作った枠線も一緒に消えてしまう
- 透明状態のアイコンとそうではないアイコンを同時に表示させなきゃいけない

### 解決策
- rgbaを使えばテキストのみの透明度を変更できる、という記事があったのでイラストでも同じ結果にならないかと思い試してみたらできた。
- 透明状態のアイコンでそうではないアイコンを混同させないように透明アイコンに新しいクラスを追加

### 実際のコード


```rb:html.erb
<!-- 透明アイコンの表示 -->
<i class="fa fa-solid fa-check rgb-0"></i>
```

```css: home.css
/* チェックアイコン*/
.fa-check{
    font-weight: 900;
    border: solid 1px #000;
}

/* 透明化用　*/
.rgb-0{
    color: rgb(0, 0, 0,0);
}
```
</details>
PhpStormのショートカット(Mac)

自己学習用にまとめたものになります。

### 使う頻度が高いもの

|ショートカット |アクション |
|---|---|
|command + shift + u  |Toggle Case<br>大文字・小文字の切り替え  |
|shift + tab  |Unindent Selection<br>インデントを1段階削除  |
|command + shift + ↑<br>option + shift + ↑|Move Statement Up<br>カーソル行・選択行を上に移動|
|command + shift + ↓<br>option + shift + ↓|Move Statement Down<br>カーソル行・選択行を下に移動|
|control + space|Code Completion Basic<br>コード補完|
|control + j|Quick Documentation<br>クラス・メソッドなどのドキュメントを表示|
|command + option + l|Reformat Code<br>コードをフォーマット|
|control + option + i|Auto-Indent Lines<br>自動インデント|
|command + b|Navigate Declaration<br>定義に移動|
|command + option + b|Navigate Implementations<br>同じInterfaceを実装しているクラスに移動|
|command + u|Navigate Super Method<br>親クラスのメソッドに移動|
|command + shift + t|Navigate Test<br>テストクラスに移動|
|command + f|Find<br>ファイル内で文字列を検索|
|command + r|Replace<br>ファイル内の文字列を置換|
|command + w|Close<br>タブを閉じる|
【Dioxus】SVG画像を表示する

[dioxus](https://github.com/dioxuslabs/dioxus)(ウェブ)でSVG画像を表示する方法を二つ紹介します．今回利用するのはdioxusですが，[yew](https://github.com/yewstack/yew)や[sycamore](https://github.com/sycamore-rs/sycamore)，[leptos](https://github.com/leptos-rs/leptos)などの他のフレームワークでも同様にできます．
利用するdioxusのバージョンは以下です．
```toml:Cargo.toml
dioxus = {version = "0.2.4", features = ["web"]}
```
コード全体は[こちら](https://github.com/deepgreenAN/dioxus-svg-example)．

## imgタグで画像として読み込む
imgタグを用いて画像として読み込む方法です．画像であるためsvg要素にスタイルなどの適用はできません．
```rust
use dioxus::prelude::*;

fn SVGV1(cx: Scope) -> Element {
    cx.render(rsx! {
        div {
            width: "200px",
            img {src: "/images/qiita.svg"}
        }
    })
}
```
この方法では画像をサーブする必要があります．trunkを用いている場合，index.htmlに以下を加えればルート直下のimagesディレクトリがdistにコピーされ画像が利用できるようになります(`trunk serve`でサーブされる)．
```html:index.html
<link data-trunk rel="copy-dir" href="./images" />
```
リリース時は変わらずdistディレクトリ内をサーブします．

## include_str!とinner_htmlを使う
コンパイル時にファイルを文字列リテラルとして読み込む`include_str!`マクロとdioxusの`inner_html`を用いる方法です．svg要素として読み込まれるためスタイルを適用できます．
`currentColor`やcss変数を用いたり，親要素のクラス名を変更することなどで動的にスタイルを変更できます．以下では`qiita.svg`を`fill:currentColor`と指定しているため親要素でフィルの色を決めています．
```rust
fn SVGV2(cx: Scope) -> Element {
    let svg_str = include_str!("../images/qiita.svg");
    cx.render(rsx! {
        div {
            color:"green",
            width: "200px",
            dangerous_inner_html: "{svg_str}",
        }
    })
}
```
yew, sycamore, leptosでも`inner_html`は利用できるためこの方法を使うことができます．

以上二つの方法では動的にsvg要素のDOMを変更することはできませんでしたが，svg要素を直接dioxusコンポーネントとして記述する(svg画像を読み込むわけではありません)ことでもちろん動的に変更できるようになります．
## SVGを直接マクロで記述する
`qiita.svg`をdioxusのマクロで記述していきます．`qiita.svg`に加えて枠となる矩形を`has_frame`に応じて描画しています．
```rust
fn SVGV3(cx: Scope) -> Element {
    let has_frame = use_state(&cx, || false);
    cx.render(rsx! {
        div {
            color: "green",
            width: "200px",
            svg {
                view_box: "0 0 113 113",
                style: "fill:currentColor",
                g {
                    transform:"translate(-55,-80)",
                    path {
                        d: "省略"
                    }
                }
                has_frame.get().then(||{
                    rsx! {rect {
                        style: "省略",
                        width: "113",
                        height: "113"
                        }
                    }
                })
            }
        }
        button {
            onclick: move |_|{has_frame.modify(|flag|!flag)},
            "frame"
        }
    })
}
```
シェルスクリプトの配列を定義するには

シェルスクリプトの配列を定義する方法のメモです。

# 方法その1

1行で羅列する方法です。値自体に空白がある場合はダブルクオーテーションで囲みます。

```bash
components=(abc def "gh i")
```

# 方法その2

複数行にまたがってもよいです。

```bash
components=(
    abc
    def
    "gh i"
)
```

# 方法その3

インデックスを指定して要素を代入する方法です。

```bash
components[0]=abc
components[1]=def
components[2]="gh i"

```

# 方法その4

要素を1つずつ追加していく方法です。

```bash
components=()
components+=(abc)
components+=(def)
components+=("gh i")

```

# 出力例

```bash
for c in "${components[@]}"; do
    echo $c
done

# 出力
# abc
# def
# gh i
```
Drawableに2色の異なる色を描画する方法 

こんにちはandroidでアプリ開発を学習中のみのむしと申します。
今回は、Drawableの中に2色表示を行うボタンを描画しましたので、
作成方法等を備忘録として残したいと思います。
<h2>1.円形2色ボタンの作り方</h2>

```xml
<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromDegrees="90">
    <shape
        android:shape="oval"
        >
        <gradient
            android:centerX="-10.0"
            android:endColor="#33B5E5"
            android:startColor="#EA578A"
            android:type="sweep" />
    </shape>

</rotate>
```
![キータ円形.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523916/c5c9e994-e9f0-6496-67ba-d79f8045ef7e.png)
↑このように表示されます

<h2>2.四角2色ボタンの作り方</h2>

```xml
<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromDegrees="90">
    <shape>
        <gradient
            android:centerX="-10.0"
            android:endColor="#33B5E5"
            android:startColor="#EA578A"
            android:type="sweep" />
    </shape>

</rotate>

```
![キータ四角.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523916/fe331105-000f-214e-b416-78db2b190c6b.png)
↑このように表示されます

後は、配置したボタンなどやViewなどにandroid:background="@drawable/作成したファイル名を"入れればOKです。

参考サイト
https://stackoverflow.com/questions/38126248/how-to-create-android-drawable-consisting-of-two-colors-side-by-side
Python エラー(構文エラーと例外)まとめ

## 概要
初学者向けにPythonで出てくるエラーの意味をまとめたいと思います。ただ前提条件として忘れてはいけないのがPythonのエラーには**構文エラー**と**例外**があるという事です。

構文エラーは、**コードを実行する時に、構文をチェックして問題があった場合に発生します**。

例外は、**構文としては正しくても、実行すると問題になるエラーです**。
例外はtry文で判定して処理を続行させることができます。

## 構文エラー
### SyntaxError
:::note
構文エラー及び、書き間違えエラー
:::
解決策:書き間違えを直す。
**・エラー例**
```python:（）が足りないエラー
def hoge():
  print('hoge'
```
```python:printの前に全角スペースが入っておりエラー
def hoge():
　　　print('hoge')
```
### IndentationError
:::note
インデントが正しくない場合のエラー
:::
解決策:インデントを正しく使用する。
**・エラー例**
```python:3行目のselfの前のインデントが正しくないのでエラー
def hoge():
  self.name = 'hoge'
   self.age = 0
```

## 例外
### NameError
:::note
定義していない変数名を使用した際のエラー
:::
解決策:名前の修正。
**・エラー例**
```python:Aが定義されてないのでエラー
a = 1
print(A)
```
```python:printがprinになっているのでエラー
a = 1
prin(a)
```

### TypeError
:::note
型が間違っている場合のエラー
:::
解決策:型を揃える。
**・エラー例**
```python:式に使われているリテラルの型が合ってないのでエラー
1 + '1'
```

### ValueError
:::note
関数の引数に間違った型を渡した際に起きるエラー
:::
解決策:関数の引数に渡す値を正しい値に変更する。
**・エラー例**
```python:数字では無い文字列の為エラー
int('hoge')
```

### IndexError
:::note
リスト等で格納された値をインデックスで取得する際、範囲外の値を指定した場合に起きるエラー
:::
解決策:範囲内の値を指定する。
**・エラー例**
```python:インデックス番号3は存在しないのでエラー
lists = [0, 1, 2]
lists[3]
```

### KeyError
:::note
辞書型で登録した値をキー指定して取得する際に、登録していないキーを指定した場合に起きるエラー
:::
解決策:登録してあるキーを指定する。
**・エラー例**
```python:ageキーは存在しないのでエラー
lists = {'name': 'hogemaru'}
lists['age']
```

### ModuleNotFoundError
:::note
指定したモジュールが存在しない際に、起きるエラー
:::
解決策:存在するモジュールをインポートする。
**・エラー例**
```python:numpyがnumpになってる為エラー
import nump as np
```

### FileNotFoundError
:::note
指定したファイルが見つからないエラー
:::
解決策:正しいファイル名に修正するか、正しい指定フォルダにする。
**・エラー例**
```python:hoge.txtではなくhog.txtな為エラー
file = open('hog.txt')
```

### AttributeError
:::note
オブジェクトに存在しない属性・メソッドを使用した際に起きるエラー
:::
解決策:オブジェクトに存在する属性・メソッドを使用する事、もしくは、オブジェクトを変更する。
**・エラー例**
```python:文字列にappend()関数で新しい要素を追加しようとしているのでエラー
name = 'hogemaru'
name.append('hogesuke')
```

### ZeroDivisionError
:::note
値は０で徐算が出来ないエラー
:::
解決策:0で徐算を行わない様にする。
**エラー例**
```python:0で徐算を行っている為エラー
print(10 / 0)
```

## 英語確認
最後にエラーで使われた英単語を一応お浚いで確認したいと思います。

Syntax:`構文`
Indentation:`インデント`
Type:`型`
Value:`値`
Index:`リスト等に格納された値が、その中で何番目かを示すもの`
Attribute:`属性`
Division:`徐算`

## 参考
[Python のよくある基本的なエラーと確認方法まとめ。初学者向けにわかりやすく解説！](https://blog.kikagaku.co.jp/python-basic-error)
C++　仮想関数について、簡単に実例

# 仮想関数について

毎回、混乱するのでまとめ

## 何もなし

```cpp
#include <iostream>

class Base {
public:
  ~Base() {
    std::cout << "Base destructor" << std::endl;
  }
};

class Derived : public Base {
public:
  ~Derived() {
    std::cout << "Derived destructor" << std::endl;
  }
};

int main() {
  Base *b = new Derived;
  delete b;
  return 0;
}
```

```sh
❯ clang++ -Wall -Wextra -Werror test.cpp && ./a.out
Base destructor
```

親クラスのデストラクタが呼ばれる

## 親クラスにvirtualあり

```cpp
#include <iostream>

class Base {
public:
  virtual ~Base() {
    std::cout << "Base destructor" << std::endl;
  }
};

class Derived : public Base {
public:
  ~Derived() {
    std::cout << "Derived destructor" << std::endl;
  }
};

int main() {
  Base *b = new Derived;
  delete b;
  return 0;
}
```

```sh
❯ clang++ -Wall -Wextra -Werror test.cpp && ./a.out
Derived destructor
Base destructor
```

## 両方にvirtual

```cpp
#include <iostream>

class Base {
public:
  virtual ~Base() {
    std::cout << "Base destructor" << std::endl;
  }
};

class Derived : public Base {
public:
  virtual ~Derived() {
    std::cout << "Derived destructor" << std::endl;
  }
};

int main() {
  Base *b = new Derived;
  delete b;
  return 0;
}
```

```sh
❯ clang++ -Wall -Wextra -Werror test.cpp && ./a.out
Derived destructor
Base destructor
```

## 小クラスのみにvirtual

こんなの普通はしないけど

```cpp
#include <iostream>

class Base {
public:
  ~Base() {
    std::cout << "Base destructor" << std::endl;
  }
};

class Derived : public Base {
public:
  virtual ~Derived() {
    std::cout << "Derived destructor" << std::endl;
  }
};

int main() {
  Base *b = new Derived;
  delete b;
  return 0;
}
```

```sh
❯ clang++ -Wall -Wextra -Werror test.cpp && ./a.out
Base destructor
```

## 孫クラスありだと

当たり前ですね。

```cpp
#include <iostream>

class Base {
public:
  ~Base() {
    std::cout << "Base destructor" << std::endl;
  }
};

class Derived : public Base {
public:
  virtual ~Derived() {
    std::cout << "Derived destructor" << std::endl;
  }
};

class Derived2 : public Derived {
public:
  virtual ~Derived2() {
    std::cout << "Derived2 destructor" << std::endl;
  }  
};

int main() {
  Base *b = new Derived2;
  delete b;
  return 0;
}
```

```sh
❯ clang++ -Wall -Wextra -Werror test.cpp && ./a.out
Base destructor
```

## まとめ(追記)

コメントに頂いたことを踏まえ自分でいろいろ試してみました。

アセンブリを見たり、sizeofでコンパイルされたクラスのサイズを比較したりすると、生成されるアセンブリは変更されるし、クラスのサイズ自体も増えるので、明確に使用されるとわかっているタイミングでしか、virtualをつけないほうがいいと結論しました。
PowerShellで改行コードが混在したファイルを作成してみる

PowerShellでテキストをファイルとして出力する際に。
改行コードを指定して出力する方法のサンプルとして、改行コードが混在したファイルをPowerShellで生成してみます。

## BOMなしUTF8の文字コードが混在したファイルを作成する

PowerShellでは下記のように記述すれば、それぞれの改行コードで出力されます。

```powershell
# WindowsなCRLF(0D0A)
$array = "helloworld" + "`r`n"
# LinuxなLF(0A)
$array += "helloworld" + "`n"
# 古いMacOSなCR(0D)
$array += "helloworld" + "`r"

$array | ForEach-Object { [Text.Encoding]::UTF8.GetBytes($_) } | Set-Content -Encoding Byte -Path "c:\temp\chaos.txt"
```

改行コードを可視化してくれるテキストエディタで表示して、出力されたファイルの改行コードを確認してみます。（画像はサクラエディタ）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/14ac7d47-5692-fea4-e170-c348db445d70.png)


もしくはUTF.GetBytesで変換したデータからでも確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/192d4f22-452a-4456-a225-92e44993996b.png)


やっている事としては、`` `r`n `` , `` `r `` , `` `n ``でそれぞれの改行コードを入力して、これを`[Text.Encoding]`の`GetBytesメソッド`でエンコードして出力している形になります。

[Encoding.GetBytes メソッド](https://learn.microsoft.com/ja-jp/dotnet/api/system.text.encoding.getbytes?view=net-7.0)

## 総評

改行コードをどうこうしたい場合は、これ一つ覚えておくと便利かと思います。
AWSのS3のGlueとAthenaで色々やった話

クラウドの進化はエンジニアにとってはとてもありがたいです。今までは全部自分達で構築していたものをクラウドで機能を組み合わせる事でシステムを実現できる。
特にAWSさんのお陰でシステム連携がとても便利になりました。
今回は、AWSのS3のGlueとAthenaで色々やった話です。

# 要件
- POSデータを外部から当システムに取り込みデータを反映させたい
- 即時性はいらない
- データは新規のみ
- 定期実行でよい
- 既存システムには影響を書けたくない（外で構築）
- データ量は大きい

# 実現方法
色々と方法はあると思いますが、やったのは、こちら

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986486/7349f772-b2bc-f3e9-e47e-b867ca951e47.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986486/19807d1e-35f4-a065-4d48-07d1163c0593.png)

# ポイント
- RDS(Aurora)は、snapshotでS3へParquet形式で保管
- S3からの自動処理は、lambdaで処理
- CSVからParquet変換で高速で小データサイズ化
- CrawlerでAthenaのテーブル化でSQL実行可能
- 時間がかかるバッチ処理は、EC2利用

# まとめ
クラウドの利用で運用保守のコストが下がるだけでなく、セキュリティリスクも下がり、全体的なシステム価値が上がります。運用保守を任せられると本業の開発にも集中できて企業価値も上がります。
積極的クラウドを利用しましょう！

# 今後
今後、データサイエンス周りの記事も含めてアップしていきたいと思ってます。
モチベーションアップのためフォロー、イイねお願いします。
【個人的特殊開発技術研究No.1】

# 特殊開発技術とは?
かっこつけていってますが、単純にReactとかNextJSとかsassのお勉強をしましょうよっていう自由研究みたいなもんです。

##  Youtube配信

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

詳細はYoutube配信(何も聞こえませんが元々無音です。たまに音楽が聞こえるのは設定ミスです(´；ω；`))

この配信ではhtmlを書きながらsassを裏でコンパイル(というかトランスパイル)をしながらhtmlでホットリロードを有効にしています。

htmlのホットリロード化については以下で

https://www.npmjs.com/package/reload
【LeetCode】Binary Searchの公式Tutorialを読んでみた① [Find the Exact Value]

## 1. 記事の概要
* LeetCodeのStudy Plan(Binary Search)では、一番最初の問題で公式解説を確認する事ができます。
* 当記事は、その解説を読みながら、自分なりに要点をまとめた備忘録です。
* 言語は、**Swift**を想定しています。

## 2. 記事の結論
* 配列の両端をそれぞれ、left,rightに指定する。
* midを求め、pivot pointと比較し、探索範囲を2分の1にする。
* 該当しなかった場合は、-1をreturnする(基本は、問題の指示に従うこと)

## 3. 課題
> [Int]型のArray[-7,-4,-1,0,3,5,9,12]から、target=9を見つけてください。
該当しない場合は、-1をreturnしてください。


## 4. アプローチ1: 正確な値を見つける

### 4-1. leftとright
* まず、[Int]型の任意の配列**Array**を用意します。
    * この時、Arrayは、数字の小さいものから昇順に並び替えられているものとします。
* 配列のindexには必ず最初のindexと最後のindexが存在します。それを便宜的に**left**, **right**とします。
* これにより、全てのindexは[left, right]の範囲内にあると考える事ができます。

```
//Array
[-7, -4, -1, 0, 3, 5, 9, 12]

//この際、left: -7、right: 12となる。

//よって、Arrayに格納されている全てのindexは-7　~ 12の範囲内に存在すると考えられる。
```

### 4-2. 探索方針
* 配列を探索するためには、forループやwhileを使うなどして、探索していくと賢明です。
* その際、探索の終了条件を、要素がemptyであるかどうかを検知するべきでしょう。
* それを検知するためには、whileを使い、条件式に**left<=right**を指定してあげるとよいです。
* こうすることで、探索範囲が空だったり、left<=rightを満たさない条件が出現時に、loopが止まるはずです。

### 4-3. ピポットポイント(pivot point)の設定
* 次に検討することは、**pivot point**を設定してあげることです。
* pivot point（以下pivot）とは、探索範囲を2つに分割するための中間地点です。
* pivotを設定したら、Arrayのmiddle indexとtargetの値を比較する必要があります。
    * こうする事で、条件式に該当しない半分については、検索する必要がなくなるため、検索量を半減させることが出来るメリットがあります。
* 探索範囲が少ない競プロの問題だと、全探索ゴリ押しでもACを叩き出す事ができますが、検索量が増えて配列の要素数が1,000や10,000クラスになってくると、処理スピードが遅く、長くなってしまいますので、pivotを使って、探索範囲を削減していく必要があります。


### 4-4. 例外処理

* arrayが以下のような場合に対応する必要があります。

```Swift
var array: [Int] = [3]
// target = 9, No exact matches
```
```Swift
var array: [Int] = [20]
// target = 9, No exact matches
```
ですので、該当しないArrayが登場した際にも対応できるように、コードを一文追加しましょう。

```Swift
return -1
```

こうする事で、arrayの中にtargetが見つからなかった場合でも、エラーを吐かずにプログラムを実行させる事ができます。

### 5. コード全体

```Swift
var left: Int = 0
var right: Int = 8

var array: [Int] = [-7,-4,-1,0,3,5,9,12]
var target: Int = 9

print(searchIndex())

func searchIndex() -> Int{
    var left = 0
    var right = nums.count - 1
    while left<=right {
        let mid = ( left + right ) / 2 

        // 正解
        if nums[mid] == target {
            return mid
        }

        // pivotよりtargetの方が大きい時
        if nums[mid] < target {
            // 答えはpivotよりright側にあるので、left側の探索を切る
            // mid + 1を　leftに代入することで、midより小さい配列のindexを検索しないようにする
            left = mid + 1
        }

        // pivotよりtargetの方が小さい時
        if nums[mid] > target {
            // 答えはpivotよりleft側にあるので、right側の探索を切る
            // mid - 1を　rightに代入することで、midより大きい配列のindexを検索しないようにする
            right = mid - 1
        }
    }

    return -1

}
```

## 6.最後に
* 何かご指摘事項などございましたら、コメント欄等でお知らせしていただけると幸いです。 


## 7. 参考ページ
* https://leetcode.com/problems/binary-search/solutions/2794222/binary-search/?envType=study-plan&id=binary-search-i

## 8. 次回の記事
https://qiita.com/Tim_Leitch_2023/items/939afe27fc0860a51199
Excelで表にテーブルスタイルを適用していい感じにしたいがテーブルには変換したくないとき

Excelでテーブルのようにスタイルを適用したが、テーブルに変換したくない場合。
何かいい方法はないかと探してみた所、下記のような記事がありました。

[Excel のテーブルを挿入せずにテーブル スタイルを適用する](https://support.microsoft.com/ja-jp/office/excel-%E3%81%AE%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%82%92%E6%8C%BF%E5%85%A5%E3%81%9B%E3%81%9A%E3%81%AB%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB-%E3%82%B9%E3%82%BF%E3%82%A4%E3%83%AB%E3%82%92%E9%81%A9%E7%94%A8%E3%81%99%E3%82%8B-65331c5e-995c-4203-bd87-7b4ea0949d85)

結局のところ、一度テーブルにして範囲に戻すといった当たり前の事が記載されています。
現状、テーブルスタイルを適用するには一度テーブルに変換するのが正解なようです。

## オートフォーマット

Excelで表の装飾をする機能としては、テーブルのスタイル以外には、オートフォーマットがあります。
オートフォーマットを使うと、表をテーブルに変換せずにいい感じに装飾してくれます。

が、Excel2003以降では標準ではメニューに表示されなくなったので、利用するためにはメニューに表示させるかショートカットキーでアクセスします。

ショートカットキーは`alt` -> `o` -> `a`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/f7fd3a01-d12f-f069-c9a1-27810e96bb0a.png)

## 総評

一旦テーブルにしてから、範囲に戻すというのはだいぶ力技な気がしますが、現状はそれしか手はなさそうです。
プログラミングにおススメなMyricaというフォント

# どんなところがいいのか

個人的にいいなと思うところ。

## 取り違えやすい文字に対する配慮

下記のように間違えにくい形になっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/5b04d346-0f25-7120-8d55-9c4d80622cfd.png)


## フォントの幅

幅が一定だと『全角が混入している』『データ長がおかしい』などの不備を見つけやすくなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/67007ded-92cf-3285-4255-d53abec75a68.png)



# Myricaのサイトさん

フォントの細かい特徴やダウンロードなど。

https://myrica.estable.jp/

# ラインセンス参考サイトさん

Myricaのライセンス『SIL OPEN FONT LICENSE Version 1.1』について、知識不足だったのでこちらを参考にさせてもらいました。

https://tanukifont.com/sil/

# 蛇足

個人的にMyricaにして『良かったこと』は多々あるけど、『悪かったこと』は一度も無いです。