OmniAICreator/Qiita-1.07M huggingface dataset:
海外スタジオ、国内スタジオ、自社の3拠点でのテスト実施について

#概要
グローバル配信GvGゲームのQAにて、通信テストを実施するため日本と時差のある海外スタジオと国内スタジオ、自社の3拠点との連携を実施しました。

  - 国内スタジオ：テスト
  - 海外スタジオ：テスト
  - 自社：開発、テスト進捗管理

海外スタジオとの連携においては、テスト方法やツール、環境など準備が必要なタスクはいろいろあると思いますが、今回この記事では複数拠点間での共通認識とスケジュール調整に焦点をあててお話します。

限定的な内容ですがこれから類似の経験をされる方の参考になればと思います。

#やってみて大変だったこと
###海外スタジオとのコミュニケーションを取りづらい
- 当たり前のことですが、テスト準備工程でも海外スタジオとのコミュニケーションは発生しますし、そのコミュニケーションにも時差があります。今回対応してもらった海外拠点とは10時間以上時差があったため、私視点だと日中に送った連絡に対してのレスが深夜に帰ってきて、翌日の日中にもらったレスへ回答をするという状況でした。今回私は深夜稼働をテスト当日にしか計画していなかったため、普段なら即レス可能な内容でもやり取りに数日間要してしまい、結果的にテスト期間に一部準備が差し掛かってしまいました。
- 海外スタジオと時間について会話する際に都度時間を変換して伝えなければならないため、ちょっとした会話でも思考のリソースを割かれていました。
- テスト当日もやり取りが多発することが想定されたため、オンラインミーティングの活用も相談しましたが、海外スタジオの場合同時通訳が行いづらくなるためチャットツールでコミュニケーションを実施する必要がありました。

###ステークホルダーが多い
- 国内スタジオ、海外スタジオ、エンジニアそれぞれと当日の動きについて認識をすり合わせたり、当日に向けた準備を連携する必要があり、多くのステークホルダーとのコミュニケーションが必要でした。

###スケジュールを組みづらい
- 各拠点で稼働時間帯、休憩時間帯がまちまちであったり、そもそも休憩時間を取るか取らないかも拠点によって異なるため、当日のスケジュールを調整しづらかった印象です。

#事前に準備しておくとよいこと
###国内・海外スタジオへの伝達が二度手間にならないオペレーションを組む
- 基本的な伝達事項はまとめて資料などに落とし込み、当該資料を各拠点へ共有すればある程度伝わるようにしておくことで、質疑応答を削減できます。
- 国内・海外スタジオ・自社（QA・開発）全関係者同じチャンネルでコミュニケーションすることで、二度以上同じことを言わなくてすみます。

###海外の時差によりコミュニケーションに時間がかかる前提で準備工程を進める
- 時差を踏まえコミュニケーションに時間がかかる前提でスケジュールを組んでおくか、期間的に余裕がない状況であれば各工程に深夜対応日を調整してタイムラグを防止しておくとスムーズかと思います。
- 国内スタジオよりも海外スタジオと少し優先的に不明点/懸念点のつぶしこみを行う意識でコミュニケーションを進めるくらいがよいと思います。

###時差の変換に脳内リソースを割かなくてよい仕組みを作る
- テストの当日スケジュールは各拠点ごとの時間とテストの流れを図表を用いて可視化し各拠点に共有すると、時差に惑わされず段取り通りに進めやすくなります。

| 国内拠点 | 海外拠点 |国内スタジオ稼働|海外スタジオ稼働|通信テストの流れ|
|:-:|:-:|:-:|:-:|:-:|
|21:00|08:00|稼働開始||国内準備|
|22:00|09:00| ↓  ||国内練習|
|23:00|10:00| ↓  |稼働開始|海外準備|
|00:00|11:00|休憩| ↓  |海外練習|
|01:00|12:00| ↓  | ↓  |本番①|
|02:00|13:00| ↓  |休憩||
|03:00|14:00| ↓  | ↓  |本番②|
|04:00|15:00| ↓  | ↓  |本番③|

###スケジュールに影響する各拠点の規則の発覚遅れを防ぐ
- 拠点ごとの規則は計画初期から余裕をもって各拠点に確認しておくことをオススメします。
 - 各拠点の休憩時間を取るか取らないかと取る場合の時間帯
 - 各社の深夜対応時の勤怠、単価の扱い

#さいごに
国内・海外スタジオを巻き込んでのテストは総じて大変でしたが、今回のような通信テストであれば国内での検証では発生しなかった通信不具合を検知できたり、国内と海外でGvGを行う際に通信ラグがどの程度あるかを把握できるなど品質担保する上で必要なケースもあると思いますので、この記事が海外を含む複数拠点の連携の一助になれば幸いです。

今回の内容は限定的なケースに関するお話でしたが、もっと海外配信アプリのテストについて情報が欲しいという方は、過去のアドベントカレンダーでも関連記事が参考になるのでご覧ください。

- [海外版アプリの気にしたいこと4選](https://qiita.com/ISummer/items/c514f3384c7992b0d5c8)
- [モバイルゲームの海外配信時におけるQA体制構築の注意点](https://qiita.com/bug-taro/items/16f4270d07ca69f7985c)
- [海外配信のモバイルゲームQAの言語検証で気をつけたい観点](https://qiita.com/Hokori/items/70b4e42f624864e3eebe)
BlenderのCurveがものすごく便利だった話

モデリングしてた時にふと気づいたことがあるんですよ
***Curveって便利だなぁ***
って

曲線を作ったり、物を曲げたりする時ぐらいした使ってなかったのですがいろんなところで使えたので紹介しようかなと

## 実行環境(どのversionでも動きます)
blender 3.0.0
# 目次
1. 物を曲げる
2. 円状(曲線上)に動かす
3. モデリングをする


## 1.物を曲げる
オブジェクトを円状に曲げたり、くねくねさせるときによく使われています。
例としてCubeをこんな感じに曲げてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542948/aa68c570-cc13-20f5-9d1d-55699c6ff89c.png)
まずはCubeを用意してx方向に拡大します。
その後拡大した辺を10等分します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542948/f1d4662a-43de-3602-bc67-9d10c8bb5049.png)
Curveを用意します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542948/11db21b3-d45d-c3c8-1150-5f72fe6bf696.png)
CubeのモデファイアーでCurveを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542948/3b3a47d0-b22f-533a-47a7-3424b2978f5b.png)
これで完成です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542948/668824aa-6ce0-4b51-aa10-5120ed6342b6.png)
Curve上にCubeが曲がってますね。

![メディア1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542948/781eb5bc-e1cc-1b4e-ac9d-69f40e3547b7.gif)
Cubeを動かすとCurveに沿って動きます。

## 2.円状(曲線上)に動かす
Curveを使えば曲線上を動くことが出来ます。
![メディア2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542948/7e4fa9d7-240e-d2dd-3c10-4116b5c6cb60.gif)
こんな感じでオブジェクトを動かせます。
オブジェクトのオブジェクトコンストレイントでClamp toを選択すると出来る様になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542948/80264d6f-c88d-9261-efdb-3c0b322043d4.png)

オブジェクトのほかにもカメラやメタボール、ボリュームもこの方法で動かすことが出来ます。
## 3.モデリングをする　~~(本題)~~
Curveは線だけではありません!
**実はCurveもCubeみたいに面を持つことが出来ます!**
データプロパティのジオメトリのベベルから厚さを変えることが出来ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542948/bb09011d-3aeb-d30b-4daa-16cb62e114be.png)
こんな感じになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542948/6609be68-78c4-774a-5c12-b35df284b621.png)
ベベルの部分を変えるだけでいろんな形が出来ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542948/d84b272c-bab2-7a8e-31f9-c1e272ffa621.png)
更に編集モードでradiusやTiltなどの機能を使うと一部分を膨らませたり、ねじったりできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542948/394b1ba4-73af-6f46-dc69-4b7e9be1edb7.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542948/e38f6413-dfee-c395-089a-7d7461a4bcde.png)
こんな感じで膨らませたりねじったりできます。

この機能を使えばMeshからでは面倒くさかったりすることが結構楽に出来たりします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542948/dd548c1d-a003-4530-cd80-50217fee522b.png)
【作曲】AIと作曲してみた

#はじめに
この記事ではAIと音楽に関する内容について書いていきます。

近年は、AIの技術が発展し様々な場面で用いられています。

新しい趣味をはじめようと思っている人などは、AIの力を借りて今までよりも気軽に参入できる世の中になってきたのではないでしょうか？

音楽という分野もその中の一つだと思います。

本記事では、音楽の初心者でもAIを使えば作曲できるのか試してみます！

#目次

[1.使用したAI](#1-使用したAI)
[2.作曲するにあたり](#2-作曲するにあたり)
[3.作曲してみた](#3-作曲してみた)
[4.完成した曲](#4-完成した曲)
[5.さいごに](#5-さいごに)

#1. 使用したAI
・Amper Music
（参照：AI Music Composition Tools for Content Creators | Amper Music）

https://www.ampermusic.com/

こちらのAIは、出したい雰囲気・曲の時間などを指定すると数秒でメロディを考えてくれる優れものです。


#2. 作曲するにあたり

まず、作曲するにあたり、役割を分担します。

今回の楽曲制作に関わる登場人物は以下の２人です。

・AI
・自分

各人物の役割を簡単にまとめると次のようになります。

・AI：フレーズを考える
・自分：AIが考えたメロディをもとに楽曲構成と歌詞を考える

#3. 作曲してみた

まず、Amper Musicにログインし、新規プロジェクトを作成します。
![zam1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2334251/521bd590-3bdf-bdfd-1bae-20e28d8d1933.png)
プロジェクト名を「sample」として、新規作成します。
![zam2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2334251/aae6388c-a099-ea8e-2b75-4fe6cbae4b71.png)
次に、楽曲の時間帯を指定。数小節ほしいので30秒としてみます。
![zam3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2334251/d3253e9b-a004-afeb-1eaf-01e314d951b1.png)
最後に曲のジャンル・雰囲気を指定すれば完了！今回は、ポップスで幸せそうな曲調をリクエストします。
![zam4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2334251/b05eb184-0253-cd09-a0f3-edd119994e3b.png)
再生ボタンを押せば曲が流れます。
![zam5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2334251/1b374639-b391-ad8f-268f-0523a2663460.png)

そして、、


AIが案として出してくれたフレーズの中で印象に残った、**切なさの入り混じった幸せな感じ**の4小節を抜粋しました。
（サイトの音源を持ってこれなかったので耳コピして持ってきました。）


そのフレーズがこちらです。

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

楽譜に示すと次のようになり、これらをもとに楽曲を構成していきます。

**[伴奏]**
![楽譜3a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2334251/84fbf60f-b518-b72d-2711-0baae1c7f033.png)

伴奏は、**C→A♭→E♭→B♭**という進行となっており、１曲を通してこの進行でいきます。

**[メロディ]**
![楽譜4a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2334251/eaa89ffd-f4e2-f2eb-0376-8c0b44266241.png)


メロディは、せっかくなのでサビで歌ってもらいましょう。

Aメロ・Bメロは、このサビに向かって盛り上げていけるようなものにします。

1曲すべてAIに考えてもらうこともできましたが、本記事は初心者でも作曲できるか試してみる趣旨なので、自分で考えて構成を練ってみました。


#4. 完成した曲

完成した曲が以下のものです。
題名は、**無限分岐世界線Neuronica**としました。

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

<br>
[YouTubeのリンク](https://www.youtube.com/watch?v=lrvTX1O74FM&list=LL&index=4)
<br>

#5. さいごに

今回初めて記事を投稿させていただきました。

本記事を執筆するにあたり、弊社の方々の記事を興味深く拝見させていただきました。
(からあげの記事とか面白かったです笑)

しかし、自分の技術的な知識の無さに気づかされたので、IT企業に所属している自覚をもって、今後とも勉強に励みたいと思います！

ありがとうございました。
PHPでDB操作していた時に起こった備忘録  SQLSTATE[42S22]:のエラー

##環境
PHP
MySQL(Docker)
Vscode

##エラー
```
Column not found: 1054 Unknown column 'hoge　hoge' in 'where clause'
```

##解決
なんてことはなく、SQLの文が悪かった。空白文字の検索などを調べていたが原因はもっと浅いところにあった。

```php
if(isset($_POST["del_name"])){
  $del_name = $_POST["del_name"];
  $del_sql = "DELETE FROM table WHERE colum = '". $del_name ."'";
  $stmt = $PDO->prepare($del_sql);
  $stmt -> execute();

```


```
DELETE FROM table WHERE colum = 'hoge hoge'";
```
上記の文が本来動くものであったが、引用符がガバガバで間違えてた模様。

そもそもSQL文ができていなかったので勉強し直します。
【React】 オブジェクト に対して UseState を使用する 

目的：【React】 オブジェクト に対して UseState を使用する
今回のテスト
テキストボックスを編集すると、表示される文字を変える。

■以下前提のコード

```react:sample.js
import React, {useState} from 'react'
const sample= () => {
}
export default sample
```

■以下オブジェクトに対して、stateを管理

```react:sample.js
import React, {useState} from 'react'

const sample= () => {
    // 以下オブジェクト（sampleobject, setsampleobject）を定義する。
    const [sampleobject, setsampleobject] = useState({name: ''})
    return (
        <>
        </>
    )
}

export default sample
```

■以下textフォームでsampleobjectのname属性をvalueに渡し、変更(onChange)があったときにh1タグの{sampleobject.name}を変更する。

```react:sample.js
import React, {useState} from 'react'

const sample= () => {

    
    const [sampleobject, setsampleobject] = useState({name: ''})
    return (
        <>
            <form>
                <input type='text' value={sampleobject.name}
                onChange={event => setsampleobject({...sampleobject, name: event.target.value})}/>
            </form>
            <h1>setsampleobject is {sampleobject.name}</h1>
        </>
    )
}

export default sample
```

■結果
テキストボックスを編集すると、表示される文字が変わる。
スケジュールは余裕をもって

小ネタよりも小さな話ですみません。

しかも、毎年、アドカレでしか使わないので「限定記事」の作り方を忘れていて、いきなり公開しているし。
Qiitaの使い方も忘れているし。

まあ、明日のアドカレの穴埋め記事なのでいいです。
あ、ちょっとずつ、Qiitaの使い方を思い出してきた。やた。

で、テストアドカレに書きたいことは、タイトルの「スケジュールは余裕をもって」ということだけです。

この先を読んでも、それ以上の話はでてきません。
***
ほんとうに、よく聞くんです。「時間がない」って話。

時間がないんじゃなくて、余裕を持ったスケジュールを立てないからなのに。

「時間がない」の前にちょっとつけて「良い仕事をしたいのに、時間がない」という人もいます。

余裕を持ったスケジュールを立てないからそうなるのです。

断言します。
***
「仕事にバッファを持つ人」はたまにいます。

1週間でできると見積もったら「10日かかる」って申告する人です。もちろん、おすすめです。

でも、それだけじゃだめなんです。

「仕事のバッファ」だけではなく「仕事を改善するための時間」をスケジュールに入れるのです。

「仕事のバッファ」は、まじめな人はちょっとしかとりません。
「まぁ、やることはだいたい見えているし、20%もバッファを取っておけば十分だよね」って。

自分のことを「仕事ができるやつ」と見せたい人も「仕事のバッファ」はちょびっとしか取りません。

中には、ラッキーが重なったケースを想定して実力以上で見積もっちゃう人や、上司から「えー、そんなにかからないでしょう。その半分でやってよ。君ならできるよ」と言われて受けちゃう人がいます。

だめだめ、全然だめです。
そんなことをしているからずっと忙しいのです。
10年後の差は大きいです。

「スケジュールに余裕をもって」　←　サブリミナル
***
どうするのかというと、「仕事のバッファ」に加えて、「**仕事の改善のためにどうすればよいかを検討する時間**」をきちんとタスクとして見積もりに入れるのです。

当然ですが、仕事のエンジンがかかるまでに必要な「**調査**」の時間も加えます。

1週間の仕事と見積もったなら

調査：　3日間
仕事：　1週間
バッファ：　3日間
仕事の改善のためにどうすればよいかを検討する時間：　1週間

で、見積もります。
そんなこと許されるわけないと思っているでしょう？
案外、許されます。仕事が終わった後の時間のことは上司の頭にないからです。

そして、上の予定通りに仕事を終えると「仕事が早いね」と言われます。

うそです。すぐには言われません。

一年後くらいに言われます。

なぜなら、仕事の改善のためにどうすればよいかを検討する時間をしっかりとっているので、改善が進み仕事の仕方がうまくなっていくからです。

ただし、この方法にはひとつだけ弱点があります。

それは、いくら長くとっても、納期間際にならないとパワーが出ない人には向かないということです。

でも、そういうひとは、そもそも優秀な人ですから、この方法を使わなくていいんです。

ということで、
普通の人が「仕事できるね」と言われる人になる方法でした。
余裕のないスケジュールは、テストを仕事にしている人に特に多いと思いますよー。

逆に、**課題や問題を放置すると、事態はどんどん悪くなって、負の連鎖が発生し、ますます時間が無くなります**。

だからこそ、せめて仕事の区切りのタイミングで改善するタスクをスケジューリングしておくことが大切です。
Amazon LightsailでWordPressインスタンスを作る

#はじめに
Lightsailでウェブサイトを構築してみます。3.5USD/月~という高コスパでどんなことができるか試してみたいと思います。

#Lightsailのコンソール操作
Lightsailのコンソールでまず「インスタンスの作成」ボタンをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940466/fa726cad-3ddd-6859-fae9-b9b84c57c915.png)

プラットフォームはデフォルトでLinuxのままスクロール。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940466/9f35298a-a09b-95b7-cb40-73a3f2f57d04.png)

アプリはデフォルトでWordPressのままスクロール。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940466/77a68095-1a5a-b54a-24cf-c4f47c6eb376.png)

スクロールします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940466/2f4fa345-7e30-cb0d-e2b3-ab7596c43047.png)

スクロールします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940466/289c979a-0cfa-e5e9-6f72-43d357241901.png)

インスタンスプランはデフォルトで$3.5のままスクロール。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940466/9f86aa72-d5b0-fae9-e4fb-f268a3217f41.png)

インスタンス名は適当に入れてスクロール。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940466/61b86a52-e8b5-4901-2b14-431d537103c4.png)

「インスタンスの作成」ボタンをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940466/fd6e80a0-5262-f5b6-6928-a53ed10b0c73.png)

インスタンスができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940466/dfd67d4a-7f11-a75a-b319-f3ffa126390e.png)

なんと、2クリック(+インスタンス名のインプットとスクロール）でインスタンスが完成しました!

#作成したWordPressの確認

##作成されたサイトへのアクセス
ブラウザからIPアドレスを入力してサイトを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940466/32a90955-eab1-a9cf-3ca2-a482edcb0c0b.png)

##パスワードの取得
WordPressコンソールへログインするためのパスワードはsshでアクセスして取得します。Lightsailコンソールで下記のアイコンをクリックして、ssh接続を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940466/eebe8e66-bedf-d72f-dd5f-c105ceb019af.png)

catコマンドなどで、「bitnami_application_password」に記載されているパスワードの文字列を取得します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940466/a00133fa-28f8-10e9-4fd5-2032181f9e9c.png)


##WordPressコンソールへのログイン
ブラウザから「IPアドレス/wp-admin」にアクセスしてWordPressコンソールのログイン画面を開きます。ユーザー名「user」と上記で取得したパスワードを入力してログインします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940466/99ec5752-aae0-4f60-7ced-ca837c3d0933.png)

コンソールが表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940466/ff97e18e-3e63-2911-1b85-6678639d25e2.png)

#おわりに
高コスパもさることながら、かつてEC2上でWordPressの環境を構築した際と比較して、2クリックで構築が完了するというお手軽さに圧倒されました。

https://qiita.com/talomina/items/df5c124896254c337bd3

#参考文献

https://qiita.com/H40831/items/a131e849b3d76fd04f2d

https://www.conoha.jp/lets-wp/wp-management/
主要なセキュリティカンファレンス・イベントを簡単にまとめてみた

個人的な備忘録も兼ねて、
コンピュータセキュリティに関する主要なセキュリティカンファレンス・イベント等についてまとめてみました。
気がついたらもう終わっていたという悲しい事態を避けるためです。
最近は各セキュリティ企業が独自にウェビナーを実施したり、新たなカンファレンスも開催されているようなので、主要といいつつも私が把握していないものは多くあります。
また、地方のセキュリティ勉強会については含めていません。

# 主要カンファレンス・イベントまとめ

?月 SECCON (開催時期バラバラ・色々な催しが複数あるので適宜公式サイトで確認)
5,8,11月ごろ hardeningカンファレンス(WASForum主催)

|時期  |カンファレンス名等  |
|---|---|---|
|2月  |RSAカンファレンス(今年は5月にお引っ越し)  |
|5月  |DEF CON CTF予選  |
|5月   | サイバー犯罪に関する白浜シンポジウム |
|6月  |サイバーセキュリティシンポジウム道後  |
|7月  |BlackhatUSA, Pwnie Awards  |
|8月頭  |DEF CON  |
|10月 |情報セキュリティワークショップin越後湯沢  |
|10月  | CODE BLUE |
|10月  | AV TOKYO  |
|12月| SECCON電脳会議|
|12月| SANS Holiday Hack Challenge |

※全然足らないじゃないか！と感じられたかもしれません。後述しますGoogleカレンダーをご参照ください 🙇‍♂️

# ざっくり解説・紹介
いくつかカンファレンス・イベント等のざっくりとした紹介もしましょう。
PwnieAwardはその年のイケてる脆弱性を紹介するぜ！といったもので、
各ジャンル(server-side,client-side,plivilege escalation,cryptoなどなど)の部門に応じた最もイケてる脆弱性が表彰されます.
注目のあった脆弱性は事前にノミネートされており、
当日受賞者(脆弱性,発見者)が発表されます。
アカデミー賞の脆弱性版といったところでしょうか。
(アカデミー賞ではオスカー像がもらえますが、Pwnieな像がもらえます)
私は、今年のAwardは体内時計を合わすのが失敗したので睡魔に負けてお布団に入ってしまい、配信を見逃しました...

BlackhatUSAオンラインはビジネスパスでは無料で参加できますが、
無料で見れるのはセキュリティ企業の製品紹介に関するセッションがほとんどで、
私が個人的に感じた面白そうな攻撃手法についての発表は有料のパスでしかみれないものがほとんどでした.(スライドpdfは終了後に無料で見れたりします)
コロナ禍が解消しつつあるので来年はオンライン配信は無しになるかもしれません.

BlackHatUSAが終わったら、その次の週にはDEF CONが開催されます。

「サイバー犯罪に関する白浜シンポジウム」と同じ時期・場所(決勝戦の場合)で開催される、
情報機器管理コンテストというものもあり、これは大学対抗の
インシデントレスポンス対応能力の腕を競い合うコンテストです。
私も学生時代は一度だけ参加しましたが、二次予選敗退でした。
今もそうなのかちょっと把握していないのですが、私が参加していた頃は優勝か準優勝すると文部科学大臣賞や経済産業大臣賞をチームで受賞できます。

# SANS HHC
毎年12月末にあるSANS Holiday Hack Challengeとは、
(これもカンファレンスではなくコンテストのようなものです)

コンピュータセキュリティに関するスキルが問われる問題が多数出題されます。ランキングも提供されます。
CTFと同様に攻撃・侵入に関するテクニックが求められるものが多いイメージです。
過去には、aws等に構築されたシステムに侵入してその年or昨年?に発見されたCVEを使ってvpc内の複数のEC2に侵入するといったかなり実践的な、システムに侵入する腕前を競い合うオンラインで参加できる形態のものがありました。

クリスマスの時期に合わせて開催されるので、恋人がいない ethical ハッカーは、ぼっちの寂しさを忘れて集中して参加できます！

簡単に解ける問題もありますが、
かなりハードな問題もあるので ~~writeup見ながら最後まで完走したのは1度しかありません...~~

ちなみにSANSとは、
情報せキュリティにおけるフォレンジックスキル、システムへの侵入スキル、インシデント対応スキルなどを客観的に証明する試験や講義を提供する組織です。GIAC試験では合格するとかっこいいデザインのコインもらえるそうです。コインには暗号が隠されているそうなのですが、試験の合格は簡単ではありません。そのため、合格者があつまってコインを持ち寄り、いろんな分野のエキスパートがみんなであつまって解読するようにしよう、という意図があるんじゃないかという気が個人的にはしています。

# 国内最大級のカンファレンス(CODE BLUE)
CODE BLUEは昨年はコロナ禍の影響もあり、なんと無料で視聴ができましたが今年は有料なようです。有料ですが、もちろん濃い発表が見れたり国内開催という点もあり大変貴重なカンファレンスです。

数年前まではCTFコンテストも併催されていましたが、コロナの影響や作問や運営コストが大変なのか、SECCONに役割を移したのか、ここ数年は開催されていないようです。過去開催の出題問題としては秀逸な問題ばかりでとても良いCTFでした。


# 有志作成のGoogleカレンダー
冒頭に記載した主要カンファレンス一覧のほかに「[Security Event in Japan](https://calendar.google.com/calendar/u/0/embed?src=4u9fvij6ul4oug11bcphr8ofb0@group.calendar.google.com)」という有志作成のgoogleカレンダーがあります。[人力で管理しているgoogleカレンダー](https://ripjyr.hatenablog.jp/entry/2018/12/03/072614)のようです。

また、カンファレンスではなくCTFコンテストについては「[CTF Timeのgoogleカレンダー](https://ctftime.org/calendar/)」にまとまっており、暇な時はおもしろそうなコンテストがないかここでチェックします。

長々と紹介しましたが、
基本的にはこの２つのGoogleカレンダーをウォッチしておけばコンピュータセキュリティに関するイベントの見逃しは大幅に減らせれるかと思います。

以上です。
なるべくイベントの見逃しを減らして、
素敵なコンピュータセキュリティライフを送りましょう！
enebularのお知らせ機能について

# お知らせ機能の追加

本日6日目はリリースしたばかりの「お知らせ」機能についてです。
技術的なもの書こうと思ったけど、部品調達が間に合わなかった。。

ということで、12/6にリリースしたお知らせ機能の紹介です。

お知らせ機能は、enebularアカウントを持っているユーザーであれば誰でも閲覧できます。

enebular v2.32.0では、ログインするとヘッダー部にベルマークが出現します。

このベルマークをクリックすることで、現在お知らせされている内容を確認できます。

まだリリースしたばかりで特段お知らせする内容はなにもないのですが、

お知らせがあると以下の画像のような感じで、お知らせの一覧が確認できます。

※あくまでお知らせのイメージです。特に順番には意味はありません。

![screenshot-aunrebel-stg-app.aunrebel.com-2021.12.06-21_42_44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185366/b679bcaf-7e5b-b74b-ac6c-fc5cf68b8ff7.png)

view allをクリックするとお知らせのダイアログを表示でき、具体的な内容を確認できます。

![screenshot-aunrebel-stg-app.aunrebel.com-2021.12.06-21_49_30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185366/fe3c5661-beea-f5d8-898c-070c62724ea2.png)

お知らせ機能はユーザーがなにかを作ったり公開できる機能ではないため、

詳しく紹介する場がそんなにないかなと思いましたので、ブログネタにしてみました。
Windowsでnodeのプロセス終了させる方法

JSフレームワークで「Port 3000 is already in use.」的なエラーが出てしまった時用のショートカット。
検索してもLinaxの解決方法ばかりで、若干探しにくいので備忘録的に書きておきます。

##実行コマンド
コマンドプロンプト等で実行。

```
//エラーでalreadyになっているポート番号を最後に入れる
netstat -aon | findstr 0.0:3000

//下記は帰ってくる値の例　最後の数値をコピー
//TCP         0.0.0.0:3000           0.0.0.0:0              LISTENING       15856
```

```
//先ほど表示された数値を入れて実行
taskkill /pid 15856 /F
```

###Linaxでの解決方法
```
lsof -i:3000

//上のやり方と同様に帰ってきた数値を記入　5298部分
kill -9 5298
```
C#でカノジョをつくる（6日目）

お疲れ様です。たなしょです。
今日はメモリ管理周りとジェネリクスのことを学びました。
C/C++で学んだことがあるのでそこまで書くことが目新しいものはありませんでした。

## スタック、ヒープ
スタックはLIFOで、ヒープはスタックと違ってデータの持ち方が整頓されていないイメージです。
この辺もこのくらいの知識で問題ないかなと思ってサクッと読みました。

## 構造体
C/C++やGoでもよく使っていてある程度使い方を分かってるので記載は割愛します。
でもclassとstructの違いは参照型と値型で違うから、
classを宣言して値を変えてしまうと全体に影響するが、stuructの場合は影響範囲は限定できます。

## 値渡し、参照渡し
C#で参照渡しする場合、```ref```を付けることで参照渡しと判定されるそうです。

```c#
static void Test(ref int a)
{
    a = 10;
}
```
## out修飾子
out修飾子を使うとメソッド内で変数を初期化することができるようになります。

```c#
class Sample
{
    static void Main()
    {
        int a;
        Test(out a);
        Console.WriteLine("{0}\n", a);
    }

    static void Test(out int a)
    {
        a = 10;
    }
}
```

## リソースの破棄、using
ファイルをopenしたら必ずcloseしましょうねという内容でした。なのでfinallyをつって必ずcloseさせるか、
usingステートメントを使うことで処理が終了したら自動的にリソースを破棄するように処理することができます。
Goは```defer```がリソースの破棄の際に使われますね。あれは便利ですね。

## ジェネリクス
あまり知らなったのですが型を指定しなくてもclassを宣言できるのは便利だなと思いました。
ただチーム開発になってジェネリクスのclassが乱立してたらちょっと読みづらそうだなとおもいました。
確かに余分なclassを書かなくていいので便利そうではありますよね。

```c#
using System;

class IntStringPair
{
    public int Key { get; set; }
    public string Value { get; set; }
    public IntStringPair(int key, string value)
    {
        this.Key = key;
        this.Value = value;
    }
}

class IntIntPair
{
    public int Key { get; set; }
    public int Value { get; set; }
    public IntIntPair(int key, int value)
    {
        this.Key=key;
        this.Value=value;
    }
}

class KeyValuePair<TKey, TValue>
{
    public TKey Key { get; set; }
    public TValue Value { get; set; }
    public KeyValuePair(TKey key, TValue value)
    {
        this.Key = key;
        this.Value = value;
    }
}

class Sample
{
    static void Main()
    {
        /*var studentName = new IntStringPair(1, "test");
        var studentAge = new IntIntPair(1, 28);*/

        var studentNameT = new KeyValuePair<int, string>(1, "test2");
        var studentValueT = new KeyValuePair<int, int>(1, 11);

        Console.WriteLine(studentNameT.Value);
        Console.WriteLine(studentValueT.Value);
    }
}
````

## 最後に
今読んでいる本もあと少しで読了できそうです。
明日はC#の目玉機能の一つと言われているLINQを勉強します。
分散並行バグの傾向と分析 [論文メモ]

論文メモです。

> T Leesatapornwongsa, JF Lukman, S Lu, HS Gunawi. TaxDC: A Taxonomy of Non-Deterministic Concurrency Bugs in Datacenter Distributed Systems [ASPLOS '16]  > https://doi.org/10.1145/2872362.2872374

TaxDC は Cassandra, HBase, Hadoop, Zookeeper などの実際のアプリケーションで発生した分散並行バグを収集・分類・解析を行ったものです。著者のページでそのデータが公開………されていたんですが、不手際によりデータが消失してしまったようです。 https://ucare.cs.uchicago.edu/projects/cbs/ ここでいう分散並行バグとは、「非決定的な順序で発生する可能性のある分散イベントによって引き起こされる分散システムの並行性のバグ」です。分散イベントは、メッセージの送受信、ノード内での計算、ノードの障害、およびリブートを含みます。

多数の実際のバグを調査して分かったこととして以下が述べられています。

- 世界中で使われているシステムでも、効果的なテスト、検証、および分析ツールが欠けている。
- 実世界でのバグは以下の点から見付けづらい。
    - 複数のプロトコルを同時にハンドリングするロジックがある
    - ユーザーに見える裏でのバックグラウンドジョブが多数動いており、それらとのインタラクションで致命的なバグとなる
- ほとんどのバグは典型的な分散システムへの誤解により生まれている。
    - 「1つのメッセージ送受信は2つのメッセージ送受信よりも早い」
    - 「メッセージを送受信しない内部の計算は1つのメッセージ送受信よりも早い」
    - 「トランザクションを使えば安全」
    - 「個々のプロトコルがしっかりしていれば組み合わせても安全」
    - 「不具合のときにリカバリに必要な情報が存在する」

一方で、分類してわかった定量的な評価としては、

- 分散並行バグのうち 47% はサイレントにクラッシュするため、デバッグが困難。逆に言うと、53%は明示的なエラーとして顕現する。
- 分散並行バグのうち 64% はタイミングの悪い単一のメッセージの送信(意図していない順序や一連のイベントの途中に他のメッセージが来る等)により引き起こされている。残りは突然のクラッシュ/リブートや前2つの複合。
- ほとんどのバグで前提条件は複雑である(63%は何らかのクラッシュが前提、80%は複数のプロトコルが関係する、81%はバックグラウンドプロセスが関係)
- タイミングの条件は1〜3個のメッセージ/ノード/プロトコルのみが関係する場合がほとんどで(>90%)、92% の分散バグはただ1つのメッセージの送信により引きおこされている。
- バグの修正方法のパターンの数は少ない。30%はイベント発火のタイミングの修正、40%は新しい機構を導入せずに単にメッセージを遅延・無視・受け入れるようにする変更である。

一言で言うと「分散並列バグは見つけにくい・再現しにくいが、原因自体は単純(ただしそれに至る背景=再現方法は複雑)で修正はシンプル」と言ったところでしょうか。

分散バグを見つけるという観点から言うと、[ファジングツールのJepsen](https://jepsen.io/) や、SPIN を始めとしたモデル検査というある意味マッシブに探索していく技法が思いつきますが、たしかに実際それらのツールの業績を見るに有効な戦略であると感じます。(後述ですが万能ではありません)

さて、本文はそれらの深掘りに進んでいきますが、Lessons Learned という章があり、ここだけ読むだけでも勉強になると思います。抜粋すると：

- 個々のプロトコル自体を見ると堅牢だが、それらが同時実行されて引き起こされる分散並行バグが多い。
- 必要なタイミングの順序の入れ替えやハードウェアの故障挿入により、分散バグを検出できるスケーラブルなツールは今(当時)のところ存在しない。
- 優れた検出ツールを使っていても、システムの仕様記述(in 形式手法的な文脈)が洗練されていないとあまり効果がない。ほぼ半数のバグはサイレントに起き、検出できた時点で手遅れになっているから。
- 既存の並行バグの手法と分散バグへの手法にギャップがある。
    - 並列バグにフィーチャーした考えとして次のようなものが挙げられている：「メッセージの順序や処理順の仕様の検証」「『典型的な分散システムへの誤解』に基づくバグ検出」……
- エラーログ分析は一部では有効だが、それにより見つけられないバグも多い。
- 分散トランザクションを導入すれば解決するか? → 実際はそもそも分散トランザクションの実装が誤っているというパターンがあり、また実際のシステムでは分散トランザクションでない部分も多く利用されている(パフォーマンスの都合などによる)
- 修正方法が単純でパターン化できるので、自動修復(実行中のプロセス修復やコード修復)が期待できる。
- 分散ロジックのテストコードにおいては、プロトコルの組み合わせは高々2つでそこそこ有効である。

分散バグについては実用上の需要が高いことから研究が盛んに行われており、またそれらに対し様々な分野からのアプローチ(ソースコード解析・自動修正・RV・形式手法・機械学習 etc)がなされています。大規模・分散があたり前になってきている中、この分野に注視していく価値はあると思います。
CSS変数とは

CSS変数とは、「CSS カスタムプロパティ(CSS変数,カスケード変数)」のこと。
同じ値を異なる場所で使いたい場合に、一括管理できて非常に便利だと思いました。

#使用方法
##1.CSS変数の宣言

* ハイフンふたつ(--)で始まる変数名を宣言します。※大文字・小文字が区別されます。
* :root擬似クラス内定義で全体で使用可能（グローバル）、セレクタ内定義でそのセレクタだけで使用可能(ローカル)。

```css:css
:root { /*　どこでも使用可能！　*/
  --main-txt-color: black;
  --fsz-small: 10px;
  --fsz-large: 18px;
   /* いくつでも宣言できる! */
}
.hoge { /* このセレクタ内だけで使用可能！ */
  --sub-txt-color: red;
  --fsz-huge: 24px;
}

```
##2.CSS変数の呼び出し

* 通常のプロパティ名の代わりにvar(--変数名)関数を使って呼び出します。

```css:css
.hoge {
  color: var(--main-txt-color); /* black */
  font-size: var(--fsz-small); /* 10px */
} 
```

##3.CSS変数の継承

* CSS変数の値は継承されます。

親要素にCSS変数を設定し、子要素に設定をしなかった場合、親要素の値が作用します。

```CSS:CSS
.small {
  --size-s: 10px;
}
.large {
  --size-l: 18px;
}
```

```HTML:HTML
<div class="midium">
  <div class="small"> <!-- 10px -->
    <div class="large"></div> <!-- 18px -->
    <div class="tiny"></div> <!-- 10px -->
  </div>
</div>
```

##4.CSS変数の代替値

* var( )関数で呼び出したCSS変数が定義されていない場合、代替値を複数定義することができます。
* var( )関数の引数として、カンマ(,)区切りで第二引数に代替値を定義します。※第三引数以降を定義しても無効になる。
* 代替値にvar()関数とその代替値を使用することは可能。(入れ子構造のようになる)

```CSS:CSS
.hoge {
  background: var(--bg-color, blue); /* --bg-color　が定義されていなければ　blue */
}
.hoge {
  backgruound: var(--bg-color, var(--bg-pink, red)); /* --bg-color および　--bg-pink が定義されていなければ red */
}
.hoge {
  background: var(--bg-color, --bg-pink, red); /* "--bg-pink, red" は無効となる */
}
```

参考にさせていただいた、こちらの記事の方が詳しいかも。
[CSS変数（カスタムプロパティ）が便利だった](https://qiita.com/taqumo/items/b221e689c8c27500b47a"CSS変数（カスタムプロパティ）が便利だった")
新卒エンジニアが語る資格の心得

これはエーピーコミュニケーションズ Advent Calendar 2021 8日目の記事です。

https://qiita.com/advent-calendar/2021/ap-com

## はじめに
こんにちは　たそ(@taso_int)です。
初アドベントカレンダーで緊張しています。  

今回はQiitaで書いてます。
いつもははてなブログで書かせて頂いてます。
https://taso-int.hatenablog.com/archive
ぜひ見てください(熱い宣伝) 

今回は資格について語りたいと思います。１週間技術系だったのでたまにはコラム系もいいかと(10日目は技術系です。)
あとここでの投稿は個人の見解とさせて下さい。よろしくお願いいたします。

## どれぐらい資格持ってんの？
入社前にCCNAとLPIC101を持っていました。

現在の所持資格は以下の通りです。
・CCNA
・LPICレベル1
・Python基礎認定
・基本情報技術者

新卒レベルだと少なくもないし、多くもないという印象かなと思います。

## 資格を取るメリットとは？
資格はあってもなくても関係ないと私は思ってます。
結局業務で使えないと意味がないのもあると思うので
しかし、資格は分野を勉強するのに素晴らしい教材です。
気になる分野を学習しておまけに試験を受ける感覚に近いです。
(上位の資格になると変わりますが)


## 資格は目的ではなく手段の１つである
私が伝えたいのは「資格を目的にしないでほしい」ということです。
CCNAを受かることを目的にすることは悪くないですが、勿体ないです。
ネットワークの基礎的な知識が知りたいからCCNAを勉強するとか
Azureが少し分かるようになりたいからAz900、Az104勉強する
より上の目的を持って資格取得に励んでもらいたいです。
そうすれば自然とモチベーションも続くのかなと

## ちなみに受かるコツとかあるの？
自分が合格できると思ったら試験の予約をすること。(先に試験の予約をするのもあり)
いざ試験が近づくと不安になってキャンセルをする方もいらっしゃると思います。
資格に合格するということは試験を受けて合格ラインを満たすことです。(進次郎構文)
仮に不合格であっても死ぬわけでもないので、もっと気楽に受験しましょう。
私はすでに応用情報、Cisco Devnetを受験して不合格になってます。
不合格で悲しくもなりますが、悔しさも必ずでるはずです。
それを糧にしてリベンジをしましょう。


## 最後に
思った以上に書くことがなかった…
個人的な難易度を書いて終わりにします。
難 CCNA = 基本情報 >python基礎 > LPICレベル1 易
ここまで読んでいただきありがとうございました。
画像読み込みでエラー(Python)

画像読み込みでエラー

C:/Users/〇〇〇/Desktop/PythonTest/ああああ.jpg
Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Users\〇〇〇\anaconda3\lib\tkinter\__init__.py", line 1892, in __call__
    return self.func(*args)
  File "C:\Users\〇〇〇\Desktop\0MeasureJudge.py", line 1728, in <lambda>
    exitButton = tk.Button(win,text="画像を読込",command = lambda:openImg(1))
AttributeError: 'NoneType' object has no attribute 'shape'

結論。
読み込もうとした画像ファイル名が日本語のためエラー。
【Ruby】Struct の子クラスにキーワード引数をとってインスタンスを返す特異メソッド create を生やす

## 何をするのか

タイトルのとおりです。

Ruby3.1 では、`Structの子クラス.new(…)` の引数が全てキーワード引数である場合、警告が出るようになるそうです。（[ここ](https://ruby-doc.org/core-3.1.0_preview1/NEWS_md.html)）
それは、Ruby3.2 からは、`keyword_init: true` していなくても、位置引数に加えてキーワード引数が使えるようになるため、あらかじめ警告しておこうという趣旨のようです。[[Feature #16806](https://bugs.ruby-lang.org/issues/16806)]

とても有り難いことです。

その絡みで、過去にタイトルと同じような提案（[[Feature #11925](https://bugs.ruby-lang.org/issues/11925)]）があったものの、却下されていたことを知りました。

でも、この提案の内容も良さげな感じがします。実装も簡単そうなので、自力で生やしてみようと思いました。

## コード

```ruby
class Struct
  class << self
    alias _new new
    def new(*args, keyword_init: false, &block)
      sub = _new(*args, keyword_init: keyword_init, &block)
      if keyword_init
        sub.instance_eval { alias create new }
      else
        sub.instance_eval(<<~EOC, __FILE__, __LINE__ + 1)
          def create(#{args.map { |arg| "#{arg}: nil" }.join(", ")})
            new(#{args.join(", ")})
          end
        EOC
      end
      sub
    end
  end
end
```

## 簡単な説明

Original の `Struct.new` の中身を、エイリアス `_new` に退避させて、`new` を自作し、自作の `Struct.new(…)` で子クラスを作る際に、`instance_eval` を使って特異メソッド `create` を作っています。
例えば、

```ruby
Person = Struct.new(:name, :age)
```

したとき、併せて

```ruby
class << Person
  def create(name: nil, age: nil)
    new(name, age)
  end
end
```

したのと同じ効果があります。

なお、`keyword_init: true` のときは `new` 自身がキーワード引数をとるので、`create` は `new` のエイリアスにしてあります。

## 余談

Ruby3.1 からは、

```ruby
sub = _new(*args, keyword_init: keyword_init, &block)
```

の部分は、

```ruby
sub = _new(*args, keyword_init:, &block)
```

と書けるようです。
大変有り難い。
list表示でエラー（Python)

生徒からのSOS。
listで以下のエラーが発生。


Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Users\〇〇〇\anaconda3\lib\tkinter\__init__.py", line 1892, in __call__
    return self.func(*args)
  File "C:\Users\〇〇〇\Desktop\test.py", line 1468, in judgeClick
    ["", "スコア", "%", ]
TypeError: list indices must be integers or slices, not tuple


リストで

    tableResult = [
     ["", "スコア", "確率", ], ←←←←←←←←ここのコンマが抜けていた。
     ["a",score, str(test) + '%',],
     ["b", str(test) + '%',],
    ]

解決までにかかった時間１時間でした。
GitHubとSlackでチーム開発環境構築をする！

この記事は CyberAgent 22 新卒 Advent Calendar 9日目の記事です。

https://adventar.org/calendars/6671



こんにちはMr_Kです
最近GitHubとSlackで開発環境の設定をしたのでそのやり方をメモ的に書いていきます！！

#はじめに
今回なぜチーム開発環境の構築をしたかというと、
　・大きなプロジェクトで開発環境の大切さを実感した
　・ちょうど始まったチーム開発があったから
です。

いままでは　マージのタイミングとかいちいち確認して～バグが出て～なんてことが日常でしたが...
####なんとかしたい！
ということでやってみました。

- 今回やりたいこと
 - Gitのプルリクをスラックで通知したい
 - プルリクのマージを承認されたときのみにしたい
 

##Gitのプルリクをスラックで通知したい
まずはGitHubとスラックをつないでいきます！


###手順

####1　スラックにGitHubアプリを入れる　

[https://slack.github.com/](https://slack.github.com/)
↑このリンクから　Add To Slack　を押して下の画面に飛びます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1594638/22b43ef9-d8bf-bbd1-b268-18d62d89f6c9.png)
右上のタブから好きなワークスペースにGitHubアプリを入れます
  


####2　コマンドをgithubアプリに送り、ログインする
AppのGitHubに　/github signin　←これを送信
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1594638/13229023-a568-dbc0-aaa0-24a36f33dd03.png)
上の　ConnectGitHubaccount　をクリック

サインインしたら　Entercode　に表示されたコードを入力

####3　通知用チャンネルを作りGitHubアプリをチャンネルに追加
新しく通知用のチャンネルを作り
/github subscribe owner/repo　
をチャンネルに送信

owner オーナー名

repo　リポジトリ名

※ここでできない人はGitHubの　Organization　を設定しましょう。

これでスラックにプルリクの通知がきます！
プルリクをするとこんな感じ↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1594638/72f1d80b-b187-4ef4-fc88-3aee9637487c.png)


ついでにコメントやレビューの通知も設定しましょう

通知の設定は　/github subscribe owner/repo (通知名)　で行えます

コメントやレビューの通知が欲しい時は

/github subscribe owner/repo reviews comments で設定できます。


##プルリクのマージを承認されたときのみにしたい
次はGitHub側の設定です

###手順

####1　リポジトリの setting branches を開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1594638/a06d44bc-0a74-19cc-cb62-c12f0da07fa9.png)
Choose a branch...　から保護するブランチを設定します



####2　各種設定をします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1594638/24a503d0-55b8-9cd2-c6bc-4d602a361f01.png)
以下の2つにチェックを入れます

- Require pull request reviews before merging

マージ前にレビューを必須にするという設定です。
チェックを入れるとセレクトボックスがでてきて、人数を選べます

- Require status checks to pass before merging

CIなどでユニットテストを走らせて、それが通らないとマージできないようにする設定

下2つはチェックを外します

プルリクでの承認必須設定はこれで終わりです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1594638/370c196d-00bf-ae5c-54d6-8a65b2cc1d82.png)
こんな感じにマージできなくなります


##さいごに
こんな感じで通知やマージのルールなどあらかじめ設定しておくとスムーズな開発ができそうですね！

ブランチの保護設定はほかの人がコードを見てくれたりするので、仕組み的にとっても良いと思います！
今後の活動

こんにちは。
今回は今後のQiitaでの活動の指針を記事にしました。
プログラミングの記事を期待してた人、ごめん
さて、現在やっている私の活動は、VCLinux、thinkOSの開発、アプリの開発なのですが、Qiitaのほうにうpする予定がある記事は、VCLinux開発備忘録、プログラミングの記事のみです。今後うpするものを増やしていくので、是非、見ていってください。
それではまた数週間後お会いしましょう。
githubにTeXのレポート用のテンプレを公開した

# githubにTeXのレポート用のテンプレを公開した

大学の実習レポートで使っているTeXのテンプレを作ってみた．
READMEに参考にした実行環境と実行方法を記述した．
ぜひ使ってみてください．

https://github.com/kyaoNK/tex-report-template
DockerとDRFの開発環境を爆速で構築する（Django Rest Framework）

## 背景

個人開発で、

・サーバー側はDjangoRestFrameworkを使ってAPIサーバーを構築
・クライアント側はReactを使ってAPIサーバーと通信

みたいな事をやろうとしています。
バックエンドの環境構築はコンテナを用いるのが最近のトレンドかと思いますので、djangorestframeworkの開発環境をDockerで用意していきたいと思います。

今回はささっと環境構築するのを目的としていますので、DBはsqlite、Webサーバーも特に立てずにDjangoが起動できるだけの状態を目指します。

docker-compose.ymlも用意しますが起動するサービスも一つだけです。
爆速で環境構築して、お好みでカスタマイズしてください。

## 実装

実装というほどのものでもないですが以下の流れで進めます。

1. Dockerfileを作成
1. docker-compose.ymlを作成
1. requirements.txtを作成
1. docker-compose build

めちゃ簡単ですね。やっていきましょう。

### Dockerfile

```Dockerfile
# BASE
FROM python:3.7-alpine

#log
ENV PYTHONUNBUFFERD 1

COPY ./requirements.txt /requirements.txt
RUN pip install -r /requirements.txt

# update pip
# pipのバージョンが古い警告が出る。Pythonのバージョン古いのが原因な気がする
# RUN pip install --upgrade pip

RUN mkdir /django-api
WORKDIR /django-api

COPY ./django-api /django-api

RUN adduser -D user
USER user
```

### docker-compose.yml

```docker-compose.yml
version: "3"

services:
  app:
    build:
      context: .
    ports:
      - "8000:8000"
    volumes:
      - ./django-api:/django-api
      # - site-packages:/usr/local/lib/python3.7/site-packages
    command: >
      sh -c "python manage.py migrate &&
            python manage.py runserver 0.0.0.0:8000"

# volumes:
  # site-packages:

```

### requirements.txt
```requirements.txt
Django>=3.0.7,<3.1.0
djangorestframework>=3.11.0,<3.12.0
django-cors-headers==3.2.1
```

### ビルドする

上記3つのファイルが用意できたら、docker-compose buildを行います。
（あまり詳しくないのですが、コマンドはdocker-composeからdocker composeに変わるらしい？？）

以下のコマンドを実行。

`docker-compose build`

ターミナルに`Successfully built ~~`の表記が現れたら環境構築成功です。
後は思うがままに開発をするのみです。

## 補足

・Dockerfileやdocker-compose.ymlのコメントアウト部分は不要な記述なので、削除していただいてOKです。

・上記の通りに環境構築した場合、ミドルウェアをインストールしようとするとpipのバージョンが古いぜみたいな警告が出る場合があります。おそらくPythonのバージョンが若干古いのが原因なんじゃないかと思っています。FROMで指定するイメージを`Python:latest`とかにすると良いかもですね。

・requirements.txtのdjango-cors-headers==3.2.1はなくてもOKです。フロントにReactを用いてAPIで通信したい場合は、CORSを設定しないとなので上記の記述が必要になります。`RUN pip install -r /requirements.txt`のタイミングでインストールされます。

・上記の環境では、ライブラリを`pip install`した際、一見インストールに成功したように見えますが実際はインストールできません。docker-compose.ymlなどで永続化を行うか、必要なライブラリをrequirements.txtに追加していく事になると思います。

・DBやWebサーバーの設定等はよしなに行ってください。私は以下の記事を参考に、上記から色々改造を行うつもりです。
https://qiita.com/greenteabiscuit/items/c40ba038703c9f33499b
Vue.js環境で実装するダークモードデザイン

こんにちは！
PHONEAPPLIアドベントカレンダー2日目（泣）担当の@sabinekoです。

最近とある事情によりVueアプリでダークモードを実装することになったのですが、その時使用したフレームワークから、ダークモードの実装方法についてこの記事で書いていこうと思います。

### 作ったアプリ
社内システムの開発で、ローカルのDBのデータを管理しやすくするためのGUIアプリをつくりました。設計上、残念なことに社内でしか使用できないのですが、一部の方から「大量のテストユーザを作るのに便利」などという感想を頂いております（笑）

### 使用したフレームワーク
このプロジェクトでは[Quasar Framework](https://quasar.dev/)を使用しました。
選定理由は

- VuetifyがVue3に対応してなかった
- Bootstrapの導入はPJのフロントエンドエンジニアの2/2が拒否した

などの消去法により決定しました。しかし、実際使ってみた感想は、シンプルで非常に使いやすかったです。

### ダークモード実装

#### 1.切り替えの準備
QuasarをVueにインポートします

```typescript
import { useQuasar } from 'quasar'

setup () {
  const q = useQuasar()
  q.dark.set(true) // これをトグルボタンなどに対応させることで切り替えできるようになります
}

```

#### 2.カスタムスタイルを用意する
カラーテーマによって適用されるスタイルを変更する場合、cssの記述によって使い分けられます。

```css
.body--light .hoge {
    color: black;
    background-color: white;
}

.body--dark .hoge {
    color: white;
    background-color: black;
}
```
非常に雑ですが、こんな感じで指定できます。
これで１．で設定した```$qu.dark.set```にtrueが入っているときは```--dark```のスタイルが、それ以外では```--light```のスタイルが適用されます。

#### 3.トグルボタンでカラーテーマの切り替えをする
トグルボタンはQuasarのものを使うので、特に設定しなくてもダークモードに対応してくれます。

```vuejs
<q-toggle
  id="hoge"
  v-model="darkMode"
  :label="`DarkMode ${darkMode}`"
  @click="changeMode"
/>
```
```typescript
import { useQuasar } from 'quasar';
export default defineComponent({
    setup() {
        const q = useQuasar();
        const darkMode = ref(false);

        const changeMode = async (): Promise<void> => {
          q.dark.set(darkMode.value);
        };
        return {
           darkMode,
           changeMode,
        }
    }
})
```

#### 実際の画面
スタイルはカスタマイズする必要がありますが、だいたい上記の設定でこんなふうになります。
![スクリーンショット 2021-12-06 21.41.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/231072/121fb164-2d30-718a-0ff5-612d4ce68f8d.png)
![スクリーンショット 2021-12-06 21.41.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/231072/65159634-e398-cd08-d0ae-f61c60394f54.png)

これを各要素に指定していけばテーマ切り替えができますね！
webアプリの中にはOSやブラウザのカラー設定に依存しているものもありますが、個人的にはアプリによって使い分けたいときがあるので、こうしてアプリごとに切り替えできるのが好みですね。

というわけで、今回の記事は以上になります。よいクリスマスをお過ごしください。
Laravelのoldを配列で使いたいときの備忘録

Laravelのバージョンは7.*を想定

# 例題

例えばPostモデルと、Tagモデルがあるとします。

PostとTagは多対多で成り立ちます。

Postの作成、編集画面で、Tagの一覧を表示して、チェックボックス等で紐づけを行いたいとき
バリデーション無視して書くと

```php:create.blade.php
@foreach(\App\Models\Tag::get() as $tag)
  <label>
    <span>{{ $tag->name }}</span>
    <input type="checkbox" name="tags[]" value="{{ $tag->id }}">
  </label>
@endforeach
```

みたいな感じでformタグ内にぶち込めばいいんですよ。※bladeにモデル書いてるのはサンプルのため！

ただ、この場合、**配列の時の`old`関数ってどうだっけ？**ってよくなるので備忘録です。

# 結論

1. **インプットの配列に添え字を明示的に入れる**
2. **`old`関数の引数として、文字列結合で添え字をドットでつなげる**

そしてその`old`関数で取得した値が、`foreach`で回している`$tag`の`id`と同じであれば、**checked**を付ける！

```php:create.blade.php
@foreach(\App\Models\Tag::get() as $key => $tag)
  <label>
    <span>{{ $tag->name }}</span>
    <input type="checkbox" name="tags[{{ $key }}]" value="{{ $tag->id }}" @if(old('tags.' . $key) == $tag->id) checked="checked" @endif>
  </label>
@endforeach
```

明示的に書いてPOSTするので、バリデーションのリターンもしっかりついてる！
ドット絵　ツールあれこれ

闇のプログラミングでもなんでもない
#今使ってるやつ
- [EDGE](https://takabosoft.com/edge)
![無題2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2353750/7c4dde87-7b8b-9a3b-0570-32b7b472faa1.png)
おそらくドット絵を打ったことがある人間なら結構な割合で触れているかと思われるフリーソフト<br>
レイヤー、アニメーション等、一通りの機能は揃っている<br>
正直これがあれば基本困らない。最近の使用率は６割くらい<br>
<br>
[EDGE2](https://takabosoft.com/edge2)もあるがこちらはシェアウェア、オニオンスキンが使える　すごい<br>
<br>
- [Aseprite](https://store.steampowered.com/app/431730/Aseprite/?l=japanese)
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2353750/4c8021a6-96b5-8c0a-863c-0941df31351c.png)
2010年代に颯爽と登場し、気付いたらかなり普及していた。有料。steamで2050円で買える。<br>
使用率は４割くらい。<br>
前項のソフトから移行しようとしたが、機能多過ぎて使いこなせていないため完全に移行出来ていない。<br>
個人的にはpixel perfect機能が良いなあと思っている。雑に説明するとフリーハンドで書いたドットのガタガタを自動で補正してくれるやつ。素晴らしい。<br>
<br>
ちなみにMacでも使える。<br>
今からドット絵始めるならこれ買って慣れた方が良い気がする。<br>
金かけたくね～って人はEDGEでいい。事足りる。<br>

#昔使ってたやつ
- [ALFAR](http://www.interq.or.jp/www1/helohelo/elf/)

HSP製。今となっては機能的に劣る部分もあるが個人的には結構好きなソフト<br>
めちゃくちゃ久しぶりにHP覗いたら今年の６月にバージョンアップされていて驚いた。


#使ったことないけど有名なやつ
- [D-Pixed](http://www.vector.co.jp/soft/win95/art/se035696.html)

2000年代半ばまでは使ってる人をよく見かけた。<br>
EDGEが台頭してから全然見なくなった。もはや古(いにしえ)
これ使ってるのうまい人が多かった。

- [GraphicsGale](https://graphicsgale.com)

アニメーション機能が"強い"というアレでgifアニメをよく作る人が結構移行してた記憶。
当時シェアウェアだったが数年前にフリーソフト化。

- ドットピクト！

[App Store](https://apps.apple.com/jp/app/ドットピクト-かんたんドット絵アプリ/id995653343)
[Google Play](https://play.google.com/store/apps/details?id=net.dotpicko.dotpict&hl=ja&gl=US)

スマホでドット打てるアプリ。厳密には触ったことあるけどスマホでドット打つのダル過ぎて無理だった。
ここから入った人間は"ドット絵"というより"pixel art"の方に向かっていく傾向がある(観測範囲内だと

#まとめ
[EDGE](https://takabosoft.com/edge)か[Aseprite](https://store.steampowered.com/app/431730/Aseprite/?l=japanese)でいいよ♂
はじめに

このアカウントについて：
Sun3でSunOSに触れて以来、30年ほど主にUnix/Linuxでお仕事をしています。
Windows系は基本的に環境として使う程度です。

今後、次のような話題のノウハウ集積所としていきたいです。
・bash/awkスクリプトのtips
・Linuxのtips
　テスト環境は主にVirtualBOXで作ってます。
・RDBのTips
　経験としてはIngres、Oracle、DB2、Accessなど。
　最近のMariaDBやPostgreSQLは、環境としてさわった程度。
・オペミスを防ぐためのTips
・その他
　WSL2でシェルスクリプト、などに興味あり。
脱外部サービス依存プログラミングしたい

## 注意事項
タスクが大量にあるので、急いで書きました。
思いつきでアドカレの枠をとってお気持ちを表明したので、内容がしょうもなくなったかもしれません。
これは違うだろ!!!って思っても、あくまで自分のお気持ち表明記事なので温かい目で見てください。:bow:

# 外部サービス依存プログラミングって何?
自分が適当に名付けただけです。
その名の通り、特定のサービスに頼りながらプログラムを作ることです。

## 例えば?
例は他にも色々あると思いますが、個人的な代表例といえば以下のとおりです。

- Firebase
    - みなさんご存知の結構色んなところで使われてる便利なサービス
    - 認証・ユーザー管理からデータ保存、プッシュ通知などなど全部揃ってる
- Next.js
    - 今一番来てるReactのフレームワーク
        - あったらいいなを実現してくれてる
    - 最近Vercel依存が強くなってる
        - Twitter見てるとこういう意見がそこそこあった

# なんで脱したいのか?
理由はいくつかあります。

## プログラム・アーキテクチャの勉強にならない
個人的にはこれが一番の問題かなと思ってます。
ハッカソン等でなるべく労力を割くためにはかなり有用だと思います。
ただしそういった場合でないなら、なるべくプログラム・アーキテクチャの勉強のために、自分で実装してみるのもいいなーって最近思ってます。
俗に言うつよつよたちはオレオレライブラリ・フレームワーク等を自作してますし。

## 外部サービスへの移行が面倒
長期に渡って外部サービスを利用してるときには懸念事項かもしれません。
外部サービスに依存してるとこんなこと↓があるかもしれないので、手軽に使えるサービスの代償とも言えるかもしれません。

- データのエクスポートができない
- エクスポートできても、データのフォーマットが独自
- エクスポート時のトランザクション料金が発生する可能性がある
    - Firebaseだとそうらしい

# まとめ
お気持ち表明は以上です。
脱外部サービス依存プログラミングできるようにしていこうかなーと思います。
【PHP8.1】new DateTimeZone()が170倍速くなったよ

PHP8.1では、[DateTimeZone](https://www.php.net/manual/ja/class.datetimezone.php)のインスタンス生成が少しばかり高速化しました。

```php
$t1 = microtime(true);
for ($i=1; $i<1000000; $i++) {
    $dummy = new \DateTimeZone('Asia/Tokyo');
}
$t2 = microtime(true);

var_dump($t2-$t1);
```

|8.1.0  |8.0.13  |7.4.9  |
|---|---|---|
|0.131  |8.115  |8.498  |
|0.134  |8.077  |8.502  |


1000000インスタンス生成に8秒強かかっていたのが0.1秒になりました。

なんだこれ。


# [timelib performance fix](https://externals.io/message/115897)

## Dmitry Stogov

へいDerick、[https://github.com/derickr/timelib/pull/99](https://github.com/derickr/timelib/pull/99)のプルリクについて意見を聞かせてくれないか？

この修正で`new DateTimeZone()`を170倍改善したよ。
結果、幾つかの現実的なアプリでも目に見える高速化があったよ。
たとえばSymfonyのデモではcallgrindが7%改善した。

この修正は半年以上前に送ったやつなんだけど、PHP8.1に入れてくれたらありがたい。


## Derick Rethans

当時のプルリクでは`修正必須`のステータスだったと思うんだけど、今見てみたらPOSIXの仕様にちゃんと従ってますね。
PHPのmasterに、他のバグフィックスと共にマージしました。


# PHP8.1

この修正は[6871a49b6609a98e291248b0e89ae9730d9dd580](https://github.com/php/php-src/commit/6871a49b6609a98e291248b0e89ae9730d9dd580)でマージされ、PHP8.1でリリースされました。


# 感想

この手の単純ループのパフォーマンス計測は性能厨が喜ぶだけで基本的には意味がないものですが、さすがにこれほどの差であれば実アプリで目に見える程度に影響が出てくるようです。

それにしても、ほんの数行の変更だけでこれだけ速度が変わるなんて不思議ですね。
PHPは7以降どんどんソースが整理され、[高速化が進んできました](https://qiita.com/rana_kualu/items/05a510f53c0ea9a1ccaf)が、PHP8の今になってもこれほどの高速化の余地が残っているとは驚きです。
一定間隔で実行する処理はsetIntervalではなくsetTimeoutで書こう

一定間隔で実行する処理は **場合によっては** setIntervalではなくsetTimeoutで書こう！

# 例: 約5秒毎にHTTPリクエストを投げてください

こんな処理を実装するときの例です。

各メソッドのおさらい:

||主な役割|
|---|---|
|setInterval|nミリ秒間隔でなにか処理をさせる|
|setTimeout|nミリ秒後になにか処理をさせる|

※遅延等は考慮しません

### setInterval

普通に考えると、`setInterval`で簡単に実装できそうです。

```js
const fetchDataInInterval = () => {
  fetchData()
  setInterval(() => {
    fetchData()
  }, 5000)
}
```

↓このような動きになるかと思います。

![setTimeout_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151137/f3bc64f8-df81-28cb-9d3f-62519a4a46fc.png)

（黒が`setInterval` 緑が`fetchData`）

（`fetchData`に約1秒かかる想定）

### 問題点

例えば、サーバー不調や、クライアント側のネットワーク不調で`fetchData`に20秒以上かかってしまう場合どうなるでしょうか？

↓のように、前のレスポンス状況に関わらず、5秒毎に容赦なく次のリクエストを実行してしまいます。

![setTimeout_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151137/13952e56-ec0c-4144-52fa-5ba989cf373c.png)

# setTimeout

setTimeoutを使い、**前のリクエストが終わってから5秒後**に実行するような処理に変えてみました。

```js
const fetchDataInInterval = () => {
  fetchData().then(() => {
    setTimeout(() => {
      fetchDataInInterval()
    }, 5000)
  })
}
```

↓図にすると、このような動きに変わりました。

![setTimeout_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151137/7528b245-a603-6cac-ed6f-eb66ceeb61af.png)

↓通信に時間がかかった場合こうなるため、渋滞問題は起きません。

![setTimeout_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151137/b29be97c-10d1-a10a-fa38-ffeb491c8ba1.png)

その他の違い:

- 5秒毎ではなく、5秒＋通信時間の間隔で実行される
- then/catch/finallyの扱い次第で、例外時の動作が変えられる
  - 例えば上記のコードでは、thenのときだけ次回の通信を実行しているので、失敗したら以降の通信が中断されます

次の処理の実行を自分で書くので、こちらのほうが色々と実装の自由度が高そうです。

# おわりに

- setTimeoutを使うとsetIntervalとは違った挙動の定期処理を書ける
- 例のようにsetTimeoutのほうが向いているケースがある

という話でした。

setIntervalでよいケースや、setIntervalのほうが適切なケースも当然ありますので、**あくまで一例として**ご参考にしていただければと思います。
【Java】クラス変数につけるprivate static finalについて

この記事は、[シアトルコンサルティング株式会社 Advent Calendar](https://qiita.com/advent-calendar/2021/seattleconsulting) 2021の14日目の記事です。

こんにちは、シアトルコンサルティングの 羽田野 と申します。
この度、弊社 シアトルコンサルティング株式会社 でAdvent Calendarに参加することになりました。

TeamTech Move the WorldをMissionに掲げ、日々全力で業務に取り組んでおります！
少しでも興味を持って頂けたら下記のサイトを覗いてみてください！

コーポレートサイト
https://www.seattleconsulting.co.jp/
Wantedly
https://www.wantedly.com/companies/seattleconsulting
よろしくお願い致します！

## はじめに ~クラス内の定数にstaticいるの？~

今まで何も考えずにJavaのクラス定数の修飾子をprivate static finalとしていたけど、
クラス内でしか使わない定数に対してstaticをつける意味って何だろう？と思ったので調べてみた。

## ターゲット
著者自身、未経験エンジニア2年目なのでJava初学者で同じような疑問を持った方に向けて書いてみました！

## まずは各修飾子について
### アクセス修飾子
#### private

- **現在のクラスからのみアクセス可能**なことを示す修飾子

### それ以外
#### static

- **クラスフィールド**の宣言<br>
※クラスフィールド：インスタンスを経由せずにクラスから直接に呼び出せるフィールドのこと

#### final

- **オーバーライドの禁止を宣言**する

## こうしてみると…

private finalはクラス定数として

- privateでクラス内での呼び出しのみに制限する
- finalで上書き禁止にする

の意味があるのでわかる。
ただ、やっぱりstaticな定数にしてクラスフィールドにする意味はわからない…

## 大事になってくるのは...static変数とインスタンス変数の違い
疑問をより深く見ていくとどうやら大事になってくるのは「static変数とインスタンス変数の違い」のようだ。
それぞれのスコープが異なることが重要なよう。
※スコープに関しては[シアトルコンサルティング株式会社 Advent Calender 7日目](https://qiita.com/takanori_koizumi4869/items/5897d7d4611785fc507a)で小泉くんが書いてくれてるので見てみてください！

### static変数

- **クラスにつき**1つ

### インスタンス変数

- **インスタンスに付き**1つ

## このことからわかるのは…

**staticをつけていないと定数が存在するクラスをインスタンス化するたびに定数が初期化されるため、
メモリへのオーバーヘッドが大きい**ということになる。

逆に言えば、インスタンスを1つしか生成しない前提のクラスに関しては特に意味はない。
ただし、複数インスタンスを生成する場合にstaticをつけずに宣言すると、
コンストラクタでの初期化を許すことになるため、クラス固有の定数ではなくなってしまうことが問題のようです。

## 最後に
どうでしたか？
当たり前のようにつけて処理していた部分を素朴な疑問として調べてみると発見があって面白かったです！

個人的には実装をすすめる中で前提や仕様が変わったために複数インスタンスを生成する必要が出てくる可能性等を考慮すると、おまじないのようにつけておくのが無難かなと納得しました。（デメリットも大きくはなさそうですし！）

今回は以上です。
ありがとうございました！

## 参考
https://qiita.com/Qiitaman/items/743013921e3ed31d948f
https://qiita.com/morioheisei/items/c56ab32b68ce92d32206
SafeAreaViewをScrollView内で使用するときの注意点

# TL;DR
ScrollView内でSafeAreaView使うときは、ScrollViewに`contentInsetAdjustmentBehavior="automatic"`のpropsを渡せばスクロールがぶっ壊れない。

```jsx
<ScrollView contentInsetAdjustmentBehavior="automatic"> 
  <SafeAreaView>
    {/* Long Content */}
  </SafeAreaView>
</ScrollView>
```

# はじめに
React Nativeには、AndroidとiOSを同時に開発できる利点があります。
一方で、AndroidにはAndroidの、iOSにはiOSにしか無い仕様も存在し、その一つにiOSのセーフエリアがあります。

セーフエリアには、上部のセーフエリア（Status Bar）と下部のセーフエリア（Home Indicator）の２つが存在します。
React Nativeでは、SafeAreaViewというコンポーネントを利用することで、よしなにセーフエリア領域を扱うことができます。

# ScrollView内で使用するときの注意



```jsx
<ScrollView contentInsetAdjustmentBehavior="automatic"> 
  <SafeAreaView>
    {/* Long Content */}
  </SafeAreaView>
</ScrollView>
```
Javascriptのテクニック集①

# これは何？
気になった・実際に使ってみたいと思った Javascriptのテクニックをまとめてみました！！

## 参考にした記事
https://dev.to/irmerk/modern-javascript-techniques-4chc

----
## 配列の初期化
配列のlengthプロパティを0にすることで、配列の中身を空にすることができる。

``` js
let array = [0, 1, 2, 3, 4]

array.length = 0
console.log(array); //[]
```

また、他の配列の初期化方法として、単に[]を代入する方法がある。

``` js
let array = ["a", "b", "c"];

array=[];
console.log(array); //[]
```

lengthを0にする場合との違いは、`再代入するのか`・`ただ、配列の中身を変更するのか`である
`let`ではなく、`const`を使用すると分かりやすい。

``` js
// lengthの場合
const array1 = [0, 1, 2, 3, 4]

array1.length = 0
console.log(array1); //[]

// 再代入の場合
const array2 = ["a", "b", "c"];

array2=[]; // Uncaught TypeError: Assignment to constant variable. とエラーが出る
console.log(array2);
```
`const`は、再代入できないため、[]を代入する方法だとエラーが出る。
`const`、`let`の違いは[こちら](https://qiita.com/Yuji_6523/items/e7f817b265bc93fb742b)の記事でまとめています。

## 条件をシンプルに
以下のようなコードで、dataプロパティが確実に存在するか確認するために、プロパティ名が重複してしまうケースがある。
上記の重複を解決するために、`?. = オプショナルチェイニング`を使用するとコードが短く簡潔になり重複もなくなる。

``` js
// プロパティ名が重複してしまう場合
if(data && data.name && data.name.length === 4) {
  ...
}

// オプショナルチェイニング
if(data?.name?.length === 4) {
  ...
}

```


## 分割代入
分割代入を使うことで、「配列の要素」や「オブジェクトのプロパティ」を分解・分割して、変数や定数に値を代入することができる。
分割代入を使用することで、タイプ量と行数を削減できる！

### オブジェクトの場合
``` js
const obj = { firstName: "Hoge", lastName: "Jhon" };

// 通常
const firstName = obj.firstName;
const lastName = obj.lastName;

console.log(firstName); // Hoge
console.log(lastName); // Jhon

// 分割代入の場合
// １行でかける
const { firstName, lastName } = obj;

console.log(firstName); // Hoge
console.log(lastName); // Jhon

```

### 配列の場合
``` js
const arr = ["Hoge", "John"]

// 通常
const firstName = arr[0]
const lastName = arr[1]

console.log(firstName); // Hoge
console.log(lastName); // Jhon

// 分割代入
const [firstName, lastName] = arr;

console.log(firstName); // Hoge
console.log(lastName); // Jhon
```


## テンプレートリテラル
テンプレートリテラルを使うことで文字列を連結する際に、わざわざ`+`演算子を使ってつなげずに一行で書くことができる。

テンプレートリテラルの書き方は、バッククオート(`` `~` ``)で囲む

``` js
const myName = 'hoge'

// 通常の場合
const greeting = "こんにちは、私は" + myName + "です。"

// テンプレートリテラルの場合
const greetingWithTemplateLiteral = `こんにちは、私は${myName}です。`

console.log(greeting);
console.log(greetingWithTemplateLiteral);
// 上記同じ出力になる
```

## 二重否定
``` js
const name = 'hoge'

console.log(!!name) 

// true
```
一見、`!!`は、true -> false -> trueの様に元に戻るので、意味はないだろ！となるのですが、上記のコードの様にFalsy/Truthyが絡んでくると話は違ってくる。
以下処理の流れである。
1. "hoge"：文字列 = truthyで、最初の否定で結果は'false'になる
2. 更に、2個目の否定で結果は、'false' -> 'true'になる

最終的な結果は、trueになり`Boolean`型に変換される！


## まとめ
どれがベストプラクティスなのか状況によって変わってきますが、これらのテクニックを知ることで選択肢が増え、自分の中である程度ベストプラクティスが組めれるようになればと思っております。
いろんな書き方があって面白い!!!