OmniAICreator/Qiita-1.07M huggingface dataset:
AWS 5冠達成後にクラウドプラクティショナーを受けてみた

こんにちは。パエリアです。

今回はAWS 5冠取得した後、Specialty取得前にクラウドプラクティショナーを受けてきましたので、そのレビューをしていきたいと思います。

AWSを勉強し始めて、これから資格取得を考えている人や、上位資格を持っているし、今更クラウドプラクティショナーを受けるのもなーと考えている人の参考になればと思います。

## まずは簡単に試験の概要
https://aws.amazon.com/jp/certification/certified-cloud-practitioner/

AWS クラウドプラクティショナーを受験する方として下記のような方を対象としています。

* AWS クラウドに 6 ヶ月間触れている
* IT サービスのベーシックな知識と、AWS クラウドプラットフォームにおけるそれらのサービスの使用に関するベーシックな知識がある
* AWS のコアサービスとユースケース、課金、料金モデル、セキュリティコンセプト、クラウドがビジネスに与える影響についての知識がある

試験内容としては実務経験がまったく無くてもしっかり勉強すればそれほど難しくない内容の試験でした。
私はSAA,SOA,DVA,SAP,DOPを取得後の受験でしたが、結果的に勉強なしでも受かったかと聞かれるとぎり受かるかも？くらいの難易度でした。（点数は高くありませんでしたが（汗））
## 試験結果
合格（796/1000）

## 試験対策
### 勉強時間
8時間くらい（3日間）
###勉強方法
・Udemy
【2022年版】この問題だけで合格可能！AWS 認定クラウドプラクティショナー 模擬試験問題集（7回分455問）
→この講座の①②③④を2週ずつしました。⑤は時間がなくてできませんでした。
③と④は（おそらく⑤も）難しすぎです。そして、試験に出ない問題が半分くらいです。
試験対策としては①②だけでも全然よかったなと思いました。

・参考書
一夜漬け AWS認定クラウドプラクティショナー 直前対策テキスト
→購入前の本を持ち込める系のカフェで一読しました。

(備考)
今回有名なコイワクラブさんを利用しませんでしたが、他の方のレビューを見るとコイワクラブさんが一番レベル感が近いのかもしれません。

## 試験内容について
大きく分けると

* AWS Well-Architected Framework
* 責任共有モデル
* 料金系サービス
* AWSの主要サービス（EC2,ELB,RDS,S3,ELB,AutoScaling,DynamoDBとか）

の範囲が多かったかなという内容でした。
料金系のサービスについては他の試験でもそれほど多くは出題されないので、このタイミングで勉強するのは良いと思います。
また、全体的には内容的にもひっかけ問題もないし、こんな問題出すの？って内容もないし、聞いたことないサービスも出ませんでした。
入門者用の参考書でしっかり勉強すれば全然難しい試験ではないと思いました。

## クラウドプラクティショナー試験を受けた方がいいのか
私はAWS ソリューションアーキテクトアソシエイト（以下SAA）から受験しました。
しかし、初めてAWSの資格を取得する方はクラウドプラクティショナー（以下CLF）からをお勧めします。
理由は大きく3つです。

1.単純に難易度が低いため
2.試験環境に慣れるため（IT試験の練習のため）
3.合格することで次回受験の半額クーポンをもらえるため

1.
SAAとCLFの難易度の差は体感1/2くらいだと思います。
これは個人的な意見なので参考程度にと思っていただければと思いますが、SAAだとサービスの概要だけでなく、仕様についても多く聞かれます。しかし、CLFだとサービスの大まかな概要やそもそもクラウドってどんなものかということが重点的に聞かれます。
私はSAA受験前にクラウドについての資格を1つ取得していたのでよかったですが、あまりクラウドについて知らない人はまずはCLFが順当だと思います。

2.
私は今まで何度もIT資格を受験してきたので、受験センターの雰囲気やCBT(Computer Based Testing)方式にも慣れていますが、初めてIT資格を取得しようとしている人は、この環境に戸惑うことも多いと思います。目指すべきSAA（もしくはSAP）に向けて、まずは簡単な試験で環境に慣れてみましょう。

3.
これは初めは意外と知らない人が多いと思いますが、AWS認定試験は合格するといくつか特典をもらえます。
そのうちの一つに次回受験の半額クーポンがあります。
CLFはAWS認定試験の中では一番安く税込12100円です。
次に受けるであろうSAAは税込16500円なので、CLF合格後にこの半額クーポンを使うと約8000円お得にSAAを受験することができます。
つまり、実質CLF受験にかかるお金は4000円弱なので色々お得です。

また、すでにいくつかAWSの資格を取得している人も、どうせ最後には取得することになると思うので、早めに取っておいてもいいのかなと思います。

## 受験してみての感想
内容的にはSAAの分野を簡単にした印象でした。
私はSAAを取得してからは2年くらいたっていて、使えなくなっているサービスや新しいサービスがあったので、勉強していて面白かったです。（Snowball(無印)が現在は推奨されていないことにはびっくり）

これで一応6冠達成して、今後はSpecialtyを受験するか悩みますが、しばらくは受験勉強というよりは実際にサービスを使ってみたり、今まで勉強した知識を深めたりする方向性にしようと思います。（そのうち受験するとは思いますが。）

以上、最後までご覧いただき、ありがとうございました。
【JavaScript関数ドリル】Lodash関数の実装【勉強用】_.slice関数



#【JavaScript関数ドリル】初級編の_.slice関数の実装のアウトプット

       
```javascript:_.slice関数の挙動
console.log(slice([1, 2, 3, 4, 5], 0, 1));
// => [1]
console.log(slice([1, 2, 3, 4, 5], 0, 3));
// => [1, 2, 3]
console.log(slice([1, 2, 3, 4, 5], 2));
// => [3, 4, 5]
```
第1引数の位置から第2引数の数だけ取得する
第2引数が無い場合は末尾まで取得する
##_.slice関数の課題内容
https://youtu.be/KZaJoGJQSE4

##_.slice関数に取り組む前の状態
- 引数の有無に応じるにはif文を使えばよさそう

##_.slice関数に取り組んだ後の状態
- 引数の設定の仕方を理解できていなかった
- 遠回りした関数を作っていた
- 元の配列の保護を意識していなかった
- splice頼みになっていた
- 単純なことに時間をかけすぎた


##_.slice関数の実装コード

```javascript:
const slice = (array, start, end) => {
    const newArray = [];
    for (let i = start; i < array.length; i++) {
        if (!end) {
            newArray.push(array[i]);
        } else if (end) {
            return array.splice(start, end);
        }
    }
    return newArray;
}

console.log(slice([1, 2, 3, 4, 5], 0, 1));
// => [1]
console.log(slice([1, 2, 3, 4, 5], 0, 3));
// => [1,2,3]
console.log(slice([1, 2, 3, 4, 5], 2));
// => [3,4,5]
```



##_.slice関数の解答コード

```javascript:
function slice(array, start = 0, end = array.length) {
  const slicedArray = [];
  for(let i = start; i < end; i++) {
    slicedArray.push( array[i] );
  }

  return slicedArray;
}

const numbers = [10, 20, 30, 40, 50];
const slicedNumbers = slice(numbers, 1, 4);

console.log( slicedNumbers );
// => [20, 30, 40]

console.log( numbers );
// => [10, 20, 30, 40, 50]
```
Dockerfileに記載するCMD命令とdocker-compose.ymlのcommandの使い分け

## 概要
`Dockerfile`に記載する`CMD`命令と`docker-compose.yml`に記載する`command`の使い分けが曖昧で
自分なりに調べたのでメモとして残しておきます。
なお、`Docker`について詳しく知りたい場合は下記公式ドキュメントを参照してください。
[Docker公式ドキュメント](https://docs.docker.jp/)

## DockerfileのCMD命令とは
`CMD`とは`Dockerfile`に記載できる命令のひとつです。`docker run`でコンテナを起動した際に
コンテナで実行したいコマンドを記載することができます。

### コード例
_*Dockerfile*_

```dockerfile
FROM ruby:3.0.3
# 省略
CMD ['bundle', 'exec', 'rails', 's', '-p', '3000', '-b', '0.0.0.0']
```
これはrailsを起動し、外部からの通信を許可し3000番ポートで待ち受けるコマンドです。

## docker-composeのcommandとは
`command`は`docker-compose.yml`で記載でき、`docker-compose up`でコンテナを起動した際に
実行したいコマンドを記載するところです。

### コード例
_*docker-compose.yml*_

```yml
web:
  # 省略
  command: bundle exec rails s -p 3000 -b '0.0.0.0'"
```

## 疑問点
`docker-compose`を使っているときは
`docker-compose.yml`と`Dockerfile`どっちに実行コマンドを記載するのがいいのだろうか。

## 結論
`docker-compose.yml`に記載すればいいです。
`docker-compose.yml`に実行コマンドを記載した場合、`Dockerfile`に記載されている`CMD`は無視されます。
よって基本的に`docker-compose.yml`にすべて記載する方向で間違いないと思います。

## まとめ
`docker run`で個別のコンテナに対してコマンドを実行する場合は、`Dockerfile`内に`CMD`を記載して、
`docker-compose`で複数のコンテナを管理している場合は`docker-compose.yml`に記載する。
Basic認証を実装する

目的
-
閲覧できるユーザーを制限するために、Basic認証を導入する。

Basic認証とは、HTTP通信の規格に備え付けられている、ユーザー認証の仕組み。
ユーザー名とパスワードを知っているユーザーのみが、アプリケーションを使えるように、制限をかけるために実装する。

1. Basic認証を導入する
-
① Basic認証の記述を、application_controller.rbに書く

Basic認証によるログインの要求は、全てのコントローラーで行いたい。
そのため、一まとめで命令できるよう、application_controller.rbに処理を記述する。

```
class ApplicationController < ActionController::Base


  before_action :basic_auth

  private

  def basic_auth
    authenticate_or_request_with_http_basic do |username, password|
      username == ENV["BASIC_AUTH_USER"] && password == ENV["BASIC_AUTH_PASSWORD"] 
    end
  end


end
```

以上のように、「username == ENV["BASIC_AUTH_USER"] && password == ENV["BASIC_AUTH_PASSWORD"] 」と環境変数を利用しているのは、不正にBasic認証を突破されないようにするため。

ユーザー名やパスワードをコードに直接記述し、公開リポジトリで管理すると、危険である！


② 開発環境に対して、環境変数を定義する

シェルと呼ばれるプログラムを用いて、環境変数を定義する。
シェルとは、「ターミナルとOSを繋ぐ窓口役」。
ターミナルから入力されたコマンドを読み取って、OSに対して指示を渡し、結果をターミナルに返して表示や実行などの動作をさせる。

　1.ターミナルでファイルを開く

```
% vim ~/.zshrc
```
　2.zshファイルに記述を追加する

そして、「iキー」を押して、INSERTモードにする。
zshの内部に、以下の記述を追加する。(今までの記述は消さない)

```
export BASIC_AUTH_USER='kumamon'
export BASIC_AUTH_PASSWORD='1234567'
```
 3.ファイルを閉じる

「escキー」→「:wq」→「Enterキー」

 4.内容を保存する

```
% source ~/.zshrc
```

③ 本番環境に対して、環境変数を定義する

 1.Heroku上で環境変数を設定する

```
% heroku config:set BASIC_AUTH_USER="kumamon"
% heroku config:set BASIC_AUTH_PASSWORD="1234567"
```
 2.設定できているかの確認

```
% heroku config


[結果]
=== stormy-journey-22625 Config Vars
BASIC_AUTH_PASSWORD:      kumamon
BASIC_AUTH_USER:          1234567
```
 3.コミット & Herokuへデプロイ

```
% git add .
% git commit -m "Basic認証を実装"
% git push heroku master
```
推薦システムのトレンド

# 目的
推薦システムやIRのトレンドについて調べたので結果をまとめておく



- [Recent Trends in Personalization: A Netflix Perspective](https://slideslive.com/38917692/recent-trends-in-personalization-a-netflix-perspective)
    - 2019年時点
- 言語モデル関連
    - 自然言語処理の分野で巨大な言語モデルが諸々のタスクで凄まじいパフォーマンスを出せることが分かった
    - 言語モデルのパワーを推薦や情報検索（IR）に使いたい！
    - Societal Biases in Retrieved Contents: Measurement Framework and Adversarial Mitigation of BERT Rankers (SIGIR 2021)
    - Leveraging Lead Bias for Zero-shot Abstractive News Summarization (SIGIR 2021)
    - Can Language Models Identify Wikipedia Articles with Readability and Style Issues?
    （ICTIR21）
- 反実仮想関連
    - データが得られたのってすごい狭い過去ですよね？
    - Counterfactual Data-Augmented Sequential Recommendation (SIGIR 2021)
    - CauseRec: Counterfactual User Sequence Synthesis for Sequential Recommendation (SIGIR 2021)
- bias
    - データから学習させる時にデータのbiasをどう対処していくか？
    - Causal Intervention for Leveraging Popularity Bias in Recommendation (SIGIR 2021)
    - Popularity-Opportunity Bias in Collaborative Filtering (WSDM 2021)
- grash構造の活用
    - 知識グラフを使うことで推薦がよりよくなる
    - Diagnosis Ranking with Knowledge Graph Convolutional Networks (ECIR 2021)
    - An Efficient Neighborhood-based Interaction Model for Recommendation on Heterogeneous Graph (KDD 2020)
    - Attentional Graph Convolutional Networks for Knowledge Concept Recommendation in MOOCs in a Heterogeneous View(SIGIR 2020)
- 説明性
    - 推薦の理由を知りたい
    - Interpretable Ranking with Generalized Additive Models (WSDM 2021)
    - Towards Axiomatic Explanations for Neural Ranking Models (ICTIR 2021)
【React】バリデーション付きフォーム

## はじめに
　本記事は、プログラミング初学者が、学習を進めていて疑問に思った点について調べた結果を備忘録も兼ねてまとめたものです。
　そのため、記事の内容に誤りが含まれている可能性があります。ご容赦ください。
　間違いを見つけた方は、お手数ですが、ご指摘いただけますと幸いです。

## バリデーション付きフォーム

`npm i react-hook-form`でreact-hook-formを導入

```.tsx

import React from 'react'
import { useForm } from 'react-hook-form'

const numberRegExp = /^[0-9]+$/

type FormState = {
  firstName: string
  lastName: string
  age: number
}

type Props = {}

export const Example2WithRHF: React.FC<Props> = () => {
  const { register, handleSubmit, reset, errors } = useForm<FormState>({
    mode: 'onChange',
    defaultValues: {
      firstName: '',
      lastName: '',
      age: 18,
    },
  })

  const onSubmit = handleSubmit((data) => {
    console.log(data)
  })

  return (
    <div>
      <form onSubmit={onSubmit}>
        <div className="flex-column">
          <span>first name</span>
          <input
            name="firstName"
            type="text"
            ref={register({
              required: '必須項目です',
              maxLength: {
                value: 20,
                message: '20文字以内で入力してください',
              },
            })}
          />
          <span className={styles['error-message']}>
            {errors.firstName?.message}
          </span>
        </div>
        <div className="flex-column">
          <span>last name</span>
          <input
            name="lastName"
            type="text"
            ref={register({
              required: '必須項目です',
              maxLength: {
                value: 20,
                message: '20文字以内で入力してください',
              },
            })}
          />
          <span className={styles['error-message']}>
            {errors.lastName?.message}
          </span>
        </div>
        <div className="flex-column">
          <span>age</span>
          <input
            name="age"
            type="number"
            ref={register({
              valueAsNumber: true,
              required: '必須項目です',
              pattern: {
                value: numberRegExp,
                message: '整数で入力してください',
              },
              min: {
                value: 18,
                message: '18以上の数字を入力してください',
              },
              max: {
                value: 100,
                message: '100以下の数字を入力してください',
              },
            })}
          />
          <span className={styles['error-message']}>{errors.age?.message}</span>
        </div>
        <button type="button" onClick={() => reset()}>
          リセット
        </button>
        <button>送信</button>
      </form>
    </div>
  )
}
```
Bootstrap5導入

Bootstrap５の導入するとき用にメモ

##Bootstrap4からの主要な変更点
・jQueryから脱却
・IEサポートしない
・ブレークポイントxl-1200pxからxxl-1400pxに
・ガター（子要素の余白）
・CSSカスタムプロパティ
・クラス名が変更

# 導入方法
・BootstrapCDNで導入
・パッケージで導入
・ダウンロードして導入

## BootstrapCDNで導入
・簡単
・Bootstrap側の非常事態（ダウン）などがあれば読み込めない


以下Bootstrapの公式URLにアクセスし、
https://getbootstrap.com/

ページをスクロールダウンして「jsDelivr」という項目の

・CSSリンクをコピー

```index.html
<head>
<!-- CSS only -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
</head>
```

headタグ内に貼り付け

・JavaScriptリンクをコピー

```index.html
<body>

<!-- JavaScript Bundle with Popper -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM" crossorigin="anonymous"></script>
</body>
```

`</body>`タグの最後に貼り付け
※bootstrap.bundle.jsではなく、bootstrap.jsを読み込む設定にする場合は、popper.jsも読み込む
※Bootstrap5はjQueryを使わないよう設計されている。使用は可能。

## パッケージで導入

###npm
npm パッケージを使って、Node.js を搭載したアプリに Bootstrap をインストール

```
$ npm install bootstrap
```

###yarn
the yarn package を用いて Bootstrap をインストール

```
$ yarn add bootstrap
```
###RubyGems
Ruby アプリ Bundler (推奨) と RubyGems で Gemfile からインストール


```
$ gem 'bootstrap', '~> 5.0.2'
```

Bundler を使ってない場合は、以下のコマンドで gem をインストール

```
$ gem install bootstrap -v 5.0.2
```

###Composer
Composer を使って Bootstrap の Sass と JavaScript をインストール

```
$ composer require twbs/bootstrap:5.0.2
```

###NuGet
.NET で開発しているのであれば NuGet を使って Bootstrap の CSS や Sass、JavaScript をインストール

```
PM> Install-Package bootstrap
```

```
PM> Install-Package bootstrap.sass
```

##ダウンロードして導入

以下Bootstrapの公式URLにアクセスし、
https://getbootstrap.com/

Download

フォルダ内に保存し、CDNの場合と同じようにして読み込み先を保存箇所ファイルとする
[個人開発]　数学好きのためのWebアプリを作ってみた (Rails ＋ Typescript）

#まずはじめに
私は数学好きな高校３年生です。プログラミングは１年ほど前から独学で始めました。
今回、個人開発で数学好きのための **「$Mualphatheta$」**というWEBアプリを作ってみたのでこの記事でアプリの紹介をしようと思います。

アプリのURL$\; \to\;$ [https://mualphatheta.herokuapp.com](https://mualphatheta.herokuapp.com)
###なぜつくったのか
 TwitterやInstagramなどで数学アカウントなるものがたくさんあり、みなさん文章や画像などで面白いと思った問題、自作問題、解いて欲しい問題を投稿しています。
 今のシステムでは２点ほど**もったいない**と感じてしまうことがあります。

+ **媒体がTwitterやInstagramなどで分散してしまう**
+ **他の媒体ではTexに対応していないため $\raise 5px{x^2}$ などがx^2などで表現され、長い式だとわかりずらい**

これらの問題を解決するためにアプリを作りました。

#どんなアプリか
まずはスクリーンショットを見てください
<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516805/590c9c6a-0670-c413-f259-36bc0b029b8c.jpeg' width=33%/>
<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516805/e842bad4-1373-62e0-941d-f328e8e81d89.jpeg' width=33% />
<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516805/1fddc1e0-656d-9a0b-5c0f-b9a71188c07f.jpeg' width=33% />
![スクリーンショット 2022-02-16 18.23.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516805/62e74d41-a8e4-0e5e-e2bc-305d5a7c8d1f.png)

基本的にレスポンシブデザインになっているのでPC, スマホ, タブレットどれで見ても綺麗に表示されるはずです。

###アプリの機能
機能は以下の通りです。

+ ログイン機能
+ フォロー機能
+ いいね機能
+ 検索機能
+ 問題・解答の投稿機能
    + Tex(KaTex)による記述
    + 画像投稿
+ コメント機能

　Texテキストによる投稿を可能にしたことで、より数学的な見た目で問題を作成することができます。また、画像投稿も可能なので図形やグラフを明示することもできます。
　普段Texに書き慣れている人はもちろん、書き方がわからない人にもしっかりとTexの書き方を紹介しているページがあるのでそれを見れば誰でもTexを書けるようになっています。また、文章をPCやスマホで書くのが面倒な人は紙に書いたものを写真に撮って画像として投稿するのもありです。
　このように様々な方法で問題が投稿できるのでユーザーが数学を楽しみやすくなっています。

#使用技術
####バックエンド

- Ruby
- Rails

　今回バックエンドはRailsをAPIとして使っています。しかしAPIモードではなく、Route.rbでフロントエンドへのpathは全て同一のコントローラー、アクションに対応させ、ReactのIndex.tsxを読み込んでいるviewをレンダーするようにしています。

　コントローラーの設計は以下のようになっています。

- api
    - v1
        - users
        - problems
        - solutions
        - comments
        - likes(いいね機能)
        - relationships(フォロー機能)
- sites (indexアクションでReactをレンダー)

　ログイン機能はRails tutorialと基本的に同じような構造で、個人情報をあまり取り扱いたくなかったのでユーザー名とパスワードだけのログインになっています。

　テストはrspecを採用しています。直感的にテストが書けるのでとても使いやすいです。

####フロントエンド

- Typescript
- React
- Material-Ui

　フロントエンドはReactをTypescriptで書いています。今までに一度だけJavascript x ReactでSNSアプリを練習で作ったことがありますがほとんどJavascriptは使ったことがない状態でした。しかし型安全ということで世間的にTypescriptがかなり普及しているので今回は拙いながらもTypescriptで書いてみることにしました。正直まだTypescriptの恩恵を受けるような使い方はできていないと思っています。Reactについてもhooksの使い方をもう少し上手くなりたいです。

　API通信はaxiosを使っています。
　styleはCSSファイルではなくstyled-componentというライブラリを使ってTSファイルに直接書いています。また、UIは使いやすそうだったのでMaterial-UIを採用しました。

####インフラ

- Heroku
- AWS s3 (画像ストレージ)

　インフラについてはまだ勉強したことがないのでHerokuにあげています。add-onでpostgre-sql、AWS s3を使用しています。もともとは画像ストレージでcloudinaryを使用しようと思っていたのですが、なぜだか上手くいかなかったのでAWS s3を使うことにしました。

#反省点
　今回の開発を通して感じたのは、要件定義をしっかり初期段階でやっておかないと途中で何をやっていいかわからなくなることがあるということ。フロントのレイアウトについてもふわふわとしたイメージだけで作ってしまったので開発中に何回も変更が生じて苦労しました。

　コンポーネントをもっと細かく作って再利用性の高いコードを書く必要があると感じました。(似たようなコードを何回も書いているので)

#さいごに
　はじめての本格的なアプリ開発でしたが制作物自体はまあまあ上手くできたのではないかと思います。フィードバックがあればより改良していきたいと思います。
　このアプリは数学が好きな人にとってはとても楽しめるアプリになっていると思います。数学に興味がある方、自作問題を作っている方、良問を共有したい方はぜひ使ってみてフィードバックをくださると励みになります。私もいくつか自作問題を投稿してみたのでぜひ挑戦してみてください。
Microsoft Teamsデスクトップで前の情報が残っててログインできない時の対処法(Mac)

ここのデータを全部消します

    /Users/自分のユーザー名/Library/Application Support/Microsoft


/Users/ユーザー名/Library/Application Support/Teamsといったフォルダもありますが、そちらではないので気をつけてください。

過去に仕事で自分のパソコンを使ってteamsでミーティングなどをしなくてはいけない時があり、その時のデータが残ってて別の仕事をやる際にログインできずに困ってましたが、キャッシュが残ってるからだろうな

なんて検討はついてたので調べたらそんな感じだったんですが、結構困ってる人いるんじゃないかと思って共有です
【Rails】 モデルのscope機能

##モデルのscope機能とは
モデル側であらかじめ特定の条件式に対して名前をつけて定義し、その名前でメソッドの様に条件式を呼び出すことが出来る仕組みのこと。

``実装例``
現在時刻よりも過去の記事を取得したい場合、過去のように記載する。

```model.rb
scope :past_published, -> { where('published_at <= ?', Time.current) }
```

定義したスコープは以下のように呼び出す事が出来る。

```rb
Article.past_published
```

##scope機能のメリット
1.条件式に名前を付けられるので、直感的なコードになる
2.修正箇所を限定することが出来る
3.コードが短くなる

##scope機能の基本的な使い方
``scopeメソッド``の第一引数に条件式を呼び出すための名前、第二引数に条件式を実装するlambdaを渡す。

```rb
class モデル名 < ApplicationRecord
  scope :スコープの名前, -> { 条件式 }
end
```
冒頭での例がこれに該当する。

第一引数は、シンボル``:``を使ってスコープの名前を指定。

第二引数の``->{条件式}``の``lambda``は、処理の中でメソッドを定義してくれる手法。
※第二引数の``lambda``は、``->{}``の中に条件式を記述することが出来るとだけ覚えておく。

---

####引数を使う方法
``scopeメソッド``は、下記の様に``->``の後に引数を定義することで、引数を渡すことが出来る。

```rb
class モデル名 < ApplicationRecord
  scope :スコープの名前, -> (引数){ 条件式 } 
end
```

公開記事を取得する上限を2件までにしたい場合、下記のように記載できる。
取得する記事の上限をその都度変更したい場合は、下記の様に引数``count``を``scopeメソッド``に定義する

```rb
# 引数を使用しない場合
class Blog < ApplicationRecord  
  scope :published, -> { where(published: true).limit(2) } 
end

# 引数を使用した場合
# 取得する記事の上限をその都度変更したい場合はこっち
class Blog < ApplicationRecord 
  scope :published, -> (count){ where(published: true).limit(count) }
end
```

---

####条件分を使う方法
``scopeメソッド``は、``if``文を使って処理を分岐することが出来る。
下記は、引数で渡される値が5未満の場合はその値の記事数を取得する事が出来て、５を超える場合は５件以上はないので全件(5件)取得する例。

```rb
class Blog < ApplicationRecord
  scope :published, -> (count){ where(published: true).limit(count) if count < 5 }
end
```

##scope機能の応用
####nilの場合について
``scopeメソッド``は、``scopeメソッド``で定義した条件式が``nil``を返す場合は、``allメソッド``を実行する。

また``allメソッド``の返り値は``ActiveRecord::Relationオブジェクト``なので、``scopeメソッド``で定義した条件式が``nil``を返す場合でも、``ActiveRecord::Relationオブジェクト``を返す。

```rb
#blogsテーブルの全レコードが取得される
class Blog < ApplicationRecord
  scope :published, -> { nil } # 条件式をnilに変更
end
```
---

####スコープとクラスメソッドの違い
クラスメソッドでも同じように定義可能。``対象モデル.クラスメソッド名``で定義した条件式を呼び出す事が出来る。

```rb
class モデル名 < ApplicationRecord
  def self.メソッド名
    条件式
  end
end
```

相違点は、**``scopeメソッド``と``クラスメソッド``は、``nil``を返す時の挙動が違う。**

**``・scopeメソッド``**
``nil``の場合に``allメソッド``が実行されるので、メソッドチェーンを使う事ができる。

**``・クラスメソッド``**
``nil``の場合は``nil``が返るので、メソッドチェーンを使う事が出来ない。

``scopeメソッド``の引数は、``クラスメソッド``の機能を複製させたものなので、引数を使う場合は``クラスメソッド``を使う方が推奨される。

##参考記事
[【Rails】 モデルのスコープ機能(scope)の使い方を１から理解する](https://pikawaka.com/rails/scope)
PhysicsMaterial2Dの優先順位


Collider2DとRigidbody2Dがアタッチされたオブジェクトには、PhysicsMaterial2Dを入れる場所が２か所あります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/975a7062-d01d-257f-9a55-2ae882e131ce.png)

どちらが優先されるのか？
[マニュアル](https://docs.unity3d.com/ja/current/ScriptReference/Rigidbody2D-sharedMaterial.html)によると、

:::note info
Collider2D で指定された PhysicsMaterial2D の優先順位が一番高く、次いで Rigidbody2D で指定された PhysicsMaterial2D、グローバルの PhysicsMaterial2D の順位です。
:::
となります。グローバルの PhysicsMaterial2D というのは
![2022-02-16_225356.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/6445b100-24ec-3528-53fa-a9a2e0d9f6b3.png)

これです。
ここにも何も設定されていなかった場合は、

:::note info
 PhysicsMaterial2D.friction = 0.4
 PhysicsMaterial2D.bounciness = 0
:::
が使用されます。
python3 【標準入力】スペース区切りを読み込み

初めまして。初の記事ですが、いきなり自分用のメモに残します。

基本的なことはプロフィールに書いてます。（笑）
まだまだ初心者なので、備忘録として使うことが多々あると思います。ご容赦ください。

最近自分で勉強していて

・標準入力で空白区切りの入力があった場合、どう受け取れば良かったっけ。

と根本的な部分で詰まってたので残します。

```test.py

(変数1,変数2) = map(データ型,input().split())

```

変数の部分は区切り数が分かっていれば追加可能。
データ型の部分で int,str　等　指定。

VBやJavaを仕事で使うことが多く、pythonは実務では触らない…。
ので、忘れますね。
Cloud Watch Alarmの設定周りがよくわからなかったのでまとめる（Terraform）

# 悩み

結局なにをどう設定すれば意図したタイミングでアラートが飛ぶの？？

を整理したい。

# やってみよう

terraformの公式の[サンプル](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/cloudwatch_metric_alarm)をベースにアレンジしながら解説。

```go
resource "aws_cloudwatch_metric_alarm" "foobar" {
  alarm_name                = "terraform-test-foobar5"
  comparison_operator       = "GreaterThanOrEqualToThreshold"
  evaluation_periods        = "2"
  metric_name               = "CPUUtilization"
  namespace                 = "AWS/ECS"
  period                    = "120"
  statistic                 = "Average"
  threshold                 = "80"
  alarm_description         = "This metric monitors ec2 cpu utilization"
  insufficient_data_actions = []
  datapoints_to_alarm       = "10"

	dimensions {
		ClusterName = aws_ecs_cluster.hogehoge.name
		ServiceName = aws_ecs_service.hogehoge.name
	}

	alarm_actions {
		// オートスケーリングやsnsとの連携などを定義。（今回は割愛）
	}
}
```

まずコアになる部分の設定値について。

アラームの作成の際に重要となる設定が3つある。

- **period**
- **evaluation_periods**
- **datapoints_to_alarm**

`period` ... メトリクスを評価する期間。秒単位で設定する。例えば60で設定した場合、60秒に1回メトリクス の状態を評価することになる。（評価という表現がなれないが「チェックして判定する」というニュアンスで良いと思われる。）

「メトリクスをチェックする1セット分の期間」と表現する。

`evaluation_periods` ... 公式には、

> アラームの状態を決定するまでに要する最新の期間またはデータポイントの数です。
> 

と書いてあるが、わかりにくい・・・。

要するに「閾値のチェックを繰り返すデータポイントを何回にするかの値」と解釈しています。

periodの範囲でのメトリクスチェックを何ターム繰り返すかを設定する値と言えばいいでしょうか。（データポイントはメトリクスの集約期間のメトリクスの値のことらしい。これもわかりづらい）ひとまず「メトリクスをチェックする1セット分の期間を何セット繰り返すかを定める数値」と置き換える。

`datapoints_to_alarm` ... 実際に閾値を超過した際にALARM状態にするために必要な回数。

「メトリクスをチェックする1セット分の期間を何セット繰り返すかを定める数値に対して、何回超過した場合にアラーム状態とするかを設定する数値」と言える。

詳細な情報については以下の公式を参照されたい。

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/AlarmThatSendsEmail.html

その他の設定値については以下の通り。

`comparison_operator` ...これは閾値設定の際に使用される算術演算子（〜以上、〜以下など）設定値として用意されている値を日本語訳するとなんとなくわかるかと。

`metric_name` ... アラームの対象とするメトリクスの名前。

`namespace` ... AWSサービス名。

`statistic` ... アラームに関連づけられたメトリクスの統計方法。（平均や合計値など）

`threshold` ... 実際に閾値の判定に利用される値。主に数値が入る想定。「CPUUtilizationが〇〇以上」という判定の〇〇に当たる部分。

`insufficient_data_actions` ... メトリクスのデータが不足している場合に行うアクションについての定義箇所。本記事では特には触れません。

`dimensions` ... 実際に対象となるリソースの設定。（だいぶざっくりだが伝わるはず。。。）

`alarm_actions` ... アラーム発生時に行うアクション。本記事では割愛するがECSなどであればオートスケーリングの設定をするケースもある。他にもsnsへの送信など。

以上、ざっくりですがCloud Wacthアラーム設定周りの整理でした！！！
laravel テスト用DB接続設定

## はじめに
`Illuminate\Database\Eloquent\Model`を利用している場合には、
リレーション （`belongsTo``hasOne``hasMany`など）の対応がシンプルにできるため、
テスト用DBにてphpunitを実施する設定について記載しています

## 環境
```
laravel: v5.5.50
phpunit/phpunit: 5.7.27
```

## テスト用DBの接続設定
```php:config/database.php
//...

    'connections' => [  
       // ...

       // テスト用設定
       'test' => [
            'driver'      => 'mysql',
            'host'        => env('DB_HOST', '127.0.0.1'),
            'port'        => env('DB_PORT', '3306'),
            'database'    => 'test',
            'username'    => env('DB_USERNAME', 'forge'),
            'password'    => env('DB_PASSWORD', ''),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset'     => 'utf8mb4',
            'collation'   => 'utf8mb4_unicode_ci',
            'prefix'      => '',
            'strict'      => false,
            'engine'      => null,
        ],
    ],

    // ...
```
※接続設定は環境に応じて適宜書き換えてください

## DB_CONNECTION設定
以下`phpunit.xml`を書き換え

```php:phpunit.xml
<phpunit backupGlobals="false"
         backupStaticAttributes="false"
         bootstrap="bootstrap/autoload.php"
         colors="true"
         convertErrorsToExceptions="true"
         convertNoticesToExceptions="true"
         convertWarningsToExceptions="true"
         processIsolation="false"
         stopOnFailure="false">
    // ...

    <php>
        // ...

        <env name="DB_CONNECTION" value="test" force="true"/>
    </php>
</phpunit>
```

**`DB_CONNECTION`が適用されない場合**

configをキャッシュしていると、`phpunit.xml`の設定が適用されないようです

`bootstrap/cache/config.php`を削除することで適用されました

```bash:
rm -f bootstrap/cache/config.php
```

## RefreshDatabase設定
traitの`RefreshDatabase`を利用すると、
テスト実行時に`php arsitan migrate:refresh`を実行してくれます

```php:tests/ExampleTest.php
<?php

namespace Tests;

use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\TestCase as BaseTestCase;

class ExampleTest extends BaseTestCase
{
    use RefreshDatabase;

    // ... テストコード
}
```

## ハマった内容

`Illuminate\Console\Command`を継承したクラスの`__construct`で、
DBの参照していると`Base table or view not found`が発生しました

## さいごに

`phpunit.xml`で`APP_ENV`を変更する設定もあるようですが、
複数の環境にてテストを実施する場合にはそちらを利用したほうがよさそうです
※設定することがあればそちらについても投稿します
Next.jsアプリケーションをIISにデプロイしたかったのでIIS上でホストしてみた

Next.jsをデプロイするならVercelが推奨されているけど、
どうしてもIISでやりたいっていう人向け。

IIS拡張モジュール「HttpPlatformHandler」を使うと、
IISからnode.exeを起動してHTTP要求をNodeプロセスに処理させることができます。
下記サイトを参考にさせていただきました。
https://nodejs.keicode.com/nodejs/using-platformhandler-to-host-nodejs-on-iis.php

## 事前準備

IIS拡張モジュールが必要なのでインストールします。
https://www.iis.net/downloads/microsoft/httpplatformhandler

あとは、Next.jsアプリを普通に作成して、ビルドまで済ませておきます。
私はcreate-next-appで作りました。

IISのWebアプリケーションで
http://localhost/nextapp
というURLでアクセスできるようにしたいので、
next.config.jsにbasePathの指定を入れておきました。

```js:next.config,js
module.exports = {
  basePath: '/nextapp',
}
```

## IISの設定

Webアプリケーション「nextapp」を作成し、
アプリケーションルートにweb.configファイルを作成します。

```xml:web.config
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <handlers>
            <add 
                name="httpPlatformHandler" 
                path="*" 
                verb="*" 
                modules="httpPlatformHandler"
                resourceType="Unspecified" />
        </handlers>
        <httpPlatform 
            processPath="C:\Program Files\nodejs\node.exe"
            arguments="C:\nextapp\node_modules\next\dist\bin\next start C:\nextapp">
            <environmentVariables>
                <environmentVariable name="PORT" value="%HTTP_PLATFORM_PORT%" />
            </environmentVariables>
        </httpPlatform>
    </system.webServer>
</configuration>
```

これだけ！

## 実行確認

ブラウザで、下記にアクセス。
http://localhost/nextapp

Next.jsの画面が表示されれば成功です！

タスクマネージャを見ると、ちゃんとnode.exeが起動していました。
しかも複数セッションから接続してもexeは増えないので、この辺りはIISモジュールがやってくれてそう。

## さいごに

けっこう検索しても出てこなくて苦労したので、
誰かの助けになったら幸いです。

にしても、Next.jsをサーバ側で動かすには、
ソースとかnode_modulesとか全部一式サーバに置かなきゃいけないのかな？
もともとReactでやろうとしてたけどSSRしたくてNext.jsってことになったので、
ReactみたいにビルドしたモジュールだけIISのアプリケーションルートに置けば動くと思ってた。
もっと良い方法があればぜひ教えてください。
Chrome OS Flex 使ってみました（2022/7 公式版も体験）

Chrome OS Flexがダウンロードできるようになったとweb記事で見かけましたので、使ってみました。

https://chromeenterprise.google/os/chromeosflex/

# 概要

- 開発版とのことでしたが、普通にスルスルと使えました。
- USBメディアに書き込んで、いわゆる「ライブ環境」で使いましたが、ある程度の記憶場所があり、アカウント等は復元されます。
- 私のMacBookでは、WiFiも日本語入力（＝キーボード操作）も普通にでき、ブラウジング中心のサブデバイスとして十分使えそうでした。

![Screenshot 2022-02-16 20.58.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533274/c2c99a0a-0f64-8bab-b75d-75eeee13e4de.png)

# セットアップ

- USBメディアを用意します。
- ガイドページに従い、Chromeブラウザーにリカバリー作成の機能拡張を追加します。
- Chrome OS Flex を選び、USBメディアに書き込みます。私の場合、最初は [Chrome OS Flex] が選べなかったのですが、Chromeブラウザーを再起動したら選べるようになりました。
- 書き込んだUSBメディアを使って起動します。もう本当にChromebookのように使えます。
- メディアに記憶領域ができるようです。再起動で、言語、キーボード、アカウント設定などが復元されました。

# 確認環境

- 2014-2015年のインテル MacBook Pro で試しました。

# 使いこなし等

- 起動時に「日本語」を選んだ私の場合、起動後に [Control]+[Space] で日本語IMEが使えるようになりました。（追記）[command]+[space]でも切り替えができます。
- F5キーにて、ウィンドウ一覧が表示されます。
- Macのトラックパッドも普通に使えます。Retina Displayにもちゃんと対応していて、スケーリングも選べます。

# 注意等

- 作成したUSBメディアを他のMacBookで起動したところ、言語、キーボード、アカウント設定はやり直しになりました。メディアにした小さいファイルは復元されました。

- トラックパッドの感度が良すぎるようで、たまにカーソルが飛びます。感度設定はできないようです。落ち着いてゆっくり操作するほうが良さそうです。

- 2本指ドラッグによるスクロールは慣性が効きません。ちょっと「昔ながらの操作感」です。違和感程度で、大きい問題ではありません。

- USBメディアに確保される記憶容量は少ないようで、linux環境構築はできませんでした。

- 内蔵ストレージにインストールはできそうな雰囲気なのですが、デュアルブート不可のようで、試していません。外部メディアにインストールというubuntu等では可能なアクロバットもできそうにないです。

# 感想

ところどころ残念なところはありますが、全体としてはブラウズ中心の簡易な環境としては十分使えそうです。開発版とは思えない出来栄えです。気が向いたら内蔵ストレージにインストールして本格的に使ってみてもいいかなと思いました。

# 追記

1台だけですが，内蔵ストレージにインストールしてみました。ライブ環境と使い勝手は特に変わりません。linux環境がインストールできると期待したいのですが，エラーとなり拒絶されました。私のMacがいけないのか，まだ使えないのかはよくわかりません。残念。

# 2022/7 追記

いよいよ「公開版」が出されたようなので、再度試してみました。内蔵ストレージにインストールした後はlinux環境もうまく入りました。いろいろ遊べそうです！
PowerAutomate: Teamsのリアクション簡易分析

# 背景
以下カスタムコネクターを作ったけれど、Power BI Service で更新出来なかったので、Power Automate で似たようなのを用意してみた。

https://qiita.com/baku2san/items/f224b71b204b45d8c9cc

# 動作
1. 適当なチャネルで起動<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/347d6ed2-a318-2510-6216-5fc4d64a868f.png)
1. 対象日数を指定して起動<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/a3f29df9-62c3-34c6-b6df-85d67570e5a4.png)

1. チャットで集計結果が返ってくる。<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/951ee715-f3d0-1ff1-0b42-5d35c7bbe9ef.png)


# ソースは、以下から取得して、Zip 化して Import
https://github.com/baku2san/PowerAutomateTools#analyzeteamsreactions

# あとがき
今回は Office Scripts を使わずに単純にインポート出来るようにコレクションを Automate 内で操作してみたけど面倒過ぎた・・
OrderBy は、Max を抽出していってやろうかと思ったけど、流石に面倒過ぎて挫折。

コレクション操作を久し振りにしたので、以下も更新

https://qiita.com/baku2san/items/39e7a40c1a1fb327362a

- Select で配列生成。そういえば、Adaptive Card の要素を作る方法は書いてなかったな・・
- Filter Array で複数条件
排他制御について

## 排他制御とは
1つの共有資産(DBとかCSV)を、複数人で同時操作しても大丈夫にする仕組み
排他制御をしない状態で同時に使用してしまうと、共有資産の整合性が取れなくなってしまう。
(例)1つのレコードを2人が同時編集(UPDATE)した場合に、後に編集した方が優先されてしまう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499375/ab7084f2-2ddd-7b18-6dd4-b528176a6de1.png)


[アプリケーション開発において重要なロックを掘り下げ、ORM における楽観的ロックの実現例を紹介する - Qiita](https://qiita.com/tatsurou313/items/053cffdfe940a89d7f5a#%E3%83%AD%E3%83%83%E3%82%AF%E5%8B%95%E4%BD%9C%E3%81%AE%E3%82%B7%E3%83%BC%E3%82%B1%E3%83%B3%E3%82%B9) 様より引用

次に、排他制御の代表的な方式2つを記載していく。
### 楽観ロック
「1つの共有資産を同時に操作することはあまりないだろう」という楽観的な考え方の制御方式
**更新対象のデータがデータ取得時と同じ状態であることを確認してから更新**することで、データの整合性を保証する方式。
取得したデータと更新対象のデータが同じであるかを確かめるために、テーブルにVersionカラムなどを追加する。
Versionカラムは、更新があるたびに +1 されるような仕組みにしておく

1. データ取得
2. データ更新前にバージョンカラム(もしくはタイムスタンプ)を、1で取得したデータと比較して同じだったら更新

【イメージ】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499375/08b45a50-05cc-1fd8-5357-1757e8d3899d.png)


[アプリケーション開発において重要なロックを掘り下げ、ORM における楽観的ロックの実現例を紹介する - Qiita](https://qiita.com/tatsurou313/items/053cffdfe940a89d7f5a#%E3%83%AD%E3%83%83%E3%82%AF%E5%8B%95%E4%BD%9C%E3%81%AE%E3%82%B7%E3%83%BC%E3%82%B1%E3%83%B3%E3%82%B9) 様より引用

## 悲観ロック
「1つの共有資産を同時に操作することは頻繁に起こり得るだろう」という悲観的な考え方の制御方式
**更新対象のデータを取得時にロックしてしまうことで、他者からの操作を一切出来なくする**方式

======================
1. データ取得とともにロック
2. データ更新
3. ロック解放
======================ここまで誰もデータにアクセスできない


A,Bさんがが同じデータを編集しようとした場合、
Aさんが先に編集している場合には、Bさんはそのデータにアクセスすることはできません。

【イメージ】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499375/dc34d838-a1d5-a8b6-23d5-e66fb2ff4d4a.png)
[排他制御（楽観ロック・悲観ロック）の基礎　](https://qiita.com/NagaokaKenichi/items/73040df85b7bd4e9ecfc) 様より引用

### 参考資料
- [排他制御（楽観ロック・悲観ロック）の基礎　](https://qiita.com/NagaokaKenichi/items/73040df85b7bd4e9ecfc)
- [楽観ロック](https://www.youtube.com/watch?v=NKhpvUXg4kw)
- [悲観ロック](https://www.youtube.com/watch?v=sknST7ZB2GA)
ForeignKeyの役割、使い方について

##ForeignKeyとは!

Djangoのmodels.py内で利用できるリレーションフィールドの1種であり、複数モデルを扱う際にそれぞれのモデルを関連付ける役割を持っています。
ForeignKeyの場合、一対多の関係を持つフィールドを作成することが出来ます。
今回は、ブログにカテゴリ分類機能を実装する過程でForeignKeyの使い方をまとめていきます。

##図で見る!

今回のカテゴリ機能は以下のようなイメージです。字が汚くてすみません。
![IMG_1624.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2528559/c9e79a20-5807-ff2c-bf39-8d549c626ab2.jpeg)
なんの変哲もないカテゴリ機能です。
分類するカテゴリをCategoryモデルクラスとして定義し、それぞれ1つ1つの記事をPostモデルクラスを定義します。
カテゴリの中に記事が複数まとまっている、まさに一対多の関係ですね。
以下、この関係を親と子と呼称します（親が一、子が多）
この関係を実装するため、ForeignKeyを利用します。

##コード!
```python:models.py
class Category(models.Model):
    name = models.CharField('カテゴリ', max_length = 100)

    def __str__(self):
        return self.name

class Post(models.Model):
    category = models.ForeignKey(Category, verbose_name = 'カテゴリ', on_delete = models.PROTECT)
    def __str__(self):
        return self.title

```
##解説
ForeignKeyは、他のフィールドと同じような形で使用します。
カッコ内には引数として親となるモデル名を指定しなければいけない（今回はCategory）ほか、on_deleteも指定する必要があります。
on_delete = PROTECTとon_delete = CASCADEの2種があります。（後述します）
注意点として、ForeignKeyは子側のモデルクラスに記述する必要がある、ということです。
引数として親モデル名を指定するため、親側のモデルクラスに記入すると自身に包含されるということになってしまい変ですものね。

##PROTECTとCASCADE
この2つは、データ削除時の動作に関する記述です。
PROTECTの場合、親データの削除時に子データが存在していると削除ができない仕様になりますが、CASCADEの場合、親データを削除すると子データも一緒に削除される仕様になります。
今回はカテゴリ削除によるブログ記事削除を防ぐため、PROTECTに設定しました。


##参照
Djangoドキュメント
モデルフィールドリファレンス
0埋めの文字列にする

## やったこと
go言語で0埋めの関数なかったのでつくっった。
テストコードとか書いてないので確実に動くかはわかんないけど多分大丈夫（適当）

```golang
package main

import (
	"errors"
	"fmt"
	"strconv"

	"github.com/labstack/gommon/log"
)

func main() {
	n := 1000
	width := 3
	var s string
	s, err := padNumberWithZeros(n, width)
	if err != nil {
		log.Error("err : ", err)
		return
	}

	fmt.Println(s)
}

// padNumberWithZeros : 数理をセロで埋めます
//    n : 埋めたい数値
//    width : 桁数
func padNumberWithZeros(n int, width int) (s string, err error) {
	l := len(strconv.Itoa(n))
	if l > width {
		return "", errors.New("overflow")
	}
	padded := "%0" + strconv.Itoa(width) + "d"
	s = fmt.Sprintf(padded, n%100)

	// success
	return s, nil
}
```
CSS (display: flexと inline-block)

#display: flexと inline-block違い
display:flexを指定するのは親要素。
例えば下記のようにリストを作成しそれぞれの項目を横に並べたい時は親要素であるulタグにdisplay:flexを指定する。

```HTML
<ul>
	<li>ABC</li>
	<li>DEF</li>
</ul>
```

一方、inline-blockを使う場合は横並びにしたい子要素（上記リストの場合liタグ）に使用する。
AZ-104を受験した話

# はじめに
Microsoftの認定資格であるAZ-104に受験した際のお話です。
（2022年2月16日時点）
なお、本文章はあくまで個人の所感でありますことご了承ください。


# AZ-104とは
MicrosoftのパブリッククラウドサービスであるAzureの管理者向けの資格。
公式のURLは以下になリます。
https://docs.microsoft.com/ja-jp/learn/certifications/exams/az-104


個人的な感覚としてどのような方にマッチする資格かというと、
Azureを社内で採用している企業の情シスとかAzureを商用あるいは検証環境で利用している技術者とか向けかなと思います。


# 私の前提スペック
Azure自体は業務でだいたい一年前くらいからたまーーーに触る程度。
Azureの基礎資格であるAZ-900は昨年（2021年）の6月に取得済み。
他クラウドサービスであるAWSのSAA（ソリューションアーキテクトアソシエイト）は取得済み。


# なぜ受けようと思ったか
理由は以下3つです。
1.業務でAzureの知識が必要な場面が今後出てきそうだから。
2.受験費用は会社負担だったから。
3.AZ-104のMicrosoft認定研修を受けられることになったから。


# 勉強方法
以下の3つを重点的にやりました。

### 1.MicrosoftLearn
以下のサイトに大きく６つセクションがあるのでそちらを重点的に学習
https://docs.microsoft.com/ja-jp/learn/paths/az-104-administrator-prerequisites/

おそらく元々英語のドキュメントを素直に和訳しているだけなので、
わかりにくい和訳はあるのですが、情報量としては十分です。
無料で誰でも読めるのでその点はかなりメリットです。
全体範囲を掴むためにもまずは一周することをお勧めします。

また、英語ですがサンプル問題もあるのでこちらもぜひ。
本番の形式と類似しています。
https://query.prod.cms.rt.microsoft.com/cms/api/am/binary/RWSOFn

### 2.Microsoft認定研修
Microsoft認定の講師が実施する研修です。
終日４日間実施で、研修内容はMicrosoftlearnの内容に沿っています。
受講を考えている方は、Microsoftlearnを予習して受講されることをお勧めします。
私は予習して臨みましたが、Microsoftlearn公式ドキュメントの不明瞭な部分を
噛み砕いて解説していただけるので、相当理解を助けていただきました。
私の場合、研修費用は会社負担だったので詳しい値段は存知上げませんが、
費用に見合えばぜひ受講されることをお勧めします。

### 3.Udemyの問題集
問題演習をする意味で購入し実施しました。
私が購入したのは以下コースですが、セールで１７００円くらいでした。
https://www.udemy.com/course/az-104-microsoft-azure-administrator-practice-test-jp/

問題数は全部で82問と少なめですが、傾向を掴むにはお勧めです。
また、Udemyは頻繁にセールをしていますので
セール期間で購入されることをお勧めします。
セール外だと倍以上の値段になります。

# 勉強期間
研修含めて２週間くらいでした。かなり短めだと思いますので点数はあまり良くありませんでした。
社会人の方の標準だと1ヶ月半から2ヶ月くらいかなと思います。

# 試験内容
問題パターンとしては、以下
1.一問選択式
2.複数選択式
3.複数選択式かつ手順通り並び替え
4.シチュエーション問題

1と2に関しては、Udemyの問題集に類似した出題パターンの問題です。
基本的に選択肢は文ですが、稀にAzureポータルの画面スクショから選択させるパターンもありました。
3に関しては、リソース作成手順などが出題。曖昧に記憶しているとはまるので注意です。
4に関してMicrosoftの公式サンプル問題集のQ13以降のような出題傾向です。

# 試験結果
700点/1000点が合格ラインですが、
私は756点で合格。あぶねえ。
セッションごとの出来映えみるとストレージ部分特にできてなかった。![スクリーンショット 2022-02-16 22.21.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2246999/ee6e464a-1c1a-eda8-6b94-35e92e529916.png)

# 振り返り
今回はAzureの勉強の意味もありますが、
資格を取ることが何よりゴールだったので点数は低いけど満足。
理解度は薄いけどベースの知識はつけられたかなと・・・・・
Azure管理者向け資格はこれより上位の資格はないそうなので、
次受けるなら開発者向けとかかな。
ESP32からSIMフリールーター(+SORACOM IoT SIM)に接続

　インターネット回線がない環境において、複数のESP32からfirebaseに接続する必要がありました。そこで導入したSIMフリールーターのセットアップ手順のメモです。

＜セットアップ完了状態＞
ESP32からSIMフリールーターに接続し、Wi-FiのRSSIとNTPサーバ（ntp.nict.jp）から取得した時刻をLCD(AQM1602XA)に表示。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71605/b960e33e-51f4-03f3-8292-f449d36b5acb.jpeg" width="300px">
### １．環境

#### ・　SIMフリールーター [【IODATA WN-CS300FR】](https://www.iodata.jp/product/network/wnlan/wn-cs300fr/index.htm)

　ESP32は2.4GHz帯しか対応していないので、同じく2.4GHz帯しか対応していないこちらの製品を採用。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71605/1d402eaa-b859-6ae0-54df-b19e21538702.jpeg" width="300px">

#### ・　SIM [【SORACOM IoT SIM plan-D D-300MB microSIM】](https://soracom.jp/store/13380/)

　SMSのあり/なしを選べます。今回はSMSは必要ないので「SMSなし」版を手配。

### ２．手順

#### ２−１）　SIMの入手

　手順はSORACOMの[スタートガイドの「SORACOM Air for セルラーの利用を始める」](https://users.soracom.io/ja-jp/guides/getting-started/)の通りで特につまづくところはありませんでした。

注文をした翌々日にはSIMが送られてきました。

#### ２−２）　ルータにSIMを差し込み

　これもルーターの取説がわかりやすく、また、裏蓋からSIMを差し込むだけなので特に手間取るところがありません。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71605/f77de0d6-2e18-c35c-5f00-7781c09cf711.jpeg" width="300px">

#### ２−３）APN設定

　SIMを差し込んでルーターの電源を入れても通信はできません。APNを設定する必要があります。WN-CS300FRの設定画面にログインするとAPNを設定できます。プリセットに「SORACOM Air forセルラー」があるのでこれを選択します。
ここでデフォルトで設定されているユーザー名/パスワードが[SORACOMのスタートガイド「アクセスポイント名 (APN) を設定する」](https://users.soracom.io/ja-jp/guides/getting-started/setup/)のユーザー名/パスワードと異なっています。

|初回アクセス時のデフォルト設定<br>※iPhoneからアクセス|設定後の確認|
|:-:|:-:|
|<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71605/24fbf61a-c448-7329-28d1-26d6cae5cf03.png" width="300px">|<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71605/a9a2f518-16dc-6992-f84f-3e0e019c923e.png" width=200px>|

　SORACOMのページを探っていると、[CHAP認証の場合は任意のユーザー名/パスワードを設定できる](https://soracom.jp/services/air/cellular/)とあります。今回導入したルーターは[CHAP認証に対応している](https://www.iodata.jp/lib/manual/wn-cs300fr/index.html#p5_13__m03)のでプリセットのまま先に進めます。

しばらくすると設定が完了し、Wi-Fi経由でインターネットに接続できます。
VRChatでオブジェクトをつかめるようにする。

#1 この記事は

VRChatで外部からインポートしたオブジェクトに近づいたときにすり抜けたりつかめなかったりすることがあります。オブジェクトをつかんで移動できるようにするためにはいくつかの設定を行う必要があります。ここではその設定の方法を説明します。

#2 方法は

(1)Assetからオブジェクトをインポートします。
![317.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150223/86312535-0e90-550d-fbd6-55488b4a2aaa.jpeg)

(2)Add Componentから「VRC Pickup」「Mesh Collider」「VRC Object SYnc」を挿入します。「Rigidbody」は「VRC Pickup」を追加すると同時にインポートされます。
・Mesh Collider オブジェクトの当たり判定をつける。
・VRC Object Sync オブジェクトをグローバル設定する。
・VRC Pickup オブジェクトを持ち運ぶための設定
![318.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150223/0b909bea-2bbf-8373-348e-c1854abe7237.jpeg)


Mesh Colliderを選択し、Meshを指定する。指定するMeshはオブジェクトそのものです。
![319.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150223/957f8438-e6f3-74c2-25fd-505097160ebe.jpeg)

オブジェクトを空中で静止させるためには、Use Gravityのチェックを外し、Is Kinematicのチェックをつける。
![320.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150223/4378f798-e29b-523c-5ed5-90a47df8d80d.jpeg)
Quiztime Junuary 8th 2022: Tiktok videos investigate and Tiktok Tips

#問題

2022年1月8日に以下の問題が投稿されました。

https://twitter.com/fiete_stegers/status/1479512396066660352?s=20&t=jr0GXS2UCicTFFEDkYYkKQ

1: どのTiktokチャンネルですか？
2: いつからこのチャンネルは存在するのですか？

#概要

Tiktokは近年最も勢いのあるSNSらしいです。

主に若い年代の方に人気があるのは耳にしたこともあるひとは多いはず。

今回はそんなTiktokのビデオチャンネルを特定し、DevToolsを使用しチャンネルが作成された時間を
特定するChronocationの問題です。

画像から見た限りだと、一体なんの動画なのか分かりません。

しかし、画像からは二つのヒントが見えています。

早速検証を始めていきましょう。

#解決策

![FIhHjwjXEAoNyTO.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/848369/80979a69-3142-0c51-377c-b28a6263ed99.jpeg)

まず上から見ていこう。

**00:26** と時間表示されている。

これは動画自体が26秒しかない動画なのか、それとも数分の動画のうちに一時停止された動画なのか？

2つ目は、**@alma1**なのか**@almat**なのだろうか？

どちらにしても検索してみないとわからない。

まずはGoogleで検索してみよう。

Alma1

Almat*

などと検索してみたところ、**Almaty**と検索候補が出てきた。

どうやらAlmatyはカザフスタンの都市でありそうだ。

![スクリーンショット 2022-02-16 21.03.59.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/848369/bd10e23d-336e-bf53-bf22-01c8e307a429.jpeg)


Tiktokで@almatyと検索してみた。

![スクリーンショット 2022-02-16 21.10.27.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/848369/0c3318a1-a8c7-8d98-78c4-7a0e4ac6cdfd.jpeg)

たくさんのアカウントがあるが、写真から判断すると、映像に写っているのは人ではなく何かの物体、建築物であるだろうと思った。

そこで、まずは公式チャンネルから調べてみることにした。

頭文字は@almatyである。

軽くみてみると、**in.almaty**と**almaty.tv**という公式アカウントが出てきた。

Tiktokビデオでは投稿すると右下に投稿者のユーザーネームとアップロードされたビデオ時間が描画される。

よって前者は除外することができる。

[almaty.tv](https://www.tiktok.com/@almaty.tv)のチャンネルを見てみると、1つの動画に注目した。

問題が投稿された1月8日辺りは、ちょうどカザフスタンで反政府デモが行われている最中であった。

https://www.tiktok.com/@almaty.tv/video/7049798449549593858?is_copy_url=1&is_from_webapp=v1

投稿された動画にはデモ隊が空港を占拠したとあるので、おそらく場所はアルマトイ空港であるとわかる。

そしてこの動画は27秒であるが、26秒のところで止めてみると、空港のイスの場面を拡大して切り取った部分であると推測できる。また、この動画は27秒の動画であることも分かった。

![スクリーンショット 2022-02-16 20.55.50.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/848369/786afae3-17b9-b0ef-9396-da6996e7951d.jpeg)


![スクリーンショット 2022-02-16 20.57.31.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/848369/21fe6d5d-8af6-84df-d398-61dca3d6e709.jpeg)


1: __@almaty.tv__

#Tiktok Tips: TikTok Account Creation Date

2つ目の答えだが、私はこの問題に取り組む前に、以下のツイートを見てしまった。

https://twitter.com/IvanoSomaini/status/1480216752906719237?s=20&t=jr0GXS2UCicTFFEDkYYkKQ

このツイートに書かれている時間帯が答えである。

私はChromeでソースを表示して試すことができたので皆さんも見てほしい。

![スクリーンショット 2022-02-16 21.38.54.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/848369/f6c61183-f317-1b7a-6800-ec71b2b8e740.jpeg)
javascript48_属性名と属性値

属性名について関数みたいに決まりがあるわけではなく、どんな名前でも使える。
obj.var = "hello";     →　正しい属性名

特殊な属性名を使用したい場合は、.書くのではなく、
下記のように書かなければいけません。
オブジェクト["属性名"] = 属性値;
例
obj["123"] = 456;
console.log(["123"]);

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067004/a567243c-de6f-0e44-dd12-31a1f4ffc418.png)

属性値はどんなデータ型でもいけます。オブジェクトでもOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067004/0a7cb639-cd1f-0f7f-9687-79a8e7bd89bd.png)

属性がオブジェクトないにあるかどうを確認するには、inを使います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067004/9c2b2b93-fbe1-8669-724f-5cdf483a3f14.png)
Django データをjavascriptで扱えるようにする

djangoのviews.pyからデータをhtmlに送り、その後javasciriptで使用するようにする。

以下の3つのファイルを使用する

```views.py
def index(request):
  data_value = 'sample'
  context = {'data_key':data_value}
  return render(request,'index.html,context)
```

```index.html
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script>
    let data = {{data_key | safe }};
  </script>
  {% if data_key is not None %}
    <div class="mdl-layout__container">
  {%else%}
    error
  {%endif%}
</div>
  <script type="text/javascript" src="{% static 'index.js' %}"></script>
</body>
</html>
```

```index.js
console.log(data)
```

まず、contextでは{'key':value} で送ってあげる
html上では、scriptタグを用いて、`let data = {{data | safe}}`
のような形で取ってあげる。
|safeはHTMLタグを描き出せるようにするためのフィルター機能
その後、jsファイルを読み込んで、書き出しを行う。
これにより、データをjsファイル上で　扱えるようになる。

https://stackoverflow.com/questions/43081610/render-json-response-using-djangos-render

https://qiita.com/70yama/items/ba6d75b3f03f0d3f0479

https://stackoverflow.com/questions/43305020/how-to-use-the-context-variables-passed-from-django-in-javascript/43305140
【Android Studio】テキストをシステムの言語設定に合わせる方法

#はじめに
Androidアプリ内で使用しているテキストが日本語だけではなく、
英語やフランス語など多言語対応していると
かっこいいなと思ったのでやり方をまとめておきます。

##実行環境
- Windows10
- Android Studio Bumblebee | 2021.1.1 Patch 1

#システムの言語設定に合わせる方法
ここでは単純に「こんにちは」というテキストだけ用意して、
Android端末のシステムで言語設定を英語にした場合は「Hello」と表示されるように設定していきます。

###(1)「こんにちは」のテキストビューを配置
テキストビューを配置してtextプロパティに直接「こんにちは」と入力するのはあまりスマートではないので、リソースファイルに文字列を登録していきます。
こうしておくことで後で多言語対応にすることもできます。

まずはtextプロパティの横にあるボタンをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1767634/cc27cb3e-fda9-25f4-d0c3-95ca4ab6e701.png)
　
Pick a Resource のウィンドウが出てくるので、左上の「＋」→「String Value」をクリック。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1767634/831b0571-e7f0-12cf-195b-ce82cbd6672b.png"width=80%>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1767634/df04a2ca-d927-0159-1343-5a0cecc052b8.png" width=80%>
　
New String Value のウィンドウが出てきたら以下のように設定して「OK」をクリック。

- **Resource name** : hello
- **Resource value** : こんにちは

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1767634/57933055-131f-9c69-8306-6c17cb3d2913.png" width=40%>
ちなみにここで設定した **Resource name** はリソースファイルに追加するリソースID、
**Resource value** はそのIDに紐づける文字列を表しています。
app/src/res/values/strings.xml を開くと直接編集することもできます。

　
これで「こんにちは」だけが配置された画面ができました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1767634/fe293946-c9df-2ae3-e3b5-8d272bcf29a1.png" width=80%>

###(2) 英語用の文字列リソースファイルの作成
システムの言語設定が英語だった場合には「こんにちは」ではなく「Hello」を表示させたいので、
次は英語用のリソースファイルを作成する必要があります。

まずは先ほど開いた Pick a Resource のウィンドウを開いて、
今度は「＋」→「String Resource File」をクリック。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1767634/bcbd3f91-962d-7e6a-70d7-27a797c6529b.png" width=80%>
　
String Resource File のウィンドウが開くので、
作成したいリソースファイルのロケール(言語)を設定していきます。

以下のように「locale」→「>>」をクリック。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1767634/fd98aff6-677f-339d-fe3d-3cf478f68eca.png" width=80%>
　
　
次に、Language から 「en: English」をクリックして、
File name の欄に strings.xml と入力して「OK」をクリック。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1767634/9475e933-5bcc-cadb-3abe-961deb3cacd4.png" width=80%>
そうすると app/src/res/ 直下に values-en　ディレクトリが作成されているはずです。
ここに英語用のリソースファイルが配置されます。
今の場合は strings.xml のみが作成されていると思います。
これでひとまず英語用のリソースファイルを用意することができました。

###(3) 英語用リソースファイルを編集
それでは最後に、英語用のリソースファイルに「Hello」を登録していきます。
values-en 直下の strings.xml ファイルを以下のように編集します。
ここで ``` name="hello" ``` の部分は(1)で設定したリソースIDと同じにしてください。

```values-en/strings.xml
<?xml version="1.0" encoding="utf-8"?>
 <resources>
  <string name="hello">Hello</string>
 </resources>
```

###(4) 実際に端末で確認
ここまでの手順ができていれば日本語と英語に対応しているはずなので確認してみます。
以下に並べた左側はAndroidのシステム言語を日本語に設定したもの、
右側は英語に設定したものになります。
無事に言語が切り替わっていることが確認できました！
　　<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1767634/fbc4efbd-0075-b7ed-a2f0-968024f5d7d6.png" width=40%>　　　　　　　<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1767634/9536142a-b8ee-8eba-134b-1e50891830a9.png" width=40%>

#最後に
今回は日本語と英語のみに対応させていますが、同様のやり方でフランス語やロシア語などを追加することができます。
対応した言語のリソースファイルを作るだけなので思ったより簡単にできました。
Android Studio初心者に役に立つことができれば幸いです。
ccnaネットワーク基礎　OUIとは？

ccna独学で覚えたいことを書いていきます。
書くというアウトプットすることで記憶の定着を狙ってます。

OUI(Organizationally Unique Identifier)とは、ネットワーク機器の物理アドレスであるMACアドレスの前半部にあたる、メーカーごとに割り当てられる番号。標準化団体のIEEEが一元的に管理し、通信機器メーカーなどに発行している。
前半24ビットが各メーカーに割り当てられたOUI、後半24ビットがメーカーが個々の機器に重複しないよう割り当てた装置固有の番号となっている。

参考記事サイト：https://e-words.jp/w/OUI.html
画像ファイルが JPEG 2000 形式かどうかを簡易的に判別する

# やりたいこと

画像ファイルが JPEG 2000 形式かどうかを判別したい。本来は JPEG 2000 形式の画像ファイルは拡張子が .jp2 である。しかし、拡張子が .jpg だったり MIME タイプが image/jpeg だったりしても、実際は JPEG 2000 形式である場合がある。そこで、バイナリデータを確認して判断する。

# 方法

[マジックナンバー (フォーマット識別子)](https://ja.wikipedia.org/wiki/%E3%83%9E%E3%82%B8%E3%83%83%E3%82%AF%E3%83%8A%E3%83%B3%E3%83%90%E3%83%BC_%28%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88%E8%AD%98%E5%88%A5%E5%AD%90%29) で判断する。[RFC 3745 - MIME Type Registrations for JPEG 2000 (ISO/IEC 15444)](https://datatracker.ietf.org/doc/html/rfc3745) には

> Magic number(s): 12 byte string: X'0000 000C 6A50 2020 0D0A 870A' (for all JPEG-2000 family files)

と記載されているので、それに則る。

## Ruby

```rb
def jpeg_2000?(binary_string)
  magic_number = %w(00 00 00 0C 6A 50 20 20 0D 0A 87 0A).join
  
  binary_string[0...12].unpack1('H*').upcase == magic_number
end
```

```rb
require 'pathname'

# ~/Downloads/JPEG.jpg は JPEG 形式。
jpeg_image = Pathname(Dir.home).join('Downloads/JPEG.jpg')
jpeg_2000?(jpeg_image.binread)
#=> false

# ~/Downloads/JPEG_2000.jpg は JPEG 2000 形式 (だが拡張子は .jpg) 。
jpeg_2000_image = Pathname(Dir.home).join('Downloads/JPEG_2000.jpg')
jpeg_2000?(jpeg_2000_image.binread)
#=> true
```

## Python

```py
import binascii

def is_jpeg_2000(bytes):
    magic_number = '00 00 00 0C 6A 50 20 20 0D 0A 87 0A'
    return binascii.hexlify(bytes[0:12]).decode('utf-8').upper() == ''.join(magic_number.split())
```

```py
import os

# ~/Downloads/JPEG.jpg は JPEG 形式。
jpeg_image = os.path.join(os.environ['HOME'], 'Downloads/JPEG.jpg')
with open(jpeg_image, 'rb') as f:
    is_jpeg_2000(f.read()) # False
  
# ~/Downloads/JPEG_2000.jpg は JPEG 2000 形式 (だが拡張子は .jpg) 。
jpeg_2000_image = os.path.join(os.environ['HOME'], 'Downloads/JPEG_2000.jpg')
with open(jpeg_2000_image, 'rb') as f:
    is_jpeg_2000(f.read()) # True
```

# バージョン情報

```shell
$ ruby -v
ruby 3.1.0p0 (2021-12-25 revision fb4df44d16) [arm64-darwin21]

$ python --version
Python 3.10.2
```