OmniAICreator/Qiita-1.07M huggingface dataset:
vscodeで補完機能を使用して、HTMLの基本構文を一瞬で記述する方法

こんばんは、OKONIです！

今回はタイトルの通り。
#### "vscodeで補完機能を使用して、HTMLの基本構文を一瞬で記述する方法"
についてです！


先にお伝えしておきますが、HTMLの基本構文 ※1 というのは以下のコードのことです。
※1 正しい言い方があれば教えて下さい🤲

```<!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></body>
</html>
```

# 具体的な方法について

早速ですが、結論をお伝えします。

まずはvscodeで、htmlファイルを準備して下さい。
それから、!(半角びっくりマーク)を入力し、tabキーを押して下さい。

```<!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></body>
</html>
```

はい、一瞬でテンプレートが完成しました。

おっと、
必要に応じて
```<html lang="en">```から
```<html lang="ja">```に変更することをお忘れなく！

それでは、また。
[Podman] M1 Macでamd64用のコンテナイメージを作成する

## 概要と環境
M1 Macを使ってコンテナイメージを作成した際、CPUアーキテクチャの違いが原因でデプロイ先で動作しなかった時の備忘録。環境は以下

 <table>
    <tr>
      <td>OS</td>
      <td>mac OS Monterey</td>
    </tr>
    <tr>
      <td>CPU</td>
      <td>Apple M1 Pro</td>
    </tr>
    <tr>
      <td>Container Runtime</td>
      <td>Podman 4.1.1</td>
    </tr>
 </table>

## 手順

前提としてPodmanはインストール済みとして進める

### 1. qemu-user-staticのinstall

podman machineを起動する

```sh
> podman machine init
> podman machine start
```

qemu-user-staticのinstall

```sh
> podman machine ssh sudo rpm-ostree install qemu-user-static
```

### 2. コンテナイメージ作成

`--platform`オプションを指定することで異なるアーキテクチャに対応させることができる。今回は`amd64`用なので`amd64`を指定する

```sh
> podman build .  -t <image名> --platform linux/amd64
```

複数指定したい場合は以下のように記述する

```sh
> podman build .  -t <image名> --platform linux/amd64,linux/arm64
```
maya python select NurbsCurve by name

```
def selectNurbsCurve(nurbsCurveName):
    curve_transforms = [cmds.listRelatives(i, p=1, type='transform')[0] for i
    in cmds.ls(type='nurbsCurve', o=1, r=1, ni=1)]

    for curve in curve_transforms:
        name = curve.split(":")
        if nurbsCurveName == name[1]:
            cmds.select(curve)

selectNurbsCurve("UpEyeLid_R")
```
Confluence REST APIを使ってjson情報を取得する

Confluenceって、あれやこれややろうとすると、マーケットプレイスのお高い有料アドオンを購入する必要があったりします。
どれもこれも結構するので、これを入れて欲しい！あれを入れて欲しい！と要望を出しても、金がかかるからだめ・・みたいに言われちゃうこと結構あるんですよね。

ということで、REST APIを使って、あれやこれやできないか　の模索です。
そのうち、ツール化みたいにできた方がいいなと思っているんだけど、そういうところに手を出す前の調べもの段階。

# Confluence REST API
公式のREST APIはこことか。

https://docs.atlassian.com/ConfluenceServer/rest/7.18.2/

curlのでGETしてくる時のREST APIの情報が書かれています。

confluenceというか、アトラシアンには、Cloudサービスもあるんですけど、それとまた使い方が違うっぽい？から使う時は、SERVERなのか、CLOUDなのかとか注意して使う必要がありそうです。

## REST API EXAMPLE

https://developer.atlassian.com/server/confluence/confluence-rest-api-examples/

ここに例文が色々載っていました。

色々はしょるとこう。
```
curl -u admin:admin \
http://localhost:8080/confluence/rest/api/content/scan?limit=2 | python -mjson.tool
```

ただ、python通すとなんだか文字ばけしたりして使いづらかった。
設定の問題だと思うけど。
jqでとってくるのもできる。
```
curl -u admin:admin \
http://localhost:8080/confluence/rest/api/content/scan?limit=2 | jq .
```

ちなに、JIRAで検索する時はJQLっていうけど、ConfluenceだとCQLっていうんだって。
知らなかった。
cqlを通じて簡単にpageIDから検索することも可能。
ユーザーIDとパスワードでアクセスしてるけど、トークン使ってのアクセスをすることも可能。

```
curl -u admin:admin \
http://localhost:8080/confluence/rest/api/content/scan?limit=1&cql=id=11111 | jq .
```
こうすれば、一意のpageIDでlimit1個の情報が取れる。
こっから、jq使って、title抽出するとか、色々することが可能。

なお、会社でconfluence/jira使っているからやってみたら最初取ることができなかった。
色々試したところ、VPN接続しないとcurlが使えないということがわかった。
browser通してだと、jira/confluenceアクセスできるからちょっと盲点だった。
【JavaScript（jQuery）】正規表現　文字チェック　バリデーションチェック

# 概要
フォームでよくあるバリデーションチェックですが、フロント側でも実装をすることがあるため、記事にしました。
## 仕様
今回は、「入力させない」（正確には、入力されても即座に削除）タイプの記事にしました。
また、記事は「数字のみ入力可能」の仕様となってます。
## 手法
■HTML
```html
<input type="text" name="pass" class="text js-num-only" value="">
```
■JavaScript（jQuery）
```javascript
$(function () {
    'use strict';

    let inputNum;

    $('.js-num-only').on('input', function (e) {
        let numVal = $(this).val();
        inputNum = numVal;
        inputNum = inputNum.replace(/\D/g, '');　//数字以外は入力不可（削除）にする
        $(this).val(inputNum);
    });
});
```
■CSS（こちらはお好きに）
```css
.text {
  display: block;
  padding: 8px;
  width: 150px;
  border: 1px solid #666666;
  border-radius: 6px;
  background-color: #f6f6f6;
  font-size: 1.06667rem; 
}
```
■実際のサイト
https://codepen.io/msksed_1129/pen/ZExQpqo
## 補足
正規表現には様々なパターンが考えられます。
今回は、`/[^0-9]/g`を設定させていただきました。
`/[^a-z]/gi`にすると、大文字・小文字の英語を設定できたりします。
`gi`の箇所は正規表現フラグを使ってますので、こちらも調べてみると楽しいかもしれません。
AWS SnowBall（Snowfamily)の用語要点まとめ（自分用メモ

AWS Snowファミリーは多量のデータをAWSストレージへ転送するサービスです。利用者には大容量のストレージを備えた機器がAWSから貸し出され、移行対象のデータを機器へ取り込んでからAWSへ返送すると、データがAmazon S3へ保存される仕組みです。また、貸し出される機器にはCPU（vCPU）やメモリなどを潤沢に搭載したものを選択でき、データ転送だけでなく、IoT端末やエッジコンピューティング（IoT端末自身、または近いエリアのサーバーで処理を行うこと）を実現することもできます。
Snowファミリーにはデータの量や用途ごとに選べる3つのサービスがあります。
・AWS Snowcone・・・１０TB。AWS Datasyncを使用してオンラインでデータ転送ができる。
・AWS Snowball・・・８０TB
・AWS Snowmobile・・・１０PB（１０００００TB）

・AWS Snowball
Snowballを注文する際は、データ転送（インポート・エクスポート）用途とコンピューティング用途など自分にあったものを選択します。
なお、コンピューティング用途の場合は、複数台で構成するクラスターの注文も可能です。クラスターを構成することにより耐久性や耐障害性を向上させることができます。
さらにどの機器を利用したいかも選択します。


●Snowball Edge Storage Optimized
データ転送用のオプションで、デバイスには内蔵HDD80TBが搭載されています。
オンプレミスからS3へデータをインポートする用途のほかに、S3からエクスポートするケースでも利用します。インポートする際は空のデバイスが届きますので、自分でデータをデバイスへ転送します。エクスポートする際は、対象のデータが格納されたS3バケットを注文時に選択すると、デバイスにデータがロードされた状態で届きます。
いずれも利用完了後にAWSへ返送すると、データ移動など必要な処理が行われたあとにデータが消去されます。
なお、1台あたりのストレージ容量は最大で80TBですので、それ以上の容量を転送したい場合は複数のSnowballデバイスを申請する必要があります。

●Snowball Edge Compute Optimized
Storege Optimizedがデータ移行向けのデバイスであるのに対して、Compute Optimizedはコンピューティング向けのデバイスです。多くのCPU（vCPU）とメモリを搭載した機器が用意されており、更にGPUを備えた機器を注文することもできます。
本オプションはデータの転送を行う前処理として利用します。独立した場所（ネットワーク環境が整っていない、インターネットを利用できないなど）における機械学習や、分析処理などの用途に向いています。
なお、Compute Optimizedに限らず、Snowファミリーのデバイスはインターネットを必要としないオフラインでの操作が可能です。

なお、Snowballではオプションとして事前にEC2 AMIやLambda関数をデバイスに設定しておくことができます。転送するデータに特殊な処理を行いたい場合や分析を行いたいようなケースで活用します。


【クラウドへのデータ移行】
AWSクラウドへデータ移行を行うサービスには、Snowballのほかに以下のようなものがあります。

・AWS Storage Gateway ... オンプレミスからAWSのストレージサービスへのアクセスを高速かつセキュアに行うことができるサービス
・AWS Direct Connect ... AWSとの物理的な専用回線を構築するサービス
・AWS Datasync ... オンプレミスのストレージと、Amazon S3、Elastic File System（EFS）、FSx For Windowsファイルサーバーなどの間でデータを移行するサービス

Snowballと他のサービスとの違いは、オフラインでデータを移行できるかどうかです。上述したサービスはオンプレミスからオンラインでデータにアクセスするため、移行対象のデータが更新中のものであったり、停止できないシステムのデータを移行したい場合に利用します。
Snowballは、AWSから送付されたハードウェアに一旦データを保存し返送すると、後日AWSによって当該データがS3バケット上へ保存されるため静的なデータの移行に適しています。例えば昨年までの数年分のバックアップデータの一括移行や、過去のログファイルの保存先として利用するのがよいでしょう。移行済みのデータを活用したい場合は、S3上のデータへいつでもアクセスできます。
Snowballへ転送した後に生成されたデータは直接S3に保存することで、初期転送するデータ量を抑えつつスムーズにクラウドストレージに移行できます。
7.2 (難) 尤度比検定2 帰無仮説が単純仮説でない場合

## 方針

帰無仮説が単純仮説でないため，尤度比検定統計量 (CRTS) の漸近分布が求められない．そこで，CRTS>c→reject H_0が有意水準alphaとなるようにcを求めることで尤度比検定とする．

また，帰無仮説が単純仮説でない場合，「帰無仮説における分布」が一意に定まらない．そこで，lambda=lamda_0とした検定をまず作ってから，それが帰無仮説においてサイズalphaであることを示す．

## 答案

![7.-6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/40ae831f-c9db-bdbd-4a48-2d806fdd5840.jpeg)
![7.-7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/fa5d89a8-0361-d4bb-d5af-62123566426c.jpeg)
![7.-8.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/1a636c0e-c9aa-70a6-c8fa-ad636d43e3cb.jpeg)
![7.-9.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/e0ecc08b-d4ed-26d1-66d8-27194ffbf19d.jpeg)



## 参考文献

- 『[現代数理統計学の基礎](https://www.kyoritsu-pub.co.jp/bookdetail/9784320111660)』(久保川達也　著)
【スッキリわかるSQL入門】学習備忘録 

# SQL入門学習履歴　1章
プログラミング初学者の備忘録です。
『スッキリわかる　SQL入門　第３版　』　中山清喬/飯田理恵子　著、株式会社インプレス発行
についての学習を記録していきます。

## **RDBとは**
RDBはDBMS（database management system）に対して命令文（SQL文）を送る。
DBMSのうち、複数の表の形式でデータを扱うものを特にRBMS（relation database management）という。
SQL文は書くデータベースが定める特有の手順や形式に従ってネットワーク経由でSQL文を送れるようにする。

## 検索に関する記述
SELECTには検索したい列をFROMは検索したいテーブルを書く。
アスタリスク＊は全ての列を取得することができるコマンド

```
SELECT *
FROM 〇〇
```

検索に条件を指定する場合は、WHEREの記述を追記する。

```
SELECT *
FROM 〇〇
WHERE 〇〇　> 条件にしたいもの
```

## テーブルにデータを追加する
INSERT INTO で追加するテーブル名を、VALUESで追加するデータを指定することで追加が可能になる。
```
INSERT INTO テーブル名
VALUES （'テーブルの', 'カラムに', '合わせて', 'データ入力')
```
## データを更新・削除する
既存のデータを更新する場合は、UPDATE　SETとDELETE　FROMを記述する。
```
UPDATE テーブル名
SET 修正したいカラム名　＝　修正後のデータ
WHERE 修正したいカラムの行　＝　〇〇
```
削除の場合は次のような記述方法（行全てを削除する方法）
```
DELETE FROM テーブル名
WHERE 削除したい行　＝　’行のカラム名’
```
OmegaConf の自分用テンプレート

# はじめに
（Qiita 初投稿です）
honeko と申します。
本記事は、Python で Config ファイル管理に便利な OmegaConf について、個人的によく使うテンプレートを備忘録的に残したものです。
情報量が多くなりすぎると使いにくいので、本当に最小限の情報のみを記載しています。
（具体的には YAML ファイルの読み出し / 要素へのアクセスなど）
限定公開で自分だけ閲覧できるようにするか悩みましたが、少しでも誰かの役に立てばと思い、公開するに至りました。
至らぬ点も多々あるかと思いますが、暖かい目で見ていただければ幸いです。
間違っている点がありましたら、コメント欄にてご指摘いただけると幸いです。

- 環境
  - Python: 3.8.9
  - omegaconf: 2.2.2

# テンプレート
早速ですが、色々なテンプレートを記載します。
外部ライブラリなので、使用する際は `pip install omegaconf` が必要です。

### YAML ファイルの書き方
そもそも、YAML ファイルの書式を知らなければアクセスの仕方もわかりません。
本記事ではテンプレートの紹介のみ行うため、ここでは細かいことは説明せず、ざっくり雛形的なものを載せるに留めます。
半角スペースでインデントを揃える必要がある点に注意しましょう。

```yaml: members.yaml
Tanaka:
  ID: 1000
  age: 34
  lang: Japanese

John:
  ID: 1001
  age: 28
  lang: English

# リスト型にしたい場合
Sato:
  - 1002
  - # ここは None として扱われる
  - Japanese
```

### Config ファイルが一つの場合のデータ読み込み

先の書式に従って記述した Config ファイルは、下の関数で読み込むことができます。

```python: load_conf.py
from omegaconf import OmegaConf

def load_config(cfg_file):
    conf = OmegaConf.load(cfg_file)
    return conf

# How to use
path_A = "path to A.yaml"
conf = load_config(path_A)
```

読み込んだ個々の設定にアクセスしたり、一覧を表示するには以下のようにします。
ここでは members.yaml を読み込んだ場合の例です。
```python
print(type(conf.Tanaka.ID))     # -> int
print(conf["Sato"][1])          # -> None
print(OmegaConf.to_yaml(conf))  # YAML 形式で出力してくれる
```

### Config ファイルが二つ以上の場合
二つ以上の Config ファイルをマージします。
先の例だと、メンバーの追加などを行いたい場合に良いかもしれません。
一つの場合でも ↓ で代用できるので、迷ったらこちらを使ったほうが丸いと感じます。

```python: load_confs.py
from omegaconf import OmegaConf

def load_config(*cfg_files):
    base_confs = map(OmegaConf.load, cfg_files)
    conf = OmegaConf.merge(*base_confs)
    return conf

# How to use
path_A = "path to A.yaml"
path_B = "path to B.yaml"
conf = load_config(path_A, path_B)
```

# おわりに
設定ファイルの作成と読み込みの機会があまりにも多い（そのくせ細かい部分で忘れやすい）ので、すぐにコピペできるようにテンプレートを用意しました。
より深く OmegaConf について学びたい場合、公式 GitHub のチュートリアルなどが参考になると思います。
参考リンクから辿ることができるので、興味のある方は是非試してみてください。

# 参考リンク
https://github.com/omry/omegaconf
AWS CloudFormationの用語要点まとめ（自分用メモ

・AWS CloudFormation
AWSクラウド上での環境構築を自動で行うサービスの1つです。自動的に構築を行うサービスとしては他に「Elastic Beanstalk」「OpsWorks」。
JSON、YAMLでAWSリソースを定義し、各種AWSの構築や設定を行う。

CloudFormationではElastic BeanstalkやOpsWorksより多くのAWSサービスに対応しており柔軟な構成を組むことができますが、その分各AWSサービスやロードバランサーなどのインフラストラクチャ（基盤）技術についての知識も必要。


CloudFormationはいわゆるIaC（Infrastructure as Code）です。IaCとは、仮想化されたサーバーやデータベース、ネットワーク構成などの環境をコード（コンピュータが処理可能な形式）で定義し、それを実行することによって再現（構築）するという技術をいいます。IaCのメリットには、例えば以下のようなものがあります。
・同じ作業を別の人間が実施できる
・同じ、または似た構成の環境を何度も作成できる
・環境がコード化されていることにより、リソース量やパラメータなど環境の変更管理が容易になる
CloudFormationではほぼすべてのAWSリソースをコード化することができます。EC2やELBなどサーバー環境の構築だけでなくAmazon CloudWatchなど運用支援のサービスも含まれているため、CloudFormationを利用することで構築および運用を自動化することができます。

・テンプレートとスタック
CloudFormationを利用し始めるには、ユーザーはまず「テンプレート」というコードを作成します。テンプレートはJSONまたはYAML形式で書かれたコードです。テンプレートは、例えばEC2インスタンスのインスタンスタイプやRDBのパラメータの定義など、AWSリソースをどのように利用するか、という設計図にあたります。
テンプレートを作成した後は、CloudFormationに読み込ませることによりAWSリソースがプロビジョニング（構築）されます。このときAWSリソースは「スタック」という単位で管理されます。
例えばWebアプリケーションをリリースしたい場合、CloudFormationのテンプレートにはEC2インスタンスやS3など必要なAWSリソースを定義し、プロビジョニングします。Webアプリケーションが不要になった場合、（一つ一つのAWSリソースではなく）プロビジョニングしたスタックをすべて削除することで、Webアプリケーションとして利用していたリソースを削除することができます。
スタックは1つのテンプレートから複数作成することもできます。またスタックを削除した場合も、テンプレートからもう一度同じスタックを作成することも可能です。
なお、上例では複数のAWSリソースを定義していますが、VPCだけ、EC2インスタンスだけ、といったプロビジョニングも可能です。

テンプレートは自分で作成することも可能ですが、AWSによって配布されているサンプルを利用したり、マネジメントコンソールからGUIで作成することもできます。


・スタックセット
AWS CloudFormationで作成したテンプレートを基に、複数のAWSアカウントで、または複数のリージョンでスタックを構築したい場合には「スタックセット（StackSets）」を利用します。管理者アカウントで作成したテンプレートを利用して、ターゲットアカウント（プロビジョニングを行うアカウント）とプロビジョニングを行うリージョンを指定することで、一度の操作で複数の同じ環境を構築できます。
テスト環境を複数構築したい場合や、新たにアカウントを払い出す際に下準備となる操作（IAMやセキュリティグループの設定など）をスタックセットとして作成しておく、といった利用ができます。
GitHub actionでwindows-latestのrunnerを使用する試み

GitHub actionでwindowsが使えることは知りつつも使った事がなかったので使ってみる試みです。

> https://docs.github.com/ja/actions/using-github-hosted-runners/about-github-hosted-runners
> available with Ubuntu Linux, Windows, or macOS operating systems.

通常のGitHub action用のyamlファイルのうち、`windows-latest`を使うには、`runs-on: windows-latest`の部分を記述すればOK。
処理内容は、https://github.com/seigot/tetrisのリポジトリをgit cloneしてきて実行するだけのもの。
push, pullrequest時にci実行トリガーするようにしています。

```yaml:.github.workflow/test-windows.yaml
name: test-windows
on: 
# push, pullrequest時にci実行
    push:
        paths-ignore:
          - '.gitignore'
          - 'LICENSE'
          - '**.md'
    pull_request:
        paths-ignore:
          - '.gitignore'
          - 'LICENSE'
          - '**.md'
jobs:
  build:
    name: MSBuild
    runs-on: windows-latest

    strategy:
      matrix:
        python-version: [3.9] # [3.5, 3.6, 3.7, 3.8]

    steps:
      - name: Checkout
        uses: actions/checkout@v2

      - name: Set up Python ${{ matrix.python-version }}
        uses: actions/setup-python@v4
        with:
          python-version: ${{ matrix.python-version }}

      - name: Install dependencies
        shell: powershell
        run: |
          git --version
          python --version
          python -m pip install --upgrade pip
          pip install pyqt5
          pip install numpy

      - name: tetris
        shell: powershell
        run: |
          Remove-Item -Recurse -Force tetris
          git clone https://github.com/seigot/tetris
          cd tetris
          pip install -r requirements.txt
          $Env:QT_QPA_PLATFORM = 'offscreen'
          python start.py -m sample -t 3 -f $HOME/result.json
```

Powershellのコマンドは以下を駆使して調べればOK

>https://docs.microsoft.com/ja-jp/powershell/scripting/learn/tutorials/01-discover-powershell?view=powershell-7.2
> コマンドレットを使用して PowerShell を探索する
PowerShell を初めて選択したときは、学習することが多く見えるため、難しいと思われるかもしれません。 しかし、PowerShell は、必要に応じて少しずつ学習できるように設計されています。
PowerShell には、PowerShell をよく知るのに役立つコマンドレットが含まれています。 これら 4 つのコマンドレットを使用して、使用可能なコマンド、実行内容、および操作の対象となる型を確認できます。
Get-Verb. このコマンドを実行すると、ほとんどのコマンドが従う動詞の一覧が返されます。 また、応答には、これらの動詞の動作が記述されています。 ほとんどのコマンドがこの名前付け規則に従うため、コマンドの動作 (適切なコマンドの選択に役立ちます)、さらにはコマンドを作成する場合の名前付けに関する期待値が設定されます。
Get-Command. このコマンドでは、コンピューターにインストールされているすべてのコマンドの一覧が取得されます。
Get-Member. オブジェクトベースの出力に対して動作し、コマンドで使用できるオブジェクト、プロパティ、およびメソッドを検出できます。
Get-Help. コマンドの名前を引数として指定してこのコマンドを呼び出すと、コマンドのさまざまな部分について説明するヘルプ ページが表示されます。


# 参考
[GitHub ActionsでMSBuildによるビルドを行う](https://zenn.dev/shimat/articles/d9ed0345c9866e)
[GitHub Actions v2使ってMSBuildを試してみた](https://qiita.com/y428_b/items/f8e0c598238d75f808b1)
[user interface - Windows用のxvfbやxnestのようなものはありますか？](https://tutorialmore.com/questions-1632094.htm)
便利な拡張機能のメモ


# 拡張機能
	AdBock — 最高峰の広告ブロッカー 
	Close Tab by Double Right Click: 右クリック2回でタブを閉じる
	Google 翻訳
	Link Blanker: 右クリックで新規タブを開く
	Vimium: Vimライクなキーバインディング
	マウスジェスチャー
	Imagictポップアップ辞書-英和/英英辞典
	Keepa : Amzon価格変動のトラッキング
	Personal Blocklist: 検索結果からブロック
AWS OpsWorksの用語要点まとめ（自分用メモ

・AWS OpsWorks
インフラ構築を自動で行うサービスの一つです。自動的に構築を行うサービスとしては他に「Elastic Beanstalk」「CloudFormation」。

OpsWorksでは例えば、EC2インスタンス上にサーバー用のパッケージをインストールしてデータベースのセットアップを行い、作成したアプリケーションをデプロイ（動作環境への展開）する、といった一連の作業を自動化することができます。また構築後のアップデート対応やパッチ適用も自動的に行うように設定できます。
OpsWorksではEC2インスタンス、EBS、Elastic IPやCloudWatchなどのAWSリソースを自動的に構成・管理することができます。

Chef、Puppetはどちらもサーバーの構成管理（パッケージのインストールやアプリケーションの設定など）をコード化し、デプロイや管理を自動で行うことができるOSS（オープンソースソフトウェア）。

OpsWorksには以下の利用形態があり、どのツールを使用するかを選択することができます。
・AWS OpsWorks for Chef Automate
・AWS OpsWorks for Puppet Enterprise
・AWS OpsWorks Stacks
以下ではそれぞれのサービスについて説明します。

●AWS OpsWorks for Chef Automate
構成管理ツールとしてChefのソフトウェアスイート「Chef Automate」を使用します。Chef AutomateにはChef本体に加えてテストツールや環境の可視化を行うツールなどが導入されています。
ChefサーバーとChefの設定を適用するクライアント群のサーバークライアント方式で構成されます。Chefの設定ファイル（レシピ、クックブック）やクライアントへの適用状況はサーバーで管理することができます。
既にレシピやクックブックを持っている場合は連動が可能です。

●AWS OpsWorks for Puppet Enterprise
「Puppet Enterprise」はインフラおよびアプリケーション管理を行うPuppetを含むソフトウェアスイートです。Puppetサーバーを用意し、設定ファイル（マニフェスト）や設定を行う各ノード（クライアント）の管理を行うことができます。
既にPuppetのマニフェストを持っている場合は連動が可能です。

●AWS OpsWorks Stacks
Chefをサーバークライアント方式ではなくローカルで使用するサービスです。EC2インスタンスにインストールされているChef Soloクライアントを使用し、自分自身のノードのレシピ管理や状態管理を行います。

なお、Chefの構成管理ファイルであるクックブックは自分で一から作成することも可能ですが、AWSがGitHub上に公開しているものを利用することもできます。
JUnit5の@BeforeEachと@AfterEachが実行されない

# 問題
JUnit5でテスト実行時に`@BeforeEach`アノテーションと`@AfterEach`アノテーションのついたメソッドが実行されないことがあった。

# 解決策
下記リンクの回答で解決。

https://stackoverflow.com/questions/49441049/junit-5-does-not-execute-method-annotated-with-beforeeach

>Your init() method is not invoked because you have not instructed Maven Surefire to use the JUnit Platform Surefire Provider.
>Thus, surprisingly your test is not even being run with JUnit. Instead, it is being run with Maven Surefire's support for what they call POJO Tests.
>Adding the following to your pom.xml should solve the problem.
>```
><build>
>    <plugins>
>        <plugin>
>            <artifactId>maven-surefire-plugin</artifactId>
>            <version>2.19.1</version>
>            <dependencies>
>                <dependency>
>                    <groupId>org.junit.platform</groupId>
>                    <artifactId>junit-platform-surefire-provider</artifactId>
>                    <version>1.1.0</version>
>                </dependency>
>            </dependencies>
>        </plugin>
>    </plugins>
></build>
>```

上記の設定をpom.xmlに追加すれば良い。
AWS Elastic Beanstalkの用語要点まとめ（自分用メモ

AWS Elastic Beanstalk
アプリケーションが動作する定番の構成を提供。アプリケーションの開発者は、Elastic Beanstalkによって用意されている定番構成の中からアプリケーションの実行環境に適したものを選んで数クリックするだけで、環境（インフラ）を作成することができます。
EC2インスタンスは、OSはもちろん、Webサーバーソフトウェアやアプリケーションの実行環境などがインストール・設定された状態で提供されます。単一インスタンス・複数インスタンス（Multi-AZ）の構成を選択でき、関連する各種AWSサービス（ELBやS3、Auto Scalingグループなど）も設定済みのため、開発者はアプリケーションをアップロードするだけでデプロイ（実行環境への展開）を行うことができます。

Elastic Beanstalkでは、状況に応じたデプロイ方式を選択することができます。例えば、新規の環境やテスト時などにはすべてのインスタンスに一括でデプロイを行えます。一方、稼働中のアプリケーションをバージョンアップするような場合には、一部のインスタンスから段階的にデプロイを行う方式や、旧環境は稼働したまま新しい環境にバージョンアップしたアプリケーションをデプロイし、問題ないことが確認できたら旧環境とURLを入れ替える方式などがあります。段階的にデプロイする際に行うELBの切り替えや新規インスタンスの構築などは、Elastic Beanstalkがすべて自動で行います。アプリケーションの開発者にとってはシステムの複雑な設定や切り替え作業を行う必要がなく、開発したアプリケーションを安全に展開できます。

環境が構築された後も、運用管理などはAWSによって行われます。例えば、EC2インスタンスのOSや導入されている各ソフトウェアへのアップデートも自動的に適用されるように設定できます。
また、Elastic Beanstalkで利用するリソースは自動スケーリング（Auto Scaling）に対応しており、利用状況に合わせた柔軟な構成変更を行うことができます。
なお、Elastic Beanstalk自体は無料で利用可能です。Elastic Beanstalkで構築した環境で動作するEC2インスタンスやS3バケットなど、利用したAWSリソースの分の料金がかかります。

ユーザーはアプリケーションの名前と使用するプラットフォーム（実行環境）の情報のみで使い始めることができます。
さらに細かな設定を行いたい場合は「より多くのオプションの設定」から設定可能です。例えば負荷分散を考慮して複数のインスタンスを構築したい場合や、データベースサービスのRDSに関する設定を行うことができます。

Elastic Beanstalkで利用可能なプラットフォームには、Java、.NET、PHP、Ruby、Python、Node.js、Go、Docker。またWebサーバー用のソフトウェアにApacheやNginx、IISなど。

Dockerは、ミドルウェアの設定や各種環境をDockerfileというテキストファイルにコード化して管理できるため、同じ環境を配布したり別の環境に持ち出したりできる、などの特徴があります。
なお、Elastic Beanstalkでは単一（シングル）コンテナ、マルチコンテナの両方に対応しています。シングル・マルチとはEC2インスタンス上で作成できるコンテナの数を意味しており、シングルコンテナの場合は1インスタンスに1つのコンテナを、マルチコンテナの場合は1インスタンスに複数のコンテナを動作させることができます。

Elastic Beanstalkを利用する大きな目的は「アプリケーションのデプロイを時間をかけずに行う」という点にあります。
インフラやサーバーに関する知識がなくても定番の構成を利用するだけでアプリケーションを公開することができます。
Arduino UNOでAnalog Digital Converterを6ch分グラフ表示するWindowsアプリ

## アナログ波形(5V)を6ch分リアルタイムグラフ表示するツール
Arduino UNOを使った簡易オシロスコープ

以前のArduino UNO ADC表示の実行形式版となります。
Pyinstallerで単独で実行できるようにしました。
https://qiita.com/Nomisugi/items/fcad01dacfb7d728be44

### 概要
Arduino UNOのADCポート(Port A0～5)をGUIでグラフ表示します
![ArduinoUNO.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506495/9597fd5b-31fa-e364-8944-343d1d486ef3.png)

### 使い方
1  Arduino UNOに Ardipy.inoを書き込む(PortControlerのプログラムと同一)
https://github.com/Nomisugi/Ardipy/blob/master/Ardipy01.ino

2  Ardipy_PortControler.exeをダウンロード
https://github.com/Nomisugi/Ardipy/raw/master/bin/Ardipy_ADGraph.exe

3  Ardipy_ADGraph.exeを実行
![AD1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506495/fac276b2-43f2-591f-915c-3b245e8d3cd8.png)


4 ConnectボタンでArduino UNOと接続する
![AD2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506495/6705b785-2565-4ae1-a0f6-ca2552af55a5.png)
接続成功すると、6ch分の波形が出力されます。

5 Arduino UNOの5V, 3.3V, GNDの測定
![AD3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506495/e76b943d-81d5-8d31-f1ae-fe8e27a2de40.png)

6 パルスジェネレータから0.1HzのSIN波と三角波を出力し、キャプチャしてみる。
パルスジェネレータ出力波形
![パルスジェネレータ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506495/dd70d448-8346-9811-b31d-adf343bd80ba.png)

AD5とAD4に波形を入力し、Ardipy_ADGraphでの入力波形を確認
![AD5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506495/dc5cbc78-4e13-89c3-b8b5-e4537da44829.png)

分解能が極端に低い(100ms 最高でも10ms)ので、1Hzの波形もきれいに取得できませんが
長周期なシグナルを取得する分には、このツールを使った方が長くデータとれるのではないでしょうか。
opencv obs virtual cam

https://github.com/Fenrirthviti/obs-virtual-cam/releases

```
if os_name in ['Windows']: # CAP_DSHOW is required on my windows PC to get 30 FPS
        cap = cv2.VideoCapture(args.cam+cv2.CAP_DSHOW)
    elif os_name in ['Darwin']: # MAC with CamTwist
        cap = cv2.VideoCapture(1)
    else: # linux PC is as usual
        cap = cv2.VideoCapture(args.cam)

```
windows powershellで環境変数を設定する

以下の公式ドキュメントを参考にすればOK

> https://docs.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_environment_variables?view=powershell-7.2
> 環境変数の値は、次の構文で作成および更新できます。
PowerShell
$Env:<variable-name> = "<new-value>"
たとえば、環境変数を作成 Foo するには、
PowerShell
$Env:Foo = 'An example'

ubuntu系でいうところの以下の環境変数設定をpowershell上で行う場合

```sh
export QT_QPA_PLATFORM="offscreen"
```

以下のようにすればOK

```powershell
$Env:QT_QPA_PLATFORM = 'offscreen'
```

# 参考
https://docs.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_environment_variables?view=powershell-7.2

https://qiita.com/seigot/items/4233b63cf542ae5cf30f
【Git】ブランチを切り替えられない

# エラー文
```
Another git process seems to be running in this repository, e.g.
an editor opened by 'git commit'. Please make sure all processes
are terminated then try again. If it still fails, a git process
may have crashed in this repository earlier:
remove the file manually to continue.
```
![スクリーンショット 2022-07-06 13.24.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/f5f1ad13-ff47-41ee-10e0-1e598600e5ab.png)

# 解決方法
`index.lock`を削除します。
![スクリーンショット 2022-07-06 13.27.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/6795c561-28ae-345a-bbe4-de79b3d4ddc1.png)

# 参考

https://stackoverflow.com/questions/38004148/another-git-process-seems-to-be-running-in-this-repository
AWS CloudTrailの用語要点まとめ（自分用メモ

・AWS CloudTrail
AWSサービスに対して「いつ」「誰によって」「どのような操作が行われたのか」を記録・保存するサービス。利用登録なしに過去90日間のログを無料で参照可能。


イベントの発生日時と操作したユーザー、対象のリソース名などが表示。また左端の「▶」マークをクリックすることで、詳細情報を参照することもできます。
例えば、操作した覚えがないのにリソースが増減されていたりインスタンスが削除されていたような場合でも、CloudTrailのログを参照することで誰がどのような操作を行ったのかを確認できます。

監視対象となるイベント：
・管理イベント ... ユーザーのログイン、EC2インスタンスの作成 など
・データイベント ... S3上のオブジェクト（データ）の操作、Lambda関数の実行
・インサイトイベント ... 通常と異なる操作（書き込みAPIの呼び出し）

管理イベントとは具体的には管理コンソールからの操作やAWS CLI（コマンド）、APIによる操作です。これらはデフォルトでダッシュボードから参照できます。
データイベントおよびインサイトイベントはデフォルトでは有効になっておらず、「証跡情報」を登録しそれぞれのイベントの記録を有効にするか否かを選択します。

・証跡情報
CloudTrailのログは「証跡情報」を登録することによりS3バケットへ保存することができます。S3バケットへログを保存することにより、90日を超えてもCloudTrailのログを保存しておくことができます。
以下は証跡情報の登録画面です。

S3へ保存するログの内容はJSON形式で出力され、gz形式で圧縮されます。保存する際はAmazon KMS（Key Management Service）を利用して暗号化することも可能。

・複数アカウントのログ保存
企業や組織などにおいて複数のAWSアカウントを管理している場合、それぞれのCloudTrailのログを1つのS3バケットで管理することができます。例えばアカウントA、B、Cの操作ログを監査用のアカウントDに属するバケットに集約することで、監査を容易に行えたり、各アカウントによるログの改ざんを防ぐことができます。
複数アカウントのCloudTrailログを集約する際は、証跡情報の作成時に「ストレージの場所」を既存のS3バケットに指定します。なお指定するS3バケットは、他のアカウントからアクセスが可能になるように事前にバケットポリシーを設定しておく必要があります。

・CloudTrailとCloudWatch Logsの連携
CloudTrailは、AWSサービスのログを一元管理するサービスAmazon CloudWatch Logsと連携することができます。
CloudWatch LogsとCloudTrailを連携することにより、操作ログに特定のキーワードが登場した際に管理者宛に通知を行うことができます。キーワードには例えば、ログインイベント「ConsoleLogin」を指定したり、EC2インスタンスの変更（作成・終了・停止など）イベント「EC2InstanceChanges」などを指定することができます。これにより管理コンソールへ不正なログインが行われたときに検知したり、意図しないインスタンスの変更が行われていないかをアクティブに監視することができるようになります。
Goormで学習をすすめる  "Web開発で学ぶプログラミング"


こちらの記事を参考に、Goorm にて開発を行いたい初学者の為に、
細かな変更箇所を追記しておきます。
https://zenn.dev/odentravel/books/e69a157daeecb3/viewer/379433

（追記予定）

![スクリーンショット 2022-05-24 12.28.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33092/a71ac3c5-7f42-4e2b-fa3b-2f583966f3a6.png)
右上にある**新しいコンテナ**をクリックしてください。
コンテナ名 **traveler**
地域　**Seoul (KOR)**
公開範囲 **Private**
テンプレート　**基本テンプレート**
配備　**Not used**
ソフトウェアスタック **Rails**を選択
以上の情報を入力、選択し、コンテナを作成してください。
作成には時間がかかります。

作成されるとロードが入り、このようなページに入ります。
![スクリーンショット 2022-05-24 12.41.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33092/a1a27f6f-aca2-0f78-0e86-38b8edf2a309.png)

右上にある**▶Run**を押してください。
下部のターミナルがこの様になってたら良いです。
```terminal:terminal
root@goorm:/workspace/kadai# cd /workspace/kadai && rails s -b 0.0.0.0 -p 3000
=> Booting Puma
=> Rails 6.0.3.2 application starting in development
=> Run `rails server --help` for more startup options
Puma starting in single mode...
* Version 4.3.5 (ruby 2.6.5-p114), codename: Mysterious Traveller
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://0.0.0.0:3000
Use Ctrl-C to stop
```
Railsアプリケーションページを表示するには、
**▶Run**の左にある**Preview　> 
Open Preview in New Tab**を押すと、
新しいタブで下部のようなページが表示されると環境構築は完了です。
![スクリーンショット 2022-05-24 12.46.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33092/b153db64-e7ae-9a31-ed2b-68c704d9d72e.png)

```terminal:terminal
root@goorm:/workspace/traveler# rails g controller homes
【↓実行結果例】
Running via Spring preloader in process 2158
      create  app/controllers/homes_controller.rb
      invoke  erb
      create    app/views/homes
      invoke  test_unit
      create    test/controllers/homes_controller_test.rb
      invoke  helper
      create    app/helpers/homes_helper.rb
      invoke    test_unit
      invoke  assets
      invoke    scss
      create      app/assets/stylesheets/homes.scss
```

```app/controllers/homes_controller.rb
class HomesController < ApplicationController
  def top
  end
end
```

```config/routes.rb
Rails.application.routes.draw do
  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
  get 'top' => 'homes#top'
end

```

```app/views/homes/top.html.erb
<h1>Topページ</h1>
```
サーバーの起動は、
右上にある▶Runを押して、▶Runの左にある
Preview　>　Open Preview in New Tabを押す

```terminal:terminal
root@goorm:/workspace/traveler# rails g model post
【↓実行結果例】
Running via Spring preloader in process 5959
      invoke  active_record
      create    db/migrate/20220608085956_create_posts.rb
      create    app/models/post.rb
      invoke    test_unit
      create      test/models/post_test.rb
      create      test/fixtures/posts.yml
```
goエンジニア向けgitのpre-commitとpre-pushファイルのオススメ

commit時にはgo fmt、　push時にはgo vetが走るようにしてます。

```:.git/hooks/pre-push
linterr="$(go vet ./... 2>&1 )"
if [ -n "$linterr" ] ; then
    echo "go vet error:"
    echo $linterr
    exit 1
fi
echo "finish go vet"

branch="$(git symbolic-ref HEAD 2>/dev/null)" || \
       "$(git describe --contains --all HEAD)"

if [ "${branch##refs/heads/}" = "main" ]; then
    echo "do not push to main"
    exit 1
fi

```

```:.git/hooks/pre-commit
before_diff_bytes=`git diff | wc -c`
diff_files=(`git diff --name-only HEAD ./`)

for diff_file in "${diff_files[@]}"
do
    if [[ $diff_file =~ \.go$ ]]; then
        gofmt -w $diff_file
    fi
done

after_diff_bytes=`git diff | wc -c`

diff_bytes=`expr $after_diff_bytes \- $before_diff_bytes`
if [[ $diff_bytes > 0 ]] ; then
    echo "\033[0;31m Check golang code format! \033[0;39m"
    exit 1
fi

if test "`git symbolic-ref HEAD | sed -e 's:^refs/heads/::'`" = main; then
        echo "cannot commit on main branch."
        exit 1
fi

```
WordPressで管理者メールアドレスを更新したら、変更の承認待ちが表示されたときにDBから更新する方法

# 状況
画像のように、管理者メールアドレスを変更したところ、認証のメッセージが表示されました。
[![Image from Gyazo](https://i.gyazo.com/0cdf0e57c9a701b9fa5d5884c8c89eef.png)](https://gyazo.com/0cdf0e57c9a701b9fa5d5884c8c89eef)

# 対策
ちゃんとメールを受け取れるならばそれでもいいですが、めんどくさいのでDBから対応します。以下の２つのSQLで対応します。

```SQL
update [DB名] set option_value = "[新メールアドレス]" where option_name = "new_admin_email" and option_value = "[旧メールアドレス]";
update [DB名] set option_value = "[新メールアドレス]" where option_name = "admin_email" and option_value = "[旧メールアドレス]";
```

# 結果
メッセージが消えました。
[![Image from Gyazo](https://i.gyazo.com/b2e38290c4fc7b6ca5fa3e00b8b2a53c.png)](https://gyazo.com/b2e38290c4fc7b6ca5fa3e00b8b2a53c)
UnityのRayFire応用


# オブジェクトをタップしたらそのオブジェクトを破壊する
## UnityofRayFireの基本的な使い方
UnityofRayFireの基本的な使い方はほかの記事にまとめておりますので見ていない方はぜひ見てください

https://qiita.com/bakusoumaru/private/577cb519e6424ee467bf
## 1.タップしたらタップしたオブジェクトを消して壊れるオブジェクト出すscriptを書く
 ```C#:test
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class test : MonoBehaviour
{

    [SerializeField,Header("破壊されるobjectのprefab")] GameObject _breakObject;
    private Vector3 _position;
    GameObject clickedGameObject;
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            clickedGameObject = null;
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit = new RaycastHit();

            if (Physics.Raycast(ray, out hit))
            {
                clickedGameObject = hit.collider.gameObject;
                _position = clickedGameObject.transform.position;
                Destroy(clickedGameObject);
                GameObject a = Instantiate(_breakObject, _position, Quaternion.identity);
            }

        }
    }
}


 ```
### 説明
 ``` C#:test
  clickedGameObject = hit.collider.gameObject;

 ```
ここでタップしたobjectの情報を変数に入れてます

``` C#:test
  _position = clickedGameObject.transform.position;
```
ここではさっき変数に入れたオブジェクトのtransformを変数に入れてます
``` C#:test
  Destroy(clickedGameObject);
 GameObject a = Instantiate(_breakObject, _position, Quaternion.identity);
```
ここではクリックしたobjectを壊して壊れるオブジェクトを生成してます
## 2. 破壊されるobjectをprefabにする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711067/22fa63dd-89c7-fc61-a785-68c4b28b8fe2.png)
**これを行わないと破壊されるobjectをprefabにしてもMeshが読み込まれず使いものになりません**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711067/837a62ce-649e-e8a1-75bf-1c4f6747a9ce.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711067/50477bb3-001c-da96-5f5e-aac6b0a449e1.png)
このようにobjectがprefabのアイコンに出ていれば成功です
## testscriptをscene内においてprefabを設定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711067/d59fa5da-88e6-e220-e889-be9390df549f.png)
**最後に破壊されるobjectの同じサイズのobjectを置く**

# 確認
![ezgif.com-gif-maker (3).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711067/89814ba8-14dd-0be9-f950-e3918985055a.gif)
このように動けば成功
will_save_change_to_attribute?(attr_name)でプチ・リファクタリングした例

# やりたいこと
userテーブルのemailが変更されるかどうかを判定したい、みたいなこと、あると思います。

# 実装！

これでもいけますが、、

```ruby
!new_record? && email == email_in_database
```

この方がスマートですよね、と。

```ruby
will_save_change_to_attribute?(:email)
```

何が嬉しいかというと、コードがシンプルになったのと、`&&`が無くなったのでRubocop様も喜んでくれました（Metrics/PerceivedComplexity）。

# 参考

new_record
https://railsdoc.com/page/model_new_record_q

attribute_in_database(attr_name)
https://api.rubyonrails.org/classes/ActiveRecord/AttributeMethods/Dirty.html#method-i-attribute_in_database

will_save_change_to_attribute?(attr_name, **options)
https://api.rubyonrails.org/classes/ActiveRecord/AttributeMethods/Dirty.html#method-i-will_save_change_to_attribute-3F

Class: RuboCop::Cop::Metrics::PerceivedComplexity
https://www.rubydoc.info/gems/rubocop/RuboCop/Cop/Metrics/PerceivedComplexity
Airflow資料抄訳(1)：はじめに

恥ずかしながら最近になって知ったワークフローエンジン [Apache Airflow](https://airflow.apache.org/)。日本語の紹介記事もちらほら出てきていますが、[公式ドキュメント](https://airflow.apache.org/docs/)をちょっとずつ抄訳しながら読んでいこうと思います。

今回はまず[はじめに](https://airflow.apache.org/docs/apache-airflow/stable/index.html)（Home / Apache Airflow Documentation）。
バージョン2.3.3時点のものです。

---

# はじめに

Airflowはプログラムによりワークフローを設計し、スケジュールし、監視するためのプラットフォームです。

複数タスクからなる有向非巡回グラフ（DAG）としてワークフローを作成することができます。
一連のワーカー上でタスクを実行します。
リッチなコマンドラインユーティリティによりDAGに対する複雑なオペをいともたやすく実現できます。
リッチなUIのおかげで本番環境で実行されているパイプラインの可視化、進捗の監視、そして必要なら問題発生時のトラブルシューティングも容易です。

コードにより定義されたワークフローは、メンテナンス性に優れ、バージョン管理が容易く、協力しやすいものとなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50571/601be72e-74de-43a9-9312-fec24deb5745.png)

## 基本原則

* 動的：ワークフローはPythonコードにより構成されます。動的なワークフローの生成が可能です。
* 拡張性：あなた自身でオペレーターやエグゼキューターを定義し、あなたの置かれた状況に則した抽象レベルでライブラリを拡張することができます。
* 洗練：ワークフローには余分なものがなくすっきりしています。スクリプトのパラメータ化はJinjaテンプレート・エンジンを用いてAirflowのコアに組み込まれています。
* スケーラビリティ：モジュラー・アーキテクチャを持ち、多数のワーカーを協調させるためにメッセージキューを使用します。無限のスケーラビリティを実現します。

## 地平線の向こう側へ

Airflowはデータ・ストリーミング・ソリューションではありません。タスクはデータをある場所から別のある場所へと移動させるものではありません。Airflowは[Spark Streaming](http://spark.apache.org/streaming/)や[Storm](https://storm.apache.org/)ではなく、[Oozie](http://oozie.apache.org/)や[Azkaban](https://azkaban.github.io/)と比較すべきものです。

ワークフローはほとんど不変であるか、ゆっくりと変化していくものであるべきです。データベースの構造よりは若干動的というくらいに考えましょう。ワークフローの見た目が実行の都度大きく変わるようなことのないようにすべきです。そうすることで個々の処理とその流れが明快な状態を保つことができます。

---

基本原則に示された、コードによるワークフロー（workflow as code）、拡張性、スケーラビリティ、WebUIはいずれも魅力的です。
「地平線～」の後段はワークフロー設計のベストプラクティスにかかわるものかと思いますが、いまいち言わんとしていることが不明確であるように感じます。
google colab環境でpyqt5をDISPLAYなし設定で実行する

google colabはブラウザさえあれば環境構築を楽に行えるが、DISPLAYが使えないため一工夫要る事がある。
pyqt5を使う場合は以下のようにDISPLAYオフにしてから実行するとOK
（export QT_QPA_PLATFORM=offscreenによりDISPLAYオフ環境でも実行できるようにする）

```py
!rm -rf tetris
!git clone http://github.com/seigot/tetris
!pip install numpy
!pip install pyqt5
%cd tetris
!export QT_QPA_PLATFORM=offscreen; python start.py
```


git操作(http://github.com/seigot/toolsへのgit push例)は以下のように行える。

```py
! rm -rf tools
! git clone http://github.com/seigot/tools; 
! git config --global user.email "example@example.com"
! git config --global user.name "example"
%cd tools
! echo "test" >> test.txt; 
! git add test.txt; 
! git commit -m "update text"; 
! export GITHUB_ACCESS_TOKEN="XXXXX"; git remote set-url origin https://seigot:${GITHUB_ACCESS_TOKEN}@github.com/seigot/tools.git;
! git push; 
```
以下はgit push先に合わせて更新が必要

```
email "example@example.com"
name "example"
export GITHUB_ACCESS_TOKEN="XXXXX"
```

ただしcolabの制約により他に不便になる点がないかは注意が要りそうに思われる

## 参考

[Google Colab上でGitHubからCloneして変更をPushするまでのまとめ](https://qiita.com/kurilab/items/f6f4374d7b1980060de7)
【Vue】watchでデータの監視

## はじめに
「watch」とは、特定のデータまたは算出プロパティの状態を監視して、変化があったら処理を自動的に実行する。
データの変化をがトリガーになる。

## 使い方
大きく分けて２種類の書き方がある。

### １．watchオプションに定義
１つ目はコンポーネントのwatchオプションに、`監視したいデータの名前`と`変化した時に呼び出されるハンドラ`を定義する方法
第１引数として「新しい値」、第２引数として「古い値」を受け取ることができる。

```sample.js
new Vue({
  watch: {
    監視するデータ: function(新しい値, 古い値) {
      // データが変化した時に行いたい処理
    },
    // オブジェクトのプロパティも監視できる
    'item.value': function(新しい値, 古い値) {
      // 処理
    }
  }
})
```

#### オプション
watchの定義ではオプションを任意で設定できる。それぞれ設定値はBoolean
 `deep`： ネストされたオブジェクトも監視する
 `immediate`：初期表示時にも呼び出す

オプションを使用する場合は、handlerプロパティにハンドラを定義。
handlerはオプションを使用するときに必要になるオブジェクトのこと

```sample.js
new Vue({
  el: 'app',
  data: {
    list: [
      { name: '太郎', age: 10 },
      { name: '花子', age: 12 }
  ]
  },
  watch: {
    list: {
      handler: function(newVal, oldVal) {
        // listが変化した時に行いたい処理
      },
      deep : true,
      immediate: true
    }
  }
});
```
watchはデフォルトの状態では、指定したプロパティの値しか監視しない。
つまりdeepがfalseだとlistに格納されているオブジェクトのプロパティが更新されても処理が実行されない。

```sample.js
this.list[0].age = 11;
```
trueにすることでこのような配列要素内のプロパティ（入れ子やネストしたプロパティ）更新時にも呼び出される。



### ２．メソッドに定義
もう１つの方法は、各メソッド内でウォッチャを登録する方法。
インスタンスメソッド`this.$watch`を使用。以下のように引数を渡す。
```script.js
this.$watch('監視したいデータ',ハンドラ（関数）,オプション)
```

```sample.js
// ライフサイクルのcreatedにwatchを登録
created() {
  this.$watch('value', function(newVal, oldVal) {
    // 処理
  }, {
    deep: true,
    immediate: true
  })
}
```

#### 監視の解除
インスタンスメソッドで登録した場合、返り値を使用して監視を解除できる。

```script.js
var unwatch = this.$watch('value', handler)
unwatch()
```

#### 一度だけ監視
一度監視して、監視を解除することもできる。
```script.js
new Vue({
  el: 'app',
  data: {
    edited: false,
    list: [
      { name: '鉛筆', price: 98 },
      { name: '消しゴム', price: 100 }
    ]
  },
  created() {
    var unwatch = this.$watch('list', function() {
      // データlistが変更されたらeditedをtrueにし、
      this.edited = true
      // データが変更されたら監視を解除
      unwatch()
    }, {
      deep: true
    })
  }
})
```




## 参考
https://prograshi.com/language/vue-js/what-are-handler-deep-and-immediate-in-watch/
Spark (Databricks) における binary 型のサイズ上限は 2147483647 byte

## 内容
Spark のデータ型の１つである binary 型のサイズ上限は 2147483647 byte (約2GB)のようです。

- [BINARY 型 - Azure Databricks | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/databricks/spark/latest/spark-sql/language-manual/data-types/binary-type)
- [BinaryType — PySpark 3.1.1 documentation (apache.org)](https://spark.apache.org/docs/3.1.1/api/python/reference/api/pyspark.sql.types.BinaryType.html)


下記が、Databricks における実行コードとエラーメッセージです。`binaryFile`として読み込むことで、`BinaryType`の`content`というカラムが生成されるのですが、そのカラムのエラーです。

```python‘‘
df = spark.read.format('binaryFile').load('dbfs:/databricks-datasets/tpch/data-001/lineitem/*')
display(df)
```

```text
FileReadException: Error while reading file dbfs:/databricks-datasets/tpch/data-001/lineitem/lineitem.tbl.
Caused by: SparkException: The length of dbfs:/databricks-datasets/tpch/data-001/lineitem/lineitem.tbl is 3863181353, which exceeds the max length allowed: 2147483647.
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/07bcc53b-4544-e44f-d198-32955939762a.png)


binary 型のサイズ上限をあげる方法は特にないそうなので、動画ファイルなどを binary 型のカラムに格納しようとしている方は注意してください。私は、取り込み後のインターフェースファイルを binary 型で管理できないかを検討しておりましたが、本制約により諦めました。
Power Automate の関数で先週の日曜日や土曜日を求める

Power Automate のクラウドフローで、フロー実行日を基準として「先週の日曜日」と「先週の土曜日」の日付値が必要になったので、関数を利用して求めてみました。

# 先週の日曜日
先週の日曜日は、次のような関数で求めました。

```
addDays(
    startOfDay(
        convertFromUtc(
            utcNow(),
            'Tokyo Standard Time'
        )
    ),
    sub(
        -7,
        dayOfWeek(
            convertFromUtc(
                utcNow(),
                'Tokyo Standard Time'
            )
        )
    ),
    'yyyy/MM/dd'
)
```

実行時点である utcNow() を基準とし、実行日の 0 時 0 分の値を取得します。その後、-7 から dayOfWeek で求められる値を減算した値を取得し実行日に加算することで、先週の日曜日の日付を求めています。dayOfWeek は、日、月、火、水、木、金、土が「0、1、2、3、4、5、6」という数値で取得できる関数です。

例えば、今日が 7 月 6 日（水）であれば、dayOfWeek で求められる値は 3 となり、-7 - 3 = -10 を今日の日付から引くことなります、今日の 10 日前は 6 月 26 日（日）なので、ちゃんと先週の日曜日を求められていますね。


# 先週の土曜日
応用すると、先週の他の曜日も簡単に求めることができます。例えば土曜日は、次のような関数で求められます。
```
addDays(
    startOfDay(
        convertFromUtc(
            utcNow(),
            'Tokyo Standard Time'
        )
    ),
    sub(
        -1,
        dayOfWeek(
            convertFromUtc(
                utcNow(),
                'Tokyo Standard Time'
            )
        )
    ),
    'yyyy/MM/dd'
)
```

# さいごに
フローの実行日を基準とした関数を利用した日付の計算式は、ストックしておくと使い回しができそうですね。
Pythonでアキネイター方式のレコメンドシステムを作る

# リコメンドシステムについて思うこと
僕はよくYouTube・アマゾンプライムビデオ・Netflixなどの動画配信サービスで動画を見るのですが、
トップページには僕の視聴履歴からAIが作ったおすすめの動画一覧があって、
大体その中から選んで視聴します。
このおすすめに従って動画視聴し続けていると
***似たような動画ばっか見てきて飽きたなと感じた時には、
もうおすすめには似たような動画しかなくなってしまっています。***
### 僕の願い
***今までの視聴履歴とか関係なしにもっと今の気分を汲んでおすすめしてほしい***

# ランプのおじさんならこの願いを叶えてくれる
みなさんは[アキネイター](https://jp.akinator.com/)というサービスを知っていますか。

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727171/2505f217-e7fc-62c0-3e95-875266638d5d.png" title="アキネイター" alt="アキネイターのTOP" >

アキネイターはユーザーがある人物を思い浮かべてから、
アキネイターさんからの「男ですか？」など質問に、
「はい」「いいえ」「部分的に」などを選択して回答を繰り返していくと
思い浮かべている人物を当ててくれるというものです。

***これをリコメンドに使って「アクションの気分ですか？」とかの質問に答えていったら、
今の気分にピッタリの動画に辿りつけるのではないだろうか***

# アキネイターを作るための決定木
実際のアキネイターのアルゴリズムはかなり複雑ですが、
今回は簡単に質問にYes・Noで答えていって一つの動画に辿り着く感じにします。
例えば選択肢の動画が
- VTuberのゲーム実況
- VTuberの料理動画
- VTuberによる解説動画
- YouTuberによる料理動画
の４つだとすると
```mermaid
graph TD;
ライブ配信ですか? --> |yes|ゲーム実況ですか?
ゲーム実況ですか? --> |yes|VTuberのゲーム実況
ゲーム実況ですか? --> |no|VTuberの料理配信
ライブ配信ですか? --> |no|VTuberですか?
VTuberですか? --> |yes|VTuberによる解説動画
VTuberですか? --> |no|YouTuberによる料理動画
```
こんな感じの決定木が見えてきます。
選択肢の動画が4つの時は
$$a^2 \leqq 4 $$
となるaが4つの選択肢から選ぶ時に質問する回数として最も少ない数になります。
なので $$ a = log_24 = 2 $$
となって上の決定木のように2回の質問で動画をおすすめできるのが今回の例での最適な決定木になります。

質問の順番を変えると
```mermaid
graph TD;
ゲーム実況ですか? --> |yes|VTuberによるゲーム実況
ゲーム実況ですか? --> |no|VTuberですか?
VTuberですか? --> |yes|ライブ配信ですか?
ライブ配信ですか? --> |yes|VTuberによる料理動画
ライブ配信ですか? --> |no|VTuberによる解説動画
VTuberですか? --> |no|YouTuberによる料理動画
```
このように動画をおすすめするまでに最長で3回の質問が必要になってしまいます。
これではリコメンドシステムとしての効率が悪いので、
最小の質問回数ですむ深さが最も少ない決定木を作る必要があります。

# アルゴリズムを考える
深さが最も少ない決定木を作るには純度が低い質問からしていく必要があります。
純度は高いほど選択肢の割合が偏った状態になっていることを示します。
ある質問の回答がYesときに残る選択肢が、
YesとNoで綺麗に半分づつ分かれるとそれは純度が0の質問となります。
（一般的には決定木は不純度を交差エントロピーやジニ係数で求めてその値で条件分岐を作ります。）

```python:recommend.py
import pandas as pd
import numpy as np

def recommend(data):
  # 純度 = abs(回答がYesになる選択肢の数 - 選択肢数/2)
  purity = (data.iloc[:, 1:].sum() - np.full(data.shape[1]-1, data.shape[0]/2)).abs()
  
  selected_column = purity.idxmin()
  print(f'見たいのは{selected_column}ですか？')
  choice = input()
  if choice == 'y':
    selected_data = data[data[selected_column]]
  else:
    selected_data = data[~data[selected_column]]
  selected_data = selected_data.reset_index(drop=True)
  if selected_data.shape[0] == 1:
    print(f'あなたにおすすめの動画は {selected_data.iloc[0, 0]} です')
  else:
    recommend(selected_data)

data = [{'タイトル': 'VTuberのゲーム実況', 'ライブ配信': True, 'VTuber': True, 'ゲーム実況': True},
        {'タイトル': 'VTuberの料理配信', 'ライブ配信': True, 'VTuber': True, 'ゲーム実況': False},
        {'タイトル': 'VTuberによる解説動画', 'ライブ配信': False, 'VTuber': True, 'ゲーム実況': False},
        {'タイトル': 'YouTuberによる料理配信', 'ライブ配信': False, 'VTuber': False, 'ゲーム実況': False}]
df = pd.DataFrame(data)
recommend(df)
# 見たいのはライブ配信ですか？
# y
# 見たいのはゲーム実況ですか？
# y
# あなたにおすすめの動画は VTuberのゲーム実況 です
```

# さいごに
シンプルに実装するだけなら意外と簡単に実装できました。
たぶん本家のアキネイターは頻度が高い人物が当てられる質問を最初の方に持ってきたり、
いろいろな工夫がなされているので、そういうのも参考にしてみたいですね。

# 参考文献
- [アキネイター](https://jp.akinator.com/)

# 前に書いた記事
- [YouTubeで納品する動画版Skebみたいなサービスをリリースして半年だけどユーザーがいない話](https://qiita.com/Hanull/items/f23f3211f115d87eac78)
オリジナルアプリ第2弾を作成中（完成）

オリジナルアプリ第2弾を作っています。
プログラミングスクールとは別です。

# どんなアプリか？
小説執筆ツールです。（投稿サイトではなく、執筆するためのツールです）
UIはかなりシンプルになると思います。（そこまで凝ろうとすると大変なので）
## やっていること
一からコードを書くと大変なので、プログラミングスクールでやったコピーアプリのコードを再利用し、
適宜変更しながらコーディングしています。
## 公開などは？
現段階では、公開するかどうかは未定です。

### 作成中のコード
https://github.com/kazunarigit/noveltool/tree/main

(7/28追記）
ほぼ外観も問題なくできてきています。
最後まで動作確認していませんが、もう少しで動作確認は終わるのでレイアウトを確認してコードを修正すれば近々デプロイできると思います。（出来栄えは保証しません）
（8/10追記）
外観の確認と動作確認がほとんど終わり、9割方完成しました。とはいえ、新規登録と作成画面が表示できているところまでですが。

とりあえず、こんな感じです。

（2024年3/6追記）
完成しました。
herokuではなく、AWS上でデプロイした感じです。

URLは https://mynoveltool.mydns.jp です。
親より上位の、特定の名称のディレクトリに移動する

### やりたいこと

* Git Bash を使っている。
* 下記２つ以上のシチュエーションで共通して使えるコマンドが欲しかった。
    * `/repository/productA/dev/module/hogehoge/...etc`  上で、`/repository/productA/dev/` に簡単に移動できるコマンドが欲しい
    * 且つ
    * `/repository/productB/dev/api/fugafuga/...etc` 上で、`/repository/productB/dev/` に簡単に移動できるコマンドが欲しい

### 解決策

```bash
cd `echo $PWD | sed "s=\\(/dev\\)/.*=\\1="`
```

上記コマンドを下記のように、エイリアス(`~/.bashrc`) に設定して、使えている。

```bash
alias dev="cd `echo $PWD | sed "s=\\(/dev\\)/.*=\\1="`"
```

#### 実行例

```bash
$ pwd
/c/repository/productA/dev/module/hogehoge/test

$ dev

$ pwd
/c/repository/productA/dev
```
【jQuery】スライダープラグイン slick 導入方法【スライドショー】

## この記事の内容

・slick(スリック)について
・jQuery〜slickの導入方法まとめ

## slick(スリック)とは？

スライドショーを簡単に表示させることができるプラグインです。
<a href="https://kenwheeler.github.io/slick/">公式サイト</a>はこちら。

## 導入方法

##### ①jQueryを導入（CDN）

1　 jsファイルを作成する

```
  🗂 js           #ディレクトリを新規作成
   ∟　　任意の名前.js　 #jsファイルを新規作成

```
2 　 jsファイル、jQueryを導入するためのコードを書く

bodyタグの閉じタグの直前に記述
```.html
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script src="js/任意の名前.js"></script>
```

※jquery-3.6.0.min.jsというファイル名の3.6.0はjQueryのバージョンを指している。

##### ②slickを導入

１　head内にslickのCDNを記述
```.html
<head>
  <!--省略　以下2行を追記-->
  <link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.9.0/slick.css"/>
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.9.0/slick-theme.css">
</head>
```

2 body内にslickのCDNを記述

＊jQueryを読み込むことでslickが適用されるため、
　　jQuery（以下の記述）よりも下に記述します。（順番を間違えると動かないので注意）
 `<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>`
```.html
<body>
  <!--省略-->
  <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
  <!--以下１行を追記　　jQueryよりも下に記述する-->
  <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.9.0/slick.min.js"></script>
  <script src="js/slider.js"></script>
</body>
```
##### ③基本の記述

<a href="https://kenwheeler.github.io/slick/">公式サイト</a>でも記述方法が載っていてます。
こちらでは`<div>タグ`で紹介していますが、一目でグループであると視認しやすいように`<ul>タグ`、`<li>タグ`を使用します。
＊クラス名は任意の名前でOKです。

```.html
<ul class="slider">
    <li><img src="<!--画像URL-->"></li>
    <li><img src="<!--画像URL-->"></li>
    <li><img src="<!--画像URL-->"></li>
</ul>
```

基本的には以下の記述でスライダーが適用されます。

```.js
$(function() {
  $('.slider').slick();
});
```
##### 自動再生や再生速度等のカスタマイズをするには・・

`$('.slider').slick();`の（）内に、`{}`を追加して、その中に記述していきます。

```.js
$(function() {
  $('.slider').slick({
    //こちらに記述していく
  });
});
```

## 参考

＊じゅんぺいブログさん　カスタマイズの一覧を載せられているので、使いたいときにとても参考になります:sparkles:
<a href="https://junpei-sugiyama.com/slick-option/">【slick】カスタマイズ用オプションまとめ一覧</a>

＊125naroomさん　サンプル集がとても分かりやすくて、参考になります:sparkles:
<a href="https://125naroom.com/web/3198">【jQuery】スライダープラグイン「slick」実装サンプル集</a>
ハッカソンのすゝめ

# ハッカソンのすゝめ
## ハッカソンとは？
> ハッカソン（英語: hackathon 、別名:hack day ,hackfest ,codefest ）とは、ソフトウェア開発分野のプログラマやグラフィックデザイナー、ユーザインタフェース設計者、プロジェクトマネージャらが集中的に作業をするソフトウェア関連プロジェクトのイベントである[1]。個人ごとに作業する場合、班ごとに作業する場合、全体で一つの目標に作業する場合などがある。時にはハードウェアコンポーネントを扱うこともある。ハッカソンは1日から一週間の期間で開催することがある。いくつかのハッカソンは単に教育や社会的な目的を意図に開催する。使用に耐えるソフトウェアの開発や既存のソフトウェアを改善することを目標としている場合もある。また、使用プログラミング言語、オペレーティングシステム、アプリケーション、API、主題や参加プログラマーの人数を定める場合がある。

参考: [ハッカソンWiki](https://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%83%E3%82%AB%E3%82%BD%E3%83%B3)

## 参加背景
私の所属のオンラインスクール[RareTECH](https://raretech.site/)で開催され(年3回前後)、初参加しました。
今回がスクールでは第5回目開催に当たります。

初級編, 上級編に分かれ約2か月に渡って開発を行い、その出来栄えを講師陣の方に評価して頂きます。

今回は自分は初級編で4人チームでチーム開発を行いました。

## 参加時点での学習経歴
学習スタートが2022年の1月
第5回開催日が5月1日なので、丸4か月ですね。

時系列的に言うと
- 2022年1月~ 2ヶ月
  - ネットワーク、Webの学習
  - Linuxの学習(Linux標準教科書1週)
  - [Envader](https://envader.plus/)各コース1週
    - Linux基礎、応用コース
    - セキュリティ基礎コース
    - ターミナルカスタマイズ
    - Python環境構築コース
  - 技術記事ノック(Qiita, ネットなど)300本3週

- 2022年3月~ 1ヶ月
  - HTML, CSSをドットインストールで学習
  - JavaScriptを書籍で1週

- 2022年4月~ 1ヶ月
  - PaizaでPHP, Laravelのコース1週
    - Dランク


プログラミングに関してはチョビーーーットしか触ってない状態で参加しました。
学習歴浅くても参加した方が絶対いい！！という言葉に後押しされての参加です。


## 結果、参加してどうだったの！？
参加して良かったと思っています！！

- どういった所が良かった？
  - 希望ポジションが出来た
  - 希望言語が使用できた
  - チーム開発の経験を積めた

紆余曲折はありましたし、大変な面もありましたが、未経験でチーム開発が出来るというのは未経験にとってはとても大きな経験だと思います。
そんなハッカソンを開催して頂いているスクールや講師の方には大変感謝しております！

***

そして、今回ハッカソンに初参加してみて思った事を個人的な観点からですが書いていこうと思います。

:::note info
### 絶対的なメリット
個人開発からでは絶対に得られないチーム開発の経験を得られる
:::
これに尽きると思います。
Gitのやり方や毎週ミーティングを行いながら何かが仕上がっていったり、たまたま一緒になったチームメイトですがハッカソンを通して良い関係を築くことが出来ました。

- Gitを覚えられる
- 成果物が出来る
といった点も大きい要素です。

また、最終発表の際に他のチームの成果物も拝見させて頂きましたが、すごいクオリティの物を作成されていて、すごい刺激になりました。これホントに同じ期間でやったの！？っていうぐらいです。
講師陣も興奮しておりましたｗ

:::note alert
### デメリット
デメリットというと言葉は悪いですが、主に時間の捻出の問題です。
- ハッカソンに時間をかけると他の事ができない
    - また、その逆もあり
- 仕事や私用が忙しいとハッカソンに時間を捻出しづらい
　　　　　　　　　　　　　　　　　　　　　　　　　　　　など。
:::
これはもう当たり前の話ですけどね。
自分はある程度開発に時間を捻出出来たので大丈夫でしたが、仕事や状況次第では捻出できる時間も限られてきます。+ミーティングの時間もあるので、参加にあたっては一番頭を悩ませる所かなと思います。

## 実際チームに入ってから起こりうる問題
やっぱりチームなんで、様々な問題が起こりうると考えられます。
何個か例に挙げますが、こういった問題をクリアしながら開発に進んでいきます。

:::note warn
#### 希望したポジションじゃない...
よっぽど偏らない限り起こりえない問題かなと思います。
:::
今回は各自の希望のポジションで開発を行えましたので問題なかったと思います。
結果的に適材適所がーっていう問題も無きにしも非ずだったので難しい所ですね。

:::note warn
#### 使用したい技術が開発技術と一致しなかった...
ポジションに2人以上いる場合起こりうることかなと思います。
各ポジション1人だった場合は、よっぽど開発するものと適さないといった事にならない限り、ポジションで希望した言語になると思います。
:::
今回は希望した言語で開発できました。(声にならない声で他のを希望している人がいたらすみません)
チーム内でも特に問題にはならなかったです。

:::note warn
#### やりたい開発内容じゃない...
これはどこもそうだと思いますが、何個か案を考えてその中から選んでいく形にはなるでしょうから、誰かしら涙を呑むかなとは思います...
その中でも意識を切り替えて向き合えるかっていうのも大事な要素だとは思います。
:::
今回は何個か案を考えてその中から決めました。
各自きちんと決定したアプリに向き合って作成していました。

## 今回の反省点
個人的には設計の段階からもっと関わるべきだったなーとは思いますが、正直要件定義から開発までの流れすら分かってなかったのでこれはもう致し方無しと割り切っています。
思う所は、一通りアプリを作ってから参加した方が有意義なのかなーとは思う所です。正直自分のポジションで手一杯で他のポジションが何をやっているかなど全く分からない状況でした。
ただアプリを1個作るのを待っていたら相当な時間かかるだろうなとも思うので、難しい所です...
他の皆さんの意見も聞いてみたいところです。

今回参加してこうすれば良かった...と思う事はたくさんありますが、次回に繋げていきたいと思ってます！

### まとめ
いかがでしたでしょうか？
100%ハッカソンすごい！やばい！おすすめ！っていう感じではなかったかもしれませんが、次回開催されたら絶対出るぐらいにはハッカソンLOVEです。
もし身近に開催してて参加しようか迷っている方に一言...
ハッカソンおすすめです！一緒に頑張りましょう！！
(一応時間の捻出が一番のキモだと思うので、この部分は各自の中で応相談お願いします！)
sassとscssの違い

sass? scss? どっちがいいの？どう違うの？
sassディレクトリの中にscss拡張子のファイル？

 > 違いは？

scssもsassもどちらもSASS（サス）なの。
SASSは皆さん、お勉強されて通り、cssを拡張した便利な機能です。
しかし、そのままSASSファイルをCSSにコンパイルする必要があります。

SASSについての記事▼
https://qiita.com/shatoo1551/items/430b3fe827f4f7dedf80

> .sassと.scssの違い

・sass：あまりにも簡略化されcssとの違いが大きくわかりにくい
・scss：cssに寄せた書き方

今では、SASSとは.scss のことを指す。（サスｗ）

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
ご愛読ありがとうございました。
何か気づきや質問があれば、コメントお願いします。
新しい情報を取得するたび、更新していきます。

良ければ、LGTM、ストックよろしくお願いいたします！