OmniAICreator/Qiita-1.07M huggingface dataset:
常用GITコマンド

1.if you need to set something,refer following
git config --list --show-origin
git config --global user.name "name"
git config --global user.email name@test.com

2.get source
git clone https://xxxxxxxxxxxx.git

3.get change if you have
git pull 
or 
git pull origin develop(or any name you set)

4.switch to your branch
git checkout  feature/test(or any name)

 -->when others make changes ,you should use 
    git pull 
    or 
    git pull origin develop(or any name you set)
    to get others' changes.

5.commit

6.push
GitHub Actions のワークフロー内で環境変数を参照する時は Context で統一した方が混乱しない

:::note warn
利用者からの input 情報を Context 参照する場合はスクリプトインジェクション対策として中間環境変数を利用してください。
https://docs.github.com/en/actions/security-for-github-actions/security-guides/security-hardening-for-github-actions#using-an-intermediate-environment-variable
:::

GitHub Actionsのワークフローを作成している時に環境変数を参照したいことがよくあります。GitHub Actionsのワークフローから環境変数を参照する場合はshellと同じように`$ENV`と記述する方法とGitHub Actions独自に存在するContexを使って`${{ env.ENV }}` と記述する方法があります。どちらを使えば良いか個人的には**Context記法で統一した方が混乱しないな**と思ったのでその理由を記載します。

https://docs.github.com/en/actions/learn-github-actions/environment-variables

https://docs.github.com/en/actions/learn-github-actions/contexts

## `$ENV`の記法は`jobs.<job_id>.steps[*].run`内でしか使えない
`$ENV`はshellでの記法なのでshellのコマンドラインを実行できる`jobs.<job_id>.steps[*].run`内でしか使えません。run以外の箇所に記載しても環境変数が展開されずそのままの文字で解釈されます。

```yaml
name: test
on:
  push:
    branches:
      - 'test'

jobs:
  env-test:
    runs-on: ubuntu-latest
    env:
      HOGE: hoge
    steps:
      - name: set FUGA
        run: |
          echo 'FUGA=fuga' >> $GITHUB_ENV
      - name: echo test
        run: |
          echo $HOGE
          echo $PIYO
        env:
          PIYO: $FUGA

```

出力
```
hoge
$FUGA
```
`env`に`$FUGA`を指定しましたが環境変数が展開されず`$FUGA`のまま出力されてしまいました。

## `${{ env.ENV }}`であればどこでも環境変数が参照できる
Context記法であればrun以外の箇所でも環境変数を参照できます。

```yaml
name: test
on:
  push:
    branches:
      - 'test'

jobs:
  env-test:
    runs-on: ubuntu-latest
    env:
      HOGE: hoge
    steps:
      - name: set FUGA
        run: |
          echo 'FUGA=fuga' >> $GITHUB_ENV
      - name: echo test
        run: |
          echo $HOGE
          echo ${{ env.HOGE }}
          echo $PIYO
        env:
          PIYO: ${{ env.FUGA }}

```

出力
```
hoge
hoge
fuga
```

`run`と`env`でContext記法による環境変数参照を記載しましたが、どちらも値が展開されて出力されました。

# おわりに
よくshell記法での環境変数参照をrun以外でも書いちゃうことがあったので、どこで使用しても環境変数参照できるContext記法で統一した方が混乱しないなと思いました。
salesforce release info

yarn
PowerShellを起動して次のコマンドを実行する。
scoop install yarn


次のコマンドを実行して、Yarnのバージョンが確認できたらインストール成功。
yarn -v

gulpをインストール
npm install -D gulp --force 

リリースする前に検証する
yarn gulp:deploy:validate --envType dev --orgAlias orgname（the connected oeg name displayed on vscode） --noTest
dbeaverで、mysqlやinformation_schemaが表示されない

DBを選択し、F4キーを押し、
一般＞カスタマイズ＞システムオブジェクトを表示する
にチェックを入れると、mysqlやinformation_schemaが表示される

参考：https://github.com/dbeaver/dbeaver/issues/6024
SpacyとGiNZAで固有表現抽出

# はじめに
本記事ではspaCyとGiNZAを使用した固有表現抽出の手順について紹介します。
インストールすれば簡単にできるので固有表現抽出を行う際におすすめです。
今回はあくまで固有表現抽出のみを行います。

# 想定する読者
日本語の自然言語処理に興味がある人
Pythonのコードが読める人

# 環境
Windows10
Windows11

# spaCyとは
Pythonで利用できる自然言語処理ライブラリです。
Explosion AI社によって公開されています。
spaCyでは、テキスト分類、トークン化などをはじめとした非常に多くの機能を提供しています。
spaCyでは訓練済みのモデルを読み込むことで多言語の自然言語処理に対応します。

# GiNZAとは
GiNZAは日本語の自然言語処理を行うためのライブラリでリクルートと国語研が共同で開発したライブラリです。
GiNZAはspaCyのAPIを使用して学習されており、spaCyからモデルをロードして使用することができます。

# インストール
### spaCyのインストール
```
pip install spacy
```
### GiNZAのインストール
次のコマンドでインストールされるパッケージには大容量モデルファイルは含まれていない
```
# pip install -U ginza ja_ginza_electra
```
大容量モデルファイルを含めたインストールを行うには、次のようにGitHubのリリースアーカイブを指定する
```
# pip install -U ginza https://github.com/megagonlabs/ginza/releases/download/latest/ja_ginza_electra-latest-with-model.tar.gz
```

# spaCyからGiNZAのモデルをロード
GiNZAのモデルをロードしてみましょう。
```python
import spacy

nlp = spacy.load('ja_ginza_electra')
```

# GiNZAで固有表現抽出
docには固有表現抽出を行いたいテキストを入力します。
```python
doc = nlp('小学生のサツキと5歳のメイの二人は、母の療養のために父と一緒に初夏の頃に3丁目に引っ越してくる。')

for ent in doc.ents:
    print(
        ent.text+','+ # テキスト
        ent.label_+','+ # ラベル
        str(ent.start_char)+','+ # 開始位置
        str(ent.end_char) # 終了位置
    )
```

## 抽出結果
```
小学生,School_Age,0,3
サツキ,Name_Other,4,7
5歳,Age,8,10
メイ,Name_Other,11,13
二人,N_Person,14,16
初夏,Date,31,33
3丁目,Facility_Part,36,39
```
このように固有表現とそのラベルが抽出されます。
開始位置と終了位置は文字列のどの位置に固有表現があるのかを示しています。

# ルール追加
GiNZAでの固有表現抽出には抽出されない単語も存在します。
その単語を抽出したい際にはルールを手動で追加する必要があります。
例えば、先ほどの文章からは"母"と"父"という単語は抽出されていません。今回はこの２つを抽出するルールを追加してみます。
以下のコードをロードの後に記述します。
```python
config={
'overwrite_ents':True
}
ruler=nlp.add_pipe('entity_ruler',config=config)
patterns=[{'label':'Person','pattern':'母'},
          {'label':'Person','pattern':'父'}]
ruler.add_patterns(patterns)
```

## 抽出結果
```
小学生,School_Age,0,3
サツキ,Name_Other,4,7
5歳,Age,8,10
メイ,Name_Other,11,13
二人,N_Person,14,16
母,Person,18,19
父,Person,26,27
初夏,Date,31,33
3丁目,Facility_Part,36,39
```
このように"母"と"父"が固有表現として抽出されました。

# ソースコード
上記の内容を１つにまとめたコードを以下に示します。
```python
import spacy

#GiNZAのモデルをロード
nlp = spacy.load('ja_ginza_electra')

# ルールの追加
config={
'overwrite_ents':True
}
ruler=nlp.add_pipe('entity_ruler',config=config)
patterns=[{'label':'Person','pattern':'母'},
          {'label':'Person','pattern':'父'}]
ruler.add_patterns(patterns)

doc = nlp('小学生のサツキと5歳のメイの二人は、母の療養のために父と一緒に初夏の頃に3丁目に引っ越してくる。')

for ent in doc.ents:
    print(
        ent.text+','+ # テキスト
        ent.label_+','+ # ラベル
        str(ent.start_char)+','+ # 開始位置
        str(ent.end_char) # 終了位置
    )
```

# おわりに
本記事ではspaCyとGiNZAを使った固有表現抽出の手順を紹介しました。
この手法で固有表現抽出は簡単にできるので、固有表現抽出に興味のある人ややってみたい人におすすめです。

不明な点や、改善すべき点などがあればコメントでお願いします。
また共有できることがあれば投稿したい思います。
[AWS] AWS Network Firewallの帯域上限について

# AWS Network Firewallの帯域上限について(2022/10/28時点)

公式リファレンスより、

> Network Firewall supports up to 100 Gbps of network traffic per firewall endpoint.
If you require more traffic bandwidth, you can split your resources into subnets and create a Network Firewall firewall in each subnet.

引用元: [Configuring your VPC and other components for AWS Network Firewall - AWS Network Firewall](https://docs.aws.amazon.com/ja_jp/network-firewall/latest/developerguide/vpc-config.html)

とあり、ファイアウォールエンドポイント毎に **100 Gbps** までのネットワークトラフィックをサポートしている。

また、AWS Network Firewall はネットワークトラフィックに合わせて自動的に拡張される。

ただし、突発的なトラフィックの増加(例: トラフィック切り替え等で瞬間的に **20 Gbps** 程度の負荷が発生する等)がある場合は事前にサポートへ申請をする必要がある。(サポートの方に教えていただきました。)

引用元: [クラウドファイアウォール - AWS Network Firewall - Amazon Web Services](https://aws.amazon.com/jp/network-firewall/?whats-new-cards.sort-by=item.additionalFields.postDateTime&whats-new-cards.sort-order=desc)
Azure Fundamentals(AZ-900)：Azure の基礎: Azure のアーキテクチャとサービスについて説明する「ゼロトラストモデル」

Microsoft Learnを用いたMicrosoft Azure Fundamentals(AZ-900)の試験内容をまとめる投稿です。
この投稿ではMicrosoft Learnで学ぶ内容をできるだけ簡潔にまとめております。
Azureの勉強を一から始める方の参考になれば幸いです。

## 今回の学習内容
**◆「ゼロトラストモデル」**
◇対応するMicrosoft Learn ラーニングパス
[Azure の基礎: Azure のアーキテクチャとサービスについて説明する](https://learn.microsoft.com/ja-jp/training/paths/azure-fundamentals-describe-azure-architecture-services/)
◇対応するモジュール
[ゼロ トラスト モデルについて説明する](https://learn.microsoft.com/ja-jp/training/modules/describe-azure-identity-access-security/7-describe-zero-trust-model)

※前回の投稿は下記から確認できます。
[Azure Fundamentals(AZ-900)：Azure の基礎: Azure のアーキテクチャとサービスについて説明する「Azureのロールベースのアクセス制御」](https://qiita.com/fsd-jume/items/d316d6b979d97c6fa6e3)

## ゼロトラストモデル
**最悪のシナリオを想定し、その予想に基づいてリソースを保護するセキュリティモデル**
⇒アクセスしてくる通信がすべて信頼できない通信であると想定して、常に正しいかどうかの検証を行うという考え方
・アクセス元の場所やデバイスにとらわれず、リソースを保護する新しいセキュリティモデル
・Microsoftが強く推奨

### ゼロトラストセキュリティモデルの基本原則
**◆明示的に検証**
・すべての使用可能なデータポイントに基づいて、常に認証と承認を実施
**◆最小限の特権アクセスを使用**
・Just-In-TimeおよびJust-Enough-Access(JIT/JEA)、リスクベースの適応型ポリシー、データ保護を使用して、ユーザのアクセスを制限
※JIT：常時管理者権限を付与するのではなく、必要な時だけ管理者権限を付与する考え方
※JEA：非管理者が特定の管理操作をできるように必要な権限を付与することで、管理者自体の数を減らし、セキュリティを向上させる考え方
**◆侵害を想定**
・影響範囲を最小限に抑えるために、アクセスをセグメント化
・エンドツーエンドの暗号化を検証
・分析を使用した可視化、脅威検出の推進、防御の強化を実施

### アクセス制御についてのアプローチ
**◆従来のアプローチ：境界型セキュリティ**
・ネットワークを内部と外部に分け、その境界線で侵入を防御
・内部のネットワークにあるものは安全で信頼できるという前提の考え方
・外部からの通信に対して対策を実施(FWによるアクセス制御やVPNなど)
**◆新しいアプローチ：ゼロトラストモデル**
・すべてのユーザに認証を求め、その結果に基づきアクセスを許可

## 次の学習内容
**◆多層防御**

https://qiita.com/fsd-jume/items/8e55b6e44020f5651049

## 学習内容をまとめたページの一覧

https://qiita.com/fsd-jume/items/e4ec76959adb547ac5e8
Ruby on RailsアプリでのSVGベースのOGP生成


Controller&Viewのようなイメージで、SVGでテンプレートを用意して、OGP画像をレンダリングするライブラリを書いてみました。

# 使い方

- app/ogps/***_ogp.rb OGP生成するコード (Mailerのようなイメージです)
- app/views/opgs/***.svg.erb SVGテンプレート

```ruby:app/ogps/question_ogp.rb
# frozen_string_literal: true

require Rails.root.join 'lib/ogp/base'

class QuestionOgp < Ogp::Base
  def render(question)
    @question = question
  end
end

```

```ruby
  has_one_attached :ogp
  :
  question.update ogp: QuestionOgp.render(question.decorate)
```

# コード

```ruby:lib/ogp/base.rb
# frozen_string_literal: true

require 'tempfile'

module Ogp
  class Base
    class << self
      def views_path
        './app/views'
      end

      def template_prefix
        'ogps'
      end

      def template_name
        name.underscore.gsub(/_ogp$/, '')
      end

      def render(*parameters)
        svg_file = Tempfile.open(%w[ogp_ .svg])
        png_file = Tempfile.open(%w[ogp_ .png])
        begin
          svg_file.puts render_svg(*parameters)
          svg_file.close
          svg_file.open
          svg_to_png(svg_file, png_file)
          to_blob(png_file)
        ensure
          svg_file.close
          png_file.close
          svg_file.unlink
          png_file.unlink
        end
      end

      def to_blob(file)
        ActiveStorage::Blob.create_and_upload!(
          io: file,
          filename: 'ogp.png'
        ).signed_id
      end

      def render_svg(*parameters)
        instance = new
        instance.render(*parameters)
        action_view = Class.new(
          ActionView::Base.with_empty_template_cache
        ).with_view_paths(views_path, instance.assigns)
        action_view.render(template: template_name, prefixes: template_prefix, formats: [:svg])
      end

      def svg_to_png(svg_file, png_file)
        ImageProcessing::MiniMagick
          .source(svg_file)
          .convert('png')
          .call destination: png_file.path
      end
    end

    def assigns
      r = {}
      instance_variables.each do |name_sym|
        name_s = name_sym.to_s
        if name_s.start_with? '@'
          new_name_sym = name_s[1, name_s.size - 1].to_sym
          r[new_name_sym] = instance_variable_get(name_sym)
        end
      end
      r
    end
  end
end
```
GitHubにSSHで接続する方法

## HTTPS通信でGitHubにパスワード認証ができなくなったので「SSH接続」したときのメモ。

### SSH接続方法

  公開鍵と秘密鍵を作ります。
``` 
$ ssh-keygen -t rsa -b 4096
```
 ３つ質問されます。
①鍵の置き場所（ファイル名をid_rsa以外にするかどうか）
Enterを押すと自動的にrsaになります。
今回は.sshディレクトリ内に既にid_rsaが存在したので別鍵を作ります。
(変更しない場合はEnter）
```
Enter file in which to save the key : id_rsa_aaa
```

②パスワードと③パスワード確認を入力
```
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
```

鍵を作りました。
```
The key's randomart image is:
+---[RSA 4096]----+

Host github github.com
|        =*oo.. + |
|       oB=+o .+ +|
|      ..o=o *  .+|
|     ....+ * o .+|

|      ..S * *  +.|
|       . = + oE .|
|        . * o  . |
|         + +     |
|         .+      |
+----[SHA256]-----+

```

鍵ファイルができているか確認する。
公開鍵と秘密鍵ができていればOKです。
```
$ ll
-rw------- 1 aaa 3326 10月 27 11:50 id_rsa_aaa
-rw-r--r-- 1 aaa 751 10月 27 11:50 id_rsa_aaa.pub
```

.ssh/configファイルを作成する。
```
$ vi config
```

以下を.ssh/configファイル内に記述する。
githubの場合Userはgitで固定。
これで自ユーザー環境内でGitHubにSSHで接続する際はユーザーをgitにして、
鍵ファイルを「~/.ssh.id_rsa_aaa」にして接続するようになる。
```
　Host github github.com
  HostName github.com
  IdentityFile ~/.ssh/id_rsa_aaa
  User git
```

catでid_rsa_aaa.pubファイル内をコピペし公開鍵をGithubに設置する。
GitHubにログインし下記ステップから公開鍵をペーストして保存。
settings　→　 Developer settings　→　Personal access tokens (classic)
```
$ cat config
```

SSHで接続可能か確認する。
```
$ ssh -T git@github.com
```

以下のようなエラーが出た。
アクセスする権限がないようです。
```
Bad owner or permissions on /.ssh/config
```

権限を600に変更する。
```
$ chmod 600 ~/.ssh/config
```
再度SSHで接続可能か確認する。
```
$ ssh -T git@github.com
```
SSH接続に成功すると下記のような文章が表示されます。
```
Enter passphrase for key '/.ssh/id_rsa_aaa': パスワード入力
Hi aaa! You've successfully authenticated, but GitHub does not provide shell access.
```
【Linux】uniqコマンドとは？

# uniqコマンドとは？
ソートされたファイル内の連続した重複行をについてのコマンド。
### 書式
```
uniq [オプション] [ファイル名] [出力先]
```
※オプションを指定しない場合、重複行をまとめて1行だけ表示する。
### オプション
|オプション|説明|
|---|---|
|-d|重複している行のみを表示|
|-u|重複していない行のみを表示|
### 使用例
file1内の重複していない行のみをfile2に出力する場合。
```
uniq -u file1 file2
```
【Linux】wcコマンドとは？

# wcコマンドとは？
ファイル内の行数、文字数、単語数を調べるコマンド。
### 書式
```
wc [オプション] [ファイル名]
```
### オプション
|オプション|説明|
|-------|------|
|-l|行数を表示|
|-w|単語数を表示|
|-c|文字数(バイト数)を表示|
### 使用例
file1の文字数を表示する場合。
```
wc -c file1
```
【Google Spread Sheets】スプレッドシートにまとめてあるデータをDWHに取り込む前にQuery関数で成型する

# 今回の課題
スプレッドシートのデータを、ETLツールを介してBigQueryに転送するにあたって、
下記を実施したかったので、Query関数のlabelを使用した。
* マスタデータのメモ書きの除去
* カラム名の調整


# Query関数とlabelとは
### Query関数
特定のデータ群から指定した条件でデータを抽出する関数。
`=Query(データ, クエリ, [見出し])`で実装できる。
└データ：どこからデータを抽出するのか、範囲指定をする。
└クエリ：SQLのようにデータ抽出にあたってのフィルタリングなどができる。
└見出し：データ上にある見出しの数（省略可）
※参考：[Query関数とは](https://blog.members.co.jp/article/45542#:~:text=QUERY%E9%96%A2%E6%95%B0%E3%81%A8%E3%81%AF,%E3%82%92%E6%8A%BD%E5%87%BA%E3%81%99%E3%82%8B%E9%96%A2%E6%95%B0%E3%81%A7%E3%81%99%E3%80%82)

### label
指定した列のタイトルを、指定した名前に書き換えることができる。
※参考：[【スプレッドシート】Query関数のlabelを使って見出しを変更する
](https://strategy-conference.com/analysis/spreadsheet/1280/)

## 使用例
例えば、下記のマスタデータをBigQueryに転送する前に、
1行目の空白と、2行目の注意書きを除去したいとする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/883573/f475e17f-f46d-f0f7-72a9-0f37a267bd47.png)

別シートで、`=Query('シート1'!A3:C6, "label A 'contents_title', B 'page_title', C 'auhors'", true)`と記述すると、
下記のように1行目、2行目を削除し、カラム名も調整することができる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/883573/a73112fe-5138-7e76-171e-63accc31415c.png)
これでETLツールでBigQueryにテーブルとして格納できるようになった。
**マスタデータをDWHなどに格納するときに便利。**
【Composition API】フォームにバリデーションをつける方法 【Script SetUp】

# 始めに
以下のコードは[こちら](https://qiita.com/tak8_al/items/17b6cdde012cb6a8658d)で利用しているものです。
良ければご覧ください。
見なくても理解いただく上では問題ありません。

# 開発環境
MacBook Air (M1, 2020)
npm 8.18.0

# バリデーション
以下の二つの処理を実行させるコードを書きます。
* 複数のフォームにバリデーションをつける
* クリアしないとボタンをクリックできなくする。

ではご覧ください。
```vuejs
<script setup lang="ts">
import { useStore } from '../../store'
import { useField, useForm } from 'vee-validate';
//yupを利用することでエラーメッセージを表示させる関数を書かずにバリデーションができる。
import { object, string } from 'yup';
    //スキーマでバリデーションを一括管理する。
    const schema = object({
        list_description: string().required('必須の項目です。').label('リスト名'),
    });

    //useFormを使用することでバリデーションの処理をまとめることができる。
//metaを使用し、initialValuesを設定することで、どちらのバリデーションもパスしないとバリデーションがクリアできなくする。
    const { errors, meta } = useForm({
        //作成したスキーマを設定
        validationSchema: schema,
        initialValues: {
            list_description: '',
        },
    });
    
    //valueを取り出す。
    const { value: list_description } = useField<string>('list_description');

    const clearForm = () => {
        list_description.value = ""
    };

    const store = useStore()

    const addList = () =>{
        store.dispatch('todoLists/addList', {
            id: Math.floor(Math.random() * 100000),
            description: list_description.value,
            todoCards: []
        });
        clearForm();
    }
</script>

<template>
  <div>
    <form @submit.prevent="addList">
        <span v-if="errors.list_description">
            <!--エラーがあればエラー文を表示-->
            {{ errors.list_description }}
        </span><br>
        <input type="text" id="description" v-model="list_description" /><br>
        <!--:disabled=!meta.validを設定することで、どちらのバリデーションもクリアしないとボタンをクリックできなくする。-->
        <input type="submit" value="submit" :disabled="!meta.valid" />
    </form>
  </div>
  <hr />
</template>

```
【Linux】tailコマンドとは？

# tailコマンドとは？
指定したファイルの末尾部分を表示するコマンド。
### 書式
```
tail [オプション] [ファイル名]
```
### オプション
|オプション|動作|
|-------------|-----------------------|
|-n 行数, -行数|指定した行数を表示する。|
|-c バイト数|指定したバイト数を表示する|
|-f|ファイルの末尾に表示された行を表示し続ける|

-fは更新された部分を表示し続けるのでファイルを監視する際などに使用される。
FITS形式のファイルの画像部分をnumpyのndarray形式のファイル(.npy)に変換する

天文データ形式であるfitsファイルを、機械学習などでよく用いられるndarrayのバイナリファイルに変換します。

## .fits→.npy


```python:fits_to_npy.py
import numpy as np
import argparse
from astropy.io import fits

parser = argparse.ArgumentParser(description='convert fits to npy')
parser.add_argument('--source_path', type=str, required=True)
parser.add_argument('--file_name', type=str, required=True)
args = parser.parse_args()

fits_data = fits.open(args.source_path)
image_data = np.array(fits_data[1].data)
image_data = image_data[..., np.newaxis]

np.save(args.file_name, image_data)
```

#### 実行例
```terminal:
python fits_to_npy.py --file_name=aia.npy --source_path=aia.lev1_euv_12s.2015-01-01T000049Z.211.image_lev1.fits
```

fitsファイルの読み込みには`astropy.io`を使っています。
また、機械学習では`width*height*channel`というデータ構造がとられることが多いため、12行目でチャンネルの次元を追加しています。`opencv`などで画像化する分にはこの行はあってもなくても変わらないと思います。
【Linux】改行コードとは？

# 改行コード
コンピュータ上でテキストファイルを扱う際に使用する制御符号。
OSに準じたものと異なる改行コードを使用すると正しく改行されない。
多くのシステムではキャリッジリターン（CR：\r）、ラインフィード（LF：\n）を用いる。

### 代表的な改行コードとOSの組み合わせ
■CRLF(\r,\n)：Windows
■CR(\r)：Unix系
■LF(\n)：MacOS
Outsytemの認定試験「Associate Reactive Developer」の出題範囲について

## はじめに
outsystemsの[認定試験](https://www.bluememe.jp/outsystems/outsystems_support/exam-qualify.html)「Associate Reactive Developer」を受けて来たので、出題された範囲を備忘録を兼ねて残しておきます。うろ覚えのため、あくまで参考程度にお願いします。大学のテスト前に、”先輩から過去問を貰う”感覚に近いです(笑)


## 事前準備

テストの予約に関しては、東京の御茶ノ水にあるテストセンターで受けました。
この試験は何度か受けているんですが、一番最初は、テストセンターを利用せずにオンラインで受けました。オンラインの場合、最初に身分証とテスト環境の確認が、試験監督とビデオチャットにて行われます。外国人の試験監督だったので、コミュニケーションが上手くとれず、途中で相手が痺れを切らしていなくなってしまい、結局この日は、テストを受けずに終わりました。受験料200ドル(笑)
その後、調べていたら、テストセンターで受講できることを知りました。英語が苦手な方は、テストセンターでの受験をおすすめします。日本人の方が身分確認してくださいます。

そのあたりのことは、↓の記事を参考にすると良いです。
参考記事：[OutSystemsの資格試験を受験しました](https://qiita.com/nanaki11/items/b994239c5c2360f837d3)
 

## 前提
元は英語で記載された試験を日本語に翻訳しているせいか、出題文の日本語がかなり分かりにくい言い回しになっています(所謂、日本語が下手)。これのせいで、回答の選択に戸惑うことがあります。


### 出題内容
雑多に書いていきます。言葉遣い等が気になるかもしれませんが、ご了承ください。

#### ロール
・モジュールにロールを付与した際、ログインユーザーは最低限どのロールを持っていたば良いかという形式の問題がありました。デフォルトで定義されているユーザーの特徴を理解しておくと良いです。

#### ライフサイクル
・この関連の問題が何問か出ました。Initialize, Ready, Render, Destroyの順番と、画面をクリックした時の挙動。on after fetchの処理が行われるタイミングなどを把握しておくと良いです。

#### クライアント変数
・クライアント変数がどのタイミングでリセットされるか、出題されました。

#### 各アクション
・クライアントアクションが他の画面で使用されるかどうか問われてしました。画面アクション、クライアントアクション、サーバーアクションのそれぞれの特徴は再度理解しておいた方がよいです。

#### ブロック
・同じブロックに、ブロックを追加したらどうなるかが出題されました。

#### 例外、エラーメッセージの表示
・例外処理が行われた際のエラーメッセージの表示について出題されました。All extensionの時と、データベースの例外の時のタイミングを把握しておくと良いです。

#### 結合
・Aggregateの扱いで、only with, with or without, withの違いを問われます。出題形式としては、出力結果が表示されており、joinの順番を変え、結合形式を変えた時(only with→with or withoutなど)に、出力結果がどう変わるかと言った内容でした。

#### サイトプロパティ
・サイトプロパティの概要、どこで変更出来るかと問われました。

#### ソート
・Aggregateのソート順を変更した時に出力結果がどうなるかと問われる問題です。

#### 静的エンティティの使用方法
・３つくらいのエンティティがあって、それぞれにリレーションを定義する場合にどのように処理するのが最適かを問われました。

#### ロジックフロー
・ifとループの違いがでました。

#### linkの扱いについて
・模擬試験に似たような問題があったと思いますが、Linkで使えるものとそうでないものを選択する問題がありました。

#### form
・フォームの有効性についてや、validメソッドの意味などを理解しておくと良いです。

#### ラベル
・必須入力にしたフォームのラベルに、赤しるしを付ける方法を問われました。

#### データ取得
Fetchプロパティを「Only on demand」にした時の処理について問われました。

#### リストの取得
・ドロップダウンを実装する際、option textとoption valueの記述の仕方を問われました。
元となるリストの記載方法も出題された気がします。

#### ブロック
・ブロックのパラメータの渡し方についても問われました。

#### イベントハンドラ
・この辺も出たので、確認しておくと良いです。


そんな感じです。
思い出したら適宜追加していきます。
【Linux】パイプ、リダイレクトとは？

# パイプ
あるコマンドの標準出力を、別のコマンドの標準入力に渡す機能。
### 使い方
file1内の「abc」という文字列を「cdf」に置換する場合、下記の様に実行する。
```
cat file1 | tr [abc] [cdf]
```
# リダイレクト
あるコマンドの標準出力を画面ではなくファイルに出力する。または、ファイルをあるコマンドの標準入力に渡す。
### 使い方
パイプの紹介時と同様に、file1内の「abc」という文字列を「cdf」に置換する場合、下記の様に実行する。
```
tr [abc] [cdf] < file1
```
MayaとBlenderの比較

<h2>はじめに</h2>
こんにちは、マイスター・ギルドのnappleです。

今回は3DソフトのMayaとBlenderの比較について記載していきます。

今まで3D案件で使用されるソフトは、企業ではMayaや3dsMaxが主流でしたが、近年ではBlenderも注目を浴びています。
そこでMayaとBlenderどっちが良いかという悩みをよく見かけた為、実際に使ってみて感じたメリットとデメリットを下記に記載してみました。

<h2>Blender</h2>
<b>メリット</b>

①無料CGソフトにも関わらず、モデリング・UV編集・アニメーション・レンダリングが可能
②更に動画編集が可能(動画を繋ぎ合わせる他、BGMも付けられる)
③読み込める拡張子が豊富(出力も然り)
④秒でソフトが起動する上、作業中に落ちにくい
⑤Mayaにはないリアルタイムレンダリングやグリースペンシル等、独自の便利な機能がある
⑥Unityとのやり取りがし易い

<b>デメリット</b>
①UIや操作が他のソフトと比べて独特なので、初心者だと慣れるのに時間がかかる
②アップデート時に、旧バージョンのものをアンインストールしてからじゃないと新バージョンを使用できない

更に、Blenderについて詳しいメリット・デメリットが記載されているサイトがありますので、下記に紹介しておきます。
https://bookyakuno.com/47-2/
https://cad-kenkyujo.com/what-blender-can-do/

<h2>Maya</h2>
<b>メリット</b>

①使用している会社が圧倒的に多い
②ゲームや映像制作に向いている
③モデリング・アニメーション機能が豊富で、Blenderにはない法線編集等の独自の便利な機能がある
④他Autodesk社製品のソフトと互換性がある
⑤mel(スクリプト)が作成できると、作業の幅が広がる(但し、プログラミングの知識が問われる)

<b>デメリット</b>
①ソフトの金額が高額の為、気軽に利用し辛い
②作業中に急に落ちることが多々ある
③プラグインが少ない為、より良い作業状態にしたい場合はプログラムの知識が必要
④エクスポートができても、インポート出来ない拡張子がある

<h2>まとめ</h2>
どちらがいいかと言われると、コストを押さえたいのであればBlenderがオススメです。

ただ、どちらにせよ3DCGは覚えることが多い為、BlenderにしろMayaにしろ習得の難易度は同じくらいです。
一方Mayaで作業された経験のある方は、MayaとBlenderのショートカットの違いで最初は非常に混乱することはあるものの、基本的な機能は揃っているので慣れれば問題ないかと思われます。
その上で仕事の内容や状況に合わせて、自分のやり易い方で作業していけば良いかと思われます。
階級コード変換 (Bin Code)

[Teradata Vantage - Vantage Analytics Library](https://docs.teradata.com/r/Vantage-Analytics-Library-User-Guide/January-2022)[2022/9/22時点]の翻訳です。
(リリース番号 : 2.1.1 | リリース日 : January 2022)
> この記事はVantageアナリティクスライブラリ シリーズのコンテンツです。

# 概要
ビンコード変換を使用して、連続した数値列をカテゴリ列に置き換えることができます。ビンコード変換は、順序値（つまり、データ列のように順序が意味を持つ数値のカテゴリ値）を生成します。

# 前提条件
・Teradata Vantageインスタンスにアクセスできること。
・Vantage アナリティクス・ライブラリがインストールされていること。

::: note info
Vantage アナリティクス・ライブラリのインストールについて、既にVantageを導入頂いているお客様はTeradataサポートサービスにお問い合わせください。
Vantage Express (評価版)やクラウドサービスのDIYでご利用頂く場合は[Teradata Dounload](https://downloads.teradata.com/download)からダウンロードし利用可能です。
Vantage アナリティクス・ライブラリのインストール手順は「[Vantageアナリティクス・ライブラリのインストール](https://qiita.com/ykswi/items/12d0da2ac69b4b161881#vantage%E3%82%A2%E3%83%8A%E3%83%AA%E3%83%86%E3%82%A3%E3%82%AF%E3%82%B9%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)」の記事に従い行います。
:::

# データの準備
## サンプルデータの入手とデータベースへの格納方法
こちらの「[チュートリアル用のサンプルデータを用意する](https://qiita.com/tmsky/items/4d86ca35aef753290020)」を参照ください。


# 実行方法
## SQLから実行する場合の例
```SQL
call td_analyze (
  'vartran',                                                             /* 分析手法　*/
  '
   database = qid;                                                       /* データベース名 */
   tablename = Superstore;                                               /* テーブル名 */
   bincode =
     {binstyle (bins, 5),                        columns (quantity/q1)}  /* ビンを5つ作成 */
     {binstyle (binswithboundaries, 5, 3, 7),    columns (quantity/q2)}  /* 3～7の範囲でビンを5つ作成 */
     {binstyle (boundaries, 3,5,7),              columns (quantity/q3)}  /* ～3,4～5,6～7,8～のビン */
     {binstyle (quantiles, 5),                   columns (quantity/q4)}  /* ビンの数を均等にビンを5つ作成 */
     {binstyle (width, 3),                       columns (quantity/q5)}  /* 幅3でビン作成 */
     ;
   '
);
```
:::note information
出力結果をテーブルに書き込む場合は以下オプションを指定可能です。
outputdatabase = 出力データベース名;
outputtablename = 出力テーブル名; 
overwrite = {true | false}; --- 未指定の場合はtrueで上書きします
:::

## オプションの説明
|オプション|説明|
|:-|:-|
|bins|指定された数(n)を持つビンを作成<br>ビンの幅を均等にする|
|binswithboundaries|指定された数(n)を持つビンを作成<br>ビンを作成する範囲を指定<br>ビンの幅を均等にする<br>範囲以下は0ビン、範囲以上はn+1ビンで作成|
|boundaries|境界線を指定してビンを作成|
|quantiles|指定された数(n)を持つビンを作成<br>ビンの数を均等にする|
|width|指定された幅のビンを作成|

## 出力結果
初めの10件のみ表示しています。
結果の数値はビン番号です。
|q1|q2|q3|q4|q5|
|:-|:-|:-|:-|:-|
|1|0|0|1|1|
|1|0|0|1|1|
|1|0|0|1|1|
|1|0|0|1|1|
|1|0|0|1|1|
|1|0|0|1|1|
|1|0|0|1|1|
|1|0|0|1|1|
|1|0|0|1|1|
|1|0|0|1|1|
|～|～|～|～|～|

# おわりに
:::note information
サンプルコードはSQL関数から掲載し順次Pythonコードも掲載していく予定です。
:::

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

#### Teradata Vantageへのお問合せ
[Teradata Vantage へのお問合せ](https://www.teradata.jp/About-Us/Contact)
IPv4ヘッダをかんたんに説明してみる

# 勉強前の理解度
* なんかいっぱいある
* ヘッダは可変長


# IPv4ヘッダの中身
[]の中はbit数。

#### バージョン[4]
　**IPヘッダのバージョン番号**を表す。IPv4なら4、IPv6なら6が入る。なお、他の番号は実験的に割り当てられたもので、一般に使用されてはいない。

#### ヘッダ長(IHL:Internet Header Length)[4]
　**IPヘッダの長さ**を4オクテット単位で表す(データの長さは含まない)。オプションを使用しない場合は最小値の5(ヘッダ長が20バイト)となる。


#### DSCPフィールド、ECNフィールド[8]
　先頭6bitのDSCPフィールドは(たぶん)21段階の**優先度**を示す。DSCPフィールドを3bitずつに分けて、前半3bitで通信の優先度を、後半3bit残り2bitで破棄レベル(破棄のされやすさ)を表す。かつてこのフィールドはサービスタイプ(TOS:Type Of Service)として利用されていて、その中の優先度を表すIP Precedenceと互換性が保たれている。
　後半2bitのECNフィールドは、**ネットワークが輻輳していることを通知する**ために利用されている。前半1bit(ECT)が1になっていてネットワークが輻輳している場合、ルーターが後半1bit(CE)を1にする。


#### パケット長(Total Length)[16]
　**IPヘッダとデータの長さの合計**をオクテット単位で表す。


#### 識別子(ID:Identification)[16]
　パケットを分割してフラグメントを生成した場合に**フラグメントを識別するために利用する**。宛先IPアドレスと送信元IPアドレス、プロトコル及び識別子が同じフラグメントは、同じパケットから分割されたと見なして組み立てる。


#### フラグ(Flags)[3]
　**パケットの分割**に関わる意味合いを持つが、1bitずつ意味が異なる。
* はじめの1bitは利用されていない。
* 真ん中の1bitは**パケットを分割してよいか**どうかを表す(0なら分割が可能となり、1なら分割が禁止される)。
* 末尾の1bitは、**分割されたパケットの途中であるか、最後であるか**を示す(0なら分割された最後のフラグメントで、1なら後続のフラグメントが存在する)。


#### フラグメントオフセット(FO:Fragment Offset)[13]
　**分割されたフラグメントが元のパケットのどの位置にあったのか**を8オクテット単位で表す。


#### 生存期間(TTL:Time To Live)[8]
　パケットの生存時間を示す。実際には、**パケットが通過できるL3スイッチとルーターの数の合計値**を表していて、これらを一回通過するごとにTTLの値は1ずつ減算されていく。TTLの値が0になると、パケットは破棄される。これによって、パケットが永遠にネットワークに存在することを防止できる。


#### プロトコル[8]
　**上位層のプロトコル**を表す。例えば、ICMPなら1、TCPなら6、UDPなら17である。


#### ヘッダチェックサム[16]
　**IPヘッダのエラーを検知する**ために、IPヘッダの1の補数の和を表している。


#### 送信元IPアドレス[32]
　送信元IPアドレスが入る。


#### 宛先IPアドレス[32]
　宛先IPアドレスが入る。


#### オプション[可変長]
　通常は使用されないが、**デバッグやテストを行う**際は使用される。IPパケットが通過したルータのIPアドレスのログをとったり、ルーティング経路を指定できたりするらしい。4オクテット単位。


#### パディング[可変長]
　オプションを使用して**IPヘッダの長さが4オクテットの整数倍にならなかった場合**、4オクテットの倍数になるまで0で埋めて使用する。



# 参考
[QoS - IP Precedence（IPプレシデンス）とは](https://www.infraexpert.com/study/qos5.htm)
[QoS - DiffServモデルの処理フロー](https://www.infraexpert.com/study/telephony7.html)
[QoS - DSCP（Differentiated Services Code Point）とは](https://www.infraexpert.com/study/qos7.htm)
[TCP/IP - IPとは](https://www.infraexpert.com/study/tcpip1.html)
[IPv4ヘッダー ‐ 通信用語の基礎知識](https://www.wdic.org/w/WDIC/IPv4%E3%83%98%E3%83%83%E3%83%80%E3%83%BC)
[IPヘッダ - プログラミング探して！](http://program.sagasite.info/wiki/index.php?IP%E3%83%98%E3%83%83%E3%83%80)
[マスタリングTCP/IP](https://www.ohmsha.co.jp/tbc/text_series_0201.htm)
【CSS】自作CSSアニメーションで得た学びを３つ紹介する試み。

# 自作CSSアニメーションで得た学び
CSSを学習中の方向けに書いてみましたので読んでくれたら嬉しいです。

前提となってる記事はこれです。

https://qiita.com/yowatsuyoengineer/items/948676b8e3ad07717bc0

<font color='red'><b>　↑ 頑張ってイケメンなアニメーション作ったっちゃん。せっかくやけん見てってくれてもいいとよ。</b></font>

# CSSで役立つテクニック
## ①要素の位置指定は「absolute＆transform」が使いやすい。
::: note
「position:absolute」で他要素に干渉されない状態にし、「transform: translate(Xpx,Ypx)」で位置を指定するという理屈。
:::

↓文字じゃよく分からんのでコードで
```doubleLaser.html
    <div class="container">
        <div class="background"></div>
        <div class="background2"></div>
        <div class="laser"></div>
        <div class="laser2"></div>
    </div>
```
```doubleLaser.css
.container {
  position: relative;
  width: 100%;
  height: 100%;
  display: flex;
  justify-content: center;
  align-items: center;
}
.background {
  position: absolute;
  rotate: 0deg; /* レーザーの角度を指定 */
  animation-name: firstBackgroundEffect;
  animation-duration: 0.4s;
  animation-fill-mode: forwards;
}
.background2 {
  position: absolute;
  rotate: 0deg; /* レーザーの角度を指定 */
  animation-name: secondBackgroundEffect;
  animation-delay: 0.5s;
  animation-duration: 0.2s;
  animation-fill-mode: forwards;
}
.laser {
  width: 1px;
  height: 1px;
  rotate: 0deg; /* レーザーの角度を指定 */
  animation-name: firstLaserEffect;
  animation-duration: 0.8s;
  animation-fill-mode: forwards;
}
.laser2 {
  position: absolute;
  width: 1px;
  height: 1px;
  rotate: 0deg; /* レーザーの角度を指定 */
  animation-name: secondLaserEffect;
  animation-duration: 0.4s;
  animation-delay: 0.5s;
  animation-fill-mode: forwards;
}
```
containerの子要素は縦横中央寄せになっています。
その子要素にposition:absoluteを付けることで、他子要素に干渉をされない状態にします。
その状態でtransformで位置を変えることで他要素に関係なく場所を指定できるワケですね。

## ②両端がとがった直線はradial-gradientで描ける
![1666894745309.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1311883/8cea5133-c46b-a86e-b761-0734702abb19.jpeg)
こういう直線です。

```html
<span class="thin-border"></span>
```
```css
.thin-border {
  height: 4px;
  width: 400px;
  background-color: white;
  background: radial-gradient( white 30%, transparent 60%);
}
```
これをアニメーションで動かせば超クールなスペシャルレーザー直線作れまふ。カッコいいから見てください。

## ③「animation & ＠keyframe」しか勝たん
アニメーションを作るには「transition」も使えますが「animation & ＠keyframe」を使っておけば大体のアニメーションは書けます。

「transition」か「animation & ＠keyframe」どっち使おうか<font color='red'><b>迷うぐらいだったらとりあえず「animation & ＠keyframe」使うといいかもしれません。</b></font>

## おまけ
アニメーションの開始遅延は「animation-delay」ではなく<b>JavaScriptの「setTimeout()でクラスの付与を遅らせる」</b>というやり方が楽でした。

::: note
おすすめポイント
<b>元あるCSSに手を加えずに</b>アニメーションを遅らせることができる点です。
CSSにアニメーション色々書いてたらanimation-delayを書く場所を探すの面倒だったり、CSSをいじったことによる思わぬ挙動をを回避できるのがメリットかなーと思ったり思わなかったり。

デメリットあるかもしれんけん、よーと考えて使いーね。
:::

# おわりに
両端が尖った直線はクールなサイトに使える。
なんか厨二病が再発したのでCSSで超カッコいい(当社比)レーザーエフェクトを5つ作った。

<font color='red'><b>！？！？！？！？！？！？！？！？！？！？！？！？！？！？！？</b></font>
![メッ〇ールをデリート.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1311883/e4796a09-9d78-bb43-8412-c1701e3271dd.gif)
※@Yametaroさんの[「ティウンティウンCSS」](https://qiita.com/Yametaro/items/114301213ee525c096b5)と組み合わせてます。<br>
<b>
※レーザーエフェクトのソースコードは<font color='red'>一番下にGitHubのリンク</font>で貼っています
</b>

# 概要
本記事は<b>レーザーエフェクトの紹介だけ</b>の記事です。
学びについてはコチラの記事に書いてます。


https://qiita.com/yowatsuyoengineer/items/8a370f27fe1ffd393268


CSSを学習中の方向けに書いてみましたのでご覧頂けたら嬉しいです！

# 対象読者
・スタイリッシュなレーザーエフェクトが欲しい人

# レーザーの紹介（全5つ）
返信欄に5つ動画載せてますので、気に入ったのがあればソースコードをクローンしてお好きに使用してください。

https://twitter.com/Likeagorira/status/1585853659350388736?s=20&t=VMxHjKeFh6o6GVtE5a4tyQ

# 余談
ちなみにワタクシ、ロックマンはロックマンエグゼ派です。
工事のおっさんは某ヘルメット被ったウイルスと見立てています。

![メッ〇ールをデリート.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1311883/e4796a09-9d78-bb43-8412-c1701e3271dd.gif)
最初の一本目のレーザーでデュクシってなるとこがきもちえーですわ。おーん^^

# 終わりに
ティウンティウンCSSのコードはQiita利用規約（第7条3項及び4項）に則って利用させていただきました。

レーザーエフェクトのソースコードはコチラ

https://github.com/gorimatyan/CooooooolEffect

@Yametaro さんの記事はコチラ

https://qiita.com/Yametaro/items/114301213ee525c096b5
【Xcode】Simulatorで簡単に画面録画する方法

Xcode シミュレーターの画面録画を簡単に行う方法です。
ググるとコマンドを使う方法が上位に上がりますが、コマンドは使わずとも画面収録はできます。

### 1. Simulatorを起動する。

### 2. Altキーを押しながらキャブチャアイコンを押す。
![screenshot 2022-10-28 13.25.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140048/4f191ad9-6dec-5054-dc46-402f8e7bdb54.png)
クリックと同時に録画開始されます。
録画終了したいタイミングでまたアイコンをクリックします。

### 3. 録画されたファイルを確認。
保存先を指定していなければデスクトップに保存されます。

以上になります。
MinecraftのJSON形式をわかりやすく知りたい

# JSON形式をわかりやすく知りたい
## 目的
JSON形式の説明ってわかりにくくないですか、いや自分がバカなだけかもしれないんですが・・
自分の忘備録に、最低限JSONが分かるようになろうという記事です。
### JSONについて
JSONとは、JavaScriptObjectNotationの略だそうです。
データの保存形式のひとつ。
特徴としては**見やすい**、**アクセスしやすい**があると思います。
私はMinecraftのNBTデータタグ用に覚えましたが、ちょっと苦労したので今どう思考を整理しているのかを書いておきます。
### JSONとはデータの住所！
```{Key:value}```
キーと値の組み合わせである・・というのが教科書的な説明・・。
個人的にはあまりわかりやすいとも言えないので**住所**と**お家**の関係と捉えると良いと思います。
また通常、
```{a:{name:house1},b:{neighbor:house2}}```
このようなJSONは整形して
```json
{
	"a": {
		"name": "house1"
	},
	"b": {
		"neighbor": "house2"
	}
}
```
のように見ると見やすい・・！
この時に、住所として捉えるのはどういうことかというと
a→nameに問い合わせると``"house1"``というデータが帰ってくるということです。
もちろん、b→neighborに問い合わせれば``house2``
これはPythonのDict形式にも使われています(どっちが先かは知らん)。
Minecraftのnbtデータタグは整形されずに出力されるのでめっちゃ見づらいですが、本質は一緒です。
どのように問い合わせるか、形式はその言語によって多分違いますが、NBTデータタグでは``a.name``のようにパスを.で区切ります。
【PHP】strtotime('+1 month')で次月を求める時には注意が必要

# はじめに
`strtotime('+1 month')`を使用して下記のようなプログラムを書いた。

```php
$date = "2022-01-31";
var_dump(date('Y-m', strtotime($date.'+1 month'))); // 2022-03
var_dump(date('Y-m', strtotime($date.'+2 month'))); // 2022-03
var_dump(date('Y-m', strtotime($date.'+3 month'))); // 2022-05
```
ただ、月の日数関係で次月をうまく取得することができなかった…

# 結論
月に必ず存在している1日を指定することで解決！
```php
// 解決策1
var_dump(date('Y-m', strtotime(date("Y-m-01").'+1 month')));

// 解決策2
var_dump(date('Y-m', strtotime('first day of next month')));
```

# 参考文献

https://www.php.net/manual/ja/function.strtotime.php
[Spring Boot] SQLの実行時間をアノテーションをつけるだけで計測できるようにする

# Repositoryに定義した関数の実行時間とかをログに出力したくなった
今回は開発中にDBへアクセスしている関数やそれにかかわる関数の実行時間を知りたいというシーンがあり、確認したい関数全部に開始時刻をとって終了時刻をとって計算するコードを追加する。。。。などという面倒な実装はしたくなかったため、何かスマートな実装はないものかと考えました。

# 独自に定義したアノテーションが付与されている関数にだけ関心を持つAdviceを実装して実現する

##### まずはアノテーションを定義する
``` CheckLog.java
package com.example.app;

import java.lang.annotation.ElementType;
import java.long.annotation.Target;

// メソッドに付与するアノテーションを定義
@Target(ElementType.METHOD)
public @interface CheckLog {

}
```

##### Adviceの実装

``` AspectComponent.java
package com.example.app;

import org.aspectj.lang.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.ProceedingJoinPoint;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class AspectComponent {
    
    @Around("@annotation(com.example.app.CheckLog)")
    public Object around(final ProceedingJoinPoint joinPoint) throws Throwable {
        String className = joinPont.getSignature().getDeclaringType().getSimpleName(); // クラス名
        String methodName = joinPoint.getSignature().getName(); // メソッド名

        long startTime = System.currentTimeMillis();
        Object retval = joinPoint.proceed();
        long endTime = System.currentTimeMillis();
        
        System.out.println("className={}, methodName={}, {}ms", className, methodName, startTime - endTime);
        return retval;
    }
}
``` 

重要なのがこの部分
```java
@Around("@annotation(com.example.app.CheckLog)")
```
先ほど定義したアノテーションがついている関数の前後に、この後定義しているaroundメソッドの処理を適用するようにしています。
このポイントカット指定子を書き換えることで、あるクラスに定義されているメソッドすべてに適用するなどアドバイスのジョインポイントを変更することができます。

詳しくは以下の記事が参考になりました。

https://qiita.com/rubytomato@github/items/de1019aeaaab51c8784d#annotation

ここまでを追加すると、Repositoryで定義している関数に@CheckLogというアノテーションをつけるだけでその関数が呼ばれたときに実行時間を計測してログを出すことができます。

当然Serviceなどに定義した関数にもこのアノテーションは付けることができるので、SQLの実行にかかった時間以外にも計測することができます。


## 参考資料
https://www.docswell.com/s/MasatoshiTada/Z818E5-spring-di-aop-for-every-developers#p63

https://qiita.com/rubytomato@github/items/de1019aeaaab51c8784d

http://teqspaces.com/Spring/9

##### 蛇足
Stream apiを使ったツイートが上から下に流れないタイプのTwitterクライアントを開発しています。
ぜひ使ってみてください。

https://newtwitterclient.azurewebsites.net/
【Rails】ActiveRecordを継承しないモデルのバリデーションはActiveModel::Modelをincludeしよう

## 環境
Rails 6.0.1
Ruby 2.6.3
PostgreSQL 11.16


## NGパターン

Parameter層（ActiveRecordを継承しないモデル）で、独自で必須のバリデーションメソッドをつくらない。

```ruby
module Parameters
    class PostParameter
      attr_reader :params
    
      def initialize(params)
        permitted_params(params)
        validate!
      end
    
      def attributes
        {
          title: params[:title],
          content: params[:content]
        }.compact
      end
    
      private
    
      def validate!
        if params[:title].blank? || params[:content].blank?
          raise ActionController::BadRequest, '必須項目が入力されていません'
        end
      end
    end
end
```

## OKパターン
```ActiveModel::Model```をincludeすることでバリデーションできる。

```ruby
module Parameters
    class PostParameter
      include ActiveModel::Model

      attr_accessor :title,
                    :content,
      validates :title,
                :content,
                presence: true

      def attributes
        validate!
        {
          title: title,
          content: content
        }.compact
      end
    end
end
```
例としてわかりやすいようにしてるのでこれだけのバリデーションだけならパラメーター層にしなくても良さそうだが、パラメータ層ではやるとしても、フロントから渡された値の形式が正しいか（正しいメールアドレスの形式か）など、型が正しいかなどのフォーマットに関するバリデーションに留めた方が良い。
そうしないとパラメータオブジェクトの責務を超えてしまう。

```ruby
module Api
  class PostsController < Api::ApplicationController
    def create
      notification_params = Parameters::PostParameter.new(permitted_params)
      current_user.create_post(notification_params)
      ...
    end

    private

    def permitted_params
      params.permit(
        :title,
        :content,
      )
    end
  end
end
```

## 参考

https://qiita.com/kat0/items/9a5d9a23dce0df4531e3
【データ基盤構築/BigQuery】文字列の前後の空白を除去するに、TRIM関数を使用する

# 今回の課題
SQLで文字列を分解していたところ、
余計な空白が入ってしまった。

余計な空白を除くために、TRIM関数を使用してみた。

## TRIM関数とは
>トリミングする STRING 値または BYTES 値を取ります。
>トリミングする値が STRING の場合、この値から set_of_characters_to_remove の先頭と末尾の Unicode コードポイントをすべて削除します。コードポイントのセットは省略可能です。指定しない場合、トリミングする値の先頭と末尾からすべての空白文字が削除されます。
トリミングする値が BYTES の場合、この値から set_of_characters_to_remove の先頭と末尾のバイトをすべて削除します。バイトのセットは必須です。
--https://cloud.google.com/bigquery/docs/reference/standard-sql/string_functions#trim

つまり、指定した文字列の、先頭と末尾のUnicodeコードポイントを除去できる関数。
Unicodeコードポイントを指定しなければ、空白が除去される。

# 具体例
## 文字列の前後に空白が入る失敗例
#### 1)下記のテーブルを用意する
|contents_title|page_title|
|:-:|:-:|
|ドラゴンボールZ|ドラゴンボールZ　1話|
|ドラゴンボールZ|ドラゴンボールZ　2話|
|ドラゴンボールZ|ドラゴンボールZ　3話|

#### 2)上記のテーブルに下記のクエリを使用して、話数を別カラムに抽出する
```SQL
select
    contents_title
    , page_title
    , replace(page_title, contents_title, "") as episode_number --話数を別カラムで抽出
from
    `テーブル名`
```

episode_numberの文字列の前に、全角の空白が入ってしまった状態の下記のデータが出力される。
|contents_title|page_title|episode_number|
|:-:|:-:|:-:|
|ドラゴンボールZ|ドラゴンボールZ　1話|(全角スペース)1話|
|ドラゴンボールZ|ドラゴンボールZ　2話|(全角スペース)2話|
|ドラゴンボールZ|ドラゴンボールZ　3話|(全角スペース)3話|

## 空白を除く方法
#### 1)下記のテーブルを用意する
|contents_title|page_title|
|:-:|:-:|
|ドラゴンボールZ|ドラゴンボールZ　1話|
|ドラゴンボールZ|ドラゴンボールZ　2話|
|ドラゴンボールZ|ドラゴンボールZ　3話|

#### 2)上記のテーブルにTRIM関数を組み込んだ、下記のクエリを実行する

```SQL
select
    contents_title
    , page_title
    , trirm(replace(page_title, contents_title, "")) as episode_number --話数を別カラムで抽出
from
    `テーブル名`
```
結果、episode_numberの文字列の前の空白を除去することができた。
|contents_title|page_title|episode_number|
|:-:|:-:|:-:|
|ドラゴンボールZ|ドラゴンボールZ　1話|1話|
|ドラゴンボールZ|ドラゴンボールZ　2話|2話|
|ドラゴンボールZ|ドラゴンボールZ　3話|3話|

以上で今回の課題を解決することができた。
【Scheduler】Sending message to Microsoft Teams (ChannelLink:Advanced)

In [Basic](https://qiita.com/Miki_Yokohata/items/f70ffac16b52417a1404), We used the **Basic** option to send plain text, but this time we will use the **Advanced** option.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/c69e2a08-c935-6402-74ec-bd4213848f76.png)
Duplicate and edit the task created in **Basics**. It will save you a lot of time.
With the task created in **Basics** selected in the scheduler, select `Clone` from the right-click menu.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/08fd9fdc-3abe-8321-d4a3-9e5a975bdcaa.png)
Open the cloned task. On the `General` tab, edit the **Description** etc. as necessary.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/c13fec87-41fd-3073-2f59-516724265547.png)
In the `Actions` tab, the `Connection` uses **Channel Link** as is.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/aebdf3c0-39dc-4468-c745-b79dcdd7d890.png)
Change `Method` to **Advanced**. Enter the following code in the `POST Content` field.
```
{
 "subject": "Testing Channel Link:Advanced",
 "importance": "Normal",
 "body": {
  "contentType": "html",
  "content": "<p>write message here</p><br><a href='https://www.sharperlight.com/'>Sharperlight Home</a>"
 }
}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/d4104453-9878-3908-c8fb-ef828011cfc1.png)
Save the task with the `OK` button and select `Execute` from the right-click menu.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/97ee7713-51ae-74e1-84ec-f3a14c38172d.png)
The task has been executed and a message has arrived in the specified channel in Teams.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/93f36756-c1e1-3417-a5bf-dc5f944bf434.png)

Thank you for reading.
【スケジューラ】Microsoft Teamsにメッセージを送ってみる（Channel Link:上級編）

[基礎編](https://qiita.com/Miki_Yokohata/items/278e8b3bbb3a30ea2722)では**基本**オプションを利用してプレインテキストを送信しましたが、今回は**高度な設定**オプションの方は使用してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/9ae4e2a4-2249-e0ee-8ce9-ea4c31e5ce8c.png)
**基礎編**で作成したタスクを複製して編集します。大幅な時間短縮になります。
スケジューラで**基礎編**で作成したタスクを選択した状態で、右クリックメニューから`複製`を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/6485e8f6-2ffe-9fd0-a51c-188f08a38a55.png)
複製されたタスクを開きます。`一般`タブでは必要に応じて**説明**等を編集します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/b5eac9ec-fddc-4d8f-5029-b3ed80c26082.png)
`アクション`タブでは、`接続`はそのまま**チャンネルリンク**を使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/8e5ff264-deef-d0db-036b-0cec04ba4446.png)
`メソッド`を**高度な設定**に変更します。`POSTの内容`フィールドに以下のコードを記入します。
```
{
 "subject": "チャンネルリンクの試験：上級編",
 "importance": "Normal",
 "body": {
  "contentType": "html",
  "content": "<p>メッセージはここですよ</p><br><a href='https://www.sharperlight.com/'>Sharperlight Home</a>"
 }
}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/fd2473a2-6fe0-d6f8-28ba-0cedc6fb3480.png)
`OK`ボタンでタスクを保存し、右クリックメニューから`実行`を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/656a8159-7f84-2cd2-1ed5-db4197a8d1e0.png)
タスクが実行され、Teamsの指定したチャンネルにメッセージが届きました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/ae5af656-9bda-e8dc-da65-4e1b412875f6.png)

では、失礼します。
LINUX シェル作成基礎



【初心者向け】シェルスクリプトの作り方
https://qiita.com/Lambda34/items/7d24ebe6f7bde5bedddc

ディレクトリについて"相対パスとはショートカットのようなもの"
https://atmarkit.itmedia.co.jp/ait/articles/1604/08/news019_2.html

コマンドのフルパスを表示するコマンド"which"
https://atmarkit.itmedia.co.jp/ait/articles/1703/16/news020.html
組み合わせを数字に変換する

こんにちは、キャベツです。
検索の高速化をする際に組み合わせを数字に変換したくなったので、まとめます。

# 似たような条件での検索を高速化したい

例えば、こんなテーブルを考える(縦H行, 横W列)

|  sex  |  bloodtype  | birthplace  | x |
| ---- | ---- | ---- | ---- |
|  M  |  A  | Hokkaido  |1|
|  M  |  B  |  Hokkaido  |1.2|
|  M  |  A  |  Aomori  |1.5|
|  ...  |  ...  |  ...  |...|
|  F  |  A  |  Hokkaido  |1.1|
|  ...  |  ...  |  ...  |...|
|  F  |  AB  |  Okinawa  |1.4|

これに対して、$Q$個のクエリが与えられる。
$i$番目のクエリ$q_i$では、生物学的性別$S_i$、血液型$BL_i$、出身$BP_i$が与えられる。
与えられた条件に対応した$x$を出力したい。

愚直に毎回検索をかけると、1クエリにつきテーブルの列数分計算が必要なため、かなり遅い($O(QHW)$)。
そのため、クエリの条件を数字に変換して、愚直な検索を行わないようにする。

やることは3つ
1. 条件→数字の対応式を作る。
1. テーブルの条件に番号をふり、ソートする。
1. クエリを処理する。

## 条件→数字の対応式を作る。
今回の条件では、sexが2種類、blood typeが4種類、birthplaceが47種類存在するため
都合$2\times4\times47 = 376$行存在する。
**まず、それぞれのカテゴリを数値に変換する。**

|sex|number|
|----|----|
|M|0|
|F|1|

|bloodtype|number|
|----|----|
|A|0|
|B|1|
|O|2|
|AB|3|

|birthplace|number|
|----|----|
|Aichi|0|
|Akita|1|
|...|...|
|Yamanashi|46|

次に、**条件の組を数字に変換する**。
ここがポイント。

一旦2進数$\rightarrow $10進数に思いを馳せる。
例えば、$1001_{(2)}$は、10進数で$9$である。
これを表にすると、
|桁数|number|かける数|10進数|
|----|----|----|----|
|$1$|$1$|$1$|$1\times 2^0$|
|$2$|$0$|$2^1$|$0\times 2^1$|
|$3$|$0$|$2^2$|$0\times 2^2$|
|$4$|$1$|$2^3$|$1\times 2^3$|

ここで、かける数が2に増えていくことに着目してほしい。
一方で、今回の条件の組を同じようにまとめると、

|カテゴリ|条件|number|かける数|10進数|
|----|----|----|----|----|
|sex|F|$1$|$1$|$1\times 1$|
|bloodtype|B|$1$|2|$1\times 2$|
|birthplace|Akita|$1$|$2\times 4$|$1\times 2\times 4$|

となり、(F, B, Akita) $=(1\times 1) + (1\times 2) + (1\times 2\times 4) =11$と変換される。



重要なのはかける数の変遷であり、
**直前のカテゴリ数だけ倍増していくことだけ覚えてほしい。**

すなわち、
sexのカテゴリ数は2、bloodtypeのカテゴリ数は4、birthplaceのカテゴリ数は47。
なので、
sexの桁にかける数は$1$
bloodtypeの桁にかける数は$2$(sexのカテゴリ数)
birthplaceの桁にかける数は$2\times 4$(sexのカテゴリ数$\times$bloodtypeのカテゴリ数)
となる。

## テーブルの条件に番号をふり、ソートする
全通り番号をふる。
|ID|sex|bloodtype|birthplace|x|
|----|----|----|----|----|
|0|M|A|Aichi|1|
|1|F|A|Aichi|1.1|
|...|...|...|...|...|
|375|F|AB|Yamanashi|1.4|

こうすれば、条件から検索抜きで位置を指定できる。

あとはクエリを数字に変換して、その行のxを出力すればよい


# k-merを数字に変換する
k-mer とは、長さ$k$の塩基配列のことである。
ここまで読んだら、k-merを数字に変換することなどいとも容易いだろう。
説明のため、$6$-merである、を例にする。

まずは、数字に対応付ける。

|Base|number|
|----|----|
|A|0|
|T|1|
|C|2|
|G|3|

変換する（例えば、ATCGAT）

|Base|number|かける数|10進数|
|----|----|----|----|
|A|$0$|$1$|$0\times 1$|
|T|$1$|$4$|$1\times 4$|
|C|$2$|$4^2$|$2\times 4^2$|
|G|$3$|$4^3$|$3\times 4^3$|
|A|$0$|$4^4$|$0\times 4^4$|
|T|$1$|$4^5$|$1\times 4^5$|

よって、ATCGAT $= 1252$。

次回は、この逆
**数字を組み合わせに変換する**
を書きます。
JavaのComparatorのreversedメソッドについて誤解していた

### × reversed() を付けた comparing() だけ逆順になる

```Java
list.stream()
    .sorted(Comparator.comparing(Element::key1)
        .thenComparing(Element::key2).reversed()
        .thenComparing(Element::key3));
```

この場合、ソートとしては以下の形になると思っていた。

1. key1 の **昇順**
1. key1 が同じ場合は key2 の 降順
1. key2 も同じ場合は key3 の 昇順

実際は reversed() を付けた対象以前のものが逆順になるため

1. key1 の **降順**
1. key1 が同じ場合は key2 の 降順
1. key2 も同じ場合は key3 の 昇順

となる。
key1 の昇順 > key2 の降順 というソートをしたい場合は下記のようになる。

```Java
list.stream()
    .sorted(Comparator.comparing(Element::key1)
        .reversed() // 逆順の逆順にする (元に戻す)
        .thenComparing(Element::key2)
        .reversed()); // 逆順にする
```

### 動作確認

```Java
public class Sample {
	public static void main(String[] args) {
		List<Model> model = new ArrayList<>();
		model.add(new Model("model1", 1, 2, 2, 1, 1));
		model.add(new Model("model2", 1, 2, 2, 2, 1));
		model.add(new Model("model3", 1, 2, 2, 2, 2));
		model.add(new Model("model4", 1, 2, 1, 1, 1));
		model.add(new Model("model5", 1, 1, 1, 1, 1));
		model.add(new Model("model6", 2, 1, 1, 1, 1));

		model.stream()
				// key1 の降順 > key2 の昇順 > key3 の昇順 > key4 の降順 > key5 の降順
				.sorted(Comparator.comparing(Model::getKey1)
						.reversed()
						.thenComparing(Model::getKey2)
						.thenComparing(Model::getKey3)
						.reversed()
						.thenComparing(Model::getKey4)
						.thenComparing(Model::getKey5)
						.reversed())
				.forEach(System.out::println);
	}
}

@Data
@AllArgsConstructor
public class Model {
	private String name;
	private int key1;
	private int key2;
	private int key3;
	private int key4;
	private int key5;
}
```

実行結果
```
Model(name=model6, key1=2, key2=1, key3=1, key4=1, key5=1)
Model(name=model5, key1=1, key2=1, key3=1, key4=1, key5=1)
Model(name=model4, key1=1, key2=2, key3=1, key4=1, key5=1)
Model(name=model3, key1=1, key2=2, key3=2, key4=2, key5=2)
Model(name=model2, key1=1, key2=2, key3=2, key4=2, key5=1)
Model(name=model1, key1=1, key2=2, key3=2, key4=1, key5=1)
```

### あとがき

よくよく考えたらメソッドチェーンで繋いでいるんだから当然のように思います。
きちんと調べずにふわっとした理解のままでいるとよくないということを再認識して反省する良い機会でした。

# 追記：thenComparing() に渡す際に逆順の Comparator を指定すればよい

コメントにて thenComparing() に逆順の Comparator を渡した方が読みやすいというアドバイスをいただきました。
ありがとうございます。

```Java
model.stream()
		// key1 の降順 > key2 の昇順 > key3 の昇順 > key4 の降順 > key5 の降順
		.sorted(
			comparing(Model::getKey1).reversed()
					.thenComparing(Model::getKey2)
					.thenComparing(Model::getKey3)
					.thenComparing(comparing(Model::getKey4).reversed())
					.thenComparing(comparing(Model::getKey5).reversed())
		)
		.forEach(System.out::println);
```

`.thenComparing(Model::getKey5).reversed()` と 
`.thenComparing(comparing(Model::getKey5).reversed())` は動作が異なることを注意点として覚えておかなければならないですね。
(知らなければ私のように「上の書き方で良くない？」となってバグを生むことでしょう。。)
GoToEatで学ぶgoto文

## コード

### GoToEat使った場合

```php:goto_eat.php
<?php
echo("よーし、GoToEatで安くご飯を食べるぞー！\n");
$price = 3000;
goto Eat;

Eat:
$price = 1000;

Finish:
echo("こちらのご飯は{$price}円です\n");
```
↓結果
```
よーし、GoToEatで安くご飯を食べるぞー！
こちらのご飯は1000円です
```

### GoToEat使わなかった場合

```php:normal_eat.php
<?php
echo("よーし、GoToEatで安くご飯を食べるぞー！\n");
$price = 3000;
goto Finish;

Eat:
$price = 1000;

Finish:
echo("こちらのご飯は{$price}円です\n");
```
↓結果
```
よーし、GoToEatで安くご飯を食べるぞー！
こちらのご飯は3000円です
```

GoToEatを使った方がお安くなった。

## 練習問題

次の結果、ご飯はいくらになるでしょう？
```php:goto_eat_problem.php
<?php
echo("よーし、GoToEatをいっぱい使って安くご飯を食べるぞー！\n");
$price = 10000;

Use1:
goto Eat1;
Use2:
goto Eat2;
Use3:
goto Eat3;
Use4:
goto Finish;
goto Eat4;
Use5:
goto Eat5;

Eat1:
$price -= 100;
goto Use5;
Eat2:
$price -= 200;
goto Use4;
Eat3:
$price -= 300;
goto Use2;
Eat4:
$price -= 400;
goto Use1;
Eat5:
$price -= 500;
goto Use3;

Finish:
echo("こちらのご飯は{$price}円です\n");
```

<details><summary>答え</summary>
8900円
</details>

## おまけ

```php:if_eat.php
<?php
echo("よーし、GoToEatで安くご飯を食べるぞー！\n");
$price = 3000;
$GoToEat = true;
if($GoToEat){
    $price = 1000;
}
echo("こちらのご飯は{$price}円です\n");
```
↓結果
```
よーし、GoToEatで安くご飯を食べるぞー！
こちらのご飯は1000円です
```

```php:switch_eat.php
<?php
echo("よーし、GoToEatで安くご飯を食べるぞー！\n");
$price = 3000;
$GoToEat = true;
switch($GoToEat){
    case true:
        $price = 1000;
        break;
}
echo("こちらのご飯は{$price}円です\n");
```
↓結果
```
よーし、GoToEatで安くご飯を食べるぞー！
こちらのご飯は1000円です
```